子目录和Makefile

62

我认为这是一个被问过很多次的问题,但我找不到正确的解决方法。

我有以下结构:

project/
project/Makefile
project/code
project/code/*.cc
project/code/Makefile

当我在目录 'project/code' 中并且调用 "make project_code" 时,我的代码可以成功编译。

我希望当我在 'project/' 中时,只需调用 "make project_code" 就像我在 'project/code' 中一样。

'project/Makefile' 文件将包含其他规则(例如 'install')和一些规则来编译,就像我在 'project/code' 中一样。为此,我请求您的帮助......谢谢。

2个回答

87

最简单的方法是这样做:

CODE_DIR = code

.PHONY: project_code

project_code:
       $(MAKE) -C $(CODE_DIR)
< p > .PHONY 规则表示 project_code 不是需要构建的文件,-C 标志表示更改目录(相当于在调用 make 之前运行 cd code)。 您可以使用相同的方法调用 code Makefile 中的其他目标。

例如:

clean:
       $(MAKE) -C $(CODE_DIR) clean

谢谢,它能工作!最后一个问题:$(MAKE) 是否总是被定义了? - Cedric H.
2
$(MAKE)是指您定义的变量吗?还是一个始终存在的内置函数? - mtmurdock
它是内置于 GNU Make 中的,请参考手册:http://www.gnu.org/software/make/manual/make.html#MAKE-Variable - Justin Ardini
1
有没有一种方法可以抑制此调用的输出?@ $(MAKE)不按预期工作。 - musicmatze
如何对多个子目录执行此操作?当我尝试将另一个子目录目标附加到 PHONY 时,只有第一个目标会运行。 - Michael
顺便说一下,我刚在 https://www.gnu.org/software/make/manual/make.html#Phony-Targets 上看到,即使是清理操作也应该使用 .PHONY 来避免存在名为 clean 的文件的罕见情况。 - George Birbilis

1
尝试将以下规则放入 project/Makefile 中,例如(对于 GNU make):
.PHONY: project_code
project_code:
       cd code && make

17
原文:This will not work as written, because by default in GNU make, each line of a rule body is executed in a different shell. So, the cd will occur, but the shell that executed it will immediately exit; then 'make' will be executed separately. In fact, I believe this will put make into an infinite recursion loop. However, if you change you code to 'cd code && make', it will work as expected.翻译:按原来的写法,这是不行的,因为在GNU make中,默认情况下,规则体中的每一行都在一个不同的shell中执行。因此,cd命令会被执行,但执行它的shell会立即退出;然后'make'命令将在单独的shell中执行。实际上,我认为这会导致make进入无限递归循环。但是,如果您将代码更改为“cd code && make”,则可以正常工作。 - Eric Melski
9
经过4年的编辑,以符合建议。 - Emanuele Cipolla
5
@EmanueleCipolla 在又过了四年之后,竖起大拇指向那种精神致敬。 - h9uest
1
在这里,我们已经接近四年的时间了,这再次证明了make是一款永恒的软件,而适当的Makefile编写应该成为每个基础计算机技能课程的一部分。 - hlecuanda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接