bottom: add gpu recognition, new apple sdk, refactor (#360568)
[NixPkgs.git] / pkgs / applications / office / libreoffice / default.nix
blobefd3b01a7d16976339742d19febff14e6a72caaf
1 { stdenv
2 , fetchurl
3 , fetchgit
4 , fetchpatch2
5 , lib
6 , pam
7 , python311
8 , libxslt
9 , perl
10 , perlPackages
11 , box2d
12 , gettext
13 , zlib
14 , libjpeg
15 , liblangtag
16 , expat
17 , freetype
18 , libwpd
19 , libxml2
20 , db
21 , curl
22 , fontconfig
23 , libsndfile
24 , neon
25 , bison
26 , flex
27 , zip
28 , unzip
29 , gtk3
30 , libmspack
31 , getopt
32 , file
33 , cairo
34 , which
35 , icu
36 , boost
37 , jdk21
38 , ant
39 , cups
40 , xorg
41 , fontforge
42 , jre21_minimal
43 , openssl
44 , gperf
45 , cppunit
46 , poppler
47 , util-linux
48 , librsvg
49 , libGLU
50 , libGL
51 , bsh
52 , coinmp
53 , libwps
54 , libabw
55 , libargon2
56 , libmysqlclient
57 , autoconf
58 , automake
59 , openldap
60 , bash
61 , hunspell
62 , librdf_rasqal
63 , librdf_redland
64 , nss
65 , nspr
66 , libwpg
67 , dbus-glib
68 , clucene_core_2
69 , libcdr
70 , lcms2
71 , unixODBC
72 , mdds
73 , sane-backends
74 , mythes
75 , libexttextcat
76 , libvisio
77 , pkg-config
78 , bluez5
79 , libtool
80 , libatomic_ops
81 , graphite2
82 , harfbuzz
83 , libodfgen
84 , libzmf
85 , librevenge
86 , libe-book
87 , libmwaw
88 , glm
89 , gst_all_1
90 , gdb
91 , adwaita-icon-theme
92 , glib
93 , ncurses
94 , libepoxy
95 , gpgme
96 , libwebp
97 , abseil-cpp
98 , libepubgen
99 , libetonyek
100 , liborcus
101 , libpng
102 , 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" ]
103 , withFonts ? false
104 , withHelp ? true
105 , kdeIntegration ? false
106 , qtbase ? null
107 , qtx11extras ? null
108 , qtwayland ? null
109 , ki18n ? null
110 , kconfig ? null
111 , kcoreaddons ? null
112 , kio ? null
113 , kwindowsystem ? null
114 , variant ? "fresh"
115 , symlinkJoin
116 , postgresql
117 , makeFontsConf
118 , amiri
119 , caladea
120 , carlito
121 , culmus
122 , dejavu_fonts
123 , rubik
124 , liberation-sans-narrow
125 , liberation_ttf_v2
126 , libertine
127 , libertine-g
128 , noto-fonts
129 , noto-fonts-cjk-sans
130 , rhino
131 , lp_solve
132 , xmlsec
133 , libcmis
134 # The rest are used only in passthru, for the wrapper
135 , kauth ? null
136 , kcompletion ? null
137 , kconfigwidgets ? null
138 , kglobalaccel ? null
139 , kitemviews ? null
140 , knotifications ? null
141 , ktextwidgets ? null
142 , kwidgetsaddons ? null
143 , kxmlgui ? null
144 , phonon ? null
145 , qtdeclarative ? null
146 , qtmultimedia ? null
147 , qtquickcontrols ? null
148 , qtsvg ? null
149 , qttools ? null
150 , solid ? null
151 , sonnet ? null
154 assert builtins.elem variant [ "fresh" "still" "collabora" ];
157   inherit (lib)
158     flatten flip
159     concatMapStrings concatStringsSep
160     getDev getLib
161     optionals optionalString;
163   fontsConf = makeFontsConf {
164     fontDirectories = [
165       amiri
166       caladea
167       carlito
168       culmus
169       dejavu_fonts
170       rubik
171       liberation-sans-narrow
172       liberation_ttf_v2
173       libertine
174       libertine-g
175       noto-fonts
176       noto-fonts-cjk-sans
177     ];
178   };
180   jre' = jre21_minimal.override {
181     modules = [ "java.base" "java.desktop" "java.logging" "java.sql" ];
182   };
184   importVariant = f: import (./. + "/src-${variant}/${f}");
185   # Update these files with:
186   # nix-shell maintainers/scripts/update.nix --argstr package libreoffice-$VARIANT.unwrapped
187   version = importVariant "version.nix";
188   srcsAttributes = {
189     main = importVariant "main.nix";
190     help = importVariant "help.nix";
191     translations = importVariant "translations.nix";
192     deps = (importVariant "deps.nix") ++ [
193       # TODO: Why is this needed?
194       (rec {
195         name = "unowinreg.dll";
196         url = "https://dev-www.libreoffice.org/extern/${md5name}";
197         sha256 = "1infwvv1p6i21scywrldsxs22f62x85mns4iq8h6vr6vlx3fdzga";
198         md5 = "185d60944ea767075d27247c3162b3bc";
199         md5name = "${md5}-${name}";
200       })
201     ];
202   };
203   srcs = {
204     third_party = map (x:
205       (fetchurl {
206         inherit (x) url sha256 name;
207       }) // {
208         inherit (x) md5name md5;
209       }) srcsAttributes.deps;
210     translations = srcsAttributes.translations { inherit fetchurl fetchgit; };
211     help = srcsAttributes.help { inherit fetchurl fetchgit; };
212   };
214   qtMajor = lib.versions.major qtbase.version;
216   # See `postPatch` for details
217   kdeDeps = symlinkJoin {
218     name = "libreoffice-kde-dependencies-${version}";
219     paths = flatten (map (e: [ (getDev e) (getLib e) ]) [
220       qtbase
221       qtmultimedia
222       qtx11extras
223       kconfig
224       kcoreaddons
225       ki18n
226       kio
227       kwindowsystem
228     ]);
229   };
230   tarballPath = "external/tarballs";
232 in stdenv.mkDerivation (finalAttrs: {
233   pname = "libreoffice";
234   inherit version;
236   src = srcsAttributes.main { inherit fetchurl fetchgit; };
238   postUnpack = ''
239     mkdir -v $sourceRoot/${tarballPath}
241     ${flip concatMapStrings srcs.third_party (f: ''
242       ln -sfv ${f} $sourceRoot/${tarballPath}/${f.md5name}
243       ln -sfv ${f} $sourceRoot/${tarballPath}/${f.name}
244     '')}
246   '' + (if (variant != "collabora") then ''
247     ln -sv ${srcs.help} $sourceRoot/${tarballPath}/${srcs.help.name}
248     ln -svf ${srcs.translations} $sourceRoot/${tarballPath}/${srcs.translations.name}
250     tar -xf ${srcs.help}
251     tar -xf ${srcs.translations}
252   '' else ''
253     cp -r --no-preserve=mode ${srcs.help}/. $sourceRoot/helpcontent2/
254     cp -r --no-preserve=mode ${srcs.translations}/. $sourceRoot/translations/
255   '');
257   patches = [
258     # Skip some broken tests:
259     # - tdf160386 does not fall back to a CJK font properly for some reason
260     # - the remaining tests have notes in the patches
261     # FIXME: get rid of this ASAP
262     ./skip-broken-tests.patch
263     (./skip-broken-tests- + variant + ".patch")
265     # Don't detect Qt paths from qmake, so our patched-in onese are used
266     ./dont-detect-qt-paths-from-qmake.patch
268     # Revert part of https://github.com/LibreOffice/core/commit/6f60670877208612b5ea320b3677480ef6508abb that broke zlib linking
269     ./readd-explicit-zlib-link.patch
270   ] ++ lib.optionals (lib.versionOlder version "24.8") [
271     (fetchpatch2 {
272       name = "icu74-compat.patch";
273       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";
274       hash = "sha256-OGBPIVQj8JTYlkKywt4QpH7ULAzKmet5jTLztGpIS0Y=";
275     })
276   ] ++ lib.optionals (variant == "collabora") [
277     ./fix-unpack-collabora.patch
278   ];
280   postPatch = ''
281     # configure checks for header 'gpgme++/gpgmepp_version.h',
282     # and if it is found (no matter where) uses a hardcoded path
283     # in what presumably is an effort to make it possible to write
284     # '#include <context.h>' instead of '#include <gpgmepp/context.h>'.
285     #
286     # Fix this path to point to where the headers can actually be found instead.
287     substituteInPlace configure.ac --replace-fail \
288       'GPGMEPP_CFLAGS=-I/usr/include/gpgme++' \
289       'GPGMEPP_CFLAGS=-I${gpgme.dev}/include/gpgme++'
291     # Fix for Python 3.12
292     substituteInPlace configure.ac --replace-fail distutils.sysconfig sysconfig
293   '';
295   nativeBuildInputs = [
296     autoconf
297     automake
298     bison
299     fontforge
300     gdb
301     jdk21
302     libtool
303     pkg-config
304   ];
306   buildInputs = finalAttrs.passthru.gst_packages ++ [
307     # Make libpng not handle APNG images, so LibreOffice's own handler kicks in
308     # This should be ordered first, so it gets picked up before any other
309     # propagated libpng
310     # See: https://www.mail-archive.com/libreoffice@lists.freedesktop.org/msg334080.html
311     (libpng.override { apngSupport = false; })
312     perlPackages.ArchiveZip
313     coinmp
314     perlPackages.IOCompress
315     abseil-cpp
316     ant
317     bluez5
318     boost
319     box2d
320     cairo
321     clucene_core_2
322     cppunit
323     cups
324     curl
325     db
326     dbus-glib
327     expat
328     file
329     flex
330     fontconfig
331     freetype
332     getopt
333     gettext
334     glib
335     glm
336     adwaita-icon-theme
337     gperf
338     gpgme
339     graphite2
340     gtk3
341     (harfbuzz.override { withIcu = true; })
342     hunspell
343     icu
344     jre'
345     lcms2
346     libGL
347     libGLU
348     xorg.libX11
349     xorg.libXaw
350     xorg.libXdmcp
351     xorg.libXext
352     xorg.libXi
353     xorg.libXinerama
354     xorg.libXtst
355     libabw
356     libargon2
357     libatomic_ops
358     libcdr
359     libcmis
360     libe-book
361     libepoxy
362     libepubgen
363     libetonyek
364     libexttextcat
365     libjpeg
366     liblangtag
367     libmspack
368     libmwaw
369     libmysqlclient
370     libodfgen
371     liborcus
372     xorg.libpthreadstubs
373     librdf_redland
374     librevenge
375     librsvg
376     libsndfile
377     libvisio
378     libwpd
379     libwpg
380     libwps
381     libxml2
382     xorg.libxshmfence
383     libxslt
384     libzmf
385     libwebp
386     lp_solve
387     mdds
388     mythes
389     ncurses
390     neon
391     nspr
392     nss
393     openldap
394     openssl
395     pam
396     perl
397     poppler
398     postgresql
399     python311
400     sane-backends
401     unixODBC
402     unzip
403     util-linux
404     which
405     xmlsec
406     zip
407     zlib
408   ] ++ optionals kdeIntegration [
409     qtbase
410     qtx11extras
411     kcoreaddons
412     kio
413   ];
415   preConfigure = ''
416     configureFlagsArray=(
417       "--with-parallelism=$NIX_BUILD_CORES"
418       # here because we need to be very specific about spaces
419       "--with-lang=${concatStringsSep " " langs}"
420     );
422     patchShebangs .
424     NOCONFIGURE=1 ./autogen.sh
425   '' + optionalString kdeIntegration ''
426     # configure.ac assumes that the first directory that contains headers and
427     # libraries during its checks contains *all* the relevant headers/libs which
428     # obviously doesn't work for us, so we have 2 options:
429     #
430     # 1. patch configure.ac in order to specify the direct paths to various Qt/KDE
431     # dependencies which is ugly and brittle, or
432     #
433     # 2. use symlinkJoin to pull in the relevant dependencies and just patch in
434     # that path which is *also* ugly, but far less likely to break
435     #
436     # The 2nd option is not very Nix'y, but I'll take robust over nice any day.
437     # Additionally, it's much easier to fix if LO breaks on the next upgrade (just
438     # add the missing dependencies to it).
439     export QT${qtMajor}INC=${kdeDeps}/include
440     export QT${qtMajor}LIB=${kdeDeps}/lib
441     export KF${qtMajor}INC="${kdeDeps}/include ${kdeDeps}/include/KF${qtMajor}"
442     export KF${qtMajor}LIB=${kdeDeps}/lib
443   '';
445   configureFlags = [
446     # Explicitly passing in --host even on non-cross, because
447     # LibreOffice will attempt to detect WSL and cross-compile
448     # itself to Windows automatically, and we don't want it
449     # doing that.
450     "--host=${stdenv.hostPlatform.config}"
451     "--without-buildconfig-recorded"
453     (lib.withFeature withHelp "help")
454     "--with-boost=${getDev boost}"
455     "--with-boost-libdir=${getLib boost}/lib"
456     "--with-beanshell-jar=${bsh}"
457     "--with-vendor=NixOS"
458     "--disable-report-builder"
459     "--disable-online-update"
460     "--enable-python=system"
461     "--enable-dbus"
462     "--enable-release-build"
463     "--enable-epm"
464     "--with-ant-home=${getLib ant}/lib/ant"
466     # Without these, configure does not finish
467     "--without-junit"
469     # Schema files for validation are not included in the source tarball
470     "--without-export-validation"
472     # We do tarball prefetching ourselves
473     "--disable-fetch-external"
474     "--enable-build-opensymbol"
476     # I imagine this helps. Copied from go-oo.
477     # Modified on every upgrade, though
478     "--disable-odk"
479     "--disable-firebird-sdbc"
480     (lib.withFeature withFonts "fonts")
481     "--without-doxygen"
483     "--with-system-beanshell"
484     "--with-system-cairo"
485     "--with-system-coinmp"
486     "--with-system-headers"
487     "--with-system-libabw"
488     "--with-system-libcmis"
489     "--with-system-libepubgen"
490     "--with-system-libetonyek"
491     "--with-system-liblangtag"
492     "--with-system-libs"
493     "--with-system-libwps"
494     "--with-system-lpsolve"
495     "--with-system-mdds"
496     "--with-system-openldap"
497     "--with-system-openssl"
498     "--with-system-orcus"
499     "--with-system-postgresql"
500     "--with-system-xmlsec"
502     # TODO: package these as system libraries
503     "--without-system-altlinuxhyph"
504     "--without-system-frozen"
505     "--without-system-libfreehand"
506     "--without-system-libmspub"
507     "--without-system-libnumbertext"
508     "--without-system-libpagemaker"
509     "--without-system-libstaroffice"
510     "--without-system-libqxp"
511     "--without-system-dragonbox"
512     "--without-system-libfixmath"
514     # requires an oddly specific, old version
515     "--without-system-hsqldb"
517     # searches hardcoded paths that are wrong
518     "--without-system-zxing"
520     # is packaged but headers can't be found because there is no pkg-config file
521     "--without-system-zxcvbn"
522   ] ++ optionals kdeIntegration [
523     "--enable-kf${qtMajor}"
524     "--enable-qt${qtMajor}"
525   ] ++ optionals (kdeIntegration && qtMajor == "5") [
526     "--enable-gtk3-kde5"
527   ] ++ (if variant == "fresh" then [
528     "--with-system-rhino"
529     "--with-rhino-jar=${rhino}/share/java/js.jar"
530   ] else [
531     # our Rhino is too new for older versions
532     "--without-system-rhino"
533   ]);
536   env = {
537     # FIXME: this is a hack, because the right cflags are not being picked up
538     # from rasqal's .pc file. Needs more investigation.
539     NIX_CFLAGS_COMPILE = "-I${librdf_rasqal}/include/rasqal";
541     # Provide all the fonts used in tests.
542     FONTCONFIG_FILE = fontsConf;
543   };
545   makeFlags = [ "SHELL=${bash}/bin/bash" ];
547   enableParallelBuilding = true;
549   buildTargets = [ "build-nocheck" ];
551   # Disable tests for the Qt5 build, as they seem even more flaky
552   # than usual, and we will drop the Qt5 build after 24.11 anyway.
553   doCheck = !(kdeIntegration && qtMajor == "5");
555   preCheck = ''
556     export HOME=$(pwd)
557   '';
559   checkTarget = concatStringsSep " " [
560     "unitcheck"
561     "slowcheck"
562     "--keep-going"  # easier to debug test failures
563   ];
565   postInstall = optionalString (variant != "collabora") ''
566     mkdir -p $out/{include,share/icons}
568     cp -r include/LibreOfficeKit $out/include/
569     cp -r sysui/desktop/icons/hicolor $out/share/icons
571     # Rename icons for consistency
572     for file in $out/share/icons/hicolor/*/apps/*; do
573       mv $file "$(dirname $file)/libreoffice-$(basename $file)"
574     done
576     ln -s $out/lib/libreoffice/share/xdg $out/share/applications
578     # Unversionize desktop files
579     . ./bin/get_config_variables PRODUCTVERSION
580     for file in $out/lib/libreoffice/share/xdg/*.desktop; do
581       substituteInPlace $file \
582         --replace-fail "LibreOffice $PRODUCTVERSION" "LibreOffice" \
583         --replace-warn "Icon=libreoffice$PRODUCTVERSION" "Icon=libreoffice" \
584         --replace-fail "Exec=libreoffice$PRODUCTVERSION" "Exec=libreoffice"
585     done
586   '';
588   # Wrapping is done in ./wrapper.nix
589   dontWrapQtApps = true;
591   passthru = {
592     inherit srcs;
593     jdk = jre';
594     python = python311; # for unoconv
595     updateScript = [
596       ./update.sh
597       # Pass it this file name as argument
598       (builtins.unsafeGetAttrPos "pname" finalAttrs.finalPackage).file
599       # And the variant
600       variant
601     ];
602     inherit kdeIntegration;
603     # For the wrapper.nix
604     inherit gtk3;
605     # Although present in qtPackages, we need qtbase.qtPluginPrefix and
606     # qtbase.qtQmlPrefix
607     inherit qtbase;
608     gst_packages = with gst_all_1; [
609       gst-libav
610       gst-plugins-bad
611       gst-plugins-base
612       gst-plugins-good
613       gst-plugins-ugly
614       gstreamer
615     ];
616     qmlPackages = [
617       ki18n
618       knotifications
619       qtdeclarative
620       qtmultimedia
621       qtquickcontrols
622       qtwayland
623       solid
624       sonnet
625     ];
626     qtPackages = [
627       kauth
628       kcompletion
629       kconfigwidgets
630       kglobalaccel
631       ki18n
632       kio
633       kitemviews
634       ktextwidgets
635       kwidgetsaddons
636       kwindowsystem
637       kxmlgui
638       phonon
639       qtbase
640       qtdeclarative
641       qtmultimedia
642       qtsvg
643       qttools
644       qtwayland
645       sonnet
646     ];
647   };
649   # libreoffice tries to reference the BUILDCONFIG (e.g. PKG_CONFIG_PATH)
650   # in the binary causing the closure size to blow up because of many unnecessary
651   # dependencies to dev outputs. This behavior was patched away in nixpkgs
652   # (see above), make sure these don't leak again by accident.
653   # FIXME: disabled for kdeIntegration builds because the weird symlinkJoin setup
654   # leaks all the -dev dependencies :(
655   disallowedRequisites = lib.optionals (!kdeIntegration) (lib.concatMap (x: lib.optional (x?dev) x.dev) finalAttrs.buildInputs);
657   requiredSystemFeatures = [ "big-parallel" ];
659   meta = with lib; {
660     changelog = "https://wiki.documentfoundation.org/ReleaseNotes/${lib.versions.majorMinor version}";
661     description = "Comprehensive, professional-quality productivity suite, a variant of openoffice.org";
662     homepage = "https://libreoffice.org/";
663     # at least one jar in dependencies
664     sourceProvenance = with sourceTypes; [ binaryBytecode ];
665     license = licenses.lgpl3;
666     maintainers = with maintainers; [ raskin ];
667     platforms = platforms.linux;
668     mainProgram = "libreoffice";
669   };