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 $<$: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}")