Skip to content

Commit

Permalink
libcosmicAppHook: init (NixOS#380312)
Browse files Browse the repository at this point in the history
  • Loading branch information
GaetanLepage authored Feb 13, 2025
2 parents 9cbd33c + 5f411a7 commit 6b29714
Show file tree
Hide file tree
Showing 2 changed files with 181 additions and 0 deletions.
96 changes: 96 additions & 0 deletions pkgs/by-name/li/libcosmicAppHook/libcosmic-app-hook.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# SPDX-License-Identifier: MIT
# SPDX-FileCopyrightText: Lily Foster <[email protected]>
# Portions of this code are adapted from nixos-cosmic
# https://github.com/lilyinstarlight/nixos-cosmic

# shellcheck shell=bash
libcosmicAppWrapperArgs=()

libcosmicAppVergenHook() {
if [ -z "${VERGEN_GIT_COMMIT_DATE-}" ]; then
# shellcheck disable=SC2155
export VERGEN_GIT_COMMIT_DATE="$(date --utc --date=@"$SOURCE_DATE_EPOCH" '+%Y-%m-%d')"
fi
}

libcosmicAppLinkerArgsHook() {
# Force linking to certain libraries like libEGL, which are always dlopen()ed
local flags="CARGO_TARGET_@cargoLinkerVar@_RUSTFLAGS"

export "$flags"="${!flags-} -C link-arg=-Wl,--push-state,--no-as-needed"
# shellcheck disable=SC2043
for lib in @cargoLinkLibs@; do
export "$flags"="${!flags} -C link-arg=-l${lib}"
done
export "$flags"="${!flags} -C link-arg=-Wl,--pop-state"
}

preConfigurePhases+=" libcosmicAppVergenHook libcosmicAppLinkerArgsHook"

# Add shell hook for use in dev shells
if [ -n "${IN_NIX_SHELL-}" ] && [ -z "${shellHook-}" ]; then
shellHook="libcosmicAppLinkerArgsHook && export RUSTFLAGS=\$CARGO_TARGET_@cargoLinkerVar@_RUSTFLAGS CARGO_TARGET_@cargoLinkerVar@_RUSTFLAGS="
fi

libcosmicAppWrapperArgsHook() {
if [ -d "${prefix:?}/share" ]; then
libcosmicAppWrapperArgs+=(--suffix XDG_DATA_DIRS : "$prefix/share")
fi

# add fallback schemas, icons, and settings paths
libcosmicAppWrapperArgs+=(--suffix XDG_DATA_DIRS : "@fallbackXdgDirs@")
}

preFixupPhases+=" libcosmicAppWrapperArgsHook"

wrapLibcosmicApp() {
local program="$1"
shift 1
wrapProgram "$program" "${libcosmicAppWrapperArgs[@]}" "$@"
}

# Note: $libcosmicAppWrapperArgs still gets defined even if ${dontWrapLibcosmicApp-} is set
libcosmicAppWrapHook() {
# guard against running multiple times (e.g. due to propagation)
[ -z "$libcosmicAppWrapHookHasRun" ] || return 0
libcosmicAppWrapHookHasRun=1

if [[ -z "${dontWrapLibcosmicApp:-}" ]]; then
targetDirsThatExist=()
targetDirsRealPath=()

# wrap binaries
targetDirs=("${prefix}/bin" "${prefix}/libexec")
for targetDir in "${targetDirs[@]}"; do
if [[ -d "${targetDir}" ]]; then
targetDirsThatExist+=("${targetDir}")
targetDirsRealPath+=("$(realpath "${targetDir}")/")
find "${targetDir}" -type f -executable -print0 |
while IFS= read -r -d '' file; do
echo "Wrapping program '${file}'"
wrapLibcosmicApp "${file}"
done
fi
done

# wrap links to binaries that point outside targetDirs
# Note: links to binaries within targetDirs do not need
# to be wrapped as the binaries have already been wrapped
if [[ ${#targetDirsThatExist[@]} -ne 0 ]]; then
find "${targetDirsThatExist[@]}" -type l -xtype f -executable -print0 |
while IFS= read -r -d '' linkPath; do
linkPathReal=$(realpath "${linkPath}")
for targetPath in "${targetDirsRealPath[@]}"; do
if [[ "$linkPathReal" == "$targetPath"* ]]; then
echo "Not wrapping link: '$linkPath' (already wrapped)"
continue 2
fi
done
echo "Wrapping link: '$linkPath'"
wrapLibcosmicApp "${linkPath}"
done
fi
fi
}

fixupOutputHooks+=(libcosmicAppWrapHook)
85 changes: 85 additions & 0 deletions pkgs/by-name/li/libcosmicAppHook/package.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# SPDX-License-Identifier: MIT
# SPDX-FileCopyrightText: Lily Foster <[email protected]>
# Portions of this code are adapted from nixos-cosmic
# https://github.com/lilyinstarlight/nixos-cosmic

{
lib,
stdenv,
makeSetupHook,
makeBinaryWrapper,
pkg-config,
targetPackages,
libGL,
libxkbcommon,
xorg,
wayland,
vulkan-loader,

includeSettings ? true,
}:

makeSetupHook {
name = "libcosmic-app-hook";

propagatedBuildInputs = [
makeBinaryWrapper
pkg-config
];

# ensure deps for linking below are available
depsTargetTargetPropagated =
assert (lib.assertMsg (!targetPackages ? raw) "libcosmicAppHook must be in nativeBuildInputs");
[
libGL
libxkbcommon
xorg.libX11
xorg.libXcursor
xorg.libXi
xorg.libxcb
]
++ lib.optionals (!stdenv.isDarwin) [
wayland
vulkan-loader
];

substitutions = {
fallbackXdgDirs = "${lib.optionalString includeSettings "${targetPackages.cosmic-settings}/share:"}${targetPackages.cosmic-icons}/share";

cargoLinkerVar = stdenv.hostPlatform.rust.cargoEnvVarTarget;
# force linking for all libraries that may be dlopen'd by libcosmic/iced apps
cargoLinkLibs = lib.escapeShellArgs (
[
# for wgpu-hal
"EGL"
# for xkbcommon-dl
"xkbcommon"
# for x11-dl, tiny-xlib, wgpu-hal
"X11"
# for x11-dl, tiny-xlib
"X11-xcb"
# for x11-dl
"Xcursor"
"Xi"
# for x11rb
"xcb"
]
++ lib.optionals (!stdenv.isDarwin) [
# for wgpu-hal, wayland-sys
"wayland-client"
# for wgpu-hal
"wayland-egl"
"vulkan"
]
);
};

meta = {
description = "Setup hook for configuring and wrapping applications based on libcosmic";
maintainers = with lib.maintainers; [
HeitorAugustoLN
nyabinary
thefossguy
];
};
} ./libcosmic-app-hook.sh

0 comments on commit 6b29714

Please sign in to comment.