# oh-compile-script **Repository Path**: harrysimply/oh-compile-script ## Basic Information - **Project Name**: oh-compile-script - **Description**: 基于conan技术鸿蒙化脚本 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2024-03-19 - **Last Updated**: 2024-03-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

oh-compile-script

oh-compile-script是一个基于Conan 2.x的一键编译鸿蒙库脚本

# 一、简介 该仓库为鸿蒙提供快速编译三方库的能力。它使用[Conan](https://conan.io/)框架进行编译三方库,并在此基础上进行封装,提供了统一的编译入口。它具有以下特点: - 使用简单:通过一行python 命令即可进行编译。 - 支持多平台:可在windows/linux下编译,无需配置编译环境 - 功能强大:支持多版本、支持构建动态库/静态库、支持Debug/Release版本、支持自定义源码编译 - 易于整理:编译过的三方库会在本地缓存、指定路径下安装、制品仓(需配置)处上传。 - 扩展性强:整个工程基于Conan构建,Conan基于python开发,方便用户进行客制化修改。 # 二、前期准备 ## 1. 下载代码 该项目使用了git submodules,可以通过以下命令克隆全部的源码, ```txt git clone --recursive https://gitee.com/fengozl/oh-compile-script.git ``` 后续每次更新都有可能更新子模块,所以每次拉取最新代码后请随手执行**更新子模块**命令, ```txt git pull git submodule update ``` ## 2. 配置环境 ### 2.1. Windows环境 #### 2.1.1. 安装Python 由于Conan基于Python构建,因此需要先[安装Python](https://www.python.org/downloads/windows/) >= 3.X。 #### 2.1.2. 安装Conan [Conan](https://conan.io/downloads)在官方网站上提供了多种下载方式,这里推荐使用Python的pip命令进行安装,具体步骤请参考如下命令: ```txt pip install conan==2.0.14 ``` 初次使用Conan需要根据当前构建环境生成对应的profile: ```txt conan profile detect --force ``` 如果安装比较慢或者安装失败,可以使用国内镜像源。目前支持Conan 2.0.12、2.0.14版本 其他安装方式请参考Conan文档中 [Install](https://docs.conan.io/2/installation.html) 一章。 #### 2.1.3. 设置SDK 编译三方库的核心是使用鸿蒙工具链编译,鸿蒙工具链获取可以有如下两种方式: ##### 方式一: 使用DevEco Studio中的sdk 前提:本地已安装DevEco Studio。 如果本地已安装DevEco Studio,可直接使用,无需重新下载sdk; DevEco Studio安装可阅读鸿蒙的[官方网站](https://developer.huawei.com/consumer/cn/deveco-studio/),此处不做介绍,仅介绍使用DevEco Studio中sdk进行配置。 在DevEco Studio中打开`Tools`下的`Sdk Manager`, ![deveco sdk manager](doc/deveco_sdk.png) 找到`OpenHarmony`或是`HarmonyOS`对应的location目录: ![Alt text](doc/image-1.png) 在系统环境变量中添加该 `OHOS_SDK`,它的值等于上面的`Location`加上api数字,如果不确定当前的api版本可以打开`Location`查看, ![sdk list](doc/sdk_list.png) 添加设置环境变量, ![set env](doc/set_env.png) ##### 方式二: 直接下载sdk 首先从[OpenHarmony的gitee仓库](https://gitee.com/openharmony-sig/oh-inner-release-management/blob/master/Release-Testing-Version.md)下载sdk,`建议下载新版`。 在网页上搜索 `sdk(windows+linux):` 获取下载链接, ![download sdk](doc/download_sdk.png) 解压后进入`ohos-sdk/windows`文件夹,对下面的zip包全部进行解压, ![unzip sdk](doc/unzip_sdk.png) 最后设置环境变量,详见`使用DevEco Studio中的sdk`的最后一步,`OHOS_SDK`的值应为当前解压目录。 ### 2.2 Linux环境 (推荐) #### 2.2.1. 安装Python ``` $ sudo apt-get update $ sudo apt-get install python3 $ sudo apt-get install python3-pip ``` #### 2.2.2. 安装Conan ``` sudo pip install conan==2.0.14 # -i https://pypi.tuna.tsinghua.edu.cn/simple/ conan profile detect --force # generate profile ``` #### 2.2.3. 设置SDK 首先打开[官方发布渠道](https://gitee.com/openharmony-sig/oh-inner-release-management/blob/master/Release-Testing-Version.md), 在网页上搜索 `sdk(windows+linux):`,右键复制链接地址, ```txt # 通过http进行下载 wget https://gitee.com/link?target=http%3A%2F%2Fdownload.ci.openharmony.cn%2Fversion%2FMaster_Version%2FOpenHarmony_3.2.10.9%2F20230225_073754%2Fversion-Master_Version-OpenHarmony_3.2.10.9-20230225_073754-ohos-sdk-full.tar.gz # 解压安装包 tar -zxvf version-Master_Version-OpenHarmony_3.2.10.9-20230225_073754-ohos-sdk-full.tar.gz # 进入解压后的sdk中 cd ohos-sdk/linux ``` 进入解压得到 `ohos_sdk` 目录下的 `linux` 目录,我们进一步解压, ``` for i in *.zip; do unzip ${i}; done ``` 解压完毕后,当前文件夹下的路径和目录应为, ![linux set done](doc/linux_set_done.png) 设置环境变量, ``` txt export OHOS_SDK=/home/hsun21/ohos-sdk/linux #请替换为您主机下sdk的路径 ``` 为了使其每次开机生效,我们可以将其加入到开机运行的脚本下, ``` txt # 此处以ubuntu为例,其他版本的unix系统设置方法请自行搜索 echo "export OHOS_SDK=/home/hsun21/ohos-sdk/linux" >> ~/.bashrc # 执行.bashrc内的命令 source ~/.bashrc ``` ### 2.3 Mac环境 #### 2.3.1 安装 Python环境 使用 brew安装python3 ```bash brew install python3.8 ``` #### 2.3.2 安装 conan 使用 pip3 安装conan ```bash pip3 install conan==2.0.14 ``` 使用 conan 指令检查是否安装成功: ```bash 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。 ```bash export PATH=$PATH:/Users/{user_name}/Library/Python/3.9/bin ``` 然后执行: ```bash source ~/.zshrc #或者 source ~/.zshrc ``` 此时在任意验证 `conan --version` 可执行命令 #### 2.3.3设置 SDK 在~/.bash_profile 或者source ~/.zshrc 文件中增加一行: ```bash export OHOS_SDK={鸿蒙 SDK 路径} ``` # 三、如何使用 完成前期准备以后,运行如下命令, ``` python python conanbuild.py ``` 以`zlib`为例进行展示, ``` txt $ 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): ``` 参数说明: - libName: 当前支持的三方库,为conan-center-index/recipes下的三方库名。当前支持的三方库可以参考[当前鸿蒙的开源软件](#四当前鸿蒙的开源软件) - version: 编译的版本,支持的版本会在上方打印出来 - build type: Debug或者Release - static or shared: 生成动态的.so库或静态的.a库 - install path: 三方库的构建完成后所安装的路径 - custom source path:自定义源码目录 编译完成后会在 `install path` 下生成编译完成后的二进制文件和头文件。 在`cmd`或`terminal`中输入, ``` txt conan list zlib:* ``` 如果成功展示出的`zlib`库,则说明整个项目工作正常。接下来就可以尝试编译更多的三方库了。 ![conan list](doc/conan_list.png) # 四、 常见问题 1. 三方库源码下载问题? 由于三方库源码基本都在github,下载过程中可能出现网络问题,可以考虑使用科学上网工具; 2. 如何使用本地源码编译? 可在脚本执行到`Please set the custom source path(not necessary):`步骤时输入本地的源码目录。 在使用本地源码时,可能由于源码需要添加自定义特性,而导致脚本中出现patch打不上或是修改(replace_in_file)替换问题,可考虑将脚本中的patch和修改(replace_in_file)去掉,只编译本地源码。后续再根据自己需求添加脚本中提供的patch和修改(replace_in_file)。 可参考[三方库源码修改方法](doc/QA/修改三方库源码的方法.md)查看基于官方源码的修改调整。 3. 需要的三方库在[已支持开源软件](#六已支持开源软件)中不存在或是版本不存在? 可在gitee填写issue,可参考[新增三方库issue样例](https://gitee.com/fengozl/oh-compile-script/issues/I8VFKN); 4. 出现`The system cannot find the path specified.`问题? 检查OHOS_SDK环境配置,OHOS_SDK的值为鸿蒙sdk中native文件夹所在的目录;如配置后未生效,windows环境下需要重新打开CMD窗口。windows环境建议使用cmd或是powershell; 5. 修改了三方库源码,但是重新编译未生效? 使用`conan remove xxx -c`清除缓存后重新编译; 6. [已支持开源软件](#六已支持开源软件)中三方库编译不通过,如何解决? 列表中三方库已经过验证,均能编译通过,如出现编译不通过问题,可参考[三方库编译问题](https://gitee.com/fengozl/oh-compile-script/issues/I8VGM2)填写issue; 7. `Testing the package`报错,如何解决? `Testing the package`阶段为生成在鸿蒙系统中可执行二进制文件阶段,此阶段基本上已成功编译出三方库文件,可在`build`文件夹中查看。也可在`config/conan_build_args_mapping.yml`文件配置跳过。具体可参考[config中配置说明](doc/QA/config中配置说明.md); 8. 如何查看三方库依赖? 参考[三方库编译依赖管理](doc/QA/三方库编译依赖.md) 9. 如何查看脚本修改了三方库中的哪些源码? 参考[三方库源码修改方法](doc/QA/修改三方库源码的方法.md) 10. 如何调整三方库编译时使用的编译工具(cmake、make,configure)的参数和选项? 参考[conanfile.py调整编译参数](doc/QA/Conanfile.py调整编译参数.md) 11. 工具链cmake升级 修改config/profile_ohos中tools.cmake:cmake_program,设置为本地高版本cmake 12. 如何将完整日志输出至文件中? windows环境:python .\conanbuild.py 2>&1 |tee xxx.log linux环境: python conanbuild.py 2>&1 | tee xxx.log 13. 调整动态库soname 使用patchelf(仅linux环境下使用)工具修改动态库soname。 ```shell # 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](https://github.com/harfbuzz/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依赖参考[三方库链接问题](doc/QA/引入三方库链接问题.md#如何规避) | | 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](https://github.com/strophe/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 || | 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.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.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|| | 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|| | yas|7.0.5|| | mpg123|1.29.3|| | libxmp| 4.2.6|| | nvcloth| master|| | raknet| 3.25, 4.081|| | libzip| 1.5.2|| # 扩展阅读 ## 1. conan的使用 [官方文档](https://docs.conan.io/2/) ## 2. jfrog制品仓 [仓库配置](https://docs.conan.io/2/tutorial/conan_repositories/setting_up_conan_remotes/artifactory/artifactory_ce_cpp.html)