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