2014-03-25 104 views
1

我在使用makefile检查版本控制之前检查一些配置文件。我有困难的规则,这需要基本只是运行GNU Make:构建无目标的多个源文件

/usr/local/bin/check-program config/file1.conf 
/usr/local/bin/check-program config/file2.conf 
[...] 

检查程序不接受多个参数之一,所以每个配置文件都需要单独检查。所有配置文件都位于一个子目录中,并且全部以.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 
+2

”也不跳过已经被选中的文件“ - 如果你没有生成文件,你会如何知道它被检查?也许你应该为每个配置创建空标记文件,以使用它们的修改日期(和模式规则,作为副作用) – keltar

+0

好点。我已经从@andrewdotn实施了这个解决方案,谢谢。 –

回答

2

你可以用定点文件做到这一点。对于每个.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 [email protected] 

至于for循环在失败时不会退出 - 这只是shell的工作方式。尝试

for ((i = 0; i < 10; i++)); do if (($i < 9)); then false; else true; fi; done 

该命令将失败9倍十个,但所有重要的是通过循环的最后运行的退出状态。

要修复此问题,请将SHELL行更改为SHELL = /bin/sh -e,以使shell的默认行为是当命令失败时中止脚本。因为即使你不介意某些事情返回非零出口雕像,也会使shell命令中止,因此可能必须将|| true添加到像grep Warning error.log这样的命令末尾。 “