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

时间:2018-11-16 17:11:29

标签: gnu-make

我正在从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 <-删除了file.x.y依赖项。

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

看过其他“循环依赖”问答,它们似乎都不是我遇到的相同问题。由于其他技术原因,我无法更改该项目的文件命名约定。

在下面的评论之后,我想澄清我在做什么,因此重现我正在使用的完整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'.

1 个答案:

答案 0 :(得分:1)

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

这些内置规则之一告诉make如何从.c文件编译程序。在POSIX系统上,程序没有特殊的后缀,因此该内置规则基本上说:

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

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

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

foo.js

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