2 if("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
6 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
11 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
14 COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} --version COMMAND head -1
15 OUTPUT_VARIABLE _clang_version_info)
17 REGEX MATCH "(clang version|based on LLVM) ([0-9]\\.[0-9]\\.?[0-9]?)"
18 CLANG_VERSION "${_clang_version_info}")
19 # Enabled GCC/LLVM stack-smashing protection
21 if(CLANG_VERSION VERSION_GREATER 3.6 OR CLANG_VERSION VERSION_EQUAL 3.6)
22 set(LLVM_OPT "${LLVM_OPT} -fstack-protector-strong")
24 set(LLVM_OPT "${LLVM_OPT} -fstack-protector")
26 set(LLVM_OPT "${LLVM_OPT} --param=ssp-buffer-size=4 -pie -fPIC")
28 set(CMAKE_C_FLAGS_DEBUG "-g")
29 set(CMAKE_CXX_FLAGS_DEBUG "-g")
30 set(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
31 set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
32 set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
33 set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
34 set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
35 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
36 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${LLVM_OPT} -w")
37 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++11 -stdlib=libc++ -fno-gcse -fno-omit-frame-pointer -Woverloaded-virtual -Wno-deprecated -Wno-strict-aliasing -Wno-write-strings -Wno-invalid-offsetof -fno-operator-names -Wno-error=array-bounds -Wno-error=switch -Werror=format-security -Wno-unused-result -Wno-sign-compare -Wno-attributes -Wno-maybe-uninitialized -Wno-mismatched-tags -Wno-unknown-warning-option -Wno-return-type-c-linkage -Qunused-arguments ${LLVM_OPT}")
39 elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
40 execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
42 if(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
43 # FIXME: GCC 4.8+ regressions http://git.io/4r7VCQ
44 set(GNUCC_OPT "${GNUCC_OPT} -ftrack-macro-expansion=0 -fno-builtin-memcmp")
45 # Fix problem with GCC 4.9, https://kb.isc.org/article/AA-01167
46 if(GCC_VERSION VERSION_GREATER 4.9 OR GCC_VERSION VERSION_EQUAL 4.9)
47 set(GNUCC_OPT "${GNUCC_OPT} -fno-delete-null-pointer-checks")
50 message(FATAL_ERROR "${PROJECT_NAME} requires g++ 4.8 or greater.")
53 # Enabled GCC/LLVM stack-smashing protection
55 if(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
57 # https://isisblogs.poly.edu/2011/06/01/relro-relocation-read-only/
58 set(GNUCC_OPT "${GNUCC_OPT} -Wl,-z,relro,-z,now")
60 if(GCC_VERSION VERSION_GREATER 4.9 OR GCC_VERSION VERSION_EQUAL 4.9)
61 set(GNUCC_OPT "${GNUCC_OPT} -fstack-protector-strong")
64 set(GNUCC_OPT "${GNUCC_OPT} -fstack-protector")
66 set(GNUCC_OPT "${GNUCC_OPT} -pie -fPIC --param=ssp-buffer-size=4")
70 set(GNUCC_PLAT_OPT "")
72 set(GNUCC_PLAT_OPT "-mcrc32")
77 set(CMAKE_CXX_OMIT_LEAF_FRAME_POINTER "-momit-leaf-frame-pointer")
80 # No optimizations for debug builds.
81 set(CMAKE_C_FLAGS_DEBUG "-Og -g")
82 set(CMAKE_CXX_FLAGS_DEBUG "-Og -g")
84 # Generic GCC flags and Optional flags
85 set(CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG")
86 set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
87 set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG")
88 set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -fno-gcse ${CMAKE_CXX_OMIT_LEAF_FRAME_POINTER} --param max-inline-insns-auto=100 --param early-inlining-insns=200 --param max-early-inliner-iterations=50")
89 set(CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")
90 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")
91 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${GNUCC_OPT} -w")
92 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++11 -ffunction-sections -fno-gcse -fno-omit-frame-pointer -Woverloaded-virtual -Wno-deprecated -Wno-strict-aliasing -Wno-write-strings -Wno-invalid-offsetof -fno-operator-names -Wno-error=array-bounds -Wno-error=switch -Werror=format-security -Wno-unused-result -Wno-sign-compare -Wno-attributes -Wno-maybe-uninitialized -Wno-unused-local-typedefs -fno-canonical-system-headers -Wno-deprecated-declarations -Wno-unused-function ${GNUCC_OPT} ${GNUCC_PLAT_OPT}")
94 set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
97 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mavx2 -march=core-avx2")
98 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2 -march=core-avx2")
99 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -mavx2 -march=core-avx2")
103 # in debug mode large files can overflow pe/coff sections
104 # this switches binutils to use the pe+ format
105 set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wa,-mbig-obj")
106 # stack limit is set at compile time on windows
107 # code expects a minimum of 8 * 1024 * 1024 + 8 for a buffer
108 # the default is 2 mb
109 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--stack,8388616")
112 elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
113 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -no-ipo -fp-model precise -wd584 -wd1418 -wd1918 -wd383 -wd869 -wd981 -wd424 -wd1419 -wd444 -wd271 -wd2259 -wd1572 -wd1599 -wd82 -wd177 -wd593 -w")
114 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -no-ipo -fp-model precise -wd584 -wd1418 -wd1918 -wd383 -wd869 -wd981 -wd424 -wd1419 -wd444 -wd271 -wd2259 -wd1572 -wd1599 -wd82 -wd177 -wd593 -fno-omit-frame-pointer -Wall -Woverloaded-virtual -Wno-deprecated -w1 -Wno-strict-aliasing -Wno-write-strings -Wno-invalid-offsetof -fno-operator-names")
115 # using Visual Studio C++
116 elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
117 message(FATAL_ERROR "${PROJECT_NAME} is not yet compatible with Visual Studio")
119 message("Warning: unknown/unsupported compiler, things may go wrong")