1# Makefile方式组织编译的库移植 2 3 4以yxml库为例,其移植过程如下文所示。 5 6 7## 源码获取 8 9从仓库[获取yxml源码](https://github.com/getdnsapi/yxml),其目录结构如下表: 10 11 **表1** 源码目录结构 12 13| 名称 | 描述 | 14| -------- | -------- | 15| yxml/bench/ | benchmark相关代码 | 16| yxml/test/ | 测试输入输出文件,及测试脚本 | 17| yxml/Makefile | 编译组织文件 | 18| yxml/.gitattributes | - | 19| yxml/.gitignore | - | 20| yxml/COPYING | - | 21| yxml/yxml.c | - | 22| yxml/yxml.c.in | - | 23| yxml/yxml-gen.pl | - | 24| yxml/yxml.h | - | 25| yxml/yxml.md | - | 26| yxml/yxml-states | - | 27 28 29## 设置交叉编译 30 31设置Makefile的交叉编译工具链,修改并编译该库,生成OpenHarmony平台的可执行文件,步骤如下: 32 331. 设置工具链 34 将下列clang工具链配置替换掉yxml库根目录的Makefile(即表1中的文件)中的原有配置。 35 36 clang工具链配置: 37 38 ``` 39 #设置交叉编译工具链,确保工具链所在路径已经添加到了PATH环境变量中 40 CC:=clang 41 AR:=llvm-ar 42 #cflags中必须要添加--target及--sysroot选项 43 CFLAGS:=-Wall -Wextra -Wno-unused-parameter -O2 -g --target=arm-liteos -march=armv7-a -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4 --sysroot=$(OHOS_SYSROOT_PATH) 44 ``` 45 46 原有配置: 47 48 49 ``` 50 CC:=gcc 51 AR:=ar 52 CFLAGS:=-Wall -Wextra -Wno-unused-parameter -O2 -g 53 ``` 54 552. 执行编译 56 linux命令行中进入yxml的源文件目录(即图1所示目录),执行下列命令: 57 58 59 ``` 60 make test OHOS_SYSROOT_PATH=... 61 ``` 62 63 其中OHOS_SYSROOT_PATH需用绝对路径指定出sysroot所在目录,以OpenHarmony为例即源码根目录下out/hispark_xxx/ipcamera_hispark_xxx/sysroot目录的绝对路径。上述目录会在全量编译后生成,因此移植前先完成一次全量编译。 64 653. 查看结果 66 步骤2操作完成后,yxml下会生成out目录,里面有静态库文件和测试用例: 67 68 **表2** yxml编译生成目录 69 70 | 名称 | 描述 | 71 | -------- | -------- | 72 | OpenHarmony/third_party/yxml/yxml/out/lib/ | 编译生成的静态库的存放目录 | 73 | OpenHarmony/third_party/yxml/yxml/out/test/ | 编译生成的测试用例及其输入输出等文件的存放目录 | 74 75 76## 测试 77 78yxml库测试步骤与double-conversion库基本一致,可参考[CMake方式组织编译的库移植](../porting/porting-thirdparty-cmake.md#测试)的测试过程,以下内容介绍yxml库测试用例的使用方法: 79 80 **表3** 生成的test目录结构示意 81 82| 名称 | 描述 | 83| -------- | -------- | 84| OpenHarmony/third_party/yxml/yxml/out/test/test.sh | 自动化测试脚本,由于OpenHarmony不支持脚本运行,因此无法使用,可参考其内容手动测试 | 85| OpenHarmony/third_party/yxml/yxml/out/test/test | 用于测试的可执行文件 | 86| OpenHarmony/third_party/yxml/yxml/out/test/\*.xml | 测试输入文件 | 87| OpenHarmony/third_party/yxml/yxml/out/test/\*.out | 期望的输出文件 | 88 89test.sh内容如下所示: 90 91 92``` 93#!/bin/sh 94for i in *.xml; do 95 b=`basename $i .xml` 96 o=${b}.out 97 t=${b}.test 98 ./test <$i >$t 99 if [ -n "`diff -q $o $t`" ]; then 100 echo "Test failed for $i:" 101 diff -u $o $t 102 exit 1 103 fi 104done 105echo "All tests completed successfully." 106``` 107 108由于OpenHarmony的shell中暂不支持输入输出重定向(<和>),所以测试时需要将输入\*.xml文件内容直接复制进shell后回车,输出内容会直接展示在shell窗口。过程如下: 109 110下列操作假定已按照2.4节的步骤搭建OpenHarmony,挂载并进入nfs目录: 111 1121. 执行下列命令 113 114 ``` 115 ./test 116 ``` 117 1182. 复制\*.xml内容到shell 119 以表3test目录下pi01.xml为例,内容如下,输入到shell并回车: 120 121 ``` 122 <?SomePI abc?><a/> 123 ``` 124 1253. 比较shell中输出的内容与表3test目录中对应的\*.out文件是否一致 126 输出结果如下: 127 128 129 ``` 130 pistart SomePI 131 picontent abc 132 piend 133 elemstart a 134 elemend 135 ok 136 ``` 137 138 经比较与表3test目录下pi01.out内容一致,测试通过。 139 140 141## 将该库编译添加到OpenHarmony工程中 142 143yxml库添加的过程除了适配文件build.gn和config.gni有些许变化外,其他和double-conversion库完全一致,参考[CMake方式组织编译的库移植](../porting/porting-thirdparty-cmake.md#将该库编译添加到openharmony工程中)的配置过程。要修改的适配文件及添加后的目录结构如下: 144 145- yxml库新增的BUILD.gn实现如下: 146 147 148``` 149import("config.gni") 150group("yxml") { 151 if (ohos_build_thirdparty_migrated_from_fuchisa == true) { 152 deps = [":make"] 153 } 154} 155if (ohos_build_thirdparty_migrated_from_fuchisa == true) { 156 action("make") { 157 script = "//third_party/yxml/build_thirdparty.py" 158 outputs = ["$target_out_dir/log_yxml.txt"] 159 exec_path = rebase_path(rebase_path("./yxml", root_build_dir)) 160 command = "make clean && $MAKE_COMMAND" 161 args = [ 162 "--path=$exec_path", 163 "--command=${command}" 164 ] 165 } 166} 167``` 168 169- yxml库新增的config.gni配置如下: 170 171 172``` 173TEST_ENABLE = "YES" 174 175if (TEST_ENABLE == "YES") { 176 MAKE_COMMAND = "make test OHOS_SYSROOT_PATH=${root_out_dir}sysroot/" 177} else { 178 MAKE_COMMAND = "make OHOS_SYSROOT_PATH=${root_out_dir}sysroot/" 179} 180``` 181 182- 添加完成后目录结构示意: 183 184 **表4** 添加到工程后的目录结构 185 186| 名称 | 描述 | 187| -------- | -------- | 188| OpenHarmony/third_party/yxml/BUILD.gn | 将三方库加入工程的gn适配文件 | 189| OpenHarmony/third_party/yxml/build_thirdparty.py | GN调用shell命令脚本文件,由上面GN文件将相关命令传入,实现GN转Makefile | 190| OpenHarmony/third_party/yxml/config.gni | 三方库编译配置文件,可修改该文件来配置用例是否参与构建等 | 191| OpenHarmony/third_party/yxml/yxml/ | 要移植的三方库目录 | 192