Support manual CoreCLR builds
authorAndrey Kvochko <a.kvochko@samsung.com>
Thu, 19 Oct 2017 14:02:04 +0000 (17:02 +0300)
committerAndrey Kvochko/SRR-Compiler Lab/./삼성전자 <a.kvochko@samsung.com>
Wed, 25 Oct 2017 10:29:46 +0000 (13:29 +0300)
Dockerfile
profiler/profiler/build.sh
scripts/docker/build_profiler.sh
scripts/docker/heaptrack-run.sh
scripts/docker/heaptrack.sh

index 5cb3f5e..446a730 100644 (file)
@@ -59,6 +59,9 @@ RUN cd /heaptrack/build-armel && \
     CC=arm-linux-gnueabi-gcc CXX=arm-linux-gnueabi-g++ CPLUS_INCLUDE_PATH=/rootfs/usr/lib/gcc/armv7l-tizen-linux-gnueabi/6.2.1/include/c++:/rootfs/usr/lib/gcc/armv7l-tizen-linux-gnueabi/6.2.1/include/c++/armv7l-tizen-linux-gnueabi cmake .. -DHEAPTRACK_BUILD_GUI=OFF -DCMAKE_TOOLCHAIN_FILE=/heaptrack/profiler/profiler/cross/armel/toolchain.cmake && \
     make -j4 && cp -r bin lib /heaptrack-common/armel
 #build managed profiler module
-RUN cd /heaptrack/scripts/docker && ./build_profiler.sh /heaptrack-common/armel
+ARG ARCH=""
+ARG BUILD_TYPE=""
+ARG CORECLR_SOURCE=""
+RUN cd /heaptrack/scripts/docker && CORECLR_SOURCE=$CORECLR_SOURCE BUILD_TYPE=$BUILD_TYPE ARCH=$ARCH ./build_profiler.sh /heaptrack-common/armel
 
 VOLUME /heaptrack-common
index 46351ff..9f6e897 100755 (executable)
@@ -2,33 +2,82 @@
 
 usage()
 {
-       echo "Usage: $0 [CoreCLRDevelRPM] [RootFS]"
-       echo "CoreCLRDevelRPM - path to coreclr-devel rpm package, which can be downloaded from download.tizen.org"
-       echo "RootFS - (optional) path to target's rootfs directory. For native builds, leave empty"
+       echo "Usage: $0 [CoreCLRDevelRPM]"
+       echo "CoreCLRDevelRPM - (optional) path to coreclr-devel rpm package, which can be downloaded from download.tizen.org"
+       echo "For manual CoreCLR builds, set \$CORECLR_SRC_DIR, \$CORECLR_BIN_DIR, and, optionally, \$ARCH and \
+\$ROOTFS_DIR environment variables"
 }
 
-coreclr_devel_rpm=$(readlink -f $1)
-rootfs=$(readlink -f $2)
+coreclr_devel_rpm=$(readlink -f "$1")
 
-if [ ! -f $coreclr_devel_rpm ]; then
-       usage
-       exit 1
-fi
+determine_coreclr_source() {
+       if [ -d "$CORECLR_SRC_DIR" ] && [ -d "$CORECLR_BIN_DIR" ]; then
+               coreclr_source="manual"
+       elif [ -f "$coreclr_devel_rpm" ]; then
+               coreclr_source="rpm"
+       else
+               usage
+               exit 1
+       fi
+}
 
