在子目录中使用顶级makefile
我有一个目录结构如下的项目:在子目录中使用顶级makefile,makefile,subdirectory,Makefile,Subdirectory,我有一个目录结构如下的项目: ╷ / ├ Makefile ├┐ dir1/ │├ foo.in │└ foo.out ├┐ dir2/ ┊┊ Makefile包含项目中所有文件的规则,例如 dir1/%.out: dir1/%.in gen_out $< $@ dir1/%.out:dir1/%.in GENU out$
╷ /
├ Makefile
├┐ dir1/
│├ foo.in
│└ foo.out
├┐ dir2/
┊┊
Makefile包含项目中所有文件的规则,例如
dir1/%.out: dir1/%.in
gen_out $< $@
dir1/%.out:dir1/%.in
GENU out$<$@
如果我在顶级目录中,我可以运行makedir1/foo.out
很好
问题是:在
dir1
内部调用make foo.out
最优雅的方式是什么?您的选择是有限的。您可以在make
命令行上使用-f../Makefile
标志,可以通过在make
周围编写一个包装脚本来确定当前位置,并根据您所在的位置使用适当的标志来调用它
您可以将MAKEFILES
环境变量设置为包含makefile的完全限定路径名
您可以在每个目录中创建一个小型makefile,它除了使用适当的顶级makefile重新调用
$(MAKE)
之外,什么都不做。您可以轻松地使用。只需将Makefile重命名为RootMakeppfile。这将首先加载到树中的任何位置
与传统make不同,makepp不需要进行递归构建。因此,您还可以将一个Makefile放入每个目录,makepp将把您需要的所有文件加载到一个进程中。这样,它就可以对您的整个项目有一个一致的视图,并可以检测和跟踪所有依赖项。尝试以下方法:
cd dir1 && make -f ../Makefile foo.out
cd dir1和&make-f../Makefile foo.out这些文件不能按预期工作,可能是因为make在解释目标时没有考虑当前工作目录:
make-f../Makefile foo.out
indir1
将不会重建foo.out
。起作用的是make-C。。dir1/foo.out
,但我不会传递文件的真实名称,相对于当前位置,来生成。好吧,当你问问题时,你没有说你的工作目录必须是根目录。在这种情况下,您不能使用makefile
,因此您必须编写一个可以调用make的脚本,或者创建迷你makefile。您可以这样做,以便它正确调用make:例如,在父目录中运行make之前,将目标“foo.out”转换为“dir1/foo.out”。这将有点复杂,因为你可能不想把像all
,clean
等一般目标翻译成dir1/all
,dir1/clean
,等等,但是可以。是的,我也这么想,但希望有更优雅的东西。谢谢你的建议。不幸的是,我需要一个能够在其他团队成员的系统上工作的解决方案,而无需安装额外的工具。