Включать исходные файлы для каждой конфигурации в CMake

#cmake

#cmake

Вопрос:

В моем конкретном проекте CMake у меня есть три файла CPP:

 a.cpp
b.cpp
c.cpp
  

Я хочу ‘a.cpp ‘ должен быть скомпилирован во всех конфигурациях (release amp; debug).
Я только хочу ‘b.cpp ‘ должен быть скомпилирован в конфигурации ОТЛАДКИ.
Я только хочу ‘c.cpp ‘ должен быть скомпилирован в конфигурации ВЫПУСКА.

Как я могу это сделать? Мне нужно что-то похожее на debug optimized ключевые слова and, которые принимаются target_link_libraries() операцией CMake.

Ответ №1:

Насколько я знаю, cmake не предоставляет способа исключить некоторые файлы на основе конфигурации. Поэтому вам нужен обходной путь для достижения такого поведения.

Например, вы можете обернуть все содержимое b.cpp и c.cpp с помощью некоторого защитного макроса:

 #ifdef BUILD_ME
//original content of your file
#endif
  

и затем установите определения компилятора, зависящие от конфигурации, в cmake:

 if (${CMAKE_GENERATOR} MATCHES "Make" AND "${CMAKE_BUILD_TYPE}" STREQUAL "")
    # This block might be needed because CMAKE_BUILD_TYPE is usually
    # undefined for makefiles.
    # And COMPILE_DEFINITIONS_RELEASE are not chosen by default.
    set(CMAKE_BUILD_TYPE RELEASE)
endif()

set_source_files_properties(b.cpp PROPERTIES COMPILE_DEFINITIONS_DEBUG BUILD_ME )
set_source_files_properties(c.cpp PROPERTIES COMPILE_DEFINITIONS_RELEASE BUILD_ME )
add_executable(target_name a.cpp b.cpp c.cpp)
  

Ответ №2:

Эта проблема была исправлена с 3.17: https://cmake.org/cmake/help/latest/release/3.17.html#generators

«Генераторы Visual Studio научились поддерживать исходные файлы для каждой конфигурации. Ранее их поддерживали только генераторы инструментов сборки командной строки «.