首页 > 解决方案 > CMake 目标生成的文件中的替换文本

问题描述

我有 cmake 目标,它在 windows 上运行 setup.exe,它使用 add_custom_target 安装工具,如下所示

# TOOL_TEMP_INSTALL_PATH is the installation path which is set earlier in cmake
add_custom_target(
    install_tool
    COMMAND ${TOOL_TEMP_DIR}/setup.exe /DIR=${TOOL_TEMP_INSTALL_PATH}
)

安装后,我想替换位于 ${TOOL_TEMP_INSTALL_PATH}/tool.ini 的配置文件中的文本,将文本行“LICENSE_FILE=Enter License server”替换为“LICENSE_FILE=30309@server”

以下命令将实现此目的,但这需要在 install_tool 目标构建后运行。

file(READ "${TOOL_TEMP_INSTALL_PATH}/tool.ini" filedata)
string(REGEX REPLACE "LICENSE_FILE=Enter License server here" 
"LICENSE_FILE=30309@server" filedata "${filedata}")
file(WRITE  "${TOOL_TEMP_INSTALL_PATH}/tool.ini" "${filedata}")

如何将这些命令作为依赖项添加到 install_tool?或者有没有更好的方法在 Windows 上实现这一点?

标签: windowscmake

解决方案


由于您希望作为同一目标的一部分按顺序运行两件事,因此您可以在同一目标中使用多个 COMMAND 条目。困难在于 COMMAND 不能处理 CMake 代码,而只能处理系统命令。典型的解决方案是在脚本文件的子 shell 中调用 CMake:

COMMAND ${CMAKE_COMMAND} -P path_to_script

因此,将您的文件修改命令放在源代码树中名为 的文件中license-install.cmake,然后将另一个 COMMAND 添加到您的add_custom_target

提示:您可能会考虑add_custom_command改为,因此您可以在已安装树中指定一个文件作为依赖项。这将允许 CMake 将已安装的工具视为构建产品,如果该工具已安装,则可以跳过安装步骤。你仍然需要add_custom_target一个依赖于你的命令输出来正确连接它。


推荐阅读