从Makefile返回测试命令的状态

时间:2018-04-20 14:01:12

标签: makefile

我正在尝试捕获从Makefile内执行的命令的返回状态。

情景:

我有两个文本文件 - a.txt和b.txt(都是空的)

如果我运行测试命令,我会得到以下返回状态

test ! -s b.txt => 0 

修改文本文件的内容后

test ! -s b.txt => 1

Makefile内容:

test1:
    test ! -s *.txt

test2:
    $(foreach file, $(wildcard *.txt ) , \
    test ! -s ${file};\
)

在运行make test1时,无论文本文件是否为空,我都会收到以下错误,返回状态为2。

/bin/sh: line 0: test: a.txt: binary operator expected
make: *** [test1] Error 2

在运行make test2时,无论文本文件是否为空,我总是返回0状态。

如果* {1}}的测试命令返回状态,如果* .txt的大小不为零,我该如何获得非零值?

1 个答案:

答案 0 :(得分:0)

我刚刚尝试过,test如果您提供了许多文件名,则会出现错误:

tmp> test ! -s a.txt b.txt
-bash: test: a.txt: binary operator expected

您可能希望使用bash for循环而不是make foreach循环:

test1:
   for f in *; do \
        test ! -s "$$f" || exit 1; \
   done

对于背景,您的原始测试:

test2:
    $(foreach file, $(wildcard *.txt ) , \
    test ! -s ${file};\
)

将扩展为:

test2:
    test ! -s a.txt; test ! -s b.txt;

请注意,last命令的返回值(第二个test)是配方行的返回值,因此无论a.txt是否为空,make都不会失败。另一个副作用是在make读取时解析make $(wildcard ..),因此如果任何子/兄弟目标生成任何.txt,则在执行test2时不会扩展/测试它们。