cmake:在安装时执行cmake命令

时间:2016-09-02 10:35:08

标签: c++ linux cmake

当我拥有它们时,我有以下几行没有问题,因为它们在CMakeLists.txt主文件中。

set (git_cmd git)
set (git_arg rev-parse --verify HEAD )
message(STATUS \"git cmd: ${git_cmd}\")
execute_process(COMMAND ${git_cmd} ${git_arg}
  WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
  RESULT_VARIABLE git_result
  OUTPUT_VARIABLE git_ver)

message(STATUS \"git ver[${git_result}]: ${git_ver}\")

当我执行cmake

时,我得到以下输出
 -- "gitcmd:git"
 -- "gitver[0]:3268845bbbda4af12c951d75c25913d014da48ef

但我真正想要的是在安装时执行这些订单,当我执行" make install"

因此,我将这些LINES包含在安装中:as install(CODE" LINES")

install( CODE 
                "
set (git_cmd git)
set (git_arg rev-parse --verify HEAD )
message(STATUS \"git cmd: ${git_cmd}\")
execute_process(COMMAND ${git_cmd} ${git_arg}
  WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
  RESULT_VARIABLE git_result
  OUTPUT_VARIABLE git_ver)

message(STATUS \"git ver[${git_result}]: ${git_ver}\")
        "
)

然而,当我执行" make install"时的输出似乎表明没有设置git_cmd

-- git cmd: 
CMake Error at cmake_install.cmake:196 (execute_process):
  execute_process given COMMAND argument with no value.

我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

您正在安装脚本中设置变量,但已在配置脚本中扩展它们了!

有四种选择可以解决它:

  1. 在配置时决定并硬编码值:

    set (git_cmd git)
    set (git_arg "rev-parse --verify HEAD")
    install( CODE 
                    "
    message(STATUS \"git cmd: ${git_cmd}\")
    execute_process(COMMAND ${git_cmd} ${git_arg}
      WORKING_DIRECTORY \${PROJECT_SOURCE_DIR}
      RESULT_VARIABLE git_result
      OUTPUT_VARIABLE git_ver)
    
    message(STATUS \"git ver[\${git_result}]: \${git_ver}\")
            "
    )
    
  2. 正确转义代码段:

    install( CODE 
                    "
    set (git_cmd git)
    set (git_arg rev-parse --verify HEAD )
    message(STATUS \"git cmd: \${git_cmd}\")
    execute_process(COMMAND \${git_cmd} \${git_arg}
      WORKING_DIRECTORY \${PROJECT_SOURCE_DIR}
      RESULT_VARIABLE git_result
      OUTPUT_VARIABLE git_ver)
    
    message(STATUS \"git ver[\${git_result}]: \${git_ver}\")
            "
    )
    
  3. 无论如何都要预先设置变量,但也只在安装时展开它们。我不确定他们是否必须在缓存中,但我怀疑他们这样做,所以我补充说:

    set (git_cmd git CACHE "" INTERNAL)
    set (git_arg rev-parse --verify HEAD CACHE "" INTERNAL)
    install( CODE 
                    "
    message(STATUS \"git cmd: \${git_cmd}\")
    execute_process(COMMAND \${git_cmd} \${git_arg}
      WORKING_DIRECTORY \${PROJECT_SOURCE_DIR}
      RESULT_VARIABLE git_result
      OUTPUT_VARIABLE git_ver)
    
    message(STATUS \"git ver[\${git_result}]: \${git_ver}\")
            "
    )
    
  4. 使用install(SCRIPT表单并将命令放在单独的文件中,而不是尝试正确引用。

  5. 请注意:

    1. 在这两种情况下,我都逃过了最后一行的$,因为这些变量总是只在脚本中定义而且
    2. 我也逃过了${PROJECT_SOURCE_DIR},但我并不完全确定已加载缓存。如果不是,则您必须将其作为\"${PROJECT_SOURCE_DIR}\"转义(并希望值中没有")。
    3. 同样在第一种情况下,我将git_arg值放在引号中,因为列表会以;分隔,并且无法正确读回。
    4. 由于重新分析时特殊字符存在问题,我会推荐第一个选项。