1include(CheckCXXCompilerFlag) 2include(CheckCCompilerFlag) 3# VERSION_GREATER_EQUAL requires CMake 3.7 or later. 4# https://cmake.org/cmake/help/latest/command/if.html#version-greater-equal 5if (CMAKE_VERSION VERSION_LESS 3.18) 6 set(ZSTD_HAVE_CHECK_LINKER_FLAG false) 7else () 8 set(ZSTD_HAVE_CHECK_LINKER_FLAG true) 9endif () 10if (ZSTD_HAVE_CHECK_LINKER_FLAG) 11 include(CheckLinkerFlag) 12endif() 13 14function(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 () 51endfunction() 52 53macro(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 121endmacro() 122