自定义CMake install()命令脚本的运行机制及相关问题咨询
CMake install(SCRIPT) 相关疑问解答
此问题是某问题的后续提问。
CMake支持在执行安装操作(即调用cmake --install触发install()命令执行时)运行自定义脚本,语法如下:
install([[SCRIPT <file>] [CODE <code>]] [COMPONENT <component>] [...])SCRIPT形式会在安装阶段调用指定的CMake脚本文件,若脚本路径为相对路径,则以当前源目录为基准解析。
本文重点关注SCRIPT形式,而非CODE形式。
已知CMake查找脚本的方式,但存在以下疑问:
- 其作用域行为如何?是否类似
add_subdirectory()?或是类似调用CMake函数、展开CMake宏?亦或是其他情况? - 语法声明中的
[...]是否意味着可以向脚本传递参数? - 若脚本无法共享其他
install()命令使用的变量,该如何为其提供这些信息? - 能否在脚本内部使用
install()命令以补充外部安装流程?
疑问解答
1. 作用域行为
install(SCRIPT)执行的脚本,其作用域独立于主构建脚本的配置阶段作用域,但会继承安装阶段的全局上下文。它既不像add_subdirectory()那样创建新的子目录作用域,也不像函数/宏那样在调用者作用域内执行:
- 脚本在安装阶段单独运行,拥有自己的变量作用域,但可以访问安装阶段的全局变量(比如
CMAKE_INSTALL_PREFIX这类内置变量)。 - 脚本中定义的变量不会回传到主构建脚本的配置阶段,仅在脚本执行期间有效。
2. 能否传递参数
语法中的[...]并非用于传递自定义参数给脚本,它代表CMake允许的其他可选关键字参数(比如EXCLUDE_FROM_ALL等)。无法直接向SCRIPT脚本传递自定义参数。
3. 向脚本传递变量信息
若要让脚本获取主构建中的变量,有两种常用方法:
- 在配置阶段通过
configure_file()将变量值写入一个临时CMake脚本(比如install_config.cmake.in),生成后再用install(SCRIPT)调用这个生成的脚本。 - 利用CMake的缓存变量:在主脚本中将需要传递的变量设置为缓存变量(
set(VAR VALUE CACHE INTERNAL "")),脚本在安装阶段可以直接读取这些缓存变量。
4. 脚本内部使用install()命令
完全可以。脚本内部的install()命令会被纳入整个安装流程,和主脚本中定义的install()命令一样生效。你可以在脚本中补充安装规则,比如安装额外文件、执行自定义安装逻辑等。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

