• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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中暂不支持输入输出重定向(&lt;和&gt;),所以测试时需要将输入\*.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.gnconfig.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