我有一个目录结构如下的项目:
╷ /
├ Makefile
├┐ dir1/
│├ foo.in
│└ foo.out
├┐ dir2/
┊┊
Makefile 包含项目中所有文件的规则,例如
dir1/%.out: dir1/%.in
gen_out $< $@
如果我在顶级目录中,我可以运行make dir1/foo.out
得很好。
make foo.out
问题是:内部调用dir1
具有相同效果的最优雅的方式是什么?
我有一个目录结构如下的项目:
╷ /
├ Makefile
├┐ dir1/
│├ foo.in
│└ foo.out
├┐ dir2/
┊┊
Makefile 包含项目中所有文件的规则,例如
dir1/%.out: dir1/%.in
gen_out $< $@
如果我在顶级目录中,我可以运行make dir1/foo.out
得很好。
make foo.out
问题是:内部调用dir1
具有相同效果的最优雅的方式是什么?
你的选择是有限的。您可以-f ../Makefile
在命令行上使用该标志make
,也许通过编写一个包装脚本来make
确定当前位置并根据您所在的位置使用适当的标志调用它。
您可以将MAKEFILES
环境变量设置为包含 makefile 的完全限定路径名。
$(MAKE)
您可以在每个目录中创建一个小的 mini-makefile,它除了使用适当的顶级 makefile重新调用之外什么都不做。
您可以使用makepp轻松做到这一点。只需将您的 Makefile 重命名为 RootMakeppfile。这将首先加载您在树中的任何位置。
与传统的 make 不同,makepp 不需要进行递归构建。所以你也可以在每个目录下放一个 Makefile,makepp 会把你需要的全部加载到一个进程中。这样,它对您的整个项目有一个一致的视图,并且可以检测和跟踪所有依赖项。
尝试这个:
cd dir1 && make -f ../Makefile foo.out