Advertisement
Guest User

Untitled

a guest
Jan 9th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 76.14 KB | None | 0 0
  1. From 7a41595fd89aa1b5891aff16b60c13fccf16db69 Mon Sep 17 00:00:00 2001
  2. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  3. Date: Sat, 5 Jan 2019 02:31:32 +0000
  4. Subject: [PATCH 01/16] config/functions: allow package to be sourced using
  5. path
  6.  
  7. ---
  8. config/functions | 2 +-
  9. 1 file changed, 1 insertion(+), 1 deletion(-)
  10.  
  11. diff --git a/config/functions b/config/functions
  12. index d65763f..e9ef799 100644
  13. --- a/config/functions
  14. +++ b/config/functions
  15. @@ -845,7 +845,7 @@ source_package() {
  16. unset_functions
  17.  
  18. if [ -n "${1}" ]; then
  19. - PKG_DIR="$(get_pkg_directory ${1})"
  20. + [ -f "${1}" ] && PKG_DIR="$(dirname "${1}")" || PKG_DIR="$(get_pkg_directory "${1}")"
  21.  
  22. [ -n "$PKG_DIR" -a -r $PKG_DIR/package.mk ] || die "FAILURE: unable to source package - ${1}/package.mk does not exist"
  23.  
  24. --
  25. 2.14.1
  26.  
  27.  
  28. From ff6ca106c6469649e16518fe542a9bb02596b5c9 Mon Sep 17 00:00:00 2001
  29. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  30. Date: Sat, 5 Jan 2019 02:34:45 +0000
  31. Subject: [PATCH 02/16] config/functions: add pkg_lock helpers
  32.  
  33. ---
  34. config/functions | 46 +++++++++++++++++++++++++++++++++++++++++++++-
  35. 1 file changed, 45 insertions(+), 1 deletion(-)
  36.  
  37. diff --git a/config/functions b/config/functions
  38. index e9ef799..594a2c2 100644
  39. --- a/config/functions
  40. +++ b/config/functions
  41. @@ -1155,7 +1155,7 @@ add_group() {
  42. }
  43.  
  44. # Usage: enable_service <unit> [target]
  45. -enable_service () {
  46. +enable_service() {
  47. local unit="$1"
  48. local unit_dir="/usr/lib/systemd/system"
  49. local target="$2"
  50. @@ -1177,6 +1177,50 @@ enable_service () {
  51. done
  52. }
  53.  
  54. +# Prevent concurrent modifications to a package (unpack) or
  55. +# package:target (install/build).
  56. +#
  57. +# If a package is already locked and the owner is ourselves
  58. +# then assume we already have the required lock.
  59. +pkg_lock() {
  60. + [ -z ${MTJOBID} ] && return 0
  61. +
  62. + local pkg="$1" mode="$2"
  63. + local this_job="${MTJOBID:-0}"
  64. + local lock_job lock_mode lock_pkg
  65. +
  66. + mkdir -p "${THREAD_CONTROL}/locks"
  67. + exec 99>"${THREAD_CONTROL}/locks/${pkg}.${mode}"
  68. + if ! flock --nonblock --exclusive 99; then
  69. + while [ : ]; do
  70. + read -r lock_job lock_mode lock_pkg <<<$(cat "${THREAD_CONTROL}/locks/${pkg}.${mode}.owner" 2>/dev/null)
  71. + [ -n "${lock_job}" ] && break || sleep 1
  72. + done
  73. +
  74. + if [ ${lock_job} != ${this_job} ]; then
  75. + pkg_lock_msg "${pkg}" "${mode}" "STALLED" "$(printf "waiting on [%02d] %s %s" ${lock_job} "${lock_mode}" "${lock_pkg}")"
  76. + flock --exclusive 99
  77. + fi
  78. + fi
  79. +
  80. + pkg_lock_msg "${pkg}" "${mode}" "LOCKED"
  81. + echo "${this_job} ${mode} ${pkg}" >"${THREAD_CONTROL}/locks/${pkg}.${mode}.owner"
  82. +}
  83. +
  84. +# Log additional information for a locked package.
  85. +pkg_lock_msg() {
  86. + [ -z ${MTJOBID} ] && return 0
  87. +
  88. + local pkg="$1" mode="$2" status="$3" msg="$4"
  89. + local this_job="${MTJOBID:-0}"
  90. +
  91. + if [ -n "${msg}" ]; then
  92. + printf "%s: <%05d> [%02d/%0*d] %-7s %-7s %s (%s)\n" "$(date +%Y-%m-%d\ %H:%M:%S.%N)" $$ ${this_job} ${#MTMAXJOBS} ${PARALLEL_SEQ:-0} "${status}" "${mode}" "${pkg}" "${msg}" >>"${THREAD_CONTROL}/history"
  93. + else
  94. + printf "%s: <%05d> [%02d/%0*d] %-7s %-7s %s\n" "$(date +%Y-%m-%d\ %H:%M:%S.%N)" $$ ${this_job} ${#MTMAXJOBS} ${PARALLEL_SEQ:-0} "${status}" "${mode}" "${pkg}" >>"${THREAD_CONTROL}/history"
  95. + fi
  96. +}
  97. +
  98. # Use distribution functions if any
  99. if [ -f "distributions/$DISTRO/config/functions" ]; then
  100. . distributions/$DISTRO/config/functions
  101. --
  102. 2.14.1
  103.  
  104.  
  105. From 0c83a7bc550c356e56f69ea41d6d5a544792a027 Mon Sep 17 00:00:00 2001
  106. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  107. Date: Sat, 5 Jan 2019 02:35:53 +0000
  108. Subject: [PATCH 03/16] config/path: add THREAD_CONTROL directory
  109.  
  110. ---
  111. config/path | 2 ++
  112. 1 file changed, 2 insertions(+)
  113.  
  114. diff --git a/config/path b/config/path
  115. index 1f1080b..c5c116f 100644
  116. --- a/config/path
  117. +++ b/config/path
  118. @@ -29,6 +29,8 @@ if [ -n "$BUILD_SUFFIX" ]; then
  119. BUILD=$BUILD-$BUILD_SUFFIX
  120. fi
  121.  
  122. +THREAD_CONTROL=${BUILD}/.threads
  123. +
  124. TARGET_ADDONS="$TARGET_IMG/$ADDONS/$ADDON_PATH"
  125. ADDON_BUILD="$BUILD/$ADDONS/$1"
  126. STAMPS_NOARCH=.stamps
  127. --
  128. 2.14.1
  129.  
  130.  
  131. From cdd81f60d265bee1385ee1b85e53e5522521673b Mon Sep 17 00:00:00 2001
  132. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  133. Date: Sun, 6 Jan 2019 04:55:48 +0000
  134. Subject: [PATCH 04/16] config/path: stop logging patch progress to stderr when
  135. stdout is fine
  136.  
  137. ---
  138. config/path | 2 +-
  139. 1 file changed, 1 insertion(+), 1 deletion(-)
  140.  
  141. diff --git a/config/path b/config/path
  142. index c5c116f..98b8e91 100644
  143. --- a/config/path
  144. +++ b/config/path
  145. @@ -91,7 +91,7 @@ if [ -z "${SILENT_OUT}" -a -z "${VERBOSE_OUT}" ]; then
  146.  
  147. if [ "$VERBOSE" = yes ]; then
  148. exec 3>&1
  149. - exec 4>&2
  150. + exec 4>&1
  151. else
  152. exec 3>&2
  153. exec 4>/dev/null
  154. --
  155. 2.14.1
  156.  
  157.  
  158. From 7e3c7e21d50e7620dfd0725cf1d2e6944c876468 Mon Sep 17 00:00:00 2001
  159. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  160. Date: Sun, 6 Jan 2019 05:43:26 +0000
  161. Subject: [PATCH 05/16] config/path: VERBOSE_OUT/SILENT_OUT - drop export, need
  162. to exec for every parallel process
  163.  
  164. ---
  165. config/path | 22 ++++++++++------------
  166. 1 file changed, 10 insertions(+), 12 deletions(-)
  167.  
  168. diff --git a/config/path b/config/path
  169. index 98b8e91..134f7ca 100644
  170. --- a/config/path
  171. +++ b/config/path
  172. @@ -84,18 +84,16 @@ fi
  173. VERSION_SUFFIX=$TARGET_ARCH
  174.  
  175. # redirect formatted output
  176. -if [ -z "${SILENT_OUT}" -a -z "${VERBOSE_OUT}" ]; then
  177. - export BUILD_INDENT_SIZE=4
  178. - export SILENT_OUT=3
  179. - export VERBOSE_OUT=4
  180. -
  181. - if [ "$VERBOSE" = yes ]; then
  182. - exec 3>&1
  183. - exec 4>&1
  184. - else
  185. - exec 3>&2
  186. - exec 4>/dev/null
  187. - fi
  188. +export BUILD_INDENT_SIZE=4
  189. +SILENT_OUT=3
  190. +VERBOSE_OUT=4
  191. +
  192. +if [ "$VERBOSE" = yes ]; then
  193. + exec 3>&1
  194. + exec 4>&1
  195. +else
  196. + exec 3>&2
  197. + exec 4>/dev/null
  198. fi
  199.  
  200. unset LD_LIBRARY_PATH
  201. --
  202. 2.14.1
  203.  
  204.  
  205. From c591f0cdbdf76e20fe035c79e02debfaebcf8e61 Mon Sep 17 00:00:00 2001
  206. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  207. Date: Sat, 5 Jan 2019 02:37:33 +0000
  208. Subject: [PATCH 06/16] build system: add parallel build support
  209.  
  210. ---
  211. config/multithread | 119 ++++++++
  212. packages/devel/parallel/package.mk | 11 +
  213. scripts/build | 30 +-
  214. scripts/genpkglist.py | 299 ++++++++++++++++++++
  215. scripts/image_mt | 561 +++++++++++++++++++++++++++++++++++++
  216. scripts/install | 9 +-
  217. scripts/unpack | 25 +-
  218. 7 files changed, 1033 insertions(+), 21 deletions(-)
  219. create mode 100644 config/multithread
  220. create mode 100644 packages/devel/parallel/package.mk
  221. create mode 100755 scripts/genpkglist.py
  222. create mode 100755 scripts/image_mt
  223.  
  224. diff --git a/config/multithread b/config/multithread
  225. new file mode 100644
  226. index 0000000..dd17d6a
  227. --- /dev/null
  228. +++ b/config/multithread
  229. @@ -0,0 +1,119 @@
  230. +# SPDX-License-Identifier: GPL-2.0-or-later
  231. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  232. +
  233. +THREADCOUNT=${THREADCOUNT:-100%}
  234. +
  235. +BUILD_STEPS=()
  236. +
  237. +add_pkg_step() {
  238. + BUILD_STEPS+=( $1/$2 )
  239. +}
  240. +
  241. +get_pkg_steps() {
  242. + local filter="$1"
  243. + local step package
  244. + local steps=()
  245. +
  246. + for step in "${BUILD_STEPS[@]}"; do
  247. + [[ ${step} =~ ^${filter}/ ]] && steps+=( "${step#*/}" )
  248. + done
  249. + echo "${steps[@]}"
  250. +}
  251. +
  252. +# This function is passed a list of package.mk paths to be processed.
  253. +# Each package.mk is sourced with relevant variables output in JSON format.
  254. +json_worker() {
  255. + local packages="$@"
  256. + local pkgpath hierarchy
  257. +
  258. + exit() { :; }
  259. +
  260. + . config/options ""
  261. +
  262. + for pkgpath in ${packages}; do
  263. + pkgpath="${pkgpath%%@*}"
  264. + source_package "${pkgpath}/package.mk" &>/dev/null
  265. + [[ ${pkgpath} =~ ^${ROOT}/${PACKAGES}/ ]] && hierarchy="global" || hierarchy="local"
  266. +
  267. + if [ -n "$PKG_ARCH" ]; then
  268. + listcontains "$PKG_ARCH" "!$TARGET_ARCH" && continue
  269. + listcontains "$PKG_ARCH" "$TARGET_ARCH" || listcontains "$PKG_ARCH" "any" || continue
  270. + fi
  271. +
  272. + cat <<EOF
  273. + {
  274. + "name": "${PKG_NAME}",
  275. + "hierarchy": "${hierarchy}",
  276. + "bootstrap": "${PKG_DEPENDS_BOOTSTRAP}",
  277. + "init": "${PKG_DEPENDS_INIT}",
  278. + "host": "${PKG_DEPENDS_HOST}",
  279. + "target": "${PKG_DEPENDS_TARGET}"
  280. + },
  281. +EOF
  282. + done
  283. +}
  284. +export -f json_worker
  285. +
  286. +# This function is passed the build instruction for a single job.
  287. +# The function will run either "build <package>" or "install <package>".
  288. +# ${slot} is the job slot number, ie. 1-8 when THREADCOUNT=8.
  289. +# ${job} is the sequence within the total number of ${jobs}.
  290. +package_worker() {
  291. + local slot=$1 job=$2 jobs=$3 args="$4"
  292. + local task pkgname result status
  293. +
  294. + echo "${job} ${args}" >>${THREAD_CONTROL}/steps
  295. +
  296. + read -r task pkgname <<<$(echo "${args}")
  297. +
  298. + MTJOBID=${slot} MTMAXJOBS=${jobs} $SCRIPTS/${task} ${pkgname} 2>&1
  299. +
  300. + result=$?
  301. +
  302. + [ ${result} -eq 0 ] && status="DONE" || status="FAIL"
  303. +
  304. + (
  305. + flock --exclusive 99
  306. + num=$(($(cat "${THREAD_CONTROL}/progress") + 1))
  307. + echo "${num}" >"${THREAD_CONTROL}/progress"
  308. + printf "[%0*d/%0*d] [%-4s] %-7s %s\n" ${#jobs} ${num} ${#jobs} ${jobs} "${status}" "${task}" "${pkgname}" >&2
  309. + ) 99<"${THREAD_CONTROL}/progress"
  310. +
  311. + if [ ${result} -ne 0 -a -d "${THREAD_CONTROL}/logs" ]; then
  312. + (
  313. + . config/options ""
  314. + cat >&2 <<EOF
  315. +$(print_color CLR_ERROR "FAILURE: $SCRIPTS/${task} ${pkgname} has failed!\n")
  316. +The following logs for this failure are available:
  317. + stdout: ${THREAD_CONTROL}/logs/${job}/stdout
  318. + stderr: ${THREAD_CONTROL}/logs/${job}/stderr
  319. +EOF
  320. + )
  321. + fi
  322. +
  323. + return ${result}
  324. +}
  325. +export -f package_worker
  326. +
  327. +start_multithread_build() {
  328. + local logbuffer
  329. +
  330. + # init thread control folder
  331. + rm -fr "${THREAD_CONTROL}"
  332. + mkdir -p "${THREAD_CONTROL}"
  333. + echo 0 >"${THREAD_CONTROL}/progress"
  334. +
  335. + [ "${THREADCOUNT}" = "0" ] && THREADCOUNT=1
  336. + if [ "${THREADCOUNT}" = "1" -a "${ONELOG,,}" != "no" ] || [ "${ONELOG,,}" = "yes" ]; then
  337. + logbuffer="--ungroup"
  338. + else
  339. + mkdir -p "${THREAD_CONTROL}/logs"
  340. + logbuffer="--group --results ${THREAD_CONTROL}/logs/{#}/"
  341. + fi
  342. +
  343. + cat ${_CACHE_PACKAGE_GLOBAL} ${_CACHE_PACKAGE_LOCAL} | \
  344. + ${TOOLCHAIN}/bin/parallel --plain --no-notice --max-args 30 json_worker | \
  345. + ${SCRIPTS}/genpkglist.py --build $(get_pkg_steps build) --install $(get_pkg_steps install) | \
  346. + SCRIPTS="${SCRIPTS}" THREAD_CONTROL="${THREAD_CONTROL}" ${TOOLCHAIN}/bin/parallel \
  347. + --plain --no-notice --max-procs ${THREADCOUNT} ${logbuffer} --halt now,fail=1 --plus package_worker {%} {#} {##} {}
  348. +}
  349. diff --git a/packages/devel/parallel/package.mk b/packages/devel/parallel/package.mk
  350. new file mode 100644
  351. index 0000000..99e28ea
  352. --- /dev/null
  353. +++ b/packages/devel/parallel/package.mk
  354. @@ -0,0 +1,11 @@
  355. +# SPDX-License-Identifier: GPL-2.0-or-later
  356. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  357. +
  358. +PKG_NAME="parallel"
  359. +PKG_VERSION="20181222"
  360. +PKG_SHA256="058c9f7cf599652aef5b54cf5c95c9a5b6d57d59ce4deebebf7938f7be4da369"
  361. +PKG_LICENSE="GPLv3"
  362. +PKG_SITE="https://www.gnu.org/software/parallel/"
  363. +PKG_URL="http://ftpmirror.gnu.org/parallel/$PKG_NAME-$PKG_VERSION.tar.bz2"
  364. +PKG_DEPENDS_HOST=""
  365. +PKG_LONGDESC="GNU parallel is a shell tool for executing jobs in parallel using one or more computers."
  366. diff --git a/scripts/build b/scripts/build
  367. index 9032474..46a3927 100755
  368. --- a/scripts/build
  369. +++ b/scripts/build
  370. @@ -32,11 +32,14 @@ if [ "${1//:/}" != "${1}" ]; then
  371. PACKAGE_NAME="${1%:*}"
  372. TARGET="${1#*:}"
  373. else
  374. - PACKAGE_NAME=$1
  375. + PACKAGE_NAME="${1}"
  376. TARGET=
  377. fi
  378. TARGET="${TARGET:-target}"
  379.  
  380. +# virtual packages are not built, so no need to lock
  381. +[ "$PKG_SECTION" != "virtual" ] && pkg_lock "${PACKAGE_NAME}:${TARGET}" build
  382. +
  383. mkdir -p $STAMPS/$PACKAGE_NAME
  384. STAMP=$STAMPS/$PACKAGE_NAME/build_$TARGET
  385. if [ -f $STAMP ]; then
  386. @@ -46,10 +49,11 @@ if [ -f $STAMP ]; then
  387. rm -f $STAMP
  388. elif [ ! "$BUILD_WITH_DEBUG" = "$STAMP_BUILD_WITH_DEBUG" ]; then
  389. rm -f $STAMP
  390. - elif [ "$1" = "u-boot" -a ! "$UBOOT_SYSTEM" = "$STAMP_UBOOT_SYSTEM" ]; then
  391. + elif [ "${PKG_NAME}" = "u-boot" -a ! "$UBOOT_SYSTEM" = "$STAMP_UBOOT_SYSTEM" ]; then
  392. rm -f $STAMP
  393. else
  394. # stamp matched: already built, do nothing
  395. + [ "$PKG_SECTION" != "virtual" ] && pkg_lock_msg "${PKG_NAME}:${TARGET}" "build" "UNLOCK" "already built"
  396. exit 0
  397. fi
  398. fi
  399. @@ -68,13 +72,6 @@ for p in $_pkg_depends; do
  400. $SCRIPTS/build $p
  401. done
  402.  
  403. -# build this package
  404. -if [ "${BUILD_WITH_DEBUG}" = "yes" ]; then
  405. - build_msg "CLR_BUILD" "BUILD" "${PACKAGE_NAME} $(print_color "CLR_TARGET" "(${TARGET})") [DEBUG]" "indent"
  406. -else
  407. - build_msg "CLR_BUILD" "BUILD" "${PACKAGE_NAME} $(print_color "CLR_TARGET" "(${TARGET})")" "indent"
  408. -fi
  409. -
  410. # virtual packages are not built as they only contain dependencies, so dont go further here
  411. if [ "$PKG_SECTION" = "virtual" ]; then
  412. PKG_DEEPHASH=$(calculate_stamp)
  413. @@ -85,6 +82,15 @@ if [ "$PKG_SECTION" = "virtual" ]; then
  414. exit 0
  415. fi
  416.  
  417. +# build this package
  418. +if [ "${BUILD_WITH_DEBUG}" = "yes" ]; then
  419. + build_msg "CLR_BUILD" "BUILD" "${PACKAGE_NAME} $(print_color "CLR_TARGET" "(${TARGET})") [DEBUG]" "indent"
  420. +else
  421. + build_msg "CLR_BUILD" "BUILD" "${PACKAGE_NAME} $(print_color "CLR_TARGET" "(${TARGET})")" "indent"
  422. +fi
  423. +
  424. +pkg_lock_msg "${PKG_NAME}:${TARGET}" "build" "RUNNING"
  425. +
  426. setup_toolchain $TARGET
  427.  
  428. # configure install directory
  429. @@ -224,7 +230,7 @@ if [ -f "$PKG_CONFIGURE_SCRIPT" -o -f "$PKG_CMAKE_SCRIPT" -o -f "$PKG_MESON_SCRI
  430. mkdir -p "$PKG_REAL_BUILD"
  431. cd "$PKG_REAL_BUILD"
  432.  
  433. - MESON_CONF="$PKG_REAL_BUILD/meson.conf"
  434. + MESON_CONF="$PKG_REAL_BUILD/${TARGET}.meson.conf"
  435. fi
  436.  
  437. # configure
  438. @@ -449,6 +455,8 @@ PKG_DEEPHASH=$(calculate_stamp)
  439. for i in PKG_NAME PKG_DEEPHASH BUILD_WITH_DEBUG; do
  440. echo "STAMP_$i=\"${!i}\"" >> $STAMP
  441. done
  442. -if [ "$1" = "u-boot" ]; then
  443. +if [ "${PKG_NAME}" = "u-boot" ]; then
  444. echo "STAMP_UBOOT_SYSTEM=\"${UBOOT_SYSTEM}\"" >> $STAMP
  445. fi
  446. +
  447. +pkg_lock_msg "${PACKAGE_NAME}:${TARGET}" "build" "UNLOCK" "built"
  448. diff --git a/scripts/genpkglist.py b/scripts/genpkglist.py
  449. new file mode 100755
  450. index 0000000..3ab1483
  451. --- /dev/null
  452. +++ b/scripts/genpkglist.py
  453. @@ -0,0 +1,299 @@
  454. +#!/usr/bin/env python
  455. +# -*- coding: utf-8 -*-
  456. +
  457. +# SPDX-License-Identifier: GPL-2.0-or-later
  458. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  459. +
  460. +from __future__ import print_function
  461. +import sys, os, codecs, json, argparse, re
  462. +
  463. +class LibreELEC_Package:
  464. + def __init__(self, name):
  465. + self.name = name
  466. + self.deps = {"bootstrap": [],
  467. + "init": [],
  468. + "host": [],
  469. + "target": []}
  470. + self.wants = []
  471. + self.wantedby = []
  472. +
  473. + def __repr__(self):
  474. + s = "%-9s: %s" % ("name", self.name)
  475. +
  476. + for t in self.deps:
  477. + s = "%s\n%-9s: %s" % (s, t, self.deps[t])
  478. +
  479. + s = "%s\n%-9s: %s" % (s, "NEEDS", self.wants)
  480. + s = "%s\n%-9s: %s" % (s, "WANTED BY", self.wantedby)
  481. +
  482. + return s
  483. +
  484. + def addDependencies(self, target, packages):
  485. + for d in " ".join(packages.split()).split():
  486. + self.deps[target].append(d)
  487. + name = d.split(":")[0]
  488. + if name not in self.wants and name != self.name:
  489. + self.wants.append(name)
  490. +
  491. + def delDependency(self, target, package):
  492. + if package in self.deps[target]:
  493. + self.deps[target].remove(package)
  494. + name = package.split(":")[0]
  495. + if name in self.wants:
  496. + self.wants.remove(name)
  497. +
  498. + def addReference(self, package):
  499. + name = package.split(":")[0]
  500. + if name not in self.wantedby:
  501. + self.wantedby.append(name)
  502. +
  503. + def delReference(self, package):
  504. + name = package.split(":")[0]
  505. + if name in self.wantedby:
  506. + self.wantedby.remove(name)
  507. +
  508. + def isReferenced(self):
  509. + return False if self.wants == [] else True
  510. +
  511. + def isWanted(self):
  512. + return False if self.wantedby == [] else True
  513. +
  514. + def references(self, package):
  515. + return package in self.wants
  516. +
  517. +# Reference material:
  518. +# https://www.electricmonk.nl/docs/dependency_resolving_algorithm/dependency_resolving_algorithm.html
  519. +class Node:
  520. + def __init__(self, name, target):
  521. + self.name = name
  522. + self.target = target
  523. + self.fqname = "%s:%s" % (name, target)
  524. + self.edges = []
  525. +
  526. + def __repr__(self):
  527. + s = "%-9s: %s" % ("name", self.name)
  528. + s = "%s\n%-9s: %s" % (s, "target", self.target)
  529. + s = "%s\n%-9s: %s" % (s, "fqname", self.fqname)
  530. + s = "%s\n%-9s: %s" % (s, "common", self.commonName())
  531. +
  532. + for e in self.edges:
  533. + s = "%s\n%s" % (s, e)
  534. +
  535. + return s
  536. +
  537. + def commonName(self):
  538. + return self.name if self.target == "target" else "%s:%s" % (self.name, self.target)
  539. +
  540. + def addEdge(self, node):
  541. + self.edges.append(node)
  542. +
  543. +def eprint(*args, **kwargs):
  544. + print(*args, file=sys.stderr, **kwargs)
  545. +
  546. +# Read a JSON list of all possible packages from stdin
  547. +def loadPackages():
  548. + jdata = json.loads("[%s]" % sys.stdin.read().replace('\n','')[:-1])
  549. +
  550. + map = {}
  551. +
  552. + # Load "global" packages first
  553. + for pkg in jdata:
  554. + if pkg["hierarchy"] == "global":
  555. + map[pkg["name"]] = initPackage(pkg)
  556. +
  557. + # Then the "local" packages, as these will replace any matching "global" packages
  558. + for pkg in jdata:
  559. + if pkg["hierarchy"] == "local":
  560. + map[pkg["name"]] = initPackage(pkg)
  561. +
  562. + return map
  563. +
  564. +# Create a fully formed LibreELEC_Package object
  565. +def initPackage(package):
  566. + pkg = LibreELEC_Package(package["name"])
  567. +
  568. + for t in ["bootstrap", "init", "host", "target"]:
  569. + pkg.addDependencies(t, package[t])
  570. +
  571. + return pkg
  572. +
  573. +# Split name:target into components
  574. +def split_package(name):
  575. + parts = name.split(":")
  576. + pn = parts[0]
  577. + pt = parts[1] if len(parts) != 1 else "target"
  578. + return (pn, pt)
  579. +
  580. +# Resolve dependencies for a node
  581. +def dep_resolve(node, resolved, unresolved):
  582. + unresolved.append(node)
  583. + for edge in node.edges:
  584. + if edge not in resolved:
  585. + if edge in unresolved:
  586. + raise Exception('Circular reference detected: %s -> %s\nRemove %s from %s package.mk::PKG_DEPENDS_%s' % \
  587. + (node.fqname, edge.commonName(), edge.commonName(), node.name, node.target.upper()))
  588. + dep_resolve(edge, resolved, unresolved)
  589. + if node not in resolved:
  590. + resolved.append(node)
  591. + unresolved.remove(node)
  592. +
  593. +# Return a list of build steps for the trigger packages
  594. +def get_build_steps(nodes, trigger_pkgs, built_pkgs):
  595. + for pkg in [x for x in trigger_pkgs if x]:
  596. + if pkg.find(":") == -1:
  597. + pkg = "%s:target" % pkg
  598. +
  599. + resolved = []
  600. + unresolved = []
  601. +
  602. + if pkg not in nodes:
  603. + raise Exception("Not a valid build or install trigger package: %s" % pkg)
  604. +
  605. + dep_resolve(nodes[pkg], resolved, unresolved)
  606. +
  607. + # Abort if any references remain unresolved
  608. + if unresolved != []:
  609. + eprint("The following dependencies have not been resolved:")
  610. + for dep in unresolved:
  611. + eprint(" %s" % dep)
  612. + raise("Unresolved references")
  613. +
  614. + # Output list of resolved dependencies
  615. + for pkgname in resolved:
  616. + if pkgname not in built_pkgs:
  617. + built_pkgs.append(pkgname)
  618. + task = "build" if pkgname.fqname.endswith(":host") else "install"
  619. + yield("%s %s" % (task, pkgname.fqname))
  620. +
  621. +# Reduce the complete list of packages to a map of those packages that will
  622. +# be needed for the build.
  623. +def processPackages(args, packages, build, install):
  624. +
  625. + # Add dummy "image" package to ensure build/install dependencies are not culled
  626. + pkg = {
  627. + "name": "image",
  628. + "hierarchy": "global",
  629. + "bootstrap": "",
  630. + "init": "",
  631. + "host": " ".join(build),
  632. + "target": "toolchain %s" % " ".join(install)
  633. + }
  634. + packages[pkg["name"]] = initPackage(pkg)
  635. +
  636. + # Resolve reverse references that we can use to ignore unreferenced packages
  637. + for pkgname in packages:
  638. + for opkgname in packages:
  639. + opkg = packages[opkgname]
  640. + if opkg.references(pkgname):
  641. + if pkgname in packages:
  642. + packages[pkgname].addReference(opkgname)
  643. +
  644. + # Identify unused packages
  645. + while True:
  646. + changed = False
  647. + for pkgname in packages:
  648. + pkg = packages[pkgname]
  649. + if pkg.isWanted():
  650. + for opkgname in pkg.wantedby:
  651. + if opkgname != "image":
  652. + if not packages[opkgname].isWanted():
  653. + pkg.delReference(opkgname)
  654. + changed = True
  655. + if not changed:
  656. + break
  657. +
  658. + # Create a new map of "needed" packages
  659. + needed_map = {}
  660. + for pkgname in packages:
  661. + pkg = packages[pkgname]
  662. + if pkg.isWanted():
  663. + needed_map[pkgname] = pkg
  664. +
  665. + # Validate package dependency references
  666. + for pkgname in needed_map:
  667. + pkg = needed_map[pkgname]
  668. + for t in pkg.deps:
  669. + for d in pkg.deps[t]:
  670. + if split_package(d)[0] not in needed_map:
  671. + msg = 'Invalid package reference: dependency %s in package %s::PKG_DEPENDS_%s is not valid' % (d, pkgname, t.upper())
  672. + if args.warn_invalid:
  673. + eprint("WARNING: %s" % msg)
  674. + else:
  675. + raise Exception(msg)
  676. +
  677. + node_map = {}
  678. +
  679. + # Convert all packages to target-specific nodes
  680. + for pkgname in needed_map:
  681. + pkg = needed_map[pkgname]
  682. + for target in pkg.deps:
  683. + if pkg.deps[target]:
  684. + node = Node(pkgname, target)
  685. + node_map[node.fqname] = node
  686. +
  687. + # Ensure all referenced dependencies exist as a basic node
  688. + for pkgname in needed_map:
  689. + pkg = needed_map[pkgname]
  690. + for target in pkg.deps:
  691. + for dep in pkg.deps[target]:
  692. + dfq = dep if dep.find(":") != -1 else "%s:target" % dep
  693. + if dfq not in node_map:
  694. + node_map[dfq] = Node(split_package(dfq)[0], split_package(dfq)[1])
  695. +
  696. + # To each target-specific node, add the correspnding
  697. + # target-specific dependency nodes ("edges")
  698. + for name in node_map:
  699. + node = node_map[name]
  700. + if node.name not in needed_map:
  701. + if args.warn_invalid:
  702. + continue
  703. + else:
  704. + raise Exception("Invalid package, package name cannot found: %s" % node.name)
  705. + for dep in needed_map[node.name].deps[node.target]:
  706. + dfq = dep if dep.find(":") != -1 else "%s:target" % dep
  707. + node.addEdge(node_map[dfq])
  708. +
  709. + return node_map
  710. +
  711. +#---------------------------------------------
  712. +parser = argparse.ArgumentParser(description="Generate package dependency list for the requested build/install packages. \
  713. + Package data will be read from stdin in JSON format.", \
  714. + formatter_class=lambda prog: argparse.HelpFormatter(prog,max_help_position=25,width=90))
  715. +
  716. +parser.add_argument("-b", "--build", nargs="*", metavar="PACKAGES", required=True, \
  717. + help="Space-separated list of build trigger packages that must be built for the host. Required property - specify at least one package.")
  718. +
  719. +parser.add_argument("-i", "--install", nargs="*", metavar="PACKAGES", \
  720. + help="Space-separated list of install trigger packages that must be built AND also installed for the target. If not specified, default to the same as --build.")
  721. +
  722. +parser.add_argument("--warn-invalid", action="store_true", \
  723. + help="Warn about invalid dependency packages, perhaps excluded by PKG_ARCH incompatability. Default is to abort.")
  724. +
  725. +args = parser.parse_args()
  726. +
  727. +if args.build and not args.install:
  728. + args.install = args.build
  729. +
  730. +ALL_PACKAGES = loadPackages()
  731. +
  732. +loaded = len(ALL_PACKAGES)
  733. +
  734. +REQUIRED_PKGS = processPackages(args, ALL_PACKAGES, args.build, args.install)
  735. +
  736. +# Output list of packages to build/install
  737. +built_pkgs = []
  738. +steps = []
  739. +for step in get_build_steps(REQUIRED_PKGS, args.build, built_pkgs):
  740. + steps.append(step)
  741. +for step in get_build_steps(REQUIRED_PKGS, args.install, built_pkgs):
  742. + steps.append(step)
  743. +
  744. +eprint("Packages loaded : %d" % loaded)
  745. +eprint("Build triggers : %2d [%s]" % (len(args.build), " ".join(args.build)))
  746. +eprint("Install triggers: %2d [%s]" % (len(args.install), " ".join(args.install)))
  747. +eprint("Package steps : %d" % len(steps))
  748. +eprint("")
  749. +
  750. +# Output build/install steps
  751. +for step in steps:
  752. + print(step)
  753. diff --git a/scripts/image_mt b/scripts/image_mt
  754. new file mode 100755
  755. index 0000000..f0a0b9c
  756. --- /dev/null
  757. +++ b/scripts/image_mt
  758. @@ -0,0 +1,561 @@
  759. +#!/bin/bash
  760. +
  761. +# SPDX-License-Identifier: GPL-2.0-or-later
  762. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  763. +
  764. +unset _CACHE_PACKAGE_LOCAL _CACHE_PACKAGE_GLOBAL _DEBUG_DEPENDS_LIST _DEBUG_PACKAGE_LIST
  765. +
  766. +. config/options ""
  767. +. config/multithread
  768. +. config/show_config
  769. +
  770. +show_config
  771. +save_build_config
  772. +
  773. +# Setup both toolchain cmake configs to avoid potentially racy behaviour later,
  774. +# using a fork as we don't want the exports at this stage.
  775. +for t in host target; do
  776. + ( setup_toolchain ${t} )
  777. +done
  778. +
  779. +if [ -n "$CUSTOM_GIT_HASH" ]; then
  780. + GIT_HASH="$CUSTOM_GIT_HASH"
  781. +else
  782. + GIT_HASH=$(git rev-parse HEAD)
  783. +fi
  784. +
  785. +if [ "$LIBREELEC_VERSION" = "devel" ]; then
  786. + GIT_ABBREV=${GIT_HASH:0:7}
  787. + DEVEL_VERSION=$LIBREELEC_VERSION
  788. + case "$BUILD_PERIODIC" in
  789. + nightly) LIBREELEC_VERSION=nightly-$(date +%Y%m%d)-$GIT_ABBREV;;
  790. + daily) LIBREELEC_VERSION=daily-$(date +%Y%j)-$GIT_ABBREV;;
  791. + weekly) LIBREELEC_VERSION=weekly-$(date +%G%V)-$GIT_ABBREV;;
  792. + monthly) LIBREELEC_VERSION=monthly-$(date +%Y%m)-$GIT_ABBREV;;
  793. + *) LIBREELEC_VERSION=devel-$(date +%Y%m%d%H%M%S)-$GIT_ABBREV;;
  794. + esac
  795. +fi
  796. +
  797. +# Get origin url, fix git:// and git@github.com: urls if necessary
  798. +ORIGIN_URL="$(git remote -v | awk '$1 == "origin" { print $2 }' | head -1 | sed 's#\.git$##;s#^git:#https:#;s#^git@github\.com:#https://github.com/#')"
  799. +
  800. +[ "${BUILDER_NAME,,}" = "official" ] && BUILDER_NAME=
  801. +if [ "$OFFICIAL" = "yes" ]; then
  802. + LIBREELEC_BUILD="official"
  803. +else
  804. + if [ -n "$BUILDER_NAME" ]; then
  805. + LIBREELEC_BUILD="$BUILDER_NAME"
  806. + else
  807. + LIBREELEC_BUILD="community"
  808. + fi
  809. +fi
  810. +
  811. +if [ -n "$CUSTOM_VERSION" ]; then
  812. + LIBREELEC_VERSION="$CUSTOM_VERSION"
  813. +fi
  814. +
  815. +LIBREELEC_ARCH="${DEVICE:-$PROJECT}.$TARGET_ARCH"
  816. +TARGET_VERSION="$LIBREELEC_ARCH-$LIBREELEC_VERSION"
  817. +
  818. +if [ -n "$CUSTOM_IMAGE_NAME" ]; then
  819. + IMAGE_NAME="$CUSTOM_IMAGE_NAME"
  820. +else
  821. + if [ "$DEVEL_VERSION" = "devel" ]; then
  822. + IMAGE_NAME="$DISTRONAME-$LIBREELEC_ARCH-$OS_VERSION-$LIBREELEC_VERSION"
  823. + else
  824. + IMAGE_NAME="$DISTRONAME-$TARGET_VERSION"
  825. + fi
  826. +
  827. + if [ -n "$UBOOT_SYSTEM" ] && [ "$UBOOT_SYSTEM" != "${DEVICE:-$PROJECT}" ]; then
  828. + IMAGE_NAME="$IMAGE_NAME-$UBOOT_SYSTEM"
  829. + fi
  830. +fi
  831. +
  832. +if [ -n "$IMAGE_SUFFIX" ]; then
  833. + IMAGE_NAME="$IMAGE_NAME-$IMAGE_SUFFIX"
  834. +fi
  835. +
  836. +echo "$IMAGE_NAME" > $BUILD/BUILD_FILENAME
  837. +
  838. +# setup fakeroot
  839. +rm -rf $FAKEROOT_SCRIPT # remove $FAKEROOT_SCRIPT if it exist
  840. +touch $FAKEROOT_SCRIPT # create an empty $FAKEROOT_SCRIPT
  841. +chmod +x $FAKEROOT_SCRIPT # make $FAKEROOT_SCRIPT executable
  842. +echo "chown -R 0:0 $INSTALL" >> $FAKEROOT_SCRIPT
  843. +
  844. +# clean old install dirs
  845. +rm -rf $INSTALL
  846. +rm -rf $STAMPS_INSTALL
  847. +mkdir -p $INSTALL
  848. +
  849. +# create baselayout
  850. +for directory in etc dev proc run sys tmp usr var flash storage; do
  851. + mkdir -p $INSTALL/$directory
  852. +done
  853. +ln -sf /var/media $INSTALL/media
  854. +ln -sf /usr/lib $INSTALL/lib
  855. +ln -sf /usr/bin $INSTALL/bin
  856. +ln -sf /usr/sbin $INSTALL/sbin
  857. +
  858. +if [ "$TARGET_ARCH" = "x86_64" ]; then
  859. + ln -s /usr/lib $INSTALL/lib64
  860. + ln -s /usr/lib $INSTALL/usr/lib64
  861. +fi
  862. +
  863. +echo "$TARGET_VERSION" > $INSTALL/etc/release
  864. +
  865. +# create /etc/os-release
  866. +echo -e "NAME=\"$DISTRONAME\"" > $INSTALL/etc/os-release
  867. +echo -e "VERSION=\"$LIBREELEC_VERSION\"" >> $INSTALL/etc/os-release
  868. +echo -e "ID=\"libreelec\"" >> $INSTALL/etc/os-release
  869. +echo -e "VERSION_ID=\"$OS_VERSION\"" >> $INSTALL/etc/os-release
  870. +echo -e "PRETTY_NAME=\"$DISTRONAME ($LIBREELEC_BUILD): $LIBREELEC_VERSION\"" >> $INSTALL/etc/os-release
  871. +echo -e "HOME_URL=\"https://libreelec.tv\"" >> $INSTALL/etc/os-release
  872. +echo -e "BUG_REPORT_URL=\"$ORIGIN_URL\"" >> $INSTALL/etc/os-release
  873. +echo -e "BUILD_ID=\"$GIT_HASH\"" >> $INSTALL/etc/os-release
  874. +echo -e "OPENELEC_ARCH=\"$LIBREELEC_ARCH\"" >> $INSTALL/etc/os-release
  875. +echo -e "LIBREELEC_ARCH=\"$LIBREELEC_ARCH\"" >> $INSTALL/etc/os-release
  876. +echo -e "LIBREELEC_BUILD=\"$LIBREELEC_BUILD\"" >> $INSTALL/etc/os-release
  877. +echo -e "LIBREELEC_PROJECT=\"$PROJECT\"" >> $INSTALL/etc/os-release
  878. +[ -n "$DEVICE" ] && echo -e "LIBREELEC_DEVICE=\"$DEVICE\"" >> $INSTALL/etc/os-release
  879. +[ -n "$BUILDER_NAME" ] && echo -e "BUILDER_NAME=\"$BUILDER_NAME\"" >> $INSTALL/etc/os-release
  880. +[ -n "$BUILDER_VERSION" ] && echo -e "BUILDER_VERSION=\"$BUILDER_VERSION\"" >> $INSTALL/etc/os-release
  881. +
  882. +# create /etc/issue
  883. +echo "$GREETING0" > $INSTALL/etc/issue
  884. +echo "$GREETING1" >> $INSTALL/etc/issue
  885. +echo "$GREETING2" >> $INSTALL/etc/issue
  886. +echo "$GREETING3" >> $INSTALL/etc/issue
  887. +echo "$GREETING4" >> $INSTALL/etc/issue
  888. +echo "$DISTRONAME ($LIBREELEC_BUILD): $LIBREELEC_VERSION ($LIBREELEC_ARCH)" >> $INSTALL/etc/issue
  889. +
  890. +ln -sf /etc/issue $INSTALL/etc/motd
  891. +
  892. +#export _CACHED_KERNEL_MODULE_DIR="$(get_module_dir)"
  893. +
  894. +add_pkg_step build toolchain
  895. +add_pkg_step build squashfs:host
  896. +add_pkg_step build dosfstools:host
  897. +add_pkg_step build fakeroot:host
  898. +add_pkg_step build kmod:host
  899. +add_pkg_step build mtools:host
  900. +add_pkg_step build populatefs:host
  901. +
  902. +# populate base system...
  903. +add_pkg_step install libc
  904. +add_pkg_step install gcc
  905. +
  906. +add_pkg_step install linux
  907. +
  908. +add_pkg_step install linux-drivers
  909. +add_pkg_step install linux-firmware
  910. +add_pkg_step install $BOOTLOADER
  911. +add_pkg_step install busybox
  912. +add_pkg_step install util-linux
  913. +add_pkg_step install corefonts
  914. +add_pkg_step install network
  915. +
  916. +# Graphic support
  917. +[ ! "$DISPLAYSERVER" = "no" ] && add_pkg_step install $DISPLAYSERVER
  918. +
  919. +# Multimedia support
  920. +[ ! "$MEDIACENTER" = "no" ] && add_pkg_step install mediacenter
  921. +
  922. +# Sound support
  923. +[ "$ALSA_SUPPORT" = "yes" ] && add_pkg_step install alsa
  924. +
  925. +# Automounter support
  926. +[ "$UDEVIL" = "yes" ] && add_pkg_step install udevil
  927. +
  928. +# EXFAT support
  929. +[ "$EXFAT" = "yes" ] && add_pkg_step install fuse-exfat
  930. +
  931. +# NTFS 3G support
  932. +[ "$NTFS3G" = "yes" ] && add_pkg_step install ntfs-3g_ntfsprogs
  933. +
  934. +# Remote support
  935. +[ "$REMOTE_SUPPORT" = "yes" ] && add_pkg_step install remote
  936. +
  937. +# Install miscellaneous packages
  938. +add_pkg_step install misc-packages
  939. +
  940. +# Virtual image creation support
  941. +[ "$PROJECT" = "Generic" ] && add_pkg_step install virtual
  942. +
  943. +# Installer support
  944. +[ "$INSTALLER_SUPPORT" = "yes" ] && add_pkg_step install installer
  945. +
  946. +# Devtools... (not for Release)
  947. +[ "$TESTING" = "yes" ] && add_pkg_step install testing
  948. +
  949. +# Install gdb in all builds, including releases
  950. +add_pkg_step install debug
  951. +
  952. +# OEM packages
  953. +[ "$OEM_SUPPORT" = "yes" ] && add_pkg_step install oem
  954. +
  955. +# Bootstrap the parallel package
  956. +$SCRIPTS/build parallel:host 2>&1
  957. +
  958. +start_multithread_build || die "Parallel build failure - see log for details."
  959. +
  960. +echo "Successful build, creating image..." >&2
  961. +
  962. +# copy PROJECT related files to filesystem
  963. +if [ -d "$PROJECT_DIR/$PROJECT/filesystem" ]; then
  964. + cp -PR $PROJECT_DIR/$PROJECT/filesystem/* $INSTALL
  965. + # install project specific systemd services
  966. + for service in $PROJECT_DIR/$PROJECT/filesystem/usr/lib/systemd/system/*.service; do
  967. + if [ -f "$service" ]; then
  968. + enable_service $(basename $service)
  969. + fi
  970. + done
  971. +fi
  972. +
  973. +# copy DEVICE related files to filesystem
  974. +if [ -n "$DEVICE" -a -d "$PROJECT_DIR/$PROJECT/devices/$DEVICE/filesystem" ]; then
  975. + cp -PR $PROJECT_DIR/$PROJECT/devices/$DEVICE/filesystem/* $INSTALL
  976. + # install device specific systemd services
  977. + for service in $PROJECT_DIR/$PROJECT/devices/$DEVICE/filesystem/usr/lib/systemd/system/*.service; do
  978. + if [ -f "$service" ]; then
  979. + enable_service $(basename $service)
  980. + fi
  981. + done
  982. +fi
  983. +
  984. +# run depmod for base overlay modules
  985. +MODVER=$(basename $(ls -d $INSTALL/usr/lib/kernel-overlays/base/lib/modules/*))
  986. +find $INSTALL/usr/lib/kernel-overlays/base/lib/modules/$MODVER/ -name *.ko | \
  987. + sed -e "s,$INSTALL/usr/lib/kernel-overlays/base/lib/modules/$MODVER/,," \
  988. + > $INSTALL/usr/lib/kernel-overlays/base/lib/modules/$MODVER/modules.order
  989. +$TOOLCHAIN/bin/depmod -b $INSTALL/usr/lib/kernel-overlays/base -a -e -F "$BUILD/linux-$(kernel_version)/System.map" $MODVER 2>&1
  990. +
  991. +# strip kernel modules
  992. +for MOD in $(find $INSTALL/usr/lib/kernel-overlays/ -type f -name *.ko); do
  993. + ${TARGET_KERNEL_PREFIX}strip --strip-debug $MOD
  994. +done
  995. +
  996. +# symlink overlayed modules to /usr/lib/modules
  997. +ln -sT /var/lib/modules $INSTALL/usr/lib/modules
  998. +
  999. +# symlink overlayed firmware to /usr/lib/firmware
  1000. +ln -sT /var/lib/firmware $INSTALL/usr/lib/firmware
  1001. +
  1002. +# make target dir
  1003. +mkdir -p $TARGET_IMG
  1004. +rm -rf $TARGET_IMG/$IMAGE_NAME.kernel
  1005. +
  1006. +# copy kernel to target dir
  1007. +cp -PR $BUILD/linux-$(kernel_version)/arch/$TARGET_KERNEL_ARCH/boot/$KERNEL_TARGET $TARGET_IMG/$IMAGE_NAME.kernel
  1008. +chmod 0644 $TARGET_IMG/$IMAGE_NAME.kernel
  1009. +
  1010. +# Set mksquashfs options for each compression method
  1011. +if [ -z "$SQUASHFS_COMPRESSION_OPTION" ]; then
  1012. + if [ "${SQUASHFS_COMPRESSION:-gzip}" = "gzip" ]; then
  1013. + SQUASHFS_COMPRESSION_OPTION="-Xcompression-level 9 -b 262144"
  1014. + elif [ "$SQUASHFS_COMPRESSION" = "lzo" ]; then
  1015. + SQUASHFS_COMPRESSION_OPTION="-Xcompression-level 9 -b 524288"
  1016. + elif [ "$SQUASHFS_COMPRESSION" = "zstd" ]; then
  1017. + SQUASHFS_COMPRESSION_OPTION="-Xcompression-level 22 -b 262144"
  1018. + fi
  1019. +fi
  1020. +
  1021. +# create squashfs file, default to gzip if no compression configured
  1022. +echo "rm -rf \"$TARGET_IMG/$IMAGE_NAME.system\"" >> $FAKEROOT_SCRIPT
  1023. +echo "$TOOLCHAIN/bin/mksquashfs \"$BUILD/image/system\" \"$TARGET_IMG/$IMAGE_NAME.system\" -noappend -comp ${SQUASHFS_COMPRESSION:-gzip} ${SQUASHFS_COMPRESSION_OPTION}" >> $FAKEROOT_SCRIPT
  1024. +
  1025. +# run fakeroot
  1026. +$TOOLCHAIN/bin/fakeroot -- $FAKEROOT_SCRIPT
  1027. +rm -rf $FAKEROOT_SCRIPT
  1028. +
  1029. +# set permissions
  1030. +chmod 0644 $TARGET_IMG/$IMAGE_NAME.system
  1031. +
  1032. +if [ "$1" = "release" -o "$1" = "mkimage" -o "$1" = "amlpkg" -o "$1" = "noobs" ]; then
  1033. +
  1034. + RELEASE_DIR="target/$IMAGE_NAME"
  1035. +
  1036. + # cleanup
  1037. + rm -rf $RELEASE_DIR
  1038. +
  1039. + # create release dir
  1040. + mkdir -p $RELEASE_DIR
  1041. +
  1042. + # remove n previous created release image
  1043. + rm -rf $TARGET_IMG/$IMAGE_NAME.img.gz
  1044. +
  1045. + if [ -n "$BOOTLOADER" ]; then
  1046. +
  1047. + BOOTLOADER_DIR="$(get_pkg_directory "$BOOTLOADER")"
  1048. +
  1049. + if [ -d $BOOTLOADER_DIR/files ]; then
  1050. + cp -R $BOOTLOADER_DIR/files/* $RELEASE_DIR
  1051. + fi
  1052. +
  1053. + if find_file_path bootloader/release $BOOTLOADER_DIR/release; then
  1054. + echo "Running $FOUND_PATH"
  1055. + . $FOUND_PATH
  1056. + fi
  1057. + fi
  1058. +
  1059. + cp $ROOT/README* $RELEASE_DIR
  1060. + cp $ROOT/CHANGELOG* $RELEASE_DIR
  1061. + echo "$TARGET_VERSION" > $RELEASE_DIR/RELEASE
  1062. +
  1063. + if [ ! "$MEDIACENTER" = "no" ]; then
  1064. + echo "Kodi commit: $(get_pkg_version $MEDIACENTER)" >> $RELEASE_DIR/RELEASE
  1065. + fi
  1066. +
  1067. + mkdir -p $RELEASE_DIR/licenses
  1068. + cp $ROOT/licenses/* $RELEASE_DIR/licenses
  1069. +
  1070. + mkdir -p $RELEASE_DIR/target
  1071. + cp $TARGET_IMG/$IMAGE_NAME.system $RELEASE_DIR/target/SYSTEM
  1072. + cp $TARGET_IMG/$IMAGE_NAME.kernel $RELEASE_DIR/target/KERNEL
  1073. +
  1074. + # create md5sum's
  1075. + ( cd $RELEASE_DIR;
  1076. + md5sum -t target/SYSTEM > target/SYSTEM.md5;
  1077. + md5sum -t target/KERNEL > target/KERNEL.md5;
  1078. + )
  1079. +
  1080. + # create target directory
  1081. + mkdir -p $TARGET_IMG
  1082. +
  1083. + # remove an previous created release tarball
  1084. + rm -rf $TARGET_IMG/$IMAGE_NAME.tar
  1085. +
  1086. + # create release tarball
  1087. + tar cf $TARGET_IMG/$IMAGE_NAME.tar -C target $IMAGE_NAME
  1088. +
  1089. + # create sha256 checksum of tarball
  1090. + ( cd $TARGET_IMG
  1091. + sha256sum ${IMAGE_NAME}.tar > ${IMAGE_NAME}.tar.sha256
  1092. + )
  1093. +
  1094. + # create image files if requested
  1095. + if [[ ( "$1" = "amlpkg" || "$1" = "noobs" || "$1" = "mkimage" ) && -n "$BOOTLOADER" ]]; then
  1096. + # INSTALL_SRC_DIR can be board specific
  1097. + if [ -n "$DEVICE" -a -d "$PROJECT_DIR/$PROJECT/devices/$DEVICE/install" ]; then
  1098. + INSTALL_SRC_DIR="$PROJECT_DIR/$PROJECT/devices/$DEVICE/install"
  1099. + else
  1100. + INSTALL_SRC_DIR="$PROJECT_DIR/$PROJECT/install"
  1101. + fi
  1102. +
  1103. + # variables used in image script must be passed
  1104. + env \
  1105. + PATH="$PATH:/sbin" \
  1106. + ROOT="$ROOT" \
  1107. + SCRIPTS="$SCRIPTS" \
  1108. + TOOLCHAIN="$TOOLCHAIN" \
  1109. + PROJECT_DIR="$PROJECT_DIR" \
  1110. + PROJECT="$PROJECT" \
  1111. + DEVICE="$DEVICE" \
  1112. + DISTRO="$DISTRO" \
  1113. + TARGET_IMG="$TARGET_IMG" \
  1114. + IMAGE_NAME="$IMAGE_NAME" \
  1115. + INSTALL_SRC_DIR="$INSTALL_SRC_DIR" \
  1116. + BOOTLOADER="$BOOTLOADER" \
  1117. + KERNEL_NAME="$KERNEL_NAME" \
  1118. + TARGET_KERNEL_ARCH="$TARGET_KERNEL_ARCH" \
  1119. + RELEASE_DIR=$RELEASE_DIR \
  1120. + UUID_STORAGE="$(uuidgen)" \
  1121. + DISTRO_BOOTLABEL="$DISTRO_BOOTLABEL" \
  1122. + DISTRO_DISKLABEL="$DISTRO_DISKLABEL" \
  1123. + UBOOT_SYSTEM="$UBOOT_SYSTEM" \
  1124. + UBOOT_VERSION="$UBOOT_VERSION" \
  1125. + EXTRA_CMDLINE="$EXTRA_CMDLINE" \
  1126. + SYSTEM_SIZE="$SYSTEM_SIZE" \
  1127. + SYSTEM_PART_START="$SYSTEM_PART_START" \
  1128. + $SCRIPTS/mkimage
  1129. + fi
  1130. +
  1131. + # cleanup release dir
  1132. + rm -rf $RELEASE_DIR
  1133. +
  1134. + # create WeTek Play (Amlogic) ZIP update and auto-install packages if requested
  1135. + if [ "$1" = "amlpkg" ]; then
  1136. + echo "Creating Amlogic ZIP update package"
  1137. +
  1138. + AML_PKG_DIR="$RELEASE_DIR/ampl-pkg"
  1139. +
  1140. + # create package directory
  1141. + mkdir -p "$AML_PKG_DIR"
  1142. +
  1143. + # copy system and kernel images
  1144. + mkdir -p "$AML_PKG_DIR/system"
  1145. + cp $TARGET_IMG/$IMAGE_NAME.system $AML_PKG_DIR/system/SYSTEM
  1146. + cp $TARGET_IMG/$IMAGE_NAME.kernel $AML_PKG_DIR/KERNEL
  1147. +
  1148. + # copy update-binary and updater-script
  1149. + META_INF_DIR="$AML_PKG_DIR/META-INF/com/google/android"
  1150. + mkdir -p "$META_INF_DIR"
  1151. + cp $INSTALL_SRC_DIR/update-binary $META_INF_DIR
  1152. + cp $INSTALL_SRC_DIR/updater-script $META_INF_DIR
  1153. +
  1154. + # copy other files if any
  1155. + if [ -d "$INSTALL_SRC_DIR/files" ]; then
  1156. + cp -PR $INSTALL_SRC_DIR/files/* $AML_PKG_DIR
  1157. + fi
  1158. +
  1159. + # copy device tree image if any
  1160. + if [ -f "$INSTALL/usr/share/bootloader/dtb.img" ]; then
  1161. + cp "$INSTALL/usr/share/bootloader/dtb.img" $AML_PKG_DIR/dtb.img
  1162. + fi
  1163. +
  1164. + # create the update package
  1165. + pushd "$AML_PKG_DIR" > /dev/null
  1166. + zip -rq update.zip *
  1167. +
  1168. + # sign the update package
  1169. + echo "Signing the update package"
  1170. + mkdir -p sign
  1171. + SIGNAPK_DIR="$ROOT/tools/signapk"
  1172. + java -Xmx1024m -jar $SIGNAPK_DIR/signapk.jar -w $SIGNAPK_DIR/testkey.x509.pem $SIGNAPK_DIR/testkey.pk8 update.zip sign/$IMAGE_NAME-update.zip
  1173. +
  1174. + # create the auto-install package
  1175. + echo "Creating Amlogic ZIP auto-install package"
  1176. + pushd sign > /dev/null
  1177. + echo --update_package=/sdcard/$IMAGE_NAME-update.zip > factory_update_param.aml
  1178. + echo --wipe_data >> factory_update_param.aml
  1179. + echo --wipe_cache >> factory_update_param.aml
  1180. + if [ -f "$INSTALL_SRC_DIR/files/recovery.img" ]; then
  1181. + cp $INSTALL_SRC_DIR/files/recovery.img .
  1182. + fi
  1183. +
  1184. + if [ -f $INSTALL_SRC_DIR/files/aml_autoscript ]; then
  1185. + cp $INSTALL_SRC_DIR/files/aml_autoscript .
  1186. + fi
  1187. +
  1188. + # copy device tree image if any
  1189. + if [ -f "$INSTALL/usr/share/bootloader/dtb.img" ]; then
  1190. + cp "$INSTALL/usr/share/bootloader/dtb.img" .
  1191. + fi
  1192. +
  1193. + zip -q $TARGET_IMG/$IMAGE_NAME.zip *
  1194. +
  1195. + # create sha256 checksum of zip
  1196. + ( cd $TARGET_IMG
  1197. + sha256sum ${IMAGE_NAME}.zip > ${IMAGE_NAME}.zip.sha256
  1198. + )
  1199. +
  1200. + popd > /dev/null
  1201. + popd > /dev/null
  1202. +
  1203. + elif [ "$1" = "noobs" ]; then
  1204. + echo "Creating \"$1\" release tarball..."
  1205. +
  1206. + RELEASE_DIR="$TARGET_IMG/${IMAGE_NAME}-$1"
  1207. +
  1208. + # eg. LibreELEC_RPi, LibreELEC_RPi2 etc.
  1209. + NOOBS_DISTRO="${DISTRONAME}_${DEVICE:-$PROJECT}"
  1210. +
  1211. + # create release dir
  1212. + mkdir -p $RELEASE_DIR/${NOOBS_DISTRO}
  1213. +
  1214. + if [ -f $DISTRO_DIR/$DISTRO/${DISTRONAME}_40x40.png ]; then
  1215. + cp -PR $DISTRO_DIR/$DISTRO/${DISTRONAME}_40x40.png $RELEASE_DIR/${NOOBS_DISTRO}/${NOOBS_DISTRO}.png
  1216. + else
  1217. + cp -PR $DISTRO_DIR/$DISTRO/${DISTRONAME}.png $RELEASE_DIR/${NOOBS_DISTRO}/${NOOBS_DISTRO}.png
  1218. + fi
  1219. + cp -PR $ROOT/config/noobs/os.json $RELEASE_DIR/${NOOBS_DISTRO}
  1220. + cp -PR $ROOT/config/noobs/partition_setup.sh $RELEASE_DIR/${NOOBS_DISTRO}
  1221. + cp -PR $ROOT/config/noobs/partitions.json $RELEASE_DIR/${NOOBS_DISTRO}
  1222. + if [ -d $DISTRO_DIR/$DISTRO/noobs/marketing ]; then
  1223. + tar cf $RELEASE_DIR/${NOOBS_DISTRO}/marketing.tar -C $DISTRO_DIR/$DISTRO/noobs/marketing .
  1224. + else
  1225. + tar cf $RELEASE_DIR/${NOOBS_DISTRO}/marketing.tar -C $ROOT/config/noobs/marketing .
  1226. + fi
  1227. + cp $ROOT/README* $RELEASE_DIR/${NOOBS_DISTRO}
  1228. + cp $ROOT/CHANGELOG $RELEASE_DIR/${NOOBS_DISTRO}/release_notes.txt
  1229. +
  1230. + sed -e "s%@DISTRONAME@%$DISTRONAME%g" \
  1231. + -e "s%@PROJECT@%${DEVICE:-$PROJECT}%g" \
  1232. + -e "s%@LIBREELEC_VERSION@%$LIBREELEC_VERSION%g" \
  1233. + -e "s%@RELEASE_DATE@%$(date +%F)%g" \
  1234. + -e "s%@KERNEL_VERSION@%$(kernel_version)%g" \
  1235. + -e "s%@DESCRIPTION@%$DESCRIPTION%g" \
  1236. + -e "s%@ROOT_PASSWORD@%$ROOT_PASSWORD%g" \
  1237. + -e "s%@NOOBS_SUPPORTED_MODELS@%$NOOBS_SUPPORTED_MODELS%g" \
  1238. + -e "s%@NOOBS_HEX@%$NOOBS_HEX%g" \
  1239. + -i $RELEASE_DIR/${NOOBS_DISTRO}/os.json
  1240. +
  1241. + sed -e "s%@DISTRONAME@%$DISTRONAME%g" \
  1242. + -e "s%@PROJECT@%${DEVICE:-$PROJECT}%g" \
  1243. + -e "s%@SYSTEM_SIZE@%$SYSTEM_SIZE%g" \
  1244. + -i $RELEASE_DIR/${NOOBS_DISTRO}/partitions.json
  1245. +
  1246. + # create System dir
  1247. + mkdir -p $RELEASE_DIR/${NOOBS_DISTRO}/System
  1248. +
  1249. + BOOTLOADER_DIR="$(get_pkg_directory "$BOOTLOADER")"
  1250. + if [ -d $BOOTLOADER_DIR/files/3rdparty/bootloader/ ]; then
  1251. + cp -PR $BOOTLOADER_DIR/files/3rdparty/bootloader/* $RELEASE_DIR/${NOOBS_DISTRO}/System
  1252. + fi
  1253. +
  1254. + # copy Bootloader
  1255. + cp -PR $BUILD/bcm2835-bootloader-*/LICENCE* $RELEASE_DIR/${NOOBS_DISTRO}/System/
  1256. + cp -PR $BUILD/bcm2835-bootloader-*/bootcode.bin $RELEASE_DIR/${NOOBS_DISTRO}/System/
  1257. + cp -PR $BUILD/bcm2835-bootloader-*/fixup_x.dat $RELEASE_DIR/${NOOBS_DISTRO}/System/fixup.dat
  1258. + cp -PR $BUILD/bcm2835-bootloader-*/start_x.elf $RELEASE_DIR/${NOOBS_DISTRO}/System/start.elf
  1259. + [ -f $BUILD/bcm2835-bootloader-*/dt-blob.bin ] && cp -PR $BUILD/bcm2835-bootloader-*/dt-blob.bin $RELEASE_DIR/${NOOBS_DISTRO}/System/dt-blob.bin
  1260. +
  1261. + # copy system files
  1262. + cp $TARGET_IMG/$IMAGE_NAME.system $RELEASE_DIR/${NOOBS_DISTRO}/System/SYSTEM
  1263. + cp $TARGET_IMG/$IMAGE_NAME.kernel $RELEASE_DIR/${NOOBS_DISTRO}/System/kernel.img
  1264. +
  1265. + for dtb in $INSTALL/usr/share/bootloader/*.dtb; do
  1266. + if [ -f $dtb ]; then
  1267. + cp -PR $dtb $RELEASE_DIR/${NOOBS_DISTRO}/System
  1268. + fi
  1269. + done
  1270. +
  1271. + for overlay in $INSTALL/usr/share/bootloader/overlays/*; do
  1272. + if [ -f $overlay ]; then
  1273. + mkdir -p $RELEASE_DIR/${NOOBS_DISTRO}/System/overlays
  1274. + cp -PR $overlay $RELEASE_DIR/${NOOBS_DISTRO}/System/overlays
  1275. + fi
  1276. + done
  1277. +
  1278. + # create md5sum's
  1279. + ( cd $RELEASE_DIR/${NOOBS_DISTRO}/System;
  1280. + md5sum -t SYSTEM > SYSTEM.md5;
  1281. + md5sum -t kernel.img > kernel.img.md5;
  1282. + )
  1283. +
  1284. + # copy additional files
  1285. + mkdir -p $RELEASE_DIR/${NOOBS_DISTRO}/System/licenses
  1286. + cp $ROOT/licenses/* $RELEASE_DIR/${NOOBS_DISTRO}/System/licenses
  1287. +
  1288. + # create Storage dir
  1289. + mkdir -p $RELEASE_DIR/${NOOBS_DISTRO}/Storage
  1290. +
  1291. + # remove any previously created release tarball
  1292. + rm -rf $RELEASE_DIR/${NOOBS_DISTRO}/System.tar.xz
  1293. + rm -rf $RELEASE_DIR/${NOOBS_DISTRO}/Storage.tar.xz
  1294. +
  1295. + # create filesystem tarballs
  1296. + tar cJf $RELEASE_DIR/${NOOBS_DISTRO}/System.tar.xz -C $RELEASE_DIR/${NOOBS_DISTRO}/System/ .
  1297. + tar cJf $RELEASE_DIR/${NOOBS_DISTRO}/Storage.tar.xz -C $RELEASE_DIR/${NOOBS_DISTRO}/Storage/ .
  1298. +
  1299. + # remove filesystem dirs
  1300. + rm -rf $RELEASE_DIR/${NOOBS_DISTRO}/System
  1301. + rm -rf $RELEASE_DIR/${NOOBS_DISTRO}/Storage
  1302. +
  1303. + # remove any previously created release tarball
  1304. + rm -rf $TARGET_IMG/${IMAGE_NAME}-$1.tar
  1305. +
  1306. + # create release tarball
  1307. + tar cf $TARGET_IMG/${IMAGE_NAME}-$1.tar -C $TARGET_IMG ${IMAGE_NAME}-$1
  1308. +
  1309. + # create sha256 checksum of tarball
  1310. + ( cd $TARGET_IMG
  1311. + sha256sum ${IMAGE_NAME}-$1.tar > ${IMAGE_NAME}-$1.tar.sha256
  1312. + )
  1313. + fi
  1314. +
  1315. + if [ -d $RELEASE_DIR ]; then
  1316. + # cleanup release dir
  1317. + rm -rf $RELEASE_DIR
  1318. + fi
  1319. +fi
  1320. diff --git a/scripts/install b/scripts/install
  1321. index d9e0bfa..d7b55ab 100755
  1322. --- a/scripts/install
  1323. +++ b/scripts/install
  1324. @@ -29,12 +29,15 @@ if [ "${1//:/}" != "${1}" ]; then
  1325. PACKAGE_NAME="${1%:*}"
  1326. TARGET="${1#*:}"
  1327. else
  1328. - PACKAGE_NAME=$1
  1329. + PACKAGE_NAME="${1}"
  1330. TARGET=
  1331. fi
  1332. [ -z "$TARGET" ] && TARGET="target"
  1333.  
  1334. +[ "$PKG_SECTION" != "virtual" ] && pkg_lock "${PACKAGE_NAME}:${TARGET}" install
  1335. +
  1336. STAMP=$STAMPS_INSTALL/$PACKAGE_NAME/install_$TARGET
  1337. +[ -f $STAMP ] && pkg_lock_msg "${PACKAGE_NAME}:${TARGET}" install "UNLOCK" "already installed"
  1338. [ -f $STAMP ] && exit 0
  1339.  
  1340. mkdir -p $STAMPS_INSTALL/$PACKAGE_NAME
  1341. @@ -52,6 +55,8 @@ elif [ "$TARGET" = init ] ; then
  1342. INSTALL=$BUILD/initramfs
  1343. fi
  1344.  
  1345. +pkg_lock_msg "${PACKAGE_NAME}:${TARGET}" install "RUNNING"
  1346. +
  1347. build_msg "CLR_INSTALL" "INSTALL" "${PACKAGE_NAME} $(print_color CLR_TARGET "(${TARGET})")" "indent"
  1348.  
  1349. mkdir -p $INSTALL
  1350. @@ -137,3 +142,5 @@ if [ "$TARGET" = target ] ; then
  1351. fi
  1352.  
  1353. touch $STAMP
  1354. +
  1355. +pkg_lock_msg "${PACKAGE_NAME}:${TARGET}" install "UNLOCK" "installed"
  1356. diff --git a/scripts/unpack b/scripts/unpack
  1357. index 3dce2c4..bfcd849 100755
  1358. --- a/scripts/unpack
  1359. +++ b/scripts/unpack
  1360. @@ -14,7 +14,11 @@ if [ -z "${PKG_NAME}" ]; then
  1361. die "$(print_color CLR_ERROR "${1}: no package.mk file found")"
  1362. fi
  1363.  
  1364. -$SCRIPTS/get $1
  1365. +pkg_lock "${PKG_NAME}" "unpack"
  1366. +
  1367. +pkg_lock_msg "${PKG_NAME}" "unpack" "RUNNING"
  1368. +
  1369. +$SCRIPTS/get "${PKG_NAME}"
  1370.  
  1371. STAMP="$PKG_BUILD/.libreelec-unpack"
  1372.  
  1373. @@ -22,13 +26,13 @@ mkdir -p $BUILD
  1374.  
  1375. # Perform a wildcard match on the package to ensure old versions are cleaned too
  1376. PKG_DEEPHASH=
  1377. -for i in $BUILD/$1-*; do
  1378. +for i in $BUILD/${PKG_NAME}-*; do
  1379. if [ -d $i -a -f "$i/.libreelec-unpack" ] ; then
  1380. . "$i/.libreelec-unpack"
  1381. - if [ "$STAMP_PKG_NAME" = "$1" ]; then
  1382. + if [ "$STAMP_PKG_NAME" = "${PKG_NAME}" ]; then
  1383. [ -z "${PKG_DEEPHASH}" ] && PKG_DEEPHASH=$(calculate_stamp)
  1384. if [ ! "$PKG_DEEPHASH" = "$STAMP_PKG_DEEPHASH" ] ; then
  1385. - $SCRIPTS/clean $1
  1386. + $SCRIPTS/clean "${PKG_NAME}"
  1387. fi
  1388. fi
  1389. fi
  1390. @@ -36,19 +40,20 @@ done
  1391.  
  1392. if [ -d "$PKG_BUILD" -a ! -f "$STAMP" ]; then
  1393. # stale pkg build dir
  1394. - $SCRIPTS/clean $1
  1395. + $SCRIPTS/clean "${PKG_NAME}"
  1396. fi
  1397.  
  1398. +[ -f "$STAMP" ] && pkg_lock_msg "${PKG_NAME}" "unpack" "UNLOCK" "already unpacked"
  1399. [ -f "$STAMP" ] && exit 0
  1400.  
  1401. -if [ -d "$SOURCES/$1" -o -d "$PKG_DIR/sources" ]; then
  1402. - build_msg "CLR_UNPACK" "UNPACK" "${1}" "indent"
  1403. +if [ -d "$SOURCES/${PKG_NAME}" -o -d "$PKG_DIR/sources" ]; then
  1404. + build_msg "CLR_UNPACK" "UNPACK" "${PKG_NAME}" "indent"
  1405.  
  1406. pkg_call_optional pre_unpack
  1407.  
  1408. if ! pkg_call unpack; then
  1409. if [ -n "$PKG_URL" ]; then
  1410. - $SCRIPTS/extract $1 $BUILD
  1411. + $SCRIPTS/extract "${PKG_NAME}" $BUILD
  1412. fi
  1413. fi
  1414.  
  1415. @@ -159,10 +164,12 @@ fi
  1416. if [ "$PKG_SECTION" != "virtual" ]; then
  1417. mkdir -p "$PKG_BUILD"
  1418.  
  1419. - rm -f $STAMPS/$1/build_*
  1420. + rm -f $STAMPS/${PKG_NAME}/build_*
  1421.  
  1422. PKG_DEEPHASH=$(calculate_stamp)
  1423. for i in PKG_NAME PKG_DEEPHASH; do
  1424. echo "STAMP_$i=\"${!i}\"" >> $STAMP
  1425. done
  1426. fi
  1427. +
  1428. +pkg_lock_msg "${PKG_NAME}" "unpack" "UNLOCK" "unpacked"
  1429. --
  1430. 2.14.1
  1431.  
  1432.  
  1433. From 97f32b249c23df92592e672b3154f028bfcdef04 Mon Sep 17 00:00:00 2001
  1434. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  1435. Date: Sat, 5 Jan 2019 02:48:53 +0000
  1436. Subject: [PATCH 07/16] PKG_DEPENDS_UNPACK: solution for packages using source
  1437. code of another
  1438.  
  1439. ---
  1440. packages/mediacenter/JsonSchemaBuilder/package.mk | 3 ++-
  1441. packages/mediacenter/TexturePacker/package.mk | 3 ++-
  1442. packages/security/nspr/package.mk | 2 ++
  1443. scripts/build | 8 +++++++-
  1444. 4 files changed, 13 insertions(+), 3 deletions(-)
  1445.  
  1446. diff --git a/packages/mediacenter/JsonSchemaBuilder/package.mk b/packages/mediacenter/JsonSchemaBuilder/package.mk
  1447. index b61af9f..b62b79a 100644
  1448. --- a/packages/mediacenter/JsonSchemaBuilder/package.mk
  1449. +++ b/packages/mediacenter/JsonSchemaBuilder/package.mk
  1450. @@ -1,11 +1,12 @@
  1451. # SPDX-License-Identifier: GPL-2.0-or-later
  1452. # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
  1453. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  1454.  
  1455. PKG_NAME="JsonSchemaBuilder"
  1456. PKG_VERSION="0"
  1457. PKG_LICENSE="GPL"
  1458. PKG_SITE="http://www.kodi.tv"
  1459. -PKG_URL=""
  1460. +PKG_DEPENDS_UNPACK="kodi"
  1461. PKG_NEED_UNPACK="$(get_pkg_directory $MEDIACENTER)"
  1462. PKG_LONGDESC="kodi-platform:"
  1463.  
  1464. diff --git a/packages/mediacenter/TexturePacker/package.mk b/packages/mediacenter/TexturePacker/package.mk
  1465. index 8faa689..ed8ee07 100644
  1466. --- a/packages/mediacenter/TexturePacker/package.mk
  1467. +++ b/packages/mediacenter/TexturePacker/package.mk
  1468. @@ -1,12 +1,13 @@
  1469. # SPDX-License-Identifier: GPL-2.0-or-later
  1470. # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
  1471. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  1472.  
  1473. PKG_NAME="TexturePacker"
  1474. PKG_VERSION="0"
  1475. PKG_LICENSE="GPL"
  1476. PKG_SITE="http://www.kodi.tv"
  1477. -PKG_URL=""
  1478. PKG_DEPENDS_HOST="lzo:host libpng:host libjpeg-turbo:host giflib:host"
  1479. +PKG_DEPENDS_UNPACK="kodi"
  1480. PKG_NEED_UNPACK="$(get_pkg_directory $MEDIACENTER)"
  1481. PKG_LONGDESC="kodi-platform:"
  1482.  
  1483. diff --git a/packages/security/nspr/package.mk b/packages/security/nspr/package.mk
  1484. index 7d16ac8..fd63908 100644
  1485. --- a/packages/security/nspr/package.mk
  1486. +++ b/packages/security/nspr/package.mk
  1487. @@ -1,5 +1,6 @@
  1488. # SPDX-License-Identifier: GPL-2.0-or-later
  1489. # Copyright (C) 2009-2012 Stephan Raue (stephan@openelec.tv)
  1490. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  1491.  
  1492. PKG_NAME="nspr"
  1493. PKG_VERSION="4.19"
  1494. @@ -7,6 +8,7 @@ PKG_LICENSE="Mozilla Public License"
  1495. PKG_SITE="http://www.linuxfromscratch.org/blfs/view/svn/general/nspr.html"
  1496. PKG_DEPENDS_HOST="ccache:host"
  1497. PKG_DEPENDS_TARGET="toolchain nss:host"
  1498. +PKG_DEPENDS_UNPACK="nss"
  1499. PKG_LONGDESC="Netscape Portable Runtime (NSPR) provides a platform-neutral API for system level and libc like functions"
  1500. PKG_TOOLCHAIN="configure"
  1501. PKG_BUILD_FLAGS="-parallel"
  1502. diff --git a/scripts/build b/scripts/build
  1503. index 46a3927..3afd72f 100755
  1504. --- a/scripts/build
  1505. +++ b/scripts/build
  1506. @@ -58,7 +58,13 @@ if [ -f $STAMP ]; then
  1507. fi
  1508. fi
  1509.  
  1510. -$SCRIPTS/unpack $PACKAGE_NAME
  1511. +if [ -n "${PKG_DEPENDS_UNPACK}" ]; then
  1512. + for p in ${PKG_DEPENDS_UNPACK}; do
  1513. + $SCRIPTS/unpack ${p}
  1514. + done
  1515. +else
  1516. + $SCRIPTS/unpack $PACKAGE_NAME
  1517. +fi
  1518.  
  1519. # build dependencies, only when PKG_DEPENDS_? is filled
  1520. unset _pkg_depends
  1521. --
  1522. 2.14.1
  1523.  
  1524.  
  1525. From cbca90606ecfcd69a7b07be01d49e5a41e43145d Mon Sep 17 00:00:00 2001
  1526. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  1527. Date: Wed, 9 Jan 2019 03:27:04 +0000
  1528. Subject: [PATCH 08/16] PKG_DEPENDS_UNPACK: add source package to
  1529. PKG_NEED_UNPACK
  1530.  
  1531. If the source package changes then we need to rebuild too.
  1532. ---
  1533. config/functions | 6 ++++++
  1534. 1 file changed, 6 insertions(+)
  1535.  
  1536. diff --git a/config/functions b/config/functions
  1537. index 594a2c2..ad7d8cb 100644
  1538. --- a/config/functions
  1539. +++ b/config/functions
  1540. @@ -861,6 +861,12 @@ source_package() {
  1541. [ "$PKG_ADDON_IS_STANDALONE" != "yes" ] && PKG_NEED_UNPACK="${PKG_NEED_UNPACK} $(get_pkg_directory $MEDIACENTER)"
  1542. fi
  1543.  
  1544. + if [ -n "${PKG_DEPENDS_UNPACK}" ]; then
  1545. + for _p in ${PKG_DEPENDS_UNPACK}; do
  1546. + PKG_NNED_UNPACK+=" $(get_pkg_directory ${_p})"
  1547. + done
  1548. + fi
  1549. +
  1550. # Automatically set PKG_SOURCE_NAME unless it is already defined.
  1551. # PKG_SOURCE_NAME will be automatically set to a name based on
  1552. # the $PKG_NAME-$PKG_VERSION convention.
  1553. --
  1554. 2.14.1
  1555.  
  1556.  
  1557. From 18233b08180487247dcdd60f96639e312c4644ec Mon Sep 17 00:00:00 2001
  1558. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  1559. Date: Sat, 5 Jan 2019 22:42:12 +0000
  1560. Subject: [PATCH 09/16] initramfs: use ln -sfn when LINK_NAME is a directory
  1561.  
  1562. INSTALL initramfs (target)
  1563. ln: failed to create symbolic link '/home/ubuntu/projects/LibreELEC.tv/build.LibreELEC-RPi2.arm-9.0-devel-mt/initramfs/lib/lib': Permission denied
  1564. ln: failed to create symbolic link '/home/ubuntu/projects/LibreELEC.tv/build.LibreELEC-RPi2.arm-9.0-devel-mt/initramfs/bin/bin': Permission denied
  1565. ln: failed to create symbolic link '/home/ubuntu/projects/LibreELEC.tv/build.LibreELEC-RPi2.arm-9.0-devel-mt/initramfs/sbin/sbin': Permission denied
  1566.  
  1567. If the directory sym link already exists, we try to
  1568. create a directory within the dereferenced sym link. So...
  1569.  
  1570. ln -sf /usr/lib $BUILD/initramfs/lib
  1571.  
  1572. means we attempt to create a sym link within the existing
  1573. $BUILD/initramfs/lib which is derefernced to /usr/lib/lib,
  1574. resulting in "permission denied".
  1575. ---
  1576. packages/virtual/initramfs/package.mk | 10 +++++-----
  1577. 1 file changed, 5 insertions(+), 5 deletions(-)
  1578.  
  1579. diff --git a/packages/virtual/initramfs/package.mk b/packages/virtual/initramfs/package.mk
  1580. index ef17f19..b278804 100644
  1581. --- a/packages/virtual/initramfs/package.mk
  1582. +++ b/packages/virtual/initramfs/package.mk
  1583. @@ -22,14 +22,14 @@ fi
  1584. post_install() {
  1585. ( cd $BUILD/initramfs
  1586. if [ "$TARGET_ARCH" = "x86_64" ]; then
  1587. - ln -sf /usr/lib $BUILD/initramfs/lib64
  1588. + ln -sfn /usr/lib $BUILD/initramfs/lib64
  1589. mkdir -p $BUILD/initramfs/usr
  1590. - ln -sf /usr/lib $BUILD/initramfs/usr/lib64
  1591. + ln -sfn /usr/lib $BUILD/initramfs/usr/lib64
  1592. fi
  1593.  
  1594. - ln -sf /usr/lib $BUILD/initramfs/lib
  1595. - ln -sf /usr/bin $BUILD/initramfs/bin
  1596. - ln -sf /usr/sbin $BUILD/initramfs/sbin
  1597. + ln -sfn /usr/lib $BUILD/initramfs/lib
  1598. + ln -sfn /usr/bin $BUILD/initramfs/bin
  1599. + ln -sfn /usr/sbin $BUILD/initramfs/sbin
  1600.  
  1601. mkdir -p $BUILD/image/
  1602. fakeroot -- sh -c \
  1603. --
  1604. 2.14.1
  1605.  
  1606.  
  1607. From 90c493bc4bd3e45f9821f534173c8e36a265b3be Mon Sep 17 00:00:00 2001
  1608. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  1609. Date: Sat, 5 Jan 2019 02:44:12 +0000
  1610. Subject: [PATCH 10/16] packages: pciutils, nasm: build only for x86_64
  1611.  
  1612. ---
  1613. packages/linux/package.mk | 4 ++--
  1614. packages/mediacenter/kodi/package.mk | 6 +++++-
  1615. packages/multimedia/dav1d/package.mk | 6 +++++-
  1616. packages/sysutils/busybox/package.mk | 6 +++++-
  1617. 4 files changed, 17 insertions(+), 5 deletions(-)
  1618.  
  1619. diff --git a/packages/linux/package.mk b/packages/linux/package.mk
  1620. index 3233cb5..3bd5a13 100644
  1621. --- a/packages/linux/package.mk
  1622. +++ b/packages/linux/package.mk
  1623. @@ -6,7 +6,7 @@ PKG_NAME="linux"
  1624. PKG_LICENSE="GPL"
  1625. PKG_SITE="http://www.kernel.org"
  1626. PKG_DEPENDS_HOST="ccache:host"
  1627. -PKG_DEPENDS_TARGET="toolchain cpio:host kmod:host pciutils xz:host wireless-regdb keyutils $KERNEL_EXTRA_DEPENDS_TARGET"
  1628. +PKG_DEPENDS_TARGET="toolchain cpio:host kmod:host xz:host wireless-regdb keyutils $KERNEL_EXTRA_DEPENDS_TARGET"
  1629. PKG_DEPENDS_INIT="toolchain"
  1630. PKG_NEED_UNPACK="$LINUX_DEPENDS"
  1631. PKG_LONGDESC="This package contains a precompiled kernel image and the modules."
  1632. @@ -65,7 +65,7 @@ if [ "$PKG_BUILD_PERF" != "no" ] && grep -q ^CONFIG_PERF_EVENTS= $PKG_KERNEL_CFG
  1633. fi
  1634.  
  1635. if [ "$TARGET_ARCH" = "x86_64" ]; then
  1636. - PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET intel-ucode:host kernel-firmware elfutils:host"
  1637. + PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET intel-ucode:host kernel-firmware elfutils:host pciutils"
  1638. fi
  1639.  
  1640. if [ "$BUILD_ANDROID_BOOTIMG" = "yes" ]; then
  1641. diff --git a/packages/mediacenter/kodi/package.mk b/packages/mediacenter/kodi/package.mk
  1642. index a02ea76..3bcec2c 100644
  1643. --- a/packages/mediacenter/kodi/package.mk
  1644. +++ b/packages/mediacenter/kodi/package.mk
  1645. @@ -5,7 +5,7 @@
  1646. PKG_NAME="kodi"
  1647. PKG_LICENSE="GPL"
  1648. PKG_SITE="http://www.kodi.tv"
  1649. -PKG_DEPENDS_TARGET="toolchain JsonSchemaBuilder:host TexturePacker:host Python2 zlib systemd pciutils lzo pcre swig:host libass curl fontconfig fribidi tinyxml libjpeg-turbo freetype libcdio taglib libxml2 libxslt rapidjson sqlite ffmpeg crossguid giflib libdvdnav libhdhomerun libfmt lirc libfstrcmp flatbuffers:host flatbuffers"
  1650. +PKG_DEPENDS_TARGET="toolchain JsonSchemaBuilder:host TexturePacker:host Python2 zlib systemd lzo pcre swig:host libass curl fontconfig fribidi tinyxml libjpeg-turbo freetype libcdio taglib libxml2 libxslt rapidjson sqlite ffmpeg crossguid giflib libdvdnav libhdhomerun libfmt lirc libfstrcmp flatbuffers:host flatbuffers"
  1651. PKG_LONGDESC="A free and open source cross-platform media player."
  1652.  
  1653. PKG_PATCH_DIRS="$KODI_VENDOR"
  1654. @@ -39,6 +39,10 @@ configure_package() {
  1655.  
  1656. get_graphicdrivers
  1657.  
  1658. + if [ "$TARGET_ARCH" = "x86_64" ]; then
  1659. + PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET pciutils"
  1660. + fi
  1661. +
  1662. PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET dbus"
  1663.  
  1664. if [ "$DISPLAYSERVER" = "x11" ]; then
  1665. diff --git a/packages/multimedia/dav1d/package.mk b/packages/multimedia/dav1d/package.mk
  1666. index 275aca4..ab20356 100644
  1667. --- a/packages/multimedia/dav1d/package.mk
  1668. +++ b/packages/multimedia/dav1d/package.mk
  1669. @@ -7,5 +7,9 @@ PKG_SHA256="3662184809fa29af39c920877cedec3724dc5c3cf71d94bec424f2a7ee4825cf"
  1670. PKG_LICENSE="BSD"
  1671. PKG_SITE="http://www.jbkempf.com/blog/post/2018/Introducing-dav1d"
  1672. PKG_URL="https://code.videolan.org/videolan/dav1d/-/archive/${PKG_VERSION}/dav1d-${PKG_VERSION}.tar.bz2"
  1673. -PKG_DEPENDS_TARGET="toolchain nasm:host"
  1674. +PKG_DEPENDS_TARGET="toolchain"
  1675. PKG_LONGDESC="dav1d is an AV1 decoder :)"
  1676. +
  1677. +if [ "$TARGET_ARCH" = "x86_64" ]; then
  1678. + PKG_DEPENDS_TARGET+=" nasm:host"
  1679. +fi
  1680. diff --git a/packages/sysutils/busybox/package.mk b/packages/sysutils/busybox/package.mk
  1681. index 4d8b2fb..4aa977c 100644
  1682. --- a/packages/sysutils/busybox/package.mk
  1683. +++ b/packages/sysutils/busybox/package.mk
  1684. @@ -9,7 +9,7 @@ PKG_LICENSE="GPL"
  1685. PKG_SITE="http://www.busybox.net"
  1686. PKG_URL="http://busybox.net/downloads/$PKG_NAME-$PKG_VERSION.tar.bz2"
  1687. PKG_DEPENDS_HOST=""
  1688. -PKG_DEPENDS_TARGET="toolchain busybox:host hdparm dosfstools e2fsprogs zip unzip pciutils usbutils parted procps-ng gptfdisk libtirpc"
  1689. +PKG_DEPENDS_TARGET="toolchain busybox:host hdparm dosfstools e2fsprogs zip unzip usbutils parted procps-ng gptfdisk libtirpc"
  1690. PKG_DEPENDS_INIT="toolchain libtirpc"
  1691. PKG_LONGDESC="BusyBox combines tiny versions of many common UNIX utilities into a single small executable."
  1692. # busybox fails to build with GOLD support enabled with binutils-2.25
  1693. @@ -25,6 +25,10 @@ if [ "$NFS_SUPPORT" = yes ]; then
  1694. PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET rpcbind"
  1695. fi
  1696.  
  1697. +if [ "$TARGET_ARCH" = "x86_64" ]; then
  1698. + PKG_DEPENDS_TARGET+=" pciutils"
  1699. +fi
  1700. +
  1701. pre_build_target() {
  1702. PKG_MAKE_OPTS_TARGET="ARCH=$TARGET_ARCH \
  1703. HOSTCC=$HOST_CC \
  1704. --
  1705. 2.14.1
  1706.  
  1707.  
  1708. From 4f693dc6a73b826a7efda38cfcdf39ca703ea9d1 Mon Sep 17 00:00:00 2001
  1709. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  1710. Date: Sat, 5 Jan 2019 02:50:57 +0000
  1711. Subject: [PATCH 11/16] packages: add missing dependencies
  1712.  
  1713. ---
  1714. packages/addons/addon-depends/system-tools-depends/p7zip/package.mk | 1 +
  1715. packages/compress/bzip2/package.mk | 2 +-
  1716. packages/compress/zstd/package.mk | 1 +
  1717. packages/databases/sqlite/package.mk | 1 +
  1718. packages/devel/ncurses/package.mk | 1 +
  1719. packages/devel/pcre/package.mk | 2 +-
  1720. packages/lang/gcc/package.mk | 1 +
  1721. packages/security/nspr/package.mk | 2 +-
  1722. packages/sysutils/dosfstools/package.mk | 2 ++
  1723. packages/sysutils/e2fsprogs/package.mk | 1 +
  1724. packages/tools/aml-dtbtools/package.mk | 1 +
  1725. packages/tools/dtc/package.mk | 2 +-
  1726. packages/tools/mkbootimg/package.mk | 3 ++-
  1727. packages/tools/mtools/package.mk | 3 ++-
  1728. 14 files changed, 17 insertions(+), 6 deletions(-)
  1729.  
  1730. diff --git a/packages/addons/addon-depends/system-tools-depends/p7zip/package.mk b/packages/addons/addon-depends/system-tools-depends/p7zip/package.mk
  1731. index 4db0399..50860cc 100644
  1732. --- a/packages/addons/addon-depends/system-tools-depends/p7zip/package.mk
  1733. +++ b/packages/addons/addon-depends/system-tools-depends/p7zip/package.mk
  1734. @@ -7,6 +7,7 @@ PKG_SHA256="5eb20ac0e2944f6cb9c2d51dd6c4518941c185347d4089ea89087ffdd6e2341f"
  1735. PKG_LICENSE="GPL"
  1736. PKG_SITE="http://p7zip.sourceforge.net/"
  1737. PKG_URL="http://downloads.sourceforge.net/project/p7zip/p7zip/${PKG_VERSION}/p7zip_${PKG_VERSION}_src_all.tar.bz2"
  1738. +#PKG_DEPENDS_HOST="gcc:host"
  1739. PKG_DEPENDS_TARGET="toolchain"
  1740. PKG_LONGDESC="p7zip is a port of 7za.exe for POSIX systems like Unix."
  1741. PKG_TOOLCHAIN="manual"
  1742. diff --git a/packages/compress/bzip2/package.mk b/packages/compress/bzip2/package.mk
  1743. index 610406b..dbc921d 100644
  1744. --- a/packages/compress/bzip2/package.mk
  1745. +++ b/packages/compress/bzip2/package.mk
  1746. @@ -8,7 +8,7 @@ PKG_SHA256="a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd"
  1747. PKG_LICENSE="GPL"
  1748. PKG_SITE="http://www.bzip.org"
  1749. PKG_URL="$DISTRO_SRC/$PKG_NAME-$PKG_VERSION.tar.gz"
  1750. -PKG_DEPENDS_HOST=""
  1751. +#PKG_DEPENDS_HOST="gcc:host"
  1752. PKG_DEPENDS_TARGET="toolchain"
  1753. PKG_LONGDESC="A high-quality bzip2 data compressor."
  1754. PKG_BUILD_FLAGS="+pic +pic:host"
  1755. diff --git a/packages/compress/zstd/package.mk b/packages/compress/zstd/package.mk
  1756. index 60120e9..2988df7 100644
  1757. --- a/packages/compress/zstd/package.mk
  1758. +++ b/packages/compress/zstd/package.mk
  1759. @@ -8,6 +8,7 @@ PKG_LICENSE="BSD/GPLv2"
  1760. PKG_SITE="http://www.zstd.net"
  1761. PKG_URL="https://github.com/facebook/zstd/archive/v${PKG_VERSION}.tar.gz"
  1762. PKG_SOURCE_DIR=$PKG_NAME-$PKG_VERSION
  1763. +PKG_DEPENDS_HOST="gcc:host"
  1764. PKG_DEPENDS_TARGET="toolchain"
  1765. PKG_LONGDESC="A fast real-time compression algorithm."
  1766.  
  1767. diff --git a/packages/databases/sqlite/package.mk b/packages/databases/sqlite/package.mk
  1768. index 66af712..007d5b7 100644
  1769. --- a/packages/databases/sqlite/package.mk
  1770. +++ b/packages/databases/sqlite/package.mk
  1771. @@ -8,6 +8,7 @@ PKG_SHA256="5daa6a3fb7d1e8c767cd59c4ded8da6e4b00c61d3b466d0685e35c4dd6d7bf5d"
  1772. PKG_LICENSE="PublicDomain"
  1773. PKG_SITE="https://www.sqlite.org/"
  1774. PKG_URL="https://www.sqlite.org/2018/$PKG_NAME-$PKG_VERSION.tar.gz"
  1775. +#PKG_DEPENDS_HOST="gcc:host"
  1776. PKG_DEPENDS_TARGET="toolchain"
  1777. PKG_LONGDESC="An Embeddable SQL Database Engine."
  1778. # libsqlite3.a(sqlite3.o): requires dynamic R_X86_64_PC32 reloc against 'sqlite3_stricmp' which may overflow at runtime
  1779. diff --git a/packages/devel/ncurses/package.mk b/packages/devel/ncurses/package.mk
  1780. index c04d685..e579734 100644
  1781. --- a/packages/devel/ncurses/package.mk
  1782. +++ b/packages/devel/ncurses/package.mk
  1783. @@ -7,6 +7,7 @@ PKG_SHA256="08b07c3e792961f300829512c283d5fefc0b1c421a57b76922c3d13303ed677d"
  1784. PKG_LICENSE="MIT"
  1785. PKG_SITE="http://www.gnu.org/software/ncurses/"
  1786. PKG_URL="http://invisible-mirror.net/archives/ncurses/current/ncurses-$PKG_VERSION.tgz"
  1787. +PKG_DEPENDS_HOST="gcc:host"
  1788. PKG_DEPENDS_TARGET="toolchain zlib ncurses:host"
  1789. PKG_LONGDESC="A library is a free software emulation of curses in System V Release 4.0, and more."
  1790. # causes some segmentation fault's (dialog) when compiled with gcc's link time optimization.
  1791. diff --git a/packages/devel/pcre/package.mk b/packages/devel/pcre/package.mk
  1792. index 0518214..3148324 100644
  1793. --- a/packages/devel/pcre/package.mk
  1794. +++ b/packages/devel/pcre/package.mk
  1795. @@ -8,7 +8,7 @@ PKG_SHA256="2cd04b7c887808be030254e8d77de11d3fe9d4505c39d4b15d2664ffe8bf9301"
  1796. PKG_LICENSE="OSS"
  1797. PKG_SITE="http://www.pcre.org/"
  1798. PKG_URL="https://ftp.pcre.org/pub/pcre/$PKG_NAME-$PKG_VERSION.tar.bz2"
  1799. -PKG_DEPENDS_HOST=""
  1800. +PKG_DEPENDS_HOST="gcc:host"
  1801. PKG_DEPENDS_TARGET="toolchain"
  1802. PKG_LONGDESC="A set of functions that implement regular expression pattern matching."
  1803. PKG_TOOLCHAIN="configure"
  1804. diff --git a/packages/lang/gcc/package.mk b/packages/lang/gcc/package.mk
  1805. index f899aeb..a7d1d87 100644
  1806. --- a/packages/lang/gcc/package.mk
  1807. +++ b/packages/lang/gcc/package.mk
  1808. @@ -11,6 +11,7 @@ PKG_URL="http://ftpmirror.gnu.org/gcc/$PKG_NAME-$PKG_VERSION/$PKG_NAME-$PKG_VERS
  1809. PKG_DEPENDS_BOOTSTRAP="ccache:host autoconf:host binutils:host gmp:host mpfr:host mpc:host"
  1810. PKG_DEPENDS_TARGET="gcc:host"
  1811. PKG_DEPENDS_HOST="ccache:host autoconf:host binutils:host gmp:host mpfr:host mpc:host glibc"
  1812. +PKG_DEPENDS_INIT="toolchain"
  1813. PKG_LONGDESC="This package contains the GNU Compiler Collection."
  1814.  
  1815. GCC_COMMON_CONFIGURE_OPTS="--target=$TARGET_NAME \
  1816. diff --git a/packages/security/nspr/package.mk b/packages/security/nspr/package.mk
  1817. index fd63908..58f4f22 100644
  1818. --- a/packages/security/nspr/package.mk
  1819. +++ b/packages/security/nspr/package.mk
  1820. @@ -7,7 +7,7 @@ PKG_VERSION="4.19"
  1821. PKG_LICENSE="Mozilla Public License"
  1822. PKG_SITE="http://www.linuxfromscratch.org/blfs/view/svn/general/nspr.html"
  1823. PKG_DEPENDS_HOST="ccache:host"
  1824. -PKG_DEPENDS_TARGET="toolchain nss:host"
  1825. +PKG_DEPENDS_TARGET="toolchain nss:host nspr:host"
  1826. PKG_DEPENDS_UNPACK="nss"
  1827. PKG_LONGDESC="Netscape Portable Runtime (NSPR) provides a platform-neutral API for system level and libc like functions"
  1828. PKG_TOOLCHAIN="configure"
  1829. diff --git a/packages/sysutils/dosfstools/package.mk b/packages/sysutils/dosfstools/package.mk
  1830. index 6f8c72b..ffaf5f7 100644
  1831. --- a/packages/sysutils/dosfstools/package.mk
  1832. +++ b/packages/sysutils/dosfstools/package.mk
  1833. @@ -1,5 +1,6 @@
  1834. # SPDX-License-Identifier: GPL-2.0-or-later
  1835. # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
  1836. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  1837.  
  1838. PKG_NAME="dosfstools"
  1839. PKG_VERSION="3.0.28"
  1840. @@ -8,6 +9,7 @@ PKG_LICENSE="GPLv3"
  1841. PKG_SITE="https://github.com/dosfstools/dosfstools"
  1842. PKG_URL="https://github.com/dosfstools/dosfstools/releases/download/v$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.xz"
  1843. PKG_DEPENDS_TARGET="toolchain"
  1844. +PKG_DEPENDS_HOST="gcc:host"
  1845. PKG_DEPENDS_INIT="toolchain dosfstools"
  1846. PKG_LONGDESC="dosfstools contains utilities for making and checking MS-DOS FAT filesystems."
  1847.  
  1848. diff --git a/packages/sysutils/e2fsprogs/package.mk b/packages/sysutils/e2fsprogs/package.mk
  1849. index 0daafc5..260315e 100644
  1850. --- a/packages/sysutils/e2fsprogs/package.mk
  1851. +++ b/packages/sysutils/e2fsprogs/package.mk
  1852. @@ -8,6 +8,7 @@ PKG_SHA256="926f8e8de1ffba55d791f21b71334e8a32b5227257ad370f2bf7e4396629e97f"
  1853. PKG_LICENSE="GPL"
  1854. PKG_SITE="http://e2fsprogs.sourceforge.net/"
  1855. PKG_URL="https://www.kernel.org/pub/linux/kernel/people/tytso/$PKG_NAME/v$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.xz"
  1856. +PKG_DEPENDS_HOST="gcc:host"
  1857. PKG_DEPENDS_TARGET="toolchain"
  1858. PKG_DEPENDS_INIT="toolchain"
  1859. PKG_LONGDESC="The filesystem utilities for the EXT2 filesystem, including e2fsck, mke2fs, dumpe2fs, fsck, and others."
  1860. diff --git a/packages/tools/aml-dtbtools/package.mk b/packages/tools/aml-dtbtools/package.mk
  1861. index 8e21b9b..93a0d28 100644
  1862. --- a/packages/tools/aml-dtbtools/package.mk
  1863. +++ b/packages/tools/aml-dtbtools/package.mk
  1864. @@ -7,6 +7,7 @@ PKG_SHA256="8bcaa83fcc9e85c9c04930e7411447d96a97da0809c5ecd9af91c8b554133c41"
  1865. PKG_LICENSE="free"
  1866. PKG_SITE="https://github.com/Wilhansen/aml-dtbtools"
  1867. PKG_URL="https://github.com/Wilhansen/aml-dtbtools/archive/${PKG_VERSION}.tar.gz"
  1868. +PKG_DEPENDS_HOST="gcc:host"
  1869. PKG_LONGDESC="AML DTB Tools"
  1870.  
  1871. PKG_MAKE_OPTS_HOST="dtbTool"
  1872. diff --git a/packages/tools/dtc/package.mk b/packages/tools/dtc/package.mk
  1873. index e943d3e..4fe132c 100644
  1874. --- a/packages/tools/dtc/package.mk
  1875. +++ b/packages/tools/dtc/package.mk
  1876. @@ -8,7 +8,7 @@ PKG_LICENSE="GPL"
  1877. PKG_SITE="https://git.kernel.org/pub/scm/utils/dtc/dtc.git/"
  1878. PKG_URL="https://git.kernel.org/pub/scm/utils/dtc/dtc.git/snapshot/$PKG_VERSION.tar.gz"
  1879. PKG_DEPENDS_HOST="Python2:host swig:host"
  1880. -PKG_DEPENDS_TARGET="toolchain"
  1881. +PKG_DEPENDS_TARGET="toolchain dtc:host"
  1882. PKG_LONGDESC="The Device Tree Compiler"
  1883.  
  1884. PKG_MAKE_OPTS_HOST="dtc libfdt"
  1885. diff --git a/packages/tools/mkbootimg/package.mk b/packages/tools/mkbootimg/package.mk
  1886. index 0b9d83a..adc1d3a 100644
  1887. --- a/packages/tools/mkbootimg/package.mk
  1888. +++ b/packages/tools/mkbootimg/package.mk
  1889. @@ -1,5 +1,6 @@
  1890. # SPDX-License-Identifier: GPL-2.0-or-later
  1891. # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
  1892. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  1893.  
  1894. PKG_NAME="mkbootimg"
  1895. PKG_VERSION="6668fc2"
  1896. @@ -7,7 +8,7 @@ PKG_SHA256="d84870e055414d638a3e7eb4b7a3ebf415899841218f24cb3647d06ecf6ddb17"
  1897. PKG_LICENSE="GPL"
  1898. PKG_SITE="https://android.googlesource.com/platform/system/core/+/master/mkbootimg/"
  1899. PKG_URL="https://github.com/codesnake/mkbootimg/archive/$PKG_VERSION.tar.gz"
  1900. -PKG_DEPENDS_HOST=""
  1901. +PKG_DEPENDS_HOST="gcc:host"
  1902. PKG_LONGDESC="mkbootimg: Creates kernel boot images for Android"
  1903.  
  1904. makeinstall_host() {
  1905. diff --git a/packages/tools/mtools/package.mk b/packages/tools/mtools/package.mk
  1906. index 099488f..e0dd42e 100644
  1907. --- a/packages/tools/mtools/package.mk
  1908. +++ b/packages/tools/mtools/package.mk
  1909. @@ -1,5 +1,6 @@
  1910. # SPDX-License-Identifier: GPL-2.0-or-later
  1911. # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
  1912. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  1913.  
  1914. PKG_NAME="mtools"
  1915. PKG_VERSION="4.0.18"
  1916. @@ -7,6 +8,6 @@ PKG_SHA256="59e9cf80885399c4f229e5d87e49c0c2bfeec044e1386d59fcd0b0aead6b2f85"
  1917. PKG_LICENSE="GPL"
  1918. PKG_SITE="http://www.gnu.org/software/mtools/"
  1919. PKG_URL="http://ftpmirror.gnu.org/$PKG_NAME/$PKG_NAME-$PKG_VERSION.tar.bz2"
  1920. -PKG_DEPENDS_HOST=""
  1921. +PKG_DEPENDS_HOST="gcc:host"
  1922. PKG_LONGDESC="mtools: A collection of utilities to access MS-DOS disks"
  1923. PKG_TOOLCHAIN="autotools"
  1924. --
  1925. 2.14.1
  1926.  
  1927.  
  1928. From e253998e391b56f52a906aa52223ef910cc49df7 Mon Sep 17 00:00:00 2001
  1929. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  1930. Date: Sun, 6 Jan 2019 10:22:10 +0000
  1931. Subject: [PATCH 12/16] packages: add missing xorg-server dependencies
  1932.  
  1933. ---
  1934. packages/x11/driver/xf86-input-evdev/package.mk | 2 +-
  1935. packages/x11/driver/xf86-input-synaptics/package.mk | 2 +-
  1936. 2 files changed, 2 insertions(+), 2 deletions(-)
  1937.  
  1938. diff --git a/packages/x11/driver/xf86-input-evdev/package.mk b/packages/x11/driver/xf86-input-evdev/package.mk
  1939. index e83dd81..c015cfc 100644
  1940. --- a/packages/x11/driver/xf86-input-evdev/package.mk
  1941. +++ b/packages/x11/driver/xf86-input-evdev/package.mk
  1942. @@ -8,7 +8,7 @@ PKG_SHA256="9edaa6205baf6d2922cc4db3d8e54a7e7773b5f733b0ae90f6be7725f983b70d"
  1943. PKG_LICENSE="OSS"
  1944. PKG_SITE="http://www.X.org"
  1945. PKG_URL="http://xorg.freedesktop.org/archive/individual/driver/$PKG_NAME-$PKG_VERSION.tar.bz2"
  1946. -PKG_DEPENDS_TARGET="toolchain util-macros libevdev mtdev systemd"
  1947. +PKG_DEPENDS_TARGET="toolchain xorg-server util-macros libevdev mtdev systemd"
  1948. PKG_LONGDESC="Evdev is an Xorg input driver for Linux's generic event devices."
  1949. PKG_TOOLCHAIN="autotools"
  1950.  
  1951. diff --git a/packages/x11/driver/xf86-input-synaptics/package.mk b/packages/x11/driver/xf86-input-synaptics/package.mk
  1952. index abbdf17..8cb9b74 100644
  1953. --- a/packages/x11/driver/xf86-input-synaptics/package.mk
  1954. +++ b/packages/x11/driver/xf86-input-synaptics/package.mk
  1955. @@ -7,7 +7,7 @@ PKG_SHA256="afba3289d7a40217a19d90db98ce181772f9ca6d77e1898727b0afcf02073b5a"
  1956. PKG_LICENSE="GPL"
  1957. PKG_SITE="http://lists.freedesktop.org/mailman/listinfo/xorg"
  1958. PKG_URL="http://xorg.freedesktop.org/archive/individual/driver/$PKG_NAME-$PKG_VERSION.tar.bz2"
  1959. -PKG_DEPENDS_TARGET="toolchain libXi"
  1960. +PKG_DEPENDS_TARGET="toolchain xorg-server libXi"
  1961. PKG_LONGDESC="Synaptics touchpad driver for X.Org."
  1962. PKG_TOOLCHAIN="autotools"
  1963.  
  1964. --
  1965. 2.14.1
  1966.  
  1967.  
  1968. From 84a29056f43a1f62d67417aee66a7af5127e3e76 Mon Sep 17 00:00:00 2001
  1969. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  1970. Date: Sun, 6 Jan 2019 05:43:49 +0000
  1971. Subject: [PATCH 13/16] packages: elfutils: needs elfutils:host
  1972.  
  1973. ---
  1974. packages/devel/elfutils/package.mk | 2 +-
  1975. 1 file changed, 1 insertion(+), 1 deletion(-)
  1976.  
  1977. diff --git a/packages/devel/elfutils/package.mk b/packages/devel/elfutils/package.mk
  1978. index 6a2cedb..3534b60 100644
  1979. --- a/packages/devel/elfutils/package.mk
  1980. +++ b/packages/devel/elfutils/package.mk
  1981. @@ -9,7 +9,7 @@ PKG_LICENSE="GPL"
  1982. PKG_SITE="https://sourceware.org/elfutils/"
  1983. PKG_URL="https://sourceware.org/elfutils/ftp/$PKG_VERSION/$PKG_NAME-$PKG_VERSION.tar.bz2"
  1984. PKG_DEPENDS_HOST="make:host zlib:host"
  1985. -PKG_DEPENDS_TARGET="toolchain zlib"
  1986. +PKG_DEPENDS_TARGET="toolchain zlib elfutils:host"
  1987. PKG_LONGDESC="A collection of utilities to handle ELF objects."
  1988. PKG_TOOLCHAIN="autotools"
  1989. PKG_BUILD_FLAGS="+pic"
  1990. --
  1991. 2.14.1
  1992.  
  1993.  
  1994. From 581669d64ceedb80a3238d92d1abb11439be9bf5 Mon Sep 17 00:00:00 2001
  1995. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  1996. Date: Sun, 6 Jan 2019 10:48:46 +0000
  1997. Subject: [PATCH 14/16] flex: work around realloc/malloc build failures with
  1998. flex:target
  1999.  
  2000. ---
  2001. packages/devel/flex/package.mk | 4 ++++
  2002. 1 file changed, 4 insertions(+)
  2003.  
  2004. diff --git a/packages/devel/flex/package.mk b/packages/devel/flex/package.mk
  2005. index 091e4c2..f59cc28 100644
  2006. --- a/packages/devel/flex/package.mk
  2007. +++ b/packages/devel/flex/package.mk
  2008. @@ -1,5 +1,6 @@
  2009. # SPDX-License-Identifier: GPL-2.0-or-later
  2010. # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv)
  2011. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  2012.  
  2013. PKG_NAME="flex"
  2014. PKG_VERSION="2.5.39"
  2015. @@ -13,6 +14,9 @@ PKG_TOOLCHAIN="autotools"
  2016.  
  2017. PKG_CONFIGURE_OPTS_HOST="--enable-static --disable-shared --disable-rpath --with-gnu-ld"
  2018.  
  2019. +PKG_CONFIGURE_OPTS_TARGET="ac_cv_func_realloc_0_nonnull=yes \
  2020. + ac_cv_func_malloc_0_nonnull=yes"
  2021. +
  2022. post_makeinstall_host() {
  2023. cat > $TOOLCHAIN/bin/lex << "EOF"
  2024. #!/bin/sh
  2025. --
  2026. 2.14.1
  2027.  
  2028.  
  2029. From 2c03f48244901ad6785083093f363ec15da6fc3f Mon Sep 17 00:00:00 2001
  2030. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  2031. Date: Sat, 5 Jan 2019 19:32:50 +0000
  2032. Subject: [PATCH 15/16] Makefile: switch to using multi-threaded builds
  2033.  
  2034. ---
  2035. Makefile | 6 +++---
  2036. 1 file changed, 3 insertions(+), 3 deletions(-)
  2037.  
  2038. diff --git a/Makefile b/Makefile
  2039. index a26a9e2..bf85107 100644
  2040. --- a/Makefile
  2041. +++ b/Makefile
  2042. @@ -3,13 +3,13 @@ BUILD_DIRS=build.*
  2043. all: release
  2044.  
  2045. system:
  2046. - ./scripts/image
  2047. + ./scripts/image_mt
  2048.  
  2049. release:
  2050. - ./scripts/image release
  2051. + ./scripts/image_mt release
  2052.  
  2053. image:
  2054. - ./scripts/image mkimage
  2055. + ./scripts/image_mt mkimage
  2056.  
  2057. noobs:
  2058. ./scripts/image noobs
  2059. --
  2060. 2.14.1
  2061.  
  2062.  
  2063. From 338b7bad1a918b72db31d742f80a6c3aab4fc73e Mon Sep 17 00:00:00 2001
  2064. From: MilhouseVH <milhouseVH.github@nmacleod.com>
  2065. Date: Sun, 6 Jan 2019 04:03:29 +0000
  2066. Subject: [PATCH 16/16] TEMP: scripts/mttest: testing package
  2067.  
  2068. ---
  2069. scripts/mttest | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2070. 1 file changed, 83 insertions(+)
  2071. create mode 100755 scripts/mttest
  2072.  
  2073. diff --git a/scripts/mttest b/scripts/mttest
  2074. new file mode 100755
  2075. index 0000000..bd417ae
  2076. --- /dev/null
  2077. +++ b/scripts/mttest
  2078. @@ -0,0 +1,83 @@
  2079. +#!/bin/bash
  2080. +
  2081. +# SPDX-License-Identifier: GPL-2.0-or-later
  2082. +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv)
  2083. +
  2084. +unset _CACHE_PACKAGE_LOCAL _CACHE_PACKAGE_GLOBAL _DEBUG_DEPENDS_LIST _DEBUG_PACKAGE_LIST
  2085. +
  2086. +. config/options ""
  2087. +. config/multithread
  2088. +
  2089. +add_pkg_step build toolchain
  2090. +add_pkg_step build squashfs:host
  2091. +add_pkg_step build dosfstools:host
  2092. +add_pkg_step build fakeroot:host
  2093. +add_pkg_step build kmod:host
  2094. +add_pkg_step build mtools:host
  2095. +add_pkg_step build populatefs:host
  2096. +
  2097. +# populate base system...
  2098. +add_pkg_step install libc
  2099. +add_pkg_step install gcc
  2100. +
  2101. +add_pkg_step install linux
  2102. +
  2103. +add_pkg_step install linux-drivers
  2104. +add_pkg_step install linux-firmware
  2105. +add_pkg_step install $BOOTLOADER
  2106. +add_pkg_step install busybox
  2107. +add_pkg_step install util-linux
  2108. +add_pkg_step install corefonts
  2109. +add_pkg_step install network
  2110. +
  2111. +# Graphic support
  2112. +[ ! "$DISPLAYSERVER" = "no" ] && add_pkg_step install $DISPLAYSERVER
  2113. +
  2114. +# Multimedia support
  2115. +[ ! "$MEDIACENTER" = "no" ] && add_pkg_step install mediacenter
  2116. +
  2117. +# Sound support
  2118. +[ "$ALSA_SUPPORT" = "yes" ] && add_pkg_step install alsa
  2119. +
  2120. +# Automounter support
  2121. +[ "$UDEVIL" = "yes" ] && add_pkg_step install udevil
  2122. +
  2123. +# EXFAT support
  2124. +[ "$EXFAT" = "yes" ] && add_pkg_step install fuse-exfat
  2125. +
  2126. +# NTFS 3G support
  2127. +[ "$NTFS3G" = "yes" ] && add_pkg_step install ntfs-3g_ntfsprogs
  2128. +
  2129. +# Remote support
  2130. +[ "$REMOTE_SUPPORT" = "yes" ] && add_pkg_step install remote
  2131. +
  2132. +# Install miscellaneous packages
  2133. +add_pkg_step install misc-packages
  2134. +
  2135. +# Virtual image creation support
  2136. +[ "$PROJECT" = "Generic" ] && add_pkg_step install virtual
  2137. +
  2138. +# Installer support
  2139. +[ "$INSTALLER_SUPPORT" = "yes" ] && add_pkg_step install installer
  2140. +
  2141. +# Devtools... (not for Release)
  2142. +[ "$TESTING" = "yes" ] && add_pkg_step install testing
  2143. +
  2144. +# Install gdb in all builds, including releases
  2145. +add_pkg_step install debug
  2146. +
  2147. +# OEM packages
  2148. +[ "$OEM_SUPPORT" = "yes" ] && add_pkg_step install oem
  2149. +
  2150. +start_multithread_build() {
  2151. + PARALLEL_BIN=${TOOLCHAIN}/bin/parallel
  2152. +
  2153. + [ -x ${PARALLEL_BIN} ] || PARALLEL_BIN=parallel
  2154. + [ -d $(dirname "${OUTPUT}") ] || OUTPUT=/tmp/z1
  2155. +
  2156. + cat ${_CACHE_PACKAGE_GLOBAL} ${_CACHE_PACKAGE_LOCAL} | \
  2157. + ${PARALLEL_BIN} --plain --no-notice --max-args 30 json_worker | \
  2158. + ${SCRIPTS}/genpkglist.py --build $(get_pkg_steps build) --install $(get_pkg_steps install)
  2159. +}
  2160. +
  2161. +start_multithread_build || die "Parallel build/install failure"
  2162. --
  2163. 2.14.1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement