0

以下是我目前对我的问题的“解决方案”。我认为当在另一个目录中找不到依赖项的规则时,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))
4

2 回答 2

1

众所周知,make 的递归调用会破坏目标依赖项的直接无环图 (DAG),这可能是您出现意外行为的原因。

正如“Recursive Make Considered Harmful”中所建议的,解决您的问题的一种可能方法是为您的项目使用一个 Makefile 。否则,您可能会“提高”构建系统的抽象级别,并转向类似cmake.

于 2013-02-11T21:06:48.510 回答
0

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

GNU Make 没有这样的内置规则。查看隐式规则目录中的所有内置规则。

Your solution should work in a half-way. It doesn't have the dependencies of ../a/generated.h (because you are using recursive make and those dependencies are only known to the makefile in that directory), so it won't rebuild it automatically. But it will build ../a/generated.h if it does not exist.

于 2013-02-11T22:17:04.707 回答