Rapid spam filtering system https://rspamd.com/
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.

356 lines
12 KiB

11 years ago
16 years ago
  1. #
  2. # Rspamd - rapid antispam system
  3. #
  4. # Cmake configuration file
  5. #
  6. ############################# INITIAL SECTION #############################################
  7. cmake_minimum_required(VERSION 3.15 FATAL_ERROR)
  8. # Define version variables
  9. set(RSPAMD_VERSION_MAJOR 3)
  10. set(RSPAMD_VERSION_MINOR 11)
  11. set(RSPAMD_VERSION_PATCH 2)
  12. # Keep two digits all the time
  13. set(RSPAMD_VERSION_MAJOR_NUM ${RSPAMD_VERSION_MAJOR}0)
  14. set(RSPAMD_VERSION_MINOR_NUM ${RSPAMD_VERSION_MINOR}0)
  15. set(RSPAMD_VERSION_PATCH_NUM ${RSPAMD_VERSION_PATCH}0)
  16. if (GIT_ID)
  17. set(GIT_VERSION 1)
  18. set(RSPAMD_ID "${GIT_ID}")
  19. endif ()
  20. set(RSPAMD_VERSION "${RSPAMD_VERSION_MAJOR}.${RSPAMD_VERSION_MINOR}.${RSPAMD_VERSION_PATCH}")
  21. project(rspamd
  22. VERSION "${RSPAMD_VERSION}"
  23. LANGUAGES C CXX ASM
  24. DESCRIPTION "Rapid spam filtering system"
  25. HOMEPAGE_URL "https://rspamd.com"
  26. )
  27. cmake_policy(SET CMP0075 NEW)
  28. # Language standards
  29. set(CMAKE_C_STANDARD 11)
  30. set(CMAKE_CXX_STANDARD 20)
  31. set(CMAKE_C_STANDARD_REQUIRED ON)
  32. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  33. set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  34. list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/")
  35. set(RSPAMD_MASTER_SITE_URL "https://rspamd.com")
  36. if (NOT RSPAMD_USER)
  37. set(RSPAMD_USER "nobody")
  38. set(RSPAMD_GROUP "nobody")
  39. endif ()
  40. # Default for SysV Init
  41. set(RSPAMD_WORKER_NORMAL "*:11333")
  42. set(RSPAMD_WORKER_CONTROLLER "*:11334")
  43. ############################# OPTIONS SECTION #############################################
  44. option(ENABLE_LUAJIT "Link with libluajit" ON)
  45. option(ENABLE_URL_INCLUDE "Enable URLs in UCL includes (requires libcurl or libfetch)" OFF)
  46. option(NO_SHARED "Build internal libs static" ON)
  47. option(INSTALL_WEBUI "Install web interface" ON)
  48. option(INSTALL_EXAMPLES "Install examples of the configuration and Lua" ON)
  49. option(WANT_SYSTEMD_UNITS "Install systemd unit files on Linux" OFF)
  50. option(ENABLE_SNOWBALL "Enable snowball stemmer" ON)
  51. option(ENABLE_CLANG_PLUGIN "Enable clang static analysing plugin" OFF)
  52. option(ENABLE_PCRE2 "Enable pcre2 instead of pcre" ON)
  53. option(ENABLE_JEMALLOC "Build rspamd with jemalloc allocator" OFF)
  54. option(ENABLE_UTILS "Build rspamd internal utils" OFF)
  55. option(ENABLE_LIBUNWIND "Obsoleted" OFF) # Deprecated option
  56. option(ENABLE_LUA_TRACE "Trace all Lua C API invocations" OFF)
  57. option(ENABLE_FASTTEXT "Link with FastText library" OFF)
  58. option(ENABLE_BACKWARD "Build rspamd with backward-cpp stacktrace" ON)
  59. option(SYSTEM_ZSTD "Use system zstd instead of bundled one" OFF)
  60. option(SYSTEM_DOCTEST "Use system doctest instead of bundled one" OFF)
  61. option(SYSTEM_XXHASH "Use system xxhash instead of bundled one" OFF)
  62. ############################# INCLUDE SECTION #############################################
  63. include(CheckIncludeFiles)
  64. include(CheckFunctionExists)
  65. include(CheckSymbolExists)
  66. include(CheckCSourceCompiles)
  67. include(CheckCSourceRuns)
  68. include(CheckLibraryExists)
  69. include(CheckCCompilerFlag)
  70. include(CMakeParseArguments)
  71. include(FindArch)
  72. include(AsmOp)
  73. include(FindRagel)
  74. include(ProcessPackage)
  75. if (NOT RAGEL_FOUND)
  76. message(FATAL_ERROR "Ragel is required to build rspamd")
  77. endif ()
  78. # Find required packages
  79. find_package(PkgConfig REQUIRED)
  80. find_package(Perl REQUIRED)
  81. # Sanitizer setup
  82. option(SANITIZE "Enable sanitizer: address, memory, undefined, leak (comma separated list)" "")
  83. include(Toolset)
  84. include(Sanitizer)
  85. include(ArchDep)
  86. include(Paths)
  87. include(OSDep)
  88. ConfigurePlatformSpecifics()
  89. if (ENABLE_PCRE2)
  90. set(WITH_PCRE2 1)
  91. # For utf8 API
  92. list(APPEND CMAKE_REQUIRED_DEFINITIONS "-DPCRE2_CODE_UNIT_WIDTH=8")
  93. endif ()
  94. ############################# CONFIG SECTION #############################################
  95. # Include directories
  96. # Prefer local include dirs to system ones
  97. include_directories(
  98. "${CMAKE_SOURCE_DIR}/"
  99. "${CMAKE_SOURCE_DIR}/src"
  100. "${CMAKE_SOURCE_DIR}/src/libutil"
  101. "${CMAKE_SOURCE_DIR}/src/libserver"
  102. "${CMAKE_SOURCE_DIR}/src/libmime"
  103. "${CMAKE_SOURCE_DIR}/src/libstat"
  104. "${CMAKE_SOURCE_DIR}/src/libcryptobox"
  105. "${CMAKE_SOURCE_DIR}/contrib/libucl"
  106. "${CMAKE_SOURCE_DIR}/contrib/replxx/include"
  107. "${CMAKE_SOURCE_DIR}/contrib/uthash"
  108. "${CMAKE_SOURCE_DIR}/contrib/http-parser"
  109. "${CMAKE_SOURCE_DIR}/contrib/fpconv"
  110. "${CMAKE_SOURCE_DIR}/contrib/libottery"
  111. "${CMAKE_SOURCE_DIR}/contrib/cdb"
  112. "${CMAKE_SOURCE_DIR}/contrib/snowball/include"
  113. "${CMAKE_SOURCE_DIR}/contrib/librdns"
  114. "${CMAKE_SOURCE_DIR}/contrib/aho-corasick"
  115. "${CMAKE_SOURCE_DIR}/contrib/lc-btrie"
  116. "${CMAKE_SOURCE_DIR}/contrib/lua-lpeg"
  117. "${CMAKE_SOURCE_DIR}/contrib/frozen/include"
  118. "${CMAKE_SOURCE_DIR}/contrib/fu2/include"
  119. "${CMAKE_BINARY_DIR}/src" # Stored in the binary dir
  120. "${CMAKE_BINARY_DIR}/src/libcryptobox"
  121. )
  122. set(TAR "tar")
  123. include(OSDep)
  124. # Now find libraries and headers
  125. list(APPEND RSPAMD_REQUIRED_LIBRARIES "m")
  126. list(APPEND RSPAMD_REQUIRED_LIBRARIES "pthread")
  127. # Lua setup
  128. if (ENABLE_LUAJIT)
  129. ProcessPackage(LIBLUAJIT LIBRARY "luajit"
  130. "luajit-2.1"
  131. "luajit2.1"
  132. "luajit-2.0"
  133. "luajit2.0"
  134. "luajit-5.1"
  135. INCLUDE luajit.h INCLUDE_SUFFIXES
  136. "include/luajit-2.1"
  137. "include/luajit-2.0"
  138. "include/luajit"
  139. ROOT ${LUA_ROOT}
  140. MODULES luajit)
  141. set(WITH_LUAJIT 1)
  142. else ()
  143. # Try to find Lua (5.3, 5.4, 5.2, or 5.1 in that order)
  144. ProcessPackage(LIBLUA LIBRARY "lua"
  145. "lua-5.3"
  146. LIB_SUFFIXES "lua5.3"
  147. INCLUDE lua.h INCLUDE_SUFFIXES
  148. "include/lua-5.3"
  149. "include/lua5.3"
  150. "include/lua53"
  151. "include/lua"
  152. ROOT ${LUA_ROOT}
  153. MODULES lua53
  154. OPTIONAL)
  155. if (NOT WITH_LIBLUA)
  156. ProcessPackage(LIBLUA LIBRARY "lua"
  157. "lua-5.4"
  158. LIB_SUFFIXES "lua5.4"
  159. INCLUDE lua.h INCLUDE_SUFFIXES
  160. "include/lua-5.4"
  161. "include/lua5.4"
  162. "include/lua54"
  163. "include/lua"
  164. ROOT ${LUA_ROOT}
  165. MODULES lua54
  166. OPTIONAL)
  167. if (NOT WITH_LIBLUA)
  168. ProcessPackage(LIBLUA LIBRARY "lua"
  169. "lua-5.2"
  170. LIB_SUFFIXES "lua5.2"
  171. INCLUDE lua.h INCLUDE_SUFFIXES
  172. "include/lua-5.2"
  173. "include/lua5.2"
  174. "include/lua52"
  175. "include/lua"
  176. ROOT ${LUA_ROOT}
  177. MODULES lua52
  178. OPTIONAL)
  179. if (NOT WITH_LIBLUA)
  180. ProcessPackage(LIBLUA LIBRARY "lua"
  181. "lua-5.1"
  182. INCLUDE lua.h INCLUDE_SUFFIXES
  183. "include/lua-5.1"
  184. "include/lua5.1"
  185. "include/lua51"
  186. "include/lua"
  187. ROOT ${LUA_ROOT}
  188. MODULES lua51)
  189. endif ()
  190. endif ()
  191. endif ()
  192. endif ()
  193. # Memory allocator
  194. if (ENABLE_JEMALLOC AND NOT SANITIZE)
  195. ProcessPackage(JEMALLOC LIBRARY jemalloc_pic jemalloc INCLUDE jemalloc/jemalloc.h
  196. ROOT ${JEMALLOC_ROOT_DIR})
  197. set(WITH_JEMALLOC "1")
  198. endif ()
  199. # Required libraries
  200. ProcessPackage(GLIB2 LIBRARY glib-2.0 INCLUDE glib.h
  201. INCLUDE_SUFFIXES include/glib include/glib-2.0
  202. ROOT ${GLIB_ROOT_DIR} MODULES glib-2.0>=2.28)
  203. # PCRE setup
  204. if (ENABLE_PCRE2)
  205. ProcessPackage(PCRE LIBRARY pcre2 pcre2-8 INCLUDE pcre2.h INCLUDE_SUFFIXES include/pcre2
  206. ROOT ${PCRE_ROOT_DIR} MODULES pcre2 pcre2-8 libpcre2 libpcre2-8)
  207. else ()
  208. ProcessPackage(PCRE LIBRARY pcre INCLUDE pcre.h INCLUDE_SUFFIXES include/pcre
  209. ROOT ${PCRE_ROOT_DIR} MODULES pcre libpcre pcre3 libpcre3)
  210. endif ()
  211. # Other dependencies
  212. ProcessPackage(SQLITE3 LIBRARY sqlite3 INCLUDE sqlite3.h INCLUDE_SUFFIXES include/sqlite3 include/sqlite
  213. ROOT ${SQLITE3_ROOT_DIR} MODULES sqlite3 sqlite)
  214. ProcessPackage(ICUDATA LIBRARY icudata INCLUDE unicode/ucnv.h
  215. ROOT ${ICU_ROOT_DIR} MODULES icu-uc)
  216. ProcessPackage(ICUC LIBRARY icuuc INCLUDE unicode/ucnv.h
  217. ROOT ${ICU_ROOT_DIR} MODULES icu-uc)
  218. ProcessPackage(ICUIO LIBRARY icuio INCLUDE unicode/ucnv.h
  219. ROOT ${ICU_ROOT_DIR} MODULES icu-io)
  220. ProcessPackage(ICUI18N LIBRARY icui18n INCLUDE unicode/ucnv.h
  221. ROOT ${ICU_ROOT_DIR} MODULES icu-i18n)
  222. ProcessPackage(LIBCRYPT LIBRARY crypto INCLUDE openssl/evp.h
  223. ROOT ${OPENSSL_ROOT_DIR} MODULES openssl libcrypt)
  224. ProcessPackage(LIBSSL LIBRARY ssl INCLUDE openssl/ssl.h
  225. ROOT ${OPENSSL_ROOT_DIR} MODULES openssl libssl)
  226. ProcessPackage(LIBZ LIBRARY z INCLUDE zlib.h INCLUDE_SUFFIXES include/zlib
  227. ROOT ${LIBZ_ROOT_DIR} MODULES z)
  228. ProcessPackage(SODIUM LIBRARY sodium INCLUDE sodium.h
  229. INCLUDE_SUFFIXES include/libsodium include/sodium
  230. ROOT ${LIBSODIUM_ROOT_DIR} MODULES libsodium>=1.0.0)
  231. ProcessPackage(LIBARCHIVE LIBRARY archive INCLUDE archive.h
  232. ROOT ${LIBARCHIVE_ROOT_DIR} MODULES libarchive>=3.0.0)
  233. if (ENABLE_FASTTEXT)
  234. ProcessPackage(FASTTEXT LIBRARY fasttext INCLUDE fasttext/fasttext.h
  235. ROOT ${FASTTEXT_ROOT_DIR} MODULES fasttext)
  236. set(WITH_FASTTEXT "1")
  237. endif ()
  238. # Include common compiler and platform specific configurations
  239. include(CompilerWarnings)
  240. include(Hyperscan)
  241. include(Openblas)
  242. # Lua tracing
  243. if (ENABLE_LUA_TRACE)
  244. set(WITH_LUA_TRACE 1)
  245. endif ()
  246. # Configure compiler flags
  247. set(CMAKE_C_FLAGS "${CMAKE_C_OPT_FLAGS} ${CMAKE_C_FLAGS}")
  248. set(CMAKE_CXX_FLAGS "${CMAKE_C_OPT_FLAGS} ${CMAKE_CXX_FLAGS}")
  249. # Define macros for compilation
  250. add_definitions(-DHAVE_CONFIG_H)
  251. add_definitions(-DDOCTEST_CONFIG_NO_MULTI_LANE_ATOMICS)
  252. add_definitions(-DFMT_HEADER_ONLY)
  253. # Workaround for https://github.com/onqtam/doctest/issues/356
  254. add_definitions(-DDOCTEST_CONFIG_USE_STD_HEADERS)
  255. add_definitions(-DU_CHARSET_IS_UTF8)
  256. # Disable zstd deprecation warnings, as they are not relevant for us
  257. add_definitions(-DZSTD_DISABLE_DEPRECATE_WARNINGS)
  258. # Check platform specific includes
  259. include(CheckSystemHeaders)
  260. # Check macros, functions, and features
  261. include(CheckSystemFeatures)
  262. # Check symbols and functions
  263. include(CheckSymbols)
  264. # Configure PIC support
  265. check_c_compiler_flag(-fPIC SUPPORT_FPIC)
  266. if (SUPPORT_FPIC)
  267. add_compile_options("-fPIC")
  268. endif ()
  269. # Support for URL includes
  270. include(CheckURLInclude)
  271. if (ENABLE_URL_INCLUDE)
  272. CheckURLIncludeSupport()
  273. endif ()
  274. # Ensure DESTDIR is set
  275. if (NOT DESTDIR)
  276. set(DESTDIR $ENV{DESTDIR})
  277. endif ()
  278. ################################ SUBDIRS SECTION ###########################
  279. # Add required subdirectories for dependencies
  280. include(AddDependencySubdirectories)
  281. AddDependencySubdirectories()
  282. ############################ TARGETS SECTION ###############################
  283. # Generate config.h
  284. configure_file(config.h.in src/config.h)
  285. ##################### INSTALLATION ##########################################
  286. # Setup installation targets
  287. include(InstallRspamdFiles)
  288. InstallRspamdFiles()
  289. # Build distribution and testing targets
  290. add_custom_target(dist ${CMAKE_SOURCE_DIR}/dist.sh
  291. "${CMAKE_BINARY_DIR}/rspamd-${RSPAMD_VERSION}.tar.xz" "${TAR}"
  292. COMMENT "Create source distribution"
  293. WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
  294. # Tests
  295. # Include CTest for testing support
  296. include(CTest)
  297. enable_testing()
  298. add_subdirectory(test)
  299. add_custom_target(check DEPENDS rspamd-test-cxx rspamd-test)
  300. add_custom_target(run-test DEPENDS check
  301. COMMAND test/rspamd-test-cxx
  302. COMMAND sh -c 'LUA_PATH="${CMAKE_SOURCE_DIR}/lualib/?.lua\;${CMAKE_SOURCE_DIR}/lualib/?/?.lua\;${CMAKE_SOURCE_DIR}/lualib/?/init.lua\;${CMAKE_SOURCE_DIR}/contrib/lua-?/?.lua"
  303. test/rspamd-test -p /rspamd/lua')
  304. # Setup PVS Studio if available
  305. include(SetupPVSStudio)
  306. SetupPVSStudio()