2010-11-09 72 views
4

我想弄清楚为什么我不能指定一个目标作为在不同的目录中。如何在不同目录中指定makefile目标?

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

还有其他两件事情要添加到包含生成文件的目录:

  • 称为PatientDbPath.json
  • 目录中的虚拟依赖文件叫出来

如果我有一个makefile与下列:

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

PatientDbPath.php: PatientDbPath.json 

clean: 
    $(RM) PatientDbPath.php 

然后,一切正常,当我运行; 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 

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

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

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

clean: 
    rm out/PatientDbPath.php 

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

谢谢。

回答

3

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

概念错误是,这是一个规则如何将任意json文件(比如说foo.json)转换为任意命名的.php文件(比如说json.php)。然而,你的规则是专门针对PatientDbPth.php的。一个更好的规则是

.json.php: 
    echo "HelloMe" > [email protected] 

其中[email protected]是一个变量命名输出文件。

这也显示了实际问题:这些规则实际上只限于同名文件。如果在.php中有翻译.json的规则,并且您有foo.php,并且您想要bar.php,那么通配符规则将不匹配。匹配涉及整个文件名,所以当你要求输出/ PatientDbPath.php时,通配符规则不匹配。这给你留下了没有任何行动的规则,因此推断没有任何事情要做。

如果这是您想要转换的唯一文件,最好按照您在第三个文件中所做的方式进行编写。如果你有很多json文件,并且你都想将它们转换为/ *。PHP的,并且您使用了GNU make,你可以使用GNU make的广义通配符规则:

out/%.php: %.json 
    action 
+0

感谢您的回复,我将尝试更改我的真实makefile以使用建议的表示法。我会尽快跟进或标记答案。关于概念问题,我在这里发布的只是一个示例makefile,它显示了问题,而不是我真正的makefile。 – 2010-11-09 21:21:53

+0

好吧,我测试了一下,你是绝对正确的,把我的makefile改成使用'out /%。php:%.json'完成了。我有一个后续问题。我是否需要为该目录​​中的每个.json文件创建单独的规则? – 2010-11-09 23:02:58

+0

我找到了我想要的解决方案,基本上我需要添加下面一行:'all :: $(patsubst%.json,out /%。php,$(wildcard * .json))'这会添加一个依赖项每个php文件都要从该目录中的每个.json生成 – 2010-11-09 23:59:38

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 

然后,您可以使用$(wildcard *.json)如果您真的想要所有.json文件,请设置该值,如果该规则仅适用于少数几个,则可以手动设置该值。

相关问题