在子目录中使用顶级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
in
dir1
将不会重建
foo.out
。起作用的是
make-C。。dir1/foo.out
,但我不会传递文件的真实名称,相对于当前位置,来生成。好吧,当你问问题时,你没有说你的工作目录必须是根目录。在这种情况下,您不能使用
makefile
,因此您必须编写一个可以调用make的脚本,或者创建迷你makefile。您可以这样做,以便它正确调用make:例如,在父目录中运行make之前,将目标“foo.out”转换为“dir1/foo.out”。这将有点复杂,因为你可能不想把像
all
clean
等一般目标翻译成
dir1/all
dir1/clean
,等等,但是可以。是的,我也这么想,但希望有更优雅的东西。谢谢你的建议。不幸的是,我需要一个能够在其他团队成员的系统上工作的解决方案,而无需安装额外的工具。