Llibo0729适配tquic
39d80ce5创建于 3月14日历史提交
# 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
}