我正在从make文件中运行一个小实用程序(使用GNU 3.81)。该实用程序将一种文件类型转换为另一种文件类型。例如,文件'thefile.x‘被转换为
目标和制定规则是:
%.x.y: %.x
convertfile $< $@
all: file1.x.y file2.x.y这实际上是有效的(生成了.x.y文件,但我总是收到消息:
make:循环thefile.x <- thefile.x.y依赖项被删除.
这只是一个小问题,因为我们不想看到消息,当一切实际上都在工作。
看过其他的“循环依赖”Q&As,它们似乎都不是我遇到的问题。由于其他技术原因,我无法更改该项目的文件命名约定。
在下面的评论之后,我想澄清我在做什么,所以复制我正在使用的完整的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'.发布于 2018-11-19 13:32:08
您可以看到这一点,因为GNU有许多内置规则。您可以在GNU手册中看到它们的部分列表,或者运行make -p -f/dev/null来查看完整的列表。
这些内置规则之一告诉make如何从.c文件编译程序。在POSIX系统上,程序没有特殊的后缀,因此这个内置的规则基本上是:
%: %.c ; $(LINK.c) ...因此,这个规则告诉我们如何从文件foo构建任何文件foo.c.这也意味着make可以推断如何从文件foo.js构建文件foo.js.c。由于您还为如何从foo.js.c构建foo.js定义了一条规则,这是一个循环依赖,并使驱逐规则之一(内置规则)。
您需要防止您的.js文件像上面那样通过匹配-任何模式进行匹配。按照手册中的描述,有两种方法可以做到这一点。副作用最少的是添加一个空模式规则,其中提到新后缀,如下所示:
%.js:就这样。详细情况可在手册中查阅。
https://stackoverflow.com/questions/53342484
复制相似问题