feat: add live desktop ISO build (stable-cinnamon Cinnamon live session)
This commit is contained in:
8
Makefile
8
Makefile
@@ -2,6 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Targets:
|
# Targets:
|
||||||
# make iso build the auto-installing ISO (uses docker)
|
# make iso build the auto-installing ISO (uses docker)
|
||||||
|
# make live build the full Cinnamon live desktop ISO
|
||||||
# make test-disk create a fresh QEMU test disk that mimics XPS 17 layout
|
# make test-disk create a fresh QEMU test disk that mimics XPS 17 layout
|
||||||
# make test full automated QEMU smoke test
|
# make test full automated QEMU smoke test
|
||||||
# make test-iso rebuild only the TEST ISO variant
|
# make test-iso rebuild only the TEST ISO variant
|
||||||
@@ -14,7 +15,7 @@ PROJECT_DIR := $(CURDIR)
|
|||||||
OUT := $(PROJECT_DIR)/out
|
OUT := $(PROJECT_DIR)/out
|
||||||
SECRETS := $(PROJECT_DIR)/secrets.env
|
SECRETS := $(PROJECT_DIR)/secrets.env
|
||||||
|
|
||||||
.PHONY: all iso test test-disk test-iso qemu shellcheck clean distclean check-secrets check-docker
|
.PHONY: all iso live test test-disk test-iso qemu shellcheck clean distclean check-secrets check-docker
|
||||||
|
|
||||||
all: iso
|
all: iso
|
||||||
|
|
||||||
@@ -28,6 +29,9 @@ check-docker:
|
|||||||
iso: check-secrets check-docker
|
iso: check-secrets check-docker
|
||||||
$(PROJECT_DIR)/iso/build-iso.sh
|
$(PROJECT_DIR)/iso/build-iso.sh
|
||||||
|
|
||||||
|
live: check-secrets check-docker
|
||||||
|
$(PROJECT_DIR)/iso/build-live-iso.sh
|
||||||
|
|
||||||
test-iso: check-secrets check-docker
|
test-iso: check-secrets check-docker
|
||||||
REBUILD_ISO=1 $(PROJECT_DIR)/tests/run-qemu-test.sh
|
REBUILD_ISO=1 $(PROJECT_DIR)/tests/run-qemu-test.sh
|
||||||
|
|
||||||
@@ -48,6 +52,8 @@ shellcheck:
|
|||||||
$(PROJECT_DIR)/installer/lib/*.sh \
|
$(PROJECT_DIR)/installer/lib/*.sh \
|
||||||
$(PROJECT_DIR)/iso/build-iso.sh \
|
$(PROJECT_DIR)/iso/build-iso.sh \
|
||||||
$(PROJECT_DIR)/iso/_inner-build.sh \
|
$(PROJECT_DIR)/iso/_inner-build.sh \
|
||||||
|
$(PROJECT_DIR)/iso/_inner-build-live.sh \
|
||||||
|
$(PROJECT_DIR)/iso/build-live-iso.sh \
|
||||||
$(PROJECT_DIR)/tests/*.sh \
|
$(PROJECT_DIR)/tests/*.sh \
|
||||||
$(PROJECT_DIR)/tests/lib/*.sh
|
$(PROJECT_DIR)/tests/lib/*.sh
|
||||||
|
|
||||||
|
|||||||
146
config/profiles/stable-cinnamon/packages.live-desktop.list
Normal file
146
config/profiles/stable-cinnamon/packages.live-desktop.list
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
# Packages included in the LIVE desktop ISO squashfs.
|
||||||
|
# This is the full stable-cinnamon desktop environment — the live session
|
||||||
|
# boots directly into Cinnamon so you can test on real hardware.
|
||||||
|
# (Separate from packages.list which is the target-install list.)
|
||||||
|
|
||||||
|
# --- base / boot ---
|
||||||
|
base-system
|
||||||
|
linux
|
||||||
|
linux-firmware
|
||||||
|
linux-firmware-network
|
||||||
|
intel-ucode
|
||||||
|
dracut
|
||||||
|
|
||||||
|
# --- core userspace ---
|
||||||
|
sudo
|
||||||
|
bash
|
||||||
|
bash-completion
|
||||||
|
git
|
||||||
|
curl
|
||||||
|
wget
|
||||||
|
vim
|
||||||
|
nano
|
||||||
|
htop
|
||||||
|
tmux
|
||||||
|
unzip
|
||||||
|
zip
|
||||||
|
xz
|
||||||
|
rsync
|
||||||
|
pciutils
|
||||||
|
usbutils
|
||||||
|
lsof
|
||||||
|
file
|
||||||
|
which
|
||||||
|
man-pages
|
||||||
|
mdocml
|
||||||
|
ca-certificates
|
||||||
|
xtools
|
||||||
|
gptfdisk
|
||||||
|
parted
|
||||||
|
btrfs-progs
|
||||||
|
dosfstools
|
||||||
|
|
||||||
|
# --- networking ---
|
||||||
|
NetworkManager
|
||||||
|
NetworkManager-openvpn
|
||||||
|
openssh
|
||||||
|
iwd
|
||||||
|
wpa_supplicant
|
||||||
|
chrony
|
||||||
|
|
||||||
|
# --- audio ---
|
||||||
|
pipewire
|
||||||
|
wireplumber
|
||||||
|
alsa-pipewire
|
||||||
|
pavucontrol
|
||||||
|
alsa-utils
|
||||||
|
|
||||||
|
# --- graphics / xorg ---
|
||||||
|
xorg-minimal
|
||||||
|
xorg-fonts
|
||||||
|
xorg-input-drivers
|
||||||
|
xf86-input-libinput
|
||||||
|
xf86-video-intel
|
||||||
|
mesa-dri
|
||||||
|
mesa-vulkan-intel
|
||||||
|
intel-video-accel
|
||||||
|
vulkan-loader
|
||||||
|
|
||||||
|
# --- nvidia (PRIME offload) ---
|
||||||
|
nvidia
|
||||||
|
nvidia-libs-32bit
|
||||||
|
nvidia-vaapi-driver
|
||||||
|
|
||||||
|
# --- desktop ---
|
||||||
|
cinnamon
|
||||||
|
xdg-user-dirs
|
||||||
|
xdg-utils
|
||||||
|
xdg-desktop-portal
|
||||||
|
xdg-desktop-portal-gtk
|
||||||
|
gvfs
|
||||||
|
gvfs-mtp
|
||||||
|
gvfs-smb
|
||||||
|
file-roller
|
||||||
|
gnome-keyring
|
||||||
|
seahorse
|
||||||
|
network-manager-applet
|
||||||
|
blueman
|
||||||
|
bluez
|
||||||
|
|
||||||
|
# --- display manager ---
|
||||||
|
lightdm
|
||||||
|
lightdm-gtk3-greeter
|
||||||
|
|
||||||
|
# --- fonts ---
|
||||||
|
noto-fonts-ttf
|
||||||
|
noto-fonts-emoji
|
||||||
|
noto-fonts-cjk
|
||||||
|
liberation-fonts-ttf
|
||||||
|
dejavu-fonts-ttf
|
||||||
|
font-awesome6
|
||||||
|
|
||||||
|
# --- terminal ---
|
||||||
|
alacritty
|
||||||
|
|
||||||
|
# --- gtk theming deps ---
|
||||||
|
sassc
|
||||||
|
gnome-themes-extra
|
||||||
|
gtk-engine-murrine
|
||||||
|
dconf
|
||||||
|
dconf-editor
|
||||||
|
|
||||||
|
# --- media / utilities ---
|
||||||
|
vlc
|
||||||
|
flameshot
|
||||||
|
|
||||||
|
# --- containers ---
|
||||||
|
docker
|
||||||
|
docker-compose
|
||||||
|
|
||||||
|
# --- nix package manager ---
|
||||||
|
nix
|
||||||
|
|
||||||
|
# --- zram / swap ---
|
||||||
|
zramen
|
||||||
|
|
||||||
|
# --- power / laptop ---
|
||||||
|
tlp
|
||||||
|
tlp-rdw
|
||||||
|
acpi
|
||||||
|
acpid
|
||||||
|
upower
|
||||||
|
brightnessctl
|
||||||
|
|
||||||
|
# --- printing ---
|
||||||
|
cups
|
||||||
|
cups-filters
|
||||||
|
cups-pk-helper
|
||||||
|
system-config-printer
|
||||||
|
|
||||||
|
# --- bluetooth ---
|
||||||
|
bluez-alsa
|
||||||
|
|
||||||
|
# --- live session utils ---
|
||||||
|
dialog
|
||||||
|
ncurses
|
||||||
|
util-linux
|
||||||
65
iso/_inner-build-live.sh
Executable file
65
iso/_inner-build-live.sh
Executable file
@@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Runs INSIDE the docker container (as root). Invoked by iso/build-live-iso.sh.
|
||||||
|
# Expects the project bind-mounted at /work and the cache at /cache.
|
||||||
|
#
|
||||||
|
# Required env (set by build-live-iso.sh):
|
||||||
|
# ARCH, REPO_URL, KEYMAP, LOCALE, ISO_PKGS, ISO_TITLE, OUT_ISO_REL,
|
||||||
|
# INCLUDE_DIR_REL
|
||||||
|
|
||||||
|
set -Eeuo pipefail
|
||||||
|
|
||||||
|
: "${ARCH:?}"; : "${REPO_URL:?}"; : "${KEYMAP:?}"; : "${LOCALE:?}"
|
||||||
|
: "${ISO_PKGS:?}"; : "${ISO_TITLE:?}"; : "${OUT_ISO_REL:?}"
|
||||||
|
: "${INCLUDE_DIR_REL:?}"
|
||||||
|
|
||||||
|
CACHE_DIR=/cache
|
||||||
|
PROJECT_DIR=/work
|
||||||
|
MKLIVE_DIR="$CACHE_DIR/void-mklive"
|
||||||
|
INCLUDE_DIR="$PROJECT_DIR/$INCLUDE_DIR_REL"
|
||||||
|
OUT_ISO="$PROJECT_DIR/$OUT_ISO_REL"
|
||||||
|
|
||||||
|
export PATH="$CACHE_DIR/xbps-static/usr/bin:$PATH"
|
||||||
|
|
||||||
|
[[ -d "$MKLIVE_DIR" ]] || { echo "ERROR: $MKLIVE_DIR missing"; exit 1; }
|
||||||
|
[[ -d "$INCLUDE_DIR" ]] || { echo "ERROR: $INCLUDE_DIR missing"; exit 1; }
|
||||||
|
command -v xbps-install.static >/dev/null \
|
||||||
|
|| { echo "ERROR: xbps-install.static not on PATH"; exit 1; }
|
||||||
|
|
||||||
|
mkdir -p "$(dirname "$OUT_ISO")"
|
||||||
|
|
||||||
|
# Compile dconf system-db inside the include dir so it ships compiled.
|
||||||
|
if command -v dconf >/dev/null 2>&1 && [[ -d "$INCLUDE_DIR/etc/dconf/db/local.d" ]]; then
|
||||||
|
DCONF_PROFILE_PATH="$INCLUDE_DIR/etc/dconf/profile" \
|
||||||
|
DCONF_SYSTEM_DB_PATH="$INCLUDE_DIR/etc/dconf/db" \
|
||||||
|
dconf update "$INCLUDE_DIR/etc/dconf/db" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd "$MKLIVE_DIR"
|
||||||
|
|
||||||
|
_cleanup_mklive_builds() {
|
||||||
|
local d sub
|
||||||
|
for d in "$MKLIVE_DIR"/mklive-build.*/; do
|
||||||
|
[[ -d "$d" ]] || continue
|
||||||
|
for sub in tmp-rootfs/sys tmp-rootfs/proc tmp-rootfs/dev tmp-rootfs/run \
|
||||||
|
image/rootfs/sys image/rootfs/proc image/rootfs/dev image/rootfs/run; do
|
||||||
|
[[ -d "$d$sub" ]] && umount -R --lazy "$d$sub" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
rm -rf "$d" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
}
|
||||||
|
trap _cleanup_mklive_builds EXIT
|
||||||
|
|
||||||
|
./mklive.sh \
|
||||||
|
-a "$ARCH" \
|
||||||
|
-r "$REPO_URL" \
|
||||||
|
-c "$CACHE_DIR/xbps-live-pkgs" \
|
||||||
|
-H "$CACHE_DIR/xbps-host-pkgs" \
|
||||||
|
-k "$KEYMAP" \
|
||||||
|
-l "$LOCALE" \
|
||||||
|
-T "$ISO_TITLE" \
|
||||||
|
-p "$ISO_PKGS" \
|
||||||
|
-I "$INCLUDE_DIR" \
|
||||||
|
-C "${BOOT_CMDLINE:-}" \
|
||||||
|
-o "$OUT_ISO"
|
||||||
|
|
||||||
|
chown "$(stat -c '%u:%g' "$PROJECT_DIR")" "$OUT_ISO" "${OUT_ISO}".* 2>/dev/null || true
|
||||||
337
iso/build-live-iso.sh
Executable file
337
iso/build-live-iso.sh
Executable file
@@ -0,0 +1,337 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Build a full Cinnamon LIVE desktop ISO for testing on real hardware.
|
||||||
|
#
|
||||||
|
# Boots directly into a Cinnamon session as user 'live' (no password).
|
||||||
|
# All themes, icons, cursor, wallpapers, dotfiles and VS Code config are
|
||||||
|
# pre-applied from the same overlay used by the installer.
|
||||||
|
#
|
||||||
|
# Requires (host): bash, git, curl, docker, and Bibata-Modern-Ice cursor
|
||||||
|
# installed at /usr/share/icons/Bibata-Modern-Ice.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# iso/build-live-iso.sh
|
||||||
|
# OUTPUT_ISO=/path/to/output.iso iso/build-live-iso.sh
|
||||||
|
|
||||||
|
set -Eeuo pipefail
|
||||||
|
|
||||||
|
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||||
|
CACHE_DIR="${CACHE_DIR:-$PROJECT_DIR/cache}"
|
||||||
|
OUT_DIR="${OUT_DIR:-$PROJECT_DIR/out}"
|
||||||
|
BUILD_DIR="${BUILD_DIR:-$PROJECT_DIR/build}"
|
||||||
|
INCLUDE_DIR="$BUILD_DIR/live-includes"
|
||||||
|
MKLIVE_DIR="$CACHE_DIR/void-mklive"
|
||||||
|
MKLIVE_REPO="${MKLIVE_REPO:-https://github.com/void-linux/void-mklive.git}"
|
||||||
|
MKLIVE_REF="${MKLIVE_REF:-master}"
|
||||||
|
PATCH_DIR="$PROJECT_DIR/iso/patches"
|
||||||
|
DOCKER_IMAGE="${DOCKER_IMAGE:-void-installer-builder:latest}"
|
||||||
|
DOCKER="${DOCKER:-docker}"
|
||||||
|
LIVE_USER="${LIVE_USER:-live}"
|
||||||
|
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
source "$PROJECT_DIR/config/install.conf"
|
||||||
|
|
||||||
|
# Load profile defaults (GTK_THEME, CURSOR_THEME, ICON_THEME etc.)
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
source "$PROJECT_DIR/config/profiles/stable-cinnamon/profile.conf"
|
||||||
|
|
||||||
|
command -v "$DOCKER" >/dev/null \
|
||||||
|
|| { echo "ERROR: '$DOCKER' not in PATH"; exit 1; }
|
||||||
|
"$DOCKER" info >/dev/null 2>&1 \
|
||||||
|
|| { echo "ERROR: '$DOCKER' daemon unreachable"; exit 1; }
|
||||||
|
|
||||||
|
mkdir -p "$CACHE_DIR" "$OUT_DIR" "$BUILD_DIR"
|
||||||
|
|
||||||
|
# 1) clone + patch mklive
|
||||||
|
if [[ ! -d "$MKLIVE_DIR/.git" ]]; then
|
||||||
|
echo ">>> cloning void-mklive"
|
||||||
|
git clone --depth=1 --branch "$MKLIVE_REF" "$MKLIVE_REPO" "$MKLIVE_DIR"
|
||||||
|
fi
|
||||||
|
if compgen -G "$PATCH_DIR/*.patch" >/dev/null; then
|
||||||
|
echo ">>> resetting + applying iso/patches/"
|
||||||
|
( cd "$MKLIVE_DIR" && git checkout -- . )
|
||||||
|
for p in "$PATCH_DIR"/*.patch; do
|
||||||
|
echo " $(basename "$p")"
|
||||||
|
( cd "$MKLIVE_DIR" && patch -p1 --silent < "$p" )
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2) xbps-static
|
||||||
|
XBPS_STATIC_DIR="$CACHE_DIR/xbps-static"
|
||||||
|
if [[ ! -x "$XBPS_STATIC_DIR/usr/bin/xbps-install.static" ]]; then
|
||||||
|
echo ">>> downloading xbps-static"
|
||||||
|
mkdir -p "$XBPS_STATIC_DIR"
|
||||||
|
curl -fsSL "https://repo-default.voidlinux.org/static/xbps-static-latest.x86_64-musl.tar.xz" \
|
||||||
|
| tar xJf - -C "$XBPS_STATIC_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3) build includes overlay
|
||||||
|
echo ">>> staging live includes overlay at $INCLUDE_DIR"
|
||||||
|
rm -rf "$INCLUDE_DIR"
|
||||||
|
mkdir -p "$INCLUDE_DIR"
|
||||||
|
|
||||||
|
# ── 3a) live user account ───────────────────────────────────────────────
|
||||||
|
# Create user 'live' with no password in the live image.
|
||||||
|
# mklive populates /etc/passwd at install time — we drop a post-install hook
|
||||||
|
# via the live init that calls useradd. We use an install.conf.d override
|
||||||
|
# that mklive will source, plus an rc.local-style runit oneshot.
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/etc"
|
||||||
|
cat > "$INCLUDE_DIR/etc/passwd-live" <<EOF
|
||||||
|
# placeholder replaced at build time by _inner-build-live.sh
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# rc.local equivalent: runit oneshot that creates the live user on first boot.
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/etc/runit/runsvdir/default"
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/etc/sv/live-user-setup"
|
||||||
|
cat > "$INCLUDE_DIR/etc/sv/live-user-setup/run" <<'SV_EOF'
|
||||||
|
#!/bin/sh
|
||||||
|
# Create the 'live' user (no password) and set up home directory.
|
||||||
|
# Runs once; removes itself from default runsvdir on completion.
|
||||||
|
set -e
|
||||||
|
if ! id live >/dev/null 2>&1; then
|
||||||
|
useradd -m -s /bin/bash -G wheel,audio,video,plugdev,input,network,docker live
|
||||||
|
passwd -d live
|
||||||
|
install -d -m 0700 /home/live/.ssh
|
||||||
|
# Apply skel dotfiles
|
||||||
|
if [ -d /etc/skel ]; then
|
||||||
|
cp -a /etc/skel/. /home/live/ 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
chown -R live:live /home/live
|
||||||
|
fi
|
||||||
|
# Enable sudoers entry for live
|
||||||
|
if ! grep -q '^live ' /etc/sudoers 2>/dev/null; then
|
||||||
|
echo 'live ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
|
||||||
|
fi
|
||||||
|
# Remove self from runsvdir so it doesn't restart
|
||||||
|
rm -f /etc/runit/runsvdir/default/live-user-setup
|
||||||
|
sv stop live-user-setup 2>/dev/null || true
|
||||||
|
SV_EOF
|
||||||
|
chmod 0755 "$INCLUDE_DIR/etc/sv/live-user-setup/run"
|
||||||
|
ln -sf /etc/sv/live-user-setup "$INCLUDE_DIR/etc/runit/runsvdir/default/live-user-setup"
|
||||||
|
|
||||||
|
# ── 3b) LightDM autologin ───────────────────────────────────────────────
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/etc/lightdm"
|
||||||
|
cat > "$INCLUDE_DIR/etc/lightdm/lightdm.conf" <<EOF
|
||||||
|
[Seat:*]
|
||||||
|
autologin-user=${LIVE_USER}
|
||||||
|
autologin-user-timeout=0
|
||||||
|
user-session=cinnamon
|
||||||
|
greeter-session=lightdm-gtk-greeter
|
||||||
|
EOF
|
||||||
|
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/etc/runit/runsvdir/default"
|
||||||
|
# Enable NetworkManager, lightdm, pipewire and dbus for the live session.
|
||||||
|
for svc in dbus NetworkManager lightdm; do
|
||||||
|
ln -sf "/etc/sv/$svc" "$INCLUDE_DIR/etc/runit/runsvdir/default/$svc" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
|
||||||
|
# ── 3c) Themes / icons / wallpapers (same as installer) ─────────────────
|
||||||
|
echo ">>> staging customizations overlay"
|
||||||
|
OVERLAY="$INCLUDE_DIR/etc/installer-overlay"
|
||||||
|
install -d -m 0755 "$OVERLAY" "$OVERLAY/wallpapers" \
|
||||||
|
"$OVERLAY/themes" "$OVERLAY/icons" \
|
||||||
|
"$OVERLAY/skel" "$OVERLAY/vscode-user"
|
||||||
|
|
||||||
|
# Wallpapers
|
||||||
|
WP_SRC="${WALLPAPERS_SRC:-$HOME/Scaricati}"
|
||||||
|
shopt -s nullglob
|
||||||
|
for f in "$WP_SRC"/pxfuel*.jpg; do
|
||||||
|
install -m 0644 "$f" "$OVERLAY/wallpapers/$(basename "$f")"
|
||||||
|
done
|
||||||
|
shopt -u nullglob
|
||||||
|
echo " wallpapers: $(ls "$OVERLAY/wallpapers" | wc -l) file(s)"
|
||||||
|
|
||||||
|
# Gruvbox GTK theme
|
||||||
|
THEME_CACHE="$CACHE_DIR/gruvbox-gtk-theme"
|
||||||
|
THEME_BUILD="$CACHE_DIR/gruvbox-gtk-built"
|
||||||
|
if [[ ! -d "$THEME_CACHE/.git" ]]; then
|
||||||
|
git clone --depth=1 https://github.com/Fausto-Korpsvart/Gruvbox-GTK-Theme.git "$THEME_CACHE" || true
|
||||||
|
fi
|
||||||
|
if [[ -x "$THEME_CACHE/themes/install.sh" && ! -d "$THEME_BUILD" ]]; then
|
||||||
|
echo " building gruvbox themes"
|
||||||
|
install -d -m 0755 "$THEME_BUILD"
|
||||||
|
"$DOCKER" run --rm \
|
||||||
|
-v "$THEME_CACHE":/src \
|
||||||
|
-v "$THEME_BUILD":/out \
|
||||||
|
debian:stable-slim sh -c '
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
apt-get update -qq >/dev/null
|
||||||
|
apt-get install -y --no-install-recommends sassc bash >/dev/null
|
||||||
|
cd /src/themes && bash install.sh -d /out -t default -c dark -s standard
|
||||||
|
' || true
|
||||||
|
fi
|
||||||
|
if [[ -d "$THEME_BUILD" ]]; then
|
||||||
|
for d in "$THEME_BUILD"/Gruvbox-Dark*; do
|
||||||
|
[[ -d "$d" ]] && cp -a "$d" "$OVERLAY/themes/$(basename "$d")"
|
||||||
|
done
|
||||||
|
echo " themes: $(ls "$OVERLAY/themes" 2>/dev/null | wc -l) variant(s)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Gruvbox Plus icons
|
||||||
|
ICON_CACHE="$CACHE_DIR/gruvbox-plus-icons"
|
||||||
|
if [[ ! -d "$ICON_CACHE/.git" ]]; then
|
||||||
|
git clone --depth=1 https://github.com/SylEleuth/gruvbox-plus-icon-pack.git "$ICON_CACHE" || true
|
||||||
|
fi
|
||||||
|
if [[ -d "$ICON_CACHE/Gruvbox-Plus-Dark" ]]; then
|
||||||
|
cp -a "$ICON_CACHE/Gruvbox-Plus-Dark" "$OVERLAY/icons/Gruvbox-Plus-Dark"
|
||||||
|
echo " icons: Gruvbox-Plus-Dark"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Bibata cursor
|
||||||
|
BIBATA_SRC="${BIBATA_SRC:-/usr/share/icons/Bibata-Modern-Ice}"
|
||||||
|
if [[ -d "$BIBATA_SRC" ]]; then
|
||||||
|
cp -a "$BIBATA_SRC" "$OVERLAY/icons/Bibata-Modern-Ice"
|
||||||
|
echo " cursor: Bibata-Modern-Ice"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Dotfiles
|
||||||
|
DOTFILES_SRC="${DOTFILES_SRC:-$HOME}"
|
||||||
|
for f in .bashrc .bash_aliases .gitconfig; do
|
||||||
|
[[ -r "$DOTFILES_SRC/$f" ]] && install -m 0644 "$DOTFILES_SRC/$f" "$OVERLAY/skel/$f"
|
||||||
|
done
|
||||||
|
|
||||||
|
# VS Code user config
|
||||||
|
VSCODE_SRC="${VSCODE_USER_SRC:-$HOME/.config/Code/User}"
|
||||||
|
if [[ -d "$VSCODE_SRC" ]]; then
|
||||||
|
for f in settings.json keybindings.json mcp.json tasks.json; do
|
||||||
|
[[ -r "$VSCODE_SRC/$f" ]] && install -m 0644 "$VSCODE_SRC/$f" "$OVERLAY/vscode-user/$f"
|
||||||
|
done
|
||||||
|
[[ -d "$VSCODE_SRC/snippets" ]] && cp -a "$VSCODE_SRC/snippets" "$OVERLAY/vscode-user/snippets"
|
||||||
|
[[ -d "$VSCODE_SRC/globalStorage" ]] && cp -a "$VSCODE_SRC/globalStorage" "$OVERLAY/vscode-user/globalStorage"
|
||||||
|
fi
|
||||||
|
if command -v code >/dev/null 2>&1; then
|
||||||
|
code --list-extensions > "$OVERLAY/vscode-extensions.txt" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Claude config
|
||||||
|
CLAUDE_SRC="${CLAUDE_SRC:-$HOME/.claude}"
|
||||||
|
[[ -d "$CLAUDE_SRC" ]] && cp -a "$CLAUDE_SRC" "$OVERLAY/claude"
|
||||||
|
[[ -r "${HOME}/.claude.json" ]] && install -m 0600 "${HOME}/.claude.json" "$OVERLAY/claude.json"
|
||||||
|
|
||||||
|
# first-login.sh
|
||||||
|
[[ -r "$PROJECT_DIR/installer/first-login.sh" ]] && \
|
||||||
|
install -m 0755 "$PROJECT_DIR/installer/first-login.sh" "$OVERLAY/first-login.sh"
|
||||||
|
|
||||||
|
# ── 3d) Pre-apply themes/dconf to the live user's home via /etc/skel ────
|
||||||
|
# We pre-write the dconf system-db so it takes effect without a user build step.
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/etc/dconf/db/local.d" \
|
||||||
|
"$INCLUDE_DIR/etc/dconf/profile"
|
||||||
|
cat > "$INCLUDE_DIR/etc/dconf/profile/user" <<'EOF'
|
||||||
|
user-db:user
|
||||||
|
system-db:local
|
||||||
|
EOF
|
||||||
|
|
||||||
|
WALLPAPER_FILE=$(ls "$OVERLAY/wallpapers/"*.jpg 2>/dev/null | head -1 | xargs basename 2>/dev/null || echo "pxfuel.jpg")
|
||||||
|
cat > "$INCLUDE_DIR/etc/dconf/db/local.d/00-cinnamon" <<EOF
|
||||||
|
[org/cinnamon/desktop/interface]
|
||||||
|
gtk-theme='${GTK_THEME}'
|
||||||
|
icon-theme='${ICON_THEME}'
|
||||||
|
cursor-theme='${CURSOR_THEME}'
|
||||||
|
|
||||||
|
[org/cinnamon/desktop/wm/preferences]
|
||||||
|
theme='${GTK_THEME}'
|
||||||
|
|
||||||
|
[org/cinnamon/theme]
|
||||||
|
name='${GTK_THEME}'
|
||||||
|
|
||||||
|
[org/cinnamon/desktop/background]
|
||||||
|
picture-uri='file:///usr/share/backgrounds/void-installer/${WALLPAPER_FILE}'
|
||||||
|
picture-options='zoom'
|
||||||
|
|
||||||
|
[org/gnome/desktop/background]
|
||||||
|
picture-uri='file:///usr/share/backgrounds/void-installer/${WALLPAPER_FILE}'
|
||||||
|
picture-options='zoom'
|
||||||
|
|
||||||
|
[org/gnome/desktop/input-sources]
|
||||||
|
sources=[('xkb', 'ch+fr')]
|
||||||
|
|
||||||
|
[org/cinnamon/desktop/keybindings/custom-keybindings/custom0]
|
||||||
|
name='Open Terminal'
|
||||||
|
command='${DEFAULT_TERMINAL:-alacritty}'
|
||||||
|
binding=['<Primary><Alt>t']
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# ── 3e) Copy themes/icons/wallpapers directly into usr/share ────────────
|
||||||
|
# (dconf compile happens inside the Docker container — see _inner-build-live.sh)
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/usr/share/backgrounds/void-installer"
|
||||||
|
cp -a "$OVERLAY/wallpapers"/. "$INCLUDE_DIR/usr/share/backgrounds/void-installer/" 2>/dev/null || true
|
||||||
|
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/usr/share/themes"
|
||||||
|
[[ -d "$OVERLAY/themes" ]] && cp -a "$OVERLAY/themes"/. "$INCLUDE_DIR/usr/share/themes/" 2>/dev/null || true
|
||||||
|
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/usr/share/icons"
|
||||||
|
[[ -d "$OVERLAY/icons" ]] && cp -a "$OVERLAY/icons"/. "$INCLUDE_DIR/usr/share/icons/" 2>/dev/null || true
|
||||||
|
|
||||||
|
# ── 3f) first-login autostart + profile.d for the live user ─────────────
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/etc/xdg/autostart"
|
||||||
|
if [[ -r "$OVERLAY/first-login.sh" ]]; then
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/usr/local/libexec"
|
||||||
|
install -m 0755 "$OVERLAY/first-login.sh" "$INCLUDE_DIR/usr/local/libexec/first-login.sh"
|
||||||
|
cat > "$INCLUDE_DIR/etc/xdg/autostart/void-live-first-login.desktop" <<EOF
|
||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Name=Void Live First-Login Setup
|
||||||
|
Exec=/usr/local/libexec/first-login.sh
|
||||||
|
NoDisplay=true
|
||||||
|
X-GNOME-Autostart-enabled=true
|
||||||
|
OnlyShowIn=X-Cinnamon;
|
||||||
|
EOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/etc/profile.d"
|
||||||
|
cat > "$INCLUDE_DIR/etc/profile.d/local-bin.sh" <<'EOF'
|
||||||
|
case ":$PATH:" in
|
||||||
|
*":$HOME/.local/bin:"*) ;;
|
||||||
|
*) export PATH="$HOME/.local/bin:$PATH" ;;
|
||||||
|
esac
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# ── 3g) Live-session skel: pre-wire .bash_profile for first-login ────────
|
||||||
|
install -d -m 0755 "$INCLUDE_DIR/etc/skel"
|
||||||
|
cat > "$INCLUDE_DIR/etc/skel/.bash_profile" <<'EOF'
|
||||||
|
# Source .bashrc for interactive login shells.
|
||||||
|
[[ -f ~/.bashrc ]] && . ~/.bashrc
|
||||||
|
|
||||||
|
# Auto-run user environment setup on first interactive login.
|
||||||
|
if [[ -z "$_FIRST_LOGIN_RAN" && -x /usr/local/libexec/first-login.sh \
|
||||||
|
&& ! -f "$HOME/.first-login-done" ]]; then
|
||||||
|
export _FIRST_LOGIN_RAN=1
|
||||||
|
/usr/local/libexec/first-login.sh 2>&1 | tee -a "$HOME/.first-login.log"
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# 4) build Docker image
|
||||||
|
echo ">>> building docker image $DOCKER_IMAGE"
|
||||||
|
if "$DOCKER" buildx version >/dev/null 2>&1; then
|
||||||
|
"$DOCKER" build -t "$DOCKER_IMAGE" "$PROJECT_DIR/iso"
|
||||||
|
else
|
||||||
|
DOCKER_BUILDKIT=0 "$DOCKER" build -t "$DOCKER_IMAGE" "$PROJECT_DIR/iso"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5) packages + output filename
|
||||||
|
ISO_PKGS=$(grep -vE '^\s*(#|$)' \
|
||||||
|
"$PROJECT_DIR/config/profiles/stable-cinnamon/packages.live-desktop.list" \
|
||||||
|
| tr '\n' ' ')
|
||||||
|
TS="$(date -u +%Y%m%d)"
|
||||||
|
OUT_ISO="${OUTPUT_ISO:-$OUT_DIR/void-live-stable-${TS}.iso}"
|
||||||
|
|
||||||
|
echo ">>> running mklive.sh inside docker — output: $OUT_ISO"
|
||||||
|
"$DOCKER" run --rm --privileged \
|
||||||
|
-v "$PROJECT_DIR:/work:rw" \
|
||||||
|
-v "$CACHE_DIR:/cache:rw" \
|
||||||
|
-e ARCH="${ARCH:-x86_64}" \
|
||||||
|
-e REPO_URL="${REPO_URL:-https://repo-default.voidlinux.org/current}" \
|
||||||
|
-e KEYMAP="${KEYMAP:-ch-fr_nodeadkeys}" \
|
||||||
|
-e LOCALE="${LOCALE:-en_US.UTF-8}" \
|
||||||
|
-e ISO_PKGS="$ISO_PKGS" \
|
||||||
|
-e ISO_TITLE="Void Live (${GTK_THEME} / Cinnamon)" \
|
||||||
|
-e OUT_ISO_REL="${OUT_ISO#$PROJECT_DIR/}" \
|
||||||
|
-e BOOT_CMDLINE="${BOOT_CMDLINE:-}" \
|
||||||
|
-e INCLUDE_DIR_REL="${INCLUDE_DIR#$PROJECT_DIR/}" \
|
||||||
|
-e HOST_UID="$(id -u)" \
|
||||||
|
-e HOST_GID="$(id -g)" \
|
||||||
|
"$DOCKER_IMAGE" \
|
||||||
|
bash /work/iso/_inner-build-live.sh
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo ">>> Live ISO built: $OUT_ISO"
|
||||||
|
sha256sum "$OUT_ISO" | tee "${OUT_ISO}.sha256"
|
||||||
Reference in New Issue
Block a user