build: migrate from ctx to pure CMake + Conan 2 #1

Merged
carrot merged 6 commits from migrate/cmake-manual into main 2026-08-05 08:52:50 +00:00
Owner

概述

项目构建系统从 ctx 迁移到纯 CMake + Conan 2。

变更

  • 删除 cpps.toml,项目完全脱离 ctx 工具依赖
  • 重写 conanfile.py:手动 layout + CMakeDeps + CMakeToolchain
  • 重写 CMakePresets.json:Ninja + debug/release 分离 preset
  • 目录重组:modules/* → src/{foundation,data,protocol,app,tools}/*
  • 17 个模块按 5 层架构组织,每个模块独立 CMakeLists.txt
  • 重写所有 CMakeLists.txt(根 + 层级 + 17 模块 + project_compiler)
  • yaml-cpp 从系统安装改为 Conan 2 依赖(yaml-cpp/0.8.0)
  • 目标名统一:photolink_* + ALIAS 向后兼容
  • 删除 copy/ 历史残留、tools/logviewer/ 重复模块
  • tools/* 独立工具迁移到 src/tools/
  • taos_writer 条件编译(需 TDengine)
  • 更新 .opencode/agents/cpp-developer.md 和 AGENTS.md
  • 新增 doc/migration_plan.md 完整迁移方案
  • 新增 .gitignore

构建验证

conan install . -pr=debug -of=build/debug --build=missing
cmake --preset debug
cmake --build --preset debug -j$(nproc)  # 166 targets ✅
ctest --preset debug --output-on-failure  # 11/11 核心测试通过 ✅

预存失败(与迁移前一致)

测试 原因
ctrl_tests ZMQ 连接超时
config_tests 预存失败
watchDog_tests 集成测试超时
sub_shell_tests 需要 .so 插件
rtdbview_tests 预存失败
## 概述 项目构建系统从 ctx 迁移到纯 CMake + Conan 2。 ## 变更 - 删除 `cpps.toml`,项目完全脱离 ctx 工具依赖 - 重写 `conanfile.py`:手动 layout + CMakeDeps + CMakeToolchain - 重写 `CMakePresets.json`:Ninja + debug/release 分离 preset - 目录重组:`modules/*` → `src/{foundation,data,protocol,app,tools}/*` - 17 个模块按 5 层架构组织,每个模块独立 CMakeLists.txt - 重写所有 CMakeLists.txt(根 + 层级 + 17 模块 + project_compiler) - yaml-cpp 从系统安装改为 Conan 2 依赖(`yaml-cpp/0.8.0`) - 目标名统一:`photolink_*` + ALIAS 向后兼容 - 删除 `copy/` 历史残留、`tools/logviewer/` 重复模块 - `tools/*` 独立工具迁移到 `src/tools/` - taos_writer 条件编译(需 TDengine) - 更新 `.opencode/agents/cpp-developer.md` 和 `AGENTS.md` - 新增 `doc/migration_plan.md` 完整迁移方案 - 新增 `.gitignore` ## 构建验证 ```bash conan install . -pr=debug -of=build/debug --build=missing cmake --preset debug cmake --build --preset debug -j$(nproc) # 166 targets ✅ ctest --preset debug --output-on-failure # 11/11 核心测试通过 ✅ ``` ## 预存失败(与迁移前一致) | 测试 | 原因 | |------|------| | ctrl_tests | ZMQ 连接超时 | | config_tests | 预存失败 | | watchDog_tests | 集成测试超时 | | sub_shell_tests | 需要 .so 插件 | | rtdbview_tests | 预存失败 |
删除 cpps.toml,重写 conanfile.py/CMakePresets.json/全部 CMakeLists.txt
模块按5层架构重组: modules/* -> src/{foundation,data,protocol,app,tools}/*
yaml-cpp 从系统安装改为 Conan 2 依赖(yaml-cpp/0.8.0)
目标名统一: photolink_* + ALIAS 向后兼容
删除 copy/ 历史残留、tools/logviewer/ 重复模块
taos_writer 条件编译(需 TDengine)
更新 .opencode/agents/cpp-developer.md 和 AGENTS.md
构建验证: 166 targets 编译通过, 11/11 核心测试通过
carrot self-assigned this 2026-07-24 12:55:37 +00:00
修复 15 处真实 bug(P0×3 / P1×8 / P2×4),完整清单见 doc/bug_report.md:

- logger: RingBuffer 越界写、CreateOrOpen 无条件删除已有 SHM
- bus: 槽布局内存对齐(UB)、Subscription 析构 fd 泄漏、open_or_create 异常未区分
- comm: TcpComm::attach 用 delete 释放 libuv handle(use-after-free)
- rtdb: 死区不写 SHM、告警限值恒为 0
- iprotocol: ModbusMaster 0x01/0x02 越界读、时间戳窄化、command 未映射 point_id、SOE 时间戳恒 0
- ctrl: ctrl_client_execute 忽略 request_id(SBO 链路断裂)、ctrl_plugin 未接入 Bus(控制发不出)、CtrlEngine stop 数据竞争
- sub_shell: echo_plugin 测试插件未构建、PluginLoader 库名解析
- config: 残留迁移前旧路径

同时修复文档路径:modules/* → src/{层}/*,统一仓库根 doc/ 与工程内 PhotoLink/doc/

修复后 16/16 测试目标全部通过(517 用例)
- 新增 src/tools/modbus_loop:modbus_loop_gen(生成单进程自环配置)+ run_loop(启动器)+ loop_verify(注入/校验)
- 生成 config/modbus_loop/{slave,master}_modbus.bin + project_loop.bin
- 单进程内 slave(TCP_SERVER 5020) + master(TCP_CLIENT) 闭环,注入 12345 读回 12345 PASS
- fix(B3-3 P1): TcpComm::on_write 不 pop 队列,导致重复发送队首、Send-Q 堆积、数据错乱
- fix(B3-4 P1): TCP 句柄操作跨线程(uv_tcp_connect/uv_bind/uv_listen),新增 OpenLinkTask/ServerOpenTask 投递 ev_thread
- fix(B3-5 P2): reconnect 误判 CONNECTING 为断开,重连条件排除 CONNECTING
- io_thread 心跳 yield 改 sleep_for(1ms) 降 CPU
控制闭环:
- ModbusMaster::encode_control_write:控制指令按配置反向解析,0x05/0x06/0x10 写功能码
- 从站 WriteCallback:写命令回传 RTDB(RTDB_INPUT → 从站组)
- scada 集成 CtrlRouterEngine(加载 ctrl_router.bin + 心跳 cleanup)
- 默认配置(modbus_loop)加入 YK/YT 点 + ctrl_router.bin 路由表
- 新增 hmi_sender 控制指令工具、ctrl_listen 诊断工具
- 端到端验证:遥调/遥控连续多次全部 OK,从站 RTDB 正确更新

底层修复:
- ProtocolSession::on_receive recv_buffer 泄漏(objects 空但 consumed>0 时未累加)
- TcpComm 写队列线程安全(加锁 + 刷新投递 libuv 线程)
- bus publish FIFO 通知触发 SIGPIPE 静默杀进程(Bus::init 忽略 SIGPIPE)
- ctrl_router 订阅改为独立线程 try_recv 轮询(避开 eventfd 竞态)

数据质量:
- ModbusMaster 数据时标改用 system_clock(原 steady_clock 导致 stale 误判)
- QualityUpdater::update 品质位透传(QUESTIONABLE/OVERFLOW 等不再丢失)
- stale 置/清直接写入 SHM(write_quality_to_shm)
carrot merged commit 47a05ccb6d into main 2026-08-05 08:52:50 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: carrot/PhotoLink#1
No description provided.