如何在其他目录中指定makefile目标?

Jua*_*des 5 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
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中看到我做错了什么吗?

谢谢。

dav*_*pcj 5

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

$(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 文件,则可以使用该值来设置该值,或者如果规则仅对少数几个文件是唯一的,则可以手动设置该值。


Mar*_*wis 4

您的通配符规则 (.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)