CMake: Как добавить пользовательскую команду, которая выполняется только для одной конфигурации?

Я хочу добавить настраиваемую команду cmake, которая выполняется только тогда, когда настраиваемая цель создается в конфигурации отладки при использовании генератора мультиконфигурации Visual Studio. Есть ли чистый способ сделать это?

Чтобы реализовать это, я сначала попытался обернуть весь список команд в выражение генератора следующим образом.

add_custom_command(
    ...
    COMMAND $<$<CONFIG:Debug>:cmake;-E;echo;foo>
)

Но это дает мне синтаксическую ошибку при выполнении команды. После некоторых проб и ошибок я получил следующее хакерское решение для работы. Это оборачивает каждое слово списка команд в выражение генератора, подобное этому.

add_custom_command(
    ...
    COMMAND $<IF:$<CONFIG:Debug>,cmake,echo>;$<IF:$<CONFIG:Debug>,-E, >;$<IF:$<CONFIG:Debug>,echo, >;$<IF:$<CONFIG:Debug>,foo, >
)

Это выполняет cmake -E echo foo команда при компиляции конфигурации Debug и фиктивная команда echo " " " " " " для всех других конфигураций.

Это довольно уродливо, и фиктивная команда должна быть изменена в зависимости от хост-системы. В Linux это может быть ":" ":" ":" ":", Так есть ли более чистый способ сделать это?

Спасибо за ваше время!

1 ответ

Решение

Вот мой кусок кода (протестирован на нескольких платформах с одной и несколькими конфигурациями):

CMakeLists.txt

cmake_minimum_required(VERSION 3.8)

project(DebugEchoFoo NONE)

string(
    APPEND _cmd
    "$<IF:$<CONFIG:Debug>,"
        "${CMAKE_COMMAND};-E;echo;foo,"
        "${CMAKE_COMMAND};-E;echo_append"
    ">"
)

add_custom_target(
    ${PROJECT_NAME}
    ALL
    COMMAND "${_cmd}"
    COMMAND_EXPAND_LISTS
)

Примечание: COMMAND_EXPAND_LISTS это ключевое слово доступно только с версией CMake>= 3.8

Ссылка

Другие вопросы по тегам