
鸿蒙PC高难适配Percona Server 8.4 移植踩坑复盘欢迎加入开源鸿蒙PC社区 https://harmonypc.csdn.net/欢迎在PC社区平台申请新建项目https://atomgit.com/OpenHarmonyPCDeveloper摘要Percona Server for MySQL 是业界广泛使用的开源 MySQL 增强版数据库代码体量大、构建图复杂、深度绑定 Linux 特性属于开源鸿蒙 PC 三方库适配里的硬骨头。本文复盘在开源鸿蒙 PCHarmonyOS PCAArch64上移植 Percona Server 8.4.10-10 的完整过程先以客户端先行策略裁剪出静态客户端库与命令行工具再通过 54 个可复现补丁系统性解决交叉编译探测不确定、HMDFS 文件系统差异、musl 风格 libc API 缺口、CMake 构建图耦合和测试竞态五类问题最终在真机上完成conan create打包、C 消费者程序运行并通过 142/142 全量 CTest、1979 项单元测试与上游必测的 MTRmain.1st验证。文中给出关键补丁思路、可运行的验证代码与结果数据供后续移植大型 C/C 数据库组件到鸿蒙PC的开发者参考。关键词鸿蒙PC、开源鸿蒙、Percona Server、三方库适配、Conan、交叉编译一、背景为什么选这块硬骨头在开源鸿蒙 PC 专项积分赛路径C三方库适配中percona-server 这类高难度库的适配积分高但拦路虎也多适配对象信息软件名 / 版本percona-server / 8.4.10_10上游 tagPercona-Server-8.4.10-10构建系统CMake上游仅提供cmake/os/Linux.cmake无 HarmonyOS 模块交付形态静态客户端库libperconaserverclient.a 客户端工具mysql、mysql_config目标平台HarmonyOS PCAArch64armv8适配 PR【高难度挑战】feat(percona-server): add 8.4.10_10 Conan recipeAtomGit MR 5751见文末链接补丁规模54 个 OHOS 补丁编号 0001–005570 个文件、约 4200 行新增Percona Server 上游把所有 Linux 构建都当成完整服务器构建来组织代码服务端、路由器、NDB 集群、RPC、coredumper 全部织在同一张 CMake 构建图里还内置了 Boost、curl、ICU、editline 等十几个三方依赖。把它塞进鸿蒙PC的交叉编译环境等于同时和构建系统、文件系统、libc、测试框架四方作战。二、整体思路先定包面再拆炸弹动第一行代码之前我先明确了最小可用包面client-first第一阶段的 Conan 包只交付客户端库和客户端工具WITHOUT_SERVERON关闭服务端WITH_ROUTEROFF、WITH_NDBOFF关闭路由器和集群zlib、lz4、zstd、ICU、protobuf、curl、Boost 一律用源码树内置版本外部只依赖社区已发布的openssl/3.5.6.1.1与ncurses/6.6。服务端构建不放包里而是单独起一个全量构建用于跑测试——包面和验证面分离问题域立刻小了一圈。这里有个前置插曲最初ncurses/6.4是 W0 级阻塞客户端的交互式命令行bundled editline离不开它。等社区合入ncurses/6.6后用全新的CONAN_HOME验证能从 ohpcd 远程拉到ncurses/6.6和openssl/3.5.6.1.1配方主配方才得以继续推进。这也提醒大家高难库适配先盘点依赖链依赖没就位就先去补依赖别硬啃。三、五类疑难问题与解决方案54 个补丁按问题性质可以归成五类逐类拆解如下。3.1 交叉编译探测不确定让 try_run 结果可预设上游 CMake 用try_run()探测setns、clock_gettime、CLOCK_REALTIME是否可用。交叉编译时目标程序无法在构建机上执行探测结果不确定。解法是在 OHOS profile 下显式预置退出码-DHAVE_SETNS_EXITCODE1 # OHOS 无 setns -DHAVE_CLOCK_GETTIME_EXITCODE0 # 有 clock_gettime -DHAVE_CLOCK_REALTIME_EXITCODE0 # 有 CLOCK_REALTIME另一个关键决策CMAKE_SYSTEM_NAME保持Linux而不是新造值。上游按cmake/os/${CMAKE_SYSTEM_NAME}.cmake加载 OS 模块源码树里只有Linux.cmake没有HarmonyOS.cmake改名会直接找不到模块。配合-DOHOSON能力宏既复用上游 Linux 路径又能精准打点。3.2 HMDFS 文件系统差异拒绝符号链接的脾气HarmonyOS PC 的 HMDFS 会拒绝 CMake 配置期创建的便捷符号链接bin - runtime_output_directory、lib - library_output_directory等报Permission denied。补丁直接在 OHOS 上跳过这些链接、保留真实输出目录同理tirpc 的 Autotoolsconfig.status对 HMDFS 临时目录行为敏感于是客户端包索性跳过 RPC 检查OHOS AND WITHOUT_SERVER时不执行MYSQL_CHECK_RPC()不去改内置的生成式 configure 文件。多个 MTR 补丁0028、0032、0046 等也围绕把临时文件全部收拢进可写临时目录展开。3.3 libc 与头文件 API 缺口musl 风格的隐藏关卡OHOS libc 偏 musl 风格一批 Linux 里理所当然的 API 在这里不存在需要逐个绕行问题根因解法DNS SRV 解析编译失败有res_init/res_search无res_ninit/res_nsearch/res_nclose补丁走上游现成的 Alpine 分支res_init路径能力宏控制内置 libedit 判定平台不支持clang 报__SIZEOF_WCHAR_T__4却未定义__STDC_ISO_10646__向chartype.h平台白名单加 OHOS 能力宏libedit 缺 termcap 原型上游仅对 Solaris 启用手写原型兜底用同一能力宏为 OHOS 启用兜底内置 curl 头文件冲突SDK 头文件链在sys/socket.h后重定义sockaddr_storageOHOS 上禁用HAVE_LINUX_TCP_H检查改走netinet/tcp.hInnoDB 线程优先级告警被判 MTR 错误libc 拒绝 Linuxsetpriority()路径补丁 0055 让该调用在 OHOS 上变 no-op3.4 CMake 构建图治理别让工具名裸奔上游大量自定义命令直接用裸命令名调用构建期生成器comp_err、comp_sql、uca9dump等依赖 PATH 查找交叉编译下必然失败。补丁统一改用生成器表达式引用目标文件$TARGET_FILE:cno_huffman_generator同时跳过仅服务端需要的共享库目标及其.so符号链接步骤保留静态客户端库与json_binlog_staticGCS 单元测试的 SunRPC 头文件包含条件从WIN32扩展为WIN32 OR OHOS与生产代码对齐keyring vault 测试辅助目标显式链接ext::curl让编译用法要求自洽。这类改动的共同原则是只做能力宏与目标引用层面的最小修改不动上游逻辑。3.5 测试可移植性真机上偶现挂死才最难查BGC 300 线程竞态补丁 0047Several_tickets_test里 300 个工作线程共享一个随机数引擎且忙等循环用yield()空转在 OHOS 上偶现不确定性挂死。补丁给每个线程独立引擎与分布、用屏障同步所有线程后再进原 100 轮负载并把忙等换成 1 微秒睡眠——负载规模与断言一概不动。NDB 硬件统计初始化失败补丁 0048NdbHW_Init()读取目标用户态读不到的 Linux procfs/CPU 亲和信息直接跳过这段可选统计初始化不伪造数据。补丁可复现性全部 54 个补丁在上游精确 tag 上正放一遍、逆放还原、再放一遍三轮验证通过git diff --check并可用git apply --check --unidiff-zero对干净源码树直接校验。四、真机验证结果数据说话验证分五个独立阶段全部在鸿蒙PCAArch64真机/远程目标机上完成验证阶段结果关键数据W0 依赖配方门禁通过全新 Conan home 可拉取 openssl/3.5.6.1.1、ncurses/6.6conan create打包通过退出码 0产出libperconaserverclient.a、mysql、mysql_configC 消费者构建运行通过输出percona-client:8.4.10-10:80410:1全量服务端 CTest通过142/1420 失败耗时 707.21 秒单元测试分片通过merge_large_tests-t1979 项 16 分片、merge_innodb_tests-t952 项 16 分片全部分片退出码 0实际执行 920 项32 项为上游本来就禁用的条目如实保留MTRmain.1st上游必测通过2/2含启动与关停诚实声明完整 MTR 套件--nounit-tests --parallel2仍在跑出结果前我不会宣称全量 MTR 通过本文所有结论以上表已归档的证据为准。五、消费者验证代码鸿蒙PC可运行test_package 里的 C 消费者程序不到 20 行却能证明安装、链接、运行三件事——静态库闭包完整、C 消费者无需 C 运行库也能链上配方为此显式传播了c/cabi/unwind系统库信息#includemysql.h#includestdio.hintmain(void){if(mysql_library_init(0,NULL,NULL)!0){return1;}constchar*infomysql_get_client_info();/* 8.4.10-10 */unsignedlongversionmysql_get_client_version();/* 80410 */unsignedintthread_safemysql_thread_safe();/* 1 */mysql_library_end();if(infoNULL||info[0]\0||version0){return2;}printf(percona-client:%s:%lu:%u\n,info,version,thread_safe);return0;}真机运行输出一行即可判定客户端库工作正常percona-client:8.4.10-10:80410:1真机运行截图图 1鸿蒙PC 真机终端自签名sign success→cd进入二进制目录 →date→ 直接执行./test_percona_server_client输出percona-client:8.4.10-10:80410:1图 2鸿蒙PC 真机终端直接执行./mysql --version输出mysql Ver 8.4.10-10 for Linux on aarch64 (Source distribution)六、知识沉淀一条 PR 配齐 md kv按照社区规范本次同步在knowledge/drafts/提交了知识草稿E329Prune a bundled database client graph for OHOS CMake cross buildsmd 文档与知识引擎检索用的 kv 文件一一对应沉淀的正是大型数据库 CMake 单体仓库如何裁剪客户端构建图这套打法症状签名、根因、实施步骤、验证命令四要素齐全。高难适配的经验不落成知识下一个库还得重踩一遍坑。七、心得总结先裁包面再动手。WITHOUT_SERVERON一行配置砍掉了大半张构建图问题域从整个数据库缩到客户端测试。补丁要能力宏化。所有改动都以 OHOS 能力宏或条件分支实现非 OHOS 平台行为零变化这也是补丁能三轮正逆验证、有希望推给上游的基础。证据链要独立分stage。打包归打包、测试归测试每个阶段单独留日志与哈希复审时才立得住。偶现问题不放过。BGC 测试在真机上偶现挂死最容易糊弄过去定位到共享随机引擎忙等竞态并修掉它比降低负载跑绿有价值得多。把 MySQL 生态的重量级组件请进鸿蒙PC靠的不是蛮力改代码而是包面裁剪—能力宏—可复现补丁—分阶段证据这套组合拳。期待更多开发者加入开源鸿蒙PC社区一起把生态的三方库地图补全。参考链接适配 PRAtomGithttps://atomgit.com/OpenHarmonyPCDeveloper/build_in_harmonyos/merge_requests/5751开源鸿蒙 PC 社区项目AtomGithttps://atomgit.com/OpenHarmonyPCDeveloperPercona Server 官方仓库https://github.com/percona/percona-serverPercona Server 官方文档https://docs.percona.com/percona-server/8.4/开源鸿蒙PC社区CSDNhttps://harmonypc.csdn.net/