build 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. #!/usr/bin/env sh
  2. # SPDX-License-Identifier: GPL-3.0-or-later
  3. # SPDX-FileCopyrightText: 2014,2015,2020-2024 Leah Rowe <leah@libreboot.org>
  4. # SPDX-FileCopyrightText: 2015 Patrick "P. J." McDermott <pj@pehjota.net>
  5. # SPDX-FileCopyrightText: 2015, 2016 Klemens Nanni <contact@autoboot.org>
  6. # SPDX-FileCopyrightText: 2022, Caleb La Grange <thonkpeasant@protonmail.com>
  7. set -u -e
  8. if [ "./${0##*/}" != "${0}" ] || [ ! -f "build" ] || [ -L "build" ]; then
  9. printf "You must run this in the lbmk work directory.\n" 1>&2
  10. exit 1
  11. fi
  12. . "include/option.sh"
  13. . "include/vendor.sh"
  14. . "include/mrc.sh"
  15. eval "$(setvars "" script_path aur_notice vdir relname src_dirname srcdir \
  16. _xm target romdir mode)"
  17. err="fail"
  18. linkpath="${0}"
  19. linkname="${linkpath##*/}"
  20. main()
  21. {
  22. x_ id -u 1>/dev/null 2>/dev/null
  23. [ $# -lt 1 ] && $err "Too few arguments. Try: ${0} help"
  24. [ "$1" = "dependencies" ] && x_ install_packages $@ && lbmk_exit 0
  25. for cmd in initcmd check_git check_project git_init excmd; do
  26. eval "${cmd} \$@"
  27. done
  28. lbmk_exit 0
  29. }
  30. initcmd()
  31. {
  32. [ "$(id -u)" != "0" ] || $err "this command as root is not permitted"
  33. check_project
  34. case "${1}" in
  35. help) usage ${0} ;;
  36. list) items "script" ;;
  37. version) mkversion ;;
  38. release) shift 1; mkrelease $@ ;;
  39. inject) shift 1; vendor_inject $@ ;;
  40. download) shift 1; vendor_download $@ ;;
  41. *)
  42. script_path="script/${1}"
  43. return 0 ;;
  44. esac
  45. set -u -e # some commands disable them. turn them on!
  46. lbmk_exit 0
  47. }
  48. install_packages()
  49. {
  50. if [ $# -lt 2 ]; then
  51. printf "You must specify a distro, namely:\n" 1>&2
  52. printf "Look at files under config/dependencies/\n" 1>&2
  53. printf "Example: ./build dependencies debian\n" 1>&2
  54. $err "install_packages: target not specified"
  55. fi
  56. [ -f "config/dependencies/${2}" ] || $err "Unsupported target"
  57. . "config/dependencies/${2}"
  58. x_ ${pkg_add} ${pkglist}
  59. [ -z "${aur_notice}" ] && return 0
  60. printf "You must install AUR packages: %s\n" "$aur_notice" 1>&2
  61. }
  62. # release archives contain .gitignore, but not .git.
  63. # lbmk can be run from lbmk.git, or an archive.
  64. git_init()
  65. {
  66. [ -L ".git" ] && $err "Reference .git is a symlink"
  67. [ -e ".git" ] && return 0
  68. eval "$(setvars "$(date -Rd @${versiondate})" cdate _nogit)"
  69. git init || $err "${PWD}: cannot initialise Git repository"
  70. git add -A . || $err "${PWD}: cannot add files to Git repository"
  71. git commit -m "${projectname} ${version}" --date "${cdate}" \
  72. --author="lbmk <lbmk@libreboot.org>" || \
  73. $err "$PWD: can't commit ${projectname}/${version}, date $cdate"
  74. git tag -a "${version}" -m "${projectname} ${version}" || \
  75. $err "${PWD}: cannot git-tag ${projectname}/${version}"
  76. }
  77. excmd()
  78. {
  79. [ -f "${script_path}" ] || $err "Bad command. Run: ${linkpath} help"
  80. shift 1; "$script_path" $@ || $err "excmd: ${script_path} ${@}"
  81. }
  82. usage()
  83. {
  84. progname=${0}
  85. cat <<- EOF
  86. $(mkversion)
  87. USAGE: ${progname} <OPTION>
  88. possible values for 'OPTION':
  89. $(items "script")
  90. Special commands (consult $projectname documentation):
  91. ./vendor inject
  92. ./vendor download
  93. ./update release
  94. ./build dependencies distroname
  95. (replace distroname with a filename from config/dependencies/)
  96. To know what ${projectname} version you're on, type:
  97. ${progname} version
  98. Refer to ${projectname} documentation for more info.
  99. EOF
  100. }
  101. mkrelease()
  102. {
  103. export LBMK_RELEASE="y"
  104. vdir="release"
  105. while getopts d:m: option; do
  106. [ -z "${OPTARG}" ] && $err "Empty argument not allowed"
  107. case "${option}" in
  108. d) vdir="${OPTARG}" ;;
  109. m) mode="${OPTARG}" ;;
  110. *) $err "Invalid option" ;;
  111. esac
  112. done
  113. check_project
  114. vdir="${vdir}/${version}"
  115. relname="${projectname}-${version}"
  116. [ "${mode}" = "u-boot" ] && relname="u-boot-for-${relname}"
  117. src_dirname="${relname}_src"
  118. srcdir="${vdir}/${src_dirname}"
  119. [ -e "${vdir}" ] && $err "already exists: \"${vdir}\""
  120. mkvdir
  121. build_release
  122. printf "\n\nDONE! Check release files under %s\n" "${vdir}"
  123. }
  124. mkvdir()
  125. {
  126. mkdir -p "${vdir}" || $err "mkvdir: !mkdir -p \"${vdir}\""
  127. git clone . "${srcdir}" || $err "mkdir: !gitclone \"${srcdir}\""
  128. insert_version_files "$srcdir" || $err "mkvdir $srcdir: versionfile"
  129. }
  130. build_release()
  131. {
  132. _xm="build_release ${vdir}"
  133. (
  134. cd "${srcdir}" || $err "${_xm}: !cd \"${srcdir}\""
  135. fetch_trees
  136. [ "${mode}" = "u-boot" ] || x_ mv src/docs docs
  137. ) || $err "can't create release files"
  138. git log --graph --pretty=format:'%Cred%h%Creset %s %Creset' \
  139. --abbrev-commit > "${srcdir}/CHANGELOG" || \
  140. $err "build_release $srcdir: couldn't generate changelog"
  141. (
  142. if [ "${mode}" = "u-boot" ]; then
  143. cd "${srcdir}/src/" || $err "${_xm}: mktarball \"${srcdir}\""
  144. mktarball u-boot "../../${srcdir##*/}.tar.xz" || \
  145. $err "$_xm: mksrc"
  146. # make a src archive containing only u-boot
  147. else
  148. cd "${srcdir%/*}" || $err "${_xm}: mktarball \"${srcdir}\""
  149. mktarball "${srcdir##*/}" "${srcdir##*/}.tar.xz" || \
  150. $err "$_xm: mksrc"
  151. fi
  152. ) || $err "can't create src tarball"
  153. [ "${mode}" = "src" ] && return 0
  154. [ "${mode}" = "u-boot" ] && return 0
  155. (
  156. cd "${srcdir}" || $err "${_xm}: 2 !cd \"${srcdir}\""
  157. mkrom_images
  158. ) || $err "can't build rom images"
  159. rm -Rf "${srcdir}" || $err "!rm -Rf ${srcdir}"
  160. }
  161. fetch_trees()
  162. {
  163. for x in config/git/*; do
  164. [ "${mode}" = "u-boot" ] && break
  165. [ ! -f "${x}" ] || ./update trees -f "${x#config/git/}" || \
  166. $err "${_xm}: fetch ${x#config/git/}"
  167. done
  168. [ "${mode}" = "u-boot" ] && x_ ./update trees -f u-boot
  169. for x in config/*/build.list; do
  170. [ -f "${x}" ] || continue
  171. xp="${x#*/}"; xp="${xp%/*}"
  172. [ -L "${xp}" ] || rm -Rf "src/${xp}/${xp}" || \
  173. $err "!rm -Rf \"src/${xp}/${xp}\""
  174. done
  175. find . -name ".git" -exec rm -Rf {} + || $err "$_xm: rm .git"
  176. find . -name ".gitmodules" -exec rm -Rf {} + || $err "$_xm: rm .gitmod"
  177. x_ rm -Rf tmp .git
  178. }
  179. mkrom_images()
  180. {
  181. ./build roms all || $err "${_xm}: roms-all"
  182. ./build roms serprog rp2040 || $err "${_xm}: rp2040"
  183. ./build roms serprog stm32 || $err "${_xm}: stm32"
  184. for rombuild in bin/*; do
  185. [ -d "${rombuild}" ] || continue
  186. handle_rom_archive "${rombuild}"
  187. done
  188. mv "release/${version}/roms/" ../roms || $err "${_xm}: copy roms/"
  189. }
  190. handle_rom_archive()
  191. {
  192. builddir="${1}"
  193. romdir="tmp/romdir"
  194. rm -Rf "${romdir}" || $err "!rm romdir, handle_rom_archive"
  195. target="${builddir##*/}"
  196. if [ ! -f "config/coreboot/${target}/target.cfg" ]; then
  197. # No config, just make a tarball
  198. tarball="release/${version}/roms/${relname}_${target}.tar.xz"
  199. insert_copying_files "${builddir}" || \
  200. $err "!insert copy, handle, ${builddir}"
  201. mktarball "${builddir}" "${tarball}"
  202. return 0
  203. fi
  204. romdir="${romdir}/bin/${target}"
  205. mkdir -p "${romdir}" || $err "!mkdir -p romdir, handle_rom_archive"
  206. cp "$builddir/"* "$romdir" || $err "!cp romdir, handle_rom_archive"
  207. nukerom
  208. printf "Generating release/%s/roms/%s-%s_%s.tar.xz\n" \
  209. "${version}" "${projectname}" "${version}" "${target##*/}"
  210. insert_version_files "${romdir}" || \
  211. $err "mkrom_tarball ${romdir}: versionfile"
  212. insert_copying_files "$romdir" || $err "!insert copy, handle 2, $romdir"
  213. mkrom_tarball
  214. }
  215. nukerom()
  216. {
  217. . "config/coreboot/${target}/target.cfg"
  218. # Hash the images before removing vendor files
  219. # which "./vendor inject" uses for verification
  220. rm -f "${romdir}/vendorhashes" || $err "!rm ${romdir}/vendorhashes"
  221. touch "${romdir}/vendorhashes" || $err "!touch ${romdir}/vendorhashes"
  222. (
  223. cd "${romdir}" || $err "!cd romdir ${romdir}, nukerom"
  224. sha512sum ./*.rom >> vendorhashes || \
  225. $err "!create vendorhashes, nukerom"
  226. ) || $err "can't create vendor hashes"
  227. for romfile in "${romdir}"/*.rom; do
  228. [ -f "${romfile}" ] || continue
  229. ./vendor inject -r "$romfile" -b "$target" -n nuke || \
  230. $err "!vendor inject (nuke) ${romfile}, nukerom"
  231. done
  232. }
  233. insert_copying_files()
  234. {
  235. remkdir "${1}/licenses"
  236. l="${1}/licenses"
  237. # copy licenses to rom image archive, for completion
  238. cp "src/grub/COPYING" "${l}/COPYING.grub" || return 1
  239. cp "src/coreboot/default/COPYING" "${l}/COPYING.coreboot" || return 1
  240. cp -R "src/coreboot/default/LICENSES" "${l}/LICENSES.coreboot" || \
  241. return 1
  242. cp "src/seabios/default/COPYING" "${l}/COPYING.coreboot" || return 1
  243. cp "src/seabios/default/COPYING.LESSER" "$l/COPYING.LESSER.seabios" \
  244. || return 1
  245. cp -R "src/u-boot/default/Licenses" "${l}/COPYING.u-boot" || return 1
  246. printf "Multiple licenses. Check corresponding %s source archive\n" \
  247. "${projectname}" > "${1}/COPYING" || return 1
  248. rm -f src/u-boot/*/test/lib/strlcat.c || return 1
  249. }
  250. mkrom_tarball()
  251. {
  252. archivename="${relname}_${target##*/}"
  253. f="release/${version}/roms/${archivename}"
  254. mkdir -p "${f%/*}" || $err "mkrom_tarball: !mkdir -p ${f%/*}"
  255. (
  256. cd "${romdir%"/bin/$target"}" || $err "!cd ${romdir%"/bin/$target"}"
  257. mktarball "bin/${target}" "${archivename}.tar.xz"
  258. ) || $err "can't create rom tarball"
  259. mv "${romdir%"/bin/${target}"}/${archivename}.tar.xz"* "${f%/*}" || \
  260. $err "mktar ${f%/*}/${romdir%"/bin/$target"}/$archivename.tar.xz"
  261. printf "Created ROM archive: %s" "${f%/*}/${archivename}.tar.xz"
  262. }
  263. insert_version_files()
  264. {
  265. printf "%s\n" "${version}" > "${1}/version" || return 1
  266. printf "%s\n" "${versiondate}" > "${1}/versiondate" || return 1
  267. printf "%s\n" "${projectname}" > "${1}/projectname" || return 1
  268. }
  269. mktarball()
  270. {
  271. # preserve timestamps for reproducible tarballs
  272. tar_implementation=$(tar --version | head -n1) || :
  273. [ "${2%/*}" = "${2}" ] || \
  274. mkdir -p "${2%/*}" || $err "mk, !mkdir -p \"${2%/*}\""
  275. printf "\nCreating archive: %s\n\n" "$2"
  276. if [ "${tar_implementation% *}" = "tar (GNU tar)" ]; then
  277. tar --sort=name --owner=root:0 --group=root:0 \
  278. --mtime="UTC 2024-05-04" -c "$1" | xz -T$threads -9e \
  279. > "$2" || $err "mktarball 1, ${1}"
  280. else
  281. # TODO: reproducible tarballs on non-GNU systems
  282. tar -c "$1" | xz -T$threads -9e > "$2" || \
  283. $err "mktarball 2, $1"
  284. fi
  285. (
  286. [ "${2%/*}" != "${2}" ] && x_ cd "${2%/*}"
  287. sha512sum "${2##*/}" > "${2##*/}.sha512" || \
  288. $err "!sha512sum \"${2##*/}\" > \"${2##*/}.sha512\""
  289. ) || $err "failed to create tarball checksum"
  290. }
  291. mkversion()
  292. {
  293. printf "revision: %s %s\n" "$projectname" "$version"
  294. printf "revision date: %s\n" "$(date -Rud @${versiondate})"
  295. }
  296. lbmk_exit()
  297. {
  298. tmp_cleanup || err_ "lbmk_exit: can't rm tmpdir upon exit $1: $tmpdir"
  299. exit $1
  300. }
  301. fail()
  302. {
  303. tmp_cleanup || printf "WARNING: can't rm tmpdir: %s\n" "$tmpdir" 1>&2
  304. err_ "${1}"
  305. }
  306. tmp_cleanup()
  307. {
  308. [ "${tmpdir_was_set}" = "n" ] || return 0
  309. rm -Rf "${tmpdir}" || return 1
  310. }
  311. main $@