Makefile GNU Make:构建多个没有目标的源文件

Makefile GNU Make:构建多个没有目标的源文件,makefile,gnu-make,Makefile,Gnu Make,在签入版本控制之前,我正在使用makefile检查一些配置文件。我对其中一条规则有困难,它基本上需要运行 /usr/local/bin/check-program config/file1.conf /usr/local/bin/check-program config/file2.conf [...] check程序不接受多个参数,因此需要单独检查每个配置文件。所有配置文件都在一个子目录中,并且都以.config结尾 由于没有源/依赖关系,我无法找到正确的makefile语法来运行它。作为一

在签入版本控制之前,我正在使用makefile检查一些配置文件。我对其中一条规则有困难,它基本上需要运行

/usr/local/bin/check-program config/file1.conf
/usr/local/bin/check-program config/file2.conf
[...]
check程序不接受多个参数,因此需要单独检查每个配置文件。所有配置文件都在一个子目录中,并且都以.config结尾


由于没有源/依赖关系,我无法找到正确的makefile语法来运行它。作为一种解决方法,for循环将为我执行检查,但这既不会在失败时退出,也不会跳过已检查的文件

以下是我到目前为止所拥有的内容的简化版本:

SHELL := /bin/sh
WD := $(shell pwd)
HOST := $(shell hostname -s)
BPCFG := $(wildcard config/*.conf)

all : check-bp

check-bp : $(BPCFG)
   for file in $(BPCFG); do \
       /usr/local/bin/check-program $$file; \
       echo ""; \
   done

您可以使用sentinel文件执行此操作。对于每个
.conf
文件,让检查步骤创建一个
.conf.checked
文件(如果成功)

SHELL := /bin/sh
WD := $(shell pwd)
HOST := $(shell hostname -s)
BPCFG := $(wildcard config/*.conf)

all : $(BCFG:%=%.checked)

%.conf.checked: %.conf
        /usr/local/bin/check-program $< && touch $@
SHELL:=/bin/sh
WD:=$(外壳pwd)
主机:=$(外壳主机名-s)
BPCFG:=$(通配符配置/*.conf)
全部:$(BCFG:%=%已选中)
%.conf.checked:%.conf
/usr/local/bin/check程序$<&&touch$@
至于for循环在失败时不退出,这正是shell的工作方式。试一试

for ((i = 0; i < 10; i++)); do if (( $i < 9 )); then false; else true; fi; done
((i=0;i<10;i++)的
for;如果($i<9)),则执行;然后是假的;否则是真的;fi;完成
该命令在十次中有九次失败,但计算的是最后一次循环的退出状态


要解决此问题,请将
SHELL
行更改为
SHELL=/bin/sh-e
,使SHELL的默认行为是在命令失败时中止脚本。由于这将使shell命令中止,即使您不介意某些内容返回非零退出状态,您可能必须在命令末尾添加
|true
,例如
grep Warning error.log

“也不要跳过已检查的文件”-如果没有结果文件,您如何知道已检查该文件?也许您应该为每个配置创建空的标记文件,以使用它们的修改日期(以及模式规则,作为副作用)好的观点。我已经从@andrewdotn为每个解决方案实现了此功能,谢谢。