1

我已经完成了以下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”,如果没有,我收到消息),即使存在 cmake ,目标检查也总是退出。

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

我想它开始回显“正在编译可执行文件...”之前退出。

4

1 回答 1

1

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

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

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

.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

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

于 2012-04-05T20:49:51.937 回答