# 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
}