-arch=$(echo $coreclr_devel_rpm | sed -r 's/.*\.([^\.]*)\.rpm/\1/g')
-cmake_arch=x64
-if [[ $arch == 'armv7l' ]]; then
-       cmake_arch='armel'
-elif [[ $arch == 'x86_64' ]]; then
-       cmake_arch='x64'
-else
-       echo "Unsupported architecture. Only 'armv7l' and 'x86_64' are currently supported."
-       exit 1
-fi
+determine_cmake_arch() {
+       supported_cmake_archs=("armel" "x64")
+       supported_rpm_archs=("armv7l" "x86_64")
+       default_arch="x64"
+       if [ "$coreclr_source" == "manual" ]; then
+               # determine architecture from env variable
+               if [ -z "$ARCH" ]; then
+                       cmake_arch="$default_arch"
+               else
+                       for supported_cmake_arch in $supported_cmake_archs; do
+                               if [ "$supported_cmake_arch" == "$ARCH" ]; then
+                                       cmake_arch="$supported_cmake_arch"
+                                       return
+                               fi
+                       done
+
+                       echo "Unsupported architecture '$ARCH'. Must be one of $supported_cmake_archs."
+               fi
+       elif [ "$coreclr_source" == "rpm" ]; then
+               # determine architecture from RPM package
+               rpm_arch=$(echo $coreclr_devel_rpm | sed -r 's/.*\.([^\.]*)\.rpm/\1/g')
+               arch_index=0
+               for supported_rpm_arch in $supported_rpm_archs; do
+                       if [ "$rpm_arch" == "$supported_rpm_arch" ]; then
+                       cmake_arch=${supported_cmake_archs[arch_index]}
+                               return
+                       fi
+                       let arch_index=arch_index+1
+               done
+               echo "Unsupported architecture '$rpm_arch'. Must be one of $supported_rpm_archs."
+               exit 1
+       else
+               usage
+               exit 1
+       fi
+}
+
+prepare_coreclr() {
+       if [ "$coreclr_source" == "rpm" ]; then
+               rm -rf clr
+               mkdir clr
+               cd clr
+               clr_dir=$(pwd)
+               rpm2cpio $coreclr_devel_rpm | cpio -idmv
+               CORECLR_BIN_DIR=$clr_dir/usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/
+               CORECLR_SRC_DIR=$clr_dir/usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/
+               cd ..
+       fi
+}
+
+determine_coreclr_source
+determine_cmake_arch
+prepare_coreclr
 
 toolchain_file=""
-if [ ! -z "$rootfs" ] && [ -d $rootfs ]; then
-       if [[ $arch == 'armv7l' ]]; then
+if [ ! -z "$ROOTFS_DIR" ] && [ -d $ROOTFS_DIR ]; then
+       if [[ $cmake_arch == 'armel' ]]; then
                toolchain_file=$(pwd)/cross/armel/toolchain.cmake
        else
                echo "Unsupported architecture. Cross-compilation is only supported for armel targets."
@@ -36,26 +85,18 @@ if [ ! -z "$rootfs" ] && [ -d $rootfs ]; then
        fi
 fi
 
-rm -rf clr
-mkdir clr
-cd clr
-clr_dir=$(pwd)
-rpm2cpio $coreclr_devel_rpm | cpio -idmv
-
-cd ..
-
 rm -rf build
 mkdir build
 cd build
 if [ ! -z $toolchain_file ]; then
-       CC=clang CXX=clang++ ROOTFS_DIR=$rootfs cmake $(dirname $0)/.. -DCLR_ARCH=$cmake_arch \
-                                       -DCLR_BIN_DIR=$clr_dir/usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/ \
-                                       -DCLR_SRC_DIR=$clr_dir/usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/ \
+       CC=clang CXX=clang++ ROOTFS_DIR=$ROOTFS_DIR cmake $(dirname $0)/.. -DCLR_ARCH=$cmake_arch \
+                                       -DCLR_BIN_DIR=$CORECLR_BIN_DIR \
+                                       -DCLR_SRC_DIR=$CORECLR_SRC_DIR \
                                        -DCMAKE_TOOLCHAIN_FILE=$toolchain_file
 else
-       CC=clang CXX=clang++ ROOTFS_DIR=$rootfs cmake $(dirname $0)/.. -DCLR_ARCH=$cmake_arch \
-                               -DCLR_BIN_DIR=$clr_dir/usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/ \
-                               -DCLR_SRC_DIR=$clr_dir/usr/share/dotnet/shared/Microsoft.NETCore.App/2.0.0/
+       CC=clang CXX=clang++ ROOTFS_DIR=$ROOTFS_DIR cmake $(dirname $0)/.. -DCLR_ARCH=$cmake_arch \
+                               -DCLR_BIN_DIR=$CORECLR_BIN_DIR \
+                               -DCLR_SRC_DIR=$CORECLR_SRC_DIR
 fi
 make
 cd ..
index 71a1865..ffba026 100755 (executable)
@@ -10,18 +10,29 @@ CORECLR_DEVEL_RPMS="$(ls $CORECLR_DEVEL_DIR/coreclr-devel-*.armv7l.rpm 2>/dev/nu
 
 mkdir -p $CORECLR_DEVEL_DIR
 
