鸿蒙HarmonyOS NEXT开发:Make构建工程配置HarmonyOS编译工具链

往期鸿蒙全套实战精彩文章必看内容:


简介

Make是一个标准的Unix构建工具,用于自动化编译过程。它可以读取Makefile中的规则和依赖项,并根据这些规则来构建源代码,Make会检查源代码文件的时间戳,以确定哪些文件需要重新编译。Make会自动解决依赖关系并按正确的顺序编译源文件,通过在终端中运行Make命令,Make将根据Makefile中的指令逐步构建代码,生成最终的可执行程序或库文件。

Makefile文件是一个文本文件,它定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,以及哪些文件需要重新编译。这些规则包括文件的编译方式、库文件的创建方法,以及最终生成的可执行文件的制作过程。Makefile文件描述了整个工程的编译、连接等规则,包括源文件的依赖关系和编译顺序。通过编写Makefile文件,开发者可以自动化地构建和管理工程项目,极大地提高了开发效率。

二者关系:

Makefile是Make工具的配置文件,用于描述项目的构建规则和依赖关系。Make工具则根据这些规则和依赖关系,来决定哪些文件需要重新构建,从而实现自动化构建过程。二者共同作用,提高了软件开发的效率和便利性。

Make构建三方库适配流程

本小节介绍如何在Linux环境下,使用Make构建工具通过ohos sdk编译bzip2三方库源码,生成ohos平台三方库的so及二进制文件。

环境准备

  1. Linux编译环境及HarmonyOS SDK下载请参考:环境准备
  2. 获取三方库代码。
    owner@ubuntu:/mnt/e/make-makefile$ wget https://sourceforge.net/projects/bzip2/files/bzip2-1.0.6.tar.gz     # 下载源码包
  3. 解压源码包。
    owner@ubuntu:/mnt/e/make-makefile$ tar -zxf bzip2-1.0.6.tar.gz                    # 解压源码包
    owner@ubuntu:/mnt/e/make-makefile$
    owner@ubuntu:/mnt/e/make-makefile$ cd bzip2-1.0.6/                                # 进入到bzip2源码目录
    owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$

编译三方库

  1. 分析Makefile文件。

    因为需要适配ohos,所以需要将非ohos的工具链配置为ohos的工具链。

    通过分析源库的Makefile文件可知,以下几个内容需要进行重新配置:

    1. 编译命令配置。
      # To assist in cross-compiling
      CC=gcc 
      AR=ar  
      RANLIB=ranlib                                  

      环境变量作用:

      • CC:用于指定C语言编译器。
      • AR:用于指定归档工具。
      • RANLIB:用于指定归档文件的索引命令。

      默认配置Linux下gcc的编译命令,编译时需要配置成HarmonyOS交叉编译命令。

    2. 安装路径配置。
      # Where you want it installed when you do 'make install'
      PREFIX=/usr/local                                          

      PREFIX:用于指定安装路径的前缀。

      默认配置的安装目录为系统的/usr/local/下,如果需要执行安装的话,需配置成用户目录下。

  2. 配置交叉编译命令,执行交叉编译。

    分析完Makefile后,即可配置交叉编译命令进行编译(xxx需要改为自己的文件路径)。

    owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$ make CC=xxx/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos AR=xxx/ohos-sdk/linux/native/llvm/bin/llvm-ar RANDLIB=xxx/ohos-sdk/linux/native/llvm/bin/llvm-ranlib -j4 libbz2.a bzip2 bzip2recover
    xxx/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -c huffman.c
    xxx/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64 -c crctable.c
    ...
    # 省略部分make信息
    ...
    xxx/ohos-sdk/linux/native/llvm/bin/llvm-ar cq libbz2.a blocksort.o huffman.o crctable.o randtable.o compress.o decompress.o bzlib.o
    ranlib libbz2.a
    1 warning generated.
    xxx/ohos-sdk/linux/native/llvm/bin/clang --target=aarch64-linux-ohos -Wall -Winline -O2 -g -D_FILE_OFFSET_BITS=64  -o bzip2 bzip2.o -L. -lbz2
    owner@ubuntu:~/workspace/bzip2-1.0.6$

    参数说明:

    • -j4:指定并行编译的作业数。
    • libbz2.a:bzip2压缩库的静态链接库文件,包含了bzip2压缩和解压缩所需的函数和数据结构,供其它程序在链接时使用。
    • bzip2:bzip2压缩算法的可执行文件,用于压缩文件或目录。
    • bzip2recover:bzip2压缩算法的恢复工具,可以用于恢复由bzip2压缩产生的损坏的压缩文件。

    注:CC配置时,除了配置为交叉编译的clang外,还需要配置target的架构,即配置成aarch64位,按此配置编译出来的文件才能在64位设备上运行,如若需要编译32位的文件,则target配置成arm-linux-ohos即可。

  3. 通过file bzip2查看编译成功后的文件。
    owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$ file bzip2             # 使用file查看生成的文件属性
    bzip2: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-aarch64.so.1, with debug_info, not stripped
    owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$

    编译时配置了aarch64-linux-ohos,因此生成的文件属性为ARM aarch64,交叉编译成功。

  4. 执行安装。

    通过之前分析Makefile可以知道,在安装时需要配置PREFIX这个安装路径的变量:

    owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$ make install PREFIX=xxx/bzip/                   # 执行make install安装
    if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/bin ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/bin ; fi
    if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/lib ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/lib ; fi
    if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/man ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/man ; fi
    if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1 ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1 ; fi
    if ( test ! -d /mnt/e/make-makefile/bzip2-1.0.6/bzip/include ) ; then mkdir -p /mnt/e/make-makefile/bzip2-1.0.6/bzip/include ; fi
    ...
    # 省略部分make install信息
    ...
    cp -f bzgrep.1 bzmore.1 bzdiff.1 /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1
    chmod a+r /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzgrep.1
    chmod a+r /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzmore.1
    chmod a+r /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzdiff.1
    echo ".so man1/bzgrep.1" > /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzegrep.1
    echo ".so man1/bzgrep.1" > /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzfgrep.1
    echo ".so man1/bzmore.1" > /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzless.1
    echo ".so man1/bzdiff.1" > /mnt/e/make-makefile/bzip2-1.0.6/bzip/man/man1/bzcmp.1
    owner@ubuntu:/mnt/e/make-makefile/bzip2-1.0.6$ ls xxx/bzip/                                    # 查看安装文件
    bin  include  lib  man

