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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  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. # Legacy options support
  80. option (ENABLE_COVERAGE "Build rspamd with code coverage options [default: OFF]" OFF)
  81. option (ENABLE_OPTIMIZATION "Enable extra optimizations [default: OFF]" OFF)
  82. option (SKIP_RELINK_RPATH "Skip relinking and full RPATH for the install tree" OFF)
  83. option (ENABLE_FULL_DEBUG "Build rspamd with all possible debug [default: OFF]" OFF)
  84. if(NOT CMAKE_BUILD_TYPE)
  85. if (ENABLE_FULL_DEBUG MATCHES "ON")
  86. set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
  87. endif()
  88. if (ENABLE_COVERAGE MATCHES "ON")
  89. set(CMAKE_BUILD_TYPE Coverage CACHE STRING "" FORCE)
  90. endif()
  91. if (ENABLE_OPTIMIZATION MATCHES "ON")
  92. set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
  93. endif()
  94. endif()
  95. if (CMAKE_CONFIGURATION_TYPES) # multiconfig generator?
  96. set (CMAKE_CONFIGURATION_TYPES "Debug;RelWithDebInfo;Release;Coverage" CACHE STRING "" FORCE)
  97. else()
  98. if (NOT CMAKE_BUILD_TYPE)
  99. if (NOT SANITIZE)
  100. message(STATUS "Defaulting to release build.")
  101. set(CMAKE_BUILD_TYPE Release CACHE STRING "" FORCE)
  102. else ()
  103. message(STATUS "Defaulting to debug build due to sanitizers being enabled.")
  104. set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE)
  105. endif ()
  106. endif()
  107. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY HELPSTRING "Choose the type of build")
  108. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release;Coverage")
  109. endif()
  110. string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
  111. message (STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE_UC}")
  112. set(CMAKE_C_FLAGS_COVERAGE "${CMAKE_C_FLAGS} -O1 --coverage -fno-inline -fno-default-inline -fno-inline-small-functions ${COMPILER_FAST_MATH}")
  113. set(CMAKE_CXX_FLAGS_COVERAGE "${CMAKE_CXX_FLAGS} -O1 --coverage -fno-inline -fno-default-inline -fno-inline-small-functions ${COMPILER_FAST_MATH}")
  114. if (COMPILER_GCC)
  115. # GCC flags
  116. set (COMPILER_DEBUG_FLAGS "-g -ggdb -g3 -ggdb3")
  117. set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -O2 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  118. set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -O2 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  119. set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 ${COMPILER_FAST_MATH} -fomit-frame-pointer")
  120. set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 ${COMPILER_FAST_MATH} -fomit-frame-pointer")
  121. set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Og ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  122. set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  123. else ()
  124. # Clang flags
  125. set (COMPILER_DEBUG_FLAGS "-g -glldb -gdwarf-aranges -gdwarf-4")
  126. set (CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O2 -fomit-frame-pointer ${COMPILER_FAST_MATH}")
  127. set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2 -fomit-frame-pointer ${COMPILER_FAST_MATH}")
  128. set (CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELEASE} -O2 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  129. set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} -O2 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  130. set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -O0 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  131. set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 ${COMPILER_FAST_MATH} ${COMPILER_DEBUG_FLAGS}")
  132. endif()
  133. if (CMAKE_BUILD_TYPE_UC MATCHES "RELEASE|RELWITHDEBINFO")
  134. set(ENABLE_LTO_INIT ON)
  135. else()
  136. set(ENABLE_LTO_INIT OFF)
  137. endif()
  138. option(ENABLE_LTO "Build rspamd with Link Time Optimization if supported [default: ${ENABLE_LTO_INIT}]" ${ENABLE_LTO_INIT})
  139. if (CMAKE_BUILD_TYPE_UC MATCHES "COVERAGE")
  140. set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
  141. elseif (ENABLE_LTO)
  142. if (${CMAKE_VERSION} VERSION_GREATER "3.9.0")
  143. cmake_policy (SET CMP0069 NEW)
  144. include (CheckIPOSupported)
  145. check_ipo_supported (RESULT SUPPORT_LTO OUTPUT LTO_DIAG )
  146. if (SUPPORT_LTO)
  147. set (CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
  148. message (STATUS "Enable IPO for the ${CMAKE_BUILD_TYPE} build")
  149. else ()
  150. message(WARNING "IPO is not supported: ${LTO_DIAG}")
  151. endif ()
  152. endif ()
  153. endif ()
  154. message (STATUS "Final CFLAGS: ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
  155. message (STATUS "Final CXXFLAGS: ${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")