From 3695f29d3494cb0906f2f4c6d9c714c11167d47f Mon Sep 17 00:00:00 2001 From: Wang Xin Date: Sat, 22 Feb 2020 15:06:53 +0800 Subject: [PATCH] support cross compliation for SDK and the simple sample (#172) --- samples/simple/CMakeLists.txt | 7 +- samples/simple/README.md | 35 ++++++++- samples/simple/build.sh | 73 +++++++++++++++---- .../profiles/arm-interp/toolchain.cmake | 38 ++++++++++ .../arm-interp/wamr_config_simple.cmake | 9 +++ .../host-aot}/wamr_config_simple.cmake | 0 .../host-interp/wamr_config_simple.cmake | 9 +++ wamr-sdk/build_sdk.sh | 37 +++++++--- wamr-sdk/menuconfig.sh | 4 + 9 files changed, 183 insertions(+), 29 deletions(-) create mode 100644 samples/simple/profiles/arm-interp/toolchain.cmake create mode 100644 samples/simple/profiles/arm-interp/wamr_config_simple.cmake rename samples/simple/{ => profiles/host-aot}/wamr_config_simple.cmake (100%) create mode 100644 samples/simple/profiles/host-interp/wamr_config_simple.cmake diff --git a/samples/simple/CMakeLists.txt b/samples/simple/CMakeLists.txt index bb322474..3d3e45f8 100644 --- a/samples/simple/CMakeLists.txt +++ b/samples/simple/CMakeLists.txt @@ -6,6 +6,7 @@ cmake_minimum_required (VERSION 2.8) project (simple) ################ wamr runtime settings ################ +message(STATUS "WAMR_BUILD_SDK_PROFILE=${WAMR_BUILD_SDK_PROFILE}") # Reset default linker 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}/../..) ## 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( - ${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 ################ @@ -27,6 +28,6 @@ include_directories(${CMAKE_CURRENT_LIST_DIR}/src) #add_definitions (-DCONNECTION_UART) 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) diff --git a/samples/simple/README.md b/samples/simple/README.md index 4e00ec5f..5625212f 100644 --- a/samples/simple/README.md +++ b/samples/simple/README.md @@ -80,8 +80,39 @@ To run the UART based test, you have to set up a UART hardware connection betwee Build the sample ============== -Execute the build.sh script then all binaries including wasm application files would be generated in 'out' directory. -`./build.sh` +Execute the build.sh script then all binaries including wasm application files would be generated in 'out' directory. + +``` +$ ./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 + +``` + + diff --git a/samples/simple/build.sh b/samples/simple/build.sh index 53f679a1..27b610f8 100755 --- a/samples/simple/build.sh +++ b/samples/simple/build.sh @@ -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" WASM_APPS=${PWD}/wasm-apps CLEAN= +CM_BUILD_TYPE="-DCMAKE_BUILD_TYPE=Release" +CM_TOOLCHAIN="" usage () { echo "build.sh [options]" - echo " -p [platform]" - echo " -t [target]" + echo " -p [profile]" + echo " -d [target]" echo " -c, rebuild SDK" exit 1 } -while getopts "p:t:ch" opt +while getopts "p:dch" opt do case $opt in p) - PLATFORM=$OPTARG + PROFILE=$OPTARG ;; - t) - TARGET=$OPTARG + d) + CM_BUILD_TYPE="-DCMAKE_BUILD_TYPE=Debug" ;; c) CLEAN="TRUE" @@ -48,6 +50,41 @@ do 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} mkdir ${OUT_DIR} mkdir ${OUT_DIR}/wasm-apps @@ -57,15 +94,21 @@ if [ ! -d "tlsf" ]; then git clone https://github.com/mattconte/tlsf fi + +PROFILE="simple-$PROFILE" + + echo "#####################build 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" cd ${CURR_DIR} -mkdir -p cmake_build -cd cmake_build -cmake .. -DWAMR_BUILD_SDK_PROFILE=simple +mkdir -p cmake_build/$PROFILE +cd cmake_build/$PROFILE +cmake ../.. -DWAMR_BUILD_SDK_PROFILE=$PROFILE $CM_TOOLCHAIN $CM_BUILD_TYPE make if [ $? != 0 ];then echo "BUILD_FAIL simple exit as $?\n" @@ -79,7 +122,7 @@ echo "#####################build host-tool" cd ${WAMR_DIR}/test-tools/host-tool mkdir -p bin cd bin -cmake .. +cmake .. $CM_TOOLCHAIN $CM_BUILD_TYPE make if [ $? != 0 ];then echo "BUILD_FAIL host tool exit as $?\n" @@ -99,12 +142,12 @@ APP_SRC="$i" OUT_FILE=${i%.*}.wasm /opt/wasi-sdk/bin/clang \ - -I${WAMR_DIR}/wamr-sdk/out/simple/app-sdk/wamr-app-framework/include \ - -L${WAMR_DIR}/wamr-sdk/out/simple/app-sdk/wamr-app-framework/lib \ + -I${WAMR_DIR}/wamr-sdk/out/$PROFILE/app-sdk/wamr-app-framework/include \ + -L${WAMR_DIR}/wamr-sdk/out/$PROFILE/app-sdk/wamr-app-framework/lib \ -lapp_framework \ --target=wasm32 -O3 -z stack-size=4096 -Wl,--initial-memory=65536 \ - --sysroot=${WAMR_DIR}/wamr-sdk/out/simple/app-sdk/libc-builtin-sysroot \ - -Wl,--allow-undefined-file=${WAMR_DIR}/wamr-sdk/out/simple/app-sdk/libc-builtin-sysroot/share/defined-symbols.txt \ + --sysroot=${WAMR_DIR}/wamr-sdk/out/$PROFILE/app-sdk/libc-builtin-sysroot \ + -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,--export=on_init -Wl,--export=on_destroy \ -Wl,--export=on_request -Wl,--export=on_response \ diff --git a/samples/simple/profiles/arm-interp/toolchain.cmake b/samples/simple/profiles/arm-interp/toolchain.cmake new file mode 100644 index 00000000..2bd47b42 --- /dev/null +++ b/samples/simple/profiles/arm-interp/toolchain.cmake @@ -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) + diff --git a/samples/simple/profiles/arm-interp/wamr_config_simple.cmake b/samples/simple/profiles/arm-interp/wamr_config_simple.cmake new file mode 100644 index 00000000..db33d5f6 --- /dev/null +++ b/samples/simple/profiles/arm-interp/wamr_config_simple.cmake @@ -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) diff --git a/samples/simple/wamr_config_simple.cmake b/samples/simple/profiles/host-aot/wamr_config_simple.cmake similarity index 100% rename from samples/simple/wamr_config_simple.cmake rename to samples/simple/profiles/host-aot/wamr_config_simple.cmake diff --git a/samples/simple/profiles/host-interp/wamr_config_simple.cmake b/samples/simple/profiles/host-interp/wamr_config_simple.cmake new file mode 100644 index 00000000..a3317f03 --- /dev/null +++ b/samples/simple/profiles/host-interp/wamr_config_simple.cmake @@ -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) diff --git a/wamr-sdk/build_sdk.sh b/wamr-sdk/build_sdk.sh index 3f064445..ff8a460e 100755 --- a/wamr-sdk/build_sdk.sh +++ b/wamr-sdk/build_sdk.sh @@ -10,7 +10,9 @@ profile_path=${out_dir}/profile.cmake wamr_config_cmake_file="" # libc support, default builtin-libc 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="" @@ -20,28 +22,36 @@ usage () echo "build.sh [options]" echo " -n [profile 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 " -c, clean" + echo " -d, debug mode" echo " -i, enter menu config settings" exit 1 } -while getopts "e:x:n:ic" opt +while getopts "e:x:n:t:icd" opt do case $opt in n) PROFILE=$OPTARG ;; + t) + CM_TOOLCHAIN="-DCMAKE_TOOLCHAIN_FILE=$OPTARG" + ;; x) wamr_config_cmake_file=$OPTARG ;; e) - CMAKE_DEXTRA_SDK_INCLUDE_PATH="-DEXTRA_SDK_INCLUDE_PATH=${OPTARG}" + CM_DEXTRA_SDK_INCLUDE_PATH="-DEXTRA_SDK_INCLUDE_PATH=${OPTARG}" ;; c) CLEAN="TRUE" ;; + d) + CM_BUILD_TYPE="-DCMAKE_BUILD_TYPE=Debug" + ;; i) 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 -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 @@ -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` 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" 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" exit 1 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 @@ -170,10 +180,16 @@ if [ -n "$out" ]; then fi 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 + cmake .. $CM_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 + cmake .. $CM_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 $? @@ -195,7 +211,10 @@ 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} +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 $? make diff --git a/wamr-sdk/menuconfig.sh b/wamr-sdk/menuconfig.sh index d8499d74..b2f6fa62 100755 --- a/wamr-sdk/menuconfig.sh +++ b/wamr-sdk/menuconfig.sh @@ -27,6 +27,10 @@ do done +if [ -z $wamr_config_cmake_file ]; then + usage + exit +fi function set_build_target () {