# Copyright (c) 2026 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: luohao <luohao155@h-partners.com>
# Maintainer: luohao <luohao155@h-partners.com>

pkgname=wasm-micro-runtime # 库名
pkgver=WAMR-2.4.3
 # 库版本
pkgrel=0 # 发布号
pkgdesc="WebAssembly Micro Runtime (WAMR) is a lightweight standalone WebAssembly (Wasm) runtime" # 库描述
url="https://github.com/bytecodealliance/wasm-micro-runtime" # 官网链接
archs=("armeabi-v7a" "arm64-v8a" "x86_64") # cpu 架构
license=("Apache-2.0")
depends=() # 依赖库的目录名 必须保证被依赖的库的archs是当前库的archs的超集
makedepends=() # 构建库时的依赖工具->需要用户安装的工具
source="https://github.com/bytecodealliance/$pkgname/archive/refs/tags/$pkgver.tar.gz" # 库源码下载链接s

downloadpackage=true # 是否自动下载压缩包,如若不写默认 true. (应对一些特殊情况,代码只能 git clone (项目中依赖 submoudle ))
autounpack=true # 是否自动解压,如若不写默认 true, 如果为 false 则需要用户在 prepare 函数中自行解压
buildtools=cmake # 编译方法, 暂时支持cmake, configure, make等, 是什么就填写什么. 如若不写默认为cmake.

builddir=$pkgname-${pkgver} # 源码压缩包解压后目录名 编译目录名
packagename=$builddir.tar.gz # 压缩包名

# 为编译设置环境,如设置环境变量,创建编译目录等
prepare() {
    mkdir -p $builddir/$ARCH-build
}

# ${OHOS_SDK} oh sdk安装路径
# $ARCH 编译的架构是 archs 的遍历
# $LYCIUM_ROOT/usr/$pkgname/$ARCH 安装到顶层目录的usr/$pkgname/$ARCH
# 执行编译构建的命令
build() {
    # === 根据 ARCH 设置 WAMR_BUILD_TARGET ===
    local WAMR_TARGET=""
    case "$ARCH" in
        "x86_64")
            WAMR_TARGET="X86_64"
            WAMR_C_FLAGS="-DMAP_32BIT=0x40"
            WAMR_CXX_FLAGS="-DMAP_32BIT=0x40"
            ;;
        "arm64-v8a")
            WAMR_TARGET="AARCH64"
            ;;
        "armeabi-v7a")
            WAMR_TARGET="ARM"
            ;;
        *)
            echo "ERROR: Unsupported ARCH '$ARCH' for WAMR_BUILD_TARGET" >&2
            return 1
            ;;
    esac

    # 如果是cmake构建 "$@"=-DCMAKE_FIND_ROOT_PATH="..." -DCMAKE_TOOLCHAIN_FILE="..." -DCMAKE_INSTALL_PREFIX="..." 依赖库的搜索路径,toolchain file 路径,安装路径
    cd $builddir
    local MAIN_CMAKE_ARGS=("$@")
    if [ -n "$WAMR_C_FLAGS" ]; then
        MAIN_CMAKE_ARGS+=("-DCMAKE_C_FLAGS=$WAMR_C_FLAGS")
    fi
    if [ -n "$WAMR_CXX_FLAGS" ]; then
        MAIN_CMAKE_ARGS+=("-DCMAKE_CXX_FLAGS=$WAMR_CXX_FLAGS")
    fi

    ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "${MAIN_CMAKE_ARGS[@]}" \
        "-DWAMR_BUILD_TARGET=$WAMR_TARGET" \
        -DOHOS_ARCH=$ARCH \
        -DBUILD_SHARED_LIBS=ON \
        -DBUILD_STATIC_LIBS=ON \
        -DWAMR_DISABLE_HW_BOUND_CHECK=1 \
        -B$ARCH-build -S./ -L > $buildlog 2>&1
    $MAKE VERBOSE=1 -C $ARCH-build >> $buildlog 2>&1
    # 对最关键一步的退出码进行判断
    ret=$?
    if [ $ret -ne 0 ]; then
        echo "Main build failed for $ARCH" >&2
        cd "$OLDPWD"
        return $ret
    fi


    # === 2. 构建iwasm ===
    echo "=== Building iwasm $ARCH ===" >> "$buildlog"
    local IWASM_BUILD_DIR="$ARCH-build/iwasm-build"
    rm -rf "$IWASM_BUILD_DIR"
    mkdir -p "$IWASM_BUILD_DIR"

    local IWASM_CMAKE_ARGS=("$@")

    if [ -n "$WAMR_C_FLAGS" ]; then
        IWASM_CMAKE_ARGS+=("-DCMAKE_C_FLAGS=$WAMR_C_FLAGS")
    fi
    if [ -n "$WAMR_CXX_FLAGS" ]; then
        IWASM_CMAKE_ARGS+=("-DCMAKE_CXX_FLAGS=$WAMR_CXX_FLAGS")
    fi

    ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "${IWASM_CMAKE_ARGS[@]}" \
        "-DWAMR_BUILD_TARGET=$WAMR_TARGET" \
        -DOHOS_ARCH=$ARCH \
        -DCOLLECT_CODE_COVERAGE=OFF \
        -DWAMR_DISABLE_HW_BOUND_CHECK=1 \
        -B"$IWASM_BUILD_DIR" \
        -S"./product-mini/platforms/linux" >> "$buildlog" 2>&1

    $MAKE -C "$IWASM_BUILD_DIR" -j >> "$buildlog" 2>&1
    ret=$?
    cd "$OLDPWD"
    return 0
}

# 打包安装
package() {
    # cd $builddir
    # make -C $ARCH-build install
    # cd $OLDPWD
    cd $builddir/$ARCH-build
    $MAKE VERBOSE=1 install >> $buildlog 2>&1
    ret=$?
    cd $OLDPWD
    return $ret
}

# 进行测试的准备和说明
check() {
    echo "The test must be on an OpenHarmony device!"
}

# 清理环境
cleanbuild() {
    rm -rf ${PWD}/$builddir #${PWD}/$packagename
}