在子目录中调用makefile

时间:2016-06-15 02:39:36

标签: makefile dependencies gnu-make

我有一个源代码文件夹结构如下

src
 |-tests
 |-abc

我在src中有一个makefile,其中有一个名为tests的目标。 tests有自己的makefile,用于将源代码编译成二进制文件。(多个目标)。所有这些都由测试目录中的Makefile管理。

我的src制作文件具有以下目标。

all: main tests

main: $(DEPENDENCY IN SRC and ABC)
   command

tests: ??
     make -C tests

我可以为主Makefile中的测试目标指定什么依赖性..我不希望这个Makefile知道tests文件夹中的源文件。

3 个答案:

答案 0 :(得分:1)

  

我不希望这个Makefile知道tests文件夹中的源文件。

也许,但你可能想重新考虑一下。彼得·米勒的Recursive Make Considered Harmful提出了一个强有力的理由,即你需要或想要一个Makefile。很久以前它改变了我的想法。

答案 1 :(得分:0)

all: main tests

main: $(DEPENDENCY IN SRC and ABC)
   command

tests:
     $(MAKE) -C tests

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

答案 2 :(得分:0)

只需将目标声明为PHONY,即make不会检查任何生成的文件。相反,它只是始终执行规则,让次要调用make来决定需要构建的内容。

想一想:如果你有一个aditional文件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的程序集。