git subrepo pull (merge) --force deps/libchdr
[pcsx_rearmed.git] / deps / libchdr / deps / zstd-1.5.5 / build / cmake / CMakeModules / AddZstdCompilationFlags.cmake
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()