2012-04-10 117 views
0

当目录中的专用Makefile取决于父目录中的主Makefile时,遵循什么模式?Makefile中的明确链依赖关系

我有:

/ 
/Makefile 
/src 
/src/Makefile 
/tests 
/tests/Makefile 

/Makefile我有:

TESTING_COMMAND=something 
dotest1: 
    make -C tests/ [email protected] 

/tests/makefile我有

dotest1: 
    $(TESTING_COMMAND) $? 

如果我运行:

[email protected]:/ $ Make dotest1 

它的工作原理。但是,如果我从测试目录执行:

[email protected]:/tests/ $ Make dotest1 

它会尝试在shell执行测试文件,因为$(TESTING_COMMAND)是空的,所以它的第一个参数成为传给shell命令。

如果在/ tests /或/ src/dir中执行,我不一定需要这样做,但需要一种方法来正常失败。

+0

是否确定要在主makefile中定义'TESTING_COMMAND',即使只有tests/makefile使用它? – Beta 2012-04-10 21:23:36

+0

我在这个问题上简化了很多:)我有很多共享的东西。 – gcb 2012-04-10 22:38:27

回答

1

你的设计让我害怕,但会做的伎俩在主Makefile中:

TESTING_COMMAND=something 
dotest1: 
    make -C tests/ [email protected] TESTING_COMMAND=$(TESTING_COMMAND) 

如果你想tests/Makefile失败好了,你有两个选择。如果只有一个目标取决于TESTING_COMMAND,你可以把它打印一个警告,什么也不做:

ifdef TESTING_COMMAND 
dotest1: 
    $(TESTING_COMMAND) $? 
else 
dotest1: 
    @echo warning: TESTING_COMMAND not defined 
endif 

或者,如果整个的Makefile依赖于它,你可以进行打印警告或中止:

ifndef TESTING_COMMAND 
$(warning TESTING_COMMAND is undefined, but Make will try to us it anyway) 
$(error TESTING_COMMAND is undefined, Make will now abort) 
endif 

你也可以让它中止sub-make(运行tests/Makefile的那个),但是仍然继续运行调用它的Make过程,但是这很痛苦。

+0

完美! ifndef寻找一个变种奇妙地工作。设计并不那么可怕:)只是将一切可以被构建主体覆盖的所有内容集中在一个核心makefile中,并将逻辑放在包含代码/源代码的目录中。 – gcb 2012-04-11 01:23:23

2

试图通过命令行(或环境)发送一切似乎对我来说是一个坏主意。这就是发明了。把你的共同价值观为一个单独的文件,像config.mk,然后在所有的makefile只需使用:

include config.mk 

,让他们包括在内。