make:触发器而不重建依赖项

时间:2014-07-30 11:43:06

标签: makefile

基本上我有通常的Makefile构造:

target: dependency1 dependency2 dependency3
      runtargetscript.sh

但是在这种情况下,目标只需要一个依赖项,并且某些依赖项可能无法构建。 (所以我不能只构建所有依赖项)

是否可以告诉make触发" target"当其中一个依赖项被更改/创建(即正常行为)但不尝试重建任何缺少的依赖项时?

2 个答案:

答案 0 :(得分:1)

使用GNU make,您可以使用shell转义来动态构建依赖项,只有在它们已经存在时才添加它们:

if_exist = $(shell if [ -e $(1) ]; then echo $(1); fi)

target: $(call if_exist,dependency1) $(call if_exist,dependency2) $(call if_exist,dependency3)
        runtargetscript.sh

如果目标不存在,或者它比读取makefile时中存在的任何依赖项更旧,这将运行脚本,但如果目标不存在,则不会尝试构建它们他们当时不存在。

请注意那里的重要警告 - 如果文件不存在,但其他一些不相关的规则会运行创建它们的操作,则不会重建目标,除非您再次重新运行make target

答案 1 :(得分:0)

假设您的规则主体没有做任何特殊操作,具体取决于哪个依赖项比目标更新,您可以使用-W标志来指示它将某些目标视为始终是新的(因此不需要建筑)。

因此,对于给定的示例,假设您可以(并希望)构建dependency2而不是dependency1dependency3,您将运行:

make -W dependency1 -W dependency3 target

修改:正如评论中指出的那样,当dependency2不比target更新时,这仍然无效,因为target仍将构建。

在这种情况下,我相信唯一的解决方案(鉴于下面的评论)是使用类似的东西:

DEPENDENCY_BIN := $(or $(wildcard /path/to/mysql),$(wildcard /path/to/sqlite3),/path/that/does/not/exist)

target: $(DEPENDENCY_BIN) dependency2