2014-03-25 37 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這樣的命令末尾。 「