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

时间:2014-03-25 02:59:39

标签: makefile gnu-make

我正在使用makefile检查一些配置文件,然后再检查版本控制。我对其中一条规则有困难,这些规则基本上只需要运行

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

check-program 不接受多个参数,因此需要单独检查每个配置文件。所有配置文件都在一个子目录中,并且都以 .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

1 个答案:

答案 0 :(得分:2)

您可以使用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 $@

至于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