build-all-ng.sh 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. #!/bin/bash
  2. #
  3. # Copyright (c) 2013-2021 Igor Pecovnik, igor.pecovnik@gma**.com
  4. #
  5. # This file is licensed under the terms of the GNU General Public
  6. # License version 2. This program is licensed "as is" without any
  7. # warranty of any kind, whether express or implied.
  8. # Functions:
  9. # unset_all
  10. # pack_upload
  11. # build_main
  12. # array_contains
  13. # check_hash
  14. # build_all
  15. [[ -z $START ]] && START="0"
  16. [[ -z $BSP_BUILD ]] && BSP_BUILD="no"
  17. [[ -z $MULTITHREAD ]] && MULTITHREAD="0"
  18. [[ -z $STABILITY ]] && STABILITY="stable"
  19. [[ -z $BUILD_OPT ]] && BUILD_OPT="image"
  20. [[ -z $BRANCH_OVER ]] && BRANCH_OVER=""
  21. [[ -z $RELEASE_OVER ]] && RELEASE_OVER=""
  22. [[ -z $CLEAN_LEVEL ]] && CLEAN_LEVEL="oldcache"
  23. [[ -z $KERNEL_CONFIGURE ]] && KERNEL_CONFIGURE="no"
  24. # cleanup
  25. rm -f /run/orangepi/*.pid
  26. mkdir -p /run/orangepi
  27. # read user defined targets if exits
  28. if [[ -f $USERPATCHES_PATH/targets.conf ]]; then
  29. display_alert "Adding user provided targets configuration"
  30. BUILD_TARGETS="${USERPATCHES_PATH}/targets.conf"
  31. else
  32. BUILD_TARGETS="${EXTER}/config/targets.conf"
  33. fi
  34. unset_all ()
  35. {
  36. unset LINUXFAMILY LINUXCONFIG KERNELDIR KERNELSOURCE KERNELBRANCH BOOTDIR BOOTSOURCE BOOTBRANCH ARCH UBOOT_USE_GCC \
  37. KERNEL_USE_GCC CPUMIN CPUMAX UBOOT_VER KERNEL_VER GOVERNOR BOOTSIZE BOOTFS_TYPE UBOOT_TOOLCHAIN KERNEL_TOOLCHAIN \
  38. DEBOOTSTRAP_LIST PACKAGE_LIST_EXCLUDE KERNEL_IMAGE_TYPE write_uboot_platform family_tweaks family_tweaks_bsp \
  39. setup_write_uboot_platform uboot_custom_postprocess atf_custom_postprocess family_tweaks_s BOOTSCRIPT \
  40. UBOOT_TARGET_MAP LOCALVERSION UBOOT_COMPILER KERNEL_COMPILER BOOTCONFIG_VAR_NAME INITRD_ARCH BOOTENV_FILE BOOTDELAY \
  41. ATF_TOOLCHAIN2 MOUNT SDCARD BOOTPATCHDIR KERNELPATCHDIR RELEASE IMAGE_TYPE OVERLAY_PREFIX ASOUND_STATE ATF_COMPILER \
  42. ATF_USE_GCC ATFSOURCE ATFDIR ATFBRANCH ATFSOURCEDIR PACKAGE_LIST_RM NM_IGNORE_DEVICES DISPLAY_MANAGER \
  43. family_tweaks_bsp_s CRYPTROOT_ENABLE CRYPTROOT_PASSPHRASE CRYPTROOT_SSH_UNLOCK CRYPTROOT_SSH_UNLOCK_PORT \
  44. CRYPTROOT_SSH_UNLOCK_KEY_NAME ROOT_MAPPER NETWORK HDMI USB WIRELESS ARMBIANMONITOR FORCE_BOOTSCRIPT_UPDATE \
  45. UBOOT_TOOLCHAIN2 toolchain2 BUILD_REPOSITORY_URL BUILD_REPOSITORY_COMMIT BUILD_TARGET HOST BUILD_IMAGE \
  46. DEB_STORAGE REPO_STORAGE REPO_CONFIG REPOSITORY_UPDATE PACKAGE_LIST_RELEASE LOCAL_MIRROR COMPILE_ATF \
  47. PACKAGE_LIST_BOARD PACKAGE_LIST_FAMILY PACKAGE_LIST_DESKTOP_BOARD PACKAGE_LIST_DESKTOP_FAMILY ATF_COMPILE ATFPATCHDIR OFFSET BOOTSOURCEDIR BOOT_USE_BLOBS \
  48. BOOT_SOC DDR_BLOB MINILOADER_BLOB BL31_BLOB BOOT_RK3328_USE_AYUFAN_ATF BOOT_USE_BLOBS BOOT_RK3399_LEGACY_HYBRID \
  49. BOOT_USE_MAINLINE_ATF BOOT_USE_TPL_SPL_BLOB OFFLINE_WORK IMAGE_PARTITION_TABLE BOOT_LOGO
  50. }
  51. pack_upload ()
  52. {
  53. # pack and upload to server or just pack
  54. local version="${BOARD^}_${REVISION}_${RELEASE}_${BRANCH}_${VER/-$LINUXFAMILY/}"
  55. local subdir=""
  56. cd "${DESTIMG}" || exit
  57. if [[ -n "${SEND_TO_SERVER}" ]]; then
  58. ssh "${SEND_TO_SERVER}" "mkdir -p ${SEND_TO_LOCATION}${BOARD}/{archive,nightly}" &
  59. display_alert "Uploading" "Please wait!" "info"
  60. nice -n 19 bash -c "rsync -arP --info=progress2 --prune-empty-dirs $DESTIMG/ -e 'ssh -T -c aes128-ctr -o Compression=no -x -p 22' ${SEND_TO_SERVER}:${SEND_TO_LOCATION}${BOARD}/${subdir}; rm -rf ${DESTIMG}/*" &
  61. fi
  62. }
  63. build_main ()
  64. {
  65. # build images which we do pack or kernel
  66. #local upload_image="${BOARD^}_$(cat ${SRC}/VERSION)_${RELEASE}_${BRANCH}_*${VER/-$LINUXFAMILY/}"
  67. #local upload_subdir="archive"
  68. [[ $BUILD_DESKTOP == yes ]] && upload_image=${upload_image}_desktop
  69. [[ $BUILD_MINIMAL == yes ]] && upload_image=${upload_image}_minimal
  70. touch "/run/orangepi/${BOARD^}_${BRANCH}_${RELEASE}_${BUILD_DESKTOP}_${BUILD_MINIMAL}.pid";
  71. if [[ $BUILD_OPT == image ]]; then
  72. #if ssh ${SEND_TO_SERVER} stat ${SEND_TO_LOCATION}${BOARD}/${upload_subdir}/${upload_image}* \> /dev/null 2\>\&1; then
  73. # echo "$n exists $upload_image"
  74. #else
  75. #shellcheck source=main.sh
  76. source "${SRC}"/scripts/main.sh
  77. #[[ $BSP_BUILD != yes ]] && pack_upload
  78. #fi
  79. else
  80. source "${SRC}"/scripts/main.sh
  81. fi
  82. echo -e "\n"
  83. rm "/run/orangepi/${BOARD^}_${BRANCH}_${RELEASE}_${BUILD_DESKTOP}_${BUILD_MINIMAL}.pid"
  84. }
  85. array_contains ()
  86. {
  87. # utility snippet
  88. local array="$1[@]"
  89. local seeking=$2
  90. local in=1
  91. for element in "${!array}"; do
  92. if [[ "${element}" == "${seeking}" ]]; then
  93. in=0
  94. break
  95. fi
  96. done
  97. return $in
  98. }
  99. function build_all()
  100. {
  101. # main routine
  102. buildall_start=$(date +%s)
  103. n=0
  104. ARRAY=()
  105. buildlist="cat "
  106. if [[ -f $USERPATCHES_PATH/build_all.config ]]; then
  107. source $USERPATCHES_PATH/build_all.config
  108. elif [[ -f $EXTER/config/templates/build_all.config ]]; then
  109. cp $EXTER/config/templates/build_all.config $USERPATCHES_PATH/
  110. source $USERPATCHES_PATH/build_all.config
  111. fi
  112. # building selected ones
  113. if [[ -n ${REBUILD_IMAGES} ]]; then
  114. buildlist="grep -w '"
  115. filter="'"
  116. for build in $(tr ',' ' ' <<< "${REBUILD_IMAGES}"); do
  117. buildlist=$buildlist"$build\|"
  118. filter=$filter"$build\|"
  119. done
  120. buildlist=${buildlist::-2}"'"
  121. filter=${filter::-2}"'"
  122. fi
  123. # find unique boards - we will build debs for all variants
  124. sorted_unique_ids=($(echo "${ids[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
  125. unique_boards=$(eval "${buildlist}" ${EXTER}/config/targets.conf | sed '/^#/ d' | awk '{print $1}')
  126. read -a unique_boards <<< $(echo "${unique_boards[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')
  127. while read -r line; do
  128. [[ "${line}" =~ ^#.*$ ]] && continue
  129. [[ -n "${REBUILD_IMAGES}" ]] && [[ -z $(echo "${line}" | eval grep -w "${filter}") ]] && continue
  130. #[[ $n -lt $START ]] && ((n+=1)) && continue
  131. unset_all
  132. # unset also board related variables
  133. unset BOARDFAMILY DESKTOP_AUTOLOGIN DEFAULT_CONSOLE FULL_DESKTOP MODULES_CURRENT MODULES_LEGACY MODULES_DEV \
  134. BOOTCONFIG MODULES_BLACKLIST_LEGACY MODULES_BLACKLIST_CURRENT MODULES_BLACKLIST_DEV DEFAULT_OVERLAYS SERIALCON \
  135. BUILD_MINIMAL RELEASE ATFBRANCH BOOT_FDT_FILE BOOTCONFIG_DEV
  136. read -r BOARD BRANCH RELEASE BUILD_TARGET BUILD_STABILITY BUILD_IMAGE <<< "${line}"
  137. # read all possible configurations
  138. source ${EXTER}"/config/boards/${BOARD}".conf 2> /dev/null
  139. # override branch to build selected branches if defined
  140. [[ -n "${BRANCH_OVER}" ]] && [[ ${BRANCH} != ${BRANCH_OVER} ]] && continue
  141. # override release to build selected release if defined
  142. [[ -n "${RELEASE_OVER}" ]] && [[ "$RELEASE" != ${RELEASE_OVER} ]] && continue
  143. # override board to build selected board if defined
  144. [[ -n "${BOARD_OVER}" ]] && [[ "$BOARD" != ${BOARD_OVER} ]] && continue
  145. # small optimisation. we only (try to) build needed kernels
  146. if [[ $BUILD_OPT == kernel ]]; then
  147. source "${EXTER}/config/sources/families/${BOARDFAMILY}.conf" 2> /dev/null
  148. array_contains ARRAY "${LINUXFAMILY}${BRANCH}${BUILD_STABILITY}" && continue
  149. ARRAY+=("${LINUXFAMILY}${BRANCH}${BUILD_STABILITY}")
  150. BOARDFAMILY=${LINUXFAMILY}
  151. elif [[ $BUILD_OPT == u-boot ]]; then
  152. source "${EXTER}/config/sources/families/${BOARDFAMILY}.conf" 2> /dev/null
  153. array_contains ARRAY "${BOARD}${BRANCH}${BUILD_STABILITY}" && continue
  154. ARRAY+=("${BOARD}${BRANCH}${BUILD_STABILITY}")
  155. elif [[ $BUILD_IMAGE == no ]] ; then
  156. continue
  157. fi
  158. BUILD_DESKTOP="no"
  159. BUILD_MINIMAL="no"
  160. [[ ${BUILD_TARGET} == "desktop" ]] && BUILD_DESKTOP="yes"
  161. [[ ${BUILD_TARGET} == "minimal" ]] && BUILD_MINIMAL="yes"
  162. # create beta or stable
  163. if [[ "${BUILD_STABILITY}" == "${STABILITY}" ]]; then
  164. ((n+=1))
  165. if [[ $1 != "dryrun" ]] && [[ $n -ge $START ]]; then
  166. while :
  167. do
  168. [[ $(find /run/orangepi/*.pid 2>/dev/null | wc -l) -le ${MULTITHREAD} || -z ${MULTITHREAD} ]] && break
  169. sleep 5
  170. done
  171. display_alert "Building ${n}."
  172. (build_main)
  173. # create BSP for all boards
  174. elif [[ "${BSP_BUILD}" == yes ]]; then
  175. for BOARD in "${unique_boards[@]}"
  176. do
  177. source ${EXTER}"/config/boards/${BOARD}".conf 2> /dev/null
  178. IFS=',' read -a RELBRANCH <<< $KERNEL_TARGET
  179. for BRANCH in "${RELBRANCH[@]}"
  180. do
  181. RELTARGETS=(xenial buster bionic focal)
  182. for RELEASE in "${RELTARGETS[@]}"
  183. do
  184. display_alert "BSP for ${BOARD} ${BRANCH} ${RELEASE}."
  185. build_main
  186. # unset non board related stuff
  187. unset_all
  188. done
  189. done
  190. done
  191. display_alert "Done building all BSP images"
  192. exit
  193. else
  194. # In dryrun it only prints out what will be build
  195. printf "%s\t%-32s\t%-8s\t%-14s\t%-6s\t%-6s\t%-6s\n" "${n}." \
  196. "$BOARD (${BOARDFAMILY})" "${BRANCH}" "${RELEASE}" "${BUILD_DESKTOP}" "${BUILD_MINIMAL}"
  197. fi
  198. fi
  199. done < "${BUILD_TARGETS}"
  200. }
  201. # display what will be build
  202. echo ""
  203. display_alert "Building all targets" "$STABILITY - $BUILD_OPT"
  204. printf "\n%s\t%-32s\t%-8s\t%-14s\t%-6s\t%-6s\t%-6s\n\n" "" "board" "branch" "release" "XFCE" "minimal"
  205. # display what we will build
  206. build_all "dryrun"
  207. if [[ $BUILD_ALL != demo ]] ; then
  208. echo ""
  209. # build
  210. build_all
  211. fi
  212. # wait until they are not finshed
  213. sleep 5
  214. while :
  215. do
  216. if [[ $(df | grep -c .tmp) -lt 1 ]]; then
  217. break
  218. fi
  219. sleep 5
  220. done
  221. while :
  222. do
  223. if [[ -z $(ps -uax | grep 7z | grep OrangePi) ]]; then
  224. break
  225. fi
  226. sleep 5
  227. done
  228. buildall_end=$(date +%s)
  229. buildall_runtime=$(((buildall_end - buildall_start) / 60))
  230. display_alert "Runtime in total" "${buildall_runtime} min" "info"