CMakeLists.txt 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. cmake_minimum_required(VERSION 3.19)
  2. project(soft_bus LANGUAGES CXX)
  3. # ========== 基础设置 ==========
  4. set(CMAKE_CXX_STANDARD 17)
  5. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  6. set(CMAKE_AUTORCC ON)
  7. set(CMAKE_AUTOMOC ON)
  8. set(CMAKE_POSITION_INDEPENDENT_CODE ON)
  9. if(NOT CMAKE_VERBOSE_MAKEFILE)
  10. set(CMAKE_VERBOSE_MAKEFILE ON)
  11. endif()
  12. # ========== 查找 Qt6 ==========
  13. find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets SerialPort Charts)
  14. # ========== 路径与平台 ==========
  15. set(PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
  16. set(ROCKSDB_DIR "${PROJECT_ROOT}/rocksdb")
  17. set(ADS_DIR "${PROJECT_ROOT}/advanced_dock_system")
  18. if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
  19. set(PlatformDir "x86")
  20. else()
  21. set(PlatformDir "x64")
  22. endif()
  23. # ========== 是否构建 shared rocksdb(默认 false) ==========
  24. option(BUILD_ROCKSDB_SHARED "Build RocksDB as shared library instead of static" OFF)
  25. # ========== 明确 rocksdb 库路径(你已确认) ==========
  26. # 你已使用 `find rocksdb -name "librocksdb.a"` 得到 rocksdb/librocksdb.a
  27. if(WIN32)
  28. set(ROCKSDB_LIB "${ROCKSDB_DIR}/rocksdb.lib")
  29. elseif(BUILD_ROCKSDB_SHARED)
  30. set(ROCKSDB_LIB "${ROCKSDB_DIR}/librocksdb.so")
  31. else()
  32. set(ROCKSDB_LIB "${ROCKSDB_DIR}/librocksdb.a")
  33. endif()
  34. message(STATUS "Expect RocksDB lib at: ${ROCKSDB_LIB}")
  35. # ========== 如果需要,从源码构建 RocksDB(声明 OUTPUT 以让 Ninja 在链接前执行) ==========
  36. # 如果你不需要在 CMake 构建时自动触发 rocksdb 构建,可以注释掉下列 add_custom_command / add_custom_target。
  37. # 这里假定 rocksdb 的 Makefile 支持 `make static_lib`
  38. add_custom_command(
  39. OUTPUT ${ROCKSDB_LIB}
  40. COMMAND ${CMAKE_COMMAND} -E echo "Building RocksDB static library..."
  41. COMMAND make -C ${ROCKSDB_DIR} static_lib -j8
  42. WORKING_DIRECTORY ${ROCKSDB_DIR}
  43. COMMENT "Building RocksDB (static_lib)"
  44. VERBATIM
  45. )
  46. add_custom_target(BUILD_ROCKSDB_DEPENDS
  47. DEPENDS ${ROCKSDB_LIB}
  48. )
  49. # ========== ADS 子项目(若存在 CMakeLists) ==========
  50. if(EXISTS "${ADS_DIR}/src/CMakeLists.txt")
  51. add_subdirectory(${ADS_DIR}/src)
  52. else()
  53. message(STATUS "ADS CMakeLists not found at ${ADS_DIR}/src — assuming header-only or prebuilt.")
  54. endif()
  55. # ========== 源文件列表与可执行目标 ==========
  56. qt_standard_project_setup()
  57. set(SOFT_BUS_SOURCES
  58. main.cpp
  59. src/soft_bus_core/soft_bus_core.cpp
  60. src/soft_bus_core/soft_bus_core.h
  61. src/serial_manager/serial_manager.cpp
  62. src/serial_manager/serial_manager.h
  63. mainwindow.cpp
  64. mainwindow.h
  65. src/bus_tree/bus_tree.cpp
  66. src/bus_tree/bus_tree.h
  67. src/bus_tree/bus_tree.ui
  68. src/toolbar/toolbar.cpp
  69. src/toolbar/toolbar.h
  70. src/view_core/viewcore.cpp
  71. src/view_core/viewcore.h
  72. src/view_core/viewcore.ui
  73. src/view_serial/viewserial.cpp
  74. src/view_serial/viewserial.h
  75. src/view_serial/viewserial.ui
  76. src/view_serial/serialtree.ui
  77. src/my_dock_manager/mdockmanager.cpp
  78. src/my_dock_manager/mdockmanager.h
  79. resource.qrc
  80. )
  81. qt_add_executable(soft_bus
  82. WIN32 MACOSX_BUNDLE
  83. ${SOFT_BUS_SOURCES}
  84. )
  85. # soft_bus 依赖 rocksdb 构建(如果你希望手动管理 rocksdb 构建,可删除这行)
  86. add_dependencies(soft_bus BUILD_ROCKSDB_DEPENDS)
  87. # ========== 包含目录 ==========
  88. target_include_directories(soft_bus PRIVATE
  89. ${ROCKSDB_DIR}/include
  90. ${PROJECT_ROOT}/src
  91. ${ADS_DIR}/src
  92. )
  93. # ========== 查找并链接系统与压缩库(RocksDB 依赖) ==========
  94. find_package(ZLIB REQUIRED)
  95. if(ZLIB_FOUND)
  96. message(STATUS "Found ZLIB: ${ZLIB_LIBRARY} (includes ${ZLIB_INCLUDE_DIR})")
  97. endif()
  98. find_package(Snappy QUIET)
  99. if(Snappy_FOUND)
  100. message(STATUS "Found Snappy")
  101. endif()
  102. find_package(LZ4 QUIET)
  103. if(TARGET LZ4::LZ4 OR LZ4_FOUND)
  104. message(STATUS "Found LZ4")
  105. endif()
  106. find_package(ZSTD QUIET)
  107. if(TARGET ZSTD::ZSTD OR ZSTD_FOUND)
  108. message(STATUS "Found ZSTD")
  109. endif()
  110. find_package(BZip2 QUIET)
  111. if(BZIP2_FOUND)
  112. message(STATUS "Found BZip2")
  113. endif()
  114. find_package(Threads REQUIRED)
  115. # 收集额外压缩库(顺序重要:静态库之后列出依赖库)
  116. set(EXTRA_COMPRESSION_LIBS "")
  117. if(Snappy_FOUND)
  118. list(APPEND EXTRA_COMPRESSION_LIBS Snappy::snappy)
  119. endif()
  120. if(TARGET LZ4::LZ4)
  121. list(APPEND EXTRA_COMPRESSION_LIBS LZ4::LZ4)
  122. elseif(LZ4_FOUND)
  123. list(APPEND EXTRA_COMPRESSION_LIBS lz4)
  124. endif()
  125. if(TARGET ZSTD::ZSTD)
  126. list(APPEND EXTRA_COMPRESSION_LIBS ZSTD::ZSTD)
  127. elseif(ZSTD_FOUND)
  128. list(APPEND EXTRA_COMPRESSION_LIBS zstd)
  129. endif()
  130. if(BZIP2_FOUND)
  131. list(APPEND EXTRA_COMPRESSION_LIBS BZip2::BZip2)
  132. endif()
  133. # dl & threads
  134. list(APPEND EXTRA_COMPRESSION_LIBS ${CMAKE_DL_LIBS} Threads::Threads)
  135. message(STATUS "Extra compression/libs to link: ${EXTRA_COMPRESSION_LIBS}")
  136. # ========== 链接库(先 rocksdb 静态库,然后其依赖库,最后 Qt 库) ==========
  137. target_link_libraries(soft_bus
  138. PRIVATE
  139. ${ROCKSDB_LIB}
  140. ${EXTRA_COMPRESSION_LIBS}
  141. ZLIB::ZLIB
  142. Qt6::Core
  143. Qt6::Widgets
  144. Qt6::SerialPort
  145. Qt6::Charts
  146. )
  147. # 如果 ADS 提供 CMake 目标则优先链接
  148. if(TARGET ads::qtadvanceddocking-qt6)
  149. target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt6)
  150. elseif(TARGET ads::qtadvanceddocking-qt5)
  151. target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt5)
  152. endif()
  153. # ========== 编译选项 ==========
  154. target_compile_definitions(soft_bus PRIVATE $<$<CONFIG:DEBUG>:DEBUG_BUILD>)
  155. if(MSVC)
  156. target_compile_options(soft_bus PRIVATE /W4 /permissive-)
  157. else()
  158. target_compile_options(soft_bus PRIVATE -Wall -Wextra -Wpedantic)
  159. endif()
  160. # ========== 安装/部署 ==========
  161. include(GNUInstallDirs)
  162. install(TARGETS soft_bus
  163. BUNDLE DESTINATION .
  164. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  165. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  166. )
  167. qt_generate_deploy_app_script(
  168. TARGET soft_bus
  169. OUTPUT_SCRIPT deploy_script
  170. NO_UNSUPPORTED_PLATFORM_ERROR
  171. )
  172. install(SCRIPT ${deploy_script})
  173. # ========== rocksdb 清理目标(可选) ==========
  174. add_custom_target(rocksdb_clean
  175. COMMAND ${CMAKE_COMMAND} -E echo "Cleaning RocksDB build artifacts..."
  176. COMMAND make -C ${ROCKSDB_DIR} clean
  177. WORKING_DIRECTORY ${ROCKSDB_DIR}
  178. COMMENT "rocksdb clean"
  179. )
  180. # ========== 配置摘要 ==========
  181. message(STATUS "Project root: ${PROJECT_ROOT}")
  182. message(STATUS "RocksDB dir: ${ROCKSDB_DIR}")
  183. message(STATUS "Expect RocksDB lib at: ${ROCKSDB_LIB}")
  184. message(STATUS "Extra compression libs: ${EXTRA_COMPRESSION_LIBS}")