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 8.0KB

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