Makefile中的路径依赖

巴斯卡娅

这是我的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 : bartells这样的规则使它运行该配方时,该配方将创建或更新名为的文件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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章