You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Toolset.cmake 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. option (ENABLE_FAST_MATH "Build rspamd with fast math compiler flag [default: ON]" ON)
  2. option (ENABLE_ANALYZER "Build rspamd with static analyzer [default: OFF]" OFF)
  3. option (ENABLE_STATIC_LIBCXX "Build rspamd with static lib(std)c++ [default: OFF]" OFF)
  4. option (ENABLE_COMPILE_TIME "Show compile time [default: OFF]" OFF)
  5. option (ENABLE_LIBCXX "Use libc++ instead of libstdc++" OFF)
  6. if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
  7. SET (COMPILER_GCC 1)
  8. elseif(CMAKE_C_COMPILER_ID MATCHES "Clang|AppleClang")
  9. SET (COMPILER_CLANG 1)
  10. endif()
  11. SET (COMPILER_FAST_MATH "")
  12. if (ENABLE_FAST_MATH MATCHES "ON")
  13. # We need to keep nans and infinities, so cannot keep all fast math there
  14. IF (COMPILER_CLANG)
  15. SET (COMPILER_FAST_MATH "-fassociative-math -freciprocal-math -fno-signed-zeros -ffp-contract=fast")
  16. ELSE()
  17. SET (COMPILER_FAST_MATH "-funsafe-math-optimizations -fno-math-errno")
  18. ENDIF ()
  19. endif ()
  20. if (CMAKE_GENERATOR STREQUAL "Ninja")
  21. # Turn on colored output. https://github.com/ninja-build/ninja/wiki/FAQ
  22. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always")
  23. set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-color=always")
  24. endif ()
  25. if (COMPILER_GCC)
  26. # Require minimum version of gcc
  27. set (GCC_MINIMUM_VERSION 8)
  28. if (CMAKE_C_COMPILER_VERSION VERSION_LESS ${GCC_MINIMUM_VERSION} AND NOT CMAKE_VERSION VERSION_LESS 2.8.9)
  29. message (FATAL_ERROR "GCC version must be at least ${GCC_MINIMUM_VERSION}.")
  30. endif ()
  31. if (ENABLE_LIBCXX MATCHES "ON")
  32. # XXX: too complicated to implement for now
  33. endif ()
  34. elseif (COMPILER_CLANG)
  35. # Require minimum version of clang
  36. set (CLANG_MINIMUM_VERSION 7)
  37. if (CMAKE_C_COMPILER_VERSION VERSION_LESS ${CLANG_MINIMUM_VERSION})
  38. message (FATAL_ERROR "Clang version must be at least ${CLANG_MINIMUM_VERSION}.")
  39. endif ()
  40. ADD_COMPILE_OPTIONS(-Wno-unused-command-line-argument)
  41. if (ENABLE_LIBCXX MATCHES "ON")
  42. # Use libc++ as libstdc++ is buggy in many cases
  43. set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
  44. endif ()
  45. else ()
  46. message (WARNING "You are using an unsupported compiler ${CMAKE_C_COMPILER_ID}. Compilation has only been tested with Clang 4+ and GCC 4+.")
  47. endif ()
  48. option(LINKER_NAME "Linker name or full path")
  49. find_program(LLD_PATH NAMES "ld.lld" "lld")
  50. find_program(GOLD_PATH NAMES "ld.gold" "gold")
  51. if(NOT LINKER_NAME)
  52. if(LLD_PATH)
  53. set(LINKER_NAME "lld")
  54. elseif(GOLD_PATH)
  55. set(LINKER_NAME "gold")
  56. else()
  57. message(STATUS "Use generic 'ld' as a linker")
  58. endif()
  59. endif()
  60. if(LINKER_NAME)
  61. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=${LINKER_NAME}")
  62. set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fuse-ld=${LINKER_NAME}")
  63. message(STATUS "Using custom linker by name: ${LINKER_NAME}")
  64. endif ()
  65. option (ENABLE_STATIC "Enable static compiling [default: OFF]" OFF)
  66. if (ENABLE_STATIC MATCHES "ON")
  67. MESSAGE(STATUS "Static build of rspamd implies that the target binary will be *GPL* licensed")
  68. SET(GPL_RSPAMD_BINARY 1)
  69. SET(CMAKE_SKIP_INSTALL_RPATH ON)
  70. SET(BUILD_STATIC 1)
  71. SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
  72. SET(BUILD_SHARED_LIBS OFF)
  73. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
  74. SET(LINK_TYPE "STATIC")
  75. SET(NO_SHARED "ON")
  76. # Dirty hack for cmake
  77. SET(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS) # remove -Wl,-Bdynamic
  78. SET(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
  79. SET(CMAKE_SHARED_LIBRARY_C_FLAGS) # remove -fPIC
  80. SET(CMAKE_SHARED_LIBRARY_CXX_FLAGS)
  81. SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS) # remove -rdynamic
  82. SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS)
  83. else ()
  84. if (NO_SHARED MATCHES "OFF")
  85. SET(LINK_TYPE "SHARED")
  86. else ()
  87. SET(LINK_TYPE "STATIC")
  88. endif ()
  89. endif ()
  90. # Legacy options support
  91. option (ENABLE_COVERAGE "Build rspamd with code coverage options [default: OFF]" OFF)
  92. option (ENABLE_OPTIMIZATION "Enable extra optimizations [default: OFF]" OFF)
  93. option (SKIP_RELINK_RPATH "Skip relinking and full RPATH for the install tree" OFF)
  94. option (ENABLE_FULL_DEBUG "Build rspamd with all possible debug [default: OFF]" OFF)
  95. if(NOT CMAKE_BUILD_TYPE)
  96. if (ENABLE_FULL_DEBUG MATCHES "ON")
  97. set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
  98. endif()
  99. if (ENABLE_COVERAGE MATCHES "ON")
  100. set(CMAKE_BUILD_TYPE Coverage CACHE STRING "" FORCE)
  101. endif()
  102. if (ENABLE_OPTIMIZATION MATCHES "ON")
  103. set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
  104. endif()
  105. endif()
  106. if (CMAKE_CONFIGURATION_TYPES) # multiconfig generator?
  107. set (CMAKE_CONFIGURATION_TYPES "Debug;RelWithDebInfo;Release;Coverage" CACHE STRING "" FORCE)
  108. else()
  109. if (NOT CMAKE_BUILD_TYPE)
  110. if (NOT SANITIZE)
  111. message(STATUS "Defaulting to release build.")
  112. set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
  113. else ()
  114. message(STATUS "Defaulting to debug build due to sanitizers being enabled.")
  115. set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
  116. endif ()
  117. endif()
  118. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING "Choose the type of build")
  119. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;Coverage")
  120. endif()
  121. string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
  122. message (STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE_UC}")
  123. set(CMAKE_C_FLAGS_COVERAGE "${CMAKE_C_FLAGS} -O1 --coverage -fno-inline -fno-default-inline -fno-inline-small-functions ${COMPILER_FAST_MATH}")
  124. set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS} -O1 --coverage -fno-inline -fno-default-inline -fno-inline-small-functions ${COMPILER_FAST_MATH}")
  125. if (COMPILER_GCC)
  126. # GCC flags
  127. set (COMPILER_DEBUG_FLAGS "-g -ggdb -g3 -ggdb3")
  128. set (CXX_COMMON_FLAGS "-Weffc++")
  129. set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -O2 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  130. set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -O2 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS} ${CXX_COMMON_FLAGS}")
  131. set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 ${COMPILER_FAST_MATH} -fomit-frame-pointer")
  132. set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 ${COMPILER_FAST_MATH} -fomit-frame-pointer ${CXX_COMMON_FLAGS}")
  133. if (ENABLE_FULL_DEBUG MATCHES "ON")
  134. if (ENABLE_ANALYZER MATCHES "ON")
  135. # Check support of -fanalyzer
  136. CHECK_C_COMPILER_FLAG(-fanalyzer SUPPORT_FANALYZER)
  137. if (SUPPORT_FANALYZER)
  138. set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fanalyzer")
  139. #set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fanalyzer")
  140. endif()
  141. endif ()
  142. set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 ${COMPILER_DEBUG_FLAGS}")
  143. set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${COMPILER_DEBUG_FLAGS} ${CXX_COMMON_FLAGS}")
  144. else()
  145. set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Og ${COMPILER_DEBUG_FLAGS}")
  146. set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og ${COMPILER_DEBUG_FLAGS} ${CXX_COMMON_FLAGS}")
  147. endif()
  148. elseif (COMPILER_CLANG)
  149. # Clang flags
  150. set (COMPILER_DEBUG_FLAGS "-g -glldb -gdwarf-aranges -gdwarf-4")
  151. set (CXX_COMMON_FLAGS "-Weffc++")
  152. set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2 -fomit-frame-pointer ${COMPILER_FAST_MATH}")
  153. set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2 -fomit-frame-pointer ${COMPILER_FAST_MATH} ${CXX_COMMON_FLAGS}")
  154. set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -O2 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  155. set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -O2 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS} ${CXX_COMMON_FLAGS}")
  156. set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 ${COMPILER_DEBUG_FLAGS}")
  157. set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${COMPILER_DEBUG_FLAGS} ${CXX_COMMON_FLAGS}")
  158. endif()
  159. if (CMAKE_BUILD_TYPE_UC MATCHES "RELEASE|RELWITHDEBINFO")
  160. set(ENABLE_LTO_INIT ON)
  161. else()
  162. set(ENABLE_LTO_INIT OFF)
  163. endif()
  164. option(ENABLE_LTO "Build rspamd with Link Time Optimization if supported [default: ${ENABLE_LTO_INIT}]" ${ENABLE_LTO_INIT})
  165. if (CMAKE_BUILD_TYPE_UC MATCHES "COVERAGE")
  166. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
  167. message (STATUS "IPO not enabled for COVERAGE build")
  168. elseif (ENABLE_LTO)
  169. if (${CMAKE_VERSION} VERSION_GREATER "3.9.0")
  170. cmake_policy (SET CMP0069 NEW)
  171. include (CheckIPOSupported)
  172. check_ipo_supported (RESULT SUPPORT_LTO OUTPUT LTO_DIAG )
  173. if (SUPPORT_LTO)
  174. set (CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
  175. message (STATUS "Enable IPO for the ${CMAKE_BUILD_TYPE} build")
  176. else ()
  177. message(WARNING "IPO is not supported: ${LTO_DIAG}")
  178. endif ()
  179. endif ()
  180. else ()
  181. message (STATUS "IPO not enabled for the ${CMAKE_BUILD_TYPE} build")
  182. endif ()
  183. if (ENABLE_STATIC_LIBCXX MATCHES "ON")
  184. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++")
  185. set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libstdc++")
  186. endif()
  187. if (ENABLE_COMPILE_TIME MATCHES "ON")
  188. set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "/usr/bin/time")
  189. endif()
  190. message (STATUS "Final CFLAGS: ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
  191. message (STATUS "Final CXXFLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
  192. message (STATUS "Final link flags for shlib: ${CMAKE_SHARED_LINKER_FLAGS}")
  193. message (STATUS "Final link flags for exe: ${CMAKE_EXE_LINKER_FLAGS}")