Makefile 在另一个目录中调用make

Makefile 在另一个目录中调用make,makefile,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

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

已知make的递归调用会破坏目标依赖项的直接非循环图(DAG),这可能是导致意外行为的原因

您的问题的一个可能的解决方案可能是为您的项目使用一个Makefile,如中所建议的。否则,您可能会“提高”构建系统的抽象级别,并使用
cmake
之类的工具

我认为make应该在另一个目录中找不到依赖项的规则时自动执行此操作,但我不明白为什么我会这样想

GNU Make没有这样的内置规则。请参见中的所有内置规则


你的解决方案应该是半途而废的。它没有
。/a/generated.h
的依赖项(因为您使用的是递归make,并且这些依赖项只有该目录中的makefile知道),因此它不会自动重建它。但是如果它不存在,它将构建
。/a/generated.h

这看起来不是一个很好的设计。你有很多其他目录都有自己的Makefile吗?我似乎忘记了make会自动重建
Makefile
中包含的任何文件。因为它总是在其他目录中显式调用make(注意FORCE习惯用法),我相信它会“起作用”。只是它会有额外的开销和Massimiliano的链接文件中列出的分离DAG的所有成本。是的,除非有一个名为
FORCE
的文件<代码>武力应该是一个虚假的目标。这在我简化问题时是不准确的。已更正。根据TFM,使用
强制
方法来补偿对
.PHONY
的支持不足。虽然在目标处指定比在一个点上指定所有目标更好。()@altendky同意。虽然我曾经忘记将
clean
target标记为假的,然后在别人的机器上调试了一会儿。原来有一个文件名为
clean
…这是一个很好的读物,它(大概)将提高我对Make的总体使用,甚至可能解决我潜在的困境。谢谢
define REMOTE
$(1): FORCE
    $$(MAKE) -C $$(dir $$@) $$(notdir $$@)
endef

$(eval $(call REMOTE,../a/generated.h))
$(eval $(call REMOTE,../a/anotherGeneratedFile.h))