# Copyright (c) 2023 Huawei Device Co., Ltd.
# Licensed 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.
# Contributor: fujiadong05@chinasoftinc.com
# Maintainer: fujiadong05@chinasoftinc.com
pkgname=tquic
pkgver=0.10.0
pkgrel=0
pkgdesc="TQUIC is a high-performance QUIC implementation"
url="https://github.com/tencent/tquic"
archs=("armeabi-v7a" "arm64-v8a" "x86_64")
license=("Apache-2.0")
depends=("boringssl")
makedepends=()
source=""
downloadpackage=false
autounpack=false
builddir=tquic-${pkgver}
OHOS_NDK_HOME="${OHOS_SDK}"
FINAL_OUTPUT_ROOT="${LYCIUM_ROOT}/usr"
FINAL_OUTPUT_DIR="${FINAL_OUTPUT_ROOT}/${pkgname}"
prepare() {
echo "准备编译环境"
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
export PATH="$HOME/.cargo/bin:$PATH:${OHOS_NDK_HOME}/native/llvm/bin"
if ! command -v cargo &>/dev/null; then
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
source "$HOME/.cargo/env"
fi
rustup target add aarch64-unknown-linux-ohos
rustup target add armv7-unknown-linux-ohos
rustup target add x86_64-unknown-linux-ohos
rustup install nightly
rustup default nightly
if ! command -v cbindgen &>/dev/null; then
cargo install cbindgen
fi
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="$SCRIPT_DIR/$builddir"
if [ ! -d "$BUILD_DIR" ]; then
echo "克隆TQUIC源码到: $BUILD_DIR"
git clone https://github.jobcher.com/gh/https://github.com/tencent/tquic.git "$BUILD_DIR"
fi
cd "$BUILD_DIR"
git checkout "v$pkgver" 2>/dev/null || true
if [ -f ".gitmodules" ]; then
git submodule update --init --recursive || {
mkdir -p deps
cd deps
git clone https://github.jobcher.com/gh/https://github.com/google/boringssl.git --depth=1
cd ..
}
fi
cd "$SCRIPT_DIR"
# 定义工具链设置函数,供 build 调用
setup_environment() {
# 公共工具链
export CC="${OHOS_NDK_HOME}/native/llvm/bin/clang"
export CXX="${OHOS_NDK_HOME}/native/llvm/bin/clang++"
export AR="${OHOS_NDK_HOME}/native/llvm/bin/llvm-ar"
export LD="${OHOS_NDK_HOME}/native/llvm/bin/ld"
export RANLIB="${OHOS_NDK_HOME}/native/llvm/bin/llvm-ranlib"
export STRIP="${OHOS_NDK_HOME}/native/llvm/bin/llvm-strip"
export BORINGSSL_NO_DEPRECATED=1
case "${ARCH}" in
"arm64-v8a")
export CFLAGS="--target=aarch64-unknown-linux-ohos"
export CXXFLAGS="--target=aarch64-unknown-linux-ohos"
export RUSTFLAGS="-C linker=$CC -C link-arg=--target=aarch64-unknown-linux-ohos"
export TARGET="aarch64-unknown-linux-ohos"
;;
"armeabi-v7a")
export CFLAGS="--target=armv7-unknown-linux-ohos"
export CXXFLAGS="--target=armv7-unknown-linux-ohos"
export RUSTFLAGS="-C linker=$CC -C link-arg=--target=armv7-unknown-linux-ohos"
export TARGET="armv7-unknown-linux-ohos"
;;
"x86_64")
export CFLAGS="--target=x86_64-unknown-linux-ohos"
export CXXFLAGS="--target=x86_64-unknown-linux-ohos"
export RUSTFLAGS="-C linker=$CC -C link-arg=--target=x86_64-unknown-linux-ohos"
export TARGET="x86_64-unknown-linux-ohos"
;;
*)
echo "错误: 不支持的架构: ${ARCH}"
return 1
;;
esac
}
echo "编译环境准备完成"
}
build() {
echo "开始编译"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="$SCRIPT_DIR/$builddir"
cd "$BUILD_DIR"
echo "当前目录: $(pwd)"
if [ -z "$ARCH" ]; then
echo "错误: ARCH 变量未设置"
return 1
fi
echo "编译架构: ${ARCH}"
# 调用工具链设置函数
setup_environment || return 1
# 统一使用 TARGET 变量进行编译
cargo build --release --target "$TARGET"
cargo test --release --target "$TARGET" --no-run 2>/dev/null || true
# 生成头文件
if command -v cbindgen &>/dev/null; then
cbindgen --output tquic.h 2>/dev/null || true
fi
echo "${ARCH} 架构编译完成"
return 0
}
package() {
echo "打包产物"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="$SCRIPT_DIR/$builddir"
cd "$BUILD_DIR"
# 确定目标架构名称
case "${ARCH}" in
"arm64-v8a") target="aarch64-unknown-linux-ohos" ;;
"armeabi-v7a") target="armv7-unknown-linux-ohos" ;;
"x86_64") target="x86_64-unknown-linux-ohos" ;;
*)
echo "错误: 不支持的架构: ${ARCH}"
return 1
;;
esac
# 创建输出目录
mkdir -p "${FINAL_OUTPUT_DIR}/${ARCH}/lib"
mkdir -p "${FINAL_OUTPUT_DIR}/include"
# 拷贝库文件
if ls "target/${target}/release/"*.so 1>/dev/null 2>&1; then
cp "target/${target}/release/"*.so "${FINAL_OUTPUT_DIR}/${ARCH}/lib/"
echo "已拷贝 ${ARCH} 库文件到 ${FINAL_OUTPUT_DIR}/${ARCH}/lib/"
fi
# 拷贝头文件
if [ -f "tquic.h" ]; then
cp "tquic.h" "${FINAL_OUTPUT_DIR}/include/"
echo "已拷贝头文件到 ${FINAL_OUTPUT_DIR}/include/"
fi
if [ "${ARCH}" = "x86_64" ]; then
if [ -d "${FINAL_OUTPUT_DIR}" ]; then
cd "${FINAL_OUTPUT_ROOT}"
tar -cjf "${pkgname}-${pkgver}.tar.bz2" "${pkgname}/" 2>/dev/null || true
echo "已打包主库到 ${pkgname}-${pkgver}.tar.bz2"
fi
fi
}
check() {
echo "测试需在OpenHarmony设备进行"
}
cleanbuild() {
rm -rf ${PWD}/$builddir
}