support cross compliation for SDK and the simple sample (#172)

This commit is contained in:
Wang Xin 2020-02-22 15:06:53 +08:00 committed by GitHub
parent 82b0bb44c3
commit 3695f29d34
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 183 additions and 29 deletions

View File

@ -6,6 +6,7 @@ cmake_minimum_required (VERSION 2.8)
project (simple) project (simple)
################ wamr runtime settings ################ ################ wamr runtime settings ################
message(STATUS "WAMR_BUILD_SDK_PROFILE=${WAMR_BUILD_SDK_PROFILE}")
# Reset default linker flags # Reset default linker flags
set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "") set (CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
@ -14,9 +15,9 @@ set (CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..)
## use library and headers in the SDK ## use library and headers in the SDK
link_directories(${WAMR_ROOT_DIR}/wamr-sdk/out/simple/runtime-sdk/lib) link_directories(${WAMR_ROOT_DIR}/wamr-sdk/out/${WAMR_BUILD_SDK_PROFILE}/runtime-sdk/lib)
include_directories( include_directories(
${WAMR_ROOT_DIR}/wamr-sdk/out/simple/runtime-sdk/include ${WAMR_ROOT_DIR}/wamr-sdk/out/${WAMR_BUILD_SDK_PROFILE}/runtime-sdk/include
) )
################ application related ################ ################ application related ################
@ -27,6 +28,6 @@ include_directories(${CMAKE_CURRENT_LIST_DIR}/src)
#add_definitions (-DCONNECTION_UART) #add_definitions (-DCONNECTION_UART)
add_executable (simple src/main.c src/iwasm_main.c src/ext_lib_export.c) add_executable (simple src/main.c src/iwasm_main.c src/ext_lib_export.c)
target_link_libraries (simple vmlib -lm -ldl -lpthread) target_link_libraries (simple vmlib -lm -ldl -lpthread -lrt)

View File

@ -80,8 +80,39 @@ To run the UART based test, you have to set up a UART hardware connection betwee
Build the sample Build the sample
============== ==============
Execute the build.sh script then all binaries including wasm application files would be generated in 'out' directory. Execute the build.sh script then all binaries including wasm application files would be generated in 'out' directory.
`./build.sh`
```
$ ./build.sh
Enter build target profile (default=host-interp) -->
arm-interp
host-aot
host-interp
\>:
```
Enter the profile name for starting your build. "host-***" profiles build the sample for executing on your development machine, and "arm-interp" profile will do cross building for ARM target platform. If "arm-interp" is entered, please ensure the ARM cross compiler toolchain is already installed in your development machine. Your should set *ARM_A7_COMPILER_DIR* and *ARM_A7_SDKTARGETSYSROOT* environment variable in your ~/.bashrc correctly. refer to the file [profiles/arm-interp/toolchain.cmake](./profiles/arm-interp/toolchain.cmake).
```
~/.bashrc:
export ARM_A7_COMPILER_DIR="/home/beihai/cross-toolchains/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/bin"
export ARM_A7_SDKTARGETSYSROOT="/home/beihai/cross-toolchains/gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux/arm-linux-gnueabihf/libc"
notes: please set the value to the actual path of your cross toolchain.
```
If you need to create additional profile for customizing your runtime, application framework or the target platforms, a new subfolder can be created under the *profiles* folder, and place your own version of "toolchain.cmake" and "wamr_config_simple.cmake" in it.
```
$wamr-root/samples/simple/profiles$ ls
arm-interp host-aot host-interp
$wamr-root/samples/simple/profiles$ ls arm-interp/
toolchain.cmake wamr_config_simple.cmake
```

View File

@ -12,25 +12,27 @@ APP_LIB_SRC="${APP_FRAMEWORK_DIR}/base/app/*.c ${APP_FRAMEWORK_DIR}/sensor/app/*
${APP_FRAMEWORK_DIR}/connection/app/*.c ${NATIVE_LIBS}/*.c" ${APP_FRAMEWORK_DIR}/connection/app/*.c ${NATIVE_LIBS}/*.c"
WASM_APPS=${PWD}/wasm-apps WASM_APPS=${PWD}/wasm-apps
CLEAN= CLEAN=
CM_BUILD_TYPE="-DCMAKE_BUILD_TYPE=Release"
CM_TOOLCHAIN=""
usage () usage ()
{ {
echo "build.sh [options]" echo "build.sh [options]"
echo " -p [platform]" echo " -p [profile]"
echo " -t [target]" echo " -d [target]"
echo " -c, rebuild SDK" echo " -c, rebuild SDK"
exit 1 exit 1
} }
while getopts "p:t:ch" opt while getopts "p:dch" opt
do do
case $opt in case $opt in
p) p)
PLATFORM=$OPTARG PROFILE=$OPTARG
;; ;;
t) d)
TARGET=$OPTARG CM_BUILD_TYPE="-DCMAKE_BUILD_TYPE=Debug"
;; ;;
c) c)
CLEAN="TRUE" CLEAN="TRUE"
@ -48,6 +50,41 @@ do
done done
if [ "$CLEAN" = "TRUE" ]; then
rm -rf $CURR_DIR/cmake_build
fi
while [ ! -n "$PROFILE" ]
do
support_profiles=`ls -l "profiles/" |grep '^d' | awk '{print $9}'`
read -p "Enter build target profile (default=host-interp) -->
$support_profiles
\>:" read_platform
if [ ! -n "$read_platform" ]; then
PROFILE="host-interp"
else
PROFILE=$read_platform
fi
done
ARG_TOOLCHAIN=""
TOOL_CHAIN_FILE=$CURR_DIR/profiles/$PROFILE/toolchain.cmake
if [ -f $TOOL_CHAIN_FILE ]; then
CM_TOOLCHAIN="-DCMAKE_TOOLCHAIN_FILE=$TOOL_CHAIN_FILE"
ARG_TOOLCHAIN="-t $TOOL_CHAIN_FILE"
echo "toolchain file: $TOOL_CHAIN_FILE"
fi
SDK_CONFIG_FILE=$CURR_DIR/profiles/$PROFILE/wamr_config_simple.cmake
if [ ! -f $SDK_CONFIG_FILE ]; then
echo "SDK config file [$SDK_CONFIG_FILE] doesn't exit. quit.."
exit 1
fi
rm -rf ${OUT_DIR} rm -rf ${OUT_DIR}
mkdir ${OUT_DIR} mkdir ${OUT_DIR}
mkdir ${OUT_DIR}/wasm-apps mkdir ${OUT_DIR}/wasm-apps
@ -57,15 +94,21 @@ if [ ! -d "tlsf" ]; then
git clone https://github.com/mattconte/tlsf git clone https://github.com/mattconte/tlsf
fi fi
PROFILE="simple-$PROFILE"
echo "#####################build wamr sdk" echo "#####################build wamr sdk"
cd ${WAMR_DIR}/wamr-sdk cd ${WAMR_DIR}/wamr-sdk
./build_sdk.sh -n simple -x ${CURR_DIR}/wamr_config_simple.cmake $* ./build_sdk.sh -n $PROFILE -x $SDK_CONFIG_FILE $ARG_TOOLCHAIN $*
[ $? -eq 0 ] || exit $?
echo "#####################build simple project" echo "#####################build simple project"
cd ${CURR_DIR} cd ${CURR_DIR}
mkdir -p cmake_build mkdir -p cmake_build/$PROFILE
cd cmake_build cd cmake_build/$PROFILE
cmake .. -DWAMR_BUILD_SDK_PROFILE=simple cmake ../.. -DWAMR_BUILD_SDK_PROFILE=$PROFILE $CM_TOOLCHAIN $CM_BUILD_TYPE
make make
if [ $? != 0 ];then if [ $? != 0 ];then
echo "BUILD_FAIL simple exit as $?\n" echo "BUILD_FAIL simple exit as $?\n"
@ -79,7 +122,7 @@ echo "#####################build host-tool"
cd ${WAMR_DIR}/test-tools/host-tool cd ${WAMR_DIR}/test-tools/host-tool
mkdir -p bin mkdir -p bin
cd bin cd bin
cmake .. cmake .. $CM_TOOLCHAIN $CM_BUILD_TYPE
make make
if [ $? != 0 ];then if [ $? != 0 ];then
echo "BUILD_FAIL host tool exit as $?\n" echo "BUILD_FAIL host tool exit as $?\n"
@ -99,12 +142,12 @@ APP_SRC="$i"
OUT_FILE=${i%.*}.wasm OUT_FILE=${i%.*}.wasm
/opt/wasi-sdk/bin/clang \ /opt/wasi-sdk/bin/clang \
-I${WAMR_DIR}/wamr-sdk/out/simple/app-sdk/wamr-app-framework/include \ -I${WAMR_DIR}/wamr-sdk/out/$PROFILE/app-sdk/wamr-app-framework/include \
-L${WAMR_DIR}/wamr-sdk/out/simple/app-sdk/wamr-app-framework/lib \ -L${WAMR_DIR}/wamr-sdk/out/$PROFILE/app-sdk/wamr-app-framework/lib \
-lapp_framework \ -lapp_framework \
--target=wasm32 -O3 -z stack-size=4096 -Wl,--initial-memory=65536 \ --target=wasm32 -O3 -z stack-size=4096 -Wl,--initial-memory=65536 \
--sysroot=${WAMR_DIR}/wamr-sdk/out/simple/app-sdk/libc-builtin-sysroot \ --sysroot=${WAMR_DIR}/wamr-sdk/out/$PROFILE/app-sdk/libc-builtin-sysroot \
-Wl,--allow-undefined-file=${WAMR_DIR}/wamr-sdk/out/simple/app-sdk/libc-builtin-sysroot/share/defined-symbols.txt \ -Wl,--allow-undefined-file=${WAMR_DIR}/wamr-sdk/out/$PROFILE/app-sdk/libc-builtin-sysroot/share/defined-symbols.txt \
-Wl,--no-threads,--strip-all,--no-entry -nostdlib \ -Wl,--no-threads,--strip-all,--no-entry -nostdlib \
-Wl,--export=on_init -Wl,--export=on_destroy \ -Wl,--export=on_init -Wl,--export=on_destroy \
-Wl,--export=on_request -Wl,--export=on_response \ -Wl,--export=on_request -Wl,--export=on_response \

View File

@ -0,0 +1,38 @@
INCLUDE(CMakeForceCompiler)
SET(CMAKE_SYSTEM_NAME Linux) # this one is important
SET(CMAKE_SYSTEM_VERSION 1) # this one not so much
message(STATUS "*** ARM A7 toolchain file ***")
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_GNU_SOURCE")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GNU_SOURCE")
if (NOT $ENV{ARM_A7_COMPILER_DIR} STREQUAL "")
SET (toolchain_sdk_dir $ENV{ARM_A7_COMPILER_DIR}/)
endif ()
if (NOT $ENV{ARM_A7_SDKTARGETSYSROOT} STREQUAL "")
SET(SDKTARGETSYSROOT $ENV{ARM_A7_SDKTARGETSYSROOT})
#SET(CMAKE_SYSROOT SDKTARGETSYSROOT)
endif ()
message(STATUS "SDKTARGETSYSROOT=${SDKTARGETSYSROOT}")
message(STATUS "toolchain_sdk_dir=${toolchain_sdk_dir}")
SET(CMAKE_C_COMPILER ${toolchain_sdk_dir}arm-linux-gnueabihf-gcc)
SET(CMAKE_CXX_COMPILER ${toolchain_sdk_dir}arm-linux-gnueabihf-g++)
# this is the file system root of the target
SET(CMAKE_FIND_ROOT_PATH ${SDKTARGETSYSROOT})
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

View File

@ -0,0 +1,9 @@
set (WAMR_BUILD_PLATFORM "linux")
set (WAMR_BUILD_TARGET ARM)
set (WAMR_BUILD_INTERP 1)
set (WAMR_BUILD_AOT 0)
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 WAMR_APP_BUILD_CONNECTION WAMR_APP_BUILD_SENSOR)

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 WAMR_APP_BUILD_CONNECTION WAMR_APP_BUILD_SENSOR)

View File

@ -10,7 +10,9 @@ profile_path=${out_dir}/profile.cmake
wamr_config_cmake_file="" wamr_config_cmake_file=""
# libc support, default builtin-libc # libc support, default builtin-libc
LIBC_SUPPORT="BUILTIN" LIBC_SUPPORT="BUILTIN"
CMAKE_DEXTRA_SDK_INCLUDE_PATH="" CM_DEXTRA_SDK_INCLUDE_PATH=""
CM_BUILD_TYPE="-DCMAKE_BUILD_TYPE=Release"
CM_TOOLCHAIN=""
# menuconfig will pass options to this script # menuconfig will pass options to this script
MENUCONFIG="" MENUCONFIG=""
@ -20,28 +22,36 @@ usage ()
echo "build.sh [options]" echo "build.sh [options]"
echo " -n [profile name]" echo " -n [profile name]"
echo " -x [config file path name]" echo " -x [config file path name]"
echo " -t [cmake toolchain file]"
echo " -e [extra include path], files under this path will be copied into SDK package" echo " -e [extra include path], files under this path will be copied into SDK package"
echo " -c, clean" echo " -c, clean"
echo " -d, debug mode"
echo " -i, enter menu config settings" echo " -i, enter menu config settings"
exit 1 exit 1
} }
while getopts "e:x:n:ic" opt while getopts "e:x:n:t:icd" opt
do do
case $opt in case $opt in
n) n)
PROFILE=$OPTARG PROFILE=$OPTARG
;; ;;
t)
CM_TOOLCHAIN="-DCMAKE_TOOLCHAIN_FILE=$OPTARG"
;;
x) x)
wamr_config_cmake_file=$OPTARG wamr_config_cmake_file=$OPTARG
;; ;;
e) e)
CMAKE_DEXTRA_SDK_INCLUDE_PATH="-DEXTRA_SDK_INCLUDE_PATH=${OPTARG}" CM_DEXTRA_SDK_INCLUDE_PATH="-DEXTRA_SDK_INCLUDE_PATH=${OPTARG}"
;; ;;
c) c)
CLEAN="TRUE" CLEAN="TRUE"
;; ;;
d)
CM_BUILD_TYPE="-DCMAKE_BUILD_TYPE=Debug"
;;
i) i)
MENUCONFIG="TRUE" MENUCONFIG="TRUE"
;; ;;
@ -84,7 +94,7 @@ wamr_app_out_dir=${curr_profile_dir}/app-sdk/wamr-app-framework
sysroot_dir=${curr_profile_dir}/app-sdk/libc-builtin-sysroot sysroot_dir=${curr_profile_dir}/app-sdk/libc-builtin-sysroot
echo "CMAKE_DEXTRA_SDK_INCLUDE_PATH=${CMAKE_DEXTRA_SDK_INCLUDE_PATH}" echo "CM_DEXTRA_SDK_INCLUDE_PATH=${CM_DEXTRA_SDK_INCLUDE_PATH}"
if [[ "$CLEAN" = "TRUE" ]]; then if [[ "$CLEAN" = "TRUE" ]]; then
@ -151,7 +161,7 @@ app_all_selected=`cat ${wamr_config_cmake_file} | grep WAMR_APP_BUILD_ALL`
app_wgl_selected=`cat ${wamr_config_cmake_file} | grep WAMR_APP_BUILD_WGL` app_wgl_selected=`cat ${wamr_config_cmake_file} | grep WAMR_APP_BUILD_WGL`
if [[ -n "${app_wgl_selected}" ]] || [[ -n "${app_all_selected}" ]]; then if [[ -n "${app_wgl_selected}" ]] || [[ -n "${app_all_selected}" ]]; then
if [ -z "${CMAKE_DEXTRA_SDK_INCLUDE_PATH}" ]; then if [ -z "${CM_DEXTRA_SDK_INCLUDE_PATH}" ]; then
echo -e "\033[31mWGL module require lvgl config files, please input the path to the lvgl SDK include path:\033[0m" echo -e "\033[31mWGL module require lvgl config files, please input the path to the lvgl SDK include path:\033[0m"
read -a extra_file_path read -a extra_file_path
@ -159,7 +169,7 @@ if [[ -n "${app_wgl_selected}" ]] || [[ -n "${app_all_selected}" ]]; then
echo -e "\033[31mThe extra SDK path is invalid, exiting\033[0m" echo -e "\033[31mThe extra SDK path is invalid, exiting\033[0m"
exit 1 exit 1
else else
CMAKE_DEXTRA_SDK_INCLUDE_PATH="-DEXTRA_SDK_INCLUDE_PATH=${extra_file_path}" CM_DEXTRA_SDK_INCLUDE_PATH="-DEXTRA_SDK_INCLUDE_PATH=${extra_file_path}"
fi fi
fi fi
fi fi
@ -170,10 +180,16 @@ if [ -n "$out" ]; then
fi fi
if [ "${LIBC_SUPPORT}" = "WASI" ]; then if [ "${LIBC_SUPPORT}" = "WASI" ]; then
echo "using wasi toolchain" 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 cmake .. $CM_DEXTRA_SDK_INCLUDE_PATH \
-DWAMR_BUILD_SDK_PROFILE=${PROFILE} \
-DCONFIG_PATH=${wamr_config_cmake_file} \
-DCMAKE_TOOLCHAIN_FILE=../wasi_toolchain.cmake
else else
echo "using builtin libc toolchain" 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 cmake .. $CM_DEXTRA_SDK_INCLUDE_PATH \
-DWAMR_BUILD_SDK_PROFILE=${PROFILE} \
-DCONFIG_PATH=${wamr_config_cmake_file} \
-DCMAKE_TOOLCHAIN_FILE=../wamr_toolchain.cmake
fi fi
[ $? -eq 0 ] || exit $? [ $? -eq 0 ] || exit $?
@ -195,7 +211,10 @@ echo "############## Start to build runtime sdk ###############"
cd ${sdk_root}/runtime cd ${sdk_root}/runtime
rm -fr build_runtime_sdk && mkdir build_runtime_sdk rm -fr build_runtime_sdk && mkdir build_runtime_sdk
cd build_runtime_sdk cd build_runtime_sdk
cmake .. $CMAKE_DEXTRA_SDK_INCLUDE_PATH -DWAMR_BUILD_SDK_PROFILE=${PROFILE} -DCONFIG_PATH=${wamr_config_cmake_file} cmake .. $CM_DEXTRA_SDK_INCLUDE_PATH \
-DWAMR_BUILD_SDK_PROFILE=${PROFILE} \
-DCONFIG_PATH=${wamr_config_cmake_file} \
$CM_TOOLCHAIN $CM_BUILD_TYPE
[ $? -eq 0 ] || exit $? [ $? -eq 0 ] || exit $?
make make

View File

@ -27,6 +27,10 @@ do
done done
if [ -z $wamr_config_cmake_file ]; then
usage
exit
fi
function set_build_target () { function set_build_target () {