如何更改make命令的返回值

时间:2019-02-07 18:32:39

标签: makefile

我有许多生成和运行测试的makefile。我想创建一个脚本,使每个脚本都记录下来,并记录测试是否通过。尽管我可以确定每个make文件中的测试状态,但是我仍然无法找到一种将状态传达给make命令的调用方的方法。

我的第一个想法是以某种方式影响make命令的返回值,尽管这似乎是不可能的。我可以这样做吗?我还有其他通讯方式可以用来将测试状态表达给将调用make的bash脚本吗?也许通过使用环境变量?

谢谢

编辑:谢谢,我似乎无法设置make的返回码,因此暂时我将不得不进行测试,在调用脚本而不是makefile中运行它们,记下结果,然后手动运行make clean。我感谢大家的帮助。

3 个答案:

答案 0 :(得分:0)

根据来源,Make只会返回以下内容之一

#define MAKE_SUCCESS 0
#define MAKE_TROUBLE 1
#define MAKE_FAILURE 2

MAKE_SUCCESSMAKE_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 的重点))
  • 您可以使用结果文件记录是否需要重新运行测试(标准剔除工作(提示:这几乎是 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放在其位置
      • 无论哪种方式, make 都看不到错误
  • .PHONY: all all 目标是符号性的,不是文件
  • all: ${test-passes}
    在运行 all 的配方之前,我们先构建并运行所有测试
    • echo '$(words $(wildcard *.pass)) passes'
      在将文本传递到外壳程序之前, make $(wildcard)扩展为传递文件列表,然后使用$(words)对文件进行计数。外壳程序获得命令echo 4 passes(例如)

您使用以下命令运行

$ make -j9 all

Make 将使9个作业一次运行-如果您有8个CPU,那就太好了。