测试验证

  1. 测试环境配置,请参考:搭建ohos测试环境
  2. 准备测试资源。

    同样的,为保证测试时不进行编译操作,把整个编译的源码作为测试资源包通过hdc工具推送到开发板,且需要保证三方库在开发板的路径与编译时路径一致:

    owner@ubuntu:/mnt/e/make-makefile$ tar -zcvf bzip2-1.0.6.tar.gz bzip2-1.0.6/
    hdc file send xxx/bzipbzip2-1.0.6.tar.gz /data/             # 推送资源到开发板
    hdc shell                                                   # 进入开发板系统
    # mkdir -p /mnt/e                                           # 设置与编译时同样的路径
    # cd /mnt/e
    # ln -s /data/bzip2-1.0.6 ./make-makefile                   # 系统根目录空间有限,建议通过软链接配置路径
    # cd make-makefile
    # tar -zxf bzipbzip2-1.0.6.tar.gz                           # 解压测试资源
  3. 执行测试。
    # cd /home/owner/worspace/bzip2-1.0.6
    # make check                                                # 执行测试命令,以下为测试信息
    Doing 6 tests (3 compress, 3 uncompress) ...
    If there's a problem, things might stop at this point.
    
      ./bzip2 -1  < sample1.ref > sample1.rb2
      ./bzip2 -2  < sample2.ref > sample2.rb2
      ./bzip2 -3  < sample3.ref > sample3.rb2
      ./bzip2 -d  < sample1.bz2 > sample1.tst
      ./bzip2 -d  < sample2.bz2 > sample2.tst
      ./bzip2 -ds < sample3.bz2 > sample3.tst
    cmp sample1.bz2 sample1.rb2
    cmp sample2.bz2 sample2.rb2
    cmp sample3.bz2 sample3.rb2
    cmp sample1.tst sample1.ref
    cmp sample2.tst sample2.ref
    cmp sample3.tst sample3.ref
    ...

    bzip2执行了6条测试用例,且未提示任何错误,说明此库测试成功。

    当不确定此库是否测试成功时,开发者还可以在执行完测试命令后,在命令行通过输入“echo $?”手动查看测试结果:

    • 输出0:表示测试成功。
    • 非0:表示测试失败。

看完三件事❤️

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注作者 ,不定期分享原创知识。
  • 同时可以期待后续文章ing🚀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值