@@ -22,9 +22,13 @@ function(EnableCompilerFlag _flag _C _CXX _LD)
22
22
endif ()
23
23
endif ()
24
24
if (_CXX )
25
- CHECK_CXX_COMPILER_FLAG (${_flag} CXX_FLAG_${varname} )
26
- if (CXX_FLAG_${varname} )
27
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flag} " PARENT_SCOPE )
25
+ # Only check CXX flags if CXX language is enabled
26
+ get_property (languages GLOBAL PROPERTY ENABLED_LANGUAGES )
27
+ if ("CXX" IN_LIST languages )
28
+ CHECK_CXX_COMPILER_FLAG (${_flag} CXX_FLAG_${varname} )
29
+ if (CXX_FLAG_${varname} )
30
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flag} " PARENT_SCOPE )
31
+ endif ()
28
32
endif ()
29
33
endif ()
30
34
if (_LD )
@@ -54,19 +58,24 @@ macro(ADD_ZSTD_COMPILATION_FLAGS _C _CXX _LD)
54
58
# compiler flags to mark the stack as non-executable.
55
59
set (ZSTD_HAS_NOEXECSTACK false )
56
60
57
- if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" OR MINGW ) #Not only UNIX but also WIN32 for MinGW
61
+ # Detect clang-cl: it identifies as Clang but should be treated as MSVC
62
+ # Use C compiler info since CXX might not be enabled yet
63
+ set (CLANG_CL_DETECTED FALSE )
64
+ if (CMAKE_C_COMPILER_ID MATCHES "Clang" AND (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC" ))
65
+ set (CLANG_CL_DETECTED TRUE )
66
+ message (STATUS "Detected clang-cl compiler - using MSVC-compatible flags" )
67
+ endif ()
68
+
69
+ # Handle GNU/Clang compilers (but not clang-cl which is handled in MSVC section)
70
+ # Use C compiler ID since CXX might not be enabled yet
71
+ if ((CMAKE_C_COMPILER_ID MATCHES "GNU|Clang" OR MINGW ) AND NOT CLANG_CL_DETECTED )
58
72
# It's possible to select the exact standard used for compilation.
59
73
# It's not necessary, but can be employed for specific purposes.
60
74
# Note that zstd source code is compatible with both C++98 and above
61
75
# and C-gnu90 (c90 + long long + variadic macros ) and above
62
76
# EnableCompilerFlag("-std=c++11" false true) # Set C++ compilation to c++11 standard
63
77
# EnableCompilerFlag("-std=c99" true false) # Set C compilation to c99 standard
64
- if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND MSVC )
65
- # clang-cl normally maps -Wall to -Weverything.
66
- EnableCompilerFlag ("/clang:-Wall" _C _CXX false )
67
- else ()
68
- EnableCompilerFlag ("-Wall" _C _CXX false )
69
- endif ()
78
+ EnableCompilerFlag ("-Wall" _C _CXX false )
70
79
EnableCompilerFlag ("-Wextra" _C _CXX false )
71
80
EnableCompilerFlag ("-Wundef" _C _CXX false )
72
81
EnableCompilerFlag ("-Wshadow" _C _CXX false )
@@ -95,16 +104,26 @@ macro(ADD_ZSTD_COMPILATION_FLAGS _C _CXX _LD)
95
104
endif ()
96
105
endif ()
97
106
endif ()
98
- elseif (MSVC ) # Add specific compilation flags for Windows Visual
107
+ endif ()
108
+
109
+ if (MSVC OR CLANG_CL_DETECTED ) # Add specific compilation flags for Windows Visual (including clang-cl)
99
110
100
111
set (ACTIVATE_MULTITHREADED_COMPILATION "ON" CACHE BOOL "activate multi-threaded compilation (/MP flag)" )
101
112
if (CMAKE_GENERATOR MATCHES "Visual Studio" AND ACTIVATE_MULTITHREADED_COMPILATION )
102
113
EnableCompilerFlag ("/MP" _C _CXX false )
103
114
endif ()
104
115
105
- # UNICODE SUPPORT
106
- EnableCompilerFlag ("/D_UNICODE" _C _CXX false )
107
- EnableCompilerFlag ("/DUNICODE" _C _CXX false )
116
+ # For clang-cl, use clang-specific warning flags with MSVC syntax
117
+ if (CLANG_CL_DETECTED )
118
+ EnableCompilerFlag ("/clang:-Wall" _C _CXX false )
119
+ EnableCompilerFlag ("/clang:-Wextra" _C _CXX false )
120
+ # Don't set UNICODE flags for clang-cl as they cause RC issues
121
+ else ()
122
+ # UNICODE SUPPORT (only for regular MSVC, not clang-cl)
123
+ EnableCompilerFlag ("/D_UNICODE" _C _CXX false )
124
+ EnableCompilerFlag ("/DUNICODE" _C _CXX false )
125
+ endif ()
126
+
108
127
# Enable asserts in Debug mode
109
128
if (CMAKE_BUILD_TYPE MATCHES "Debug" )
110
129
EnableCompilerFlag ("/DDEBUGLEVEL=1" _C _CXX false )
0 commit comments