如何在不同的目录中指定makefile目标?

时间:2010-11-09 20:53:20

标签: makefile

我试图找出为什么我不能将目标指定为在不同的目录中。

我正在尝试从json文件生成一些php类,但我已经将实际生成php的行更改为虚拟echo语句,所以其他人可以复制粘贴并测试它们是否感觉非常慷慨。

要添加到包含makefile的目录还有两件事:

  • 名为PatientDbPath.json的虚拟依赖文件
  • 一个名为
  • 的目录

如果我有一个包含以下内容的makefile:

.SUFFIXES: .php .json
.json.php:
    echo "HelloMe" > PatientDbPath.php

PatientDbPath.php: PatientDbPath.json

clean:
    $(RM) PatientDbPath.php

然后当我运行make时一切正常; PatientDbPath.php已正确创建,下次运行make时,收到消息make: 'PatientDbPath.php' is up to date.

但是,我想在一个单独的目录中生成php文件,所以我将makefile更新为以下内容:

.SUFFIXES: .php .json
.json.php:
    echo "HelloMe" > out/PatientDbPath.php

out/PatientDbPath.php: PatientDbPath.json

clean:
    $(RM) out/PatientDbPath.php

即使我这样做,Make也告诉我make: Nothing to be done for 'out/PatientDbPath.php',即使out目录中没有文件PatientDbPath.php。

所以我想也许这是后缀规则,我创建了第三个makefile。

out/PatientDbPath.php: PatientDbPath.json
    echo "Whatever" > out/PatientDbPath.php

clean:
    rm out/PatientDbPath.php

这个很好,就像第一个一样。任何人都可以在我的第二个makefile中看到我做错了吗?

感谢。

2 个答案:

答案 0 :(得分:4)

通配符规则中有两个错误(.json - > .php),一个是概念性的,一个是实用的。

概念性错误是这是一个规则如何将任意json文件(例如,foo.json)转换为任意但同名的.php文件(例如,json.php)。然而,你的规则是专门用于扼杀PatientDbPth.php。更好的规则是

.json.php:
    echo "HelloMe" > $@

其中$@是一个命名输出文件的变量。

这也显示了实际问题:这些规则实际上仅限于同名文件。如果您在.php中有一个规则翻译.json,并且您有foo.php,并且您想要bar.php,则通配符规则将不匹配。匹配涉及整个文件名,因此当您要求out / PatientDbPath.php时,通配符规则不匹配。这使你得到没有动作的规则,因此可以推断出什么都不做。

如果这是您要转换的唯一文件,最好按照您在第三个文件中的方式编写。如果你有很多json文件,并且你都希望将它们转换为out / * .php,并且你使用的是GNU make,你可以使用GNU make的通用通配符规则:

out/%.php:    %.json
    action

答案 1 :(得分:2)

还有另一种方法可以做同样的事情,也许更优雅:

$(JSON_FILES): out/%.php: %.json
    action

这将为JSON_FILES中列出的每个文件创建一个规则,因此如果定义了JSON_FILES= foo.json bar.json,那么这相当于:

out/foo.php: foo.json
    action

out/bar.php: bar.json
    action

如果你真的想要所有的.json文件,你可以使用$(wildcard *.json)设置该值,或者如果规则对于少数文件是唯一的,则可以手动设置它。