-if [ -z "$CORECLR_DEVEL_RPMS" ]; then
-    echo Downloading coreclr-devel...
-    wget -q -r -np -l 1 --accept-regex coreclr-devel$TIZEN_PACKAGES_PATTERN $REPO_UNIFIED/armv7l/
-    find . -name "*.rpm" -exec mv {} $CORECLR_DEVEL_DIR \;
-fi
-
-CORECLR_DEVEL_RPMS="$(ls $CORECLR_DEVEL_DIR/coreclr-devel-*.armv7l.rpm 2>/dev/null)"
-
-for rpm in $CORECLR_DEVEL_RPMS; do
-    coreclr_version=$(echo $rpm | sed -E 's/.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-[0-9]+\.[0-9]+.*)\.rpm/\1/g')
-    cd $PROFILER_SRC_DIR
-    ./build.sh $rpm /rootfs
+save_artifacts() {
     mkdir -p $ARTIFACT_DIR/$coreclr_version
     mv $PROFILER_SRC_DIR/build/src/libprofiler.so $ARTIFACT_DIR/$coreclr_version
-done
+}
+
+cd $PROFILER_SRC_DIR
+
+if [ "$CORECLR_SOURCE" == "manual" ]; then
+    coreclr_version="unknown"
+    ROOTFS_DIR=/rootfs CORECLR_SRC_DIR="/heaptrack/.coreclr" CORECLR_BIN_DIR="/heaptrack/.coreclr/bin/Product/Linux.$ARCH.$BUILD_TYPE" ARCH="$ARCH" ./build.sh
+    save_artifacts
+else
+    if [ -z "$CORECLR_DEVEL_RPMS" ]; then
+        echo Downloading coreclr-devel...
+        wget -q -r -np -l 1 --accept-regex coreclr-devel$TIZEN_PACKAGES_PATTERN $REPO_UNIFIED/armv7l/
+        find . -name "*.rpm" -exec mv {} $CORECLR_DEVEL_DIR \;
+    fi
+
+    CORECLR_DEVEL_RPMS="$(ls $CORECLR_DEVEL_DIR/coreclr-devel-*.armv7l.rpm 2>/dev/null)"
+
+    for rpm in $CORECLR_DEVEL_RPMS; do
+        coreclr_version=$(echo $rpm | sed -E 's/.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+-[0-9]+\.[0-9]+.*)\.rpm/\1/g')
+        CORECLR_BIN_DIR= CORECLR_SRC_DIR= ROOTFS_DIR=/rootfs ./build.sh $rpm
+        save_artifacts
+    done
+fi
\ No newline at end of file
index 80646d6..852c483 100755 (executable)
@@ -11,6 +11,8 @@ RES_FILE=$7
 APP_ID=$8
 APP_PATH=$9
 LAUNCH_GUI=${10}
+CORECLR_BIN_DIR=${11}
+DEVICE_CORECLR_PATH="/usr/share/dotnet/"
 
 IS_FOUND_APP=$($SDB shell "app_launcher -l | cut -d \"'\" -f 4 | grep -q '^${APP_ID}$'; echo \$?" | tr -d "[:space:]")
 if [ "$IS_FOUND_APP" != "0" ]; then
@@ -35,10 +37,20 @@ $SDB shell "mkdir -p $DEVICE_HEAPTRACK_PATH/build/bin;
             mkdir -p $DEVICE_HEAPTRACK_PATH/build/lib/heaptrack/libexec" &>/dev/null
 docker cp $DOCKER_CONTAINER_HASH:/heaptrack-common/$DEVICE_ARCH $HEAPTRACK_DATA_DIR/$DEVICE_ARCH
 
