648db22b |
1 | include(CheckCXXCompilerFlag) |
2 | include(CheckCCompilerFlag) |
3 | # VERSION_GREATER_EQUAL requires CMake 3.7 or later. |
4 | # https://cmake.org/cmake/help/latest/command/if.html#version-greater-equal |
5 | if (CMAKE_VERSION VERSION_LESS 3.18) |
6 | set(ZSTD_HAVE_CHECK_LINKER_FLAG false) |
7 | else () |
8 | set(ZSTD_HAVE_CHECK_LINKER_FLAG true) |
9 | endif () |
10 | if (ZSTD_HAVE_CHECK_LINKER_FLAG) |
11 | include(CheckLinkerFlag) |
12 | endif() |
13 | |
14 | function(EnableCompilerFlag _flag _C _CXX _LD) |
15 | string(REGEX REPLACE "\\+" "PLUS" varname "${_flag}") |
16 | string(REGEX REPLACE "[^A-Za-z0-9]+" "_" varname "${varname}") |
17 | string(REGEX REPLACE "^_+" "" varname "${varname}") |
18 | string(TOUPPER "${varname}" varname) |
19 | if (_C) |
20 | CHECK_C_COMPILER_FLAG(${_flag} C_FLAG_${varname}) |
21 | if (C_FLAG_${varname}) |
22 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_flag}" PARENT_SCOPE) |
23 | endif () |
24 | endif () |
25 | if (_CXX) |
26 | CHECK_CXX_COMPILER_FLAG(${_flag} CXX_FLAG_${varname}) |
27 | if (CXX_FLAG_${varname}) |
28 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flag}" PARENT_SCOPE) |
29 | endif () |
30 | endif () |
31 | if (_LD) |
32 | # We never add a linker flag with CMake < 3.18. We will |
33 | # implement CHECK_LINKER_FLAG() like feature for CMake < 3.18 |
34 | # or require CMake >= 3.18 when we need to add a required |
35 | # linker flag in future. |
36 | # |
37 | # We also skip linker flags check for MSVC compilers (which includes |
38 | # clang-cl) since currently check_linker_flag() doesn't give correct |
39 | # results for this configuration, |
40 | # see: https://gitlab.kitware.com/cmake/cmake/-/issues/22023 |
41 | if (ZSTD_HAVE_CHECK_LINKER_FLAG AND NOT MSVC) |
42 | CHECK_LINKER_FLAG(C ${_flag} LD_FLAG_${varname}) |
43 | else () |
44 | set(LD_FLAG_${varname} false) |
45 | endif () |
46 | if (LD_FLAG_${varname}) |
47 | set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_flag}" PARENT_SCOPE) |
48 | set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${_flag}" PARENT_SCOPE) |
49 | endif () |
50 | endif () |
51 | endfunction() |
52 | |
53 | macro(ADD_ZSTD_COMPILATION_FLAGS) |
54 | if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" OR MINGW) #Not only UNIX but also WIN32 for MinGW |
55 | # It's possible to select the exact standard used for compilation. |
56 | # It's not necessary, but can be employed for specific purposes. |
57 | # Note that zstd source code is compatible with both C++98 and above |
58 | # and C-gnu90 (c90 + long long + variadic macros ) and above |
59 | # EnableCompilerFlag("-std=c++11" false true) # Set C++ compilation to c++11 standard |
60 | # EnableCompilerFlag("-std=c99" true false) # Set C compiation to c99 standard |
61 | if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND MSVC) |
62 | # clang-cl normally maps -Wall to -Weverything. |
63 | EnableCompilerFlag("/clang:-Wall" true true false) |
64 | else () |
65 | EnableCompilerFlag("-Wall" true true false) |
66 | endif () |
67 | EnableCompilerFlag("-Wextra" true true false) |
68 | EnableCompilerFlag("-Wundef" true true false) |
69 | EnableCompilerFlag("-Wshadow" true true false) |
70 | EnableCompilerFlag("-Wcast-align" true true false) |
71 | EnableCompilerFlag("-Wcast-qual" true true false) |
72 | EnableCompilerFlag("-Wstrict-prototypes" true false false) |
73 | # Enable asserts in Debug mode |
74 | if (CMAKE_BUILD_TYPE MATCHES "Debug") |
75 | EnableCompilerFlag("-DDEBUGLEVEL=1" true true false) |
76 | endif () |
77 | # Add noexecstack flags |
78 | # LDFLAGS |
79 | EnableCompilerFlag("-z noexecstack" false false true) |
80 | # CFLAGS & CXXFLAGS |
81 | EnableCompilerFlag("-Qunused-arguments" true true false) |
82 | EnableCompilerFlag("-Wa,--noexecstack" true true false) |
83 | elseif (MSVC) # Add specific compilation flags for Windows Visual |
84 | |
85 | set(ACTIVATE_MULTITHREADED_COMPILATION "ON" CACHE BOOL "activate multi-threaded compilation (/MP flag)") |
86 | if (CMAKE_GENERATOR MATCHES "Visual Studio" AND ACTIVATE_MULTITHREADED_COMPILATION) |
87 | EnableCompilerFlag("/MP" true true false) |
88 | endif () |
89 | |
90 | # UNICODE SUPPORT |
91 | EnableCompilerFlag("/D_UNICODE" true true false) |
92 | EnableCompilerFlag("/DUNICODE" true true false) |
93 | # Enable asserts in Debug mode |
94 | if (CMAKE_BUILD_TYPE MATCHES "Debug") |
95 | EnableCompilerFlag("/DDEBUGLEVEL=1" true true false) |
96 | endif () |
97 | endif () |
98 | |
99 | # Remove duplicates compilation flags |
100 | foreach (flag_var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE |
101 | CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO |
102 | CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE |
103 | CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) |
104 | if( ${flag_var} ) |
105 | separate_arguments(${flag_var}) |
106 | string(REPLACE ";" " " ${flag_var} "${${flag_var}}") |
107 | endif() |
108 | endforeach () |
109 | |
110 | if (MSVC AND ZSTD_USE_STATIC_RUNTIME) |
111 | foreach (flag_var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE |
112 | CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO |
113 | CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE |
114 | CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) |
115 | if ( ${flag_var} ) |
116 | string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") |
117 | endif() |
118 | endforeach () |
119 | endif () |
120 | |
121 | endmacro() |