CMake заменяет текст в файле, сгенерированном целевым объектом

#windows #cmake

#Windows #cmake

Вопрос:

У меня есть цель cmake, которая запускает setup.exe в Windows, которая устанавливает инструмент с помощью 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= Введите сервер лицензий» на «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?

Ответ №1:

Поскольку вы хотите выполнить две вещи по порядку как часть одной и той же цели, вы можете использовать несколько записей КОМАНД в одной и той же цели. Трудность заключается в том, что COMMAND не может обрабатывать код CMake, а только системные команды. Типичным решением является вызов CMake в подоболочке в файле сценария:

COMMAND ${CMAKE_COMMAND} -P path_to_script

Итак, поместите ваши команды изменения файла в вызываемый файл в вашем дереве исходных license-install.cmake текстов и добавьте еще одну КОМАНДУ в свой add_custom_target

Подсказка: вы могли бы рассмотреть add_custom_command вместо этого, чтобы указать файл в установленном дереве в качестве зависимости. Это позволит CMake увидеть установленный инструмент как продукт сборки и пропустить шаг установки, если инструмент уже установлен. Вам все равно понадобится add_custom_target функция с зависимостью от вывода вашей команды, чтобы правильно подключить ее.