| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- cmake_minimum_required(VERSION 3.19)
- project(soft_bus LANGUAGES CXX)
- # ========== 基础设置 ==========
- set(CMAKE_CXX_STANDARD 17)
- set(CMAKE_CXX_STANDARD_REQUIRED ON)
- set(CMAKE_AUTORCC ON)
- set(CMAKE_AUTOMOC ON)
- set(CMAKE_POSITION_INDEPENDENT_CODE ON)
- if(NOT CMAKE_VERBOSE_MAKEFILE)
- set(CMAKE_VERBOSE_MAKEFILE ON)
- endif()
- # ========== 查找 Qt6 ==========
- find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets SerialPort Charts)
- # ========== 路径与平台 ==========
- set(PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
- set(ROCKSDB_DIR "${PROJECT_ROOT}/rocksdb")
- set(ADS_DIR "${PROJECT_ROOT}/advanced_dock_system")
- if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
- set(PlatformDir "x86")
- else()
- set(PlatformDir "x64")
- endif()
- # ========== 是否构建 shared rocksdb(默认 false) ==========
- option(BUILD_ROCKSDB_SHARED "Build RocksDB as shared library instead of static" OFF)
- # ========== 明确 rocksdb 库路径(你已确认) ==========
- # 你已使用 `find rocksdb -name "librocksdb.a"` 得到 rocksdb/librocksdb.a
- if(WIN32)
- set(ROCKSDB_LIB "${ROCKSDB_DIR}/rocksdb.lib")
- elseif(BUILD_ROCKSDB_SHARED)
- set(ROCKSDB_LIB "${ROCKSDB_DIR}/librocksdb.so")
- else()
- set(ROCKSDB_LIB "${ROCKSDB_DIR}/librocksdb.a")
- endif()
- message(STATUS "Expect RocksDB lib at: ${ROCKSDB_LIB}")
- # ========== 如果需要,从源码构建 RocksDB(声明 OUTPUT 以让 Ninja 在链接前执行) ==========
- # 如果你不需要在 CMake 构建时自动触发 rocksdb 构建,可以注释掉下列 add_custom_command / add_custom_target。
- # 这里假定 rocksdb 的 Makefile 支持 `make static_lib`
- add_custom_command(
- OUTPUT ${ROCKSDB_LIB}
- COMMAND ${CMAKE_COMMAND} -E echo "Building RocksDB static library..."
- COMMAND make -C ${ROCKSDB_DIR} static_lib -j8
- WORKING_DIRECTORY ${ROCKSDB_DIR}
- COMMENT "Building RocksDB (static_lib)"
- VERBATIM
- )
- add_custom_target(BUILD_ROCKSDB_DEPENDS
- DEPENDS ${ROCKSDB_LIB}
- )
- # ========== ADS 子项目(若存在 CMakeLists) ==========
- if(EXISTS "${ADS_DIR}/src/CMakeLists.txt")
- add_subdirectory(${ADS_DIR}/src)
- else()
- message(STATUS "ADS CMakeLists not found at ${ADS_DIR}/src — assuming header-only or prebuilt.")
- endif()
- # ========== 源文件列表与可执行目标 ==========
- qt_standard_project_setup()
- set(SOFT_BUS_SOURCES
- main.cpp
- src/soft_bus_core/soft_bus_core.cpp
- src/soft_bus_core/soft_bus_core.h
- src/serial_manager/serial_manager.cpp
- src/serial_manager/serial_manager.h
- mainwindow.cpp
- mainwindow.h
- src/bus_tree/bus_tree.cpp
- src/bus_tree/bus_tree.h
- src/bus_tree/bus_tree.ui
- src/toolbar/toolbar.cpp
- src/toolbar/toolbar.h
- src/view_core/viewcore.cpp
- src/view_core/viewcore.h
- src/view_core/viewcore.ui
- src/view_serial/viewserial.cpp
- src/view_serial/viewserial.h
- src/view_serial/viewserial.ui
- src/view_serial/serialtree.ui
- src/my_dock_manager/mdockmanager.cpp
- src/my_dock_manager/mdockmanager.h
- resource.qrc
- )
- qt_add_executable(soft_bus
- WIN32 MACOSX_BUNDLE
- ${SOFT_BUS_SOURCES}
- )
- # soft_bus 依赖 rocksdb 构建(如果你希望手动管理 rocksdb 构建,可删除这行)
- add_dependencies(soft_bus BUILD_ROCKSDB_DEPENDS)
- # ========== 包含目录 ==========
- target_include_directories(soft_bus PRIVATE
- ${ROCKSDB_DIR}/include
- ${PROJECT_ROOT}/src
- ${ADS_DIR}/src
- )
- # ========== 查找并链接系统与压缩库(RocksDB 依赖) ==========
- find_package(ZLIB REQUIRED)
- if(ZLIB_FOUND)
- message(STATUS "Found ZLIB: ${ZLIB_LIBRARY} (includes ${ZLIB_INCLUDE_DIR})")
- endif()
- find_package(Snappy QUIET)
- if(Snappy_FOUND)
- message(STATUS "Found Snappy")
- endif()
- find_package(LZ4 QUIET)
- if(TARGET LZ4::LZ4 OR LZ4_FOUND)
- message(STATUS "Found LZ4")
- endif()
- find_package(ZSTD QUIET)
- if(TARGET ZSTD::ZSTD OR ZSTD_FOUND)
- message(STATUS "Found ZSTD")
- endif()
- find_package(BZip2 QUIET)
- if(BZIP2_FOUND)
- message(STATUS "Found BZip2")
- endif()
- find_package(Threads REQUIRED)
- # 收集额外压缩库(顺序重要:静态库之后列出依赖库)
- set(EXTRA_COMPRESSION_LIBS "")
- if(Snappy_FOUND)
- list(APPEND EXTRA_COMPRESSION_LIBS Snappy::snappy)
- endif()
- if(TARGET LZ4::LZ4)
- list(APPEND EXTRA_COMPRESSION_LIBS LZ4::LZ4)
- elseif(LZ4_FOUND)
- list(APPEND EXTRA_COMPRESSION_LIBS lz4)
- endif()
- if(TARGET ZSTD::ZSTD)
- list(APPEND EXTRA_COMPRESSION_LIBS ZSTD::ZSTD)
- elseif(ZSTD_FOUND)
- list(APPEND EXTRA_COMPRESSION_LIBS zstd)
- endif()
- if(BZIP2_FOUND)
- list(APPEND EXTRA_COMPRESSION_LIBS BZip2::BZip2)
- endif()
- # dl & threads
- list(APPEND EXTRA_COMPRESSION_LIBS ${CMAKE_DL_LIBS} Threads::Threads)
- message(STATUS "Extra compression/libs to link: ${EXTRA_COMPRESSION_LIBS}")
- # ========== 链接库(先 rocksdb 静态库,然后其依赖库,最后 Qt 库) ==========
- target_link_libraries(soft_bus
- PRIVATE
- ${ROCKSDB_LIB}
- ${EXTRA_COMPRESSION_LIBS}
- ZLIB::ZLIB
- Qt6::Core
- Qt6::Widgets
- Qt6::SerialPort
- Qt6::Charts
- )
- # 如果 ADS 提供 CMake 目标则优先链接
- if(TARGET ads::qtadvanceddocking-qt6)
- target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt6)
- elseif(TARGET ads::qtadvanceddocking-qt5)
- target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt5)
- endif()
- # ========== 编译选项 ==========
- target_compile_definitions(soft_bus PRIVATE $<$<CONFIG:DEBUG>:DEBUG_BUILD>)
- if(MSVC)
- target_compile_options(soft_bus PRIVATE /W4 /permissive-)
- else()
- target_compile_options(soft_bus PRIVATE -Wall -Wextra -Wpedantic)
- endif()
- # ========== 安装/部署 ==========
- include(GNUInstallDirs)
- install(TARGETS soft_bus
- BUNDLE DESTINATION .
- RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
- LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
- )
- qt_generate_deploy_app_script(
- TARGET soft_bus
- OUTPUT_SCRIPT deploy_script
- NO_UNSUPPORTED_PLATFORM_ERROR
- )
- install(SCRIPT ${deploy_script})
- # ========== rocksdb 清理目标(可选) ==========
- add_custom_target(rocksdb_clean
- COMMAND ${CMAKE_COMMAND} -E echo "Cleaning RocksDB build artifacts..."
- COMMAND make -C ${ROCKSDB_DIR} clean
- WORKING_DIRECTORY ${ROCKSDB_DIR}
- COMMENT "rocksdb clean"
- )
- # ========== 配置摘要 ==========
- message(STATUS "Project root: ${PROJECT_ROOT}")
- message(STATUS "RocksDB dir: ${ROCKSDB_DIR}")
- message(STATUS "Expect RocksDB lib at: ${ROCKSDB_LIB}")
- message(STATUS "Extra compression libs: ${EXTRA_COMPRESSION_LIBS}")
|