Lycium 交叉编译框架完全指南
目录
系统概述
什么是 Lycium?
Lycium 是一款协助开发者通过 Shell 脚本语言实现 C/C++ 第三方库快速交叉编译,并在 OpenHarmony 系统上快速验证的编译框架工具。
核心特性
| 特性 | 说明 |
|---|---|
| 🚀 全自动化 | 从下载、校验、解压、编译到安装全程自动化 |
| 📦 智能依赖管理 | 自动解析和处理库之间的依赖关系 |
| 🔧 多构建系统支持 | 支持 CMake、Configure、Make 等多种构建方式 |
| ✅ 完整性校验 | 使用 SHA512 确保源码完整性 |
| 🧪 集成测试框架 | 在真实设备上验证移植效果 |
| 🎯 多架构支持 | 支持 armeabi-v7a、arm64-v8a 等多种架构 |
| 🔄 跨平台编译 | 支持在 Linux、macOS、HarmonyOS 上交叉编译 |
| 📝 标准化流程 | 统一的配置文件格式,降低学习成本 |
系统架构
lycium_plusplus/
├── lycium/ # Lycium 构建系统核心
│ ├── build.sh # 主构建脚本(入口)
│ ├── test.sh # 主测试脚本
│ ├── script/ # 构建辅助脚本
│ │ ├── build_hpk.sh # 单包构建逻辑
│ │ ├── envset.sh # 环境变量设置
│ │ └── load_outer_parts.py # 外部仓库加载
│ ├── template/ # 配置文件模板
│ │ ├── HPKBUILD # 构建配置模板
│ │ ├── HPKCHECK # 测试配置模板
│ │ ├── README.md # 模板使用说明
│ │ └── SHA512SUM # 校验和模板
│ ├── Buildtools/ # 编译工具链
│ │ ├── README.md # 环境配置指南
│ │ └── toolchain.tar.gz # 工具链补丁
│ ├── CItools/ # CI/CD 环境工具
│ ├── doc/ # 详细文档
│ ├── community/ # 社区贡献的库链接
│ └── usr/ # 编译产物安装目录
├── thirdparty/ # 第三方库适配目录
├── community/ # 社区库实际存储目录
├── outerrepo/ # 外部仓库配置
└── docs/ # 项目文档
工作流程
用户 build.sh build_hpk.sh 源码 OHOS SDK usr目录 ./build.sh pkgname 检查环境 解析依赖 调用 build_hpk.sh 下载源码 SHA512 校验 解压源码 prepare() 准备 使用工具链编译 build() 编译 package() 打包 安装到 usr/pkgname 编译完成 用户 build.sh build_hpk.sh 源码 OHOS SDK usr目录
快速开始
5 分钟上手
第 1 步:环境准备
bash
# 设置 OpenHarmony SDK 路径
export OHOS_SDK=/path/to/OH_SDK/ohos-sdk/linux
# 验证 SDK
ls $OHOS_SDK/native/llvm/bin/clang
第 2 步:编译第一个库
bash
cd lycium
./build.sh zlib
第 3 步:查看产物
bash
ls -lh usr/zlib/arm64-v8a/
# include/ - 头文件
# lib/ - 库文件
# share/ - 文档等
三方库适配流程
创建目录 → 编写HPKBUILD → 测试编译 → 编写HPKCHECK → 在设备测试 → 提交代码
环境配置
系统要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Linux、macOS、HarmonyOS |
| Shell | Bash 4.0+ |
| 磁盘空间 | 建议 10GB+ |
| 内存 | 建议 8GB+ |
必需工具清单
Linux/macOS 环境
bash
# 编译工具
gcc g++ cmake make
# 自动化工具
autoconf autoreconf automake libtool
# 辅助工具
pkg-config patch unzip tar git
# 构建加速工具
ninja curl wget
# 校验工具
sha512sum # Linux 自带,macOS 需安装 coreutils
macOS 特殊说明
bash
# 安装 Homebrew(如果没有)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 安装必需工具
brew install cmake autoconf automake libtool pkg-config
brew install ninja wget coreutils
OpenHarmony SDK 配置
下载 SDK
-
方式一:通过 DevEco Studio
- 打开 DevEco Studio
- Tools → SDK Manager
- 选择 OpenHarmony SDK
- 下载 Native 开发套件
-
方式二:命令行下载
bash# 访问官方网站下载 # https://developer.harmonyos.com/cn/develop/deveco-studio
配置环境变量
Linux/HarmonyOS:
bash
# 添加到 ~/.bashrc 或 ~/.bash_profile
export OHOS_SDK=/home/user/OH_SDK/ohos-sdk/linux
export PATH=$OHOS_SDK/native/build-tools/cmake/bin:$PATH
# 使配置生效
source ~/.bashrc
macOS:
bash
# 添加到 ~/.zshrc 或 ~/.bash_profile
export OHOS_SDK=/Users/user/Library/OpenHarmony/Sdk/20
export PATH=$OHOS_SDK/native/build-tools/cmake/bin:$PATH
# 使配置生效
source ~/.zshrc
验证安装
bash
# 检查 SDK 路径
echo $OHOS_SDK
# 检查编译器
$OHOS_SDK/native/llvm/bin/clang --version
# 检查 CMake
$OHOS_SDK/native/build-tools/cmake/bin/cmake --version
工具链补丁(macOS/非 Linux)
在非 HarmonyOS 环境下,需要安装额外的工具链文件:
bash
cd lycium
./build.sh <any-package> # 首次运行会自动安装工具链
工具链文件包括:
aarch64-linux-ohos-clangaarch64-linux-ohos-clang++arm-linux-ohos-clangarm-linux-ohos-clang++
构建系统详解
build.sh 主构建脚本
基本用法
bash
# 编译所有库
./build.sh
# 编译单个库
./build.sh zlib
# 编译多个库
./build.sh zlib openssl curl
# 编译指定架构
# 在 HPKBUILD 中通过 archs=() 配置
执行流程
1. preparetoolchain() - 准备工具链
2. checkbuildenv() - 检查编译环境
3. readdonelibs() - 读取编译记录
4. findarglibsdir() - 搜集待编译库
5. prepareshell() - 准备构建脚本
6. buildhpk() - 执行编译
7. cleanhpkdir() - 清理环境
依赖解析机制
构建系统会自动解析依赖关系:
bash
# 示例:curl 依赖 openssl 和 zlib
./build.sh curl
# 系统会自动:
# 1. 检查 openssl 和 zlib 是否已编译
# 2. 如果未编译,先编译依赖
# 3. 最后编译 curl
编译状态管理
bash
# 编译记录文件
usr/hpk_build.csv
# 格式:架构,库名,版本
arm64-v8a,zlib,1.3.1
armeabi-v7a,zlib,1.3.1
build_hpk.sh 单包构建
这是实际执行构建的核心脚本,自动处理:
1. 下载阶段
bash
download() {
if [ -s ${PWD}/$2 ]; then
echo "文件已存在"
else
wget "$1" -O ${PWD}/$2
fi
}
支持的下载方式:
- HTTP/HTTPS 直接下载
- Git clone(需在 prepare() 中手动处理)
2. 校验阶段
bash
checksum() {
sha512sum -c ${PWD}/SHA512SUM
}
如果校验失败,构建会中止。
3. 解压阶段
bash
unpack() {
# 支持的格式
*.tar.gz *.tgz # gzip 压缩
*.tar.xz # xz 压缩
*.tar.bz2 # bzip2 压缩
*.zip # zip 压缩
}
4. 依赖处理
bash
builddepends() {
# 检查所有依赖是否已编译
# 返回 101 表示依赖未满足
# 返回 0 表示可以继续编译
}
5. 构建参数生成
CMake 项目:
bash
cmakedependpath() {
buildargs="-DCMAKE_BUILD_TYPE=Release"
buildargs="$buildargs -DCMAKE_TOOLCHAIN_FILE=$OHOS_SDK/native/build/cmake/ohos.toolchain.cmake"
buildargs="$buildargs -DCMAKE_INSTALL_PREFIX=$LYCIUM_ROOT/usr/$pkgname/$ARCH"
buildargs="$buildargs -DCMAKE_FIND_ROOT_PATH=\"/path/to/deps\""
}
Configure 项目:
bash
configuredependpath() {
buildargs="--prefix=$LYCIUM_ROOT/usr/$pkgname/$ARCH/"
# 设置 PKG_CONFIG_PATH
}
6. 编译执行
bash
builpackage() {
for arch in ${archs[@]}; do
prepare # 准备环境
build $buildargs # 执行编译
package # 安装打包
archive # 归档(可选)
check # 检查(可选)
done
}
环境变量参考
全局变量
| 变量名 | 说明 | 示例值 |
|---|---|---|
LYCIUM_ROOT |
Lycium 根目录 | /path/to/lycium |
LYCIUM_BUILD_OS |
构建系统类型 | Darwi/Linux/HarmonyOS |
LYCIUM_BUILD_CHECK |
是否执行检查 | true/false |
LYCIUM_DEPEND_PKGNAMES |
依赖包临时文件 | /tmp/user-lycium_deps-xxx |
OHOS_SDK |
OpenHarmony SDK 路径 | /path/to/SDK |
SYSROOT |
系统根目录 | $OHOS_SDK/native/sysroot |
CLANG_VERSION |
Clang 版本 | 15.0.4 |
HPKBUILD 内变量
| 变量名 | 说明 | 来源 |
|---|---|---|
pkgname |
当前库名 | HPKBUILD |
pkgver |
当前版本 | HPKBUILD |
ARCH |
当前架构 | 遍历 archs |
builddir |
源码目录 | HPKBUILD |
depends |
依赖列表 | HPKBUILD |
测试框架详解
test.sh 主测试脚本
测试脚本运行在 OpenHarmony 设备上,用于验证编译产物的功能。
执行环境
bash
# 必须在 OpenHarmony 设备上运行
# 通过 hdc shell 连接到设备
hdc shell
cd /data/local/tmp/lycium_plusplus/lycium
./test.sh
测试流程
1. checktestenv() - 检查测试环境
2. getcpuarchitecture() - 获取设备架构
3. setloaddynamiclibrarypath() - 设置动态库路径
4. findbuilddir() - 搜索已编译的库
5. checkhpk() - 执行测试
6. 生成测试报告
测试环境要求
在 OpenHarmony 设备上必须安装:
bash
# 必需工具
cmake # CMake 构建工具
make # Make 构建工具
ctest # CTest 测试框架
perl # Perl 解释器(部分测试需要)
安装方法参考:lycium CItools
测试结果
测试完成后会生成:
lycium/check_result/
├── check_log/ # 所有测试日志
│ ├── zlib_arm64-v8a_OH4.0_test.log
│ └── openssl_arm64-v8a_OH4.0_test.log
├── check_fault/ # 失败测试详情
│ └── failed_lib/
│ └── fault.log
└── manual_confirm/ # 需要手动确认的输出
└── lib_name/
└── output_file.wav
测试报告
bash
################################################
CHECK REPORT :
TEST TOTAL LIBS : 15
TEST FAILED : 2
FAILED TEST ARE:
libpng
opencv
################################################
HPKCHECK 配置文件
基本结构
bash
# 导入 HPKBUILD 配置
source HPKBUILD > /dev/null 2>&1
# 日志文件路径
logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log
# 测试前准备(可选)
checkprepare() {
# 编译测试程序
# 准备测试数据
return 0
}
# 执行测试
openharmonycheck() {
res=0
cd ${builddir}/${ARCH}-build
# 运行测试
ctest > ${logfile} 2>&1
res=$?
cd $OLDPWD
return $res
}
高级测试示例
bash
source HPKBUILD > /dev/null 2>&1
logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log
faultlog=${LYCIUM_FAULT_PATH}/${pkgname}/fault.log
checkprepare() {
echo "=== Preparing ${pkgname} test ===" | tee -a ${logfile}
# 创建测试目录
mkdir -p ${LYCIUM_THIRDPARTY_ROOT}/${pkgname}
mkdir -p ${LYCIUM_FAULT_PATH}/${pkgname}
# 设置动态库路径
export LD_LIBRARY_PATH=${LYCIUM_ROOT}/usr/${pkgname}/${ARCH}/lib:$LD_LIBRARY_PATH
return 0
}
openharmonycheck() {
res=0
echo "=== Testing ${pkgname} ${pkgver} ===" | tee -a ${logfile}
echo "Architecture: ${ARCH}" | tee -a ${logfile}
echo "SDK Version: ${OHOS_SDK_VER}" | tee -a ${logfile}
cd ${builddir}/${ARCH}-build
# 方式1:使用 CTest
if [ -f CTestTestfile.cmake ]; then
ctest --output-on-failure --verbose >> ${logfile} 2>&1
res=$?
# 方式2:运行自定义测试
elif [ -f ./test/${pkgname}_test ]; then
./test/${pkgname}_test >> ${logfile} 2>&1
res=$?
# 方式3:运行示例程序
elif [ -d ./examples ]; then
for example in ./examples/*; do
if [ -x "$example" ]; then
echo "Running $example" | tee -a ${logfile}
$example >> ${logfile} 2>&1
if [ $? -ne 0 ]; then
res=1
echo "FAILED: $example" | tee -a ${faultlog}
fi
fi
done
else
echo "No test found, skipping..." | tee -a ${logfile}
fi
cd $OLDPWD
# 报告测试结果
if [ $res -eq 0 ]; then
echo "✅ Test PASSED" | tee -a ${logfile}
else
echo "❌ Test FAILED" | tee -a ${logfile} ${faultlog}
fi
return $res
}
测试环境变量
| 变量名 | 说明 | 用途 |
|---|---|---|
LYCIUM_ROOT |
Lycium 根目录 | 查找已编译的库 |
LYCIUM_THIRDPARTY_ROOT |
thirdparty 目录 | 源码和构建目录 |
LYCIUM_FAULT_PATH |
错误日志目录 | 存储失败测试的详细信息 |
LYCIUM__MANUAL_CONFIRM_PATH |
手动确认目录 | 存储需人工验证的输出文件 |
ARCH |
CPU 架构 | 当前设备架构 |
OHOS_SDK_VER |
SDK 版本 | OpenHarmony 版本 |
北向应用集成
什么是北向应用?
北向应用是指运行在 OpenHarmony 系统上的应用程序,使用 ArkTS/JS 开发界面,通过 NAPI 调用 C/C++ 代码。
集成方式
方式一:源码集成
在应用项目中直接包含第三方库源码并编译。
优点:
- ✅ 代码完全可控
- ✅ 便于调试
- ✅ 可以修改源码
缺点:
- ❌ 增加项目复杂度
- ❌ 编译时间长
方式二:二进制集成(推荐)
使用 Lycium 预编译的二进制文件。
优点:
- ✅ 编译快速
- ✅ 项目简洁
- ✅ 易于维护
缺点:
- ❌ 需要提前编译
- ❌ 调试相对困难
二进制集成详细步骤
第 1 步:使用 Lycium 编译库
bash
cd lycium
./build.sh zlib
第 2 步:创建应用目录结构
在 DevEco Studio 项目中创建 thirdparty 目录:
MyApp/
└── entry/
└── src/
└── main/
├── cpp/
│ ├── thirdparty/ # 第三方库
│ │ └── zlib/
│ │ ├── arm64-v8a/ # ARM 64位
│ │ │ ├── include/ # 头文件
│ │ │ └── lib/ # 库文件
│ │ └── armeabi-v7a/ # ARM 32位
│ │ ├── include/
│ │ └── lib/
│ ├── CMakeLists.txt
│ └── hello.cpp
└── ets/
第 3 步:复制编译产物
bash
# 复制头文件和库文件
cp -r lycium/usr/zlib/arm64-v8a MyApp/entry/src/main/cpp/thirdparty/zlib/
cp -r lycium/usr/zlib/armeabi-v7a MyApp/entry/src/main/cpp/thirdparty/zlib/
第 4 步:复制动态库到 libs 目录(仅动态库)
如果是动态库(.so 文件),还需要复制到 libs 目录:
bash
# 创建 libs 目录
mkdir -p MyApp/entry/libs/arm64-v8a
mkdir -p MyApp/entry/libs/armeabi-v7a
# 复制 so 文件(注意:复制 soname 对应的文件)
# 查看 soname
$OHOS_SDK/native/llvm/bin/llvm-readelf -d lycium/usr/zlib/arm64-v8a/lib/libz.so
# 复制正确的文件
cp lycium/usr/zlib/arm64-v8a/lib/libz.so.1.3.1 MyApp/entry/libs/arm64-v8a/
cp lycium/usr/zlib/armeabi-v7a/lib/libz.so.1.3.1 MyApp/entry/libs/armeabi-v7a/
⚠️ 重要提示:必须复制 soname 指定的文件,而不是软链接!
第 5 步:配置 CMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.4.1)
project(MyApp)
# 设置第三方库路径
set(THIRDPARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty)
# 配置头文件路径
target_include_directories(entry PRIVATE
${THIRDPARTY_DIR}/zlib/${OHOS_ARCH}/include
)
# 链接库文件
# 静态库
target_link_libraries(entry PRIVATE
${THIRDPARTY_DIR}/zlib/${OHOS_ARCH}/lib/libz.a
)
# 或动态库
target_link_libraries(entry PRIVATE
${THIRDPARTY_DIR}/zlib/${OHOS_ARCH}/lib/libz.so
)
第 6 步:在 C++ 代码中使用
cpp
// hello.cpp
#include <napi/native_api.h>
#include <zlib.h> // 使用第三方库
static napi_value Compress(napi_env env, napi_callback_info info) {
// 使用 zlib 的功能
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
int ret = deflateInit(&stream, Z_DEFAULT_COMPRESSION);
if (ret == Z_OK) {
// 压缩操作
deflateEnd(&stream);
}
// 返回结果到 ArkTS
napi_value result;
napi_create_int32(env, ret, &result);
return result;
}
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports) {
napi_property_descriptor desc[] = {
{"compress", nullptr, Compress, nullptr, nullptr, nullptr, napi_default, nullptr}
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END
static napi_module demoModule = {
.nm_version = 1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = Init,
.nm_modname = "entry",
.nm_priv = ((void*)0),
.reserved = { 0 },
};
extern "C" __attribute__((constructor)) void RegisterEntryModule(void) {
napi_module_register(&demoModule);
}
第 7 步:在 ArkTS 中调用
typescript
// index.ets
import testNapi from 'libentry.so'
@Entry
@Component
struct Index {
@State message: string = 'Hello World'
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
Button('Compress')
.onClick(() => {
let result = testNapi.compress()
this.message = `Result: ${result}`
})
}
.width('100%')
}
.height('100%')
}
}
常见问题
问题 1:找不到 so 文件
Error: dlopen failed: library "libz.so.1" not found
原因:
- so 文件没有复制到
entry/libs/${OHOS_ARCH}/ - 复制的是软链接而不是实际文件
解决:
bash
# 查看 soname
llvm-readelf -d libz.so | grep SONAME
# 复制对应的文件
cp libz.so.1.3.1 entry/libs/arm64-v8a/
问题 2:编译时找不到头文件
fatal error: 'zlib.h' file not found
解决 :
检查 CMakeLists.txt 中的 target_include_directories 配置。
问题 3:链接错误
undefined reference to `deflate'
解决 :
检查 target_link_libraries 是否正确配置了库文件路径。
高级功能
移植原则
核心原则:移植过程不可以改源码!
- ❌ 不允许 patch .c/.cpp 文件
- ❌ 不允许 patch 构建脚本
- ✅ 如果必须 patch,需要充分的理由并经过评审
- ✅ 不接受业务相关的 patch
外部仓库管理
对于不方便直接放在 thirdparty 目录的库,可以使用外部仓库功能。
配置 module.json
json
{
"modules": [
{
"name": "tree",
"version": "2.2.1",
"git": {
"url": "https://gitcode.com/OpenHarmonyPCDeveloper/ohos_tree.git",
"branch": "ohos_2.2.1"
}
}
]
}
使用外部仓库
bash
# 构建系统会自动:
# 1. 检查 outerrepo/tree 是否存在
# 2. 如果不存在,根据 module.json 克隆仓库
# 3. 切换到指定分支
# 4. 执行构建
./build.sh tree
多版本支持(TODO)
未来版本将支持同一库的多个版本:
bash
# 期望的功能
./build.sh openssl@1.1.1
./build.sh openssl@3.0.0
# 依赖也可以指定版本
depends=("zlib>=1.2.11" "openssl@1.1.1")
并行编译
bash
# 在 build.sh 中配置
export MAKE="make -j8" # Make 使用 8 线程
export Ninja="ninja -j8" # Ninja 使用 8 线程
编译日志
每个库的编译会生成日志文件:
bash
# 构建日志
thirdparty/zlib/zlib-1.3.1-arm64-v8a-lycium_build.log
# 公共日志
thirdparty/zlib/zlib-public-lycium_build.log
# 主构建日志
lycium/lycium_build_intl.log
问题排查
编译问题
问题 1:环境检查失败
bash
gcc 命令未安装, 请先安装 gcc 命令
解决:
bash
# Ubuntu/Debian
sudo apt-get install build-essential
# CentOS/RHEL
sudo yum groupinstall "Development Tools"
# macOS
xcode-select --install
brew install gcc
问题 2:SDK 路径错误
bash
OHOS_SDK 未设置, 请先下载安装ohos SDK
解决:
bash
# 检查 SDK 目录结构
ls $OHOS_SDK/native/llvm/bin
# 如果路径错误,重新设置
export OHOS_SDK=/correct/path/to/sdk
问题 3:依赖未满足
bash
zlib not ready. wait openssl
原因:依赖库未编译
解决:
bash
# 先编译依赖
./build.sh openssl
# 再编译目标库
./build.sh zlib
问题 4:SHA512 校验失败
bash
SHA512SUM 校验失败, 请确认 SHA512SUM 无误后, 重新编译
解决:
bash
# 重新下载源码
rm packagename.tar.gz
# 重新生成校验和
wget <source-url>
sha512sum packagename.tar.gz > SHA512SUM
# 或者删除 SHA512SUM 文件(不推荐)
rm SHA512SUM
问题 5:交叉编译失败
bash
configure: error: cannot run C compiled programs
解决 :
确保使用了正确的工具链文件:
bash
# CMake 项目
-DCMAKE_TOOLCHAIN_FILE=$OHOS_SDK/native/build/cmake/ohos.toolchain.cmake
# Configure 项目
--host=aarch64-linux-ohos
测试问题
问题 1:测试环境不完整
bash
cmake command not found, please follow the CITools instruction
解决 :
参考 CItools 文档安装测试环境。
问题 2:动态库找不到
bash
error while loading shared libraries: libz.so: cannot open shared object file
解决:
bash
# 测试脚本应该会自动设置,如果没有:
export LD_LIBRARY_PATH=$LYCIUM_ROOT/usr/zlib/$ARCH/lib:$LD_LIBRARY_PATH
问题 3:测试权限不足
bash
mount: permission denied
解决:
bash
# 需要 root 权限
hdc shell mount -o remount,rw /
最佳实践
1. 目录命名规范
bash
# 库目录名应该与 pkgname 一致
thirdparty/zlib/ # ✅ 正确
thirdparty/ZLIB/ # ❌ 错误
thirdparty/zlib-1.3.1/ # ❌ 不要包含版本号
2. 版本号管理
bash
# HPKBUILD 中
pkgname=zlib
pkgver=1.3.1 # 精确版本号
pkgrel=0 # 适配版本,每次修改 HPKBUILD 时递增
# builddir 通常是
builddir="$pkgname-$pkgver" # zlib-1.3.1
3. 补丁文件管理
bash
# 补丁文件命名
0001-fix-cross-compile.patch # 按顺序编号
0002-disable-tests.patch
# 补丁开头应该包含说明
# --- 0001-fix-cross-compile.patch ---
# 修复交叉编译时的路径问题
# 影响文件:CMakeLists.txt
# 原因:原始脚本假设本地编译
# ---
4. 依赖声明
bash
# 运行时依赖
depends=("zlib" "openssl")
# 构建时依赖
makedepends=("cmake" "pkg-config")
# 注意:
# 1. depends 中的库必须先编译
# 2. makedepends 中的工具必须系统已安装
# 3. 依赖库的 archs 必须是当前库 archs 的超集
5. 编译选项
bash
# 推荐的 CMake 选项
-DCMAKE_BUILD_TYPE=Release # 使用 Release 模式
-DBUILD_SHARED_LIBS=ON # 优先生成动态库
-DBUILD_TESTING=OFF # 编译时关闭测试
-DCMAKE_SKIP_RPATH=ON # 跳过 RPATH
6. 测试编写
bash
# checkprepare 中设置环境
checkprepare() {
export LD_LIBRARY_PATH=...
mkdir -p test_dirs
return 0
}
# openharmonycheck 中执行测试
openharmonycheck() {
# 1. 尽量使用原生测试框架(ctest)
# 2. 记录详细日志
# 3. 返回正确的退出码
return $res
}
7. 文档编写
每个库目录下应该包含 README.md:
markdown
# 库名称
## 版本信息
- 原始版本:x.y.z
- 适配版本:0
- 支持架构:armeabi-v7a, arm64-v8a
## 依赖
- zlib >= 1.2.11
- openssl = 1.1.1
## 编译
\`\`\`bash
cd lycium
./build.sh pkgname
\`\`\`
## 使用
\`\`\`cmake
find_package(PkgName REQUIRED)
target_link_libraries(your_target PkgName::PkgName)
\`\`\`
## 已知问题
- 无
## 测试状态
- ✅ arm64-v8a: 全部通过
- ✅ armeabi-v7a: 全部通过
8. 代码审查清单
提交前检查:
- HPKBUILD 中所有必填字段已填写
- pkgname 与目录名一致
- archs 根据实际测试填写
- depends 正确列出所有依赖
- SHA512SUM 文件存在且正确
- 补丁文件有详细说明
- 在目标架构上测试通过
- HPKCHECK 测试脚本完整
- README.md 文档完整
- 无业务相关的 patch
常见问题 FAQ
Q1:为什么叫 Lycium?
A:Lycium(枸杞)是一种植物,寓意项目像枸杞一样"滋补"OpenHarmony 生态,为其提供丰富的第三方库支持。
Q2:可以在 Windows 上使用吗?
A:不建议。Lycium 是基于 Bash 脚本的,虽然可以通过 WSL 或 Cygwin 运行,但推荐使用 Linux 或 macOS。
Q3:如何贡献新的库?
A:
- Fork 项目
- 在 thirdparty 目录创建新库目录
- 编写 HPKBUILD 和 HPKCHECK
- 测试通过后提交 Pull Request
Q4:支持哪些 OpenHarmony 版本?
A:理论上支持所有 4.0+ 版本,具体取决于使用的 SDK 版本。
Q5:编译产物可以商用吗?
A:取决于第三方库的开源协议,请查看每个库的 license 字段。
Q6:如何调试编译问题?
A:
bash
# 查看详细日志
tail -f thirdparty/pkgname/pkgname-*-lycium_build.log
# 手动进入构建目录
cd thirdparty/pkgname/pkgname-x.y.z
# 手动执行编译命令
Q7:可以编译静态库吗?
A:可以,在 build() 函数中设置:
bash
-DBUILD_SHARED_LIBS=OFF
Q8:如何加速编译?
A:
- 使用 ccache
- 增加并行任务数:
export MAKE="make -j16" - 使用 SSD 硬盘
- 使用 Ninja 代替 Make
Q9:测试失败怎么办?
A:
- 查看测试日志:
lycium/check_result/check_fault/ - 检查依赖库是否正确安装
- 确认设备架构与编译架构一致
- 联系库的维护者
Q10:如何更新库的版本?
A:
- 修改 HPKBUILD 中的
pkgver - 更新
sourceURL - 重新生成 SHA512SUM
- 测试编译和运行
- 提交更新
附录
A. 工具链文件路径
| 工具 | 路径 |
|---|---|
| CMake | ${OHOS_SDK}/native/build-tools/cmake/bin/cmake |
| Clang (ARM64) | ${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang |
| Clang++ (ARM64) | ${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang++ |
| Clang (ARM32) | ${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clang |
| Clang++ (ARM32) | ${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clang++ |
| llvm-readelf | ${OHOS_SDK}/native/llvm/bin/llvm-readelf |
B. 架构标识
| 标识 | 说明 | GCC Target |
|---|---|---|
armeabi-v7a |
ARM 32位 ARMv7-A | arm-linux-ohos |
arm64-v8a |
ARM 64位 ARMv8-A | aarch64-linux-ohos |
x86 |
Intel 32位 | i686-linux-ohos |
x86_64 |
Intel 64位 | x86_64-linux-ohos |
C. 退出码说明
| 退出码 | 说明 |
|---|---|
| 0 | 成功 |
| 1 | 一般错误 |
| 2 | 文件格式错误 |
| 101 | 依赖未满足 |