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