envoy在arm机器上的编译整理

版本信息:

操作系统:GUN Linux操作系统AARCH64架构。

istio-proxy版本:istio-proxy1.15.2

编译环境搭建:

  1. 设置代理,确保可以访问Google等外网,这里envoy的第一次编译需要从外网下载依赖库。// 备注:这里一定要设置一下,可以避免很多麻烦

    1. 安装G++ 10.3.1 // 其他版本应该也可以,本人安装了这个版本

    3.安装cmake // 本人安装的是 3.22.0版本

    4.安装ninja //本人安装版本是1.10.1

    5.安装libstdc++静态库 // yum install -y libstdc++-static

    安装完之后,到/usr/lib/gcc/aarch64-linux-gnu/10.3.1下面能够看到stdlibc++.a这个文件,就算成功了。(单独安装的原因参考后面的编译错误。)

    特别说明:安装命令用的是 yum install -y XXX的方式。

    6.安装bazel,这里没有特别的,按照官方文档进行操作就可以了。

    https://github.com/envoyproxy/envoy/blob/v1.28.0/bazel/README.md#supported-compiler-versions

    sql 复制代码
    # sudo wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-$([ $(uname -m) = "aarch64" ] && echo "arm64" || echo "amd64")
    Resolving github.com (github.com)... 20.205.243.166
    Connecting to github.com (github.com)|20.205.243.166|:443... connected.
    HTTP request sent, awaiting response... 302 Found
    Location: https://github.com/bazelbuild/bazelisk/releases/download/v1.19.0/bazelisk-linux-arm64 [following]
    
    
    Reusing existing connection to github.com:443.
    HTTP request sent, awaiting response... 302 Found
    Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/149661467/04314521-c57c-42fe-8b8c-5173058c7c76?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20231219%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231219T024713Z&X-Amz-Expires=300&X-Amz-Signature=3094802b498630fdb9035addf38a543e035d086cd90755d84581b9ab535406ab&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=149661467&response-content-disposition=attachment%3B%20filename%3Dbazelisk-linux-arm64&response-content-type=application%2Foctet-stream [following]
    
    
    Resolving objects.githubusercontent.com (objects.githubusercontent.com)... 185.199.109.133, 185.199.111.133, 185.199.110.133,...
    Connecting to objects.githubusercontent.com (objects.githubusercontent.com)|185.199.109.133|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 4980736 (4.8M) [application/octet-stream]
    Saving to: '/usr/local/bin/bazel'
    
    
    /usr/local/bin/bazel            100%[=====================================================>]   4.75M  3.71MB/s    in 1.3s
    
    
    .......

编译envoy:

  1. 下载代码到本地:

    nginx 复制代码
    git clone XXX // XXX:对应的是github或者你自己库里面的istio-proxy的代码

2.执行编译命令:

bash 复制代码
set -e
# output_user_root 设置编译缓存目录,设置了之后,外网下载的东西就不需要每次都下载了,并且后续编译是增量编译
make build_envoy BAZEL_STARTUP_ARGS="--output_user_root=/home/istio-proxy/cache"

3.编译问题一:

错误:Note: Either `libc++` or `libstdc++-7-dev` (or higher) must be installed.
原因和解决办法: libstdc++静态库需要单独安装,因为GUN Linux操作系统在安装G++的时候,并没有自动生成stdlibc++.a这个静态库,而是生成了一个叫做stdlibc++fs.a的库,这会导致后面envoy编译的时候,提示找不到stdlibc++.a这个库。

4.编译问题二:

错误:

bazel-out/aarch64-opt/bin/extensions/common/wasm/nlohmann_json.hpp:8494:24: error: comparison is always true due to limited range of data type [-Werror=type-limits]

8494 | if ('\x00' <= c and c <= '\x1F')

| ~~~~~~~^~~~

cc1plus: all warnings being treated as errors
原因:

参考:https://www.cnblogs.com/ejutuo/archive/2012/08/23/2653359.html

解决办法:

本人通过直接修改对应的bazel编译文件移除"-Werror"来达到目地。如下所示:

ruby 复制代码
# git diff envoy/bazel/envoy_internal.bzl
diff --git a/envoy/bazel/envoy_internal.bzl b/envoy/bazel/envoy_internal.bzl
index 76bce7f..2308273 100644
--- a/envoy/bazel/envoy_internal.bzl
+++ b/envoy/bazel/envoy_internal.bzl
@@ -7,7 +7,6 @@ def envoy_copts(repository, test = False):
     posix_options = [
         "-Wall",
         "-Wextra",
-        "-Werror",    // 备注,这里要移除,因为操作系统的 字符串兼容问题,不然编译会卡死在类似下面问题上
         "-Wnon-virtual-dtor",
         "-Woverloaded-virtual",
         "-Wold-style-cast",

5.编译问题三:与编译问题二类似,不过是出现在级联的第三方库里面。

错误:

kotlin 复制代码
opt/bin/external/com_github_datadog_dd_opentracing_cpp/_virtual_includes/3rd_party_nlohmann/nlohmann/json.hpp:8494:24: error: comparison is always true due to limited range of data type [-Werror=type-limits]
 8494 |             if ('\x00' <= c and c <= '\x1F')
      |                 ~~~~~~~^~~~
cc1plus: all warnings being treated as errors
Target //src/envoy:envoy failed to build

解决方法:本人使用了缓存的方式,所以直接修改了缓存内的第三方编译的bazel文件 // 最好的方法是通过设置环境变量来避免掉这里的修改,后续再研究

go 复制代码
解决办法:手动魔改出问题第三方库里面的make编译参数 /root/.cache/bazel/_bazel_root/2d6185edcef03d5d7233a743a6490d13/external/com_github_datadog_dd_opentracing_cpp/BUILD.bazel 移除对应的"-Werror"参数

6.envoy对应的二进制文件生成

上面问题解决掉之后,后续就比较顺利了,envoy 二进制文件直接生成到:

../istio-proxy1.15.2/bazel-bin/src/envoy下面

通过#file envoy 可以确认envoy二进制的版本确实是 ARM aarch64版本。

总结:

网上搜了一圈,也没有找到关于envoy arm 的编译方式,踩了很多坑,便整理了这篇文章,希望对envoy开发和使用的朋友们有帮助。

相关推荐
森G12 小时前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
VekiSon15 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
AI+程序员在路上16 小时前
Nand Flash与EMMC区别及ARM开发板中的应用对比
arm开发
17(无规则自律)1 天前
深入浅出 Linux 内核模块,写一个内核版的 Hello World
linux·arm开发·嵌入式硬件
梁洪飞1 天前
内核的schedule和SMP多核处理器启动协议
linux·arm开发·嵌入式硬件·arm
代码游侠2 天前
学习笔记——Linux字符设备驱动
linux·运维·arm开发·嵌入式硬件·学习·架构
syseptember2 天前
Linux网络基础
linux·网络·arm开发
代码游侠3 天前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
程序猿阿伟3 天前
《Apple Silicon与Windows on ARM:引擎原生构建与模拟层底层运作深度解析》
arm开发·windows
wkm9563 天前
在arm64 ubuntu系统安装Qt后编译时找不到Qt3DExtras头文件
开发语言·arm开发·qt