我正在从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'.
答案 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
就是这样。手册中提供了完整的详细信息。