Cmake:安装时执行Cmake命令

cmake: execute cmake commands at install time

本文关键字:Cmake 命令 执行 安装      更新时间:2023-10-16

当我在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包含在install:中作为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. 决定并硬编码配置时的值:

    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形式,并把命令放在一个单独的文件。

注意:

  1. 在这两种情况下,我在最后一行转义了$,因为这些变量总是只在脚本和
  2. 中定义
  3. 我也逃脱了${PROJECT_SOURCE_DIR},但我不完全确定缓存是加载的。如果不是,则必须将其转义为"${PROJECT_SOURCE_DIR}"(并希望值中没有")。
  4. 同样在第一种情况下,我把git_arg值放在引号中,因为列表将扩展与; s分开,并且不会正确回读。

由于重新解析时特殊字符的问题,我将NOT推荐第一个选项