multithread 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # SPDX-License-Identifier: GPL-2.0
  2. # Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  3. THREADCOUNT=${THREADCOUNT:-$(nproc)}
  4. start_multithread_build() {
  5. local buildopts result=0
  6. # init thread control folder
  7. rm -rf "${THREAD_CONTROL}"
  8. mkdir -p "${THREAD_CONTROL}/locks"
  9. echo -1 >"${THREAD_CONTROL}/progress.prev"
  10. echo 0 >"${THREAD_CONTROL}/progress"
  11. touch "${THREAD_CONTROL}/status"
  12. # Increase file descriptors if building one thread/package
  13. [ "${THREADCOUNT}" = "0" ] && ulimit -n ${ULIMITN:-10240}
  14. # create a single log file by default for a single threaded build (or the builder is a masochist)
  15. if [ ${THREADCOUNT} -eq 1 -a "${ONELOG,,}" != "no" ] || [ "${ONELOG,,}" = "yes" ]; then
  16. buildopts+=" --no-log-burst"
  17. else
  18. mkdir -p "${THREAD_CONTROL}/logs"
  19. buildopts+=" --log-burst"
  20. fi
  21. buildopts+=" --log-combine ${LOGCOMBINE:-always}"
  22. [ "${AUTOREMOVE}" = "yes" ] && buildopts+=" --auto-remove"
  23. # When building addons, don't halt on error - keep building all packages/addons
  24. [ "${MTADDONBUILD}" = "yes" ] && buildopts+=" --continue-on-error" || buildopts+=" --halt-on-error"
  25. [ "${MTPROGRESS}" = "yes" ] && buildopts+=" --progress"
  26. [ "${MTVERBOSE}" = "yes" ] && buildopts+=" --verbose"
  27. [ "${MTDEBUG}" = "yes" ] && buildopts+=" --debug"
  28. if [ "${DISABLE_COLORS}" = "yes" ]; then
  29. buildopts+=" --colors=never"
  30. else
  31. buildopts+=" --colors=${MTCOLORS:-auto}"
  32. fi
  33. [ "${MTBOOKENDS}" = "no" ] && buildopts+=" --without-bookends" || buildopts+=" --with-bookends"
  34. [ "${MTIMMEDIATE}" = "no" ] && buildopts+=" --fail-after-active" || buildopts+=" --fail-immediately"
  35. buildopts+=" --stats-interval ${MTINTERVAL:-60}"
  36. # pipefail: return value of a pipeline is the value of the last (rightmost) command to exit with a non-zero status
  37. set -o pipefail
  38. ${SCRIPTS}/pkgjson | ${SCRIPTS}/genbuildplan.py --show-wants --with-json "${THREAD_CONTROL}"/plan.json \
  39. --build ${@} > "${THREAD_CONTROL}"/plan || result=1
  40. if [ ${result} -eq 0 ]; then
  41. save_build_config
  42. # export the following vars so that they will be available to subprocesses of pkgbuilder.py
  43. export ROOT SCRIPTS THREAD_CONTROL
  44. MTBUILDSTART=$(date +%s) MTWITHLOCKS=yes ${SCRIPTS}/pkgbuilder.py \
  45. --plan "${THREAD_CONTROL}"/plan.json \
  46. --joblog "${THREAD_CONTROL}"/joblog \
  47. --loadstats "${THREAD_CONTROL}"/loadstats \
  48. --max-procs ${THREADCOUNT} ${buildopts} || result=1
  49. [ ${result} -eq 0 -a -f "${THREAD_CONTROL}"/history ] && echo && cat "${THREAD_CONTROL}"/history | ${ROOT}/tools/mtstats.py
  50. rm -f "${THREAD_CONTROL}/parallel.pid"
  51. fi
  52. set +o pipefail
  53. return ${result}
  54. }