Я выполняю рефакторинг файла 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 ), как я могу выполнить эту задачу без них?