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
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."
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 ..
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
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
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
APP_ID=$1
APP_PATH=$2
DOWNLOAD_CORECLR_DEVEL=""
+CORECLR_SRC_DIR=""
+CORECLR_BIN_DIR=""
test_sdb_version() {
if [ ! -f $SDB ]; then
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
"$RES_FILE" \
"$APP_ID" \
"$APP_PATH" \
- "$LAUNCH_GUI"
+ "$LAUNCH_GUI" \
+ "$CORECLR_BIN_DIR"