From 784aa4fd2538c59e639f6ae50259609e0401ae4e Mon Sep 17 00:00:00 2001 From: Andrey Kvochko Date: Thu, 19 Oct 2017 17:02:04 +0300 Subject: [PATCH] Support manual CoreCLR builds --- Dockerfile | 5 +- profiler/profiler/build.sh | 111 +++++++++++++++++++++++++++------------ scripts/docker/build_profiler.sh | 37 ++++++++----- scripts/docker/heaptrack-run.sh | 20 +++++-- scripts/docker/heaptrack.sh | 55 ++++++++++++++++--- 5 files changed, 168 insertions(+), 60 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5cb3f5e..446a730 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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 diff --git a/profiler/profiler/build.sh b/profiler/profiler/build.sh index 46351ff..9f6e897 100755 --- a/profiler/profiler/build.sh +++ b/profiler/profiler/build.sh @@ -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 .. diff --git a/scripts/docker/build_profiler.sh b/scripts/docker/build_profiler.sh index 71a1865..ffba026 100755 --- a/scripts/docker/build_profiler.sh +++ b/scripts/docker/build_profiler.sh @@ -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 diff --git a/scripts/docker/heaptrack-run.sh b/scripts/docker/heaptrack-run.sh index 80646d6..852c483 100755 --- a/scripts/docker/heaptrack-run.sh +++ b/scripts/docker/heaptrack-run.sh @@ -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 diff --git a/scripts/docker/heaptrack.sh b/scripts/docker/heaptrack.sh index d16b355..fba2600 100755 --- a/scripts/docker/heaptrack.sh +++ b/scripts/docker/heaptrack.sh @@ -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" -- 2.7.4