CMakeLists.txt 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. cmake_minimum_required(VERSION 3.22)
  2. cmake_policy(SET CMP0135 NEW)
  3. project(smartbotic-crm
  4. VERSION 0.1.0
  5. DESCRIPTION "SmartBotic CRM System"
  6. LANGUAGES CXX
  7. )
  8. # C++20 standard
  9. set(CMAKE_CXX_STANDARD 20)
  10. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  11. set(CMAKE_CXX_EXTENSIONS OFF)
  12. # Export compile commands for tooling
  13. set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  14. # Build options
  15. option(BUILD_TESTING "Build tests" ON)
  16. option(ENABLE_SANITIZERS "Enable address and undefined behavior sanitizers" OFF)
  17. # Compiler warnings - applied only to project targets, not dependencies
  18. set(SMARTBOTIC_CXX_WARNINGS
  19. -Wall
  20. -Wextra
  21. -Wpedantic
  22. -Werror
  23. -Wno-unused-parameter
  24. -Wno-dangling-reference # False positive in spdlog's bundled fmt with GCC 13+
  25. )
  26. # Sanitizers for debug builds
  27. if(ENABLE_SANITIZERS)
  28. add_compile_options(-fsanitize=address,undefined)
  29. add_link_options(-fsanitize=address,undefined)
  30. endif()
  31. # Include FetchContent module
  32. include(FetchContent)
  33. # ============================================================================
  34. # External Dependencies via FetchContent
  35. # ============================================================================
  36. # spdlog - Fast C++ logging library
  37. FetchContent_Declare(
  38. spdlog
  39. GIT_REPOSITORY https://github.com/gabime/spdlog.git
  40. GIT_TAG v1.13.0
  41. )
  42. # nlohmann_json - JSON for Modern C++
  43. FetchContent_Declare(
  44. nlohmann_json
  45. GIT_REPOSITORY https://github.com/nlohmann/json.git
  46. GIT_TAG v3.11.3
  47. )
  48. # yaml-cpp - YAML parser library
  49. FetchContent_Declare(
  50. yaml-cpp
  51. GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
  52. GIT_TAG 0.8.0
  53. )
  54. # gRPC and Protobuf
  55. FetchContent_Declare(
  56. grpc
  57. GIT_REPOSITORY https://github.com/grpc/grpc.git
  58. GIT_TAG v1.60.0
  59. GIT_SHALLOW TRUE
  60. )
  61. # libsodium - Cryptography library
  62. FetchContent_Declare(
  63. libsodium
  64. GIT_REPOSITORY https://github.com/jedisct1/libsodium.git
  65. GIT_TAG 1.0.19
  66. )
  67. # Boost - For Beast HTTP/WebSocket library
  68. FetchContent_Declare(
  69. Boost
  70. URL https://github.com/boostorg/boost/releases/download/boost-1.86.0/boost-1.86.0-cmake.tar.xz
  71. URL_HASH SHA256=2c5ec5edcdff47ff55e27ed9560b0a0b94b07bd07ed9928b476150e16b0efc57
  72. DOWNLOAD_EXTRACT_TIMESTAMP TRUE
  73. )
  74. # Make dependencies available
  75. message(STATUS "Fetching spdlog...")
  76. FetchContent_MakeAvailable(spdlog)
  77. message(STATUS "Fetching nlohmann_json...")
  78. FetchContent_MakeAvailable(nlohmann_json)
  79. message(STATUS "Fetching yaml-cpp...")
  80. set(YAML_CPP_BUILD_TESTS OFF CACHE BOOL "" FORCE)
  81. set(YAML_CPP_BUILD_TOOLS OFF CACHE BOOL "" FORCE)
  82. set(YAML_CPP_BUILD_CONTRIB OFF CACHE BOOL "" FORCE)
  83. FetchContent_MakeAvailable(yaml-cpp)
  84. message(STATUS "Fetching gRPC (this may take a while)...")
  85. set(gRPC_BUILD_TESTS OFF CACHE BOOL "" FORCE)
  86. set(gRPC_INSTALL OFF CACHE BOOL "" FORCE)
  87. set(gRPC_BUILD_GRPC_CSHARP_PLUGIN OFF CACHE BOOL "" FORCE)
  88. set(gRPC_BUILD_GRPC_NODE_PLUGIN OFF CACHE BOOL "" FORCE)
  89. set(gRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN OFF CACHE BOOL "" FORCE)
  90. set(gRPC_BUILD_GRPC_PHP_PLUGIN OFF CACHE BOOL "" FORCE)
  91. set(gRPC_BUILD_GRPC_PYTHON_PLUGIN OFF CACHE BOOL "" FORCE)
  92. set(gRPC_BUILD_GRPC_RUBY_PLUGIN OFF CACHE BOOL "" FORCE)
  93. set(ABSL_ENABLE_INSTALL OFF CACHE BOOL "" FORCE)
  94. set(ABSL_PROPAGATE_CXX_STD ON CACHE BOOL "" FORCE)
  95. set(protobuf_INSTALL OFF CACHE BOOL "" FORCE)
  96. set(utf8_range_ENABLE_INSTALL OFF CACHE BOOL "" FORCE)
  97. # Disable -Werror for gRPC and its dependencies (abseil uses __int128 which triggers -Wpedantic)
  98. set(CMAKE_CXX_FLAGS_BACKUP "${CMAKE_CXX_FLAGS}")
  99. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-pedantic -Wno-overflow -Wno-error")
  100. FetchContent_MakeAvailable(grpc)
  101. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_BACKUP}")
  102. message(STATUS "Fetching Boost...")
  103. set(BOOST_INCLUDE_LIBRARIES beast asio system)
  104. set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
  105. set(CMAKE_CXX_FLAGS_BACKUP2 "${CMAKE_CXX_FLAGS}")
  106. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error")
  107. FetchContent_MakeAvailable(Boost)
  108. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS_BACKUP2}")
  109. # libsodium requires special handling as it uses autotools
  110. FetchContent_GetProperties(libsodium)
  111. if(NOT libsodium_POPULATED)
  112. FetchContent_Populate(libsodium)
  113. # Build libsodium using autotools
  114. execute_process(
  115. COMMAND ${libsodium_SOURCE_DIR}/configure
  116. --prefix=${libsodium_BINARY_DIR}/install
  117. --disable-shared
  118. --enable-static
  119. WORKING_DIRECTORY ${libsodium_SOURCE_DIR}
  120. RESULT_VARIABLE SODIUM_CONFIGURE_RESULT
  121. )
  122. if(NOT SODIUM_CONFIGURE_RESULT EQUAL 0)
  123. message(WARNING "libsodium configure failed, will try system libsodium")
  124. find_package(PkgConfig REQUIRED)
  125. pkg_check_modules(SODIUM REQUIRED libsodium)
  126. else()
  127. execute_process(
  128. COMMAND make -j${CMAKE_BUILD_PARALLEL_LEVEL}
  129. WORKING_DIRECTORY ${libsodium_SOURCE_DIR}
  130. )
  131. execute_process(
  132. COMMAND make install
  133. WORKING_DIRECTORY ${libsodium_SOURCE_DIR}
  134. )
  135. set(SODIUM_INCLUDE_DIRS ${libsodium_BINARY_DIR}/install/include)
  136. set(SODIUM_LIBRARY_DIRS ${libsodium_BINARY_DIR}/install/lib)
  137. set(SODIUM_LIBRARIES sodium)
  138. endif()
  139. endif()
  140. # Create imported target for libsodium
  141. add_library(sodium STATIC IMPORTED GLOBAL)
  142. set_target_properties(sodium PROPERTIES
  143. IMPORTED_LOCATION ${SODIUM_LIBRARY_DIRS}/libsodium.a
  144. INTERFACE_INCLUDE_DIRECTORIES ${SODIUM_INCLUDE_DIRS}
  145. )
  146. # ============================================================================
  147. # Project Subdirectories
  148. # ============================================================================
  149. add_subdirectory(common)
  150. add_subdirectory(proto)
  151. add_subdirectory(database)
  152. add_subdirectory(webserver)
  153. add_subdirectory(webui)
  154. if(BUILD_TESTING)
  155. add_subdirectory(tests)
  156. endif()
  157. # ============================================================================
  158. # Summary
  159. # ============================================================================
  160. message(STATUS "")
  161. message(STATUS "SmartBotic CRM Configuration Summary")
  162. message(STATUS "=====================================")
  163. message(STATUS "Version: ${PROJECT_VERSION}")
  164. message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}")
  165. message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}")
  166. message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
  167. message(STATUS "Build Testing: ${BUILD_TESTING}")
  168. message(STATUS "Sanitizers: ${ENABLE_SANITIZERS}")
  169. message(STATUS "")