我有许多生成和运行测试的makefile。我想创建一个脚本,使每个脚本都记录下来,并记录测试是否通过。尽管我可以确定每个make文件中的测试状态,但是我仍然无法找到一种将状态传达给make
命令的调用方的方法。
我的第一个想法是以某种方式影响make
命令的返回值,尽管这似乎是不可能的。我可以这样做吗?我还有其他通讯方式可以用来将测试状态表达给将调用make
的bash脚本吗?也许通过使用环境变量?
谢谢
编辑:谢谢,我似乎无法设置make的返回码,因此暂时我将不得不进行测试,在调用脚本而不是makefile中运行它们,记下结果,然后手动运行make clean
。我感谢大家的帮助。
答案 0 :(得分:0)
根据来源,Make只会返回以下内容之一
#define MAKE_SUCCESS 0
#define MAKE_TROUBLE 1
#define MAKE_FAILURE 2
MAKE_SUCCESS
和MAKE_FAILURE
应该是不言自明的;仅在使用MAKE_TROUBLE
选项运行make时返回-q
。
这几乎是您从make所获得的全部东西,似乎没有任何方法可以设置返回码。
答案 1 :(得分:0)
make
的默认行为是返回失败,如果失败则放弃所有剩余目标。
for directory in */; do
if ( cd "$directort" && make ); then
echo "$0: Make in $directory succeeded" >&2
else
echo "$0: Make in $directory failed" >&2
fi
done
答案 2 :(得分:0)
仅确保每个测试将其结果保留在该测试唯一的文件中。如果测试通过,则最小的摩擦是创建 test .pass
,否则创建 test .fail
。在测试运行结束时,收集所有文件并生成报告。
此方案有两个优点,我可以看到:
-jn
标志,对吗?(提示:这是 make 的重点))假设测试称为 test-blah ,其中 blah 是任何字符串,并且您在${tests}
中有一个测试列表(毕竟,刚刚建立了它们,所以这不是一个不合理的假设。
草图:
fail = ${@:%.pass=%.fail}
test-passes := $(addsuffix .pass,${tests})
${test-passes}: test-%.pass: test-%
rm -f ${fail}
touch $@
$* || mv $@ ${fail}
.PHONY: all
all: ${test-passes}
all:
# Count the .pass files, and the .fail files
echo '$(words $(wildcard *.pass)) passes'
echo '$(words $(wildcard *.fail)) failures'
详细信息:
test-passes := $(addsuffix .pass,${tests})
${tests}
包含test-1 test-2
(例如),则${test-passes}
将是test-1.pass test-2.pass
${test-passes}: test-%.pass: test-%
test-1.pass
取决于文件test-1
。对于test-2.pass
同样。test-1.pass
不存在或比可执行文件test-1
早,则 make 将运行该配方。
rm -f ${fail}
${fail}
扩展到目标,其中 pass 替换为 fail ,或者在这种情况下为test-1.fail
。 -f
确保 rm 在文件不存在的情况下不返回错误。touch $@
-创建 .pass 文件$< || mv $@ ${fail}
test-1.fail
放在其位置.PHONY: all
— all 目标是符号性的,不是文件all: ${test-passes}
echo '$(words $(wildcard *.pass)) passes'
$(wildcard)
扩展为传递文件列表,然后使用$(words)
对文件进行计数。外壳程序获得命令echo 4 passes
(例如)您使用以下命令运行
$ make -j9 all
Make 将使9个作业一次运行-如果您有8个CPU,那就太好了。