Enable tizen cross/obs build (#482)
author이춘석/동작제어Lab(SR)/Senior Engineer/삼성전자 <chunseok.lee@samsung.com>
Tue, 10 Apr 2018 03:28:12 +0000 (12:28 +0900)
committer서상민/동작제어Lab(SR)/Senior Engineer/삼성전자 <sangmin7.seo@samsung.com>
Tue, 10 Apr 2018 03:28:12 +0000 (12:28 +0900)
1. setup tizen cross/obs build
2. add tizen cross build script

Build assumes that libarmcl-devel, gtest-devel and tensorflow-lite are installed
on tizen's rootfs. Since libarmcl and tensorflow-lite is not present
on public tizen repo, please use private local repo like
`http://10.113.61.134/repo/` for obs build. For cross build, rootfs is
uploaded on `http://npuarchive.mooo.com/archive/nnfw/rootfs/rootfs_arm_tizen.tar.gz`.

12 files changed:
CMakeLists.txt
Makefile
ci/docker_build_tizen_cross.sh [new file with mode: 0755]
cmake/config/config_armv7l-tizen.cmake [new file with mode: 0644]
labs/kerneltesting/CMakeLists.txt
packaging/nnfw.spec
src/kernel/acl/CMakeLists.txt
src/runtime/ref/nn/runtime/test/CMakeLists.txt
src/support/tflite/CMakeLists.txt
tools/tflite_benchmark/CMakeLists.txt
tools/tflite_examples/CMakeLists.txt
tools/tflite_run/CMakeLists.txt

index b4dfe61..06db13d 100644 (file)
@@ -79,16 +79,25 @@ option(BUILD_LABS "Build lab projects" ON)
 # Common variables
 #
 set(NNFW_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include)
-# TODO fix this for tizen to use installed version
-set(NNFW_ACL_FOLDER ${CMAKE_SOURCE_DIR}/externals/acl)
-set(NNFW_ACL_INCLUDES ${NNFW_ACL_FOLDER}
-                      ${NNFW_ACL_FOLDER}/include)
+
+if(NOT "${TARGET_OS}" STREQUAL "tizen")
+  set(NNFW_ACL_FOLDER ${CMAKE_SOURCE_DIR}/externals/acl)
+  set(NNFW_ACL_INCLUDES ${NNFW_ACL_FOLDER}
+    ${NNFW_ACL_FOLDER}/include)
+else()
+  set(NNFW_ACL_FOLDER "")
+  set(NNFW_ACL_INCLUDES "")
+endif()
 set(NNFW_ACL_LIBS arm_compute_graph arm_compute arm_compute_core)
 
 #
 # GTest support
 #
-if(NOT "${TARGET_OS}" STREQUAL "tizen")
+if("${TARGET_OS}" STREQUAL "tizen")
+  enable_testing()
+  find_package(GTest REQUIRED)
+  include_directories(${GTEST_INCLUDE_DIR})
+else("${TARGET_OS}" STREQUAL "tizen")
   include(ExternalProject)
   # Download and install GoogleTest
   ExternalProject_Add(
@@ -101,27 +110,21 @@ if(NOT "${TARGET_OS}" STREQUAL "tizen")
     LOG_BUILD 1
     LOG_CONFIGURE 1
     CMAKE_ARGS
-    -DCMAKE_TOOLCHAIN_FILE=${PROJECT_SOURCE_DIR}/cmake/config/config_${TARGET_ARCH}-linux.cmake
+    -DCMAKE_TOOLCHAIN_FILE=${PROJECT_SOURCE_DIR}/cmake/config/config_${TARGET_ARCH}-${TARGET_OS}.cmake
     )
   ExternalProject_Get_Property(googletest source_dir binary_dir)
 
   # include and link path for all sub project
   include_directories(${source_dir}/googletest/include/)
   link_directories(${binary_dir}/googlemock/gtest/)
-endif(NOT "${TARGET_OS}" STREQUAL "tizen")
-
-# tizen obs build support gtest, but tizen-cross not yet prepared
-# TODO : gtest for tizen-cross build
-if("${TARGET_OS}" STREQUAL "tizen" AND BUILD_IS_NATIVE)
-  enable_testing()
-  find_package(GTest REQUIRED)
-  include_directories(${GTEST_INCLUDE_DIR})
-endif()
+endif("${TARGET_OS}" STREQUAL "tizen")
 
 # gtest libs
 set(NNFW_GTEST_LIBS libgtest.a libgtest_main.a pthread)
 
-add_subdirectory(externals)
+if (NOT ${TARGET_OS} STREQUAL "tizen")
+  add_subdirectory(externals)
+endif()
 add_subdirectory(tools)
 add_subdirectory(src)
 
index 7db82a7..889da0c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -19,7 +19,7 @@ endif
 # Todo: we may set CROSS_BUILD=1 when ROOTFS_DIR is given
 # the toolchain file, only for cross build
 ifeq ($(CROSS_BUILD),1)
-       TOOLCHAIN_FILE=cmake/config/config_$(TARGET_ARCH_LC)-linux.cmake
+       TOOLCHAIN_FILE=cmake/config/config_$(TARGET_ARCH_LC)-$(HOST_OS).cmake
        OPTION_TOOLCHAIN=-DCMAKE_TOOLCHAIN_FILE=$(TOOLCHAIN_FILE)
 else
        OPTION_TOOLCHAIN=
@@ -64,7 +64,7 @@ else
 endif
 
 ifeq ($(USE_NNAPI), 1)
-       OPTION_USE_NNAPI=USE_NNAPI=1 
+       OPTION_USE_NNAPI=USE_NNAPI=1
 else
        OPTION_USE_NNAPI=
 endif
@@ -91,7 +91,9 @@ check: check_internal
 ### Command (internal)
 ###
 configure_internal:
+ifneq ($(HOST_OS),tizen)
        git submodule update --init --recursive
+endif
        mkdir -p $(BUILD_ROOT)
        cmake -B$(CURDIR)/$(BUILD_ROOT) -H$(CURDIR) \
                -DCMAKE_INSTALL_PREFIX=$(INSTALL_PATH) \
diff --git a/ci/docker_build_tizen_cross.sh b/ci/docker_build_tizen_cross.sh
new file mode 100755 (executable)
index 0000000..5cd296d
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+# default DOCKER_IMAGE_NAME=nnfw_docker
+DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME:-nnfw_docker}
+echo "Using docker image $DOCKER_IMAGE_NAME"
+
+SCRIPT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+HOST_HOME=$SCRIPT_ROOT/../
+DOCKER_HOME=/home
+
+GIT_SSL_NO_VERIFY=1
+
+DOCKER_VOLUMES+=" -v $HOST_HOME:$DOCKER_HOME"
+
+DOCKER_ENV_VARS+=" -e http_proxy"
+DOCKER_ENV_VARS+=" -e no_proxy"
+DOCKER_ENV_VARS+=" -e GIT_SSL_NO_VERIFY"
+
+DOCKER_ENV_VARS+=" -e TARGET_ARCH=armv7l"
+DOCKER_ENV_VARS+=" -e CROSS_BUILD=1"
+DOCKER_ENV_VARS+=" -e ROOTFS_DIR=/opt/rootfs/armel"
+DOCKER_ENV_VARS+=" -e HOST_OS=tizen"
+
+DOCKER_RUN_OPTS="--rm"
+DOCKER_RUN_OPTS+=" -w $DOCKER_HOME"
+
+
+TMP_DIR=$HOST_HOME/tmp/
+mkdir -p $TMP_DIR/armel
+
+# prepare rootfs
+wget http://npuarchive.mooo.com/archive/nnfw/rootfs/rootfs_arm_tizen.tar.gz -O $TMP_DIR/rootfs.tar.gz
+chmod 755 $TMP_DIR/rootfs.tar.gz
+
+
+DOCKER_VOLUMES+=" -v $TMP_DIR/:/opt/rootfs"
+
+CMD="tar -zxf /opt/rootfs/rootfs.tar.gz -C /opt/rootfs/armel && make && make install && make build_test_suite"
+
+docker run $DOCKER_RUN_OPTS $DOCKER_ENV_VARS $DOCKER_VOLUMES $DOCKER_IMAGE_NAME sh -c "$CMD"
+BUILD_RESULT=$?
+
+# change owner of root dir and delete rootfs dir
+NNFW_OWNER_UID=$(stat -c "%u" $HOST_HOME)
+NNFW_OWNER_GID=$(stat -c "%g" $HOST_HOME)
+
+CMD="chown -R $NNFW_OWNER_UID:$NNFW_OWNER_GID $DOCKER_HOME &&  chown -R $NNFW_OWNER_UID:$NNFW_OWNER_GID /opt/rootfs && rm -rf /opt/rootfs/armel"
+docker run $DOCKER_RUN_OPTS $DOCKER_ENV_VARS $DOCKER_VOLUMES $DOCKER_IMAGE_NAME sh -c "$CMD"
+
+rm -rf $TMP_DIR
+exit $BUILD_RESULT
diff --git a/cmake/config/config_armv7l-tizen.cmake b/cmake/config/config_armv7l-tizen.cmake
new file mode 100644 (file)
index 0000000..3d49492
--- /dev/null
@@ -0,0 +1,61 @@
+#
+# config for arm-linux
+#
+include(CMakeForceCompiler)
+
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_PROCESSOR armv7l)
+
+set(CMAKE_C_COMPILER   arm-linux-gnueabi-gcc-5)
+set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++-5)
+
+set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/6.2.1")
+
+# where is the target environment
+set(ROOTFS_ARM $ENV{ROOTFS_ARM})
+if(NOT EXISTS "${ROOTFS_ARM}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
+  set(ROOTFS_ARM "${CMAKE_SOURCE_DIR}/tools/cross/rootfs/armel")
+endif()
+
+set(CMAKE_SYSROOT ${ROOTFS_ARM})
+set(CMAKE_FIND_ROOT_PATH ${ROOTFS_ARM})
+set(CMAKE_SHARED_LINKER_FLAGS
+    "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${ROOTFS_ARM}"
+    CACHE INTERNAL "" FORCE)
+set(CMAKE_EXE_LINKER_FLAGS
+    "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${ROOTFS_ARM}"
+    CACHE INTERNAL "" FORCE)
+
+# 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)
+set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
+
+
+
+add_compile_options(-mthumb)
+add_compile_options(-mfpu=neon-vfpv4)
+add_compile_options(-mfloat-abi=softfp)
+add_compile_options(--sysroot=${ROOTFS_ARM})
+
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${ROOTFS_ARM}")
+
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${ROOTFS_ARM}")
+
+include_directories(SYSTEM ${ROOTFS_ARM}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/)
+include_directories(SYSTEM ${ROOTFS_ARM}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7l-tizen-linux-gnueabi)
+add_compile_options(-Wno-deprecated-declarations) # compile-time option
+add_compile_options(-D__extern_always_inline=inline) # compile-time option
+
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -B${ROOTFS_ARM}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${ROOTFS_ARM}/lib")
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${ROOTFS_ARM}/usr/lib")
+set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L${ROOTFS_ARM}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
+
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -B${ROOTFS_ARM}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ROOTFS_ARM}/lib")
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ROOTFS_ARM}/usr/lib")
+set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${ROOTFS_ARM}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
index 4a9c762..436aa91 100644 (file)
@@ -8,8 +8,11 @@ function(add_kerneltesting TESTNAME SRC_FILES)
                                ${NNAPI_INCLUDE_DIR}
                                ${NNFW_INCLUDE_DIR}
                                ${NNFW_ACL_INCLUDES})
