Enable AoT and wamr-sdk, and change arguments of call wasm API (#157)

* Implement memory profiler, optimize memory usage, modify code indent

* Implement memory.grow and limit heap space base offset to 1G; modify iwasm build type to Release and 64 bit by default

* Add a new extension library: connection

* Fix bug of reading magic number and version in big endian platform

* Re-org platform APIs: move most platform APIs from iwasm to shared-lib

* Enhance wasm loader to fix some security issues

* Fix issue about illegal load of EXC_RETURN into PC on stm32 board

* Updates that let a restricted version of the interpreter run in SGX

* Enable native/app address validation and conversion for wasm app

* Remove wasm_application_exectue_* APIs from wasm_export.h which makes confused

* Refine binary size and fix several minor issues

Optimize interpreter LOAD/STORE opcodes to decrease the binary size
Fix issues when using iwasm library: _bh_log undefined, bh_memory.h not found
Remove unused _stdin/_stdout/_stderr global variables resolve in libc wrapper
Add macros of global heap size, stack size, heap size for Zephyr main.c
Clear compile warning of wasm_application.c

* Add more strict security checks for libc wrapper API's

* Use one libc wrapper copy for sgx and other platforms; remove bh_printf macro for other platform header files

* Enhance security of libc strcpy/sprintf wrapper function

* Fix issue of call native for x86_64/arm/mips, add module inst parameter for native wrapper functions

* Remove get_module_inst() and fix issue of call native

* Refine wgl lib: remove module_inst parameter from widget functions; move function index check to runtime instantiate

* Refine interpreter call native process, refine memory boudary check

* Fix issues of invokeNative function of arm/mips/general version

* Add a switch to build simple sample without gui support

* Add BUILD_TARGET setting in makefile to replace cpu compiler flags in source code

* Re-org shared lib header files, remove unused info; fix compile issues of vxworks

* Add build target general

* Remove unused files

* Update license header

* test push

* Restore file

* Sync up with internal/feature

* Sync up with internal/feature

* Rename build_wamr_app to build_wasm_app

* Fix small issues of README

* Enhance malformed wasm file checking
Fix issue of print hex int and implement utf8 string check
Fix wasi file read/write right issue
Fix minor issue of build wasm app doc

* Sync up with internal/feature

* Sync up with internal/feature: fix interpreter arm issue, fix read leb issue

* Sync up with internal/feature

* Fix bug of config.h and rename wasi config.h to ssp_config.h

* Sync up with internal/feature

* Import wamr aot

* update document

* update document

* Update document, disable WASI in 32bit

* update document

* remove files

* update document

* Update document

* update document

* update document

* update samples

* Sync up with internal repo
This commit is contained in:
wenyongh
2020-01-21 13:26:14 +08:00
committed by Wang Xin
parent 2a4528c749
commit 46b93b9d22
464 changed files with 25137 additions and 7911 deletions

92
wamr-sdk/Kconfig Normal file
View File

@ -0,0 +1,92 @@
mainmenu "WebAssembly Micro Runtime Configuration"
config WAMR_SDK_PROFILE
string "wamr sdk profile name"
default "default"
help
create a new SDK by giving a name or overwrite
the "default" profile
choice
prompt "select a build target"
config TARGET_X86_64
bool "X86_64"
config TARGET_X86_32
bool "X86_32"
endchoice
choice
prompt "select a target platform"
config PLATFORM_LINUX
bool "Linux"
endchoice
menu "select execution mode"
comment "At least one execution mode must be selected"
config EXEC_AOT
bool "AOT"
depends on PLATFORM_LINUX
config EXEC_JIT
bool "JIT"
depends on PLATFORM_LINUX
select BUILD_LLVM
config BUILD_LLVM
bool "build llvm (this may take a long time)"
depends on EXEC_JIT
help
llvm library is required by JIT mode.
config EXEC_INTERP
bool "INTERPRETER"
default y
endmenu
choice
prompt "libc support"
config LIBC_BUILTIN
bool "builtin libc"
help
use builtin libc, this is a minimal subset of libc.
config LIBC_WASI
bool "WebAssembly System Interface [WASI]"
depends on PLATFORM_LINUX
help
enable WebAssembly System Interface
endchoice
config APP_FRAMEWORK_ENABLE
bool "enable app framework"
help
enable wamr app framework
menu "app modules"
depends on APP_FRAMEWORK_ENABLE
config APP_BUILD_ALL
bool "enable all modules"
source ".wamr_modules"
endmenu
config EXTRA_INCLUDE_ENABLE
bool "enable extra include dir"
config EXTRA_INCLUDE_PATH
string "external include path"
depends on EXTRA_INCLUDE_ENABLE
help
Pass external include path to be added in the SDK
This is useful when your app modules need some external
header files, such as the wgl modules which need some config
file when building the runtime library

10
wamr-sdk/Makefile Normal file
View File

@ -0,0 +1,10 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
# # This will generate SDK for both runtime and wasm application
config:
./build_sdk.sh -i
menuconfig:
./menuconfig.sh

52
wamr-sdk/README.md Normal file
View File

@ -0,0 +1,52 @@
# SDK for Wasm Micro Runtime
This folder contains some tools to generate sdk for wamr runtime and wasm applications, the script and cmake files here are called by `make`, don't use them manually.
## Build the SDK
``` Bash
cd ${WAMR_ROOT}/wamr-sdk
make config
```
Following the prompt to finish the settings for your customized runtime and app sdk, then you will get `out` folder under `${WAMR_ROOT}`
The structure of the output folder is like bellow:
```
out
|--app-sdk/
| |--sysroot/
| |--wamr_toolchain.cmake
|
|--runtime-sdk/
|--include
|--lib
|--wamr_config.cmake
```
### app-sdk usage
The `app-sdk` is used to develop wasm applications, if your project are built with cmake, then the `wamr_toolchain.cmake` file is what you need to compile your project into wasm bytecode.
### runtime-sdk usage
The `runtime-sdk` is used to help you embed WAMR runtime into your product easier. There are two method you can use the SDK:
1. Use the provided `runtime_lib.cmake` file:
You can include `${WAMR_ROOT}/cmake/runtime_lib.cmake` in your project's `CMakeLists.txt` file:
``` cmake
include (${WAMR_ROOT}/cmake/runtime_lib.cmake)
add_library (vmlib ${WAMR_RUNTIME_LIB_SOURCE})
# ......
target_link_libraries (your_target vmlib -lm -ldl -lpthread)
```
2. Use the pre-built static library:
You can link the pre-built library:
``` cmake
link_directories(${SDK_DIR}/runtime-sdk/lib)
include_directories(${SDK_DIR}/runtime-sdk/include)
# ......
target_link_libraries (your_target vmlib -lm -ldl -lpthread)
```
This method can also be used when you don't use cmake
You can refer to this sample: [CMakeLists.txt](../samples/simple/CMakeLists.txt).
> NOTE: If you are familiar with how to configure WAMR by cmake and don't want to build the SDK, you can set the related settings on the top of your `CMakeLists.txt`, then the `runtime_lib.cmake` will not load settings from the SDK.

View File

@ -0,0 +1,97 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
cmake_minimum_required(VERSION 2.8)
project(app-framework)
SET (CMAKE_C_FLAGS "-O3")
if (NOT DEFINED WAMR_BUILD_SDK_PROFILE)
set (WAMR_BUILD_SDK_PROFILE "default")
endif ()
if (NOT DEFINED CONFIG_PATH)
set (CONFIG_PATH ${CMAKE_CURRENT_LIST_DIR}/../wamr_config_default.cmake)
message(STATUS, "CONFIG_PATH set to ${CONFIG_PATH} ")
endif ()
if (NOT EXISTS "${CONFIG_PATH}")
message (FATAL_ERROR "${CONFIG_PATH} not exist")
endif ()
include(${CONFIG_PATH})
set (OUT_DIR "${CMAKE_CURRENT_LIST_DIR}/../out/${WAMR_BUILD_SDK_PROFILE}")
set (APP_SDK_DIR "${OUT_DIR}/app-sdk")
if (DEFINED EXTRA_SDK_INCLUDE_PATH)
message(STATUS, "EXTRA_SDK_INCLUDE_PATH = ${EXTRA_SDK_INCLUDE_PATH} ")
include_directories (
${EXTRA_SDK_INCLUDE_PATH}
)
endif ()
if (WAMR_BUILD_LIBC_BUILTIN EQUAL 1)
set (SYSROOT_DIR "${APP_SDK_DIR}/libc-builtin-sysroot")
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${SYSROOT_DIR}/include)
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${SYSROOT_DIR}/share)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/libc-builtin-sysroot/share/defined-symbols.txt ${SYSROOT_DIR}/share)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/wamr_toolchain.cmake ${APP_SDK_DIR})
execute_process(
COMMAND ${CMAKE_COMMAND}
-E copy_directory ${CMAKE_CURRENT_LIST_DIR}/libc-builtin-sysroot/include ${SYSROOT_DIR}/include
)
else()
if (WAMR_BUILD_LIBC_WASI EQUAL 1)
set (SYSROOT_DIR "${APP_SDK_DIR}/wasi-sysroot")
message("sysroot: ${SYSROOT_DIR}")
execute_process(COMMAND ln -s ${WASI_SDK_DIR}/share/wasi-sysroot ${SYSROOT_DIR})
execute_process(COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_LIST_DIR}/wasi_toolchain.cmake ${APP_SDK_DIR}/wamr_toolchain.cmake)
endif ()
endif()
if (WAMR_BUILD_APP_FRAMEWORK EQUAL 1)
message(WAMR_BUILD_APP_FRAMEWORK)
set (APP_FRAMEWORK_INCLUDE_TYPE "APP")
set (WAMR_APP_OUT_DIR "${APP_SDK_DIR}/wamr-app-framework")
include(${CMAKE_CURRENT_LIST_DIR}/../../core/app-framework/app_framework.cmake)
add_library(app_framework
${WASM_APP_SOURCE_ALL}
)
add_custom_command(
TARGET app_framework POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${WAMR_APP_OUT_DIR}/lib
COMMAND ${CMAKE_COMMAND} -E make_directory ${WAMR_APP_OUT_DIR}/include/wa-inc
COMMAND ${CMAKE_COMMAND} -E make_directory ${WAMR_APP_OUT_DIR}/share
COMMAND ${CMAKE_COMMAND} -E copy_directory ${WASM_APP_BI_INC_DIR} ${WAMR_APP_OUT_DIR}/include/bi-inc
COMMAND ${CMAKE_COMMAND} -E copy ${WASM_APP_BASE_DIR}/bh_platform.h ${WAMR_APP_OUT_DIR}/include
COMMAND ${CMAKE_COMMAND} -E copy ${WASM_APP_BASE_DIR}/wasm_app.h ${WAMR_APP_OUT_DIR}/include
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/*.a ${WAMR_APP_OUT_DIR}/lib
# bi-inc folder should also copy into runtime-sdk
COMMAND ${CMAKE_COMMAND} -E make_directory ${OUT_DIR}/runtime-sdk/include
COMMAND ${CMAKE_COMMAND} -E copy_directory ${WASM_APP_BI_INC_DIR} ${OUT_DIR}/runtime-sdk/include/bi-inc
)
# If app-framework is enabled, add the undefined-symbol list to the toolchain file
if (WAMR_BUILD_LIBC_WASI EQUAL 1)
file (APPEND
${APP_SDK_DIR}/wamr_toolchain.cmake
"SET (CMAKE_EXE_LINKER_FLAGS \"\${CMAKE_EXE_LINKER_FLAGS},--allow-undefined-file=\${CMAKE_CURRENT_LIST_DIR}/wamr-app-framework/share/defined-symbols.txt\" CACHE INTERNAL \"\")"
)
endif ()
FOREACH (dir IN LISTS WASM_APP_WA_INC_DIR_LIST)
file (COPY ${dir} DESTINATION ${WAMR_APP_OUT_DIR}/include/)
ENDFOREACH (dir)
if (DEFINED EXTRA_SDK_INCLUDE_PATH)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${EXTRA_SDK_INCLUDE_PATH} ${WAMR_APP_OUT_DIR}/include)
endif ()
endif()

View File

@ -0,0 +1,20 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_ASSERT_H
#define _WAMR_LIBC_ASSERT_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,28 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_CTYPE_H
#define _WAMR_LIBC_CTYPE_H
#ifdef __cplusplus
extern "C" {
#endif
int isupper(int c);
int isalpha(int c);
int isspace(int c);
int isgraph(int c);
int isprint(int c);
int isdigit(int c);
int isxdigit(int c);
int tolower(int c);
int toupper(int c);
int isalnum(int c);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,20 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_ERRNO_H
#define _WAMR_LIBC_ERRNO_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,20 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_FCNTL_H
#define _WAMR_LIBC_FCNTL_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,21 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_INTTYPES_H
#define _WAMR_LIBC_INTTYPES_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,34 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_LIMITS_H
#define _WAMR_LIBC_LIMITS_H
#ifdef __cplusplus
extern "C" {
#endif
#define CHAR_BIT 8
#define SCHAR_MIN -128
#define SCHAR_MAX 127
#define UCHAR_MAX 255
#define CHAR_MIN 0
#define CHAR_MAX 127
#define MB_LEN_MAX 1
#define SHRT_MIN -32768
#define SHRT_MAX +32767
#define USHRT_MAX 65535
#define INT_MIN -32768
#define INT_MAX +32767
#define UINT_MAX 65535
#define LONG_MIN -2147483648
#define LONG_MAX +2147483647
#define ULONG_MAX 4294967295
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,19 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_STDBOOL_H
#define _WAMR_LIBC_STDBOOL_H
#define __bool_true_false_are_defined 1
#ifndef __cplusplus
#define bool _Bool
#define false 0
#define true 1
#endif /* __cplusplus */
#endif

View File

@ -0,0 +1,48 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_STDINT_H
#define _WAMR_LIBC_STDINT_H
#ifdef __cplusplus
extern "C" {
#endif
typedef char int8_t;
typedef short int int16_t;
typedef int int32_t;
typedef long int int64_t;
/* Unsigned. */
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long int uint64_t;
typedef __INTPTR_TYPE__ intptr_t;
typedef __UINTPTR_TYPE__ uintptr_t;
/* Minimum of signed integral types. */
# define INT8_MIN (-128)
# define INT16_MIN (-32767-1)
# define INT32_MIN (-2147483647-1)
# define INT64_MIN (-__INT64_C(9223372036854775807)-1)
/* Maximum of signed integral types. */
# define INT8_MAX (127)
# define INT16_MAX (32767)
# define INT32_MAX (2147483647)
# define INT64_MAX (__INT64_C(9223372036854775807))
/* Maximum of unsigned integral types. */
# define UINT8_MAX (255)
# define UINT16_MAX (65535)
# define UINT32_MAX (4294967295U)
# define UINT64_MAX (__UINT64_C(18446744073709551615))
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,30 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_STDIO_H
#define _WAMR_LIBC_STDIO_H
#ifdef __cplusplus
extern "C" {
#endif
#ifndef NULL
# define NULL ((void*) 0)
#endif
typedef unsigned long size_t;
int printf(const char *format, ...);
int putchar(int c);
int snprintf(char *str, size_t size, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int puts(char *string);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,28 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_STDLIB_H
#define _WAMR_LIBC_STDLIB_H
#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned long size_t;
int atoi(const char *s);
void exit(int status);
long strtol(const char *nptr, char **endptr, register int base);
unsigned long strtoul(const char *nptr, char **endptr, register int base);
void *malloc(size_t size);
void *calloc(size_t n, size_t size);
void free(void *ptr);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,36 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_STRING_H
#define _WAMR_LIBC_STRING_H
#ifdef __cplusplus
extern "C" {
#endif
typedef unsigned long size_t;
int memcmp(const void *s1, const void *s2, size_t n);
void *memcpy(void *dest, const void *src, size_t n);
void *memmove(void *dest, const void *src, size_t n);
void *memset(void *s, int c, size_t n);
void *memchr(const void *s, int c, size_t n);
int strncasecmp(const char *s1, const char *s2, size_t n);
size_t strspn(const char *s, const char *accept);
size_t strcspn(const char *s, const char *reject);
char *strstr(const char *s, const char *find);
char *strchr(const char *s, int c);
int strcmp(const char *s1, const char *s2);
char *strcpy(char *dest, const char *src);
size_t strlen(const char *s);
int strncmp(const char * str1, const char * str2, size_t n);
char *strncpy(char *dest, const char *src, unsigned long n);
char * strdup(const char *s);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,20 @@
/*
* Copyright (C) 2019 Intel Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
*/
#ifndef _WAMR_LIBC_STRINGS_H
#define _WAMR_LIBC_STRINGS_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef __cplusplus
}
#endif
#endif

View File

@ -0,0 +1,64 @@
wasm_open_connection
wasm_close_connection
wasm_send_on_connection
wasm_config_connection
wasm_sensor_open
wasm_sensor_config
wasm_sensor_config_with_attr_container
wasm_sensor_close
wasm_btn_native_call
wasm_obj_native_call
wasm_label_native_call
wasm_cont_native_call
wasm_page_native_call
wasm_list_native_call
wasm_ddlist_native_call
wasm_cb_native_call
wasm_register_resource
wasm_response_send
wasm_post_request
wasm_sub_event
wasm_create_timer
wasm_timer_destroy
wasm_timer_cancel
wasm_timer_restart
wasm_get_sys_tick_ms
printf
sprintf
snprintf
puts
putchar
memcmp
memcpy
memmove
memset
strchr
strcmp
strcpy
strlen
strncmp
strncpy
malloc
calloc
strdup
free
atoi
bsearch
exit
strtol
strtoul
memchr
strncasecmp
strspn
strcspn
strstr
isupper
isalpha
isspace
isgraph
isprint
isdigit
isxdigit
tolower
toupper
isalnum

View File

@ -0,0 +1,29 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_PROCESSOR wasm32)
SET (CMAKE_SYSROOT ${CMAKE_CURRENT_LIST_DIR}/libc-builtin-sysroot)
if (NOT DEFINED WASI_SDK_DIR)
SET (WASI_SDK_DIR "/opt/wasi-sdk")
endif ()
SET (CMAKE_C_FLAGS "-nostdlib -z stack-size=4096" CACHE INTERNAL "")
SET (CMAKE_C_COMPILER_TARGET "wasm32")
SET (CMAKE_C_COMPILER "${WASI_SDK_DIR}/bin/clang")
SET (CMAKE_CXX_FLAGS "-nostdlib -z stack-size=4096" CACHE INTERNAL "")
SET (CMAKE_CXX_COMPILER_TARGET "wasm32")
SET (CMAKE_CXX_COMPILER "${WASI_SDK_DIR}/bin/clang++")
SET (CMAKE_EXE_LINKER_FLAGS
"-Wl,--initial-memory=65536,--no-entry,--no-threads,--strip-all" CACHE INTERNAL "")
SET (CMAKE_LINKER "${WASI_SDK_DIR}/bin/wasm-ld" CACHE INTERNAL "")
SET (CMAKE_AR "${WASI_SDK_DIR}/bin/llvm-ar" CACHE INTERNAL "")
SET (CMAKE_NM "${WASI_SDK_DIR}/bin/llvm-nm" CACHE INTERNAL "")
SET (CMAKE_OBJDUMP "${WASI_SDK_DIR}/bin/llvm-dwarfdump" CACHE INTERNAL "")
SET (CMAKE_RANLIB "${WASI_SDK_DIR}/bin/llvm-ranlib" CACHE INTERNAL "")
SET (CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS},--allow-undefined-file=${CMAKE_SYSROOT}/share/defined-symbols.txt" CACHE INTERNAL "")

View File

@ -0,0 +1,17 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
SET(CMAKE_SYSTEM_NAME Linux)
if (NOT DEFINED WASI_SDK_DIR)
SET (WASI_SDK_DIR "/opt/wasi-sdk")
endif ()
SET (CMAKE_C_COMPILER "${WASI_SDK_DIR}/bin/clang")
SET (CMAKE_CXX_COMPILER "${WASI_SDK_DIR}/bin/clang++")
SET (CMAKE_LINKER "${WASI_SDK_DIR}/bin/wasm-ld" CACHE INTERNAL "")
SET (CMAKE_AR "${WASI_SDK_DIR}/bin/llvm-ar" CACHE INTERNAL "")
SET (CMAKE_NM "${WASI_SDK_DIR}/bin/llvm-nm" CACHE INTERNAL "")
SET (CMAKE_OBJDUMP "${WASI_SDK_DIR}/bin/llvm-dwarfdump" CACHE INTERNAL "")
SET (CMAKE_RANLIB "${WASI_SDK_DIR}/bin/llvm-ranlib" CACHE INTERNAL "")

444
wamr-sdk/build_sdk.sh Executable file
View File

@ -0,0 +1,444 @@
#!/bin/bash
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
sdk_root=$(cd "$(dirname "$0")/" && pwd)
wamr_root_dir=${sdk_root}/..
out_dir=${sdk_root}/out
profile_path=${out_dir}/profile.cmake
wamr_config_cmake_file=""
# libc support, default builtin-libc
LIBC_SUPPORT="BUILTIN"
CMAKE_DEXTRA_SDK_INCLUDE_PATH=""
# menuconfig will pass options to this script
MENUCONFIG=""
usage ()
{
echo "build.sh [options]"
echo " -n [profile name]"
echo " -x [config file path name]"
echo " -p [platform]"
echo " -t [target]"
echo " -m [mode]"
echo " -e [extra include path], files under this path will be copied into SDK package"
echo " -c, clean"
echo " -i, enter interactive config setting"
exit 1
}
while getopts "e:x:n:p:t:m:l:awgicg" opt
do
case $opt in
n)
PROFILE=$OPTARG
;;
x)
wamr_config_cmake_file=$OPTARG
;;
p)
PLATFORM=$OPTARG
;;
t)
TARGET=$OPTARG
;;
m)
OLD_IFS="$IFS"
IFS=","
MODES=($OPTARG)
IFS="$OLD_IFS"
;;
l)
OLD_IFS="$IFS"
IFS=","
APP_LIST=($OPTARG)
IFS="$OLD_IFS"
;;
e)
CMAKE_DEXTRA_SDK_INCLUDE_PATH="-DEXTRA_SDK_INCLUDE_PATH=${OPTARG}"
;;
a)
APP="TRUE"
;;
c)
CLEAN="TRUE"
;;
w)
LIBC_SUPPORT="WASI"
;;
g)
FROM_GUI_MENU="TRUE"
;;
i)
MENUCONFIG="TRUE"
;;
?)
echo "Unknown arg: $arg"
usage
exit 1
;;
esac
done
if [ ! -d "${out_dir}" ]; then
mkdir -p ${out_dir}
fi
echo "CMAKE_DEXTRA_SDK_INCLUDE_PATH=${CMAKE_DEXTRA_SDK_INCLUDE_PATH}"
if [ -z "$PROFILE" ]; then
PROFILE="default"
echo "PROFILE argument not set, using DEFAULT"
fi
curr_profile_dir=${out_dir}/${PROFILE}
wamr_app_out_dir=${curr_profile_dir}/app-sdk/wamr-app-framework
sysroot_dir=${curr_profile_dir}/app-sdk/libc-builtin-sysroot
if [[ "$CLEAN" = "TRUE" ]]; then
rm -rf ${curr_profile_dir}
fi
# cmake config file for wamr runtime:
# 1. use the users provided the config cmake file path.
# 2. if user set MENU CONFIG, enter menu config to generate menu_config.cmake in the profile output folder
# 3. If the menu_config.cmake is already in the profile folder, use it
#4: use the default config cmake file
if [[ -n "$wamr_config_cmake_file" ]]; then
echo "User config file: [${wamr_config_cmake_file}]"
else
wamr_config_cmake_file=${curr_profile_dir}/wamr_config_menu.cmake
if [[ "$MENUCONFIG" = "TRUE" ]] || [[ "$FROM_GUI_MENU" = "TRUE" ]]; then
echo "MENUCONFIG: user config file: [${wamr_config_cmake_file}]"
elif [[ -f $wamr_config_cmake_file ]]; then
echo "use existing config file: [$wamr_config_cmake_file]"
else
wamr_config_cmake_file=${sdk_root}/wamr_config_default.cmake
echo "use default config file: [$wamr_config_cmake_file]"
fi
fi
# if called by gui menuconfig, overwrite the exist profile
if [ "${FROM_GUI_MENU}" != "TRUE" ]; then
if [[ "$PROFILE" != "default" ]] && [[ -d "$curr_profile_dir" ]]; then
echo "#########################################################"
echo "profile ${curr_profile_dir} already exists"
echo " skip the build process and use the previous settings: [y]"
echo " or delete the profile and generate a new one: n"
read -a erase_exist
if [[ "$erase_exist" != "n" ]] && [[ "$erase_exist" != "N" ]]; then
exit 0
fi
rm -rf ${curr_profile_dir}
fi
fi
mkdir -p ${curr_profile_dir}
mkdir -p ${curr_profile_dir}/app-sdk
mkdir -p ${curr_profile_dir}/runtime-sdk
function set_build_target () {
target=$1
if [[ "${target}" = "X86_64" ]]; then
echo -e "set (WAMR_BUILD_TARGET \"X86_64\")" >> ${wamr_config_cmake_file}
elif [[ "${target}" = "X86_32" ]]; then
echo -e "set (WAMR_BUILD_TARGET \"X86_32\")" >> ${wamr_config_cmake_file}
else
echo "unknown build target."
exit 1
fi
}
function set_build_platform () {
platform=$1
if [[ "${platform}" = "linux" ]]; then
echo -e "set (WAMR_BUILD_PLATFORM \"linux\")" >> ${wamr_config_cmake_file}
# TODO: add other platforms
else
echo "${platform} platform currently not supported"
exit 1
fi
}
# input: array of selected exec modes [aot jit interp]
function set_exec_mode () {
modes=($1)
for mode in ${modes[@]}
do
if [[ "$mode" = "aot" ]]; then
echo "set (WAMR_BUILD_AOT 1)" >> ${wamr_config_cmake_file}
elif [[ "$mode" = "jit" ]]; then
echo "set (WAMR_BUILD_JIT 1)" >> ${wamr_config_cmake_file}
BUILD_LLVM="TRUE"
elif [[ "$mode" = "interp" ]]; then
echo "set (WAMR_BUILD_INTERP 1)" >> ${wamr_config_cmake_file}
else
echo "unknown execute mode."
exit 1
fi
done
}
function set_libc_support () {
libc=$1
if [ "$libc" = "WASI" ]; then
echo "set (WAMR_BUILD_LIBC_WASI 1)" >> ${wamr_config_cmake_file}
else
echo "set (WAMR_BUILD_LIBC_BUILTIN 1)" >> ${wamr_config_cmake_file}
fi
}
function set_app_framework () {
app_support=$1
if [ "$app_support" = "TRUE" ]; then
echo "set (WAMR_BUILD_APP_FRAMEWORK 1)" >> ${wamr_config_cmake_file}
fi
}
# input: array of selected app modules
function set_app_module () {
modules=($1)
for module in ${modules[*]}
do
if [ "${module}" = "all" ]; then
cmake_app_list="WAMR_APP_BUILD_ALL"
break
fi
cmake_app_list="${cmake_app_list} WAMR_APP_BUILD_${module^^}"
done
# APP module list
if [ -n "${cmake_app_list}" ]; then
echo "set (WAMR_BUILD_APP_LIST ${cmake_app_list# })" >> ${wamr_config_cmake_file}
fi
}
if [ ! -f "/opt/wasi-sdk/bin/clang" ]; then
echo "Can't find wasi-sdk under /opt/wasi-sdk"
echo "You can download wasi-sdk from here:"
echo ""
echo "https://github.com/CraneStation/wasi-sdk/releases/tag/wasi-sdk-7"
echo ""
echo "please install it to the default path for your convenience"
echo ""
exit 1
fi
if [ "${FROM_GUI_MENU}" = "TRUE" ]; then
# called from gui based menuconfig,
# all settings are passed from command line options
if [[ -f $wamr_config_cmake_file ]]; then
rm $wamr_config_cmake_file
fi
set_build_target ${TARGET}
set_build_platform ${PLATFORM}
set_exec_mode "${MODES[*]}"
set_libc_support ${LIBC_SUPPORT}
set_app_module "${APP_LIST[*]}"
set_app_framework ${APP}
fi
# No options passed, ask for user input
if [ "$MENUCONFIG" = "TRUE" ]; then
if [[ -f $wamr_config_cmake_file ]]; then
rm $wamr_config_cmake_file
fi
echo ""
echo "-----------------------------------------------------------------"
echo "select a build target:"
echo "[1] X86_64 (default)"
echo "[2] X86_32"
read -a select_target
if [ "${select_target}" = "2" ]; then
TARGET="X86_32"
else
TARGET="X86_64"
fi
echo ""
echo "-----------------------------------------------------------------"
echo "select a build platform:"
echo "[1] linux (default)"
echo "More platforms to be add here ..."
read -a select_platform
if [ "${select_platform}" = "1" ]; then
PLATFORM="linux"
# TODO: add more platforms
else
PLATFORM="linux"
fi
echo ""
echo "-----------------------------------------------------------------"
echo "select one or more execution mode of the WAMR runtime"
enable_interp="y"
enable_jit="n"
enable_aot="n"
read -p "enable interpreter mode [y]/n: " -a enable_interp
read -p "enable jit mode y/[n]: " -a enable_jit
read -p "enable aot mode y/[n]: " -a enable_aot
# by default the interpreter mode is selected
if [[ ${enable_interp} != "n" ]] && [[ ${enable_interp} != "N" ]]; then
enable_interp="y"
fi
if [[ ${enable_interp} != "y" ]] && [[ ${enable_aot} != "y" ]];
then
echo "WASM Interpreter and AOT must be enabled at least one"
exit 1
fi
if [[ ${enable_interp} = "y" ]]; then
MODES[${#MODES[@]}]=interp
fi
if [[ ${enable_jit} = "y" ]] || [[ ${enable_jit} = "Y" ]]; then
MODES[${#MODES[@]}]=jit
fi
if [[ ${enable_aot} = "y" ]] || [[ ${enable_aot} = "Y" ]]; then
MODES[${#MODES[@]}]=aot
fi
echo ""
echo "-----------------------------------------------------------------"
echo "select a libc support:"
echo "[1] builtin libc (default)"
echo "[2] WebAssembly System Interface (WASI)"
read -a libc_select
if [ "$libc_select" = "1" ]; then
LIBC_SUPPORT="BUILTIN"
elif [ "$libc_select" = "2" ]; then
LIBC_SUPPORT="WASI"
fi
echo ""
echo "-----------------------------------------------------------------"
echo "enable app framework? [y]/n"
read -a enable_app
if [[ "$enable_app" != "n" ]] && [[ "$enable_app" != "N" ]]; then
APP="TRUE"
fi
if [[ "$APP" = "TRUE" ]]; then
echo ""
echo "-----------------------------------------------------------------"
echo "please input the name of the module you need, seperate by ',' "
echo "type \"all\" if you want to enable all of them"
echo "---------------"
for folder in `ls ${wamr_root_dir}/core/app-framework -F | grep "/$" | grep -v "base" | grep -v "app-native-shared" | grep -v "template"`
do
folder=${folder%*/}
echo "${folder}"
done
echo "---------------"
read -a app_select
app_select=${app_select},base
app_select=${app_select#,}
OLD_IFS="$IFS"
IFS=","
APP_LIST=($app_select)
IFS="$OLD_IFS"
fi
set_build_target ${TARGET}
set_build_platform ${PLATFORM}
set_exec_mode "${MODES[*]}"
set_libc_support ${LIBC_SUPPORT}
set_app_module "${APP_LIST[*]}"
set_app_framework ${APP}
fi
if [ "${BUILD_LLVM}" = "TRUE" ]; then
if [ ! -d "${wamr_root_dir}/core/deps/llvm" ]; then
echo -e "\n"
echo "###### build llvm (this will take a long time) #######"
echo ""
cd ${wamr_root_dir}/wamr-compiler
./build_llvm.sh
fi
fi
echo -e "\n\n"
echo "############## Start to build wasm app sdk ###############"
cd ${sdk_root}/app
rm -fr build && mkdir build
cd build
if [ "${LIBC_SUPPORT}" = "WASI" ]; then
echo "using wasi toolchain"
cmake .. $CMAKE_DEXTRA_SDK_INCLUDE_PATH -DWAMR_BUILD_SDK_PROFILE=${PROFILE} -DCONFIG_PATH=${wamr_config_cmake_file} -DCMAKE_TOOLCHAIN_FILE=../wasi_toolchain.cmake
else
echo "using builtin libc toolchain"
cmake .. $CMAKE_DEXTRA_SDK_INCLUDE_PATH -DWAMR_BUILD_SDK_PROFILE=${PROFILE} -DCONFIG_PATH=${wamr_config_cmake_file} -DCMAKE_TOOLCHAIN_FILE=../wamr_toolchain.cmake
fi
[ $? -eq 0 ] || exit $?
make
if (( $? == 0 )); then
echo -e "\033[32mSuccessfully built app-sdk under ${curr_profile_dir}/app-sdk\033[0m"
else
echo -e "\033[31mFailed to build app-sdk for wasm application\033[0m"
exit 1
fi
cd ..
rm -fr build
echo -e "\n\n"
echo "############## Start to build runtime sdk ###############"
cd ${sdk_root}/runtime
rm -fr build_runtime_sdk && mkdir build_runtime_sdk
cd build_runtime_sdk
cmake .. $CMAKE_DEXTRA_SDK_INCLUDE_PATH -DWAMR_BUILD_SDK_PROFILE=${PROFILE} -DCONFIG_PATH=${wamr_config_cmake_file}
[ $? -eq 0 ] || exit $?
make
if (( $? == 0 )); then
echo -e "\033[32mSuccessfully built runtime library under ${curr_profile_dir}/runtime-sdk/lib\033[0m"
else
echo -e "\033[31mFailed to build runtime sdk\033[0m"
exit 1
fi
cd ..
rm -fr build_runtime_sdk
if [ "$APP" = "TRUE" ]; then
# Generate defined-symbol list for app-sdk
cd ${wamr_app_out_dir}/share
cat ${curr_profile_dir}/runtime-sdk/include/*.inl | egrep "^ *EXPORT_WASM_API *[(] *[a-zA-Z_][a-zA-Z0-9_]* *?[)]" | cut -d '(' -f2 | cut -d ')' -f1 > defined-symbols.txt
echo "wasm_register_resource" >> defined-symbols.txt
echo "wasm_response_send" >> defined-symbols.txt
echo "wasm_post_request" >> defined-symbols.txt
echo "wasm_sub_event" >> defined-symbols.txt
echo "wasm_create_timer" >> defined-symbols.txt
echo "wasm_timer_destroy" >> defined-symbols.txt
echo "wasm_timer_cancel" >> defined-symbols.txt
echo "wasm_timer_restart" >> defined-symbols.txt
echo "wasm_get_sys_tick_ms" >> defined-symbols.txt
fi

123
wamr-sdk/menuconfig.sh Executable file
View File

@ -0,0 +1,123 @@
#!/bin/bash
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
sdk_root=$(cd "$(dirname "$0")/" && pwd)
wamr_root=${sdk_root}/..
if [ ! `command -v menuconfig` ]; then
echo "Can't find kconfiglib python lib on this computer"
echo "Downloading it through pip"
echo "If this fails, you can try `pip install kconfiglib` to install it manually"
echo "Or download the repo from https://github.com/ulfalizer/Kconfiglib"
pip install kconfiglib
fi
if [ -f ".wamr_modules" ]; then
rm -f .wamr_modules
fi
# get all modules under core/app-framework
for module in `ls ${wamr_root}/core/app-framework -F | grep "/$" | grep -v "base" | grep -v "app-native-shared" | grep -v "template"`
do
module=${module%*/}
echo "config APP_BUILD_${module^^}" >> .wamr_modules
echo " bool \"enable ${module}\"" >> .wamr_modules
done
menuconfig Kconfig
if [ ! -e ".config" ]; then
exit 0
fi
args=""
function args_add_bool()
{
args="${args} -$1"
}
function args_add_one()
{
args="${args} -$1 $2"
}
function args_add_array()
{
args="${args} -$1 ${2#,}"
}
profile=`cat .config | grep "^CONFIG_WAMR_SDK_PROFILE"`
profile=${profile#CONFIG_WAMR_SDK_PROFILE=\"}
profile=${profile%*\"}
args_add_one n ${profile}
platform=`cat .config | grep "^CONFIG_PLATFORM"`
platform=${platform%*=y}
platform=${platform,,}
platform=${platform#config_platform_}
if [ -n "${platform}" ]; then
args_add_one p ${platform#config_platform_}
fi
target=`cat .config | grep "^CONFIG_TARGET"`
target=${target%*=y}
target=${target#CONFIG_TARGET_}
if [ -n "${target}" ]; then
args_add_one t ${target#CONFIG_TARGET_}
fi
modes=`cat .config | grep "^CONFIG_EXEC"`
arg_mode=""
for mode in ${modes}
do
mode=${mode%*=y}
mode=${mode#CONFIG_EXEC_}
arg_mode="${arg_mode},${mode,,}"
done
if [ -z "${arg_mode}" ]; then
echo "execution mode are not selected"
exit 1
fi
args_add_array m "${arg_mode}"
libc=`cat .config | grep "^CONFIG_LIBC"`
libc=${libc%*=y}
if [ "${libc}" = "CONFIG_LIBC_WASI" ]; then
args_add_bool w
fi
app_en=`cat .config | grep "^CONFIG_APP_FRAMEWORK"`
app_en=${app_en%*=y}
app_en=${app_en,,}
if [ -n "${app_en}" ]; then
args_add_bool a
fi
apps=`cat .config | grep "^CONFIG_APP_BUILD"`
arg_app=""
for app in ${apps}
do
app=${app%*=y}
app=${app#CONFIG_APP_BUILD_}
arg_app="${arg_app},${app,,}"
done
if [ -n "${app_en}" ]; then
arg_app="${arg_app},base"
args_add_array l "${arg_app}"
fi
extra_path=`cat .config | grep "^CONFIG_EXTRA_INCLUDE_PATH"`
if [ -n "${extra_path}" ]; then
extra_path=${extra_path#CONFIG_EXTRA_INCLUDE_PATH=\"}
extra_path=${extra_path%*\"}
args_add_one e ${extra_path}
fi
args="-g ${args}"
./build_sdk.sh ${args}

View File

@ -0,0 +1,54 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
cmake_minimum_required(VERSION 2.8)
project(runtime-sdk)
SET (CMAKE_C_FLAGS "-O3")
set (CMAKE_BUILD_TYPE Release)
if (NOT DEFINED WAMR_BUILD_SDK_PROFILE)
set (WAMR_BUILD_SDK_PROFILE "default")
endif ()
if (NOT DEFINED CONFIG_PATH)
set (CONFIG_PATH ${CMAKE_CURRENT_LIST_DIR}/../wamr_config_default.cmake)
endif ()
if (NOT EXISTS "${CONFIG_PATH}")
message (FATAL_ERROR "${CONFIG_PATH} not exist")
endif ()
include(${CONFIG_PATH})
set (OUT_DIR "${CMAKE_CURRENT_LIST_DIR}/../out/${WAMR_BUILD_SDK_PROFILE}")
set (RUNTIME_SDK_DIR "${OUT_DIR}/runtime-sdk")
include(${CMAKE_CURRENT_LIST_DIR}/../../build-scripts/runtime_lib.cmake)
# build vmlib
add_library(vmlib ${WAMR_RUNTIME_LIB_SOURCE})
# copy vmlib.a to ${SDK_ROOT}/out/runtime-sdk/lib
add_custom_command(
TARGET vmlib POST_BUILD
COMMAND ${CMAKE_COMMAND} -E make_directory ${RUNTIME_SDK_DIR}/lib
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/*.a ${RUNTIME_SDK_DIR}/lib
)
# copy headers to ${SDK_ROOT}/out/runtime-sdk/include
FOREACH (header IN LISTS RUNTIME_LIB_HEADER_LIST)
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${RUNTIME_SDK_DIR}/include)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${header}" ${RUNTIME_SDK_DIR}/include)
ENDFOREACH (header)
if (DEFINED EXTRA_SDK_INCLUDE_PATH)
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${EXTRA_SDK_INCLUDE_PATH} ${RUNTIME_SDK_DIR}/include)
endif ()
# config.h is not needed when building a runtime product with pre-built library
# erase the file to avoid compile error
file (WRITE ${RUNTIME_SDK_DIR}/include/config.h "")

View File

@ -0,0 +1,9 @@
set (WAMR_BUILD_PLATFORM "linux")
set (WAMR_BUILD_TARGET X86_64)
set (WAMR_BUILD_INTERP 1)
set (WAMR_BUILD_AOT 1)
set (WAMR_BUILD_JIT 0)
set (WAMR_BUILD_LIBC_BUILTIN 1)
set (WAMR_BUILD_LIBC_WASI 0)
set (WAMR_BUILD_APP_FRAMEWORK 1)
set (WAMR_BUILD_APP_LIST WAMR_APP_BUILD_BASE)