nixpkgs/pkgs/applications/office/libreoffice/wrapper.nix
Silvan Mosberger 4f0dadbf38 treewide: format all inactive Nix files
After final improvements to the official formatter implementation,
this commit now performs the first treewide reformat of Nix files using it.
This is part of the implementation of RFC 166.

Only "inactive" files are reformatted, meaning only files that
aren't being touched by any PR with activity in the past 2 months.
This is to avoid conflicts for PRs that might soon be merged.
Later we can do a full treewide reformat to get the rest,
which should not cause as many conflicts.

A CI check has already been running for some time to ensure that new and
already-formatted files are formatted, so the files being reformatted here
should also stay formatted.

This commit was automatically created and can be verified using

    nix-build a08b3a4d19.tar.gz \
      --argstr baseRev b32a094368
    result/bin/apply-formatting $NIXPKGS_PATH
2024-12-10 20:26:33 +01:00

180 lines
5.3 KiB
Nix

{
lib,
stdenv,
# The unwrapped libreoffice derivation
unwrapped,
makeWrapper,
xorg, # for lndir
runCommand,
# For Emulating wrapGAppsHook3
gsettings-desktop-schemas,
hicolor-icon-theme,
dconf,
librsvg,
gdk-pixbuf,
# some scripts need these when used in conjuction with firejail
coreutils,
gnugrep,
# Configuration options for the wrapper
extraMakeWrapperArgs ? [ ],
dbusVerify ? stdenv.hostPlatform.isLinux,
dbus,
}:
let
inherit (unwrapped) version;
major = lib.versions.major version;
minor = lib.versions.minor version;
makeWrapperArgs = builtins.concatStringsSep " " (
[
"--set"
"GDK_PIXBUF_MODULE_FILE"
"${librsvg}/${gdk-pixbuf.moduleDir}.cache"
"--prefix"
"GIO_EXTRA_MODULES"
":"
"${lib.getLib dconf}/lib/gio/modules"
"--prefix"
"XDG_DATA_DIRS"
":"
"${unwrapped.gtk3}/share/gsettings-schemas/${unwrapped.gtk3.name}"
"--prefix"
"XDG_DATA_DIRS"
":"
"$out/share"
"--prefix"
"XDG_DATA_DIRS"
":"
"${gsettings-desktop-schemas}/share/gsettings-schemas/${gsettings-desktop-schemas.name}"
"--prefix"
"XDG_DATA_DIRS"
":"
"${hicolor-icon-theme}/share"
"--prefix"
"GST_PLUGIN_SYSTEM_PATH_1_0"
":"
"${lib.makeSearchPath "lib/girepository-1.0" unwrapped.gst_packages}"
"--suffix"
"PATH"
":"
"${lib.makeBinPath [
coreutils
gnugrep
]}"
]
++ lib.optionals unwrapped.kdeIntegration [
"--prefix"
"QT_PLUGIN_PATH"
":"
"${lib.makeSearchPath unwrapped.qtbase.qtPluginPrefix (
builtins.map lib.getBin unwrapped.qtPackages
)}"
"--prefix"
"QML2_IMPORT_PATH"
":"
"${lib.makeSearchPath unwrapped.qtbase.qtQmlPrefix (builtins.map lib.getBin unwrapped.qmlPackages)}"
]
++ [
# Add dictionaries from all NIX_PROFILES
"--run"
(lib.escapeShellArg ''
for PROFILE in $NIX_PROFILES; do
HU_DIR="$PROFILE/share/hunspell"
HY_DIR="$PROFILE/share/hyphen"
if [ -d "$HU_DIR" ]; then
export DICPATH=$DICPATH''${DICPATH:+:}$HU_DIR
fi
if [ -d "$HY_DIR" ]; then
export DICPATH=$DICPATH''${DICPATH:+:}$HY_DIR
fi
done
'')
]
++ lib.optionals dbusVerify [
# If no dbus is running, start a dedicated dbus daemon
"--run"
(lib.escapeShellArg ''
if ! ( test -n "$DBUS_SESSION_BUS_ADDRESS" ); then
dbus_tmp_dir="/run/user/$(id -u)/libreoffice-dbus"
if ! test -d "$dbus_tmp_dir" && test -d "/run"; then
mkdir -p "$dbus_tmp_dir"
fi
if ! test -d "$dbus_tmp_dir"; then
dbus_tmp_dir="/tmp/libreoffice-$(id -u)/libreoffice-dbus"
mkdir -p "$dbus_tmp_dir"
fi
dbus_socket_dir="$(mktemp -d -p "$dbus_tmp_dir")"
"${dbus}"/bin/dbus-daemon \
--nopidfile \
--nofork \
--config-file "${dbus}"/share/dbus-1/session.conf \
--address "unix:path=$dbus_socket_dir/session" &> /dev/null &
dbus_pid=$!
export DBUS_SESSION_BUS_ADDRESS="unix:path=$dbus_socket_dir/session"
fi
'')
]
++ [
"--inherit-argv0"
]
++ extraMakeWrapperArgs
);
in
runCommand "${unwrapped.name}-wrapped"
{
inherit (unwrapped) meta;
paths = [ unwrapped ];
nativeBuildInputs = [
makeWrapper
xorg.lndir
];
passthru = {
inherit unwrapped;
# For backwards compatibility:
libreoffice = lib.warn "libreoffice: Use the unwrapped attributed, using libreoffice.libreoffice is deprecated." unwrapped;
inherit (unwrapped) kdeIntegration;
};
}
(
''
mkdir -p $out/share
for dir in ${unwrapped}/share/*; do
dirname="''${dir##*/}"
if [[ $dirname == "applications" ]]; then
cp -r $dir/ $out/share/
else
ln -s $dir $out/share/
fi
done
for f in $out/share/applications/*.desktop; do
substituteInPlace "$f" \
--replace "Exec=libreoffice${major}.${minor}" "Exec=soffice"
done
mkdir -p $out/bin
mkdir -p $out/lib/libreoffice/program
lndir -silent ${unwrapped}/lib/libreoffice/program $out/lib/libreoffice/program
for i in sbase scalc sdraw smath swriter simpress soffice unopkg; do
# Delete the symlink created by lndir, and replace it by our wrapper
rm $out/lib/libreoffice/program/$i
makeWrapper \
${unwrapped}/lib/libreoffice/program/$i \
$out/lib/libreoffice/program/$i \
${makeWrapperArgs}
''
+ lib.optionalString dbusVerify ''
# Delete the dbus socket directory after libreoffice quits
sed -i 's/^exec -a "$0" //g' $out/lib/libreoffice/program/$i
echo 'code="$?"' >> $out/lib/libreoffice/program/$i
echo 'test -n "$dbus_socket_dir" && { rm -rf "$dbus_socket_dir"; kill $dbus_pid; }' >> $out/lib/libreoffice/program/$i
echo 'exit "$code"' >> $out/lib/libreoffice/program/$i
''
+ ''
ln -s $out/lib/libreoffice/program/$i $out/bin/$i
done
# A symlink many users rely upon
ln -s $out/bin/soffice $out/bin/libreoffice
''
)