CMAKE__STANDARD_LATEST
Новое в версии 3.30.
Эта переменная представляет собой минимальное значение между последней версией стандарта языка <LANG>, поддерживаемой текущим компилятором, и последней версией, поддерживаемой CMake. Её значение будет установлено на одно из поддерживаемых значений соответствующего свойства целевого объекта <LANG>_STANDARD; список поддерживаемых языков см. в документации этого свойства.
См. руководство cmake-compile-features(7) для информации о функциях компиляции и списке поддерживаемых компиляторов.
Примечание
CMAKE_<LANG>_STANDARD_LATEST никогда не будет установлено на стандарт языка, который CMake распознаёт, но не поддерживает. Если не указано иное, каждое поддерживаемое значение соответствующего свойства целевого объекта <LANG>_STANDARD представляет собой стандарт языка <LANG>, который одновременно распознаётся и поддерживается CMake.
Проверка поддержки стандарта языка
Можно использовать значение переменной CMAKE_<LANG>_STANDARD_LATEST для проверки поддержки стандарта языка. Это может пригодиться, например, для условной активации дополнительных функций для распределённой библиотеки.
При этом следует быть осторожным и не полагаться на сравнение целочисленных значений уровней стандарта. Это связано с тем, что некоторые более старые стандарты данного языка, поддерживаемые CMake (например, C++98, представленный как 98), будут иметь более высокое числовое значение, чем более новые стандарты того же языка.
Следующий фрагмент кода демонстрирует, как правильно проверить поддержку C++17:
# Careful! We cannot do direct integer comparisons with
# CMAKE_CXX_STANDARD_LATEST because some earlier C++ standards (e.g.,
# C++98) will have a higher numerical value than our requirement (C++17).
#
# Instead, we keep a list of unsupported C++ standards and check if
# CMAKE_CXX_STANDARD_LATEST appears in that list.
set(UNSUPPORTED_CXX_STANDARDS
98
11
14
)
list(FIND UNSUPPORTED_CXX_STANDARDS ${CMAKE_CXX_STANDARD_LATEST} UNSUPPORTED_CXX_STANDARDS_INDEX)
if(UNSUPPORTED_CXX_STANDARDS_INDEX EQUAL -1)
# We know that the current compiler supports at least C++17. Enabling
# some optional feature...
else()
message(STATUS
"Feature X is disabled because it requires C++17, but the current "
"compiler only supports C++${CMAKE_CXX_STANDARD_LATEST}."
)
endif()
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.30/variable/CMAKE_LANG_STANDARD_LATEST.html