-    target_link_libraries(${TESTNAME} nnfw_util ${NNFW_ACL_LIBS})
-
+    if (${TARGET_OS} STREQUAL "tizen")
+      target_link_libraries(${TESTNAME} nnfw_util OpenCL ${NNFW_ACL_LIBS})
+    else()
+      target_link_libraries(${TESTNAME} nnfw_util ${NNFW_ACL_LIBS})
+    endif()
     install(TARGETS ${TESTNAME} DESTINATION bin)
 endfunction()
 
index 6b49434..6f3f92d 100644 (file)
@@ -12,6 +12,7 @@ BuildRequires:        cmake
 BuildRequires: boost-devel
 BuildRequires: libarmcl-devel
 BuildRequires: gtest-devel
+BuildRequires: tensorflow-lite
 
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
index 74a93f2..21fda7f 100644 (file)
@@ -51,7 +51,9 @@ target_include_directories(${LIB_KERNELACL_TEST} PUBLIC
                            ${RUNTIME_INCLUDES}
                            ${NNFW_ACL_INCLUDES}
                            )
-add_dependencies(${LIB_KERNELACL_TEST} googletest)
+if (NOT ${TARGET_OS} STREQUAL "tizen")
+  add_dependencies(${LIB_KERNELACL_TEST} googletest)
+endif()
 target_link_libraries(${LIB_KERNELACL_TEST}
                       ${LIB_KERNELACL}
                       nnfw_util ${NNFW_ACL_LIBS}
index 4c359d2..d94e377 100644 (file)
@@ -3,7 +3,9 @@ set(RUNTIME_ANDROID_NN_TEST runtime_run_android_nn_test)
 add_executable(${RUNTIME_ANDROID_NN_TEST} TestMain.cpp
                                           TestValidation.cpp
                                           TestTrivialModel.cpp)
-add_dependencies(${RUNTIME_ANDROID_NN_TEST} googletest)
+if (NOT ${TARGET_OS} STREQUAL "tizen")
+  add_dependencies(${RUNTIME_ANDROID_NN_TEST} googletest)
+endif()
 target_link_libraries(${RUNTIME_ANDROID_NN_TEST} ${LIB_RUNTIME})
 target_link_libraries(${RUNTIME_ANDROID_NN_TEST} gtest)
 target_link_libraries(${RUNTIME_ANDROID_NN_TEST} pthread)
index 5844c74..15a6d8a 100644 (file)
@@ -4,7 +4,7 @@ list(REMOVE_ITEM SOURCES ${TESTS})
 
 add_library(nnfw_support_tflite ${SOURCES})
 target_include_directories(nnfw_support_tflite PUBLIC ${CMAKE_SOURCE_DIR}/include)
-target_link_libraries(nnfw_support_tflite nnfw_util tensorflow-lite)
+target_link_libraries(nnfw_support_tflite nnfw_util tensorflow-lite pthread dl)
 
 add_executable(nnfw_support_tflite_test_TensorView src/TensorView.test.cpp)
 target_link_libraries(nnfw_support_tflite_test_TensorView nnfw_support_tflite)
index 8b1d79d..bc42a85 100644 (file)
@@ -1,4 +1,4 @@
 list(APPEND SOURCES "src/tflite_benchmark.cc")
 
 add_executable(tflite_benchmark ${SOURCES})
-target_link_libraries(tflite_benchmark tensorflow-lite nnfw_util)
+target_link_libraries(tflite_benchmark tensorflow-lite pthread dl nnfw_util)
index 3452b54..6436e5a 100644 (file)
@@ -1,2 +1,2 @@
 add_executable(tflite_conv_example "src/conv.cpp")
-target_link_libraries(tflite_conv_example tensorflow-lite)
+target_link_libraries(tflite_conv_example tensorflow-lite pthread dl)
index ca739d3..130ee17 100644 (file)
@@ -5,7 +5,7 @@ list(APPEND TFLITE_RUN_SRCS "src/args.cc")
 
 add_executable(tflite_run ${TFLITE_RUN_SRCS})
 target_include_directories(tflite_run PRIVATE src)
-target_link_libraries(tflite_run tensorflow-lite)
+target_link_libraries(tflite_run tensorflow-lite pthread dl)
 target_link_libraries(tflite_run boost_program_options boost_system boost_filesystem)
 
 install(TARGETS tflite_run DESTINATION bin)
@@ -15,7 +15,10 @@ install(TARGETS tflite_run DESTINATION bin)
 ## Add test cpp file
 add_executable(tflite_test
   src/tflite_test.cc)
-add_dependencies(tflite_test googletest)
+if (NOT ${TARGET_OS} STREQUAL "tizen")
+  add_dependencies(tflite_test googletest)
+endif()
+
 ## Link test executable against gtest & gtest_main
 target_link_libraries(tflite_test libgtest.a libgtest_main.a pthread)