depot/third_party/nixpkgs/pkgs/applications/office/libreoffice/default.nix

670 lines
16 KiB
Nix

{ stdenv
, fetchurl
, fetchgit
, fetchpatch2
, lib
, pam
, python311
, libxslt
, perl
, perlPackages
, box2d
, gettext
, zlib
, libjpeg
, liblangtag
, expat
, freetype
, libwpd
, libxml2
, db
, curl
, fontconfig
, libsndfile
, neon
, bison
, flex
, zip
, unzip
, gtk3
, libmspack
, getopt
, file
, cairo
, which
, icu
, boost
, jdk21
, ant
, cups
, xorg
, fontforge
, jre21_minimal
, openssl
, gperf
, cppunit
, poppler
, util-linux
, librsvg
, libGLU
, libGL
, bsh
, coinmp
, libwps
, libabw
, libargon2
, libmysqlclient
, autoconf
, automake
, openldap
, bash
, hunspell
, librdf_rasqal
, librdf_redland
, nss
, nspr
, libwpg
, dbus-glib
, clucene_core_2
, libcdr
, lcms2
, unixODBC
, mdds
, sane-backends
, mythes
, libexttextcat
, libvisio
, pkg-config
, bluez5
, libtool
, libatomic_ops
, graphite2
, harfbuzz
, libodfgen
, libzmf
, librevenge
, libe-book
, libmwaw
, glm
, gst_all_1
, gdb
, adwaita-icon-theme
, glib
, ncurses
, libepoxy
, gpgme
, libwebp
, abseil-cpp
, libepubgen
, libetonyek
, liborcus
, libpng
, langs ? [ "ar" "ca" "cs" "da" "de" "en-GB" "en-US" "eo" "es" "fi" "fr" "hu" "it" "ja" "ko" "nl" "pl" "pt" "pt-BR" "ro" "ru" "sk" "sl" "tr" "uk" "zh-CN" "zh-TW" ]
, withFonts ? false
, withHelp ? true
, kdeIntegration ? false
, qtbase ? null
, qtx11extras ? null
, qtwayland ? null
, ki18n ? null
, kconfig ? null
, kcoreaddons ? null
, kio ? null
, kwindowsystem ? null
, variant ? "fresh"
, symlinkJoin
, postgresql
, makeFontsConf
, amiri
, caladea
, carlito
, culmus
, dejavu_fonts
, rubik
, liberation-sans-narrow
, liberation_ttf_v2
, libertine
, libertine-g
, noto-fonts
, noto-fonts-cjk-sans
, rhino
, lp_solve
, xmlsec
, libcmis
# The rest are used only in passthru, for the wrapper
, kauth ? null
, kcompletion ? null
, kconfigwidgets ? null
, kglobalaccel ? null
, kitemviews ? null
, knotifications ? null
, ktextwidgets ? null
, kwidgetsaddons ? null
, kxmlgui ? null
, phonon ? null
, qtdeclarative ? null
, qtmultimedia ? null
, qtquickcontrols ? null
, qtsvg ? null
, qttools ? null
, solid ? null
, sonnet ? null
}:
assert builtins.elem variant [ "fresh" "still" "collabora" ];
let
inherit (lib)
flatten flip
concatMapStrings concatStringsSep
getDev getLib
optionals optionalString;
fontsConf = makeFontsConf {
fontDirectories = [
amiri
caladea
carlito
culmus
dejavu_fonts
rubik
liberation-sans-narrow
liberation_ttf_v2
libertine
libertine-g
noto-fonts
noto-fonts-cjk-sans
];
};
jre' = jre21_minimal.override {
modules = [ "java.base" "java.desktop" "java.logging" "java.sql" ];
};
importVariant = f: import (./. + "/src-${variant}/${f}");
# Update these files with:
# nix-shell maintainers/scripts/update.nix --argstr package libreoffice-$VARIANT.unwrapped
version = importVariant "version.nix";
srcsAttributes = {
main = importVariant "main.nix";
help = importVariant "help.nix";
translations = importVariant "translations.nix";
deps = (importVariant "deps.nix") ++ [
# TODO: Why is this needed?
(rec {
name = "unowinreg.dll";
url = "https://dev-www.libreoffice.org/extern/${md5name}";
sha256 = "1infwvv1p6i21scywrldsxs22f62x85mns4iq8h6vr6vlx3fdzga";
md5 = "185d60944ea767075d27247c3162b3bc";
md5name = "${md5}-${name}";
})
];
};
srcs = {
third_party = map (x:
(fetchurl {
inherit (x) url sha256 name;
}) // {
inherit (x) md5name md5;
}) srcsAttributes.deps;
translations = srcsAttributes.translations { inherit fetchurl fetchgit; };
help = srcsAttributes.help { inherit fetchurl fetchgit; };
};
qtMajor = lib.versions.major qtbase.version;
# See `postPatch` for details
kdeDeps = symlinkJoin {
name = "libreoffice-kde-dependencies-${version}";
paths = flatten (map (e: [ (getDev e) (getLib e) ]) [
qtbase
qtmultimedia
qtx11extras
kconfig
kcoreaddons
ki18n
kio
kwindowsystem
]);
};
tarballPath = "external/tarballs";
in stdenv.mkDerivation (finalAttrs: {
pname = "libreoffice";
inherit version;
src = srcsAttributes.main { inherit fetchurl fetchgit; };
postUnpack = ''
mkdir -v $sourceRoot/${tarballPath}
${flip concatMapStrings srcs.third_party (f: ''
ln -sfv ${f} $sourceRoot/${tarballPath}/${f.md5name}
ln -sfv ${f} $sourceRoot/${tarballPath}/${f.name}
'')}
'' + (if (variant != "collabora") then ''
ln -sv ${srcs.help} $sourceRoot/${tarballPath}/${srcs.help.name}
ln -svf ${srcs.translations} $sourceRoot/${tarballPath}/${srcs.translations.name}
tar -xf ${srcs.help}
tar -xf ${srcs.translations}
'' else ''
cp -r --no-preserve=mode ${srcs.help}/. $sourceRoot/helpcontent2/
cp -r --no-preserve=mode ${srcs.translations}/. $sourceRoot/translations/
'');
patches = [
# Skip some broken tests:
# - tdf160386 does not fall back to a CJK font properly for some reason
# - the remaining tests have notes in the patches
# FIXME: get rid of this ASAP
./skip-broken-tests.patch
(./skip-broken-tests- + variant + ".patch")
# Don't detect Qt paths from qmake, so our patched-in onese are used
./dont-detect-qt-paths-from-qmake.patch
# Revert part of https://github.com/LibreOffice/core/commit/6f60670877208612b5ea320b3677480ef6508abb that broke zlib linking
./readd-explicit-zlib-link.patch
] ++ lib.optionals (lib.versionOlder version "24.8") [
(fetchpatch2 {
name = "icu74-compat.patch";
url = "https://gitlab.archlinux.org/archlinux/packaging/packages/libreoffice-fresh/-/raw/main/libreoffice-7.5.8.2-icu-74-compatibility.patch?ref_type=heads.patch";
hash = "sha256-OGBPIVQj8JTYlkKywt4QpH7ULAzKmet5jTLztGpIS0Y=";
})
] ++ lib.optionals (variant == "collabora") [
./fix-unpack-collabora.patch
];
postPatch = ''
# configure checks for header 'gpgme++/gpgmepp_version.h',
# and if it is found (no matter where) uses a hardcoded path
# in what presumably is an effort to make it possible to write
# '#include <context.h>' instead of '#include <gpgmepp/context.h>'.
#
# Fix this path to point to where the headers can actually be found instead.
substituteInPlace configure.ac --replace-fail \
'GPGMEPP_CFLAGS=-I/usr/include/gpgme++' \
'GPGMEPP_CFLAGS=-I${gpgme.dev}/include/gpgme++'
# Fix for Python 3.12
substituteInPlace configure.ac --replace-fail distutils.sysconfig sysconfig
'';
nativeBuildInputs = [
autoconf
automake
bison
fontforge
gdb
jdk21
libtool
pkg-config
];
buildInputs = finalAttrs.passthru.gst_packages ++ [
# Make libpng not handle APNG images, so LibreOffice's own handler kicks in
# This should be ordered first, so it gets picked up before any other
# propagated libpng
# See: https://www.mail-archive.com/libreoffice@lists.freedesktop.org/msg334080.html
(libpng.override { apngSupport = false; })
perlPackages.ArchiveZip
coinmp
perlPackages.IOCompress
abseil-cpp
ant
bluez5
boost
box2d
cairo
clucene_core_2
cppunit
cups
curl
db
dbus-glib
expat
file
flex
fontconfig
freetype
getopt
gettext
glib
glm
adwaita-icon-theme
gperf
gpgme
graphite2
gtk3
(harfbuzz.override { withIcu = true; })
hunspell
icu
jre'
lcms2
libGL
libGLU
xorg.libX11
xorg.libXaw
xorg.libXdmcp
xorg.libXext
xorg.libXi
xorg.libXinerama
xorg.libXtst
libabw
libargon2
libatomic_ops
libcdr
libcmis
libe-book
libepoxy
libepubgen
libetonyek
libexttextcat
libjpeg
liblangtag
libmspack
libmwaw
libmysqlclient
libodfgen
liborcus
xorg.libpthreadstubs
librdf_redland
librevenge
librsvg
libsndfile
libvisio
libwpd
libwpg
libwps
libxml2
xorg.libxshmfence
libxslt
libzmf
libwebp
lp_solve
mdds
mythes
ncurses
neon
nspr
nss
openldap
openssl
pam
perl
poppler
postgresql
python311
sane-backends
unixODBC
unzip
util-linux
which
xmlsec
zip
zlib
] ++ optionals kdeIntegration [
qtbase
qtx11extras
kcoreaddons
kio
];
preConfigure = ''
configureFlagsArray=(
"--with-parallelism=$NIX_BUILD_CORES"
# here because we need to be very specific about spaces
"--with-lang=${concatStringsSep " " langs}"
);
patchShebangs .
NOCONFIGURE=1 ./autogen.sh
'' + optionalString kdeIntegration ''
# configure.ac assumes that the first directory that contains headers and
# libraries during its checks contains *all* the relevant headers/libs which
# obviously doesn't work for us, so we have 2 options:
#
# 1. patch configure.ac in order to specify the direct paths to various Qt/KDE
# dependencies which is ugly and brittle, or
#
# 2. use symlinkJoin to pull in the relevant dependencies and just patch in
# that path which is *also* ugly, but far less likely to break
#
# The 2nd option is not very Nix'y, but I'll take robust over nice any day.
# Additionally, it's much easier to fix if LO breaks on the next upgrade (just
# add the missing dependencies to it).
export QT${qtMajor}INC=${kdeDeps}/include
export QT${qtMajor}LIB=${kdeDeps}/lib
export KF${qtMajor}INC="${kdeDeps}/include ${kdeDeps}/include/KF${qtMajor}"
export KF${qtMajor}LIB=${kdeDeps}/lib
'';
configureFlags = [
# Explicitly passing in --host even on non-cross, because
# LibreOffice will attempt to detect WSL and cross-compile
# itself to Windows automatically, and we don't want it
# doing that.
"--host=${stdenv.hostPlatform.config}"
"--without-buildconfig-recorded"
(lib.withFeature withHelp "help")
"--with-boost=${getDev boost}"
"--with-boost-libdir=${getLib boost}/lib"
"--with-beanshell-jar=${bsh}"
"--with-vendor=NixOS"
"--disable-report-builder"
"--disable-online-update"
"--enable-python=system"
"--enable-dbus"
"--enable-release-build"
"--enable-epm"
"--with-ant-home=${getLib ant}/lib/ant"
# Without these, configure does not finish
"--without-junit"
# Schema files for validation are not included in the source tarball
"--without-export-validation"
# We do tarball prefetching ourselves
"--disable-fetch-external"
"--enable-build-opensymbol"
# I imagine this helps. Copied from go-oo.
# Modified on every upgrade, though
"--disable-odk"
"--disable-firebird-sdbc"
(lib.withFeature withFonts "fonts")
"--without-doxygen"
"--with-system-beanshell"
"--with-system-cairo"
"--with-system-coinmp"
"--with-system-headers"
"--with-system-libabw"
"--with-system-libcmis"
"--with-system-libepubgen"
"--with-system-libetonyek"
"--with-system-liblangtag"
"--with-system-libs"
"--with-system-libwps"
"--with-system-lpsolve"
"--with-system-mdds"
"--with-system-openldap"
"--with-system-openssl"
"--with-system-orcus"
"--with-system-postgresql"
"--with-system-xmlsec"
# TODO: package these as system libraries
"--without-system-altlinuxhyph"
"--without-system-frozen"
"--without-system-libfreehand"
"--without-system-libmspub"
"--without-system-libnumbertext"
"--without-system-libpagemaker"
"--without-system-libstaroffice"
"--without-system-libqxp"
"--without-system-dragonbox"
"--without-system-libfixmath"
# requires an oddly specific, old version
"--without-system-hsqldb"
# searches hardcoded paths that are wrong
"--without-system-zxing"
# is packaged but headers can't be found because there is no pkg-config file
"--without-system-zxcvbn"
] ++ optionals kdeIntegration [
"--enable-kf${qtMajor}"
"--enable-qt${qtMajor}"
] ++ optionals (kdeIntegration && qtMajor == "5") [
"--enable-gtk3-kde5"
] ++ (if variant == "fresh" then [
"--with-system-rhino"
"--with-rhino-jar=${rhino}/share/java/js.jar"
] else [
# our Rhino is too new for older versions
"--without-system-rhino"
]);
env = {
# FIXME: this is a hack, because the right cflags are not being picked up
# from rasqal's .pc file. Needs more investigation.
NIX_CFLAGS_COMPILE = "-I${librdf_rasqal}/include/rasqal";
# Provide all the fonts used in tests.
FONTCONFIG_FILE = fontsConf;
};
makeFlags = [ "SHELL=${bash}/bin/bash" ];
enableParallelBuilding = true;
buildTargets = [ "build-nocheck" ];
# Disable tests for the Qt5 build, as they seem even more flaky
# than usual, and we will drop the Qt5 build after 24.11 anyway.
doCheck = !(kdeIntegration && qtMajor == "5");
preCheck = ''
export HOME=$(pwd)
'';
checkTarget = concatStringsSep " " [
"unitcheck"
"slowcheck"
"--keep-going" # easier to debug test failures
];
postInstall = optionalString (variant != "collabora") ''
mkdir -p $out/{include,share/icons}
cp -r include/LibreOfficeKit $out/include/
cp -r sysui/desktop/icons/hicolor $out/share/icons
# Rename icons for consistency
for file in $out/share/icons/hicolor/*/apps/*; do
mv $file "$(dirname $file)/libreoffice-$(basename $file)"
done
ln -s $out/lib/libreoffice/share/xdg $out/share/applications
# Unversionize desktop files
. ./bin/get_config_variables PRODUCTVERSION
for file in $out/lib/libreoffice/share/xdg/*.desktop; do
substituteInPlace $file \
--replace-fail "LibreOffice $PRODUCTVERSION" "LibreOffice" \
--replace-warn "Icon=libreoffice$PRODUCTVERSION" "Icon=libreoffice" \
--replace-fail "Exec=libreoffice$PRODUCTVERSION" "Exec=libreoffice"
done
'';
# Wrapping is done in ./wrapper.nix
dontWrapQtApps = true;
passthru = {
inherit srcs;
jdk = jre';
python = python311; # for unoconv
updateScript = [
./update.sh
# Pass it this file name as argument
(builtins.unsafeGetAttrPos "pname" finalAttrs.finalPackage).file
# And the variant
variant
];
inherit kdeIntegration;
# For the wrapper.nix
inherit gtk3;
# Although present in qtPackages, we need qtbase.qtPluginPrefix and
# qtbase.qtQmlPrefix
inherit qtbase;
gst_packages = with gst_all_1; [
gst-libav
gst-plugins-bad
gst-plugins-base
gst-plugins-good
gst-plugins-ugly
gstreamer
];
qmlPackages = [
ki18n
knotifications
qtdeclarative
qtmultimedia
qtquickcontrols
qtwayland
solid
sonnet
];
qtPackages = [
kauth
kcompletion
kconfigwidgets
kglobalaccel
ki18n
kio
kitemviews
ktextwidgets
kwidgetsaddons
kwindowsystem
kxmlgui
phonon
qtbase
qtdeclarative
qtmultimedia
qtsvg
qttools
qtwayland
sonnet
];
};
# libreoffice tries to reference the BUILDCONFIG (e.g. PKG_CONFIG_PATH)
# in the binary causing the closure size to blow up because of many unnecessary
# dependencies to dev outputs. This behavior was patched away in nixpkgs
# (see above), make sure these don't leak again by accident.
# FIXME: disabled for kdeIntegration builds because the weird symlinkJoin setup
# leaks all the -dev dependencies :(
disallowedRequisites = lib.optionals (!kdeIntegration) (lib.concatMap (x: lib.optional (x?dev) x.dev) finalAttrs.buildInputs);
requiredSystemFeatures = [ "big-parallel" ];
meta = with lib; {
changelog = "https://wiki.documentfoundation.org/ReleaseNotes/${lib.versions.majorMinor version}";
description = "Comprehensive, professional-quality productivity suite, a variant of openoffice.org";
homepage = "https://libreoffice.org/";
# at least one jar in dependencies
sourceProvenance = with sourceTypes; [ binaryBytecode ];
license = licenses.lgpl3;
maintainers = with maintainers; [ raskin ];
platforms = platforms.linux;
mainProgram = "libreoffice";
};
})