Add Tizen rootfs for arm cross compilation (#378)
author최형규/동작제어Lab(SR)/Senior Engineer/삼성전자 <hk0110.choi@samsung.com>
Tue, 3 Apr 2018 03:56:05 +0000 (12:56 +0900)
committer서상민/동작제어Lab(SR)/Senior Engineer/삼성전자 <sangmin7.seo@samsung.com>
Tue, 3 Apr 2018 03:56:05 +0000 (12:56 +0900)
- Add Tizen rootfs for arm cross compilation

Signed-off-by: Hyung-Kyu Choi <hk0110.choi@samsung.com>
tools/cross/armel/tizen-build-rootfs.sh [new file with mode: 0755]
tools/cross/armel/tizen-fetch.sh [new file with mode: 0755]
tools/cross/armel/tizen.patch [new file with mode: 0644]
tools/cross/build_rootfs.sh

diff --git a/tools/cross/armel/tizen-build-rootfs.sh b/tools/cross/armel/tizen-build-rootfs.sh
new file mode 100755 (executable)
index 0000000..2d0084d
--- /dev/null
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+set -e
+
+__ARM_SOFTFP_CrossDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
+
+if [[ -z "$ROOTFS_DIR" ]]; then
+    echo "ROOTFS_DIR is not defined."
+    exit 1;
+fi
+
+# Clean-up (TODO-Cleanup: We may already delete  $ROOTFS_DIR at ./cross/build-rootfs.sh.)
+# hk0110
+if [ -d "$ROOTFS_DIR" ]; then
+    umount $ROOTFS_DIR/*
+    rm -rf $ROOTFS_DIR
+fi
+
+TIZEN_TMP_DIR=$ROOTFS_DIR/tizen_tmp
+mkdir -p $TIZEN_TMP_DIR
+
+# Download files
+echo ">>Start downloading files"
+VERBOSE=1 $__ARM_SOFTFP_CrossDir/tizen-fetch.sh $TIZEN_TMP_DIR
+echo "<<Finish downloading files"
+
+echo ">>Start constructing Tizen rootfs"
+TIZEN_RPM_FILES=`ls $TIZEN_TMP_DIR/*.rpm`
+cd $ROOTFS_DIR
+for f in $TIZEN_RPM_FILES; do
+    rpm2cpio $f  | cpio -idm --quiet
+done
+echo "<<Finish constructing Tizen rootfs"
+
+# Cleanup tmp
+rm -rf $TIZEN_TMP_DIR
+
+# Configure Tizen rootfs
+echo ">>Start configuring Tizen rootfs"
+rm ./usr/lib/libunwind.so
+ln -s libunwind.so.8 ./usr/lib/libunwind.so
+ln -sfn asm-arm ./usr/include/asm
+patch -p1 < $__ARM_SOFTFP_CrossDir/tizen.patch
+echo "<<Finish configuring Tizen rootfs"
diff --git a/tools/cross/armel/tizen-fetch.sh b/tools/cross/armel/tizen-fetch.sh
new file mode 100755 (executable)
index 0000000..77e7bbc
--- /dev/null
@@ -0,0 +1,176 @@
+#!/usr/bin/env bash
+set -e
+
+if [[ -z "${VERBOSE// }" ]] || [ "$VERBOSE" -ne "$VERBOSE" ] 2>/dev/null; then
+       VERBOSE=0
+fi
+
+Log()
+{
+       if [ $VERBOSE -ge $1 ]; then
+               echo ${@:2}
+       fi
+}
+
+Inform()
+{
+       Log 1 -e "\x1B[0;34m$@\x1B[m"
+}
+
+Debug()
+{
+       Log 2 -e "\x1B[0;32m$@\x1B[m"
+}
+
+Error()
+{
+       >&2 Log 0 -e "\x1B[0;31m$@\x1B[m"
+}
+
+Fetch()
+{
+       URL=$1
+       FILE=$2
+       PROGRESS=$3
+       if [ $VERBOSE -ge 1 ] && [ $PROGRESS ]; then
+               CURL_OPT="--progress-bar"
+       else
+               CURL_OPT="--silent"
+       fi
+       curl $CURL_OPT $URL > $FILE
+}
+
+hash curl 2> /dev/null || { Error "Require 'curl' Aborting."; exit 1; }
+hash xmllint 2> /dev/null || { Error "Require 'xmllint' Aborting."; exit 1; }
+hash sha256sum 2> /dev/null || { Error "Require 'sha256sum' Aborting."; exit 1; }
+
+TMPDIR=$1
+if [ ! -d $TMPDIR ]; then
+       TMPDIR=./tizen_tmp
+       Debug "Create temporary directory : $TMPDIR"
+       mkdir -p $TMPDIR 
+fi
+
+TIZEN_URL=http://download.tizen.org/releases/daily/tizen
+BUILD_XML=build.xml
+REPOMD_XML=repomd.xml
+PRIMARY_XML=primary.xml
+TARGET_URL="http://__not_initialized"
+
+Xpath_get()
+{
+       XPATH_RESULT=''
+       XPATH=$1
+       XML_FILE=$2
+       RESULT=$(xmllint --xpath $XPATH $XML_FILE)
+       if [[ -z ${RESULT// } ]]; then
+               Error "Can not find target from $XML_FILE"
+               Debug "Xpath = $XPATH"
+               exit 1
+       fi
+       XPATH_RESULT=$RESULT
+}
+
+fetch_tizen_pkgs_init()
+{
+       TARGET=$1
+       PROFILE=$2
+       Debug "Initialize TARGET=$TARGET, PROFILE=$PROFILE"
+
+       TMP_PKG_DIR=$TMPDIR/tizen_${PROFILE}_pkgs
+       if [ -d $TMP_PKG_DIR ]; then rm -rf $TMP_PKG_DIR; fi
+       mkdir -p $TMP_PKG_DIR
+
+       PKG_URL=$TIZEN_URL/$PROFILE/latest
+
+       BUILD_XML_URL=$PKG_URL/$BUILD_XML
+       TMP_BUILD=$TMP_PKG_DIR/$BUILD_XML
+       TMP_REPOMD=$TMP_PKG_DIR/$REPOMD_XML
+       TMP_PRIMARY=$TMP_PKG_DIR/$PRIMARY_XML
+       TMP_PRIMARYGZ=${TMP_PRIMARY}.gz
+
+       Fetch $BUILD_XML_URL $TMP_BUILD
+
+       Debug "fetch $BUILD_XML_URL to $TMP_BUILD"
+
+       TARGET_XPATH="//build/buildtargets/buildtarget[@name=\"$TARGET\"]/repo[@type=\"binary\"]/text()"
+       Xpath_get $TARGET_XPATH $TMP_BUILD
+       TARGET_PATH=$XPATH_RESULT
+       TARGET_URL=$PKG_URL/$TARGET_PATH
+
+       REPOMD_URL=$TARGET_URL/repodata/repomd.xml
+       PRIMARY_XPATH='string(//*[local-name()="data"][@type="primary"]/*[local-name()="location"]/@href)'
+
+       Fetch $REPOMD_URL $TMP_REPOMD
+
+       Debug "fetch $REPOMD_URL to $TMP_REPOMD"
+
+       Xpath_get $PRIMARY_XPATH $TMP_REPOMD
+       PRIMARY_XML_PATH=$XPATH_RESULT
+       PRIMARY_URL=$TARGET_URL/$PRIMARY_XML_PATH
+
+       Fetch $PRIMARY_URL $TMP_PRIMARYGZ
+
+       Debug "fetch $PRIMARY_URL to $TMP_PRIMARYGZ"
+
+       gunzip $TMP_PRIMARYGZ 
+
+       Debug "unzip $TMP_PRIMARYGZ to $TMP_PRIMARY" 
+}
+
+fetch_tizen_pkgs()
+{
+       ARCH=$1
+       PACKAGE_XPATH_TPL='string(//*[local-name()="metadata"]/*[local-name()="package"][*[local-name()="name"][text()="_PKG_"]][*[local-name()="arch"][text()="_ARCH_"]]/*[local-name()="location"]/@href)'
+
+       PACKAGE_CHECKSUM_XPATH_TPL='string(//*[local-name()="metadata"]/*[local-name()="package"][*[local-name()="name"][text()="_PKG_"]][*[local-name()="arch"][text()="_ARCH_"]]/*[local-name()="checksum"]/text())'
+
+       for pkg in ${@:2}
+       do
+               Inform "Fetching... $pkg"
+               XPATH=${PACKAGE_XPATH_TPL/_PKG_/$pkg}
+               XPATH=${XPATH/_ARCH_/$ARCH}
+               Xpath_get $XPATH $TMP_PRIMARY
+               PKG_PATH=$XPATH_RESULT
+
+               XPATH=${PACKAGE_CHECKSUM_XPATH_TPL/_PKG_/$pkg}
+               XPATH=${XPATH/_ARCH_/$ARCH}
+               Xpath_get $XPATH $TMP_PRIMARY
+               CHECKSUM=$XPATH_RESULT
+
+               PKG_URL=$TARGET_URL/$PKG_PATH
+               PKG_FILE=$(basename $PKG_PATH)
+               PKG_PATH=$TMPDIR/$PKG_FILE
+
+               Debug "Download $PKG_URL to $PKG_PATH"
+               Fetch $PKG_URL $PKG_PATH true
+
+               echo "$CHECKSUM $PKG_PATH" | sha256sum -c - > /dev/null
+               if [ $? -ne 0 ]; then
+                       Error "Fail to fetch $PKG_URL to $PKG_PATH"
+                       Debug "Checksum = $CHECKSUM"
+                       exit 1
+               fi
+       done
+}
+
+Inform "Initialize arm 4.0-base"
+fetch_tizen_pkgs_init arm 4.0-base
+Inform "fetch common packages"
+fetch_tizen_pkgs armv7l gcc glibc glibc-devel
+fetch_tizen_pkgs noarch linux-glibc-devel
+Inform "fetch coreclr packages"
+fetch_tizen_pkgs armv7l lldb lldb-devel libgcc libstdc++ libstdc++-devel libunwind libunwind-devel
+Inform "fetch corefx packages"
+fetch_tizen_pkgs armv7l libcom_err libcom_err-devel zlib zlib-devel libopenssl libopenssl-devel
+
+Inform "Initialize standard 4.0-unified"
+fetch_tizen_pkgs_init standard 4.0-unified
+Inform "fetch common packages"
+fetch_tizen_pkgs armv7l libicu-devel
+Inform "fetch coreclr packages"
+fetch_tizen_pkgs armv7l tizen-release lttng-ust-devel lttng-ust userspace-rcu-devel userspace-rcu
+Inform "fetch corefx packages"
+fetch_tizen_pkgs armv7l gssdp gssdp-devel krb5 krb5-devel libcurl libcurl-devel
+
+
diff --git a/tools/cross/armel/tizen.patch b/tools/cross/armel/tizen.patch
new file mode 100644 (file)
index 0000000..d223427
--- /dev/null
@@ -0,0 +1,18 @@
+diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so
+--- a/usr/lib/libc.so  2016-12-30 23:00:08.284951863 +0900
++++ b/usr/lib/libc.so  2016-12-30 23:00:32.140951815 +0900
+@@ -2,4 +2,4 @@
+    Use the shared library, but some functions are only in
+    the static library, so try that secondarily.  */
+ OUTPUT_FORMAT(elf32-littlearm)
+-GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.3 ) )
++GROUP ( libc.so.6 libc_nonshared.a  AS_NEEDED ( ld-linux.so.3 ) )
+diff -u -r a/usr/lib/libpthread.so b/usr/lib/libpthread.so
+--- a/usr/lib/libpthread.so    2016-12-30 23:00:19.408951841 +0900
++++ b/usr/lib/libpthread.so    2016-12-30 23:00:39.068951801 +0900
+@@ -2,4 +2,4 @@
+    Use the shared library, but some functions are only in
+    the static library, so try that secondarily.  */
+ OUTPUT_FORMAT(elf32-littlearm)
+-GROUP ( /lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a )
++GROUP ( libpthread.so.0 libpthread_nonshared.a )
index db5639f..afe2d5b 100755 (executable)
@@ -1,10 +1,12 @@
 #!/usr/bin/env bash
