gpt4 book ai didi

Makefile 依赖项不适用于虚假目标

转载 作者:行者123 更新时间:2023-12-03 13:50:42 25 4
gpt4 key购买 nike

这是我的 Makefile 的简化版本:

.PHONY: all 

all: src/server.coffee
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee

我要跑 make并且只有在 src/server.coffee 时才重新编译已经改变。但是,每次运行时它都会重新编译 make :
$ make
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
$ make
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee

如果我将我的 Makefile 更改为不使用虚假目标,它会按预期工作。新的 Makefile:
bin/server.js: src/server.coffee
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee

结果:
$ make
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee
$ make
make: `bin/server.js' is up to date.

为什么它不尊重我对虚假目标的依赖?我问的原因是因为实际上,我不会将单个文件编译成单个其他文件,所以我不想跟踪所有用作目标的输出文件的名称。

最佳答案

当您想避免额外工作时,您可以使用 "empty target" 而不是一个虚假的目标(正如@cmotley 指出的那样,它完全按预期工作)。 :

The empty target is a variant of the phony target; it is used to hold recipes for an action that you request explicitly from time to time. Unlike a phony target, this target file can really exist; but the file's contents do not matter, and usually are empty.

The purpose of the empty target file is to record, with its last-modification time, when the rule's recipe was last executed. It does so because one of the commands in the recipe is a touch command to update the target file.



然而 ,在这种情况下,真的不需要添加额外的空输出文件——您已经有了 CoffeeScript 编译的输出!正如您在问题中已经证明的那样,这符合更典型的 Makefile 模式。你可以做的是重构这种方法:
.PHONY: all
all: bin/server.js

bin/server.js: src/server.coffee
mkdir -p bin
./node_modules/.bin/coffee -c -o bin src/server.coffee

现在你拥有了你想要的两个东西:一个很好的传统“all”目标,它是正确的虚假目标,以及一个不会做额外工作的构建规则。您也可以更好地使其更通用,以便您可以轻松添加更多文件:
.PHONY: all
all: bin/server.js bin/other1.js bin/other2.js

bin/%.js: src/%.coffee
mkdir -p bin
./node_modules/.bin/coffee -c -o bin $<

关于Makefile 依赖项不适用于虚假目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13852535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com