【问题标题】:Check for cmake before running a make target在运行 make 目标之前检查 cmake
【发布时间】:2012-04-05 12:46:39
【问题描述】:

我做了下面的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”的消息,当它不存在时,我收到消息),目标 check 即使存在 cmake 也总是退出。

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

我希望 make 在它开始回显“Compiling executable ...”之前退出。

【问题讨论】:

    标签: makefile cmake


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 2011-09-12
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多