我试图找出为什么我不能将目标指定为在不同的目录中。
我正在尝试从json文件生成一些php类,但我已经将实际生成php的行更改为虚拟echo语句,所以其他人可以复制粘贴并测试它们是否感觉非常慷慨。
要添加到包含makefile的目录还有两件事:
如果我有一个包含以下内容的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中看到我做错了吗?
感谢。
答案 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)
设置该值,或者如果规则对于少数文件是唯一的,则可以手动设置它。