这是我的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应该根据该文件存在继续。
感谢。
答案 0 :(得分:2)
make的核心规则之一是你需要构建你的规则告诉你构建的目标。像foo : bar
这样的规则告诉make,如果它运行该配方,配方将创建或更新名为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 ; @:
(你必须为模式规则提供某种配方,它们不能有一个空的配方;上面的那个什么都不做。)