Makefile 在另一个目录中调用make
下面是我目前对我的问题的“解决方案”。我认为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
。/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))