CMakeLists.txt 5.7 KB

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