应用开发及编译

业务应用开发过程

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 最后两行指定的

最后更新于