Makefile中的显式链依赖

时间:2012-04-10 20:30:37

标签: makefile gnu-make

当目录中的专用Makefile依赖于父目录中的主要文件时,要遵循的模式是什么?

我有:

/
/Makefile
/src
/src/Makefile
/tests
/tests/Makefile
我在/Makefile中的

TESTING_COMMAND=something
dotest1:
    make -C tests/ $@

/tests/makefile我有

dotest1:
    $(TESTING_COMMAND) $?

如果我跑:

me@host:/ $ Make dotest1

它有效。但如果我从测试执行dir:

me@host:/tests/ $ Make dotest1

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

如果在/ tests /或/ src / dir中执行,我不一定需要工作,但需要一种方法来优雅地失败。

2 个答案:

答案 0 :(得分:2)

尝试通过命令行(或环境)发送所有内容对我来说似乎是一个坏主意。这就是发明的内容。将您的常用值放入单独的文件中,例如config.mk,然后在所有makefile中使用:

include config.mk

将它们包括在内。

答案 1 :(得分:1)

你的设计让我感到害怕,但这将在主Makefile中实现:

TESTING_COMMAND=something
dotest1:
    make -C tests/ $@ TESTING_COMMAND=$(TESTING_COMMAND)

如果您希望tests/Makefile失败,您有几个选择。如果只有一个目标取决于TESTING_COMMAND,您可以让它打印警告并且不执行任何操作:

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

或者如果整个Makefile依赖于它,您可以让Make print成为警告或中止:

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过程,但这有点痛苦。