179 lines
5.3 KiB
Nix
179 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
|
|
''
|
|
)
|