Подтвердить что ты не робот

Как применять различные компиляторы для разных компиляторов в cmake?

В настоящее время я работаю над использованием cmake для создания некоторых проектов, основными платформами которых являются Visual С++, 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. Пока что я не могу найти подходящую переменную для тестирования или любое другое очевидное решение.

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

4b9b3361

Ответ 1

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

Вместо того, чтобы тестировать "если 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()

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