+set -x
 
 usage()
 {
     echo "Usage: $0 [BuildArch] [LinuxCodeName] [--skipunmount] [--skipproxy]"
-    echo "BuildArch can be: arm"
+    echo "BuildArch can be: arm and armel"
     echo "LinuxCodeName - optional, Code name for Linux, can be: xenial(default), trusty"
+    echo "                          If BuildArch is armel, this can be tizen(default)"
     echo "--skipunmount - optional, will skip the unmount of rootfs folder."
     echo "--skipproxy   - optional, will skip the adding proxy information for Seoul R&D Campus."
     exit 1
@@ -42,6 +44,24 @@ for i in "$@" ; do
             __BuildArch=arm
             __UbuntuArch=armhf
             ;;
+        armel)
+            __BuildArch=armel
+            __Tizen=tizen
+            __UbuntuArch=
+            __UbuntuRepo=
+            __LinuxCodeName=
+            ;;
+        tizen)
+            if [ "$__BuildArch" != "armel" ]; then
+                echo "Tizen is available only for armel."
+                usage;
+                exit 1;
+            fi
+            __Tizen=tizen
+            __UbuntuArch=
+            __UbuntuRepo=
+            __LinuxCodeName=
+            ;;
         trusty)
             __LinuxCodeName=trusty
             ;;
@@ -73,7 +93,7 @@ if [ -d "$__RootfsDir" ]; then
     rm -rf $__RootfsDir
 fi
 
-if [ $__SkipProxy == 0 ]; then
+if [ $__SkipProxy == 0 && "$__Tizen" != "tizen" ]; then
     mkdir -p $__RootfsDir/etc/apt/apt.conf.d
     cp $__CrossDir/apt_proxy $__RootfsDir/etc/apt/apt.conf.d/90proxy
 fi
@@ -89,6 +109,8 @@ if [[ -n $__LinuxCodeName ]]; then
     if [ $__SkipUnmount == 0 ]; then
         umount $__RootfsDir/*
     fi
+elif [ "$__Tizen" == "tizen" ]; then
+    ROOTFS_DIR=$__RootfsDir $__CrossDir/$__BuildArch/tizen-build-rootfs.sh
 else
     echo "Unsupported target platform."
     usage;