【问题标题】:makefile, process several filesmakefile,处理几个文件
【发布时间】:2011-03-24 03:27:34
【问题描述】:

我如何在一个 makefile (gnu make) 中处理多个文件,以及:

  • 为每个文件运行一个命令或一系列命令
  • 单个大于零的错误代码失败
  • 无需在 makefile 中输入每个文件名
  • 即使在第一次失败后也继续在所有文件上运行

我想出了这个。它可以工作,除了最后一个要求,而且非常不成熟:

​​>
.PHONY: lint
.PHONY: all

all: lint

lint:
    for f in `find src/ -name \*.inc -o -name \*.html`; do php -l $$f && continue || exit 1; done

【问题讨论】:

  • "在大于零的单个错误代码上失败" "即使在第一次失败后也继续在所有文件上运行" 呃...
  • 听起来脚本比 Makefile 更合适?
  • @Ignacio Vazquez-Abrams:它应该在所有文件上运行,因此该命令可以输出所有错误。但是,如果其中任何一个返回 >0,则 make 规则应该在构建链中失败。
  • 确实,我现在同意脚本是更好的解决方案。

标签: makefile gnu-make lint


【解决方案1】:

您的原始 makefile 的更类似于 make 的转录:

files := $(shell find src/ -name \*.inc -o -name \*.html)
.PHONY: ${files}
${files}: ; php -l $@

.PHONY: lint
lint: ${files} ; echo Lint finished

我真的真的不喜欢在makefile 中使用$(shell…)。就我个人而言,我会列出 Makefile 中的所有文件,也许还有一个目标是断言列表是完整的。

如果您需要最后一点(“即使在第一次失败后仍继续在所有文件上运行”),请使用 make -k

【讨论】:

    【解决方案2】:

    我建议您将其重写为更具制作风格,即:

    files = ....
    
    lint_targets = $(addsuffix .lint, $(files))
    
    lint: $(lint_targets)
    
    .PHONY: lint $(lint_targets)
    
    $(lint_targets): 
        @php -l $(basename $@)
    

    【讨论】:

    • 唯一的麻烦是$(files) 规则永远不会运行。 (由于该规则没有先决条件,它只会在目标不存在时运行,并且由于目标列表是由find 创建的,所以永远不会。)
    • @Beta 您可能会感到惊讶,但前提条件不是强制性的;例如,如果您为所有文件添加后缀,它将运行;我的提议与 find 无关;这是将某些工具应用于选定文件的另一种方法
    猜你喜欢
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多