Building Envoy - linux-on-ibm-z/docs GitHub Wiki

Building Envoy

The instructions provided below specify the steps to build Envoy version 1.29.2 on Linux on IBM Z for the following distributions:

  • RHEL (8.8, 8.9, 9.2, 9.3)
  • SLES (12 SP5, 15 SP5)
  • Ubuntu (20.04, 22.04, 24.04)

General Notes:

  • When following the steps below please use a standard permission user unless otherwise specified.
  • A directory /<source_root>/ will be referred to in these instructions, this is a temporary writable directory anywhere you'd like to place it.

Build and Install Envoy

Step 1: Build using script

If you want to build Envoy using manual steps, go to Step 2.

Use the following commands to build Envoy using the build script. Please make sure you have wget installed.

wget -q https://raw.githubusercontent.com/linux-on-ibm-z/scripts/master/Envoy/1.29.2/build_envoy.sh

# Build Envoy
bash build_envoy.sh   [Provide -t option for executing build with tests]

In case of error, check logs for more details or go to STEP 2 to follow manual build steps.

Step 2: Install Dependencies

export SOURCE_ROOT=/<source_root>/
export PREFIX=/usr/local
export PATCH_URL="https://raw.githubusercontent.com/linux-on-ibm-z/scripts/master/Envoy/1.29.2/patch/"

Step 2.1) Install Basic Dependencies

  • RHEL (8.8, 8.9)

    sudo yum install -y autoconf curl libtool patch python3-pip pkg-config vim wget curl file git gzip make python2 python3 java-11-openjdk-devel unzip zip tar openssl-devel xz expat-devel glib2-devel gcc gcc-c++
    
    #set JAVA_HOME location
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
    export PATH=$JAVA_HOME/bin:$PATH
    
  • RHEL (9.2, 9.3)

    sudo yum install -y wget curl bison ncurses ncurses-devel pkgconfig net-tools gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils-devel gcc-toolset-12-annobin-plugin-gcc gcc-toolset-12-libstdc++-devel gcc-toolset-12-binutils-gold gcc-toolset-12-libatomic-devel patch unzip openssl-devel java-11-openjdk-devel python3 zlib-devel diffutils libtool libatomic libarchive zip file
    
    #set gcc 12 as default
    source /opt/rh/gcc-toolset-12/enable
    
  • SLES 12 SP5

    sudo zypper install -y autoconf curl libtool patch python3-pip pkg-config vim wget git gzip make cmake python python3 python36 java-11-openjdk-devel unzip zip tar xz which gawk glib2-devel libexpat-devel bind-chrootenv coreutils ed expect file iproute2 iputils less libopenssl-devel python2 python3 python3-devel python3-pip python3-requests python3-setuptools python3-six python3-wheel unzip zlib-devel python3-PyYAML gcc gcc-c++ gcc12-c++ git-core automake autoconf libtool libelf-devel gawk glibc-devel-static kmod binutils-gold
    
    #set gcc 12 as default
    sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-12 12
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12
    sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-12 12
    
    #set JAVA_HOME location
    export JAVA_HOME=/usr/lib64/jvm/java-11-openjdk
    export PATH=$JAVA_HOME/bin:$PATH
    
    • Install Openssl
      cd $SOURCE_ROOT
      wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz --no-check-certificate
      tar -xzf openssl-1.1.1w.tar.gz
      cd openssl-1.1.1w
      ./config --prefix=/usr/local --openssldir=/usr/local
      make && sudo make install
      sudo mkdir -p /usr/local/etc/openssl
      sudo wget https://curl.se/ca/cacert.pem --no-check-certificate -P /usr/local/etc/openssl
      export LDFLAGS="-L/usr/local/lib/ -L/usr/local/lib64/"
      export LD_LIBRARY_PATH=/usr/local/lib/:/usr/local/lib64/${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
      export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/lib64/pkgconfig${PKG_CONFIG_PATH:+:${PKG_CONFIG_PATH}}
      export LD_RUN_PATH=/usr/local/lib:/usr/local/lib64${LD_RUN_PATH:+:${LD_RUN_PATH}}
      export CPPFLAGS="-I/usr/local/include/ -I/usr/local/include/openssl"
      export SSL_CERT_FILE=/usr/local/etc/openssl/cacert.pem
      sudo ldconfig /usr/local/lib64
      
    • Install CMake
      cd $SOURCE_ROOT
      wget https://github.com/Kitware/CMake/releases/download/v3.22.5/cmake-3.22.5.tar.gz
      tar -xf cmake-3.22.5.tar.gz
      cd cmake-3.22.5
      ./bootstrap -- -DCMAKE_BUILD_TYPE:STRING=Release
      make && sudo make install
      sudo ln -sf /usr/local/bin/cmake /usr/bin/cmake
      
  • SLES 15 SP5

    sudo zypper install -y autoconf curl libtool patch python3-pip pkg-config vim wget git gcc12-c++ gzip make cmake python python3 java-11-openjdk-devel unzip zip tar xz which gawk glib2-devel libexpat-devel meson ninja gobject-introspection-devel python3-bind bind-chrootenv coreutils ed expect file iproute2 iputils lcov less libopenssl-devel netcat python2 python2-devel python3 python3-devel python3-pip python3-requests python3-setuptools python3-six python3-wheel unzip zlib-devel python3-python-gnupg python3-PyYAML
    
    #set gcc 12 as default
    sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-12 12
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12
    sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-12 12
    
    #set JAVA_HOME location
    export JAVA_HOME=/usr/lib64/jvm/java-11-openjdk
    export PATH=$JAVA_HOME/bin:$PATH
    
  • Ubuntu 20.04

    sudo apt-get update 
    sudo apt-get install -y autoconf curl git libtool patch python3-pip virtualenv pkg-config gcc g++ locales build-essential openjdk-11-jdk python2 python2-dev python-is-python3 python3 python3-dev zip unzip libssl-dev
    
    #set JAVA_HOME location
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-s390x
    export PATH=$JAVA_HOME/bin:$PATH
    
  • Ubuntu 22.04

    sudo apt-get update
    sudo apt-get install -y autoconf curl git libtool patch python3-pip unzip virtualenv pkg-config locales libssl-dev build-essential openjdk-11-jdk python2 python2-dev python3 python3-dev zip
    
    # Install GCC 12 from repo
    sudo apt-get install -y gcc-12 g++-12
    
    sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-12 12
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12
    sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-12 12
    
    #set JAVA_HOME location
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-s390x
    export PATH=$JAVA_HOME/bin:$PATH
    
  • Ubuntu 24.04

    sudo apt-get update
    sudo apt-get install -y autoconf curl git libtool patch python3-pip unzip virtualenv pkg-config locales gcc g++ openssl libssl-dev build-essential openjdk-11-jdk python3 gcc-12 g++-12 zip unzip
    
    #set JAVA_HOME location
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-s390x
    export PATH=$JAVA_HOME/bin:$PATH
    
    # use gcc-12 to build bazel due to error compiling with gcc-13:  https://github.com/bazelbuild/bazel/issues/18642
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 20
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 20
    sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-12 20
    sudo update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-12 20
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13
    sudo update-alternatives --install /usr/bin/gcov gcov /usr/bin/gcov-13 13
    sudo update-alternatives --install /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-tool-13 13
    

Step 2.2) Install Bazel 6.3.2

