biglybt: 3.5.0.0 -> 3.6.0.0
[NixPkgs.git] / pkgs / applications / editors / emacs / make-emacs.nix
bloba525335646169533ccfd13ca02ee96bb65870c5d
1 { pname
2 , version
3 , variant
4 , src
5 , patches ? _: [ ]
6 , meta
7 }:
9 { lib
10 , stdenv
11 , Xaw3d
12 , acl
13 , alsa-lib
14 , autoreconfHook
15 , cairo
16 , dbus
17 , emacsPackagesFor
18 , fetchpatch
19 , gconf
20 , gettext
21 , giflib
22 , glib-networking
23 , gnutls
24 , gpm
25 , gsettings-desktop-schemas
26 , gtk2-x11
27 , gtk3
28 , gtk3-x11
29 , harfbuzz
30 , imagemagick
31 , jansson
32 , libXaw
33 , libXcursor
34 , libXft
35 , libXi
36 , libXpm
37 , libgccjit
38 , libjpeg
39 , libotf
40 , libpng
41 , librsvg
42 , libselinux
43 , libtiff
44 , libwebp
45 , libxml2
46 , llvmPackages_14
47 , m17n_lib
48 , makeWrapper
49 , motif
50 , ncurses
51 , nixosTests
52 , pkg-config
53 , recurseIntoAttrs
54 , sigtool
55 , sqlite
56 , substituteAll
57 , systemd
58 , tree-sitter
59 , texinfo
60 , webkitgtk
61 , wrapGAppsHook
63 # Boolean flags
64 , withNativeCompilation ? stdenv.buildPlatform.canExecute stdenv.hostPlatform
65 , noGui ? false
66 , srcRepo ? true
67 , withAcl ? false
68 , withAlsaLib ? false
69 , withAthena ? false
70 , withCsrc ? true
71 , withDbus ? stdenv.isLinux
72 , withGTK2 ? false
73 , withGTK3 ? withPgtk && !noGui
74 , withGconf ? false
75 , withGlibNetworking ? withPgtk || withGTK3 || (withX && withXwidgets)
76 , withGpm ? stdenv.isLinux
77 , withImageMagick ? lib.versionOlder version "27" && (withX || withNS)
78 , withMotif ? false
79 , withNS ? stdenv.isDarwin && !(variant == "macport" || noGui)
80 , withPgtk ? false
81 , withSelinux ? stdenv.isLinux
82 , withSQLite3 ? lib.versionAtLeast version "29"
83 , withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd
84 , withToolkitScrollBars ? true
85 , withTreeSitter ? lib.versionAtLeast version "29"
86 , withWebP ? lib.versionAtLeast version "29"
87 , withX ? !(stdenv.isDarwin || noGui || withPgtk)
88 , withXinput2 ? withX && lib.versionAtLeast version "29"
89 , withXwidgets ? !stdenv.isDarwin && !noGui && (withGTK3 || withPgtk)
90 , withSmallJaDic ? false
91 , withCompressInstall ? true
93 # Options
94 , siteStart ? ./site-start.el
95 , toolkit ? (
96   if withGTK2 then "gtk2"
97   else if withGTK3 then "gtk3"
98   else if withMotif then "motif"
99   else if withAthena then "athena"
100   else "lucid")
102 # macOS dependencies for NS and macPort
103 , Accelerate
104 , AppKit
105 , Carbon
106 , Cocoa
107 , GSS
108 , IOKit
109 , ImageCaptureCore
110 , ImageIO
111 , OSAKit
112 , Quartz
113 , QuartzCore
114 , UniformTypeIdentifiers
115 , WebKit
118 assert (withGTK2 && !withNS && variant != "macport") -> withX;
119 assert (withGTK3 && !withNS && variant != "macport") -> withX || withPgtk;
121 assert noGui -> !(withX || withGTK2 || withGTK3 || withNS || variant == "macport");
122 assert withAcl -> stdenv.isLinux;
123 assert withAlsaLib -> stdenv.isLinux;
124 assert withGTK2 -> !(withGTK3 || withPgtk);
125 assert withGTK3 -> !withGTK2 || withPgtk;
126 assert withGconf -> withX;
127 assert withGpm -> stdenv.isLinux;
128 assert withNS -> stdenv.isDarwin && !(withX || variant == "macport");
129 assert withPgtk -> withGTK3 && !withX;
130 assert withXwidgets -> !noGui && (withGTK3 || withPgtk);
133   libGccJitLibraryPaths = [
134     "${lib.getLib libgccjit}/lib/gcc"
135     "${lib.getLib stdenv.cc.libc}/lib"
136   ] ++ lib.optionals (stdenv.cc?cc.libgcc) [
137     "${lib.getLib stdenv.cc.cc.libgcc}/lib"
138   ];
140   inherit (if variant == "macport"
141            then llvmPackages_14.stdenv
142            else stdenv) mkDerivation;
144 mkDerivation (finalAttrs: {
145   pname = pname
146           + (if noGui then "-nox"
147              else if variant == "macport" then "-macport"
148              else if withPgtk then "-pgtk"
149              else if withGTK3 then "-gtk3"
150              else if withGTK2 then "-gtk2"
151              else "");
152   inherit version;
154   inherit src;
156   patches = patches fetchpatch ++ lib.optionals withNativeCompilation [
157     (substituteAll {
158       src = if lib.versionOlder finalAttrs.version "29"
159             then ./native-comp-driver-options-28.patch
160             else ./native-comp-driver-options.patch;
161       backendPath = (lib.concatStringsSep " "
162         (builtins.map (x: ''"-B${x}"'') ([
163           # Paths necessary so the JIT compiler finds its libraries:
164           "${lib.getLib libgccjit}/lib"
165         ] ++ libGccJitLibraryPaths ++ [
166           # Executable paths necessary for compilation (ld, as):
167           "${lib.getBin stdenv.cc.cc}/bin"
168           "${lib.getBin stdenv.cc.bintools}/bin"
169           "${lib.getBin stdenv.cc.bintools.bintools}/bin"
170         ])));
171     })
172   ];
174   postPatch = lib.concatStringsSep "\n" [
175     (lib.optionalString srcRepo ''
176       rm -fr .git
177     '')
179     # Add the name of the wrapped gvfsd
180     # This used to be carried as a patch but it often got out of sync with
181     # upstream and was hard to maintain for emacs-overlay.
182     (lib.concatStrings (map (fn: ''
183       sed -i 's#(${fn} "gvfs-fuse-daemon")#(${fn} "gvfs-fuse-daemon") (${fn} ".gvfsd-fuse-wrapped")#' lisp/net/tramp-gvfs.el
184     '') [
185       "tramp-compat-process-running-p"
186       "tramp-process-running-p"
187     ]))
189     # Reduce closure size by cleaning the environment of the emacs dumper
190     ''
191       substituteInPlace src/Makefile.in \
192         --replace 'RUN_TEMACS = ./temacs' 'RUN_TEMACS = env -i ./temacs'
193     ''
195     ''
196       substituteInPlace lisp/international/mule-cmds.el \
197         --replace /usr/share/locale ${gettext}/share/locale
199       for makefile_in in $(find . -name Makefile.in -print); do
200         substituteInPlace $makefile_in --replace /bin/pwd pwd
201       done
202     ''
204     ""
205   ];
207   nativeBuildInputs = [
208     makeWrapper
209     pkg-config
210   ] ++ lib.optionals (variant == "macport") [
211     texinfo
212   ] ++ lib.optionals srcRepo [
213     autoreconfHook
214     texinfo
215   ] ++ lib.optional (withPgtk || withX && (withGTK3 || withXwidgets)) wrapGAppsHook;
217   buildInputs = [
218     gettext
219     gnutls
220     harfbuzz.dev
221     jansson
222     libxml2
223     ncurses
224   ] ++ lib.optionals withGconf [
225     gconf
226   ] ++ lib.optionals withAcl [
227     acl
228   ] ++ lib.optionals withAlsaLib [
229     alsa-lib
230   ] ++ lib.optionals withGpm [
231     gpm
232   ] ++ lib.optionals withDbus [
233     dbus
234   ] ++ lib.optionals withSelinux [
235     libselinux
236   ] ++ lib.optionals (!stdenv.isDarwin && withGTK3) [
237     gsettings-desktop-schemas
238   ] ++ lib.optionals (stdenv.isLinux && withX) [
239     libotf
240     m17n_lib
241   ] ++ lib.optionals (withX && withGTK2) [
242     gtk2-x11
243   ] ++ lib.optionals (withX && withGTK3) [
244     gtk3-x11
245   ] ++ lib.optionals (withX && withMotif) [
246     motif
247   ] ++ lib.optionals withGlibNetworking [
248     glib-networking
249   ] ++ lib.optionals withNativeCompilation [
250     libgccjit
251   ] ++ lib.optionals withImageMagick [
252     imagemagick
253   ] ++ lib.optionals withPgtk [
254     giflib
255     gtk3
256     libXpm
257     libjpeg
258     libpng
259     librsvg
260     libtiff
261   ] ++ lib.optionals withSQLite3 [
262     sqlite
263   ] ++ lib.optionals withSystemd [
264     systemd
265   ] ++ lib.optionals withTreeSitter [
266     tree-sitter
267   ] ++ lib.optionals withWebP [
268     libwebp
269   ] ++ lib.optionals withX [
270     Xaw3d
271     cairo
272     giflib
273     libXaw
274     libXpm
275     libjpeg
276     libpng
277     librsvg
278     libtiff
279   ] ++ lib.optionals withXinput2 [
280     libXi
281   ] ++ lib.optionals withXwidgets [
282     webkitgtk
283   ] ++ lib.optionals stdenv.isDarwin [
284     sigtool
285   ] ++ lib.optionals withNS [
286     librsvg
287     AppKit
288     GSS
289     ImageIO
290   ] ++ lib.optionals (variant == "macport") [
291     Accelerate
292     AppKit
293     Carbon
294     Cocoa
295     IOKit
296     OSAKit
297     Quartz
298     QuartzCore
299     UniformTypeIdentifiers
300     WebKit
301     # TODO are these optional?
302     GSS
303     ImageCaptureCore
304     ImageIO
305   ];
307   hardeningDisable = [ "format" ];
309   configureFlags = [
310     "--disable-build-details" # for a (more) reproducible build
311     "--with-modules"
312   ] ++ (if withNS then [
313     "--disable-ns-self-contained"
314   ] else if withX then [
315     "--with-x-toolkit=${toolkit}"
316     "--with-xft"
317     "--with-cairo"
318   ] else if withPgtk then [
319     "--with-pgtk"
320   ] else [
321     "--with-gif=no"
322     "--with-jpeg=no"
323     "--with-png=no"
324     "--with-tiff=no"
325     "--with-x=no"
326     "--with-xpm=no"
327   ])
328   ++ lib.optionals (variant == "macport") [
329     "--enable-mac-app=$$out/Applications"
330     "--with-gnutls=yes"
331     "--with-mac"
332     "--with-xml2=yes"
333   ]
334   ++ (lib.optional stdenv.isDarwin (lib.withFeature withNS "ns"))
335   ++ [
336     (lib.withFeature withCompressInstall "compress-install")
337     (lib.withFeature withToolkitScrollBars "toolkit-scroll-bars")
338     (lib.withFeature withNativeCompilation "native-compilation")
339     (lib.withFeature withImageMagick "imagemagick")
340     (lib.withFeature withSmallJaDic "small-ja-dic")
341     (lib.withFeature withTreeSitter "tree-sitter")
342     (lib.withFeature withXinput2 "xinput2")
343     (lib.withFeature withXwidgets "xwidgets")
344     (lib.withFeature withDbus "dbus")
345     (lib.withFeature withSelinux "selinux")
346   ];
348   env = lib.optionalAttrs withNativeCompilation {
349     NATIVE_FULL_AOT = "1";
350     LIBRARY_PATH = lib.concatStringsSep ":" libGccJitLibraryPaths;
351   } // lib.optionalAttrs (variant == "macport") {
352     # Fixes intermittent segfaults when compiled with LLVM >= 7.0.
353     # See https://github.com/NixOS/nixpkgs/issues/127902
354     NIX_CFLAGS_COMPILE = "-include ${./macport_noescape_noop.h}";
355   };
357   enableParallelBuilding = true;
359   installTargets = [ "tags" "install" ];
361   postInstall = ''
362     mkdir -p $out/share/emacs/site-lisp
363     cp ${siteStart} $out/share/emacs/site-lisp/site-start.el
365     $out/bin/emacs --batch -f batch-byte-compile $out/share/emacs/site-lisp/site-start.el
367     siteVersionDir=`ls $out/share/emacs | grep -v site-lisp | head -n 1`
369     rm -r $out/share/emacs/$siteVersionDir/site-lisp
370   '' + lib.optionalString withCsrc ''
371     for srcdir in src lisp lwlib ; do
372       dstdir=$out/share/emacs/$siteVersionDir/$srcdir
373       mkdir -p $dstdir
374       find $srcdir -name "*.[chm]" -exec cp {} $dstdir \;
375       cp $srcdir/TAGS $dstdir
376       echo '((nil . ((tags-file-name . "TAGS"))))' > $dstdir/.dir-locals.el
377     done
378   '' + lib.optionalString withNS ''
379     mkdir -p $out/Applications
380     mv nextstep/Emacs.app $out/Applications
381   '' + lib.optionalString (withNativeCompilation && (withNS || variant == "macport")) ''
382     ln -snf $out/lib/emacs/*/native-lisp $out/Applications/Emacs.app/Contents/native-lisp
383   '' + lib.optionalString withNativeCompilation ''
384     echo "Generating native-compiled trampolines..."
385     # precompile trampolines in parallel, but avoid spawning one process per trampoline.
386     # 1000 is a rough lower bound on the number of trampolines compiled.
387     $out/bin/emacs --batch --eval "(mapatoms (lambda (s) \
388       (when (subr-primitive-p (symbol-function s)) (print s))))" \
389       | xargs -n $((1000/NIX_BUILD_CORES + 1)) -P $NIX_BUILD_CORES \
390         $out/bin/emacs --batch -l comp --eval "(while argv \
391           (comp-trampoline-compile (intern (pop argv))))"
392     mkdir -p $out/share/emacs/native-lisp
393     $out/bin/emacs --batch \
394       --eval "(add-to-list 'native-comp-eln-load-path \"$out/share/emacs/native-lisp\")" \
395       -f batch-native-compile $out/share/emacs/site-lisp/site-start.el
396   '';
398   postFixup = lib.optionalString (stdenv.isLinux && withX && toolkit == "lucid") ''
399       patchelf --add-rpath ${lib.makeLibraryPath [ libXcursor ]} $out/bin/emacs
400       patchelf --add-needed "libXcursor.so.1" "$out/bin/emacs"
401   '';
403   passthru = {
404     inherit withNativeCompilation;
405     inherit withTreeSitter;
406     pkgs = recurseIntoAttrs (emacsPackagesFor finalAttrs.finalPackage);
407     tests = { inherit (nixosTests) emacs-daemon; };
408   };
410   meta = meta // {
411     broken = withNativeCompilation && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform);
412   };