Как я должен передать одни и те же аргументы нескольким целям в CMAKE без переменных? - PullRequest
0 голосов
/ 01 октября 2018

Я выполняю рефакторинг файла cmake, чтобы использовать современные методы CMAKE для личного проекта.Однако, поскольку я не верю, что операционная система является обобщенной переменной, для тестирования операционной системы в CMAKE мне нужно сделать следующее ( на основе этого ответа ):

if(UNIX AND NOT APPLE)
    set(LINUX TRUE)
endif()
#...
if(LINUX)
    set(MY_PROJECT_LINK_ARGUMENTS ...)
elseif(WIN32)
    set(MY_PROJECT_LINK_ARGUMENTS ...)
else()
    message( FATAL_ERROR "Unsupported operating system")
endif()

add_library(xxx STATIC)
#...
target_link_libraries(xxx INTERFACE ${MY_PROJECT_LINK_LIBRARIES} ...)

add_library(yyy STATIC)
#...
target_link_libraries(yyy INTERFACE ${MY_PROJECT_LINK_LIBRARIES} ...)

add_library(zzz STATIC)
#...
target_link_libraries(zzz INTERFACE ${MY_PROJECT_LINK_LIBRARIES} ...)

Что меня смущает, так это то, как этого добиться в CMAKE на основе идиоматических современных целей.Поскольку я не знаю существующей переменной CMAKE, которая обычно инкапсулирует операционную систему, я создал переменную ОС.

if(UNIX AND NOT APPLE)
    set(LINUX TRUE)
    set(PROJECT_OS LINUX)
elseif(APPLE)
    set(PROJECT_OS APPLE)
elseif(WIN32)
    set(PROJECT_OS WIN32)
endif()

И затем я создаю выражение генератора

target_link_libraries(xxx INTERFACE
    $<$<BOOL:$<PROJECT_OS:LINUX>>: ...> 
    $<$<BOOL:$<PROJECT_OS:WIN32>>: ...>
    ...)

Но теперь я уже создал переменную, и если бы я передавал одинаковые аргументы каждой цели (xxx, yyy, zzz) Я бы повторил одно и то же несколько раз.

Единственный способ решить эту проблему - использовать переменную, но современные рекомендации CMAKE, по-видимому, говорят, что мы должны держаться подальше от переменных (пример A , B и C ), как я могу выполнить эту задачу без них?

1 Ответ

0 голосов
/ 01 октября 2018

Переменные сами по себе не являются злом.У них есть две основные потенциальные проблемы:

  • Они представляют глобальное состояние, которое может стать кошмаром обслуживания.
  • Они могут привести к не полностью экспортированному проекту CMake, создающему проблемы для всехкому нужно зависеть от вашего проекта в их системе CMake.

Создание глобальных переменных проекта для более тонкого различия между ОС достаточно просто, чтобы не было таких проблем.Помещение аргументов зависимых от ОС ссылок в переменные кажется вонючим с точки зрения обслуживания.Я бы оставил переменные ОС и поместил зависимые от ОС ссылки в функцию, например:

...
function(set_os_dependent_dependencies target_name)
    if (LINUX)
        target_link_libraries(${target_name} ...)
    elseif(WIN32)
        target_link_libraries(${target_name} ...)
    endif()
endfunction()

add_library(xxx STATIC)
set_os_dependent_dependencies(xxx)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...