Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 52 additions & 15 deletions nixos/modules/system/boot/plymouth.nix
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ with lib;

let

inherit (pkgs) plymouth;
inherit (pkgs) nixos-icons;
inherit (pkgs) plymouth nixos-icons;

cfg = config.boot.plymouth;

Expand All @@ -16,14 +15,37 @@ let
osVersion = config.system.nixos.release;
};

plymouthLogos = pkgs.runCommand "plymouth-logos" { inherit (cfg) logo; } ''
mkdir -p $out

# For themes that are compiled with PLYMOUTH_LOGO_FILE
mkdir -p $out/etc/plymouth
ln -s $logo $out/etc/plymouth/logo.png
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using Nix value directly is IMO clearer than passing it to environment as a middleman:

Suggested change
ln -s $logo $out/etc/plymouth/logo.png
ln -s "${cfg.logo}" "$out/etc/plymouth/logo.png"


# Logo for bgrt theme
# Note this is technically an abuse of watermark for the bgrt theme
# See: https://gitlab.freedesktop.org/plymouth/plymouth/-/issues/95#note_813768
mkdir -p $out/share/plymouth/themes/spinner
ln -s $logo $out/share/plymouth/themes/spinner/watermark.png

# Logo for spinfinity theme
# See: https://gitlab.freedesktop.org/plymouth/plymouth/-/issues/106
mkdir -p $out/share/plymouth/themes/spinfinity
ln -s $logo $out/share/plymouth/themes/spinfinity/header-image.png
'';

themesEnv = pkgs.buildEnv {
name = "plymouth-themes";
paths = [ plymouth ] ++ cfg.themePackages;
paths = [
plymouth
plymouthLogos
] ++ cfg.themePackages;
};

configFile = pkgs.writeText "plymouthd.conf" ''
[Daemon]
ShowDelay=0
DeviceTimeout=8
Theme=${cfg.theme}
${cfg.extraConfig}
'';
Expand All @@ -47,15 +69,15 @@ in
};

themePackages = mkOption {
default = [ nixosBreezePlymouth ];
default = lib.optional (cfg.theme == "breeze") nixosBreezePlymouth;
type = types.listOf types.package;
description = ''
Extra theme packages for plymouth.
'';
};