cd $SOURCE_ROOT
mkdir bazel && cd bazel
wget https://github.com/bazelbuild/bazel/releases/download/6.3.2/bazel-6.3.2-dist.zip
unzip -q bazel-6.3.2-dist.zip
chmod -R +w .
curl -sSL https://raw.githubusercontent.com/linux-on-ibm-z/scripts/master/Bazel/6.3.2/patch/bazel.patch | patch -p1
bash ./compile.sh

export PATH=$PATH:${SOURCE_ROOT}/bazel/output/

Step 2.3) Install GCC (Only on RHEL 8.x, Ubuntu 20.04 and Ubuntu 24.04)

  • RHEL 8.x

    sudo yum install -y gcc-toolset-12-gcc-c++ gcc-toolset-12-libstdc++-devel gcc-toolset-12-binutils-devel gcc-toolset-12-binutils-gold gcc-toolset-12-libatomic-devel rust-toolset python3.11 pkgconf-pkg-config
    
    #Set gcc 12 as default
    source /opt/rh/gcc-toolset-12/enable
    
  • Ubuntu 20.04

    cd "$SOURCE_ROOT"
    URL=https://ftp.gnu.org/gnu/gcc/gcc-12.3.0/gcc-12.3.0.tar.gz
    curl -sSL $URL | tar xzf - || error "GCC 12.3.0"
    
    cd gcc-12.3.0
    ./contrib/download_prerequisites
    mkdir objdir && cd objdir
    
    ../configure --enable-languages=c,c++ --prefix=${PREFIX} \
      --enable-shared --enable-threads=posix \
      --disable-multilib --disable-libmpx \
      --with-system-zlib --with-long-double-128 --with-arch=zEC12 \
      --disable-libphobos --disable-werror \
      --build=s390x-linux-gnu --host=s390x-linux-gnu --target=s390x-linux-gnu
    
    make -j 8 bootstrap
    sudo make install
    
    export PATH=${PREFIX}/bin${PATH:+:${PATH}}
    
    LD_LIBRARY_PATH=${PREFIX}/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
    LD_LIBRARY_PATH+=:${PREFIX}/lib
    LD_LIBRARY_PATH+=:/usr/lib64
    export LD_LIBRARY_PATH
    
    LD_RUN_PATH=${PREFIX}/lib64${LD_RUN_PATH:+:${LD_RUN_PATH}}
    LD_RUN_PATH+=:${PREFIX}/lib
    LD_RUN_PATH+=:/usr/lib64
    export LD_RUN_PATH
    
  • Ubuntu 24.04

    sudo update-alternatives --remove-all gcc
    sudo update-alternatives --remove-all g++
    sudo update-alternatives --remove-all gcov
    sudo update-alternatives --remove-all gcov-tool
    sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-13 12
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 12
    sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 12
    sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-13 12
    

