在子目录中调用 makefile

Calling makefile in a subdirectory

我的源代码文件夹结构如下

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 知道测试文件夹中的源文件。

all: main tests

main: $(DEPENDENCY IN SRC and ABC)
   command

tests:
     $(MAKE) -C tests

这将无条件地调用其私有子目录上的 make of 测试。请注意,使用特殊的 $(MAKE) 变量有助于传播命令行参数并减少开销。

只需将目标声明为 PHONY,这意味着 make 不会检查任何生成的文件。相反,它只是 always 执行规则,让二次调用 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.

I don't want this Makefile to be aware of the source files in the tests folder.

也许可以,但您可能需要重新考虑。 Peter Miller 的 Recursive Make Considered Harmful 有力地证明了一个 Makefile 就是您所需要或想要的。很久以前就改变了我的想法。