1include(CheckCXXCompilerFlag) 2include(CheckCCompilerFlag) 3 4function(EnableCompilerFlag _flag _C _CXX) 5 string(REGEX REPLACE "\\+" "PLUS" varname "${_flag}") 6 string(REGEX REPLACE "[^A-Za-z0-9]+" "_" varname "${varname}") 7 string(REGEX REPLACE "^_+" "" varname "${varname}") 8 string(TOUPPER "${varname}" varname) 9 if (_C) 10 CHECK_C_COMPILER_FLAG(${_flag} C_FLAG_${varname}) 11 if (C_FLAG_${varname}) 12 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_flag}" PARENT_SCOPE) 13 endif () 14 endif () 15 if (_CXX) 16 CHECK_CXX_COMPILER_FLAG(${_flag} CXX_FLAG_${varname}) 17 if (CXX_FLAG_${varname}) 18 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_flag}" PARENT_SCOPE) 19 endif () 20 endif () 21endfunction() 22 23macro(ADD_ZSTD_COMPILATION_FLAGS) 24 if (CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang" OR MINGW) #Not only UNIX but also WIN32 for MinGW 25 #Set c++11 by default 26 EnableCompilerFlag("-std=c++11" false true) 27 #Set c99 by default 28 EnableCompilerFlag("-std=c99" true false) 29 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND MSVC) 30 # clang-cl normally maps -Wall to -Weverything. 31 EnableCompilerFlag("/clang:-Wall" true true) 32 else () 33 EnableCompilerFlag("-Wall" true true) 34 endif () 35 EnableCompilerFlag("-Wextra" true true) 36 EnableCompilerFlag("-Wundef" true true) 37 EnableCompilerFlag("-Wshadow" true true) 38 EnableCompilerFlag("-Wcast-align" true true) 39 EnableCompilerFlag("-Wcast-qual" true true) 40 EnableCompilerFlag("-Wstrict-prototypes" true false) 41 # Enable asserts in Debug mode 42 if (CMAKE_BUILD_TYPE MATCHES "Debug") 43 EnableCompilerFlag("-DDEBUGLEVEL=1" true true) 44 endif () 45 elseif (MSVC) # Add specific compilation flags for Windows Visual 46 47 set(ACTIVATE_MULTITHREADED_COMPILATION "ON" CACHE BOOL "activate multi-threaded compilation (/MP flag)") 48 if (CMAKE_GENERATOR MATCHES "Visual Studio" AND ACTIVATE_MULTITHREADED_COMPILATION) 49 EnableCompilerFlag("/MP" true true) 50 endif () 51 52 # UNICODE SUPPORT 53 EnableCompilerFlag("/D_UNICODE" true true) 54 EnableCompilerFlag("/DUNICODE" true true) 55 # Enable asserts in Debug mode 56 if (CMAKE_BUILD_TYPE MATCHES "Debug") 57 EnableCompilerFlag("/DDEBUGLEVEL=1" true true) 58 endif () 59 endif () 60 61 # Remove duplicates compilation flags 62 foreach (flag_var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE 63 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO 64 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE 65 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 66 if( ${flag_var} ) 67 separate_arguments(${flag_var}) 68 string(REPLACE ";" " " ${flag_var} "${${flag_var}}") 69 endif() 70 endforeach () 71 72 if (MSVC AND ZSTD_USE_STATIC_RUNTIME) 73 foreach (flag_var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE 74 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO 75 CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE 76 CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) 77 if ( ${flag_var} ) 78 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}") 79 endif() 80 endforeach () 81 endif () 82 83endmacro() 84