【问题标题】:Calling makefile in a subdirectory在子目录中调用 makefile
【发布时间】:2016-10-15 23:09:29
【问题描述】:
我有一个源代码文件夹结构如下
src
|-tests
|-abc
我在src 中有一个makefile,它有一个名为tests 的目标。 tests 有自己的makefile,用于将源代码编译成二进制文件。(多个目标)。所有这些都由测试目录中的 Makefile 管理。
我的src make 文件有以下目标。
all: main tests
main: $(DEPENDENCY IN SRC and ABC)
command
tests: ??
make -C tests
我可以在主 Makefile 中为测试目标指定什么依赖关系。我不希望这个 Makefile 知道测试文件夹中的源文件。
【问题讨论】:
标签:
makefile
dependencies
gnu-make
【解决方案1】:
all: main tests
main: $(DEPENDENCY IN SRC and ABC)
command
tests:
$(MAKE) -C tests
这将无条件地在其私有子目录上调用 make of tests。请注意,使用特殊的 $(MAKE) 变量有助于传播命令行参数并减少开销。
【解决方案2】:
只需将目标声明为PHONY,这意味着make 不会检查任何生成的文件。相反,它只是始终执行规则,让对make 的辅助调用来决定需要构建什么。
想一想:如果您有一个附加文件src/tests,会发生什么? make 会注意到该文件已经存在,并且由于没有指明先决条件,它将决定不制作该文件。防止您的规则 tests 被执行。
all: main tests
main: $(DEPENDENCY IN SRC and ABC)
# Recipes (That is the word to describe commands in a make rule)
.PHONY: tests
tests:
$(MAKE) -C tests
还添加了 Alex 的答案:使用 $(MAKE) 是一个好习惯。并允许您的 makefile 独立于 make 程序的名称工作。想象一下,您有一个名为 xyz-make 的程序的发行版。
【解决方案3】:
我不希望这个 Makefile 知道测试文件夹中的源文件。
也许,但您可能需要重新考虑。 Peter Miller 的 Recursive Make Considered Harmful 有力地证明了一个 Makefile 就是您所需要或想要的全部。很久以前,它改变了我的想法。