在另一个目录中调用make

时间:2013-02-11 17:41:38

标签: makefile

以下是我目前解决问题的“解决方案”。我认为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))

2 个答案:

答案 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