Step 2.4) Install Clang

  • RHEL (8.x, 9.x)

    sudo yum install -y clang-14.0.6
    export CC=clang
    export CXX=clang++
    
  • SLES 12 SP5

    cd $SOURCE_ROOT
    URL=https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-14.0.6.tar.gz
    curl -sSL $URL | tar xzf - || error "Clang 14.0.6"
    cd llvm-project-llvmorg-14.0.6
    mkdir build && cd build
    cmake -DLLVM_ENABLE_PROJECTS=clang -DCMAKE_C_COMPILER="/usr/bin/gcc" -DCMAKE_CXX_COMPILER="/usr/bin/g++"  -DCMAKE_BUILD_TYPE="Release" -G "Unix Makefiles" ../llvm
    make clang -j8
    clangbuild=${SOURCE_ROOT}/llvm-project-llvmorg-14.0.6/build
    export PATH=$clangbuild/bin:$PATH
    export LD_LIBRARY_PATH=$clangbuild/lib:$LD_LIBRARY_PATH
    cd $clangbuild/bin
    sudo ln -sf clang++ clang++-14
    export CC=${SOURCE_ROOT}/llvm-project-llvmorg-14.0.6/build/bin/clang
    export CXX=${SOURCE_ROOT}/llvm-project-llvmorg-14.0.6/build/bin/clang++-14
    
  • SLES 15 SP5

    sudo zypper install -y clang14 llvm14 bpftool libclang-cpp14 libunwind llvm14-gold libLLVM14 binutils-gold
    export CC=clang
    export CXX=clang++
    
  • Ubuntu 20.04

    sudo apt-get install -y clang-12
    
    export CC=clang-12
    export CXX=clang++-12
    
    sudo ln -sf /usr/bin/clang-12 /usr/bin/clang
    sudo ln -sf /usr/bin/clang++-12 /usr/bin/clang++
    
  • Ubuntu 22.04

    cd $SOURCE_ROOT
    sudo apt-get update 
    sudo apt install -y lsb-release wget software-properties-common gnupg
    wget https://apt.llvm.org/llvm.sh
    sed -i 's,add-apt-repository "${REPO_NAME}",add-apt-repository "${REPO_NAME}" -y,g' llvm.sh
    chmod +x llvm.sh
    sudo ./llvm.sh 14
    rm ./llvm.sh
    
    export CC=clang-14
    export CXX=clang++-14
    
    sudo ln -sf /usr/bin/clang-14 /usr/bin/clang
    sudo ln -sf /usr/bin/clang++-14 /usr/bin/clang++
    
  • Ubuntu 24.04

    sudo apt-get install -y clang-14
    
    export CC=clang-14
    export CXX=clang++-14
    
    sudo ln -sf /usr/bin/clang-14 /usr/bin/clang
    sudo ln -sf /usr/bin/clang++-14 /usr/bin/clang++
    

Step 2.5) Install Rust

cd $SOURCE_ROOT
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh /dev/stdin -y
export PATH="$HOME/.cargo/bin:$PATH"

Step 2.6) Set locale (Ubuntu Only)

sudo locale-gen en_US.UTF-8
export LC_ALL=C
unset LANGUAGE

Step 2.7) Install Go 1.21.5

export GOPATH=$SOURCE_ROOT
cd $GOPATH
GO_VERSION=1.21.5
wget -q https://golang.org/dl/go"${GO_VERSION}".linux-s390x.tar.gz
chmod ugo+r go"${GO_VERSION}".linux-s390x.tar.gz
sudo rm -rf /usr/local/go /usr/bin/go
sudo tar -C /usr/local -xzf go"${GO_VERSION}".linux-s390x.tar.gz
sudo ln -sf /usr/local/go/bin/go /usr/bin/ 
sudo ln -sf /usr/local/go/bin/gofmt /usr/bin/
go version  
export PATH=$PATH:$GOPATH/bin

Step 2.8) Install Buildifier and Buildozer

cd $SOURCE_ROOT
git clone -b v6.3.2 https://github.com/bazelbuild/buildtools.git

#Build buildifer
cd $SOURCE_ROOT/buildtools/buildifier
bazel build //buildifier
export BUILDIFIER_BIN=$GOPATH/bin/buildifier

