libcosmicAppHook: init (#380312)
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
# SPDX-FileCopyrightText: Lily Foster <lily@lily.flowers>
|
||||
# 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)
|
||||
@@ -0,0 +1,85 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
# SPDX-FileCopyrightText: Lily Foster <lily@lily.flowers>
|
||||
# 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
|
||||
Reference in New Issue
Block a user