# CMakeæ–¹å¼ç»„ç»‡ç¼–è¯‘çš„åº“ç§»æ¤ ä»¥double-conversion库为例,其移æ¤è¿‡ç¨‹å¦‚下文所示。 ## æºç èŽ·å– ä»Žä»“åº“[获å–double-conversionæºç ](https://github.com/google/double-conversion),其目录结构如下表: **表1** æºç 目录结构 | åç§° | æè¿° | | -------- | -------- | | double-conversion/cmake/ | CMakeç»„ç»‡ç¼–è¯‘ä½¿ç”¨åˆ°çš„æ¨¡æ¿ | | double-conversion/double-conversion/ | æºæ–‡ä»¶ç›®å½• | | double-conversion/msvc/ | - | | double-conversion/test/ | æµ‹è¯•ç”¨ä¾‹æºæ–‡ä»¶ | | double-conversion/.gitignore | - | | double-conversion/AUTHORS | - | | double-conversion/BUILD | - | | double-conversion/CMakeLists.txt | CMakeæ–¹å¼é¡¶å±‚编译组织文件 | | double-conversion/COPYING | - | | double-conversion/Changelog | - | | double-conversion/LICENSE | - | | double-conversion/Makefile | - | | double-conversion/README.md | - | | double-conversion/SConstruct | - | | double-conversion/WORKSPACE | - | ## ç§»æ¤æ€è·¯ ç§»æ¤æ€è·¯ï¼šé€šè¿‡ä¿®æ”¹å·¥å…·é“¾ï¼Œäº¤å‰ç¼–译该三方库,生æˆOpenHarmonyå¹³å°çš„坿‰§è¡Œæ–‡ä»¶ï¼Œæœ€åŽå†é€šè¿‡GN调用CMakeçš„æ–¹å¼æ·»åŠ åˆ°OpenHarmony工程ä¸ã€‚ ## 交å‰ç¼–译 ### 编译å‚考 代ç 仓库的[README.md](https://github.com/google/double-conversion/blob/master/README.md)ä¸è¯¦ç»†ä»‹ç»äº†ä½¿ç”¨CMake编译double-conversion库的æ¥éª¤ï¼Œä»¥åŠæµ‹è¯•方法。本文å‚考该指导设置该库的编译é…ç½®ï¼Œå¹¶å®Œæˆæµ‹è¯•。若开å‘人员在移æ¤è¿‡ç¨‹ä¸å¯¹è¯¥åº“的编译选项é…置有疑惑的地方,å¯å‚考该指导。对于其他使用CMakeå¯ç‹¬ç«‹ç¼–è¯‘çš„ä¸‰æ–¹åº“ï¼Œåœ¨ç§»æ¤æ—¶å¯ä»¥å‚考其自带的编译指导。 ### 设置执行交å‰ç¼–译 CMakeæ–¹å¼å¯é€šè¿‡æŒ‡å®šå·¥å…·é“¾è¿›è¡Œäº¤å‰ç¼–译,修改并编译该库,生æˆOpenHarmonyå¹³å°çš„坿‰§è¡Œæ–‡ä»¶ï¼Œæ¥éª¤å¦‚下: 1. 设置工具链 将下列clang工具链é…ç½®æ·»åŠ åˆ°è¯¥å·¥ç¨‹çš„é¡¶å±‚CMakeLists.txt(å³è¡¨1ä¸çš„该文件)ä¸å³å¯ã€‚ ``` set(CMAKE_CROSSCOMPILING TRUE) set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_CXX_COMPILER_ID Clang) set(CMAKE_TOOLCHAIN_PREFIX llvm-) #指定c编译工具(确ä¿å·¥å…·é“¾æ‰€åœ¨è·¯å¾„å·²ç»æ·»åŠ åˆ°äº†PATH环境å˜é‡ä¸ï¼‰å’Œç¼–è¯‘æ ‡å¿—ï¼Œä½¿ç”¨clangç¼–è¯‘æ—¶æ ‡å¿—ä¸å¿…须指定--target,å¦åˆ™æ— 法交å‰ç¼–译。 set(CMAKE_C_COMPILER clang) set(CMAKE_C_FLAGS "--target=arm-liteos -D__clang__ -march=armv7-a -w -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4") #指定c++编译工具(确ä¿å·¥å…·é“¾æ‰€åœ¨è·¯å¾„å·²ç»æ·»åŠ åˆ°äº†PATH环境å˜é‡ä¸ï¼‰å’Œç¼–è¯‘æ ‡å¿—ï¼Œå¿…é¡»æŒ‡å®š--target,å¦åˆ™æ— 法交å‰ç¼–译。 set(CMAKE_CXX_COMPILER clang++) set(CMAKE_CXX_FLAGS "--target=arm-liteos -D__clang__ -march=armv7-a -w -mfloat-abi=softfp -mcpu=cortex-a7 -mfpu=neon-vfpv4") #æŒ‡å®šé“¾æŽ¥å·¥å…·å’Œé“¾æŽ¥æ ‡å¿—ï¼Œå¿…é¡»æŒ‡å®š--targetå’Œ--sysroot,其ä¸OHOS_ROOT_PATHå¯é€šè¿‡cmake命令åŽç¼€å‚æ•°æ¥æŒ‡å®šã€‚ set(MY_LINK_FLAGS "--target=arm-liteos --sysroot=${OHOS_SYSROOT_PATH}") set(CMAKE_LINKER clang) set(CMAKE_CXX_LINKER clang++) set(CMAKE_C_LINKER clang) set(CMAKE_C_LINK_EXECUTABLE "${CMAKE_C_LINKER} ${MY_LINK_FLAGS} <FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") set(CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINKER} ${MY_LINK_FLAGS} <FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") #指定链接库的查找路径。 set(CMAKE_SYSROOT ${OHOS_SYSROOT_PATH}) ``` 2. 执行编译 linux命令行ä¸è¿›å…¥double-conversionçš„æºæ–‡ä»¶ç›®å½•ï¼ˆå³æ ‡1所示目录),执行下列命令: ``` mkdir build && cd build cmake .. -DBUILD_TESTING=ON -DOHOS_SYSROOT_PATH="..." make -j ``` å…¶ä¸OHOS_SYSROOT_PATH需用ç»å¯¹è·¯å¾„指定出sysroot目录的ä½ç½®ï¼Œä»¥OpenHarmony为例å³ç›®å½•out/hispark_xxx/ipcamera_hispark_xxx/sysrootçš„ç»å¯¹è·¯å¾„。上述目录会在全é‡ç¼–译åŽç”Ÿæˆï¼Œå› æ¤ç§»æ¤å‰å…ˆå®Œæˆä¸€æ¬¡å…¨é‡ç¼–译。 3. 查看结果 æ¥éª¤2æ“作完æˆåŽï¼Œbuild目录下会生æˆé™æ€åº“文件和测试用例: **表2** ç¼–è¯‘ç”Ÿæˆæ–‡ä»¶ç›®å½•结构 | åç§° | æè¿° | | -------- | -------- | | double-conversion/build/libdouble-conversion.a | 生æˆçš„陿€åº“文件 | | double-conversion/build/test/ | ç›®å½•ä¸‹å˜æ”¾ç”Ÿæˆçš„æµ‹è¯•用例和相关CMakeç¼“å˜æ–‡ä»¶ | | double-conversion/build/CMakeCache.txt | CMake构建过程ä¸çš„ç¼“å˜æ–‡ä»¶ | | double-conversion/build/CMakeFiles/ | - | | double-conversion/build/cmake_install.cmake | - | | double-conversion/build/CTestTestfile.cmake | - | | double-conversion/build/DartConfiguration.tcl | - | | double-conversion/build/generated/ | - | | double-conversion/build/Makefile | - | | double-conversion/build/Testing/ | - | ## 测试 1. æå»ºOpenHarmony环境 以Hi3516DV300为例,编译出OpenHarmony镜åƒï¼Œçƒ§å†™åˆ°å¼€å‘æ¿ï¼Œç›¸å…³æ“作å¯å‚考[快速入门å°åž‹ç³»ç»Ÿéƒ¨åˆ†](../quick-start/quickstart-overview.md)。 进入系统如下所示: **图1** OpenHarmonyå¯åЍæˆåŠŸç•Œé¢  2. 挂载nfs目录,将表2ä¸test目录下cctest坿‰§è¡Œæ–‡ä»¶æ”¾å…¥nfs目录 3. 执行用例 该库采用éžäº¤å‰ç¼–译时用例是通过make test执行,CMake会有相关的执行结果统计;交å‰ç¼–è¯‘æ—¶æ— æ³•ä½¿ç”¨è¯¥æ–¹æ³•ï¼Œå› æ¤å¯ç›´æŽ¥æ‰§è¡Œç”Ÿæˆçš„æµ‹è¯•æ–‡ä»¶å®Œæˆæµ‹è¯•。 - 挂载æˆåŠŸåŽæ‰§è¡Œä¸‹åˆ—命令å¯åˆ—出用例所有æ¡ç›®ï¼š ``` cd nfs ./cctest --list ``` 上述命令执行结果部分展示: ``` test-bignum/Assign< test-bignum/ShiftLeft< test-bignum/AddUInt64< test-bignum/AddBignum< test-bignum/SubtractBignum< test-bignum/MultiplyUInt32< test-bignum/MultiplyUInt64< test-bignum/MultiplyPowerOfTen< test-bignum/DivideModuloIntBignum< test-bignum/Compare< test-bignum/PlusCompare< test-bignum/Square< test-bignum/AssignPowerUInt16< test-bignum-dtoa/BignumDtoaVariousDoubles< test-bignum-dtoa/BignumDtoaShortestVariousFloats< test-bignum-dtoa/BignumDtoaGayShortest< test-bignum-dtoa/BignumDtoaGayShortestSingle< test-bignum-dtoa/BignumDtoaGayFixed< test-bignum-dtoa/BignumDtoaGayPrecision< test-conversions/DoubleToShortest< test-conversions/DoubleToShortestSingle< ... ``` - 以test-bignumæ¡ç›®ä¸ºä¾‹ï¼Œæ‰§è¡Œä¸‹åˆ—命令开始测试: ``` ./cctest test-bignum ``` 测试结果如下则表示通过: ``` Ran 13 tests. ``` ## å°†è¯¥åº“ç¼–è¯‘æ·»åŠ åˆ°OpenHarmonyå·¥ç¨‹ä¸ 1. å¤åˆ¶åº“到OpenHarmonyå·¥ç¨‹ä¸ æ‹·è´å·²ç»èƒ½å¤ŸæˆåŠŸäº¤å‰ç¼–译的库到OpenHarmonyçš„third_party目录,为了ä¸ä¿®æ”¹è¦ç§»æ¤çš„三方库目录下的BUILD.gnæ–‡ä»¶ï¼Œå†æ·»åŠ ä¸€å±‚ç›®å½•æ”¾ç½®æ–°å¢žçš„gn转CMakeç¼–è¯‘é€‚é…æ–‡ä»¶ï¼Œæ–°å¢žçš„æ–‡ä»¶æœ‰BUILD.gnã€build_thirdparty.py〠config.gni,新增åŽçš„目录结构如下所示。 **表3** æ·»åŠ åˆ°å·¥ç¨‹åŽçš„目录结构 | åç§° | æè¿° | | -------- | -------- | | OpenHarmony/third_party/double-conversion/BUILD.gn | å°†ä¸‰æ–¹åº“åŠ å…¥å·¥ç¨‹çš„gn适酿–‡ä»¶ | | OpenHarmony/third_party/double-conversion/build_thirdparty.py | GN调用shell命令脚本文件,由上é¢GNæ–‡ä»¶å°†ç›¸å…³å‘½ä»¤ä¼ å…¥ï¼Œå®žçŽ°GN转CMake | | OpenHarmony/third_party/double-conversion/config.gni | 三方库编译é…置文件,å¯ä¿®æ”¹è¯¥æ–‡ä»¶æ¥é…置用例是å¦å‚ä¸Žæž„å»ºç‰ | | OpenHarmony/third_party/double-conversion/double-conversion/ | è¦ç§»æ¤çš„三方库目录 | 2. æ·»åŠ gn到CMake适酿–‡ä»¶ - **新增的BUILD.gn文件实现如下,其他采用CMakeæ–¹å¼å¯ç‹¬ç«‹ç¼–译的三方库移æ¤åˆ°OpenHarmony平尿—¶åªéœ€ä¿®æ”¹è·¯å¾„å³å¯**。 ``` import("config.gni") group("double-conversion") { if (ohos_build_thirdparty_migrated_from_fuchisa == true) { deps = [":make"] } } if (ohos_build_thirdparty_migrated_from_fuchisa == true) { action("make") { script = "//third_party/double-conversion/build_thirdparty.py" outputs = ["$root_out_dir/log_dc.txt"] exec_path = rebase_path(rebase_path("./build", ohos_third_party_dir)) command = "rm * .* -rf && $CMAKE_TOOLS_PATH/cmake .. $CMAKE_FLAG $CMAKE_TOOLCHAIN_FLAG && make -j" args = [ "--path=$exec_path", "--command=${command}" ] } } ``` - **新增的config.gni用于é…置该库,实现如下,其他采用CMakeæ–¹å¼å¯ç‹¬ç«‹ç¼–译的三方库移æ¤åˆ°OpenHarmonyæ—¶åªéœ€ä¿®æ”¹CMAKE_FLAGçš„é…ç½®å³å¯ã€‚** ``` #CMAKE_FLAG: config compile feature CMAKE_FLAG = "-DBUILD_TESTING=ON -DCMAKE_CXX_STANDARD=11" #toolchain:follow up-layer,depend on $ohos_build_compiler if (ohos_build_compiler == "clang") { CMAKE_TOOLCHAIN_FLAG = "-DOHOS_SYSROOT_PATH=${root_out_dir}sysroot" } else { CMAKE_TOOLCHAIN_FLAG = "" } #CMake tools path,no need setting if this path already joined to $PATH. CMAKE_TOOLS_PATH = "setting CMake tools path..." ``` - **新增的build_thirdparty.py实现如下,其他采用CMakeæ–¹å¼å¯ç‹¬ç«‹ç¼–译的三方库移æ¤åˆ°OpenHarmonyæ—¶æ— éœ€ä¿®æ”¹å³å¯ä½¿ç”¨ã€‚** ``` import os import sys from subprocess import Popen import argparse import shlex def cmd_exec(command): cmd = shlex.split(command) proc = Popen(cmd) proc.wait() ret_code = proc.returncode if ret_code != 0: raise Exception("{} failed, return code is {}".format(cmd, ret_code)) def main(): parser = argparse.ArgumentParser() parser.add_argument('--path', help='Build path.') parser.add_argument('--command', help='Build command.') parser.add_argument('--enable', help='enable python.', nargs='*') args = parser.parse_args() if args.enable: if args.enable[0] == 'false': return if args.path: curr_dir = os.getcwd() os.chdir(args.path) if args.command: if '&&' in args.command: command = args.command.split('&&') for data in command: cmd_exec(data) else: cmd_exec(args.command) os.chdir(curr_dir) if __name__ == '__main__': sys.exit(main()) ``` - 在é…ç½®æ–‡ä»¶ä¸æ·»åŠ å¼€å…³æŽ§åˆ¶è¯¥åº“ç¼–è¯‘ï¼Œé»˜è®¤è®¾ä¸ºå…³é— åœ¨//build/lite/ohos_var.gniæ–‡ä»¶ä¸æ·»åŠ ä¸‹åˆ—é…置: ``` declare_args() { ohos_build_thirdparty_migrated_from_fuchisa = true } ``` 3. 编译构建 手动å•独构建: 执行下列命令 ``` hb build -T //third_party/double-conversion:double-conversion ``` 编译æˆåŠŸåˆ™build目录下会生æˆé™æ€åº“文件和测试用例