Skip to content

Commit 292e6de

Browse files
committed
Setup and validate compiler versions
1 parent 1784467 commit 292e6de

File tree

3 files changed

+77
-22
lines changed

3 files changed

+77
-22
lines changed

CMakeLists.txt

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
cmake_minimum_required(VERSION 3.23)
22

3+
# Toolchain setup must come before the first project() call in the entire CMake buildsystem.
4+
# If ystdlib is not the top-level project, the following setup has no effect.
5+
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/Toolchains/utils.cmake")
6+
setup_toolchains()
7+
38
project(ystdlib VERSION "0.1.0" LANGUAGES CXX)
49

10+
validate_compiler_versions()
11+
512
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
613
include(CMakePackageConfigHelpers)
714
include(GNUInstallDirs)
@@ -10,28 +17,6 @@ include(ystdlib-helpers)
1017
option(BUILD_SHARED_LIBS "Build using shared libraries." OFF)
1118
option(ystdlib_BUILD_TESTING "Build the testing tree for ystdlib." ON)
1219

13-
# Require compiler versions that support the C++17 features necessary for compiling ystdlib
14-
# See also: https://en.cppreference.com/w/cpp/compiler_support/17
15-
if("AppleClang" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
16-
set(ystdlib_CMAKE_CXX_COMPILER_MIN_VERSION "15")
17-
elseif("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
18-
set(ystdlib_CMAKE_CXX_COMPILER_MIN_VERSION "15")
19-
elseif("GNU" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
20-
set(ystdlib_CMAKE_CXX_COMPILER_MIN_VERSION "11")
21-
else()
22-
message(
23-
FATAL_ERROR
24-
"Unsupported compiler: ${CMAKE_CXX_COMPILER_ID}. Please use AppleClang, Clang, or GNU."
25-
)
26-
endif()
27-
if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "${ystdlib_CMAKE_CXX_COMPILER_MIN_VERSION}")
28-
message(
29-
FATAL_ERROR
30-
"${CMAKE_CXX_COMPILER_ID} version ${CMAKE_CXX_COMPILER_VERSION} is too low. Must be at \
31-
least ${ystdlib_CMAKE_CXX_COMPILER_MIN_VERSION}."
32-
)
33-
endif()
34-
3520
set(CMAKE_EXPORT_COMPILE_COMMANDS
3621
ON
3722
CACHE BOOL
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
message(STATUS "Setting up LLVM v15 toolchain...")
2+
3+
execute_process(
4+
COMMAND
5+
"brew" "--prefix" "llvm@15"
6+
RESULT_VARIABLE BREW_RESULT
7+
OUTPUT_VARIABLE LLVM_TOOLCHAIN_PREFIX
8+
OUTPUT_STRIP_TRAILING_WHITESPACE
9+
)
10+
if(NOT 0 EQUAL BREW_RESULT)
11+
message(
12+
FATAL_ERROR
13+
"Failed to locate LLVM v15 using Homebrew. Please ensure llvm@15 is installed: 'brew \
14+
install llvm@15'"
15+
)
16+
endif()
17+
18+
set(CMAKE_C_COMPILER "${LLVM_TOOLCHAIN_PREFIX}/bin/clang")
19+
set(CMAKE_CXX_COMPILER "${LLVM_TOOLCHAIN_PREFIX}/bin/clang++")
20+
set(CMAKE_AR "${LLVM_TOOLCHAIN_PREFIX}/bin/llvm-ar")
21+
set(CMAKE_RANLIB "${LLVM_TOOLCHAIN_PREFIX}/bin/llvm-ranlib")

cmake/Toolchains/utils.cmake

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# This file contains utility functions for setting up toolchains and validating toolchain versions
2+
# to ensure compatibility with the C++20 features required by the project.
3+
4+
# Sets up the appropriate toolchain file based on the host system.
5+
function(setup_toolchains)
6+
# For macOS versions below 15, use the LLVM 15 Clang toolchain.
7+
if("Darwin" STREQUAL "${CMAKE_HOST_SYSTEM_NAME}")
8+
execute_process(
9+
COMMAND
10+
"sw_vers" "--productVersion"
11+
OUTPUT_VARIABLE MACOS_VERSION
12+
OUTPUT_STRIP_TRAILING_WHITESPACE
13+
)
14+
if("${MACOS_VERSION}" VERSION_LESS "15")
15+
set(CMAKE_TOOLCHAIN_FILE
16+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Toolchains/llvm-clang-15-toolchain.cmake"
17+
CACHE STRING
18+
"Toolchain file"
19+
)
20+
endif()
21+
endif()
22+
endfunction()
23+
24+
# Checks if the compiler ID and version meet the minimum requirements to support C++20 features
25+
# required by the project:
26+
# - AppleClang: version 15+
27+
# - Clang: version 15+
28+
# - GNU: version 11+
29+
function(validate_compiler_versions)
30+
if("AppleClang" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
31+
set(CXX_COMPILER_MIN_VERSION "15")
32+
elseif("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
33+
set(CXX_COMPILER_MIN_VERSION "15")
34+
elseif("GNU" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
35+
set(CXX_COMPILER_MIN_VERSION "11")
36+
else()
37+
message(
38+
FATAL_ERROR
39+
"Unsupported compiler: ${CMAKE_CXX_COMPILER_ID}. Please use AppleClang, Clang, or GNU."
40+
)
41+
endif()
42+
if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "${CXX_COMPILER_MIN_VERSION}")
43+
message(
44+
FATAL_ERROR
45+
"${CMAKE_CXX_COMPILER_ID} version ${CMAKE_CXX_COMPILER_VERSION} is too low. Must be at \
46+
least ${CXX_COMPILER_MIN_VERSION}."
47+
)
48+
endif()
49+
endfunction()

0 commit comments

Comments
 (0)