theme = mkOption {
default = "breeze";
default = "bgrt";
type = types.str;
description = ''
Splash screen theme.
Expand All @@ -64,7 +86,8 @@ in

logo = mkOption {
type = types.path;
default = "${nixos-icons}/share/icons/hicolor/128x128/apps/nix-snowflake.png";
# Dimensions are 48x48 to match GDM logo
default = "${nixos-icons}/share/icons/hicolor/48x48/apps/nix-snowflake-white.png";
defaultText = ''pkgs.fetchurl {
url = "https://nixos.org/logo/nixos-hires.png";
sha256 = "1ivzgd7iz0i06y36p8m5w48fd8pjqwxhdaavc0pxs7w1g7mcy5si";
Expand Down Expand Up @@ -110,12 +133,18 @@ in
systemd.services.plymouth-poweroff.wantedBy = [ "poweroff.target" ];
systemd.services.plymouth-reboot.wantedBy = [ "reboot.target" ];
systemd.services.plymouth-read-write.wantedBy = [ "sysinit.target" ];
systemd.services.systemd-ask-password-plymouth.wantedBy = ["multi-user.target"];
systemd.paths.systemd-ask-password-plymouth.wantedBy = ["multi-user.target"];
systemd.services.systemd-ask-password-plymouth.wantedBy = [ "multi-user.target" ];
systemd.paths.systemd-ask-password-plymouth.wantedBy = [ "multi-user.target" ];

boot.initrd.extraUtilsCommands = ''
copy_bin_and_libs ${pkgs.plymouth}/bin/plymouthd
copy_bin_and_libs ${pkgs.plymouth}/bin/plymouth
copy_bin_and_libs ${plymouth}/bin/plymouth
copy_bin_and_libs ${plymouth}/bin/plymouthd

# Check if the actual requested theme is here
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👏

if [[ ! -d ${themesEnv}/share/plymouth/themes/${cfg.theme} ]]; then
echo "The requested theme: ${cfg.theme} is not provided by any of the packages in boot.plymouth.themePackages"
exit 1
fi

moduleName="$(sed -n 's,ModuleName *= *,,p' ${themesEnv}/share/plymouth/themes/${cfg.theme}/${cfg.theme}.plymouth)"

Expand All @@ -127,21 +156,29 @@ in
mkdir -p $out/share/plymouth/themes
cp ${plymouth}/share/plymouth/plymouthd.defaults $out/share/plymouth

# copy themes into working directory for patching
# Copy themes into working directory for patching
mkdir themes
# use -L to copy the directories proper, not the symlinks to them
cp -r -L ${themesEnv}/share/plymouth/themes/{text,details,${cfg.theme}} themes

# patch out any attempted references to the theme or plymouth's themes directory
# Use -L to copy the directories proper, not the symlinks to them.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you also mention why?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extraUtils can't contain references to nix/store, and that's why we're patching. I thought that bit is usually a bit obvious whenever you're working with extraUtilsCommands

# Copy all themes because they're not large assets, and bgrt depends on the ImageDir of
# the spinner theme.
cp -r -L ${themesEnv}/share/plymouth/themes/* themes

# Patch out any attempted references to the theme or plymouth's themes directory
chmod -R +w themes
find themes -type f | while read file
do
sed -i "s,/nix/.*/share/plymouth/themes,$out/share/plymouth/themes,g" $file
done

# Install themes
cp -r themes/* $out/share/plymouth/themes
cp ${cfg.logo} $out/share/plymouth/logo.png

# Install logo
mkdir -p $out/etc/plymouth
cp -r -L ${themesEnv}/etc/plymouth $out

# Setup font
mkdir -p $out/share/fonts
cp ${cfg.font} $out/share/fonts
mkdir -p $out/etc/fonts
Expand Down
103 changes: 75 additions & 28 deletions pkgs/os-specific/linux/plymouth/default.nix
Original file line number Diff line number Diff line change
@@ -1,64 +1,111 @@
{ stdenv, fetchurl, autoreconfHook, pkg-config, libxslt, docbook_xsl
, gtk3, udev, systemd, lib
{ lib
, stdenv
, fetchpatch
, fetchFromGitLab
, pkg-config
, autoreconfHook
, libxslt
, docbook-xsl-nons
, gettext
, gtk3
, systemd
, pango
, cairo
, libdrm
}:

stdenv.mkDerivation rec {
pname = "plymouth";
version = "0.9.4";
pname = "plymouth-unstable";
version = "2020-12-07";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we use the git describe format, version = "0.9.5-29-gc4ced2a", then the version numbers will remain monotonic if we switch back to a release. This format also works with fetchFromGit*, so we can use rev = version below.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wait... Can we maybe open an issue for that? U probably know about that annoying rule we have with "pname = "something-unstable" and verison = YYY-MM-DD. IIRC this is what they do in debian world? Anyways, I think it's worth looking into that but I think it's out of scope of this PR, and I will use what the manual has currently.

Copy link
Contributor

@andersk andersk Feb 24, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But you haven’t changed pname to "plymouth-unstable", so the monotonicity problem is in scope for this PR.

Edit: never mind, GitHub just wasn’t showing that you changed this later.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Anyways, I think it's worth looking into that but I think it's out of scope of this PR, and I will use what the manual has currently.

The manual is inaccurate because it just mentions name and not pname or version. Changing pname is not an option because it breaks many package definitions and repology.


src = fetchurl {
url = "https://www.freedesktop.org/software/plymouth/releases/${pname}-${version}.tar.xz";
sha256 = "0l8kg7b2vfxgz9gnrn0v2w4jvysj2cirp0nxads5sy05397pl6aa";
outputs = [
"out"
"dev"
];
Comment on lines 21 to 24
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
outputs = [
"out"
"dev"
];
outputs = [ "out" "dev" ];


src = fetchFromGitLab {
domain = "gitlab.freedesktop.org";
owner = "plymouth";
repo = "plymouth";
rev = "c4ced2a2d70edea7fbb95274aa1d01d95928df1b";
sha256 = "7CPuKMA0fTt8DBsaA4Td74kHT/O7PW8N3awP04nUnOI=";
};

nativeBuildInputs = [
autoreconfHook pkg-config libxslt docbook_xsl
autoreconfHook
docbook-xsl-nons
gettext
libxslt
pkg-config
];

buildInputs = [
gtk3 udev systemd
cairo
gtk3
libdrm
pango
systemd
];

patches = [
# KillMode=none is deprecated
# https://gitlab.freedesktop.org/plymouth/plymouth/-/issues/123
(fetchpatch {
url = "https://gitlab.freedesktop.org/plymouth/plymouth/-/commit/b406b0895a95949db2adfedaeda451f36f2b51c3.patch";
sha256 = "/UBImNuFO0G/oxlttjGIXon8YXMXlc9XU8uVuR9QuxY=";
})
];

postPatch = ''
sed -i \
-e "s#\$(\$PKG_CONFIG --variable=systemdsystemunitdir systemd)#$out/etc/systemd/system#g" \
-e "s#plymouthplugindir=.*#plymouthplugindir=/etc/plymouth/plugins/#" \
-e "s#plymouththemedir=.*#plymouththemedir=/etc/plymouth/themes#" \
-e "s#plymouthpolicydir=.*#plymouthpolicydir=/etc/plymouth/#" \
-e "s#plymouthconfdir=.*#plymouthconfdir=/etc/plymouth/#" \
configure.ac
'';

configurePlatforms = [ "host" ];

configureFlags = [
"--sysconfdir=/etc"
"--with-systemdunitdir=${placeholder "out"}/etc/systemd/system"
"--enable-documentation"
"--enable-drm"
"--enable-gtk"
"--enable-pango"
"--enable-systemd-integration"
"--enable-tracing"
"--localstatedir=/var"
"--with-logo=/etc/plymouth/logo.png"
"--sysconfdir=/etc"
"--with-background-color=0x000000"
"--with-background-start-color-stop=0x000000"
"--with-background-end-color-stop=0x000000"
"--with-background-start-color-stop=0x000000"
"--with-logo=/etc/plymouth/logo.png"
"--with-release-file=/etc/os-release"
"--without-system-root-install"
"--with-runtimedir=/run"
"--with-systemdunitdir=${placeholder "out"}/etc/systemd/system"
"--without-rhgb-compat-link"
"--enable-tracing"
"--enable-systemd-integration"
"--enable-pango"
"--enable-gdm-transition"
"--enable-gtk"
"--without-system-root-install"
"ac_cv_path_SYSTEMD_ASK_PASSWORD_AGENT=${lib.getBin systemd}/bin/systemd-tty-ask-password-agent"
];

configurePlatforms = [ "host" ];

installFlags = [
"plymouthd_defaultsdir=$(out)/share/plymouth"
"plymouthd_confdir=$(out)/etc/plymouth"
"localstatedir=\${TMPDIR}"
"plymouthd_confdir=${placeholder "out"}/etc/plymouth"
"plymouthd_defaultsdir=${placeholder "out"}/share/plymouth"
"sysconfdir=${placeholder "out"}/etc"
];

postInstall = ''
# Makes a symlink to /usr/share/pixmaps/system-logo-white.png
# We'll handle it in the nixos module.
rm $out/share/plymouth/themes/spinfinity/header-image.png
'';

meta = with lib; {
homepage = "http://www.freedesktop.org/wiki/Software/Plymouth";
description = "A graphical boot animation";
license = licenses.gpl2;
maintainers = [ maintainers.goibhniu ];
homepage = "https://www.freedesktop.org/wiki/Software/Plymouth/";
description = "Boot splash and boot logger";
license = licenses.gpl2Plus;
maintainers = [ maintainers.goibhniu teams.gnome.members ];
platforms = platforms.linux;
};
}