循环文件依赖性降低了怪异

Circular file dependency dropped weirdness

我正在 运行从 make 文件(使用 GNU Make 3.81)创建一个小实用程序。该实用程序将一种类型的文件转换为另一种类型的文件。例如,文件 'thefile.x' 被转换为 'thefile.x.y'.

目标和制定规则是:

%.x.y: %.x
    convertfile $< $@

all: file1.x.y file2.x.y

这确实有效(生成了 .x.y 文件,但我总是收到消息:

make: 循环 thefile.x <- thefile.x.y 依赖性下降。

这只是一个小问题,因为我们不想在一切正常时看到消息。

查看了其他 'circular dependency' 问答,其中 none 似乎与我遇到的问题相同。由于其他技术原因,我无法更改此项目的文件命名约定。

在下面发表评论后,我想澄清我在做什么,因此重现我正在使用的完整 make 文件:

%.js.c: %.js
    js2c $< $@

all: test1.js.c test2.js.c

这是我 运行 它有事要做时的输出:

C:\work\timtest>make
make: Circular test1.js <- test1.js.c dependency dropped.
js2c test1.js test1.js.c
[RomFs] test1.js => test1.js.c
make: Circular test2.js <- test2.js.c dependency dropped.
js2c test2.js test2.js.c
[RomFs] test2.js => test2.js.c

这是无事可做时的输出:

make: Circular test1.js <- test1.js.c dependency dropped.
make: Circular test2.js <- test2.js.c dependency dropped.
make: Nothing to be done for `all'.

你看到这个是因为 GNU make 有很多 built-in rules。您可以在 GNU make 手册中看到它们的部分列表,或 运行 make -p -f/dev/null 查看完整列表。

这些内置规则之一告诉 make 如何从 .c 文件编译程序。 POSIX 系统程序没有特殊后缀,所以这个内置规则基本上是:

%: %.c ; $(LINK.c) ...

所以这个规则告诉 make 如何从文件 foo.c 构建任何文件 foo...这也意味着 make 可以推断如何从文件构建文件 foo.js foo.js.c。由于您还定义了如何从 foo.js 构建 foo.js.c 的规则,这是一个循环依赖并使逐出规则之一(内置规则)。

您需要防止您的 .js 文件像上面那样通过 match-anything patterns 进行匹配。如手册中所述,有两种方法可以做到这一点。副作用最小的方法是添加一个空模式规则来提及您的新后缀,如下所示:

%.js:

就是这样。手册中提供了完整的详细信息。