bcal 适配 HarmonyOS 构建指南

张开发
2026/4/16 3:53:16 15 分钟阅读

分享文章

bcal 适配 HarmonyOS 构建指南
欢迎加入开源鸿蒙PC社区https://harmonypc.csdn.net/项目说明三方库名称bcal开源协议GPLv3源码版本2.4.0目标平台鸿蒙PC依赖项libc可选 GNU Readline/Editline、GNUbc或calc鸿蒙构建中禁用 readline使用 stub操作系统平台macos原仓库地址https://github.com/jarun/bcal鸿蒙化适配仓库地址https://gitcode.com/nutpi/bcal交叉编译环境https://atomgit.com/OpenHarmonyPCDeveloper/buildhnp包验证环境https://bxming.blog.csdn.net/article/details/155073889项目简介bcal(Byte CALculator) 是一个 REPLRead-Eval-Print Loop命令行工具用于存储表达式计算、SI/IEC 单位转换、字节地址计算、进制转换和 LBA/CHS 计算。对于经常处理位、字节、地址和二进制前缀的开发者来说非常有用。主要特性REPL 和单次执行模式支持交互式和命令行参数两种使用方式存储单位表达式计算支持 KiB、MiB、GiB、TiB、kB、MB、GB、TB 等单位通用计算器模式可以使用bc或calc进行通用数值计算管道输入支持支持从管道或文件重定向输入IEC/SI 标准转换支持二进制和十进制前缀转换交互模式存储最后一次有效结果供重复使用地址显示以字节、LBA:OFFSET 格式显示地址CHS/LBA 转换支持 CHS 到 LBA 的相互转换进制转换支持二进制、十进制和十六进制转换自定义参数可自定义扇区大小、最大磁头数/柱面和最大扇区/磁道bcal 工具介绍安装方式从源码安装gitclone https://github.com/jarun/bcal.gitcdbcalmakestripinstall依赖项标准 C 库libcGNU Readline或BSD Editline用于交互式输入可选GNU bc或calc用于通用数值计算可选基本使用命令行选项usage: bcal[-c N][-f loc][-s bytes][expr][N[unit]][-b[expr]][-m][-d][-h]Storage expression calculator. positional arguments:exprexpressionindecimal/hex operands N[unit]capacityinB/KiB/MiB/GiB/TiB/kB/MB/GB/TB default unit is B(byte),caseis ignored N can be decimal or0xprefixed hex value optional arguments:-cN show ve integer Ninbinary, decimal, hex-floc convert CHS to LBA or LBA to CHS-sbytes sector size[default512]-b[expr]enterbcmode or evaluate expressioninbc-mshow minimal output(e.g. decimal bytes)-denabledebug information and logs-hshow thishelp使用示例计算存储表达式$ bcal(5kb2mb)/3$ bcal5 tb / 12$ bcal(2giB * 2) / (2kib 2)单位转换$ bcal20140115b $ bcal 0x1335053 B $ bcal 0xaabbcc kb $ bcal 0xdef GibLBA/CHS 转换$ bcal-fl500 $ bcal-fc10-10-10进制转换$ bcal-c20140115$ bcal-c0b1001100110101000001010011 $ bcal-c0x1335053交互模式$ bcal bcal15gib 15kib bcalr /5bcal?适配 HarmonyOS 的准备工作1. 项目结构code/bcal/ ├── build_ohos.sh # HarmonyOS 构建脚本 ├── hnp.json # HNP 包配置文件 ├── Makefile # 构建文件 ├── src/ │ ├── bcal.c # 主程序源码 │ └── readline_stub.h # readline 替代实现 ├── inc/ # 头文件目录 └── README.md # 项目说明2. HNP 配置文件创建hnp.json文件{type:hnp-config,name:bcal,version:2.4.0,install:{}}3. 构建脚本框架创建build_ohos.sh脚本参考其他项目的构建脚本结构#!/bin/bash# bcal HarmonyOS 构建脚本exportBCAL_INSTALL_HNP_PATH${HNP_PUBLIC_PATH}/bcal.org/bcal_2.4.0sys_prefix${PREFIX}exportPREFIX${BCAL_INSTALL_HNP_PATH}echo${PREFIX}# 创建安装目录mkdir-p${BCAL_INSTALL_HNP_PATH}# 构建和安装makecleanmakeVERBOSE1makeinstall# 复制 HNP 配置文件cphnp.json${BCAL_INSTALL_HNP_PATH}/# 打包pushd${BCAL_INSTALL_HNP_PATH}/../${HNP_TOOL}pack-i${BCAL_INSTALL_HNP_PATH}-o${ARCHIVE_PATH}/tar-zvcf${ARCHIVE_PATH}/ohos_bcal_2.4.0.tar.gz bcal_2.4.0/popdexportPREFIX${sys_prefix}构建脚本实现完整的 build_ohos.sh#!/bin/bash# # build_ohos.sh - bcal 工具 HarmonyOS 构建脚本# # 设置 HNP 安装路径exportBCAL_INSTALL_HNP_PATH${HNP_PUBLIC_PATH}/bcal.org/bcal_2.4.0# 保存并临时修改 PREFIXsys_prefix${PREFIX}exportPREFIX${BCAL_INSTALL_HNP_PATH}echo${PREFIX}# 创建安装目录确保目录存在mkdir-p${BCAL_INSTALL_HNP_PATH}# 清理之前的构建产物makeclean# 编译时禁用 readline使用 stub 实现# HarmonyOS SDK 中没有 readline 库需要使用自定义的 stub 实现makeVERBOSE1CPPFLAGS-UHAVE_READLINELDLIBS_READLINE||{echoError: make failedexit1}# 安装makeinstall||{echoError: make install failedexit1}# 复制 HNP 配置文件cphnp.json${BCAL_INSTALL_HNP_PATH}/||{echoError: failed to copy hnp.jsonexit1}# 打包if[-d${BCAL_INSTALL_HNP_PATH}];thenpushd${BCAL_INSTALL_HNP_PATH}/..//dev/null${HNP_TOOL}pack-i${BCAL_INSTALL_HNP_PATH}-o${ARCHIVE_PATH}/||{echoError: HNP pack failedpopd/dev/nullexportPREFIX${sys_prefix}exit1}tar-zvcf${ARCHIVE_PATH}/ohos_bcal_2.4.0.tar.gz bcal_2.4.0/||{echoError: tar failedpopd/dev/nullexportPREFIX${sys_prefix}exit1}popd/dev/nullelseechoError: Installation directory does not exist:${BCAL_INSTALL_HNP_PATH}exportPREFIX${sys_prefix}exit1fi# 恢复 PREFIXexportPREFIX${sys_prefix}遇到的问题与解决方案问题一clang-15 链接器参数语法变更错误现象clang-15: error: -fuse-ld taking a path is deprecated; use --ld-path instead [-Werror,-Wfuse-ld-path]问题分析clang-15 编译器不再支持-fuse-ld/path/to/ld的语法需要使用新的--ld-path/path/to/ld语法。解决方案在build.sh中修改CFLAGS和LDFLAGS修改前exportCFLAGS-fPIC -D__MUSL__1 -D__OHOS__ -fstack-protector-strong --target${TARGET_PLATFORM}-fuse-ld${LD}--sysroot${SYSROOT}exportLDFLAGS${LDFLAGS}-fuse-ld${LD}--target${TARGET_PLATFORM}--sysroot${SYSROOT}修改后exportCFLAGS-fPIC -D__MUSL__1 -D__OHOS__ -fstack-protector-strong --target${TARGET_PLATFORM}--ld-path${LD}--sysroot${SYSROOT}exportLDFLAGS${LDFLAGS}--ld-path${LD}--target${TARGET_PLATFORM}--sysroot${SYSROOT}问题二readline 库缺失错误现象src/bcal.c:31:10: fatal error: readline/history.h file not found #include readline/history.h ^~~~~~~~~~~~~~~~~~~~问题分析HarmonyOS SDK 的 sysroot 中没有 readline 库。bcal默认依赖 readline 用于交互式输入但该功能在 HarmonyOS 环境中不可用。解决方案创建 readline 的 stub 实现使代码可以在没有 readline 的情况下编译1. 创建src/readline_stub.h#ifndefREADLINE_STUB_H#defineREADLINE_STUB_H#includestdio.h#includestdlib.h#includestring.h// Simple readline stub implementation for systems without readlinestaticinlinechar*readline(constchar*prompt){if(prompt){fputs(prompt,stdout);fflush(stdout);}char*lineNULL;size_tlen0;ssize_treadgetline(line,len,stdin);if(read-1){free(line);returnNULL;}// Remove trailing newlineif(read0line[read-1]\n){line[read-1]\0;}returnline;}staticinlinevoidadd_history(constchar*line){// Stub: do nothing(void)line;}staticinlineintread_history(constchar*filename){// Stub: do nothing(void)filename;return0;}staticinlineintwrite_history(constchar*filename){// Stub: do nothing(void)filename;return0;}#endif// READLINE_STUB_H2. 修改src/bcal.c使用条件编译#includegetopt.h#ifdefined(HAVE_READLINE)HAVE_READLINE1#includereadline/history.h#includereadline/readline.h#else#includereadline_stub.h#endif#includedslib.h#includelog.h3. 处理 readline 特定函数调用#ifdefined(HAVE_READLINE)HAVE_READLINE1rl_bind_key(\t,rl_insert);#else// Tab completion not available without readline#endif4. 在构建脚本中禁用 readlinemakeVERBOSE1CPPFLAGS-UHAVE_READLINELDLIBS_READLINE问题三构建脚本错误处理不完善错误现象cp: directory /Users/jianguo/HarmonyOSPC/build/data/service/hnp/bcal.org/bcal_2.4.0 does not exist pushd: /Users/jianguo/HarmonyOSPC/build/data/service/hnp/bcal.org/bcal_2.4.0/../: No such file or directory popd: directory stack empty问题分析构建脚本缺少错误处理和目录检查导致在编译失败时后续步骤无法正确执行。解决方案添加完善的错误处理和目录检查# 创建安装目录确保目录存在mkdir-p${BCAL_INSTALL_HNP_PATH}# 添加错误处理makeVERBOSE1CPPFLAGS-UHAVE_READLINELDLIBS_READLINE||{echoError: make failedexit1}makeinstall||{echoError: make install failedexit1}# 打包前检查目录是否存在if[-d${BCAL_INSTALL_HNP_PATH}];thenpushd${BCAL_INSTALL_HNP_PATH}/..//dev/null# ... 打包操作 ...popd/dev/nullelseechoError: Installation directory does not existexit1fi构建结果验证构建输出成功构建后会在output/目录下生成以下文件bcal.hnp- HarmonyOS Native Package 格式包约 45KBohos_bcal_2.4.0.tar.gz- tar.gz 压缩包约 45KB验证命令# 检查文件是否存在ls-lhoutput/bcal.hnp output/ohos_bcal_2.4.0.tar.gz# 检查 HNP 文件格式fileoutput/bcal.hnp# 查看 tar.gz 内容tar-tzfoutput/ohos_bcal_2.4.0.tar.gz安装目录结构bcal_2.4.0/ ├── bin/ │ └── bcal # 可执行文件 ├── hnp.json # HNP 配置文件 └── share/ ├── doc/ │ └── bcal/ │ └── README.md └── man/ └── man1/ └── bcal.1.gz # 手册页终于编译成功了使用示例基本计算# 计算存储表达式$ bcal(5kb2mb)/3$ bcal5 tb / 12$ bcal(2giB * 2) / (2kib 2)# 单位转换$ bcal20140115b $ bcal 0x1335053 B $ bcal 0xaabbcc kbLBA/CHS 转换# LBA 转 CHS$ bcal-fl500 $ bcal-fl0x600-18-0x7e# CHS 转 LBA$ bcal-fc10-10-10 $ bcal-fc0x10-0x10-0x10进制转换# 显示二进制、十进制和十六进制$ bcal-c20140115$ bcal-c0b1001100110101000001010011 $ bcal-c0x1335053交互模式$ bcal bcal15gib 15kib bcalr /5bcalb# 切换到 bc 模式bcal?# 显示帮助bcalq# 退出管道输入# 从管道输入$printf15 kib 15 gib \n r / 5|bcal-m# 从文件输入$catexpr15gib 15kib r /5$ bcal-mexpr总结适配要点链接器参数更新使用--ld-path替代已弃用的-fuse-ld语法readline 依赖处理创建 stub 实现使代码可以在没有 readline 的情况下编译错误处理完善添加完善的错误检查和错误处理机制目录管理确保安装目录在构建前已创建技术亮点条件编译使用条件编译实现 readline 的可选依赖Stub 模式通过 stub 实现保持代码兼容性错误恢复完善的错误处理确保构建过程的可靠性适用场景bcal工具特别适用于存储系统开发计算存储容量、地址转换文件系统开发LBA/CHS 转换系统管理存储单位转换和计算嵌入式开发处理二进制前缀和地址计算参考资源bcal 官方仓库HarmonyOS 原生应用开发文档GNU Readline 文档

更多文章