makefile,处理多个文件

makefile,处理多个文件,makefile,gnu-make,lint,Makefile,Gnu Make,Lint,如何处理makefile(gnu make)中的多个文件,以及: 为每个文件运行一个或一系列命令 单个错误代码大于零时失败 无需在makefile中键入每个文件名 即使在第一次失败后,仍继续在所有文件上运行 我想到了这个。除了最后一个要求外,它还可以工作,而且非常不成熟: .PHONY: lint .PHONY: all all: lint lint: for f in `find src/ -name \*.inc -o -name \*.html`; do php -l $$

如何处理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

我建议您将其改写为更具make风格,例如:

files = ....

lint_targets = $(addsuffix .lint, $(files))

lint: $(lint_targets)

.PHONY: lint $(lint_targets)

$(lint_targets): 
    @php -l $(basename $@)

原始makefile的更像make的转录:

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

.PHONY: lint
lint: ${files} ; echo Lint finished
我真的不喜欢在makefiles中使用
$(shell…
)。就我个人而言,我会列出Makefile中的所有文件,也许有一个目标来断言列表是完整的


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

“在大于零的单个错误代码上失败”“即使在第一次失败后仍在所有文件上运行”嗯……听起来脚本比Makefile更合适?@Ignacio Vazquez Abrams:它应该在所有文件上运行,因此,该命令可以输出所有错误。但如果其中任何一个返回>0,则生成规则在构建链中应该失败。事实上,我现在同意脚本是更好的解决方案。唯一的问题是,
$(文件)
规则永远不会运行。(由于该规则没有先决条件,因此仅当目标不存在时才会运行,而且由于目标列表是由
find
创建的,这是绝对不可能的。)@Beta您可能会感到惊讶,但先决条件不是必需的;例如,如果您向所有文件添加后缀,它将运行;我的建议与find无关;这是将某些工具应用于选定文件的另一种方法