#Build buildozer
cd $SOURCE_ROOT/buildtools/buildozer
bazel build //buildozer 
export BUILDOZER_BIN=$GOPATH/bin/buildozer

Step 2.9) Clone rules_foreign_cc

cd $SOURCE_ROOT
git clone --depth 1 -b 0.10.1 https://github.com/bazelbuild/rules_foreign_cc.git
cd rules_foreign_cc/
curl -sSL $PATCH_URL/rules_foreign_cc.patch |  git apply -
wget -O $SOURCE_ROOT/rules_foreign_cc/toolchains/pkgconfig-valgrind.patch $PATCH_URL/pkgconfig-valgrind.patch

Step 3: Build and Install Envoy

  • Download Envoy and Apply Patches

    cd $SOURCE_ROOT
    git clone --depth 1 -b v1.29.2 https://github.com/envoyproxy/envoy.git
    cd envoy
    
    # Apply patch-
    curl -sSL $PATCH_URL/envoy_patch.diff |  git apply -
    
    #Apply patch to update certificates-
    curl -sSL https://github.com/phlax/envoy/commit/c84d38dbc13982c899b9bedc290525938c92fd16.patch | git apply -
    
    # Patch for failing tests-
    curl -sSL $PATCH_URL/envoy-test.patch |  git apply -
    
    # Copy patch files to envoy/bazel which will be applied to external packages while building envoy
    wget -O $SOURCE_ROOT/envoy/bazel/boringssl-s390x.patch $PATCH_URL/boringssl-s390x.patch
    wget -O $SOURCE_ROOT/envoy/bazel/cel-cpp-memory.patch $PATCH_URL/cel-cpp-memory.patch
    wget -O $SOURCE_ROOT/envoy/bazel/grpc-s390x.patch $PATCH_URL/grpc-s390x.patch
    wget -O $SOURCE_ROOT/envoy/bazel/foreign_cc/luajit-s390x.patch $PATCH_URL/luajit-s390x.patch
    wget -O $SOURCE_ROOT/envoy/bazel/quiche-s390x.patch $PATCH_URL/quiche-s390x.patch
    
    • Only on SLES 12 SP5
    #Apply distro specific patch
    curl -sSL $PATCH_URL/envoy-sl12.patch |  git apply -
    wget -O $SOURCE_ROOT/envoy/bazel/io_uring.patch $PATCH_URL/io_uring.patch
    
  • Build Envoy

    bazel build envoy -c opt --override_repository=rules_foreign_cc=${SOURCE_ROOT}/rules_foreign_cc --config=clang
    

    The binary will be generated in $SOURCE_ROOT/envoy/bazel-bin/source/exe/envoy-static.

  • Verify the version of Envoy

    $SOURCE_ROOT/envoy/bazel-bin/source/exe/envoy-static --version
    

    Output should be similar to:

    bazel-bin/source/exe/envoy-static  version: 2092d65bd4d476be8235ea541e5d25c096b513e6/1.29.2/Modified/RELEASE/BoringSSL
    

Step 4: Test (optional)

cd $SOURCE_ROOT/envoy

# Run tests-
bazel test //test/... -c opt --override_repository=rules_foreign_cc=${SOURCE_ROOT}/rules_foreign_cc --config=clang --keep_going

Notes:

  • Below mentioned test failures are observed on all distros on Intel and s390x:

    • //test/extensions/filters/listener/original_dst:original_dst_integration_test: To fix the test, follow official doc to set up the original_dst filter for a quick manual test. To run this test after applying this fix, the following command can be used.

      bazel test //test/extensions/filters/listener/original_dst:original_dst_integration_test -c opt --override_repository=rules_foreign_cc=${SOURCE_ROOT}/rules_foreign_cc --config=clang 
      
    • //test/extensions/tracers/dynamic_ot:dynamic_opentracing_driver_impl_test: The test can pass by adding --linkopt=-lstdc++ to bazel as discussed here .

  • Below mentioned test failure is observed on all RHEL and SLES distros on Intel and s390x:

    //test/config_test:example_configs_test: This test fails because the file "/etc/ssl/certs/ca-certificates.crt" only exists on debian like systems.

  • Below mentioned test failures are observed on SLES 12 SP5 on Intel and s390x:

    //test/common/common:packed_struct_test

    //test/common/http:header_utility_test

    //test/common/network:utility_test

    //test/extensions/transport_sockets/alts:alts_integration_test

  • Some tests might timeout as they are being run with heap checker enabled in "normal" mode. Heap checker can be disabled using below test command:

    bazel test //test/... -c opt --override_repository=rules_foreign_cc=${SOURCE_ROOT}/rules_foreign_cc --config=clang --keep_going --test_output=all --test_env=HEAPCHECK=
    

References: