nuttx-apps/interpreters/wamr/Toolchain.defs
chao an 4f11f38c38 interpreters/wamr: add compile role of WebAssembly
Add compilation rules to support WebAssembly(WASM/WAMR):

1. Compile Toolchain
 1> Download WASI sdk and export the WASI_SDK_PATH path:

$ wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-19/wasi-sdk-19.0-linux.tar.gz
$ tar xf wasi-sdk-19.0-linux.tar.gz
Put wasi-sdk-19.0 to your host WASI_SDK_PATH environment variable, like:
$ export WASI_SDK_PATH=`pwd`/wasi-sdk-19.0

 2> Download Wamr "wamrc" AOT compiler and export to the PATH:
$ mkdir wamrc
$ wget https://github.com/bytecodealliance/wasm-micro-runtime/releases/download/WAMR-1.1.2/wamrc-1.1.2-x86_64-ubuntu-20.04.tar.gz
$ tar xf wamrc-1.1.2-x86_64-ubuntu-20.04.tar.gz
$ export PATH=$PATH:$PWD

2. Configuring and running

 1> Configuring sim/wamr and compile:

nuttx$ ./tools/configure.sh  sim/wamr
nuttx$ make
...
Wamrc Generate AoT: /home/archer/code/nuttx/n5/apps/wasm/hello.aot
Wamrc Generate AoT: /home/archer/code/nuttx/n5/apps/wasm/coremark.aot
LD:  nuttx

 2> Copy the generated wasm file(Interpreter/AoT)

nuttx$ cp ../apps/wasm/hello.aot .
nuttx$ cp ../apps/wasm/hello.wasm .
nuttx$ cp ../apps/wasm/coremark.wasm .

 3> Run iwasm

nuttx$ ./nuttx
NuttShell (NSH) NuttX-10.4.0
nsh> iwasm /data/hello.wasm
Hello, World!!
nsh> iwasm /data/hello.aot
Hello, World!!
nsh> iwasm /data/coremark.wasm
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 12000
Total time (secs): 12.000000
Iterations/Sec   : 5.000000
Iterations       : 60
Compiler version : Clang 15.0.7
Compiler flags   : Using NuttX compilation options
Memory location  : Defined by the NuttX configuration
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0xa14c
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 5.000000 / Clang 15.0.7 Using NuttX compilation options / Defined by the NuttX configuration

Co-Authored-By: Huang Qi <huangqi3@xiaomi.com>
Signed-off-by: chao an <anchao@xiaomi.com>
2023-03-06 13:23:44 +02:00

150 lines
5.2 KiB
Plaintext

############################################################################
# apps/interpreters/wamr/Toolchain.defs
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership. The
# ASF licenses this file to you 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.
#
############################################################################
# Wasm32 toolchain setting
# Target: wasm32-unknown-wasi
WCC ?= $(WASI_SDK_PATH)/bin/clang
WAR ?= $(WASI_SDK_PATH)/bin/llvm-ar rcs
WRC ?= wamrc
WSYSROOT ?= $(TOPDIR)
CFLAGS_STRIP = -fsanitize=kernel-address -fsanitize=address -fsanitize=undefined
CFLAGS_STRIP += $(ARCHCPUFLAGS) $(ARCHCFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(ARCHOPTIMIZATION) $(EXTRAFLAGS)
WCFLAGS += $(filter-out $(CFLAGS_STRIP),$(CFLAGS))
WCFLAGS += --sysroot=$(WSYSROOT) -nostdlib -D__NuttX__
WLDFLAGS = -z stack-size=$(STACKSIZE) -Wl,--initial-memory=$(INITIAL_MEMORY)
WLDFLAGS += -Wl,--export=main -Wl,--export=__main_argc_argv
WLDFLAGS += -Wl,--export=__heap_base -Wl,--export=__data_end
WLDFLAGS += -Wl,--no-entry -Wl,--strip-all -Wl,--allow-undefined
ifeq ($(CONFIG_ARCH_ARM),y)
ifeq ($(CONFIG_ARM_THUMB),y)
WTARGET = thumb
else
WTARGET = arm
endif
ifeq ($(CONFIG_ARCH_CORTEXM85),y)
WTARGET := $(WTARGET)v8.1m.main
WCPU = --cpu=cortex-m85
else ifeq ($(CONFIG_ARCH_CORTEXM55),y)
WTARGET := $(WTARGET)v8.1m.main
WCPU = --cpu=cortex-m55
else ifeq ($(CONFIG_ARCH_CORTEXM35P),y)
WTARGET := $(WTARGET)v8m.main
WCPU = --cpu=cortex-m35p
else ifeq ($(CONFIG_ARCH_CORTEXM33),y)
WTARGET := $(WTARGET)v8m.main
WCPU = --cpu=cortex-m33
else ifeq ($(CONFIG_ARCH_CORTEXM23),y)
WTARGET := $(WTARGET)v8m.main
WCPU = --cpu=cortex-m23
else ifeq ($(CONFIG_ARCH_CORTEXM7),y)
WTARGET := $(WTARGET)v7em
WCPU = --cpu=cortex-m7
else ifeq ($(CONFIG_ARCH_CORTEXM4),y)
WTARGET := $(WTARGET)v7em
WCPU = --cpu=cortex-m4
else ifeq ($(CONFIG_ARCH_CORTEXM3),y)
WTARGET := $(WTARGET)v7em
WCPU = --cpu=cortex-m3
else ifeq ($(CONFIG_ARCH_CORTEXM0),y)
WTARGET := $(WTARGET)v6m
WCPU = --cpu=cortex-m0
endif
ifeq ($(CONFIG_ARCH_CORTEXA5),y)
WTARGET := $(WTARGET)armv7
WCPU = --cpu=cortex-a5
else ifeq ($(CONFIG_ARCH_CORTEXA7),y)
WTARGET := $(WTARGET)armv7
WCPU = --cpu=cortex-a7
else ifeq ($(CONFIG_ARCH_CORTEXA8),y)
WTARGET := $(WTARGET)armv8a
WCPU = --cpu=cortex-a8
else ifeq ($(CONFIG_ARCH_CORTEXA9),y)
WTARGET := $(WTARGET)armv7
WCPU = --cpu=cortex-a9
endif
ifeq ($(CONFIG_ARCH_CORTEXR4),y)
WTARGET := $(WTARGET)armv7
WCPU = --cpu=cortex-r4
else ifeq ($(CONFIG_ARCH_CORTEXR5),y)
WTARGET := $(WTARGET)armv7
WCPU = --cpu=cortex-r5
else ifeq ($(CONFIG_ARCH_CORTEXR7),y)
WTARGET := $(WTARGET)armv7
WCPU = --cpu=cortex-r7
endif
else ifeq ($(CONFIG_ARCH_RISCV),y)
ifeq ($(CONFIG_ARCH_RV64),y)
WTARGET = riscv64
else
WTARGET = riscv32
endif
else ifeq ($(CONFIG_ARCH_XTENSA),y)
WTARGET = xtensa
else ifeq ($(CONFIG_ARCH_X86_64),y)
WTARGET = x86_64
else ifeq ($(CONFIG_ARCH_X86),y)
WTARGET = i386
else ifeq ($(CONFIG_ARCH_MIPS),y)
WTARGET = mips
else ifeq ($(CONFIG_ARCH_SIM),y)
RCFLAGS += --disable-simd
ifeq ($(CONFIG_SIM_M32),y)
WTARGET = i386
else
WTARGET = x86_64
endif
endif
RCFLAGS += --target=$(WTARGET) $(WCPU)
define LINK_WAMR
$(if $(wildcard $(APPDIR)$(DELIM)wasm$(DELIM)*.wo), \
$(foreach bin,$(wildcard $(APPDIR)$(DELIM)wasm$(DELIM)*.wo), \
$(eval INITIAL_MEMORY=$(shell echo $(notdir $(bin)) | cut -d'#' -f2)) \
$(eval STACKSIZE=$(shell echo $(notdir $(bin)) | cut -d'#' -f3)) \
$(eval PROGNAME=$(shell echo $(notdir $(bin)) | cut -d'#' -f1)) \
$(eval WAMRMODE=$(shell echo $(notdir $(bin)) | cut -d'#' -f5)) \
$(shell $(WCC) $(bin) $(WBIN) $(WCFLAGS) $(WLDFLAGS) -o $(APPDIR)$(DELIM)wasm$(DELIM)$(PROGNAME).wasm) \
$(if $(CONFIG_INTERPRETERS_WAMR_AOT), \
$(if $(filter AOT,$(WAMRMODE)), \
$(info Wamrc Generate AoT: $(APPDIR)$(DELIM)wasm$(DELIM)$(PROGNAME).aot) \
$(shell $(WRC) $(RCFLAGS) -o $(APPDIR)$(DELIM)wasm$(DELIM)$(PROGNAME).aot \
$(APPDIR)$(DELIM)wasm$(DELIM)$(PROGNAME).wasm > /dev/null), \
$(if $(filter XIP,$(WAMRMODE)), \
$(info Wamrc Generate XiP: $(APPDIR)$(DELIM)wasm$(DELIM)$(PROGNAME).xip) \
$(shell $(WRC) $(RCFLAGS) --enable-indirect-mode --disable-llvm-intrinsics \
-o $(APPDIR)$(DELIM)wasm$(DELIM)$(PROGNAME).xip \
$(APPDIR)$(DELIM)wasm$(DELIM)$(PROGNAME).wasm > /dev/null) \
) \
) \
) \
) \
)
endef