为什么我的makefile没有做我想要的 - 隐式和显式规则之间的冲突?

时间:2011-07-17 17:31:45

标签: makefile

我从源码构建的网站主要包含两组文件。首先,一组HTML文件包含PHP处理指令,我在生成本地化标记文件时使用PHP 在构建时处理这些指令。换句话说,源目录中的HTML文件是用PHP处理的,它将输出管道输出到构建目录中具有相同名称的另一个HTML文件。

所述HTML文件的处理涉及一组自己的PHP文件。这些文件带有实际的本地化文本,用于替换源HTML文件中的占位符。这些PHP文件又是从相应的XML文件生成的。这是因为我们选择XML作为本地化文本的原始载体,因为这个项目是一个较大的项目的一部分,在使用的技术方面相当异质,因此我们使用XML,也帮助我们快速翻译。 / p>

其次,最后,我有第二组文件,我们可以称之为“静态”资产,只需要从源代码逐字复制到构建目录。

我正在努力编写一个简洁的makefile供GNU make使用,它正确地表达了依赖关系。我最多只完成了一半而make似乎对我起了诡计,让我感到困惑。

下面的makefile的简短图例,如果您真的快速选择,可以大概跳过这个:

  • 使用include调用将本地化数据从XML格式转换为PHP xml_to_php_res的代码的过程。 XML文件位于当前(源)目录中并匹配*.res.xml
  • include脚本
  • 中抽象调用PHP到process_html本地化文件和处理HTML文件
  • DESTDIR make变量用于指示构建目录的前缀。由于它是一个前缀,因此在定义时通常以/结尾。出于显而易见的原因,它不能匹配源目录。
  • 假设源目录是当前目录
  • 从XML文件生成的本地化PHP文件与$(DESTDIR)resources/*.php匹配。我不会在使用后丢弃它们,因为1)缓存它们是好的,2)如果认为需要,它们可以在运行时使用。我想这些是make所谓的“中间”先决条件?

makefile:

php_pp_def_files := $(patsubst ./%.res.xml,$(DESTDIR)resources/%.php,$(shell find -name \*.res.xml))

$(DESTDIR)resources/%.php: %.res.xml
    ./xml_to_php_res $< > $@

$(DESTDIR)%.html: %.html $(php_pp_def_files) # Each built HTML file depends on corresponding source HTML file and all PHP localization definition files
    ./process_html $< > $@

$(DESTDIR)%: %
    $(INSTALL_DATA) -D $< $@

最后一条规则似乎干扰了我的意图。似乎make的设计方式 - 如果第二条规则的某些先决条件不存在,它只是跳过它并考虑第三条规则。这根本不是我需要的。

我省略了all目标,因为makefile甚至不适用于任意单个文件。

我想我错过了一些关于如何进行搜索和匹配规则等等的最重要的知识。我现在第几次实际上已经交叉了这本手册,但是它非常神秘,在我设法理解它之前我得到了嘘声:/

1 个答案:

答案 0 :(得分:1)

如果我理解正确,最后一条规则是将静态资产复制到构建目录。如果是这样,我想到的第一个解决方案是将其变为static pattern rule。这样,该规则仅适用于您指定的目标。您必须为此构建一个静态资产列表。

STATICS := $(addprefix $(DESTDIR), ...)
$(STATICS): $(DESTDIR)%: %
    $(INSTALL_DATA) -D $< $@

编辑以回复评论:
我认为以下内容应构建您需要的文件列表。

STATICS := $(addprefix $(DESTDIR), $(filter-out %.php %.html, $(wildcard *)))