darktable/cmake/compiler-versions.cmake

128 lines
5.7 KiB
CMake

# NOTE: copy of src/external/rawspeed/cmake/compiler-versions.cmake
# We strive to keep the [darktable] software releases (but not necessarily
# development versions!) buildable with the versions of the dependencies
# provided out-of-the-box in the following distributions:
# * debian stable
# * latest(!) ubuntu LTS
# * oldest(*) maintained macOS release (assuming current cadence of
# one major macOS release per year, and 3 (three) year shelf-life,
# so last three releases are to be supported)
#
# Compiler-wise, that means that we support three compiler families:
# * GCC, with the required version being the newest one that is available
# in *both* the debian stable *and* the latest ubuntu LTS
# * Xcode, with the required version being the newest one that is available
# for the oldest supported macOS release
# * LLVM, with the required version being the oldest one between
# * the Xcode's underlying LLVM version
# * and the newest one that is available in *both* the
# debian stable *and* the latest ubuntu LTS
#
# As of the time of writing (2024-02-14), the next (summer) darktable release
# will happen in 2024-06 ish. By that time:
# * debian 12 (Bookworm) is the newest debian stable,
# coming with gcc-12 and LLVM16
# * Ubuntu 24.04 LTS (Noble Numbat) will have been released,
# coming with gcc-14 and LLVM18
# * macOS 13 (Ventura) be the oldest supported macOS version,
# with the newest supported Xcode version being 15.2 (LLVM16-based !)
#
# Therefore, we currently require GCC12, macOS 13.5 + Xcode 15.2, and LLVM16.
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 12)
message(SEND_ERROR "GNU C compiler version ${CMAKE_C_COMPILER_VERSION} is too old and is unsupported. Version 12+ is required.")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12)
message(SEND_ERROR "GNU C++ compiler version ${CMAKE_CXX_COMPILER_VERSION} is too old and is unsupported. Version 12+ is required.")
endif()
if(NOT TEMPORAIRLY_ALLOW_OLD_TOOCHAIN)
unset(FAILURE)
if(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 16)
set(FAILURE ON)
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16)
set(FAILURE ON)
endif()
if(FAILURE)
message(SEND_ERROR "LLVM Clang compiler version ${CMAKE_C_COMPILER_VERSION} is too old and is about to become unsupported. Version 16+ is to be required.")
message(SEND_ERROR "If you are seeing this message, please complain before March 4'th on https://github.com/darktable-org/darktable/pull/16374 and this will be temporarily reverted (but will be reinstated after Ubuntu 24.04 has been released, on April 25'th)")
endif()
else()
if(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 15)
message(SEND_ERROR "LLVM Clang C compiler version ${CMAKE_C_COMPILER_VERSION} is too old and is unsupported. Version 15+ is required.")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15)
message(SEND_ERROR "LLVM Clang C++ compiler version ${CMAKE_CXX_COMPILER_VERSION} is too old and is unsupported. Version 15+ is required.")
endif()
endif()
# XCode 15.2 (apple clang 15.0.0.15000100) is based on LLVM16
if(CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 15.0.0.15000100)
message(SEND_ERROR "XCode (Apple clang) C compiler version ${CMAKE_C_COMPILER_VERSION} is too old and is unsupported. XCode version 15.2+ is required.")
endif()
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0.0.15000100)
message(SEND_ERROR "XCode (Apple clang) C++ compiler version ${CMAKE_CXX_COMPILER_VERSION} is too old and is unsupported. XCode version 15.2+ is required.")
endif()
if(CMAKE_OSX_DEPLOYMENT_TARGET AND CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS 13.5)
message(SEND_ERROR "Targeting OSX version ${CMAKE_OSX_DEPLOYMENT_TARGET} older than 13.5 is unsupported.")
endif()
include(CheckCXXSourceCompiles)
if(NOT DEFINED RAWSPEED_LIBSTDCXX_MIN)
set(LIBSTDCXX_MIN 12)
message(STATUS "Performing libstdc++ version check")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libstdcxx_version_check.cpp"
"#include <version>
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#if defined(__GLIBCXX__)
#if !defined(_GLIBCXX_RELEASE) || _GLIBCXX_RELEASE < ${LIBSTDCXX_MIN}
#pragma message(\"Unsupported libstdc++ version: \" STR(_GLIBCXX_RELEASE))
#error
#endif
#endif
int main() { return 0; }
")
try_compile(RAWSPEED_LIBSTDCXX_MIN
"${CMAKE_CURRENT_BINARY_DIR}/libstdcxx_version_check"
"${CMAKE_CURRENT_BINARY_DIR}/libstdcxx_version_check.cpp"
OUTPUT_VARIABLE MSG)
if(NOT RAWSPEED_LIBSTDCXX_MIN)
message(SEND_ERROR ${MSG})
else()
message(STATUS "Performing libstdc++ version check - Success")
endif()
endif()
if(NOT DEFINED RAWSPEED_LIBCXX_MIN)
if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
set(LIBCXX_MIN 160000)
else()
set(LIBCXX_MIN 16000)
endif()
message(STATUS "Performing libc++ version check")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/libcpp_version_check.cpp"
"#include <version>
#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)
#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < ${LIBCXX_MIN}
#pragma message(\"Unsupported libc++ version: \" STR(_LIBCPP_VERSION))
#error
#endif
int main() { return 0; }
")
try_compile(RAWSPEED_LIBCXX_MIN
"${CMAKE_CURRENT_BINARY_DIR}/libcpp_version_check"
"${CMAKE_CURRENT_BINARY_DIR}/libcpp_version_check.cpp"
OUTPUT_VARIABLE MSG)
if(NOT RAWSPEED_LIBCXX_MIN)
message(SEND_ERROR ${MSG})
else()
message(STATUS "Performing libc++ version check - Success")
endif()
endif()