-if [ ! -d "$HEAPTRACK_DATA_DIR/$DEVICE_ARCH/$CORECLR_VERSION" ]; then
-  echo "CoreCLR version on device $CORECLR_VERSION does not match any of the provided coreclr-devel package versions. Please \
-update coreclr on device, or put the correct coreclr-devel rpm in coreclr-devel folder."
-  exit 1
+if [ -d "$CORECLR_BIN_DIR" ]; then
+  device_hash=$($SDB shell "find -L $DEVICE_CORECLR_PATH -name libcoreclr.so -exec sha1sum {} \;" | awk '{ print($1) }')
+  host_hash=$(sha1sum $CORECLR_BIN_DIR/libcoreclr.so | awk '{ print($1) }')
+  CORECLR_VERSION="unknown"
+  if [ "$device_hash" != "$host_hash" ]; then
+    echo "CoreCLR version on device is different from the one in '$CORECLR_BIN_DIR'. Exiting."
+    exit 1
+  fi
+else
+  if [ ! -d "$HEAPTRACK_DATA_DIR/$DEVICE_ARCH/$CORECLR_VERSION" ]; then
+    echo "CoreCLR version on device $CORECLR_VERSION does not match any of the provided coreclr-devel package versions. Please \
+  update coreclr on device, or put the correct coreclr-devel rpm in coreclr-devel folder."
+    exit 1
+  fi
 fi
 
 $SDB push $HEAPTRACK_DATA_DIR/$DEVICE_ARCH/bin/* $DEVICE_HEAPTRACK_PATH/build/bin/ &>/dev/null
index d16b355..fba2600 100755 (executable)
@@ -9,6 +9,8 @@ RES_FILE=$HEAPTRACK_DATA_DIR/res.gz
 APP_ID=$1
 APP_PATH=$2
 DOWNLOAD_CORECLR_DEVEL=""
+CORECLR_SRC_DIR=""
+CORECLR_BIN_DIR=""
 
 test_sdb_version() {
     if [ ! -f $SDB ]; then
@@ -35,24 +37,62 @@ test_coreclr_devel() {
             DOWNLOAD_CORECLR_DEVEL=$(echo $DOWNLOAD_CORECLR_DEVEL | awk '{ print(tolower($0)) }')
         done
 
-        if [ "$DOWNLOAD_CORECLR_DEVEL" == "n" ]; then
+        if [ "$DOWNLOAD_CORECLR_DEVEL" == "y" ]; then
+            coreclr_source="rpm"
+            return
+        fi
+
+        read -p "Enter the source location of a compiled coreclr repository. The binaries in the repository \
+must match those on the device. [] " CORECLR_SRC_DIR
+        if [ ! -d "$CORECLR_SRC_DIR" ] ||  [ ! -d "$CORECLR_SRC_DIR/src" ]; then
+            echo "Can't find CoreCLR source in '$CORECLR_SRC_DIR'"
+            exit 1
+        fi
+
+        coreclr_build_type=""
+        read -p "Enter the CoreCLR build type [Release/Debug/Checked] " coreclr_build_type
+        CORECLR_BIN_DIR="$CORECLR_SRC_DIR/bin/Product/Linux.$DEVICE_ARCH.$coreclr_build_type"
+        if [ ! -d "$CORECLR_BIN_DIR" ]; then
+            echo "Can't find CoreCLR binaries in '$CORECLR_BIN_DIR'"
             exit 1
         fi
+        coreclr_source="manual"
     else
         for coreclr_rpm in $coreclr_rpms; do
             echo "Found $(basename $coreclr_rpm)"
         done
+        coreclr_source="rpm"
+    fi
+}
+
+build_container() {
+    temp_dir="$SCRIPTS_PATH/../../.coreclr"
+    if [ "$coreclr_source" == "manual" ]; then
+        base_dir="$(basename $CORECLR_BIN_DIR)"
+        mkdir -p $temp_dir/bin/Product/$base_dir/lib
+        mkdir -p $temp_dir/src
+        rsync -a --exclude=".nuget" --exclude="test*" $CORECLR_SRC_DIR/src/ $temp_dir/src
+        rsync -a $CORECLR_BIN_DIR/lib/* \
+                  $temp_dir/bin/Product/$base_dir/lib
+        rsync -a $CORECLR_BIN_DIR/inc \
+                  $temp_dir/bin/Product/$base_dir/inc
+
+    fi
+
+    docker build --build-arg CORECLR_SOURCE="$coreclr_source" \
+                 --build-arg BUILD_TYPE="$coreclr_build_type" \
+                 --build-arg ARCH="$DEVICE_ARCH" \
+                 -t heaptrack:latest $SCRIPTS_PATH/../..
+    if [ ! "$?" -eq "0" ]; then
+        echo "build errors; see the log for details"
+        exit 1
     fi
 }
 
 test_sdb_version
 test_coreclr_devel
+build_container
 
-docker build -t heaptrack:latest $SCRIPTS_PATH/../..
-if [ ! "$?" -eq "0" ]; then
-    echo "build errors; see the log for details"
-    exit 1
-fi
 DOCKER_CONTAINER_HASH=$(docker create heaptrack:latest)
 
 $SDB root on
@@ -67,5 +107,6 @@ $SCRIPTS_PATH/heaptrack-run.sh "$SDB" \
                                "$RES_FILE" \
                                "$APP_ID" \
                                "$APP_PATH" \
-                               "$LAUNCH_GUI"
+                               "$LAUNCH_GUI" \
+                               "$CORECLR_BIN_DIR"