CMakeLists.txt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. cmake_minimum_required(VERSION 3.19)
  2. project(soft_bus LANGUAGES CXX)
  3. set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  4. # 设置C++标准
  5. set(CMAKE_CXX_STANDARD 20)
  6. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  7. set(CMAKE_AUTORCC ON)
  8. set(CMAKE_AUTOMOC ON)
  9. # 查找Qt6
  10. find_package(Qt6 6.5 REQUIRED COMPONENTS Core Widgets SerialPort Network Charts Sql DBus)
  11. # 检测编译平台
  12. if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
  13. set(PlatformDir "x86")
  14. else()
  15. set(PlatformDir "x64")
  16. endif()
  17. # 设置ADS路径
  18. SET(ADS_DIR "${PROJECT_SOURCE_DIR}/advanced_dock_system")
  19. # 关键修改:添加ADS子目录
  20. add_subdirectory(${ADS_DIR}/src)
  21. # 添加Qt项目设置
  22. qt_standard_project_setup()
  23. # 添加可执行文件
  24. qt_add_executable(soft_bus
  25. WIN32 MACOSX_BUNDLE
  26. main.cpp
  27. src/soft_bus_core/soft_bus_core.cpp
  28. src/soft_bus_core/soft_bus_core.h
  29. src/manage_serial/serial_manager.h
  30. src/manage_serial/serial_manager.cpp
  31. src/manage_serial/serial_data_buffer.h
  32. src/manage_serial/serial_data_buffer.cpp
  33. src/manage_serial/serial_storage_thread.h
  34. src/manage_serial/serial_storage_thread.cpp
  35. src/manage_serial/serial_parser_thread.h
  36. src/manage_serial/serial_parser_thread.cpp
  37. src/manage_network/network_manager.h
  38. src/manage_network/network_manager.cpp
  39. src/manage_network/network_data_buffer.h
  40. src/manage_network/network_data_buffer.cpp
  41. src/manage_network/network_storage_thread.h
  42. src/manage_network/network_storage_thread.cpp
  43. src/manage_network/network_parser_thread.h
  44. src/manage_network/network_parser_thread.cpp
  45. src/devices/DeviceWatcherBase.h
  46. src/devices/DeviceWatcherBase.cpp
  47. src/devices/DeviceManager.h
  48. src/devices/DeviceManager.cpp
  49. src/devices/serial/SerialPortInfo.h
  50. src/devices/serial/SerialPortWatcher.h
  51. src/devices/serial/SerialPortWatcher.cpp
  52. src/devices/usb/UsbDeviceInfo.h
  53. src/devices/usb/UsbDeviceWatcher.h
  54. src/devices/usb/UsbDeviceWatcher.cpp
  55. src/devices/network/NetworkDeviceInfo.h
  56. src/devices/network/NetworkPortWatcher.h
  57. src/devices/network/NetworkPortWatcher.cpp
  58. src/devices/platform/linux/UdevMonitor.h
  59. src/devices/platform/linux/UdevMonitor.cpp
  60. src/devices/platform/linux/LinuxDeviceUtils.h
  61. src/devices/platform/windows/WinDeviceMonitor.h
  62. src/devices/platform/windows/WinDeviceMonitor.cpp
  63. src/devices/platform/windows/WinDeviceUtils.h
  64. src/can_manager/can_manager.h
  65. src/can_manager/can_manager.cpp
  66. mainwindow.h
  67. mainwindow.cpp
  68. src/toolbar/toolbar.h src/toolbar/toolbar.cpp
  69. resource.qrc
  70. src/view_core/viewcore.h src/view_core/viewcore.cpp src/view_core/viewcore.ui
  71. src/view_serial/serialmodule.h src/view_serial/serialmodule.cpp
  72. src/view_serial/serialdockpage.h src/view_serial/serialdockpage.cpp
  73. src/view_serial/serial_settings_widget.h src/view_serial/serial_settings_widget.cpp src/view_serial/serial_settings_widget.ui
  74. src/view_network/networkmodule.h src/view_network/networkmodule.cpp
  75. src/view_network/networkdockpage.h src/view_network/networkdockpage.cpp
  76. src/view_network/network_settings_widget.h src/view_network/network_settings_widget.cpp src/view_network/network_settings_widget.ui
  77. src/view_network/network_data_widget.h src/view_network/network_data_widget.cpp src/view_network/network_data_widget.ui
  78. src/view_can/viewcan.h src/view_can/viewcan.cpp src/view_can/viewcan.ui
  79. src/view_can/can_data_widget.h src/view_can/can_data_widget.cpp src/view_can/can_data_widget.ui
  80. src/view_task/TaskManagementPage.h src/view_task/TaskManagementPage.cpp
  81. src/view_task/TaskConfigWidget.h src/view_task/TaskConfigWidget.cpp
  82. src/view_device_config/device_tree_widget.h src/view_device_config/device_tree_widget.cpp src/view_device_config/device_tree_widget.ui
  83. src/view_device_config/device_log_dialog.h src/view_device_config/device_log_dialog.cpp
  84. src/libmodbus/modbus_config_widget.h src/libmodbus/modbus_config_widget.cpp src/libmodbus/modbus_config_widget.ui
  85. src/libmodbus/src/modbus.c src/libmodbus/src/modbus-data.c
  86. src/libmodbus/src/modbus-rtu.c src/libmodbus/src/modbus-tcp.c
  87. src/view_serial/serial_data_widget.h src/view_serial/serial_data_widget.cpp src/view_serial/serial_data_widget.ui
  88. src/view_message_viewer/raw_data_table_widget.h src/view_message_viewer/raw_data_table_widget.cpp src/view_message_viewer/raw_data_table_widget.ui
  89. src/view_message_viewer/bus_data_table_widget.h src/view_message_viewer/bus_data_table_widget.cpp src/view_message_viewer/bus_data_table_widget.ui
  90. src/view_message_viewer/message_viewer_widget.h src/view_message_viewer/message_viewer_widget.cpp
  91. # 信号连接管理器
  92. src/connect_signal/signal_connector.h src/connect_signal/signal_connector.cpp
  93. src/connect_signal/view_instance_manager.h src/connect_signal/view_instance_manager.cpp
  94. src/my_dock_manager/mdockmanager.cpp src/my_dock_manager/mdockmanager.h
  95. src/database_manager/database_types.h
  96. src/database_manager/databaseconnectiondock.h src/database_manager/databaseconnectiondock.cpp
  97. src/database_manager/databasepage.h src/database_manager/databasepage.cpp src/database_manager/databasepage.ui
  98. src/database_manager/databasemodule.h src/database_manager/databasemodule.cpp
  99. src/database_manager/databasesearchdialog.h src/database_manager/databasesearchdialog.cpp src/database_manager/databasesearchdialog.ui
  100. # 新增:公共域模型 (DOM)
  101. src/common/dom/DomBase.h
  102. src/common/types.h
  103. # 新增:核心层 - 协议适配层 (PAL)
  104. src/core/pal/interfaces/IProtocolAdapter.h
  105. src/core/pal/serial/SerialProtocolAdapter.h
  106. src/core/pal/serial/SerialProtocolAdapter.cpp
  107. # 新增:核心层 - 数据抽象层 (DAL)
  108. src/core/dal/mapper/DataMapper.h
  109. src/core/dal/mapper/DataMapper.cpp
  110. src/core/dal/processor/DataProcessor.h
  111. src/core/dal/processor/DataProcessor.cpp
  112. # 新增:核心层 - 服务总线层 (SBL)
  113. src/core/sbl/dispatcher/MessageDispatcher.h
  114. src/core/sbl/dispatcher/MessageDispatcher.cpp
  115. src/core/sbl/pubsub/TopicTree.h
  116. src/core/sbl/pubsub/TopicTree.cpp
  117. # 新增:核心单例
  118. src/core/SoftBusCore.h
  119. src/core/SoftBusCore.cpp
  120. # 新增:核心服务管理器
  121. src/core/CoreService.h
  122. src/core/CoreService.cpp
  123. # 新增:任务管理器
  124. src/task_manager/TransferTask.h
  125. src/task_manager/TaskManager.h
  126. src/task_manager/TaskManager.cpp
  127. src/task_manager/TaskScheduler.h
  128. src/task_manager/TaskScheduler.cpp
  129. src/task_manager/TaskExecutor.h
  130. src/task_manager/TaskExecutor.cpp
  131. src/task_manager/PollingTaskExecutor.h
  132. src/task_manager/PollingTaskExecutor.cpp
  133. src/task_manager/EventTaskExecutor.h
  134. src/task_manager/EventTaskExecutor.cpp
  135. # 新增:统一接口层 (API)
  136. src/api/SoftBusAPI.h
  137. src/api/SoftBusAPI.cpp
  138. # 新增:守护进程客户端(用于 GUI 连接守护进程)
  139. src/daemon/daemon_client.h
  140. src/daemon/daemon_client.cpp
  141. src/daemon/daemon_connection_dialog.h
  142. src/daemon/daemon_connection_dialog.cpp
  143. src/daemon/daemon_message_flow_widget.h
  144. src/daemon/daemon_message_flow_widget.cpp
  145. # 新增:协议插件管理器
  146. src/protocol_plugin/ProtocolPluginManager.h
  147. src/protocol_plugin/ProtocolPluginManager.cpp
  148. src/protocol_plugin/IProtocolParser.h
  149. # 新增:设置对话框
  150. src/settings/settings_dialog.h
  151. src/settings/settings_dialog.cpp
  152. )
  153. # 关键修改:链接ADS库(使用目标名称)
  154. if(Qt6_VERSION_MAJOR EQUAL 6)
  155. target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt6)
  156. else()
  157. target_link_libraries(soft_bus PRIVATE ads::qtadvanceddocking-qt5)
  158. endif()
  159. # 设置CAN API库路径
  160. set(CAN_API_DIR "${PROJECT_SOURCE_DIR}/libs/can_api")
  161. # 转换为绝对路径以确保链接器能找到库
  162. get_filename_component(CAN_API_LIB "${CAN_API_DIR}/lib/lib_emuc2_64.a" ABSOLUTE)
  163. # 验证库文件是否存在
  164. if(NOT EXISTS "${CAN_API_LIB}")
  165. message(FATAL_ERROR "CAN API library not found: ${CAN_API_LIB}")
  166. endif()
  167. # 创建导入的静态库目标
  168. add_library(emuc2_static STATIC IMPORTED)
  169. set_target_properties(emuc2_static PROPERTIES
  170. IMPORTED_LOCATION "${CAN_API_LIB}"
  171. )
  172. # 链接其他库
  173. # 注意:静态库的链接顺序很重要
  174. # CAN API库将在Linux部分通过target_link_options使用--whole-archive方式链接
  175. target_link_libraries(soft_bus
  176. PRIVATE
  177. Qt6::Core
  178. Qt6::Widgets
  179. Qt6::SerialPort
  180. Qt6::Network
  181. Qt6::Charts
  182. Qt6::Sql
  183. Qt6::DBus
  184. pthread
  185. )
  186. if(WIN32)
  187. target_link_libraries(soft_bus
  188. PRIVATE
  189. shlwapi
  190. rpcrt4
  191. ws2_32 # Winsock 库
  192. advapi32 # 高级服务库
  193. user32 # 用户界面库
  194. gdi32 # 图形设备接口
  195. ole32 # OLE 库
  196. oleaut32 # OLE 自动化
  197. uuid # UUID 支持
  198. "${CAN_API_LIB}" # Windows下直接链接
  199. )
  200. else()
  201. # 查找 zlib 库
  202. find_package(ZLIB REQUIRED)
  203. # 在链接库时加入 zlib 库
  204. if(ZLIB_FOUND)
  205. target_link_libraries(soft_bus PRIVATE ${ZLIB_LIBRARIES})
  206. endif()
  207. # 查找并链接 libudev 用于设备热插拔监控
  208. find_library(UDEV_LIB udev REQUIRED)
  209. if(UDEV_LIB)
  210. target_link_libraries(soft_bus PRIVATE ${UDEV_LIB})
  211. endif()
  212. # 添加CAN API库目录到链接路径(Linux)
  213. target_link_directories(soft_bus PRIVATE "${CAN_API_DIR}/lib")
  214. # 链接CAN API静态库,使用 --whole-archive 确保所有符号都被链接
  215. # 直接在 target_link_libraries 中混合使用选项和库文件,CMake 会保持顺序
  216. target_link_libraries(soft_bus PRIVATE
  217. "-Wl,--whole-archive"
  218. "${CAN_API_LIB}"
  219. "-Wl,--no-whole-archive"
  220. )
  221. endif()
  222. # 添加包含路径
  223. target_include_directories(soft_bus PRIVATE
  224. ${PROJECT_SOURCE_DIR}/src
  225. ${ADS_DIR}/src # ADS头文件路径
  226. ${PROJECT_SOURCE_DIR}/src/libmodbus/src # libmodbus库头文件路径
  227. ${CAN_API_DIR}/include # CAN API头文件路径
  228. )
  229. # 安装配置
  230. include(GNUInstallDirs)
  231. install(TARGETS soft_bus
  232. BUNDLE DESTINATION .
  233. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  234. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  235. )
  236. qt_generate_deploy_app_script(
  237. TARGET soft_bus
  238. OUTPUT_SCRIPT deploy_script
  239. NO_UNSUPPORTED_PLATFORM_ERROR
  240. )
  241. install(SCRIPT ${deploy_script})
  242. # ============================================================================
  243. # 守护进程可执行文件(独立的核心服务进程)
  244. # ============================================================================
  245. qt_add_executable(soft_bus_daemon
  246. src/daemon/daemon_main.cpp
  247. src/daemon/daemon_service.h
  248. src/daemon/daemon_service.cpp
  249. # 核心服务依赖
  250. src/core/CoreService.h
  251. src/core/CoreService.cpp
  252. src/core/SoftBusCore.h
  253. src/core/SoftBusCore.cpp
  254. # 软总线核心
  255. src/soft_bus_core/soft_bus_core.cpp
  256. src/soft_bus_core/soft_bus_core.h
  257. # 串口管理器(如果需要)
  258. src/manage_serial/serial_manager.cpp
  259. src/manage_serial/serial_manager.h
  260. src/manage_serial/serial_data_buffer.cpp
  261. src/manage_serial/serial_data_buffer.h
  262. src/manage_serial/serial_storage_thread.cpp
  263. src/manage_serial/serial_storage_thread.h
  264. src/manage_serial/serial_parser_thread.cpp
  265. src/manage_serial/serial_parser_thread.h
  266. # 网络管理器(如果需要)
  267. src/manage_network/network_manager.cpp
  268. src/manage_network/network_manager.h
  269. src/manage_network/network_data_buffer.cpp
  270. src/manage_network/network_data_buffer.h
  271. src/manage_network/network_storage_thread.cpp
  272. src/manage_network/network_storage_thread.h
  273. src/manage_network/network_parser_thread.cpp
  274. src/manage_network/network_parser_thread.h
  275. src/devices/network/NetworkDeviceInfo.h
  276. src/devices/network/NetworkPortWatcher.cpp
  277. src/devices/network/NetworkPortWatcher.h
  278. # 设备管理
  279. src/devices/DeviceWatcherBase.cpp
  280. src/devices/DeviceWatcherBase.h
  281. src/devices/DeviceManager.cpp
  282. src/devices/DeviceManager.h
  283. src/devices/serial/SerialPortInfo.h
  284. src/devices/serial/SerialPortWatcher.cpp
  285. src/devices/serial/SerialPortWatcher.h
  286. src/devices/platform/linux/UdevMonitor.h
  287. src/devices/platform/linux/UdevMonitor.cpp
  288. src/devices/platform/linux/LinuxDeviceUtils.h
  289. # CAN 管理器(如果需要)
  290. src/can_manager/can_manager.cpp
  291. src/can_manager/can_manager.h
  292. # 公共域模型
  293. src/common/dom/DomBase.h
  294. src/common/types.h
  295. # 核心层
  296. src/core/pal/interfaces/IProtocolAdapter.h
  297. src/core/pal/serial/SerialProtocolAdapter.cpp
  298. src/core/pal/serial/SerialProtocolAdapter.h
  299. src/core/dal/mapper/DataMapper.cpp
  300. src/core/dal/mapper/DataMapper.h
  301. src/core/dal/processor/DataProcessor.cpp
  302. src/core/dal/processor/DataProcessor.h
  303. src/core/sbl/dispatcher/MessageDispatcher.cpp
  304. src/core/sbl/dispatcher/MessageDispatcher.h
  305. src/core/sbl/pubsub/TopicTree.cpp
  306. src/core/sbl/pubsub/TopicTree.h
  307. # 统一接口层 (API) - 守护进程也需要使用
  308. src/api/SoftBusAPI.h
  309. src/api/SoftBusAPI.cpp
  310. # 协议插件管理器
  311. src/protocol_plugin/ProtocolPluginManager.h
  312. src/protocol_plugin/ProtocolPluginManager.cpp
  313. src/protocol_plugin/IProtocolParser.h
  314. # 任务管理器(守护进程也需要)
  315. src/task_manager/TransferTask.h
  316. src/task_manager/TaskManager.h
  317. src/task_manager/TaskManager.cpp
  318. src/task_manager/TaskScheduler.h
  319. src/task_manager/TaskScheduler.cpp
  320. src/task_manager/TaskExecutor.h
  321. src/task_manager/TaskExecutor.cpp
  322. src/task_manager/PollingTaskExecutor.h
  323. src/task_manager/PollingTaskExecutor.cpp
  324. src/task_manager/EventTaskExecutor.h
  325. src/task_manager/EventTaskExecutor.cpp
  326. )
  327. # 守护进程只需要 Qt Core 和 DBus,不需要 Widgets
  328. target_link_libraries(soft_bus_daemon
  329. PRIVATE
  330. Qt6::Core
  331. Qt6::DBus
  332. Qt6::SerialPort
  333. Qt6::Network
  334. Qt6::Sql
  335. pthread
  336. )
  337. # 守护进程的包含路径
  338. target_include_directories(soft_bus_daemon PRIVATE
  339. ${PROJECT_SOURCE_DIR}/src
  340. ${PROJECT_SOURCE_DIR}/src/libmodbus/src
  341. ${CAN_API_DIR}/include
  342. )
  343. # 为守护进程添加编译定义,禁用 DaemonClient 功能
  344. target_compile_definitions(soft_bus_daemon PRIVATE SOFT_BUS_DAEMON_BUILD)
  345. # Linux 特定的守护进程链接
  346. if(UNIX AND NOT APPLE)
  347. find_library(UDEV_LIB udev REQUIRED)
  348. if(UDEV_LIB)
  349. target_link_libraries(soft_bus_daemon PRIVATE ${UDEV_LIB})
  350. endif()
  351. target_link_directories(soft_bus_daemon PRIVATE "${CAN_API_DIR}/lib")
  352. target_link_libraries(soft_bus_daemon PRIVATE
  353. "-Wl,--whole-archive"
  354. "${CAN_API_LIB}"
  355. "-Wl,--no-whole-archive"
  356. )
  357. endif()
  358. # 安装守护进程
  359. install(TARGETS soft_bus_daemon
  360. RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
  361. )