Use x86 crossbuild for cross-architecture component on x64-linux (#8722)
authorHyeongseok Oh <hseok82.oh@samsung.com>
Thu, 5 Jan 2017 12:32:44 +0000 (21:32 +0900)
committerJan Vorlicek <janvorli@microsoft.com>
Thu, 5 Jan 2017 12:32:44 +0000 (13:32 +0100)
* Use x86 crossbuild for cross-architecture component on x64-linux

Fix build.sh and build system generator to use x86 cross-build system on x64-linux
- x86-host/ARM32-target cross-architecture component build on x64 linux
- use x86 root file system and cross buildtool

* Modify build.sh

- define new function: build_cross_arch_component
- fix typo

* Additional fix: build.sh

add usage description
- environment variable: CAC_ROOTFS_DIR
- argument: crosscomponent

build.sh
src/pal/tools/gen-buildsys-clang.sh

index d7dd732..c4d13b1 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -35,6 +35,8 @@ usage()
     echo "clangx.y - optional argument to build using clang version x.y."
     echo "cross - optional argument to signify cross compilation,"
     echo "      - will use ROOTFS_DIR environment variable if set."
+    echo "crosscomponent - optional argument to build cross-architecture component,"
+    echo "               - will use CAC_ROOTFS_DIR environment variable if set."
     echo "pgoinstrument - generate instrumented code for profile guided optimization enabled binaries."
     echo "configureonly - do not perform any builds; just configure the build."
     echo "skipconfigure - skip build configuration."
@@ -266,6 +268,46 @@ build_native()
     popd
 }
 
+build_cross_arch_component()
+{
+    __SkipCrossArchBuild=1
+    TARGET_ROOTFS=""
+    # check supported cross-architecture components host(__HostArch)/target(__BuildArch) pair
+    if [[ "$__BuildArch" == "arm" && "$__CrossArch" == "x86" ]]; then
+        export CROSSCOMPILE=0
+        __SkipCrossArchBuild=0
+
+        # building x64-host/arm-target cross-architecture component need to use cross toolchain of x86
+        if [ "$__HostArch" == "x64" ]; then
+            export CROSSCOMPILE=1
+        fi
+    else
+        # not supported
+        return
+    fi    
+    
+    export __CMakeBinDir="$__CrossComponentBinDir"
+    export CROSSCOMPONENT=1
+    if [ $CROSSCOMPILE == 1 ]; then
+        TARGET_ROOTFS="$ROOTFS_DIR"
+        if [ -n "$CAC_ROOTFS_DIR" ]; then
+            export ROOTFS_DIR="$CAC_ROOTFS_DIR"
+        else
+            export ROOTFS_DIR="$__ProjectRoot/cross/rootfs/$__CrossArch"
+        fi
+    fi
+
+    __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__BuildArch -DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument"
+    build_native $__SkipCrossArchBuild "$__CrossArch" "$__CrossCompIntermediatesDir" "$__ExtraCmakeArgs" "cross-architecture component"
+   
+    # restore ROOTFS_DIR, CROSSCOMPONENT, and CROSSCOMPILE 
+    if [ -n "$TARGET_ROOTFS" ]; then
+        export ROOTFS_DIR="$TARGET_ROOTFS"
+    fi
+    export CROSSCOMPONENT=
+    export CROSSCOMPILE=1
+}
+
 isMSBuildOnNETCoreSupported()
 {
     # This needs to be updated alongwith corresponding changes to netci.groovy.
@@ -791,19 +833,8 @@ __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__P
 build_native $__SkipCoreCLR "$__BuildArch" "$__IntermediatesDir" "$__ExtraCmakeArgs" "CoreCLR component"
 
 # Build cross-architecture components
-if [ $__CrossBuild == 1 ]; then
-    __SkipCrossArchBuild=1
-    if [ $__DoCrossArchBuild == 1 ]; then
-        # build cross-architecture components for x86-host/arm-target
-        if [[ "$__BuildArch" == "arm" && "$__CrossArch" == "x86" ]]; then
-            __SkipCrossArchBuild=0
-        fi
-    fi
-
-    export __CMakeBinDir="$__CrossComponentBinDir"
-    export CROSSCOMPONENT=1
-    __ExtraCmakeArgs="-DCLR_CMAKE_TARGET_ARCH=$__BuildArch -DCLR_CMAKE_TARGET_OS=$__BuildOS -DCLR_CMAKE_PACKAGES_DIR=$__PackagesDir -DCLR_CMAKE_PGO_INSTRUMENT=$__PgoInstrument"
-    build_native $__SkipCrossArchBuild "$__CrossArch" "$__CrossCompIntermediatesDir" "$__ExtraCmakeArgs" "cross-architecture component"
+if [[ $__CrossBuild == 1 && $__DoCrossArchBuild == 1 ]]; then
+    build_cross_arch_component
 fi
 
 # Build System.Private.CoreLib.
index a25e5a0..3386c5d 100755 (executable)
@@ -128,18 +128,17 @@ if [[ -n "$LLDB_INCLUDE_DIR" ]]; then
 fi
 if [[ -n "$CROSSCOMPONENT" ]]; then
     cmake_extra_defines="$cmake_extra_defines -DCLR_CROSS_COMPONENTS_BUILD=1"
-else
-    if [[ -n "$CROSSCOMPILE" ]]; then
-        if ! [[ -n "$ROOTFS_DIR" ]]; then
-            echo "ROOTFS_DIR not set for crosscompile"
-            exit 1
-        fi
-        if [[ -z $CONFIG_DIR ]]; then
-          CONFIG_DIR="$1/cross/$build_arch"
-        fi
-        cmake_extra_defines="$cmake_extra_defines -C $CONFIG_DIR/tryrun.cmake"
-        cmake_extra_defines="$cmake_extra_defines -DCMAKE_TOOLCHAIN_FILE=$CONFIG_DIR/toolchain.cmake"
+fi
+if [[ -n "$CROSSCOMPILE" ]]; then
+    if ! [[ -n "$ROOTFS_DIR" ]]; then
+        echo "ROOTFS_DIR not set for crosscompile"
+        exit 1
+    fi
+    if [[ -z $CONFIG_DIR ]]; then
+        CONFIG_DIR="$1/cross/$build_arch"
     fi
+    cmake_extra_defines="$cmake_extra_defines -C $CONFIG_DIR/tryrun.cmake"
+    cmake_extra_defines="$cmake_extra_defines -DCMAKE_TOOLCHAIN_FILE=$CONFIG_DIR/toolchain.cmake"
 fi
 if [ "$build_arch" == "armel" ]; then
     cmake_extra_defines="$cmake_extra_defines -DARM_SOFTFP=1"