oh-compile-script是一个基于Conan 2.x的一键编译鸿蒙库脚本
该仓库为鸿蒙提供快速编译三方库的能力。它使用Conan框架进行编译三方库,并在此基础上进行封装,提供了统一的编译入口。它具有以下特点:
该项目使用了git submodules,可以通过以下命令克隆全部的源码,
git clone --recursive https://gitee.com/fengozl/oh-compile-script.git
后续每次更新都有可能更新子模块,所以每次拉取最新代码后请随手执行更新子模块命令,
git pull
git submodule update
由于Conan基于Python构建,因此需要先安装Python >= 3.X。
Conan在官方网站上提供了多种下载方式,这里推荐使用Python的pip命令进行安装,具体步骤请参考如下命令:
pip install conan==2.0.14
初次使用Conan需要根据当前构建环境生成对应的profile:
conan profile detect --force
如果安装比较慢或者安装失败,可以使用国内镜像源。目前支持Conan 2.0.12、2.0.14版本 其他安装方式请参考Conan文档中 Install 一章。
编译三方库的核心是使用鸿蒙工具链编译,鸿蒙工具链获取可以有如下两种方式:
前提:本地已安装DevEco Studio。
如果本地已安装DevEco Studio,可直接使用,无需重新下载sdk; DevEco Studio安装可阅读鸿蒙的官方网站,此处不做介绍,仅介绍使用DevEco Studio中sdk进行配置。
deveco studio安装之后,找到对应的安装目录:
在系统环境变量中添加该 OHOS_SDK
,其值等于上述截图中的位置;
添加设置环境变量:
首先从官方网站下载Command line tools下载sdk,建议下载新版
。
解压后进入ohos-sdk/windows
文件夹,对下面的zip包全部进行解压,
最后设置环境变量,详见使用DevEco Studio中的sdk
的最后一步,OHOS_SDK
的值应为当前解压目录。
$ sudo apt-get update
$ sudo apt-get install python3
$ sudo apt-get install python3-pip
sudo pip install conan==2.0.14 # -i https://pypi.tuna.tsinghua.edu.cn/simple/
conan profile detect --force # generate profile
首先打开官方发布渠道,
在网页上选择 linux
,找到需要的版本,右键复制链接地址。
# 通过http进行下载
wget https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_package_901_9/6a/v3/jlrZ2w3bTTmfNKeC0QxjLQ/commandline-tools-linux-x64-5.0.7.100.zip?HW-CC-KV=V1&HW-CC-Date=20250120T122914Z&HW-CC-Expire=7200&HW-CC-Sign=F0E2410AF4DAC7892E90FA842B1F5FA07C15F4C209B4A405AA05F1B2956540C7
# 解压安装包
unzip commandline-tools-linux-x64-5.0.7.100.zip
设置环境变量:
export OHOS_SDK=/home/xxx/command-line-tools/sdk/default/openharmony #请替换为您主机下sdk的路径
为了使其每次开机生效,我们可以将其加入到开机运行的脚本下:
# 此处以ubuntu为例,其他版本的unix系统设置方法请自行搜索
echo "export OHOS_SDK=/home/xxx/command-line-tools/sdk/default/openharmony" >> ~/.bashrc
# 执行.bashrc内的命令
source ~/.bashrc
使用 brew安装python3
brew install python3.8
使用 pip3 安装conan
pip3 install conan==2.0.14
使用 conan 指令检查是否安装成功:
conan --version
如果出现回显zsh: command not found: conan
则需要在系统配置中配置conan路径:
搜索 conan 路径,定位到 canon 在/Users/{user_name}/Library/Python/3.9/bin
路径下。
在~/.bash_profile
或 ~/.zshrc
文件中增加一行:
修改.bash_profile或.zshrc 文件取决于 mac 上面终端用的是 bash 还是 zsh。
export PATH=$PATH:/Users/{user_name}/Library/Python/3.9/bin
然后执行:
source ~/.zshrc #或者 source ~/.zshrc
此时在任意验证 conan --version
可执行命令
在~/.bash_profile 或者source ~/.zshrc 文件中增加一行:
export OHOS_SDK={鸿蒙 SDK 路径}
完成前期准备以后,运行如下命令,
python conanbuild.py
# 将日志重定向到log文件中
python conanbuild.py 2>&1 | tee log
以zlib
为例进行展示,
$ python conanbuild.py
Please input the supported library name (name is the folder name below conan-center-index_ohos/recipes) : zlib
['1.3', '1.2.13', '1.2.12', '1.2.11', 'all']
Please input the version from the above list : 1.3
Please set the build type (Debug or Release,empty for Release) :
Please set the compile target as static(False, default) or shared(True) :
Please input the install path(empty for xx\oh-compile-script/build/zlib/1.3/Release) :
Please set the custom source path(not necessary):
参数说明:
编译完成后会在 install path
下生成编译完成后的二进制文件和头文件。
在cmd
或terminal
中输入,
conan list zlib:*
如果成功展示出的zlib
库,则说明整个项目工作正常。接下来就可以尝试编译更多的三方库了。
三方库源码下载问题?
由于三方库源码基本都在github,下载过程中可能出现网络问题,可以考虑使用科学上网工具;
如何使用本地源码编译?
可在脚本执行到Please set the custom source path(not necessary):
步骤时输入本地的源码目录。
在使用本地源码时,可能由于源码需要添加自定义特性,而导致脚本中出现patch打不上或是修改(replace_in_file)替换问题,可考虑将脚本中的patch和修改(replace_in_file)去掉,只编译本地源码。后续再根据自己需求添加脚本中提供的patch和修改(replace_in_file)。
可参考三方库源码修改方法查看基于官方源码的修改调整。
需要的三方库在已支持开源软件中不存在或是版本不存在?
可在gitee填写issue,可参考新增三方库issue样例;
出现The system cannot find the path specified.
问题?
检查OHOS_SDK环境配置,OHOS_SDK的值为鸿蒙sdk中native文件夹所在的目录;如配置后未生效,windows环境下需要重新打开CMD窗口。windows环境建议使用cmd或是powershell;
修改了三方库源码,但是重新编译未生效?
使用conan remove xxx -c
清除缓存后重新编译;
已支持开源软件中三方库编译不通过,如何解决?
列表中三方库已经过验证,均能编译通过,如出现编译不通过问题,可参考三方库编译问题填写issue;
Testing the package
报错,如何解决?
Testing the package
阶段为生成在鸿蒙系统中可执行二进制文件阶段,此阶段基本上已成功编译出三方库文件,可在build
文件夹中查看。也可在config/conan_build_args_mapping.yml
文件配置跳过。具体可参考config中配置说明;
如何查看三方库依赖?
如何查看脚本修改了三方库中的哪些源码?
如何调整三方库编译时使用的编译工具(cmake、make,configure)的参数和选项?
工具链cmake升级
修改config/profile_ohos中tools.cmake:cmake_program,设置为本地高版本cmake
如何将完整日志输出至文件中?
windows环境:python .\conanbuild.py 2>&1 |tee xxx.log
linux环境: python conanbuild.py 2>&1 | tee xxx.log
调整动态库soname
使用patchelf(仅linux环境下使用)工具修改动态库soname。
# patchelf工具需要在linux环境下使用
# 将libunwind.so中的soname修改为libunwind.so
patchelf --set-soname libunwind.so libunwind.so
# patchelf修改needed
# 修改libunwind-aarch64.so中的needed,libunwind.so.8修改为libunwind.so
patchelf --replace-needed libunwind.so.8 libunwind.so libunwind-aarch64.so
以下软件已经过测试
软件名字 | 支持的版本 | 备注 |
---|---|---|
asio | 1.23.0, 1.22.1, 1.22.0, 1.21.0, 1.20.0, 1.19.2, 1.19.1, 1.19.0, 1.18.2, 1.18.1, 1.18.0, 1.17.0, 1.16.1, 1.16.0, 1.14.1, 1.14.0, 1.13.0, 1.12.2 | |
brotli | 1.1.0, 1.0.9, 1.0.7 | |
bzip2 | 1.0.8, 1.0.6 | |
c-ares | 1.21.0, 1.20.1, 1.19.1, 1.19.0, 1.18.1, 1.17.2, 1.17.1, 1.16.1, 1.15.0, 1.14.0 | |
chipmunk2d | 7.0.3 | |
cpu-features | 0.9.0, 0.8.0, 0.7.0, 0.6.0 | |
cunit | 2.1-3 | |
detex | v0.1.1 | |
double-conversion | 3.3.0, 3.2.1, 3.2.0, 3.1.7, 3.1.6, 3.1.5, 3.1.4 | |
eigen | 3.4.0, 3.3.9, 3.3.8,3.3.7 | |
expat | 2.5.0, 2.4.9, 2.4.8, 2.4.7, 2.4.6, 2.4.5, 2.4.4, 2.4.3, 2.4.2, 2.4.1, 2.3.0, 2.2.10, 2.2.0 | |
freetype | 2.10.4, 2.11.1, 2.12.1, 2.13.0 | |
gmp | 6.1.2, 6.2.0, 6.2.1, 6.3.0 | |
harfbuzz | 8.3.0, 8.2.2, 8.2.1, 8.1.1, 8.0.1, 7.3.0, 6.0.0, 5.1.0,2.4.0 | |
hwcpipe | 2.2.0, 2.1.0, 2.0.0, v.2.0 | |
imath | 3.1.9, 3.1.8, 3.1.7, 3.1.6, 3.1.5, 3.1.4 | |
jasson | 2.14, 2.13, 2.12 | |
jasper | 4.0.0, 3.0.6, 2.0.33 | |
jbig | 20160605 | |
jxrlib | cci.20170615 | |
lcms | 2.14, 2.13.1 | |
libcurl | 7.34.0, 7.60.0, 7.79.1, 7.80.0, 7.82.0, 7.83.1, 7.84.0, 7.85.0, 7.86.0, 7.87.0, 7.88.1, 8.0.1, 8.1.1, 8.1.2, 8.2.0, 8.2.1, 8.4.0 | 如何修改openssl依赖参考三方库链接问题 |
libdeflate | 1.19, 1.18, 1.17, 1.15, 1.14, 1.12, 1.10, 1.9, 1.8, 1.7 | |
libev | 4.33, 4.27, 4.25 | |
libevent | 2.1.12, 2.1.11 | |
libexpat | 2.1.12, 2.1.11 | |
libfdk_aac | 2.0.2, 2.0.1, 2.0.0 | |
libiconv | 1.17, 1.16, 1.15, 1.13.1 | |
libjpeg | 9c, 9d, 9e, 9 | |
libmp3lame | 3.100, 3.99.5, 3.98.4 | |
libnghttp2 | 1.58.0, 1.57.0, 1.56.0, 1.55.1, 1.55.0, 1.54.0, 1.53.0, 1.51.0, 1.50.0 | |
libpng | 1.5.30, 1.6.32, 1.6.37, 1.6.38, 1.6.39, 1.6.40, 1.6.34 | |
libraw | 0.21.1, 0.20.2, 0.20.0 | |
libsamplerate | 0.2.2, 0.2.1 | |
libstrophe | 0.12.3, 0.12.2, 0.12.0, 0.11.0, 0.10.1, 0.9.3, 0.9.1 | |
libtiff | 4.6.0, 4.5.1, 4.5.0, 4.4.0, 4.3.0 | |
libwebp | 1.3.2, 1.3.1, 1.2.4, 1.1.0 | |
libwebsockets | 4.3.2, 4.3.0, 4.2.1, 4.1.6, 4.1.4, 4.0.15, 3.0.0, 1.7.9, 1.6.3, 1.6.0 | |
libx264 | cci.20220602, 20191217, 20190605 | |
libxml2 | 2.11.5 | |
libyaml | 0.2.2,0.2.5 | |
libpbc | master | |
lmdb | 0.9.29 | |
luajit | 2.1.0-beta3 | |
lua-cjson | 1.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 2.0.0, 2.1.0 | |
lua-socket | 3.0.0, 3.1.0 | |
lz4 | 1.9.4, 1.9.3, 1.9.2 | |
mikktspace | cci.20200325 | |
nettle | 3.8.1, 3.6, 3.5 | |
ngtcp2 | 1.0.1, 1.0.0, 0.19.1 | |
nghttp3 | 1.0.0, 0.15.0 | |
ogg | 1.3.5, 1.3.4 | |
openssl | 1.0.1t, 1.0.2u, 1.1.0c, 1.1.0f, 1.1.1, 1.1.1b 1.1.1k, 1.1.1t 1.1.1u, 1.1.1v, 1.1.1w, 3.0.11, 3.0.12, 3.1.0, 3.1.1, 3.1.2, 3.1.3, 3.1.4 | 3.x版本添加了provider,需配合使用 |
physX | 4.1.1, 4.1.2 | |
sdl | 2.28.3, 2.28.2, 2.26.5, 2.26.1, 2.26.0, 2.24.1, 2.24.0, 2.0.20 | |
tinyxml2 | 7.1.0,8.0.0,9.0.0 | |
theora | 1.1.1 | |
tremolo | 0.08, 0.07, 0.06 | |
vorbis | 1.3.7, 1.3.6 | |
xerces-c | 3.2.4, 3.2.3, 3.2.2 | |
xz_utils | 5.4.4, 5.4.2, 5.4.0, 5.2.10, 5.2.5, 5.2.4 | |
zlib | 1.3, 1.2.13, 1.2.12, 1.2.11, 1.2.8 | |
zstd | 1.5.5, 1.5.4, 1.5.2, 1.5.1, 1.5.0, 1.4.9, 1.4.8, 1.4.7, 1.4.5, 1.4.4, 1.4.3, 1.3.8, 1.3.5 | |
spidermonkey | v33 | 仅支持在Linux环境编译,且环境依赖Python27 |
libjpeg-turbo | 3.0.0, 2.1.5, 2.0.6 | |
opus | 1.4, 1.3.1 | |
libx265 | 3.4, 3.2.1 | |
libunwind | 1.1, 1.3.1, 1.5.0, 1.6.2, 1.7.0, 1.7.2 | |
libvpx | 1.11.0, 1.10.0, 1.9.0 | |
liquidfun | 1.1.0, 1.0.0 | |
meshoptimizer | 0.17, 0.16, 0.15, 0.14 | |
llvm-openmp | 16.0.6, 14.0.6, 13.0.1, 12.0.1, 11.1.0, 10.0.0, 9.0.1 | |
openh264 | 2.3.1, 2.1.1, 1.7.0 | |
protobuf | 3.21.12, 3.21.9, 3.21.4, 3.20.0, 3.19.6, 3.19.4, 3.18.1, 3.17.1, 3.5.1 | |
sparsehash | 2.0.3, 2.0.4 | |
box2d | 2.3.1, 2.4.0, 2.4.1 | |
clipper | 6.4.2, 4.10.0 | |
ffmpeg | 6.1, 6.0, 5.1.3, 5.0.3, 5.0, 4.4.4, 4.4.3, 4.4, 4.3.2, 4.2.1, 3.4 | |
freeimage | 3.18.0 | |
libart | master | |
openexr | 3.1.9, 3.1.7, 3.1.5, 2.5.7, 2.5.5, 2.5.3, 2.5.2, 2.5.0, 2.4.1 | |
speexdsp | 1.2.1 | |
openal-soft | 1.22.0 | 不支持脚本直接编译,需通过源码编译。已适配源码参考:https://gitee.com/WayneHalak/open-al-soft/commits/master |
yas | 7.0.5 | |
mpg123 | 1.29.3 | |
libxmp | 4.2.6 | |
nvcloth | master | |
raknet | 3.25, 3.8, 4.081 | |
libzip | 1.5.2 | |
cpr | 1.7.0 | 依赖libcurl和openssl,编译libcurl时,需将cookies功能关闭 |
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。