在运行make目标之前检查cmake

时间:2012-04-05 12:46:40

标签: makefile cmake

我已经完成了以下makefile

.PHONY: check
check:
    @[ -f `which cmake` ] ||  $(error Install cmake first)

.PHONY: check2    
check2:
    @[ -f `which cmake` ] || echo "Install cmake first"

.PHONY: exec
exec: check
    @echo "Compiling executable ..."
    @[ -d ./build ] || mkdir ./build
    @cd ./build; cmake ../src; make

目标 check2 有效(当cmake存在时,我没有收到消息“首先安装cmake”,如果没有,我收到消息),目标检查< / strong>即使存在cmake也会一直退出。

所以我不能将目标检查用于目标 exec 。我必须使用目标 check2 ,当然, make 退出,因为它找不到cmake。

我希望 make 在开始回应“编译可执行文件......”之前退出。

1 个答案:

答案 0 :(得分:1)

当make决定需要重建目标时,它首先要做的是扩展配方中的所有make宏(变量)和函数。然后它将生成的扩展文本发送到shell。

在“检查”规则中,您使用的是make函数$(错误...),因此只要make决定构建该目标,它就会扩展配方,包括扩展$(错误...)功能和退出。 shell无法运行命令的一部分(如[ -f ... ],然后以某种方式指示它应该或不应该调用make函数。

如果你想让make失败,你所要做的就是让你的食谱失败。您的check2食谱会打印一条消息但它仍然成功,因此它不会停止继续播放。你可以这样做:

.PHONY: check2    
check2:
        @[ -f `which cmake` ] || { echo "Install cmake first"; exit 1; }

.PHONY: exec
exec: check2
        @echo "Compiling executable ..."
        @[ -d ./build ] || mkdir ./build
        @cd ./build; cmake ../src; make

或者你可以把测试放到exec目标本身:

.PHONY: exec
exec:
        @[ -f `which cmake` ] || { echo "Install cmake first"; exit 1; }
        @echo "Compiling executable ..."
        @[ -d ./build ] || mkdir ./build
        @cd ./build; cmake ../src; make

如果你在其他任何地方都不需要它。