从Shell脚本调用makefile

10

我是shell脚本新手,我想从Shell脚本中按特定顺序调用一系列make文件。对于每个make文件,我想要获取结果(即make是否成功)。如果出现任何错误,我希望停止脚本执行。如果成功,我必须运行下一个make文件。


喜欢使用 make1 && make2 && make3 吗? - pfnuesel
或者 make -f makefile1 && make -f makefile2 && ... - devnull
2个回答

14

一个常见的惯用语是使用set -e创建shell脚本;这将导致脚本在第一个错误上退出。

#!/bin/sh
set -e
make -f Makefile1
make -f Makefile2
:

如果您需要更多地控制整个脚本,也许可以移除set -e并在make失败时显式退出:

make -f Makefile1 || exit
make -f Makefile2 || exit
为了减少代码重复,创建一个循环:
for f in Makefile1 Makefile2; do
    make -f "$f" || exit
done

需要明确的是,||&& 是连接词,分别表示"或"和"且"。

if make -f Makefile1; then
     : "and" part
else
    : "or" part
fi

最后,您所描述的行为与Make本身的行为非常相似。也许一个顶层Makefile实际上是您的情况下适合的解决方案?

.PHONY: all
all:
    $(MAKE) -f Makefile1
    $(MAKE) -f Makefile2

2
make -f makefile1
make -f makefile2

有序运行make文件

保存每个makefile的输出结果

make -f makefile1 >> output1
make -f makefile2 >> output2

在每个make文件之后检查结果

make -f makefile1 >> output1

在这行代码之后使用脚本
echo $? 与if结合使用。如果echo$?的结果为零,则表示编译成功,那么就运行下一个文件;否则退出。


记录错误信息可能会有所帮助,例如 make -f makefile1 &>> output1 - pfnuesel
&>>file 重定向不是可移植的;一些 shell 支持这种形式作为语法糖,但老实说,可移植的 >>file 2>&1 对我来说完全没问题。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接