release 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #!/usr/bin/env sh
  2. # SPDX-License-Identifier: MIT
  3. # SPDX-FileCopyrightText: 2020-2023 Leah Rowe <leah@libreboot.org>
  4. [ "x${DEBUG+set}" = 'xset' ] && set -v
  5. set -u -e
  6. . "include/err.sh"
  7. . "include/option.sh"
  8. eval "$(setvars "" vdir relname src_dirname srcdir _xm target romdir mode)"
  9. main()
  10. {
  11. vdir="release"
  12. while getopts d:m: option; do
  13. [ -z "${OPTARG}" ] && err "Empty argument not allowed"
  14. case "${option}" in
  15. d) vdir="${OPTARG}" ;;
  16. m) mode="${OPTARG}" ;;
  17. *) err "Invalid option" ;;
  18. esac
  19. done
  20. vdir="${vdir}/${version}"
  21. relname="${projectname}-${version}"
  22. src_dirname="${relname}_src"
  23. srcdir="${vdir}/${src_dirname}"
  24. [ -e "${vdir}" ] && err "already exists: \"${vdir}\""
  25. mkvdir
  26. build_release
  27. printf "DONE! Check release files under %s\n" "${vdir}"
  28. }
  29. mkvdir()
  30. {
  31. mkdir -p "${vdir}" || err "mkvdir: !mkdir -p \"${vdir}\""
  32. git clone . "${srcdir}" || err "mkdir: !gitclone \"${srcdir}\""
  33. insert_version_files "${srcdir}" || err "mkvdir ${srcdir}: versionfile"
  34. }
  35. build_release()
  36. {
  37. _xm="build_release ${vdir}"
  38. (
  39. cd "${srcdir}" || err "${_xm}: !cd \"${srcdir}\""
  40. fetch_trees
  41. x_ mv src/docs docs
  42. )
  43. (
  44. cd "${srcdir%/*}" || err "${_xm}: mktarball \"${srcdir}\""
  45. mktarball "${srcdir##*/}" "${srcdir##*/}.tar.xz" || err "${_xm}: mksrc"
  46. )
  47. [ "${mode}" = "src" ] && return 0 # for src mode, xgcc tarballs are
  48. # not included in the src archive
  49. # now build roms, then copy crossgcc to src and re-compress
  50. # while compressing rom images too.
  51. (
  52. cd "${srcdir}" || err "${_xm}: 2 !cd \"${srcdir}\""
  53. mkrom_images
  54. )
  55. for _cbd in "${srcdir}/src/coreboot/"*; do
  56. [ -d "${_cbd}/util/crossgcc/tarballs" ] || continue
  57. _xgccdir="${vdir}/crossgcc/${_cbd##*/}"
  58. mkdir -p "${_xgccdir}" || \
  59. err "build_release: !mkdir -p ${_xgccdir}"
  60. cp -R "${_cbd}/util/crossgcc/tarballs/"* "${_xgccdir}" || \
  61. err "build_gcc: !copy xgcc ${_cbd}"
  62. done
  63. rm -Rf "${srcdir}" || err "build_release: !rm -Rf ${srcdir}"
  64. (
  65. cd "${srcdir%/*}" || err "${_xm} 2: mktarball \"${srcdir}\""
  66. tar -xf "${srcdir##*/}.tar.xz" || err "!extract ${srcdir##*/}.tar.xz"
  67. rm -f "${srcdir##*/}.tar.xz" || err "!rm -f ${srcdir##*/}.tar.xz"
  68. )
  69. for _xgcc in "${vdir}/crossgcc/"*; do
  70. [ -d "${_xgcc}" ] || continue
  71. mkdir -p "${srcdir}/src/coreboot/${_xgcc##*/}/util/crossgcc/tarballs" || \
  72. err "!mkdir src/coreboot/${_xgcc##*/}/util/crossgcc/tarballs"
  73. mv "${_xgcc}/"* \
  74. "${srcdir}/src/coreboot/${_xgcc##*/}/util/crossgcc/tarballs/" \
  75. || err "!move xgcc tarballs to ${srcdir}/xgcc/${_xgcc##*/}"
  76. done
  77. rm -Rf "${vdir}/crossgcc" || err "!rm -Rf \"${vdir}/crossgcc\""
  78. (
  79. cd "${srcdir%/*}" || err "${_xm}: mktarball \"${srcdir}\""
  80. mktarball "${srcdir##*/}" "${srcdir##*/}.tar.xz" || err "${_xm}: mksrc"
  81. )
  82. rm -Rf "${srcdir}" || err "!rm -Rf ${srcdir}"
  83. }
  84. fetch_trees()
  85. {
  86. for x in config/git/*; do
  87. [ ! -f "${x}" ] || ./update trees -f "${x#config/git/}" || \
  88. err "${_xm}: fetch ${x#config/git/}"
  89. done
  90. for x in config/*/build.list; do
  91. [ -f "${x}" ] || continue
  92. xp="${x#*/}"; xp="${xp%/*}"
  93. [ -L "${xp}" ] || rm -Rf "src/${xp}/${xp}" || \
  94. err "!rm -Rf \"src/${xp}/${xp}\""
  95. done
  96. find . -name ".git" -exec rm -Rf {} + || err "${_xm}: rm .git"
  97. find . -name ".gitmodules" -exec rm -Rf {} + || err "${_xm}: rm .gitmod"
  98. x_ rm -Rf tmp .git
  99. }
  100. mkrom_images()
  101. {
  102. ./build roms all || err "${_xm}: roms-all"
  103. ./build serprog rp2040 || err "${_xm}: rp2040"
  104. ./build serprog stm32 || err "${_xm}: stm32"
  105. for rombuild in bin/*; do
  106. [ -d "${rombuild}" ] || continue
  107. handle_rom_archive "${rombuild}"
  108. done
  109. mv "release/${version}/roms/" ../roms || err "${_xm}: copy roms/"
  110. }
  111. handle_rom_archive()
  112. {
  113. builddir="${1}"
  114. romdir="tmp/romdir"
  115. rm -Rf "${romdir}" || err "!rm romdir, handle_rom_archive"
  116. target="${builddir##*/}"
  117. if [ ! -f "config/coreboot/${target}/target.cfg" ]; then
  118. # No config, just make a tarball
  119. tarball="release/${version}/roms/${relname}_${target}.tar.xz"
  120. insert_copying_files "${builddir}" || \
  121. err "!insert copy, handle, ${builddir}"
  122. mktarball "${builddir}" "${tarball}"
  123. return 0
  124. fi
  125. romdir="${romdir}/bin/${target}"
  126. mkdir -p "${romdir}" || err "!mkdir -p romdir, handle_rom_archive"
  127. cp "${builddir}/"* "${romdir}" || err "!cp romdir, handle_rom_archive"
  128. printf "Generating release/%s/roms/%s-%s_%s.tar.xz\n" \
  129. "${version}" "${projectname}" "${version}" "${target##*/}"
  130. insert_version_files "${romdir}" || \
  131. err "mkrom_tarball ${romdir}: versionfile"
  132. insert_copying_files "${romdir}" || err "!insert copy, handle 2, ${romdir}"
  133. mkrom_tarball
  134. }
  135. insert_copying_files()
  136. {
  137. rm -Rf "${1}/licenses" || return 1
  138. mkdir -p "${1}/licenses" || return 1
  139. l="${1}/licenses"
  140. # copy licenses to rom image archive, for completion
  141. cp "src/grub/COPYING" "${l}/COPYING.grub" || return 1
  142. cp "src/coreboot/default/COPYING" "${l}/COPYING.coreboot" || return 1
  143. cp -R "src/coreboot/default/LICENSES" "${l}/LICENSES.coreboot" || return 1
  144. cp "src/seabios/default/COPYING" "${l}/COPYING.coreboot" || return 1
  145. cp "src/seabios/default/COPYING.LESSER" "${l}/COPYING.LESSER.seabios" || return 1
  146. cp -R "src/u-boot/default/Licenses" "${l}/COPYING.u-boot" || return 1
  147. printf "Multiple licenses. Check corresponding %s source archive\n" \
  148. "${projectname}" > "${1}/COPYING" || return 1
  149. }
  150. mkrom_tarball()
  151. {
  152. archivename="${relname}_${target##*/}"
  153. f="release/${version}/roms/${archivename}"
  154. mkdir -p "${f%/*}" || err "mkrom_tarball: !mkdir -p ${f%/*}"
  155. (
  156. cd "${romdir%/bin/${target}}" || err "!cd ${romdir%/bin/${target}}"
  157. mktarball "bin/${target}" "${archivename}.tar.xz"
  158. )
  159. mv "${romdir%/bin/${target}}/${archivename}.tar.xz"* "${f%/*}" || \
  160. err "!mktarball, rom, ${f%/*}/${romdir%/bin/${target}}/${archivename}.tar.xz"
  161. printf "Created ROM archive: ${f%/*}/${archivename}.tar.xz"
  162. }
  163. insert_version_files()
  164. {
  165. printf "%s\n" "${version}" > "${1}/version" || return 1
  166. printf "%s\n" "${versiondate}" > "${1}/versiondate" || return 1
  167. printf "%s\n" "${projectname}" > "${1}/projectname" || return 1
  168. }
  169. mktarball()
  170. {
  171. # preserve timestamps for reproducible tarballs
  172. tar_implementation=$(tar --version | head -n1) || :
  173. [ "${2%/*}" = "${2}" ] || mkdir -p "${2%/*}" || err "mk, !mkdir -p \"${2%/*}\""
  174. if [ "${tar_implementation% *}" = "tar (GNU tar)" ]; then
  175. tar --sort=name --owner=root:0 --group=root:0 \
  176. --mtime="UTC 2023-11-07" -c "${1}" | xz -T0 -9e > "${2}" || \
  177. err "mktarball 1, ${1}"
  178. else
  179. # TODO: reproducible tarballs on non-GNU systems
  180. tar -c "${1}" | xz -T0 -9e > "${2}" || err "mktarball 2, ${1}"
  181. fi
  182. (
  183. [ "${2%/*}" != "${2}" ] && x_ cd "${2%/*}"
  184. sha512sum "${2##*/}" > "${2##*/}.sha512" || \
  185. err "!sha512sum \"${2##*/}\" > \"${2##*/}.sha512\""
  186. )
  187. }
  188. main $@