create_cross_compiler_from_gbs_sysroot 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #!/bin/bash
  2. set -x
  3. SCRIPTDIR=$( cd $(dirname $0) ; pwd -P )
  4. usage()
  5. {
  6. cat << EOF
  7. usage: $0 [OPTIONS]
  8. Create Tizen development tools for certain Tizen profile (gbs sysroot)
  9. OPTIONS:
  10. -h Show this message
  11. -p toolchain installation prefix (cross compiler will be installed there)
  12. -s gbs sysroot PATH
  13. -r source rpm repository url
  14. -i do not clean temporary build directories and try to start from last error
  15. examples:
  16. $0 -p ~/toolchains \
  17. -s ~/GBS_ROOT/local/BUILD-ROOTS/scratch.armv7l.0 \
  18. -r http://download.tizen.org/snapshots/tizen/common/latest/repos/x86_64-wayland/source
  19. EOF
  20. exit
  21. }
  22. set -e
  23. SYSROOT=""
  24. TOOLCHAIN_PREFIX=""
  25. SOURCE_RPM_REPOSITORY_URL=""
  26. INCREMENTAL="0"
  27. while getopts ":hip:r:s:" opt; do
  28. case $opt in
  29. h)
  30. usage
  31. ;;
  32. i)
  33. INCREMENTAL="1"
  34. ;;
  35. p)
  36. TOOLCHAIN_PREFIX=$(mkdir -p $OPTARG; cd $OPTARG; pwd -L)
  37. ;;
  38. s)
  39. SYSROOT=$(cd $OPTARG; pwd -L)
  40. ;;
  41. r)
  42. SOURCE_RPM_REPOSITORY_URL=${OPTARG}
  43. ;;
  44. ?)
  45. echo "Invalid option: -$OPTARG"
  46. usage
  47. ;;
  48. esac
  49. done
  50. if [ "$TOOLCHAIN_PREFIX" == "" ]; then
  51. echo "Set toolchain prefix with -p option. Cross compiler will be installed there"
  52. exit 1
  53. fi
  54. if [ "$SYSROOT" == "" ]; then
  55. echo "Set gbs sysroot path with -s option"
  56. exit 1
  57. fi
  58. if [ "$SOURCE_RPM_REPOSITORY_URL" == "" ]; then
  59. echo "Set source rpm repository url with -r option"
  60. exit 1
  61. fi
  62. TARGET=$(echo "/usr/bin/gcc -dumpmachine" | gbs chroot $SYSROOT | grep -v "info: chroot")
  63. if ! [ -e "${TOOLCHAIN_PREFIX}/bin/${TARGET}-ld" ]; then
  64. echo "binutils are not created - creating them now..."
  65. $SCRIPTDIR/create_binutils_from_gbs_sysroot -p ${TOOLCHAIN_PREFIX} \
  66. -s ${SYSROOT} \
  67. -r ${SOURCE_RPM_REPOSITORY_URL} \
  68. -i $INCREMENTAL
  69. fi
  70. BUILD_DIR=/tmp/crosscompilerbuild/compiler
  71. GCC_SRCRPM=$(echo "rpm -qif \$(readlink -f /usr/bin/gcc) | grep 'Source RPM' | sed 's/.*Source\s*RPM\s*:\s*//g'" | gbs chroot $SYSROOT | grep -v "info: chroot")
  72. GCC_CONFIGURE_PARAMETERS=$(echo 'gcc -v 2>&1 | grep "Configured with"' | gbs chroot $SYSROOT | grep -v "info: chroot" |
  73. sed "s/^Configured with\s*\:.*configure\s//g" |
  74. sed "s/--prefix=\S\+//gi" |
  75. sed "s/--with-sysroot=\S\+//gi" |
  76. sed "s/--with-build-sysroot=\S\+//gi" |
  77. sed "s/--program-transform-name=\S\+//gi" |
  78. sed "s/--infodir=\S\+//gi" |
  79. sed "s/--mandir=\S\+//gi" |
  80. sed "s/--libexecdir=\S\+//gi" |
  81. sed "s/--host=\S\+//gi" |
  82. sed "s/--build=\S\+//gi" |
  83. sed "s/--target=\S\+//gi" |
  84. sed "s/--with-gxx-include-dir=\S\+//gi")
  85. if [ "$INCREMENTAL" == "0" ]; then
  86. rm -rf $BUILD_DIR
  87. fi
  88. mkdir -p $BUILD_DIR
  89. cd $BUILD_DIR
  90. if ! [ -e $BINUTILS_SRCRPM -a "$INCREMENTAL" == "1" ]; then
  91. wget ${SOURCE_RPM_REPOSITORY_URL}/$GCC_SRCRPM
  92. fi
  93. GCC_SOURCE_ARCHIVE=$(ls | grep *.tar.* || :)
  94. if ! [ "$GCC_SOURCE_ARCHIVE" != "" -a "$INCREMENTAL" == "1" ]; then
  95. rpm2cpio $GCC_SRCRPM 2>&1 | cpio -imdv 2>&1
  96. GCC_SOURCE_ARCHIVE=$(ls | grep *.tar.*)
  97. fi
  98. GCC_NAME=$(echo $GCC_SOURCE_ARCHIVE | sed "s/\.tar\..*//gi")
  99. echo extracting $GCC_SOURCE_ARCHIVE ...
  100. tar -xf $GCC_SOURCE_ARCHIVE
  101. cd $GCC_NAME
  102. echo applying patches
  103. for tupple in $(cat ../*.spec| grep -Pi "^patch" | sed "s/^patch//gi" | sed "s/\s*\:\s*/|/gi" | sort); do\
  104. tupple=(${tupple/|/ })
  105. echo applying patch number ${tupple[0]} ${tupple[1]}
  106. PATCH_PARAMS=$(grep -P "^\s*%patch${tupple[0]}" ../*.spec | sed "s/%patch[0-9]\+\s*//gi" | sed "s/-b\s\+\S\+/ /g")
  107. if [ "$PATCH_PARAMS" == "" ]; then
  108. continue
  109. fi
  110. patch $PATCH_PARAMS < ../${tupple[1]}
  111. done
  112. cd ..
  113. GCC_BUILD_DIR=${GCC_NAME}-build
  114. mkdir -p $GCC_BUILD_DIR
  115. cd $GCC_BUILD_DIR
  116. ../$GCC_NAME/configure \
  117. --with-sysroot=$SYSROOT \
  118. --target=$TARGET \
  119. --prefix=$TOOLCHAIN_PREFIX \
  120. $GCC_CONFIGURE_PARAMETERS
  121. make -j$(cat /proc/cpuinfo | grep -c "^proc") all
  122. make install
  123. #rm -rf $BUILD_DIR