0

当目录中的专用 Makefile 依赖于父目录中的主要 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

有用。但如果我从测试目录执行:

me@host:/tests/ $ Make dotest1

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

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

4

2 回答 2

2

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

include config.mk

让他们包括在内。

于 2012-04-11T06:00:23.343 回答
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 打印警告或中止:

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

你也可以让它中止子make(运行的那个tests/Makefile),但仍然继续运行调用它的Make进程,但这有点痛苦。

于 2012-04-10T23:18:28.657 回答