应用开发及编译
业务应用开发过程
1、 添加头文件:#include "wd_edge_x.h"添加头文件之后,就可以调用我们提供的open-api
2、编写业务代码
编译过程
1、编译,编译需要使用wasi-sdk提供的编译工具Wasi-sdk仓库地址: https://github.com/WebAssembly/wasi-sdk注:wasi-sdk是用来编译wasm应用程序的,可以直接在https://github.com/WebAssembly/wasi-sdk/releases 下载可用的wasi-sdk
2、编译过程还会用到wamr-sdk,地址:https://github.com/bytecodealliance/wasm-micro-runtime/tree/main/wamr-sdk
3、编写CMakeLists.txt, 示例:
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
cmake_minimum_required(VERSION 3.0)
project(wasm-app)
set (WAMR_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..)
if (APPLE)
set (HAVE_FLAG_SEARCH_PATHS_FIRST 0)
set (CMAKE_C_LINK_FLAGS "")
set (CMAKE_CXX_LINK_FLAGS "")
endif ()
set (CMAKE_SYSTEM_PROCESSOR wasm32)
set (CMAKE_SYSROOT ${WAMR_ROOT_DIR}/wamr-sdk/app/libc-builtin-sysroot)
if (NOT DEFINED WASI_SDK_DIR)
set (WASI_SDK_DIR "../../wasi-sdk-20.0")
endif ()
set (CMAKE_C_FLAGS "-nostdlib")
set (CMAKE_C_COMPILER_TARGET "wasm32")
set (CMAKE_C_COMPILER "${WASI_SDK_DIR}/bin/clang")
set (CMAKE_EXE_LINKER_FLAGS
"-Wl,--max-memory=131072 -z stack-size=8192 \
-Wl,--no-entry,--strip-all \
-Wl,--export=__main_argc_argv \
-Wl,--export=__heap_base,--export=__data_end \
-Wl,--allow-undefined"
)
add_executable(demo1.wasm main.c)
target_link_libraries(demo1.wasm)
4、编译打包脚本:打包脚本:build_and_pack.sh
#!/bin/zsh
# 获取参数个数
num_args=$#
# 检查参数个数是否为零
if [ $num_args -eq 0 ]; then
echo "参数不存在!请提供app_name参数。"
exit 1
fi
# 获取第一个参数
APP_NAME=$1
# 判断文件夹是否存在
directory="build"
if [ ! -d "$directory" ]; then
echo "$directory 目录不存在, 需要先将程序编译"
mkdir -p $directory
cd $directory
cmake ..
make
else
echo "目录已存在:$directory"
cd $directory
make
fi
# 创建临时工作目录
if [ ! -d "$APP_NAME" ]; then
mkdir -p "$APP_NAME"
fi
WASM_NAME="$APP_NAME.wasm"
#复制二进制文件到应用目录
cp "$WASM_NAME" "$APP_NAME"
# 创建安装脚本 install.sh
cat <<EOL >"$APP_NAME/install.sh"
#!/bin/sh
# 获取当前用户的home目录
folder_path=/root/wd_edge/runtime/wasm-app
# 判断如果文件夹不存在则创建
if [ ! -d "\$folder_path" ]; then
mkdir \$folder_path
fi
mv $WASM_NAME \$folder_path
EOL
# 创建启动脚本 start.sh
cat <<EOL >"$APP_NAME/start.sh"
#!/bin/sh
APPNAME=$WASM_NAME
APP_PID=\`ps -ef |grep \$APPNAME |grep -v "grep" |awk '{printf "%s ",\$2}'\`
if [ "\$APP_PID" ]; then
echo "\$APNAME already started..."
else
folder_path=/root/wd_edge/runtime
cd \$folder_path
./iwasm --native-lib=./libwd_edge_x.so wasm-app/\$APPNAME
fi
EOL
# 创建停止脚本 stop.sh
cat <<EOL >"$APP_NAME/stop.sh"
APPNAME=$WASM_NAME
APP_PID=\`ps -ef |grep \$APPNAME |grep -v "grep" |awk '{printf "%s ",\$2}'\`
if [ "\$APP_PID" ]; then
kill -9 \$APP_PID
fi
EOL
# 创建卸载脚本 uninstall.sh
cat <<EOL >"$APP_NAME/uninstall.sh"
#!/bin/sh
rm -rf /root/wd_edge/runtime/wasm-app/$WASM_NAME
EOL
chmod a+x "$APP_NAME/install.sh"
chmod a+x "$APP_NAME/start.sh"
chmod a+x "$APP_NAME/stop.sh"
chmod a+x "$APP_NAME/uninstall.sh"
# 使用tar命令创建安装包
OUTPUT_FILE="$APP_NAME.tar.gz"
tar -zcvf "$APP_NAME.tar.gz" "$APP_NAME"
# 输出安装包文件路径
echo "安装包已创建:$APP_NAME.tar.gz"
# 输出安装包md5值
# 计算tar文件的md5值
tar_md5=$(md5 $OUTPUT_FILE | awk '{print $4}')
echo "MD5值为: $tar_md5"
# 清理临时工作目录
rm -rf "$APP_NAME"
scp $OUTPUT_FILE [email protected]:/home/wudun/snet-test-0621
所有的业务代码及编译需要的工具全部放在/root/projects/wasm-micro-runtime/demo
因为可能有多个业务应用demo,为了互不干扰,分别放在了demo1、demo2等文件夹下。
Wasm开发环境
Ubuntu x86_64:
地址:172.16.30.101 root/wdroot
路径:/root/projects/wasm-micro-runtime/demo
app路径: /root/projects/wasm-micro-runtime/demo/demo1/build/wasm-app
App build方式
cd /root/projects/wasm-micro-runtime/demo/demo1/
rm -rf ./build
mkdir build && cd build
cmake -DWAMR_BUILD_PLATFORM=linux -DWAMR_BUILD_TARGET=AARCH64 ..
make
Build app产物: build/wasm-app/demo1.wasm
编译的产出物的文件名是在CMakeLists.txt 最后两行指定的
最后更新于