首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >循环文件依赖关系的奇异性

循环文件依赖关系的奇异性
EN

Stack Overflow用户
提问于 2018-11-16 17:11:28
回答 1查看 188关注 0票数 0

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

目标和制定规则是:

代码语言:javascript
运行
复制
%.x.y: %.x
    convertfile $< $@

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

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

make:循环thefile.x <- thefile.x.y依赖项被删除.

这只是一个小问题,因为我们不想看到消息,当一切实际上都在工作。

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

在下面的评论之后,我想澄清我在做什么,所以复制我正在使用的完整的make文件:

代码语言:javascript
运行
复制
%.js.c: %.js
    js2c $< $@

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

下面是我运行它时的输出,它有一些事情要做:

代码语言:javascript
运行
复制
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

以下是不需要做任何事情时的输出:

代码语言:javascript
运行
复制
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'.
EN

Stack Overflow用户

回答已采纳

发布于 2018-11-19 13:32:08

您可以看到这一点,因为GNU有许多内置规则。您可以在GNU手册中看到它们的部分列表,或者运行make -p -f/dev/null来查看完整的列表。

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

代码语言:javascript
运行
复制
%: %.c ; $(LINK.c) ...

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

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

代码语言:javascript
运行
复制
%.js:

就这样。详细情况可在手册中查阅。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53342484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档