blob: 286e5d150984f7306a960d4d6ca6de0e9fbd01f8 [file]
#!/usr/bin/env bash
#
# Simple script to build BoringsSSL and various tools with H3 and QUIC support
# including quiche+BoringSSL.
# This probably needs to be modified based on platform.
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set -e
WORKDIR="$(mktemp -d)"
readonly WORKDIR
cd "${WORKDIR}"
# Set these, if desired, to change these to your preferred installation
# directory
BASE=${BASE:-"/opt/h3-tools-boringssl"}
MAKE="make"
echo "Building boringssl H3 dependencies in ${WORKDIR}. Installation will be done in ${BASE}"
CFLAGS=${CFLAGS:-"-O3 -g"}
CXXFLAGS=${CXXFLAGS:-"-O3 -g"}
BORINGSSL_PATH="${BASE}/boringssl"
if [ -e /etc/redhat-release ]; then
MAKE="gmake"
TMP_BORINGSSL_LIB_PATH="${BASE}/boringssl/lib64"
echo "+-------------------------------------------------------------------------+"
echo "| You probably need to run this, or something like this, for your system: |"
echo "| |"
echo "| sudo yum -y install libev-devel jemalloc-devel python2-devel |"
echo "| sudo yum -y install libxml2-devel c-ares-devel libevent-devel |"
echo "| sudo yum -y install jansson-devel zlib-devel systemd-devel cargo |"
echo "| |"
echo "| Rust may be needed too, see https://rustup.rs for the details |"
echo "+-------------------------------------------------------------------------+"
echo
echo
elif [ -e /etc/debian_version ]; then
TMP_BORINGSSL_LIB_PATH="${BASE}/boringssl/lib"
echo "+-------------------------------------------------------------------------+"
echo "| You probably need to run this, or something like this, for your system: |"
echo "| |"
echo "| sudo apt -y install libev-dev libjemalloc-dev python3-dev libxml2-dev |"
echo "| sudo apt -y install libpython3-dev libc-ares-dev libsystemd-dev |"
echo "| sudo apt -y install libevent-dev libjansson-dev zlib1g-dev libpsl-dev |"
echo "| |"
echo "| Rust may be needed too, see https://rustup.rs for the details |"
echo "+-------------------------------------------------------------------------+"
echo
echo
fi
if [ `uname -s` = "Darwin" ]; then
echo "+-------------------------------------------------------------------------+"
echo "| When building on a Mac, be aware that the Apple version of clang may |"
echo "| fail to build curl due to the issue described here: |"
echo "| https://github.com/curl/curl/issues/11391#issuecomment-1623890325 |"
echo "+-------------------------------------------------------------------------+"
fi
if [ -z ${BORINGSSL_LIB_PATH+x} ]; then
BORINGSSL_LIB_PATH=${TMP_BORINGSSL_LIB_PATH:-"${BORINGSSL_PATH}/lib"}
fi
set -x
if [ `uname -s` = "Linux" ]
then
num_threads=$(nproc)
elif [ `uname -s` = "FreeBSD" ]
then
num_threads=$(sysctl -n hw.ncpu)
else
# MacOS.
num_threads=$(sysctl -n hw.logicalcpu)
fi
# boringssl
echo "Building boringssl..."
# We need this go version.
sudo mkdir -p ${BASE}/go
if [ `uname -m` = "arm64" -o `uname -m` = "aarch64" ]; then
ARCH="arm64"
else
ARCH="amd64"
fi
if [ `uname -s` = "Darwin" ]; then
OS="darwin"
elif [ `uname -s` = "FreeBSD" ]; then
OS="freebsd"
else
OS="linux"
fi
go_version=1.24.12
wget https://go.dev/dl/go${go_version}.${OS}-${ARCH}.tar.gz
rm -rf ${BASE}/go && tar -C ${BASE} -xf go${go_version}.${OS}-${ARCH}.tar.gz
rm go${go_version}.${OS}-${ARCH}.tar.gz
GO_BINARY_PATH=${BASE}/go/bin/go
if [ ! -d boringssl ]; then
git clone https://boringssl.googlesource.com/boringssl
cd boringssl
git checkout 02bc0949e5cac0e1ee82c6f365f5a6c3cfd0cfa9
cd ..
fi
cd boringssl
# un-set it for a bit.
set +e
BSSL_C_FLAGS="-Wdangling-pointer=0"
GCCO=$(eval "gcc --help=warnings | grep dangling-pointer=")
retVal=$?
if [ $retVal -eq 1 ]; then
BSSL_C_FLAGS=""
fi
set -e
# Note: -Wdangling-pointer=0
# We may have some issues with latest GCC compilers, so disabling -Wdangling-pointer=
# Note: -UBORINGSSL_HAVE_LIBUNWIND
# Disable related libunwind test builds, there are some version number issues
# with this pkg in Ubuntu 20.04, so disable this to make sure it builds.
cmake \
-B build-shared \
-DGO_EXECUTABLE=${GO_BINARY_PATH} \
-DCMAKE_INSTALL_PREFIX=${BASE}/boringssl \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS='-Wno-error=character-conversion -Wno-error=ignored-attributes -UBORINGSSL_HAVE_LIBUNWIND' \
-DCMAKE_C_FLAGS=${BSSL_C_FLAGS} \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-DBUILD_TESTING=0 \
-DCMAKE_THREAD_LIBS_INIT="-lpthread" \
-DTHREADS_PREFER_PTHREAD_FLAG=ON \
-DBUILD_SHARED_LIBS=1
cmake \
-B build-static \
-DGO_EXECUTABLE=${GO_BINARY_PATH} \
-DCMAKE_INSTALL_PREFIX=${BASE}/boringssl \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_FLAGS='-Wno-error=character-conversion -Wno-error=ignored-attributes -UBORINGSSL_HAVE_LIBUNWIND' \
-DCMAKE_C_FLAGS="${BSSL_C_FLAGS}" \
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
-DBUILD_TESTING=0 \
-DCMAKE_THREAD_LIBS_INIT="-lpthread" \
-DTHREADS_PREFER_PTHREAD_FLAG=ON \
-DBUILD_SHARED_LIBS=0
cmake --build build-shared -j ${num_threads}
cmake --build build-static -j ${num_threads}
sudo cmake --install build-shared
sudo cmake --install build-static
sudo chmod -R a+rX ${BASE}
cd ..
# Build quiche
# Steps borrowed from: https://github.com/apache/trafficserver-ci/blob/main/docker/rockylinux8/Dockerfile
echo "Building quiche"
QUICHE_BASE="${BASE:-/opt}/quiche"
[ ! -d quiche ] && git clone https://github.com/cloudflare/quiche.git
cd quiche
git checkout 0.23.2
QUICHE_BSSL_PATH=${BORINGSSL_LIB_PATH} QUICHE_BSSL_LINK_KIND=dylib cargo build -j4 --package quiche --release --features ffi,pkg-config-meta,qlog
sudo mkdir -p ${QUICHE_BASE}/lib/pkgconfig
sudo mkdir -p ${QUICHE_BASE}/include
sudo cp target/release/libquiche.a ${QUICHE_BASE}/lib/
[ -f target/release/libquiche.so ] && sudo cp target/release/libquiche.so ${QUICHE_BASE}/lib/
# Why a link? https://github.com/cloudflare/quiche/issues/1808#issuecomment-2196233378
sudo ln -s ${QUICHE_BASE}/lib/libquiche.so ${QUICHE_BASE}/lib/libquiche.so.0
sudo cp quiche/include/quiche.h ${QUICHE_BASE}/include/
sudo cp target/release/quiche.pc ${QUICHE_BASE}/lib/pkgconfig
sudo chmod -R a+rX ${BASE}
cd ..
LDFLAGS=${LDFLAGS:-"-Wl,-rpath,${BORINGSSL_LIB_PATH}"}
# Then nghttp3
echo "Building nghttp3..."
[ ! -d nghttp3 ] && git clone --depth 1 -b v1.8.0 https://github.com/ngtcp2/nghttp3.git
cd nghttp3
git submodule update --init
autoreconf -if
./configure \
--prefix=${BASE} \
PKG_CONFIG_PATH=${BASE}/lib/pkgconfig:${BORINGSSL_LIB_PATH}/pkgconfig \
CFLAGS="${CFLAGS}" \
CXXFLAGS="${CXXFLAGS}" \
LDFLAGS="${LDFLAGS}" \
--enable-lib-only
${MAKE} -j ${num_threads}
sudo ${MAKE} install
sudo chmod -R a+rX ${BASE}
cd ..
# Now ngtcp2
echo "Building ngtcp2..."
[ ! -d ngtcp2 ] && git clone --depth 1 -b v1.11.0 https://github.com/ngtcp2/ngtcp2.git
cd ngtcp2
autoreconf -if
./configure \
--prefix=${BASE} \
--with-boringssl \
BORINGSSL_CFLAGS="-I${BORINGSSL_PATH}/include" \
BORINGSSL_LIBS="-L${BORINGSSL_LIB_PATH} -lssl -lcrypto" \
PKG_CONFIG_PATH=${BASE}/lib/pkgconfig \
CFLAGS="${CFLAGS} -fPIC" \
CXXFLAGS="${CXXFLAGS} -fPIC" \
LDFLAGS="${LDFLAGS}" \
--enable-lib-only
${MAKE} -j ${num_threads}
sudo ${MAKE} install
sudo chmod -R a+rX ${BASE}
cd ..
# Then nghttp2, with support for H3
echo "Building nghttp2 ..."
[ ! -d nghttp2 ] && git clone --depth 1 -b v1.65.0 https://github.com/tatsuhiro-t/nghttp2.git
cd nghttp2
git submodule update --init
autoreconf -if
if [ `uname -s` = "Darwin" ] || [ `uname -s` = "FreeBSD" ]
then
# --enable-app requires systemd which is not available on Mac/FreeBSD.
ENABLE_APP=""
else
ENABLE_APP="--enable-app"
fi
# Note for FreeBSD: This will not build h2load. h2load can be run on a remote machine.
./configure \
--prefix=${BASE} \
PKG_CONFIG_PATH=${BASE}/lib/pkgconfig \
CFLAGS="${CFLAGS} -I${BORINGSSL_PATH}/include" \
CXXFLAGS="${CXXFLAGS} -I${BORINGSSL_PATH}/include" \
LDFLAGS="${LDFLAGS}" \
OPENSSL_LIBS="-lcrypto -lssl -L${BORINGSSL_LIB_PATH}" \
--enable-http3 \
--disable-examples \
${ENABLE_APP}
${MAKE} -j ${num_threads}
sudo ${MAKE} install
sudo chmod -R a+rX ${BASE}
cd ..
# Then curl
echo "Building curl ..."
[ ! -d curl ] && git clone --depth 1 -b curl-8_12_1 https://github.com/curl/curl.git
cd curl
# On mac autoreconf fails on the first attempt with an issue finding ltmain.sh.
# The second runs fine.
autoreconf -fi || autoreconf -fi
./configure \
--prefix=${BASE} \
--with-openssl="${BORINGSSL_PATH}" \
--with-nghttp2=${BASE} \
--with-nghttp3=${BASE} \
--with-ngtcp2=${BASE} \
LDFLAGS="${LDFLAGS} -L${BORINGSSL_LIB_PATH} -Wl,-rpath,${BORINGSSL_LIB_PATH}" \
CFLAGS="${CFLAGS}" \
CXXFLAGS="${CXXFLAGS}"
${MAKE} -j ${num_threads}
sudo ${MAKE} install
sudo chmod -R a+rX ${BASE}
cd ..