aboutsummaryrefslogtreecommitdiffstats
path: root/src/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'src/CMakeLists.txt')
-rw-r--r--src/CMakeLists.txt532
1 files changed, 286 insertions, 246 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 92edb0b6a..6cc49e4e4 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,246 +1,286 @@
-MACRO(_AddModulesForced MLIST)
-# Generate unique string for this build
- SET(MODULES_C "${CMAKE_CURRENT_BINARY_DIR}/modules.c")
- FILE(WRITE "${MODULES_C}"
- "#include \"rspamd.h\"\n")
-
- # Handle even old cmake
- LIST(LENGTH ${MLIST} MLIST_COUNT)
- MATH(EXPR MLIST_MAX ${MLIST_COUNT}-1)
-
- FOREACH(MOD_IDX RANGE ${MLIST_MAX})
- LIST(GET ${MLIST} ${MOD_IDX} MOD)
- FILE(APPEND "${MODULES_C}" "extern module_t ${MOD}_module;\n")
- ENDFOREACH(MOD_IDX RANGE ${MLIST_MAX})
-
- FILE(APPEND "${MODULES_C}" "\n\nmodule_t *modules[] = {\n")
-
- FOREACH(MOD_IDX RANGE ${MLIST_MAX})
- LIST(GET ${MLIST} ${MOD_IDX} MOD)
- FILE(APPEND "${MODULES_C}" "&${MOD}_module,\n")
- ENDFOREACH(MOD_IDX RANGE ${MLIST_MAX})
-
- FILE(APPEND "${MODULES_C}" "NULL\n};\n")
-ENDMACRO(_AddModulesForced MLIST)
-
-MACRO(_AddWorkersForced WLIST)
- SET(WORKERS_C "${CMAKE_CURRENT_BINARY_DIR}/workers.c")
- FILE(WRITE "${WORKERS_C}"
- "#include \"rspamd.h\"\n")
-
- # Handle even old cmake
- LIST(LENGTH ${WLIST} WLIST_COUNT)
- MATH(EXPR WLIST_MAX ${WLIST_COUNT}-1)
- FOREACH(MOD_IDX RANGE ${WLIST_MAX})
- LIST(GET ${WLIST} ${MOD_IDX} WRK)
- FILE(APPEND "${WORKERS_C}" "extern worker_t ${WRK}_worker;\n")
- ENDFOREACH(MOD_IDX RANGE ${WLIST_MAX})
-
- FILE(APPEND "${WORKERS_C}" "\n\nworker_t *workers[] = {\n")
-
- FOREACH(MOD_IDX RANGE ${WLIST_MAX})
- LIST(GET ${WLIST} ${MOD_IDX} WRK)
- FILE(APPEND "${WORKERS_C}" "&${WRK}_worker,\n")
- ENDFOREACH(MOD_IDX RANGE ${WLIST_MAX})
- FILE(APPEND "${WORKERS_C}" "NULL\n};\n")
-ENDMACRO(_AddWorkersForced WLIST)
-
-MACRO(AddModules MLIST WLIST)
- _AddModulesForced(${MLIST})
- _AddWorkersForced(${WLIST})
- #IF(NOT EXISTS "modules.c")
- # _AddModulesForced(${MLIST} ${WLIST})
- #ELSE(NOT EXISTS "modules.c")
- # FILE(STRINGS "modules.c" FILE_ID_RAW REGEX "^/.*[a-zA-Z0-9]+.*/$")
- # STRING(REGEX MATCH "[a-zA-Z0-9]+" FILE_ID "${FILE_ID_RAW}")
- # IF(NOT FILE_ID STREQUAL MODULES_ID)
- # MESSAGE("Regenerate modules info")
- # _AddModulesForced(${MLIST} ${WLIST})
- # ENDIF(NOT FILE_ID STREQUAL MODULES_ID)
- #ENDIF(NOT EXISTS "modules.c")
-ENDMACRO(AddModules MLIST WLIST)
-
-# Rspamd core components
-IF (ENABLE_CLANG_PLUGIN MATCHES "ON")
- SET(CMAKE_C_FLAGS
- "${CMAKE_C_FLAGS} -Xclang -load -Xclang ${CMAKE_CURRENT_BINARY_DIR}/../clang-plugin/librspamd-clang${CMAKE_SHARED_LIBRARY_SUFFIX} -Xclang -add-plugin -Xclang rspamd-ast")
- IF(CLANG_EXTRA_PLUGINS_LIBS)
- FOREACH(_lib ${CLANG_EXTRA_PLUGINS_LIBS})
- SET(CMAKE_C_FLAGS
- "${CMAKE_C_FLAGS} -Xclang -load -Xclang ${_lib}")
- SET(CMAKE_CXX_FLAGS
- "${CMAKE_CXX_FLAGS} -Xclang -load -Xclang ${_lib}")
- ENDFOREACH()
- ENDIF()
- IF(CLANG_EXTRA_PLUGINS)
- FOREACH(_plug ${CLANG_EXTRA_PLUGINS})
- SET(CMAKE_C_FLAGS
- "${CMAKE_C_FLAGS} -Xclang -add-plugin -Xclang ${_plug}")
- SET(CMAKE_CXX_FLAGS
- "${CMAKE_C_FLAGS} -Xclang -add-plugin -Xclang ${_plug}")
- ENDFOREACH()
- ENDIF()
-ENDIF ()
-
-ADD_SUBDIRECTORY(lua)
-ADD_SUBDIRECTORY(libcryptobox)
-ADD_SUBDIRECTORY(libutil)
-ADD_SUBDIRECTORY(libserver)
-ADD_SUBDIRECTORY(libmime)
-ADD_SUBDIRECTORY(libstat)
-ADD_SUBDIRECTORY(client)
-ADD_SUBDIRECTORY(rspamadm)
-
-SET(RSPAMDSRC controller.c
- fuzzy_storage.c
- rspamd.c
- worker.c
- rspamd_proxy.c)
-
-SET(PLUGINSSRC plugins/regexp.c
- plugins/chartable.cxx
- plugins/fuzzy_check.c
- plugins/dkim_check.c
- libserver/rspamd_control.c)
-
-SET(MODULES_LIST regexp chartable fuzzy_check dkim)
-SET(WORKERS_LIST normal controller fuzzy rspamd_proxy)
-IF (ENABLE_HYPERSCAN MATCHES "ON")
- LIST(APPEND WORKERS_LIST "hs_helper")
- LIST(APPEND RSPAMDSRC "hs_helper.c")
-ENDIF()
-
-AddModules(MODULES_LIST WORKERS_LIST)
-LIST(LENGTH PLUGINSSRC RSPAMD_MODULES_NUM)
-
-SET(RAGEL_DEPENDS "${CMAKE_SOURCE_DIR}/src/ragel/smtp_address.rl"
- "${CMAKE_SOURCE_DIR}/src/ragel/smtp_date.rl"
- "${CMAKE_SOURCE_DIR}/src/ragel/smtp_ip.rl"
- "${CMAKE_SOURCE_DIR}/src/ragel/smtp_base.rl"
- "${CMAKE_SOURCE_DIR}/src/ragel/content_disposition.rl")
-RAGEL_TARGET(ragel_smtp_addr
- INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/smtp_addr_parser.rl
- DEPENDS ${RAGEL_DEPENDS}
- COMPILE_FLAGS -T1
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smtp_addr_parser.rl.c)
-RAGEL_TARGET(ragel_content_disposition
- INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/content_disposition_parser.rl
- DEPENDS ${RAGEL_DEPENDS}
- COMPILE_FLAGS -G2
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/content_disposition.rl.c)
-RAGEL_TARGET(ragel_rfc2047
- INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/rfc2047_parser.rl
- DEPENDS ${RAGEL_DEPENDS}
- COMPILE_FLAGS -G2
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/rfc2047.rl.c)
-RAGEL_TARGET(ragel_smtp_date
- INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/smtp_date_parser.rl
- DEPENDS ${RAGEL_DEPENDS}
- COMPILE_FLAGS -G2
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/date_parser.rl.c)
-RAGEL_TARGET(ragel_smtp_ip
- INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/smtp_ip_parser.rl
- DEPENDS ${RAGEL_DEPENDS}
- COMPILE_FLAGS -G2
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ip_parser.rl.c)
-# Fucking cmake...
-FOREACH(_GEN ${LIBSERVER_GENERATED})
- set_source_files_properties(${_GEN} PROPERTIES GENERATED TRUE)
-ENDFOREACH()
-######################### LINK SECTION ###############################
-
-IF(ENABLE_STATIC MATCHES "ON")
- ADD_LIBRARY(rspamd-server STATIC
- ${RSPAMD_CRYPTOBOX}
- ${RSPAMD_UTIL}
- ${RSPAMD_LUA}
- ${RSPAMD_SERVER}
- ${RSPAMD_STAT}
- ${RSPAMD_MIME}
- ${CMAKE_CURRENT_BINARY_DIR}/modules.c
- ${PLUGINSSRC}
- "${RAGEL_ragel_smtp_addr_OUTPUTS}"
- "${RAGEL_ragel_newlines_strip_OUTPUTS}"
- "${RAGEL_ragel_content_type_OUTPUTS}"
- "${RAGEL_ragel_content_disposition_OUTPUTS}"
- "${RAGEL_ragel_rfc2047_OUTPUTS}"
- "${RAGEL_ragel_smtp_date_OUTPUTS}"
- "${RAGEL_ragel_smtp_ip_OUTPUTS}"
- ${BACKWARD_ENABLE})
-ELSE()
- ADD_LIBRARY(rspamd-server SHARED
- ${RSPAMD_CRYPTOBOX}
- ${RSPAMD_UTIL}
- ${RSPAMD_SERVER}
- ${RSPAMD_STAT}
- ${RSPAMD_MIME}
- ${RSPAMD_LUA}
- ${CMAKE_CURRENT_BINARY_DIR}/modules.c
- ${PLUGINSSRC}
- "${RAGEL_ragel_smtp_addr_OUTPUTS}"
- "${RAGEL_ragel_newlines_strip_OUTPUTS}"
- "${RAGEL_ragel_content_type_OUTPUTS}"
- "${RAGEL_ragel_content_disposition_OUTPUTS}"
- "${RAGEL_ragel_rfc2047_OUTPUTS}"
- "${RAGEL_ragel_smtp_date_OUTPUTS}"
- "${RAGEL_ragel_smtp_ip_OUTPUTS}"
- ${BACKWARD_ENABLE})
-ENDIF()
-
-FOREACH(_DEP ${LIBSERVER_DEPENDS})
- ADD_DEPENDENCIES(rspamd-server "${_DEP}")
-ENDFOREACH()
-
-TARGET_LINK_LIBRARIES(rspamd-server rspamd-http-parser)
-TARGET_LINK_LIBRARIES(rspamd-server rspamd-fpconv)
-TARGET_LINK_LIBRARIES(rspamd-server rspamd-cdb)
-TARGET_LINK_LIBRARIES(rspamd-server rspamd-lpeg)
-TARGET_LINK_LIBRARIES(rspamd-server lcbtrie)
-IF(SYSTEM_ZSTD MATCHES "OFF")
- TARGET_LINK_LIBRARIES(rspamd-server rspamd-zstd)
-ELSE()
- TARGET_LINK_LIBRARIES(rspamd-server zstd)
-ENDIF()
-TARGET_LINK_LIBRARIES(rspamd-server rspamd-simdutf)
-
-IF (ENABLE_CLANG_PLUGIN MATCHES "ON")
- ADD_DEPENDENCIES(rspamd-server rspamd-clang)
-ENDIF()
-
-IF (NOT WITH_LUAJIT)
- TARGET_LINK_LIBRARIES(rspamd-server rspamd-bit)
-ENDIF()
-
-IF (ENABLE_SNOWBALL MATCHES "ON")
- TARGET_LINK_LIBRARIES(rspamd-server stemmer)
-ENDIF()
-TARGET_LINK_LIBRARIES(rspamd-server rspamd-hiredis)
-
-IF (ENABLE_FANN MATCHES "ON")
- TARGET_LINK_LIBRARIES(rspamd-server fann)
-ENDIF ()
-
-IF (ENABLE_HYPERSCAN MATCHES "ON")
- TARGET_LINK_LIBRARIES(rspamd-server hs)
-ENDIF()
-
-IF(WITH_BLAS)
- TARGET_LINK_LIBRARIES(rspamd-server ${BLAS_REQUIRED_LIBRARIES})
-ENDIF()
-
-TARGET_LINK_LIBRARIES(rspamd-server ${RSPAMD_REQUIRED_LIBRARIES})
-ADD_BACKWARD(rspamd-server)
-
-ADD_EXECUTABLE(rspamd ${RSPAMDSRC} ${CMAKE_CURRENT_BINARY_DIR}/workers.c ${CMAKE_CURRENT_BINARY_DIR}/config.h)
-ADD_BACKWARD(rspamd)
-SET_TARGET_PROPERTIES(rspamd PROPERTIES LINKER_LANGUAGE CXX)
-SET_TARGET_PROPERTIES(rspamd-server PROPERTIES LINKER_LANGUAGE CXX)
-IF(NOT NO_TARGET_VERSIONS)
- SET_TARGET_PROPERTIES(rspamd PROPERTIES VERSION ${RSPAMD_VERSION})
-ENDIF()
-
-#TARGET_LINK_LIBRARIES(rspamd ${RSPAMD_REQUIRED_LIBRARIES})
-TARGET_LINK_LIBRARIES(rspamd rspamd-server)
-
-INSTALL(TARGETS rspamd RUNTIME DESTINATION bin)
-INSTALL(TARGETS rspamd-server LIBRARY DESTINATION ${RSPAMD_LIBDIR}) \ No newline at end of file
+# Function to generate module registrations
+function(generate_modules_list MODULE_LIST)
+ # Generate unique string for this build
+ set(MODULES_C "${CMAKE_CURRENT_BINARY_DIR}/modules.c")
+ file(WRITE "${MODULES_C}"
+ "#include \"rspamd.h\"\n")
+
+ # Process each module
+ foreach (MOD IN LISTS ${MODULE_LIST})
+ file(APPEND "${MODULES_C}" "extern module_t ${MOD}_module;\n")
+ endforeach ()
+
+ file(APPEND "${MODULES_C}" "\n\nmodule_t *modules[] = {\n")
+
+ foreach (MOD IN LISTS ${MODULE_LIST})
+ file(APPEND "${MODULES_C}" "&${MOD}_module,\n")
+ endforeach ()
+
+ file(APPEND "${MODULES_C}" "NULL\n};\n")
+
+ # Return the generated file path
+ set(MODULES_C_PATH "${MODULES_C}" PARENT_SCOPE)
+endfunction()
+
+# Function to generate worker registrations
+function(generate_workers_list WORKER_LIST)
+ set(WORKERS_C "${CMAKE_CURRENT_BINARY_DIR}/workers.c")
+ file(WRITE "${WORKERS_C}"
+ "#include \"rspamd.h\"\n")
+
+ # Process each worker
+ foreach (WRK IN LISTS ${WORKER_LIST})
+ file(APPEND "${WORKERS_C}" "extern worker_t ${WRK}_worker;\n")
+ endforeach ()
+
+ file(APPEND "${WORKERS_C}" "\n\nworker_t *workers[] = {\n")
+
+ foreach (WRK IN LISTS ${WORKER_LIST})
+ file(APPEND "${WORKERS_C}" "&${WRK}_worker,\n")
+ endforeach ()
+
+ file(APPEND "${WORKERS_C}" "NULL\n};\n")
+
+ # Return the generated file path
+ set(WORKERS_C_PATH "${WORKERS_C}" PARENT_SCOPE)
+endfunction()
+
+# Function to generate both modules and workers
+function(generate_registration_code MODULE_LIST WORKER_LIST)
+ generate_modules_list(${MODULE_LIST})
+ generate_workers_list(${WORKER_LIST})
+
+ # Set parent scope variables
+ set(MODULES_C_PATH ${MODULES_C_PATH} PARENT_SCOPE)
+ set(WORKERS_C_PATH ${WORKERS_C_PATH} PARENT_SCOPE)
+endfunction()
+
+# Configure Clang Plugin if enabled
+if (ENABLE_CLANG_PLUGIN)
+ set(CLANG_PLUGIN_FLAGS "-Xclang -load -Xclang ${CMAKE_CURRENT_BINARY_DIR}/../clang-plugin/librspamd-clang${CMAKE_SHARED_LIBRARY_SUFFIX} -Xclang -add-plugin -Xclang rspamd-ast")
+
+ # Apply to both C and C++ compiler flags
+ add_compile_options(${CLANG_PLUGIN_FLAGS})
+
+ # Add any extra clang plugins
+ if (CLANG_EXTRA_PLUGINS_LIBS)
+ foreach (lib ${CLANG_EXTRA_PLUGINS_LIBS})
+ add_compile_options("-Xclang" "-load" "-Xclang" "${lib}")
+ endforeach ()
+ endif ()
+
+ if (CLANG_EXTRA_PLUGINS)
+ foreach (plug ${CLANG_EXTRA_PLUGINS})
+ add_compile_options("-Xclang" "-add-plugin" "-Xclang" "${plug}")
+ endforeach ()
+ endif ()
+endif ()
+
+# Add subdirectories for components
+add_subdirectory(lua)
+add_subdirectory(libcryptobox)
+add_subdirectory(libutil)
+add_subdirectory(libserver)
+add_subdirectory(libmime)
+add_subdirectory(libstat)
+add_subdirectory(client)
+add_subdirectory(rspamadm)
+
+# Define source files
+set(RSPAMD_SOURCES
+ controller.c
+ fuzzy_storage.c
+ rspamd.c
+ worker.c
+ rspamd_proxy.c)
+
+set(PLUGIN_SOURCES
+ plugins/regexp.c
+ plugins/chartable.cxx
+ plugins/fuzzy_check.c
+ plugins/dkim_check.c
+ libserver/rspamd_control.c)
+
+# Define module and worker lists
+set(MODULES_LIST regexp chartable fuzzy_check dkim)
+set(WORKERS_LIST normal controller fuzzy rspamd_proxy)
+
+# Add hyperscan worker if enabled
+if (ENABLE_HYPERSCAN)
+ list(APPEND WORKERS_LIST hs_helper)
+ list(APPEND RSPAMD_SOURCES hs_helper.c)
+endif ()
+
+# Generate modules and workers registration code
+generate_registration_code(MODULES_LIST WORKERS_LIST)
+
+# Count the number of modules
+list(LENGTH PLUGIN_SOURCES RSPAMD_MODULES_NUM)
+
+# Configure Ragel for parsers
+set(RAGEL_DEPENDS
+ "${CMAKE_SOURCE_DIR}/src/ragel/smtp_address.rl"
+ "${CMAKE_SOURCE_DIR}/src/ragel/smtp_date.rl"
+ "${CMAKE_SOURCE_DIR}/src/ragel/smtp_ip.rl"
+ "${CMAKE_SOURCE_DIR}/src/ragel/smtp_base.rl"
+ "${CMAKE_SOURCE_DIR}/src/ragel/content_disposition.rl")
+
+# Generate parsers with Ragel
+ragel_target(ragel_smtp_addr
+ INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/smtp_addr_parser.rl
+ DEPENDS ${RAGEL_DEPENDS}
+ COMPILE_FLAGS -T1
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/smtp_addr_parser.rl.c)
+
+ragel_target(ragel_content_disposition
+ INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/content_disposition_parser.rl
+ DEPENDS ${RAGEL_DEPENDS}
+ COMPILE_FLAGS -G2
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/content_disposition.rl.c)
+
+ragel_target(ragel_rfc2047
+ INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/rfc2047_parser.rl
+ DEPENDS ${RAGEL_DEPENDS}
+ COMPILE_FLAGS -G2
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/rfc2047.rl.c)
+
+ragel_target(ragel_smtp_date
+ INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/smtp_date_parser.rl
+ DEPENDS ${RAGEL_DEPENDS}
+ COMPILE_FLAGS -G2
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/date_parser.rl.c)
+
+ragel_target(ragel_smtp_ip
+ INPUTS ${CMAKE_SOURCE_DIR}/src/ragel/smtp_ip_parser.rl
+ DEPENDS ${RAGEL_DEPENDS}
+ COMPILE_FLAGS -G2
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ip_parser.rl.c)
+
+# Mark generated files correctly
+foreach (_gen ${LIBSERVER_GENERATED})
+ set_source_files_properties(${_gen} PROPERTIES GENERATED TRUE)
+endforeach ()
+
+# Collection of all generated Ragel outputs
+set(RAGEL_OUTPUTS
+ ${RAGEL_ragel_smtp_addr_OUTPUTS}
+ ${RAGEL_ragel_newlines_strip_OUTPUTS}
+ ${RAGEL_ragel_content_type_OUTPUTS}
+ ${RAGEL_ragel_content_disposition_OUTPUTS}
+ ${RAGEL_ragel_rfc2047_OUTPUTS}
+ ${RAGEL_ragel_smtp_date_OUTPUTS}
+ ${RAGEL_ragel_smtp_ip_OUTPUTS})
+
+# Common sources for rspamd-server
+set(SERVER_COMMON_SOURCES
+ ${RSPAMD_CRYPTOBOX}
+ ${RSPAMD_UTIL}
+ ${RSPAMD_LUA}
+ ${RSPAMD_SERVER}
+ ${RSPAMD_STAT}
+ ${RSPAMD_MIME}
+ ${MODULES_C_PATH}
+ ${PLUGIN_SOURCES}
+ ${RAGEL_OUTPUTS}
+ ${BACKWARD_ENABLE})
+
+# Build rspamd-server as static or shared library based on configuration
+if (ENABLE_STATIC)
+ add_library(rspamd-server STATIC ${SERVER_COMMON_SOURCES})
+else ()
+ add_library(rspamd-server SHARED ${SERVER_COMMON_SOURCES})
+endif ()
+
+# Set dependencies for rspamd-server
+foreach (_dep ${LIBSERVER_DEPENDS})
+ add_dependencies(rspamd-server "${_dep}")
+endforeach ()
+
+# Link dependencies
+target_link_libraries(rspamd-server
+ PRIVATE
+ rspamd-http-parser
+ rspamd-fpconv
+ rspamd-cdb
+ rspamd-lpeg
+ ottery
+ lcbtrie
+ rspamd-simdutf
+ rdns
+ ucl)
+
+# Handle xxhash dependency
+if (SYSTEM_XXHASH)
+ target_link_libraries(rspamd-server PUBLIC xxhash)
+else ()
+ target_link_libraries(rspamd-server PUBLIC rspamd-xxhash)
+endif ()
+
+# Handle zstd dependency
+if (SYSTEM_ZSTD)
+ target_link_libraries(rspamd-server PUBLIC zstd)
+else ()
+ target_link_libraries(rspamd-server PRIVATE rspamd-zstd)
+endif ()
+
+# Handle clang plugin dependency
+if (ENABLE_CLANG_PLUGIN)
+ add_dependencies(rspamd-server rspamd-clang)
+endif ()
+
+# Handle Lua JIT/Lua dependency
+if (NOT WITH_LUAJIT)
+ target_link_libraries(rspamd-server PRIVATE rspamd-bit)
+endif ()
+
+# Link additional optional dependencies
+if (ENABLE_SNOWBALL)
+ target_link_libraries(rspamd-server PRIVATE stemmer)
+endif ()
+
+target_link_libraries(rspamd-server PRIVATE rspamd-hiredis)
+
+if (ENABLE_FANN)
+ target_link_libraries(rspamd-server PRIVATE fann)
+endif ()
+
+if (ENABLE_HYPERSCAN)
+ target_link_libraries(rspamd-server PUBLIC hs)
+endif ()
+
+if (WITH_BLAS)
+ target_link_libraries(rspamd-server PRIVATE ${BLAS_REQUIRED_LIBRARIES})
+endif ()
+
+# Link all required system libraries
+target_link_libraries(rspamd-server PUBLIC ${RSPAMD_REQUIRED_LIBRARIES})
+
+# Add Backward support for stacktrace
+add_backward(rspamd-server)
+
+# Build main rspamd executable
+add_executable(rspamd
+ ${RSPAMD_SOURCES}
+ ${WORKERS_C_PATH}
+ ${CMAKE_CURRENT_BINARY_DIR}/config.h)
+
+# Configure rspamd executable
+add_backward(rspamd)
+set_target_properties(rspamd PROPERTIES LINKER_LANGUAGE CXX)
+set_target_properties(rspamd-server PROPERTIES LINKER_LANGUAGE CXX)
+
+if (NOT NO_TARGET_VERSIONS)
+ set_target_properties(rspamd PROPERTIES VERSION ${RSPAMD_VERSION})
+endif ()
+
+# Link rspamd executable with the server library
+target_link_libraries(rspamd PRIVATE rspamd-server)
+
+# Install targets
+install(TARGETS rspamd
+ RUNTIME
+ DESTINATION bin)
+
+install(TARGETS rspamd-server
+ LIBRARY
+ DESTINATION ${RSPAMD_LIBDIR})