以下是我目前解决问题的“解决方案”。我认为make应该在没有找到另一个目录中的依赖项的规则时自动执行此操作,但我无法弄清楚为什么我这么想。你知道更好的方法吗?
还有另一个目录../a/
,它有一个Makefile来创建../a/generated.h
。
.PHONY: FORCE
FORCE:
my.c: ../a/generated.h
cp --preserve=timestamps $< $@
../a/generated.h: FORCE
$(MAKE) -C $(dir $@) $(notdir $@)
我确实有一个通用形式可以避免为每个“外部”文件复制第二条规则,但正如我所说,我认为这一切都是不必要的。
define REMOTE
$(1): FORCE
$$(MAKE) -C $$(dir $$@) $$(notdir $$@)
endef
$(eval $(call REMOTE,../a/generated.h))
$(eval $(call REMOTE,../a/anotherGeneratedFile.h))
答案 0 :(得分:1)
已知make的递归调用会破坏目标依赖关系的直接非循环图(DAG),这可能是导致意外行为的原因。
根据"Recursive Make Considered Harmful"的建议,您的问题的一个可能解决方案可能是为您的项目设置一个Makefile。否则,您可以“提升”构建系统的抽象级别,并转到cmake
之类的工具。
答案 1 :(得分:0)
我认为make应该在没有找到另一个目录中的依赖项的规则时自动执行此操作,但我无法弄清楚为什么我这么想。
GNU Make没有这样的内置规则。请参阅Catalogue of Implicit Rules中的所有内置规则。
您的解决方案应该在中途运行。它没有../a/generated.h
的依赖项(因为您使用的是递归make,并且这些依赖项仅对该目录中的makefile是已知的),因此它不会自动重建它。但如果它不存在,它将构建../a/generated.h
。