我已经完成了以下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 在开始回应“编译可执行文件......”之前退出。
答案 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
如果你在其他任何地方都不需要它。