| 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() |