mkiso.sh 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #!/bin/sh
  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, or lxqt (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"
  89. WANT_INSTALLER=yes
  90. TARGET_ARCH="$ARCH"
  91. ;;
  92. aarch64*)
  93. GRUB_PKGS="grub-arm64-efi"
  94. GFX_PKGS="xorg-video-drivers"
  95. TARGET_ARCH="$ARCH"
  96. ;;
  97. asahi*)
  98. GRUB_PKGS="asahi-base asahi-scripts grub-arm64-efi"
  99. GFX_PKGS="mesa-asahi-dri"
  100. KERNEL_PKG="linux-asahi"
  101. TARGET_ARCH="aarch64${ARCH#asahi}"
  102. ;;
  103. esac
  104. A11Y_PKGS="espeakup void-live-audio brltty"
  105. PKGS="dialog cryptsetup lvm2 mdadm void-docs-browse xtools-minimal xmirror chrony tmux $A11Y_PKGS $GRUB_PKGS"
  106. XORG_PKGS="$GFX_PKGS xorg-minimal xorg-input-drivers setxkbmap xauth font-misc-misc terminus-font dejavu-fonts-ttf orca"
  107. SERVICES="sshd chronyd"
  108. LIGHTDM_SESSION=''
  109. case $variant in
  110. base)
  111. SERVICES="$SERVICES dhcpcd wpa_supplicant acpid"
  112. ;;
  113. enlightenment)
  114. PKGS="$PKGS $XORG_PKGS lightdm lightdm-gtk3-greeter enlightenment terminology udisks2 firefox"
  115. SERVICES="$SERVICES acpid dhcpcd wpa_supplicant lightdm dbus polkitd"
  116. LIGHTDM_SESSION=enlightenment
  117. ;;
  118. xfce)
  119. PKGS="$PKGS $XORG_PKGS lightdm lightdm-gtk3-greeter xfce4 gnome-themes-standard gnome-keyring network-manager-applet gvfs-afc gvfs-mtp gvfs-smb udisks2 firefox xfce4-pulseaudio-plugin"
  120. SERVICES="$SERVICES dbus lightdm NetworkManager polkitd"
  121. LIGHTDM_SESSION=xfce
  122. ;;
  123. mate)
  124. PKGS="$PKGS $XORG_PKGS lightdm lightdm-gtk3-greeter mate mate-extra gnome-keyring network-manager-applet gvfs-afc gvfs-mtp gvfs-smb udisks2 firefox"
  125. SERVICES="$SERVICES dbus lightdm NetworkManager polkitd"
  126. LIGHTDM_SESSION=mate
  127. ;;
  128. cinnamon)
  129. PKGS="$PKGS $XORG_PKGS lightdm lightdm-gtk3-greeter cinnamon gnome-keyring colord gnome-terminal gvfs-afc gvfs-mtp gvfs-smb udisks2 firefox"
  130. SERVICES="$SERVICES dbus lightdm NetworkManager polkitd"
  131. LIGHTDM_SESSION=cinnamon
  132. ;;
  133. gnome)
  134. PKGS="$PKGS $XORG_PKGS gnome firefox"
  135. SERVICES="$SERVICES dbus gdm NetworkManager polkitd"
  136. ;;
  137. kde)
  138. PKGS="$PKGS $XORG_PKGS kde5 konsole firefox dolphin NetworkManager"
  139. SERVICES="$SERVICES dbus NetworkManager sddm"
  140. ;;
  141. lxde)
  142. PKGS="$PKGS $XORG_PKGS lxde lightdm lightdm-gtk3-greeter gvfs-afc gvfs-mtp gvfs-smb udisks2 firefox"
  143. SERVICES="$SERVICES acpid dbus dhcpcd wpa_supplicant lightdm polkitd"
  144. LIGHTDM_SESSION=LXDE
  145. ;;
  146. lxqt)
  147. PKGS="$PKGS $XORG_PKGS lxqt sddm gvfs-afc gvfs-mtp gvfs-smb udisks2 firefox"
  148. SERVICES="$SERVICES dbus dhcpcd wpa_supplicant sddm polkitd"
  149. ;;
  150. *)
  151. >&2 echo "Unknown variant $variant"
  152. exit 1
  153. ;;
  154. esac
  155. if [ -n "$LIGHTDM_SESSION" ]; then
  156. mkdir -p "$INCLUDEDIR"/etc/lightdm
  157. echo "$LIGHTDM_SESSION" > "$INCLUDEDIR"/etc/lightdm/.session
  158. # needed to show the keyboard layout menu on the login screen
  159. cat <<- EOF > "$INCLUDEDIR"/etc/lightdm/lightdm-gtk-greeter.conf
  160. [greeter]
  161. indicators = ~host;~spacer;~clock;~spacer;~layout;~session;~a11y;~power
  162. EOF
  163. fi
  164. if [ "$WANT_INSTALLER" = yes ]; then
  165. include_installer
  166. else
  167. mkdir -p "$INCLUDEDIR"/usr/bin
  168. printf "#!/bin/sh\necho 'void-installer is not supported on this live image'\n" > "$INCLUDEDIR"/usr/bin/void-installer
  169. chmod 755 "$INCLUDEDIR"/usr/bin/void-installer
  170. fi
  171. if [ "$variant" != base ]; then
  172. setup_pipewire
  173. fi
  174. ./mklive.sh -a "$TARGET_ARCH" -o "$IMG" -p "$PKGS" -S "$SERVICES" -I "$INCLUDEDIR" \
  175. ${KERNEL_PKG:+-v $KERNEL_PKG} ${REPO} "$@"
  176. cleanup
  177. }
  178. if [ ! -x mklive.sh ]; then
  179. echo mklive.sh not found >&2
  180. exit 1
  181. fi
  182. if [ -n "$TRIPLET" ]; then
  183. VARIANT="${TRIPLET##*-}"
  184. REST="${TRIPLET%-*}"
  185. DATE="${REST##*-}"
  186. ARCH="${REST%-*}"
  187. build_variant "$VARIANT" "$@"
  188. else
  189. for image in $IMAGES; do
  190. build_variant "$image" "$@"
  191. done
  192. fi