Как применить разные параметры компилятора для разных компиляторов в cmake? - PullRequest
24 голосов
/ 28 июня 2010

В настоящее время я работаю над использованием cmake для создания некоторых проектов, основными платформами которых являются Visual C ++, MinGW GCC и Linux GCC.При сборке с GCC мне нужно указать опцию компилятора -Wno-invalid-offsetof.

Мое текущее исправление выглядит следующим образом ...

if (   "${CMAKE_GENERATOR}" MATCHES "^Visual Studio"
    OR "${CMAKE_GENERATOR}" MATCHES "^NMake"
   )
    set (CPPLIB_COMPILER_OPTS "")
else ()
    set (CPPLIB_COMPILER_OPTS "-Wno-invalid-offsetof")
endif ()

...

set_target_properties(sh_core PROPERTIES COMPILE_FLAGS "${CPPLIB_COMPILER_OPTS}")
# repeated for all targets

Это работает, но при условии, что все генераторы, кромеВизуальная студия, которую будут создавать с помощью gcc, явно небезопасна.Для начала, есть генераторы IIRC для компиляторов Borland.Что еще более важно, использование make не всегда означает использование gcc.

Другими компиляторами, которые я, вероятно, буду использовать, являются llvm-gcc и clang.К счастью, я думаю, что даже clang поддерживает gcc-совместимые опции.Но эта логика хороша только до тех пор, пока соответствующий код никогда не будет выпущен.

Cmake, кажется, проверяет доступные компиляторы и генерирует make-файл специально для этого компилятора (возникает вопрос - почему бы по крайней мере не иметь опциюсборки проекта напрямую, без необходимости посредника, такого как make?).

В таком случае я надеялся, что смогу напрямую протестировать gcc в моих файлах CMakeLists.txt.Пока, однако, я не могу найти подходящую переменную для тестирования или любое другое очевидное решение.

Возможно ли это?

1 Ответ

36 голосов
/ 28 июня 2010

Для создания переносимой системы сборки лучше не тестировать платформы, а тестировать функции.

Вместо проверки «если Windows сделает это», проверьте «работает ли флаг -Wno-invalid-offsetof, а затем используйте его». Вы можете сделать это с помощью модуля CheckCCompilerFlag, например:

include(CheckCCompilerFlag)
check_c_compiler_flag(-Wno-invalid-offsetof HAS_NO_INVALID_OFFSETOF)
if (HAS_NO_INVALID_OFFSETOF)
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-invalid-offsetof")
endif()

Для C ++ есть аналогичный CheckCXXCompilerFlag с командой check_cxx_compiler_flag(flag var).

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