mkiso.sh 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #!/bin/bash
  2. set -eu
  3. . ./lib.sh
  4. PROGNAME=$(basename "$0")
  5. ARCH=$(uname -m)
  6. IMAGES="base"
  7. TRIPLET=
  8. REPO=
  9. DATE=$(date -u +%Y%m%d)
  10. usage() {
  11. cat <<-EOH
  12. Usage: $PROGNAME [options ...] [-- mklive options ...]
  13. Wrapper script around mklive.sh for several standard flavors of live images.
  14. Adds void-installer and other helpful utilities to the generated images.
  15. OPTIONS
  16. -a <arch> Set architecture (or platform) in the image
  17. -b <variant> One of base, enlightenment, xfce, mate, cinnamon, gnome, kde,
  18. lxde, lxqt, or xfce-wayland (default: base). May be specified multiple times
  19. to build multiple variants
  20. -d <date> Override the datestamp on the generated image (YYYYMMDD format)
  21. -t <arch-date-variant>
  22. Equivalent to setting -a, -b, and -d
  23. -r <repo> Use this XBPS repository. May be specified multiple times
  24. -h Show this help and exit
  25. -V Show version and exit
  26. Other options can be passed directly to mklive.sh by specifying them after the --.
  27. See mklive.sh -h for more details.
  28. EOH
  29. }
  30. while getopts "a:b:d:t:hr:V" opt; do
  31. case $opt in
  32. a) ARCH="$OPTARG";;
  33. b) IMAGES="$OPTARG";;
  34. d) DATE="$OPTARG";;
  35. r) REPO="-r $OPTARG $REPO";;
  36. t) TRIPLET="$OPTARG";;
  37. V) version; exit 0;;
  38. h) usage; exit 0;;
  39. *) usage >&2; exit 1;;
  40. esac
  41. done
  42. shift $((OPTIND - 1))
  43. INCLUDEDIR=$(mktemp -d)
  44. trap "cleanup" INT TERM
  45. cleanup() {
  46. rm -rf "$INCLUDEDIR"
  47. }
  48. include_installer() {
  49. if [ -x installer.sh ]; then
  50. MKLIVE_VERSION="$(PROGNAME='' version)"
  51. installer=$(mktemp)
  52. sed "s/@@MKLIVE_VERSION@@/${MKLIVE_VERSION}/" installer.sh > "$installer"
  53. install -Dm755 "$installer" "$INCLUDEDIR"/usr/bin/void-installer
  54. rm "$installer"
  55. else
  56. echo installer.sh not found >&2
  57. exit 1
  58. fi
  59. }
  60. setup_pipewire() {
  61. PKGS="$PKGS pipewire alsa-pipewire"
  62. case "$ARCH" in
  63. asahi*)
  64. PKGS="$PKGS asahi-audio"
  65. SERVICES="$SERVICES speakersafetyd"
  66. ;;
  67. esac
  68. mkdir -p "$INCLUDEDIR"/etc/xdg/autostart
  69. ln -sf /usr/share/applications/pipewire.desktop "$INCLUDEDIR"/etc/xdg/autostart/
  70. mkdir -p "$INCLUDEDIR"/etc/pipewire/pipewire.conf.d
  71. ln -sf /usr/share/examples/wireplumber/10-wireplumber.conf "$INCLUDEDIR"/etc/pipewire/pipewire.conf.d/
  72. ln -sf /usr/share/examples/pipewire/20-pipewire-pulse.conf "$INCLUDEDIR"/etc/pipewire/pipewire.conf.d/
  73. mkdir -p "$INCLUDEDIR"/etc/alsa/conf.d
  74. ln -sf /usr/share/alsa/alsa.conf.d/50-pipewire.conf "$INCLUDEDIR"/etc/alsa/conf.d
  75. ln -sf /usr/share/alsa/alsa.conf.d/99-pipewire-default.conf "$INCLUDEDIR"/etc/alsa/conf.d
  76. }
  77. build_variant() {
  78. variant="$1"
  79. shift
  80. IMG=void-live-${ARCH}-${DATE}-${variant}.iso
  81. # el-cheapo installer is unsupported on arm because arm doesn't install a kernel by default
  82. # and to work around that would add too much complexity to it
  83. # thus everyone should just do a chroot install anyways
  84. WANT_INSTALLER=no
  85. case "$ARCH" in
  86. x86_64*|i686*)
  87. GRUB_PKGS="grub-i386-efi grub-x86_64-efi"
  88. GFX_PKGS="xorg-video-drivers xf86-video-intel"
  89. GFX_WL_PKGS="mesa-dri"
  90. WANT_INSTALLER=yes
  91. TARGET_ARCH="$ARCH"
  92. ;;
  93. aarch64*)
  94. GRUB_PKGS="grub-arm64-efi"
  95. GFX_PKGS="xorg-video-drivers"
  96. GFX_WL_PKGS="mesa-dri"
  97. TARGET_ARCH="$ARCH"
  98. ;;
  99. asahi*)
  100. GRUB_PKGS="asahi-base asahi-scripts grub-arm64-efi"
  101. GFX_PKGS="mesa-asahi-dri"
  102. GFX_WL_PKGS="mesa-asahi-dri"
  103. KERNEL_PKG="linux-asahi"
  104. TARGET_ARCH="aarch64${ARCH#asahi}"
  105. if [ "$variant" = xfce ]; then
  106. info_msg "xfce is not supported on asahi, switching to xfce-wayland"
  107. variant="xfce-wayland"
  108. fi
  109. ;;
  110. esac
  111. A11Y_PKGS="espeakup void-live-audio brltty"
  112. PKGS="dialog cryptsetup lvm2 mdadm void-docs-browse xtools-minimal xmirror chrony tmux $A11Y_PKGS $GRUB_PKGS"
  113. FONTS="font-misc-misc terminus-font dejavu-fonts-ttf"
  114. WAYLAND_PKGS="$GFX_WL_PKGS $FONTS orca"
  115. XORG_PKGS="$GFX_PKGS $FONTS xorg-minimal xorg-input-drivers setxkbmap xauth orca"
  116. SERVICES="sshd chronyd"
  117. LIGHTDM_SESSION=''
  118. case $variant in
  119. base)
  120. SERVICES="$SERVICES dhcpcd wpa_supplicant acpid"
  121. ;;
  122. enlightenment)
  123. PKGS="$PKGS $XORG_PKGS lightdm lightdm-gtk-greeter enlightenment terminology udisks2"
  124. SERVICES="$SERVICES acpid dhcpcd wpa_supplicant lightdm dbus polkitd"
  125. LIGHTDM_SESSION=enlightenment
  126. ;;
  127. xfce*)
  128. PKGS="$PKGS $XORG_PKGS lightdm lightdm-gtk-greeter xfce4 gnome-themes-standard gnome-keyring network-manager-applet gvfs-afc gvfs-mtp gvfs-smb udisks2 xfce4-pulseaudio-plugin"
  129. SERVICES="$SERVICES dbus lightdm NetworkManager polkitd"
  130. LIGHTDM_SESSION=xfce
  131. if [ "$variant" == "xfce-wayland" ]; then
  132. PKGS="$PKGS $WAYLAND_PKGS labwc"
  133. LIGHTDM_SESSION="xfce-wayland"
  134. fi
  135. ;;
  136. mate)
  137. PKGS="$PKGS $XORG_PKGS lightdm lightdm-gtk-greeter mate mate-extra gnome-keyring network-manager-applet gvfs-afc gvfs-mtp gvfs-smb udisks2"
  138. SERVICES="$SERVICES dbus lightdm NetworkManager polkitd"
  139. LIGHTDM_SESSION=mate
  140. ;;
  141. cinnamon)
  142. PKGS="$PKGS $XORG_PKGS lightdm lightdm-gtk-greeter cinnamon gnome-keyring colord gnome-terminal gvfs-afc gvfs-mtp gvfs-smb udisks2"
  143. SERVICES="$SERVICES dbus lightdm NetworkManager polkitd"
  144. LIGHTDM_SESSION=cinnamon
  145. ;;
  146. gnome)
  147. PKGS="$PKGS $XORG_PKGS gnome"
  148. SERVICES="$SERVICES dbus gdm NetworkManager polkitd"
  149. ;;
  150. kde)
  151. PKGS="$PKGS $XORG_PKGS kde5 konsole dolphin NetworkManager"
  152. SERVICES="$SERVICES dbus NetworkManager sddm"
  153. ;;
  154. lxde)
  155. PKGS="$PKGS $XORG_PKGS lxde lightdm lightdm-gtk-greeter gvfs-afc gvfs-mtp gvfs-smb udisks2"
  156. SERVICES="$SERVICES acpid dbus dhcpcd wpa_supplicant lightdm polkitd"
  157. LIGHTDM_SESSION=LXDE
  158. ;;
  159. lxqt)
  160. PKGS="$PKGS $XORG_PKGS lxqt sddm gvfs-afc gvfs-mtp gvfs-smb udisks2"
  161. SERVICES="$SERVICES dbus dhcpcd wpa_supplicant sddm polkitd"
  162. ;;
  163. *)
  164. >&2 echo "Unknown variant $variant"
  165. exit 1
  166. ;;
  167. esac
  168. if [ -n "$LIGHTDM_SESSION" ]; then
  169. mkdir -p "$INCLUDEDIR"/etc/lightdm
  170. echo "$LIGHTDM_SESSION" > "$INCLUDEDIR"/etc/lightdm/.session
  171. # needed to show the keyboard layout menu on the login screen
  172. cat <<- EOF > "$INCLUDEDIR"/etc/lightdm/lightdm-gtk-greeter.conf
  173. [greeter]
  174. indicators = ~host;~spacer;~clock;~spacer;~layout;~session;~a11y;~power
  175. EOF
  176. fi
  177. if [ "$WANT_INSTALLER" = yes ]; then
  178. include_installer
  179. else
  180. mkdir -p "$INCLUDEDIR"/usr/bin
  181. printf "#!/bin/sh\necho 'void-installer is not supported on this live image'\n" > "$INCLUDEDIR"/usr/bin/void-installer
  182. chmod 755 "$INCLUDEDIR"/usr/bin/void-installer
  183. fi
  184. if [ "$variant" != base ]; then
  185. setup_pipewire
  186. fi
  187. ./mklive.sh -a "$TARGET_ARCH" -o "$IMG" -p "$PKGS" -S "$SERVICES" -I "$INCLUDEDIR" \
  188. ${KERNEL_PKG:+-v $KERNEL_PKG} ${REPO} "$@"
  189. cleanup
  190. }
  191. if [ ! -x mklive.sh ]; then
  192. echo mklive.sh not found >&2
  193. exit 1
  194. fi
  195. if [ -n "$TRIPLET" ]; then
  196. IFS=: read -r ARCH DATE VARIANT _ < <( echo "$TRIPLET" | sed -Ee 's/^(.+)-([0-9rc]+)-(.+)$/\1:\2:\3/' )
  197. build_variant "$VARIANT" "$@"
  198. else
  199. for image in $IMAGES; do
  200. build_variant "$image" "$@"
  201. done
  202. fi