当目录中的专用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中执行,我不一定需要工作,但需要一种方法来优雅地失败。
答案 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过程,但这有点痛苦。