Introduce Type "Phases" By Utilizing GADTs
[hiphop-php.git] / CMake / HPHPCompiler.cmake
blob1ac28943996a9ba39d73aa1a95de1b0c0872782e
1 set(FREEBSD FALSE)
2 if("${CMAKE_SYSTEM_NAME}" STREQUAL "FreeBSD")
3   set(FREEBSD TRUE)
4 endif()
5 set(LINUX FALSE)
6 if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
7   set(LINUX TRUE)
8 endif()
10 # using Clang
11 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
12   set(LLVM_OPT "")
13   execute_process(
14     COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} --version COMMAND head -1
15     OUTPUT_VARIABLE _clang_version_info)
16   string(
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
20   if(ENABLE_SSP)
21     if(CLANG_VERSION VERSION_GREATER 3.6 OR CLANG_VERSION VERSION_EQUAL 3.6)
22       set(LLVM_OPT "${LLVM_OPT} -fstack-protector-strong")
23     else()
24       set(LLVM_OPT "${LLVM_OPT} -fstack-protector")
25     endif()
26     set(LLVM_OPT "${LLVM_OPT} --param=ssp-buffer-size=4 -pie -fPIC")
27   endif()
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}")
38 # using GCC
39 elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
40   execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
41   set(GNUCC_OPT "")
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")
48     endif()
49   else()
50      message(FATAL_ERROR "${PROJECT_NAME} requires g++ 4.8 or greater.")
51   endif()
53   # Enabled GCC/LLVM stack-smashing protection
54   if(ENABLE_SSP)
55     if(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
56       if(LINUX)
57         # https://isisblogs.poly.edu/2011/06/01/relro-relocation-read-only/
58         set(GNUCC_OPT "${GNUCC_OPT} -Wl,-z,relro,-z,now")
59       endif()
60       if(GCC_VERSION VERSION_GREATER 4.9 OR GCC_VERSION VERSION_EQUAL 4.9)
61         set(GNUCC_OPT "${GNUCC_OPT} -fstack-protector-strong")
62       endif()
63     else()
64       set(GNUCC_OPT "${GNUCC_OPT} -fstack-protector")
65     endif()
66     set(GNUCC_OPT "${GNUCC_OPT} -pie -fPIC --param=ssp-buffer-size=4")
67   endif()
69   # X64
70   set(GNUCC_PLAT_OPT "")
71   if(IS_X64)
72     set(GNUCC_PLAT_OPT "-mcrc32")
73   endif()
75   # PPC64
76   if(NOT IS_PPC64)
77     set(CMAKE_CXX_OMIT_LEAF_FRAME_POINTER "-momit-leaf-frame-pointer")
78   endif()
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}")
93   if(STATIC_CXX_LIB)
94     set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
95   endif()
96   if(ENABLE_AVX2)
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")
100   endif()
102   if(CYGWIN)
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")
110   endif()
111 # using Intel C++
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")
118 else()
119   message("Warning: unknown/unsupported compiler, things may go wrong")
120 endif()