这是我的Makefile中的两个目标。
.SECONDARY:
exp-%.ans:
echo $* > eval/$@
%.scores: %.ans
cat eval/$< > eval/$@
当我写make -n exp-40.scores
输出将是:
echo 40 > eval/exp-40.ans
cat eval/exp-40.ans > eval/exp-40.scores
除了一件事情,这很好。它不知道依赖项已经成立。如果我是第一次创建eval / exp-40.scores,那么我希望make会说如果我运行相同的命令,它已经在那儿了。所以我尝试像这样更改我的Makefile:
.SECONDARY:
exp-%.ans:
echo $* > eval/$@
%.scores: eval/%.ans
cat eval/$< > $@
当我make -n exp-40.scores
再次写输出时,将是:
echo eval/40 > eval/eval/exp-40.ans
cat eval/eval/exp-40.ans > exp-40.scores
这是完全错误的,因为我的参数应该是40而不是eval / 40。
我如何才能在这两个世界中取得最好的成绩?即,我想在eval /文件夹中创建* .scores。我还想让make检查文件是否已经存在。然后make应该根据该文件的存在进行。
谢谢。
make的核心规则之一是您需要构建规则,告诉目标您要构建的目标。像foo : bar
tells这样的规则使它运行该配方时,该配方将创建或更新名为的文件foo
。如果配方创建或更新了一个名为的文件biz/foo
,则说明您的Makefile错误,将无法正常工作。
Make始终将期望配方创建的目标放入$@
自动变量中。你的食谱应该创建或更新$@
和准确$@
。没有别的了。
因此,在您的情况下,您需要编写:
eval/exp-%.ans:
echo $* > $@
eval/%.scores: eval/%.ans
cat $< > $@
如果您希望能够运行make exp-40.scores
并真正创建它eval/exp-40.scores
,则可以添加如下规则:
%.scores: eval/%.scores ; @:
(您必须为模式规则提供某种配方,它们不能有空配方;上面的配方什么都不做)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句