buildCentral配置aarch64
虚拟机版本:VirtualBox 7.0
系统版本:Ubuntu 18.04
- 通用软件安装
$sudo apt install git $sudo apt install openssh-server $sudo apt-get install python-networkx $sudo apt-get install python-simplejson
- 指定软件安装(我用的环境是项目环境,从Docker里面导出的环境,所以有些软件需要安装高版本)
前往 CMake 官网(https://cmake.org/download/)下载最新版本的 cmake,我下载的是cmake-3.26.3.tar.gz
l@l-VirtualBox:~/tools$ tar -xvzf cmake-3.26.3.tar.gz l@l-VirtualBox:~/tools$ cd cmake-3.26.3/ l@l-VirtualBox:~/tools/cmake-3.26.3$ ./configure l@l-VirtualBox:~/tools/cmake-3.26.3$ make l@l-VirtualBox:~/tools/cmake-3.26.3$ sudo make install
前往 OpenSSL 官网(https://www.openssl.org/source/)下载最新版本的openssl,我下载的是openssl-3.1.0.tar.gz
l@l-VirtualBox:~/tools$ tar -xvzf openssl-3.1.0.tar.gz l@l-VirtualBox:~/tools$ cd openssl-3.1.0/ l@l-VirtualBox:~/tools/openssl-3.1.0$ ./Configure l@l-VirtualBox:~/tools/openssl-3.1.0$ make l@l-VirtualBox:~/tools/openssl-3.1.0$ sudo make install
- Docker环境安装(我用的环境是项目环境,从Docker里面导出的环境,所以需要安装Docker环境,非必须)
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/dists/bionic/pool/stable/amd64/ 通过该网址下载:containerd.io_1.2.5-1_amd64.deb、docker-ce-cli_18.09.6~3-0~ubuntu-bionic_amd64.deb与docker-ce_18.09.6~3-0~ubuntu-bionic_amd64.deb
l@l-VirtualBox:~/tools$ sudo dpkg -i containerd.io_1.2.5-1_amd64.deb l@l-VirtualBox:~/tools$ sudo dpkg -i docker-ce-cli_18.09.6~3-0~ubuntu-bionic_amd64.deb l@l-VirtualBox:~/tools$ sudo dpkg -i docker-ce_18.09.6~3-0~ubuntu-bionic_amd64.deb
https://ubuntu.pkgs.org/18.04/ubuntu-main-amd64/libltdl7_2.4.6-2_amd64.deb.html 通过该网址下载:libltdl7_2.4.6-2_amd64.deb
l@l-VirtualBox:~/tools$ sudo dpkg -i libltdl7_2.4.6-2_amd64.deb
- 如果,没有对应的Docker环境,可以通过网址下载aarch64压缩包(如果没有项目的Docker环境)
https://releases.linaro.org/components/toolchain/binaries/ 通过该网址,选择合适的aarch64版本,然后将其解压到/opt目录下,剩下的步骤与Docker导出后的操作一样。
- 将aarch64环境导出到外部环境
root@3415e46d856d:~# scp -r /opt/aarch64-linux/ l@<本机IP>:/home/l/workspace/
- 将环境拷贝到/opt目录
l@l-VirtualBox:~/workspace$ sudo cp -r aarch64-linux/ /opt/
- 源码下载
https://github.com/jeremyczhen/buildCentral 该网址,如果git clone https://github.com/jeremyczhen/buildCentral不行,请检查一下网络,如果还是不能下载,直接下载压缩包也可以。
这个地方有个问题:如果代码是在windows下clone的,所有文件的编码都是dos。这种情况下,在Ubuntu下编译,会出现错误:
mk: /bin/bash^M: bad interpreter: No such file or directory
如要解决这个问题,需要做如下操作
l@l-VirtualBox:~/buildCentral$ sudo apt-get install dos2unix l@l-VirtualBox:~/buildCentral$ find ./ -type f -exec dos2unix {} \;
注意:命令中"\;"不是错误输入,是必须的
- 配置编译环境 -- 删除多余配置
l@l-VirtualBox:~/buildCentral$ vim project/build/build_central.cfg
打开该文件,找到并删除如下软件包,我们只是运行一个helloWorld,其它的软件都不需要
> protobuf > fdbus > protobus > fdbus.example > pb.example
- 配置编译环境 -- 增加编译脚本
l@l-VirtualBox:~/buildCentral$ vim build.sh #!/bin/bash root_dir=$(pwd) application_dir=${root_dir} out_dir=${root_dir}/output/workspace function buildApp(){ cd ${root_dir} cd $application_dir source /opt/aarch64-linux/environment-setup-aarch64-linux export PATH=${root_dir}/tools/buildCentral/install:$PATH export LD_LIBRARY_PATH=/opt/aarch64-linux/sysroots/aarch64-linux/lib64:$LD_LIBRARY_PATH mk -c mk -bcd cd ${root_dir} } buildApp l@l-VirtualBox:~/buildCentral$ chmod 77 build.sh
- 配置编译环境 -- 配置aarch64编译器
配置project路径之下的build_central.cfg
l@l-VirtualBox:~/buildCentral$ vim project/build/build_central.cfg "DEFAULT_TARGET" : "aarch64-linux", "PACKAGES-PER-ARCH" : { ...... "linux" : { ...... }, "aarch64-linux" : { "helloWorld" : { "C_FLAGS" : "-Wno-error", "CXX_FLAGS" : "-Wno-error -g -O0" } } }, "BUILD_VARIANTS" : { ....... "linux" : { ...... }, "aarch64-linux" : { "DEFAULT_VARIANT" : "default", "VARIANTS" : { "default" : { "MACRO" : "PLATFORM_HIGH_LOCAL", "GROUPS" : ["aarch64-linux"] } } } } "TARGETS" : { ...... "linux" : { ...... }, "aarch64-linux" : { "DESCRIPTION" : "build for aarch64-linux" } }, "GROUPS" : { ...... "common-host" : { ...... }, "aarch64-linux" : { "PACKAGES" : [ "helloWorld" ] } },
配置project路径之下的buildcentralrc
l@l-VirtualBox:~/buildCentral$ vim project/build/buildcentralrc { ...... "linux" : { ...... }, "aarch64-linux" : { "COMPILER_TYPE" : "GNU", "TARGET_ARCH" : "aarch64-linux-arm", "TARGET_OS" : "LINUX", "C_FLAGS" : "-fPIC -fms-extensions -Wno-write-strings -Wno-format-security -fno-short-enums -mlittle-endian -Wno-int-to-pointer-cast -Wno-format-truncation -Wno-int-in-bool-context -Wno-array-bounds -Wno-sign-compare -Wno-unused-variable -Wno-cpp -Wno-unused-function -Dlinux -Werror=return-type", "CXX_FLAGS" : "-fPIC -fms-extensions -Wno-write-strings -Wno-format-security -fno-short-enums -mlittle-endian -Wno-int-to-pointer-cast -Wno-format-truncation -Wno-class-memaccess -Wno-int-in-bool-context -Wno-array-bounds -Wno-sign-compare -Wno-unused-variable -Wno-cpp -Wno-unused-function -Wno-format -Dlinux --std=gnu++11 -Wno-narrowing -frtti -fexceptions -Werror=return-type", "MACRO_DEF" : {"__LINUX__" : null}, "REL_FLAGS" : "-O1", "DBG_FLAGS" : "-g -O1", "SHA_LD_FLAGS" : "-Wl,--hash-style=gnu", "EXE_LD_FLAGS" : "-Wl,--hash-style=gnu", "LD_FLAGS" : "-Wl,--hash-style=gnu", "OTHER_INC_PATH" : [], "OTHER_LIB_PATH" : [], "ENV_VAR" : {} } }
- 创建HelloWorld文件
l@l-VirtualBox:~/buildCentral$ cd workspace/ l@l-VirtualBox:~/buildCentral/workspace$ mkdir helloWorld l@l-VirtualBox:~/buildCentral/workspace$ cd helloWorld/ l@l-VirtualBox:~/buildCentral/workspace/helloWorld$ vim main.c #include <stdio.h> int main(int argc, char ** argvv) { printf("Hello, World!\r\n"); return 0; }
- 创建CMakeLists.txt,用于编译
l@l-VirtualBox:~/buildCentral/workspace/helloWorld$ vim CMakeLists.txt cmake_minimum_required(VERSION 2.8.4) project(helloWorld) set(BUILD_TYPE "static") ########################################################################## # Include buildCentral common rules # ########################################################################## include(${RULE_DIR}/rule_base.cmake) ########################################################################## # Build rules for executable and library # # To build executable using: # # add_executable(executable_name, source_file, source_file, ...) # # To build static library using: # # add_library(library_name STATIC source_file, source_file, ...) # # To build shared library using: # # add_library(library_name SHARED source_file, source_file, ...) # ########################################################################## set(LIB_BUILD_TYPE "SHARED") set(LIB_INSTALL_TYPE "LIBRARY") IF(${TARGET_ARCH} MATCHES "arm") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -w -fpermissive -Warray-bounds -Werror") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -w -Warray-bounds -Werror") ENDIF() file(GLOB PRJ_SRC_LIST *.c) add_executable(${PROJECT_NAME} ${PRJ_SRC_LIST}) install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION workspace/)
其中,变量CMAKE_CXX_FLAGS、CMAKE_C_FLAGS,都是aarch64-linux目录下的环境变量所设置。
将编译生成的helloWorld,push主板,经测试,可以正常输出。