Skip to content

Commit 8505a53

Browse files
committed
fix: add is_clang utility
1 parent 9ba4921 commit 8505a53

File tree

4 files changed

+85
-22
lines changed

4 files changed

+85
-22
lines changed

src/Clang.cmake

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
include_guard()
2+
3+
set(ProjectOptions_SRC_DIR "${CMAKE_CURRENT_LIST_DIR}")
4+
5+
# detect clang
6+
function(is_clang value)
7+
if(clang
8+
OR ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
9+
OR ("${DETECTED_CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND "${DETECTED_CMAKE_C_COMPILER_ID}"
10+
STREQUAL "Clang")
11+
)
12+
set(${value} ON PARENT_SCOPE)
13+
return()
14+
endif()
15+
16+
# if the compiler is unknown by CMake
17+
if(NOT CMAKE_CXX_COMPILER
18+
AND NOT CMAKE_C_COMPILER
19+
AND NOT CMAKE_CXX_COMPILER_ID
20+
AND NOT CMAKE_C_COMPILER_ID
21+
)
22+
23+
# if clang is inferred by cmake later
24+
include("${ProjectOptions_SRC_DIR}/DetectCompiler.cmake")
25+
detect_compiler()
26+
27+
if((DETECTED_CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND DETECTED_CMAKE_C_COMPILER_ID STREQUAL
28+
"Clang")
29+
)
30+
set(${value} ON PARENT_SCOPE)
31+
return()
32+
endif()
33+
34+
endif()
35+
36+
set(${value} OFF PARENT_SCOPE)
37+
endfunction()
38+
39+
# configure clang toolchain for vcpkg
40+
macro(configure_clang_vcpkg)
41+
if(WIN32)
42+
is_clang(_is_clang)
43+
if(${_is_clang})
44+
# Disable /utf-8 flag in the vcpkg toolchain file
45+
# https://github.com/microsoft/vcpkg/blob/e590c2b30c08caf1dd8d612ec602a003f9784b7d/scripts/toolchains/windows.cmake#L68
46+
message(STATUS "Disabling /utf-8 flag in the vcpkg toolchain file for Clang")
47+
set(VCPKG_SET_CHARSET_FLAG "OFF" CACHE STRING "Vcpkg set charset flag" FORCE)
48+
endif()
49+
endif()
50+
endmacro()

src/DetectCompiler.cmake

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,41 @@ set(ProjectOptions_SRC_DIR "${CMAKE_CURRENT_LIST_DIR}")
55
# includes a separate CMakeLists.txt file to detect the CXX/C compilers before project is called
66
# Using a separate file ensures that the current scope is not contaminated by the variable
77
macro(detect_compiler)
8-
find_program(CMAKE_EXECUTABLE cmake)
9-
execute_process(
10-
COMMAND
11-
"${CMAKE_EXECUTABLE}" -S "${ProjectOptions_SRC_DIR}/detect_compiler" -B
12-
"${CMAKE_CURRENT_BINARY_DIR}/detect_compiler" -G "${CMAKE_GENERATOR}" "--log-level=ERROR"
13-
"-Wno-dev"
14-
OUTPUT_QUIET
8+
if(NOT
9+
(DETECTED_CMAKE_CXX_COMPILER
10+
AND DETECTED_CMAKE_C_COMPILER
11+
AND DETECTED_CMAKE_CXX_COMPILER_ID
12+
AND DETECTED_CMAKE_C_COMPILER_ID
13+
AND DETECTED_CMAKE_SYSTEM_PROCESSOR
14+
AND DETECTED_CMAKE_HOST_SYSTEM_PROCESSOR)
1515
)
1616

17-
# parse the detected compilers from the cache
18-
set(cache_variables
19-
CMAKE_CXX_COMPILER
20-
CMAKE_CXX_COMPILER_ID
21-
CMAKE_C_COMPILER
22-
CMAKE_C_COMPILER_ID
23-
CMAKE_SYSTEM_PROCESSOR
24-
CMAKE_HOST_SYSTEM_PROCESSOR
25-
)
26-
foreach(cache_var ${cache_variables})
27-
file(STRINGS "${CMAKE_CURRENT_BINARY_DIR}/detect_compiler/CMakeCache.txt"
28-
"DETECTED_${cache_var}" REGEX "^${cache_var}:STRING=(.*)$"
17+
find_program(CMAKE_EXECUTABLE cmake)
18+
execute_process(
19+
COMMAND
20+
"${CMAKE_EXECUTABLE}" -S "${ProjectOptions_SRC_DIR}/detect_compiler" -B
21+
"${CMAKE_CURRENT_BINARY_DIR}/detect_compiler" -G "${CMAKE_GENERATOR}" "--log-level=ERROR"
22+
"-Wno-dev"
23+
OUTPUT_QUIET
2924
)
30-
string(REGEX REPLACE "^${cache_var}:STRING=(.*)$" "\\1" "DETECTED_${cache_var}"
31-
"${DETECTED_${cache_var}}"
25+
26+
# parse the detected compilers from the cache
27+
set(cache_variables
28+
CMAKE_CXX_COMPILER
29+
CMAKE_CXX_COMPILER_ID
30+
CMAKE_C_COMPILER
31+
CMAKE_C_COMPILER_ID
32+
CMAKE_SYSTEM_PROCESSOR
33+
CMAKE_HOST_SYSTEM_PROCESSOR
3234
)
33-
endforeach()
35+
foreach(cache_var ${cache_variables})
36+
file(STRINGS "${CMAKE_CURRENT_BINARY_DIR}/detect_compiler/CMakeCache.txt"
37+
"DETECTED_${cache_var}" REGEX "^${cache_var}:STRING=(.*)$"
38+
)
39+
string(REGEX REPLACE "^${cache_var}:STRING=(.*)$" "\\1" "DETECTED_${cache_var}"
40+
"${DETECTED_${cache_var}}"
41+
)
42+
endforeach()
43+
44+
endif()
3445
endmacro()

src/Index.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ include("${ProjectOptions_SRC_DIR}/Doxygen.cmake")
3838
include("${ProjectOptions_SRC_DIR}/StaticAnalyzers.cmake")
3939
include("${ProjectOptions_SRC_DIR}/VCEnvironment.cmake")
4040
include("${ProjectOptions_SRC_DIR}/MinGW.cmake")
41+
include("${ProjectOptions_SRC_DIR}/Clang.cmake")
4142
include("${ProjectOptions_SRC_DIR}/DetectCompiler.cmake")
4243
include("${ProjectOptions_SRC_DIR}/CrossCompiler.cmake")
4344
include("${ProjectOptions_SRC_DIR}/DynamicProjectOptions.cmake")

src/Vcpkg.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ macro(run_vcpkg)
232232
_checkout_vcpkg_repository()
233233

234234
configure_mingw_vcpkg()
235+
# configure_clang_vcpkg()
235236

236237
# add the vcpkg toolchain
237238
_add_vcpkg_toolchain()

0 commit comments

Comments
 (0)