我试图弄清楚为什么我不能将目标指定为其他目录。
我正在尝试从json文件生成一些php类,但是我将实际生成php的行更改为虚拟echo语句,因此其他人可以复制粘贴并测试它们是否非常慷慨。
还有另外两件事要添加到包含makefile的目录中:
如果我的makefile包含以下内容:
.SUFFIXES: .php .json
.json.php:
echo "HelloMe" > PatientDbPath.php
PatientDbPath.php: PatientDbPath.json
clean:
$(RM) PatientDbPath.php
Run Code Online (Sandbox Code Playgroud)
然后,当我运行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
Run Code Online (Sandbox Code Playgroud)
这样做后,make: Nothing to be done for 'out/PatientDbPath.php'即使out目录中没有文件PatientDbPath.php ,Make 也会告诉我。
所以我想也许是带有后缀规则的东西,然后我创建了第三个makefile。
out/PatientDbPath.php: PatientDbPath.json
echo "Whatever" > out/PatientDbPath.php
clean:
rm out/PatientDbPath.php
Run Code Online (Sandbox Code Playgroud)
和第一个一样,这个效果很好。有人可以在第二个makefile中看到我做错了什么吗?
谢谢。
还有另一种方法可以做同样的事情,也许更优雅:
$(JSON_FILES): out/%.php: %.json
action
Run Code Online (Sandbox Code Playgroud)
这将为 中列出的每个文件创建一个规则JSON_FILES,所以如果它被定义JSON_FILES= foo.json bar.json,那么这将等同于:
out/foo.php: foo.json
action
out/bar.php: bar.json
action
Run Code Online (Sandbox Code Playgroud)
$(wildcard *.json)如果您确实需要所有 .json 文件,则可以使用该值来设置该值,或者如果规则仅对少数几个文件是唯一的,则可以手动设置该值。
您的通配符规则 (.json -> .php) 中有两个错误,一是概念性的,一是实际性的。
概念上的错误是,这是如何将任意 json 文件(例如,foo.json)转换为任意但名称相同的 .php 文件(例如,json.php)的规则。然而,您的规则是特定于生成 PatientDbPth.php 的。更好的规则是
.json.php:
echo "HelloMe" > $@
Run Code Online (Sandbox Code Playgroud)
其中$@是命名输出文件的变量。
这也说明了实际问题:这些规则确实仅限于同名文件。如果您有一条在 .php 中翻译 .json 的规则,并且您有 foo.php,并且您想要 bar.php,则通配符规则将不匹配。匹配涉及整个文件名,因此当您请求 out/PatientDbPath.php 时,通配符规则不匹配。这给你留下了没有任何动作的规则,因此 make 推断什么都不要做。
如果这是您想要转换的唯一文件,最好按照第三个文件中的方式编写。如果你有很多 json 文件,并且都想将它们转换为 out/*.php,并且你使用的是 GNU make,则可以使用 GNU make 的通用通配符规则:
out/%.php: %.json
action
Run Code Online (Sandbox Code Playgroud)