Как определить поддержку C ++ 11 -... компилятора с CMake и реагировать без сбоев генерации - PullRequest
0 голосов
/ 04 февраля 2019

Я прочитал этот вопрос: Как определить поддержку C ++ 11 в CMake .Это в основном говорит мне, что поддержка CMake для обнаружения функций C ++ очень сложна, когда вы хотите сгенерировать неудачу, если определенный компилятор НЕ поддерживает функцию, которую вы используете в своем коде, но также крайне ограничены, когда вы хотите реагировать на это во время генерации безсбой.

То, что я хотел бы сделать, это не потерпеть неудачу, а, например, определить другой набор исходных файлов, если определенные функции недоступны, чтобы позволить компиляцию старого кода C ++ 03, еслинеобходимо и использовать более новые c ++ 11 -... те, если это возможно.Что-то вроде этого было бы замечательно:

set(TARGET MyTarget)
if(CPP_STANDARD_VERSION GREATER_EQUAL 11)
    set(SOURCE myModernFile.cpp)
else()
    set(SOURCE myLegacyFile.cpp)
endif()
add_executable(${TARGET} ${SOURCE })
if(CPP_STANDARD_VERSION GREATER_EQUAL 11)
    # Here failing would be fine if lambdas are not supported!
    target_compile_features(${TARGET} PRIVATE cxx_lambdas)
endif()

При следовании этому подходу, как рекомендуется в связанном вопросе:

foreach(i ${CMAKE_CXX_COMPILE_FEATURES})
  message("${i}")
endforeach()

например, с Visual Studio 2013 с CMake 3.13.2 я получаюследующий вывод:

cxx_std_98
cxx_std_11
cxx_std_14
cxx_std_17
cxx_std_20
cxx_alias_templates
cxx_auto_type
cxx_contextual_conversions
cxx_decltype
cxx_default_function_template_args
cxx_defaulted_functions
cxx_delegating_constructors
cxx_enum_forward_declarations
cxx_explicit_conversions
cxx_extended_friend_declarations
cxx_extern_templates
cxx_final
cxx_generalized_initializers
cxx_lambdas
cxx_local_type_template_args
cxx_long_long_type
cxx_nullptr
cxx_override
cxx_range_for
cxx_raw_string_literals
cxx_right_angle_brackets
cxx_rvalue_references
cxx_static_assert
cxx_strong_enums
cxx_template_template_parameters
cxx_trailing_return_types
cxx_uniform_initialization
cxx_variadic_macros
cxx_variadic_templates

Для меня список имеет смысл для конкретных функций, но общие с поддерживаемыми стандартами C ++, очевидно, не могут быть правильными, поскольку VS 2013 не поддерживает C ++ 20.Я что-то упустил?

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

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