循环文件依赖性降低了怪异
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:
就是这样。手册中提供了完整的详细信息。
我正在 运行从 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:
就是这样。手册中提供了完整的详细信息。