Использование библиотеки "ucm" кажется хорошим подходом. Я бросил простой макрос, который помогает мне единообразно управлять флагами компоновщика в CMake для всех конфигураций, а также позволяет использовать его для конкретного компилятора. (Простая установка переменной может привести к тому, что флаги будут складываться, когда CMake настроен несколько раз.)
macro(ADD_MSVC_LINKER_FLAG flag)
if(MSVC)
if(${CMAKE_EXE_LINKER_FLAGS} MATCHES "(${flag}.*)")
# message("skipping linker flags")
else()
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE)
endif()
if(${CMAKE_SHARED_LINKER_FLAGS} MATCHES "(${flag}.*)")
# message("skipping linker flags")
else()
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE)
endif()
if(${CMAKE_STATIC_LINKER_FLAGS} MATCHES "(${flag}.*)")
# message("skipping linker flags")
else()
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE)
endif()
if(${CMAKE_MODULE_LINKER_FLAGS} MATCHES "(${flag}.*)")
# message("skipping linker flags")
else()
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${flag}" CACHE STRING "Linker Flags for Release Builds" FORCE)
endif()
endif()
endmacro()
Затем поддерживаются другие компиляторы путем создания макроса для конкретного компилятора, который проверяет, используется ли компилятор. Это затрудняет установку правильного флага на неправильный компилятор.
if(CMAKE_COMPILER_IS_GNUCXX)
и
if(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)