1
0
Fork 1
mirror of https://github.com/NixOS/nixpkgs.git synced 2024-12-25 03:17:13 +00:00
nixpkgs/pkgs/applications/editors/emacs/make-emacs.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

516 lines
13 KiB
Nix

{
pname,
version,
variant,
src,
patches ? _: [ ],
meta,
}:
{
lib,
stdenv,
Xaw3d,
acl,
alsa-lib,
apple-sdk,
autoreconfHook,
cairo,
dbus,
emacsPackagesFor,
fetchpatch,
gettext,
giflib,
glib-networking,
gnutls,
gpm,
gsettings-desktop-schemas,
gtk3,
gtk3-x11,
harfbuzz,
imagemagick,
jansson,
libXaw,
libXcursor,
libXi,
libXpm,
libgccjit,
libjpeg,
libotf,
libpng,
librsvg,
libselinux,
libtiff,
libwebp,
libxml2,
llvmPackages_14,
m17n_lib,
mailutils,
makeWrapper,
motif,
ncurses,
nixosTests,
pkg-config,
recurseIntoAttrs,
sigtool,
sqlite,
replaceVars,
systemd,
tree-sitter,
texinfo,
webkitgtk_4_0,
wrapGAppsHook3,
zlib,
# Boolean flags
withNativeCompilation ? stdenv.buildPlatform.canExecute stdenv.hostPlatform,
noGui ? false,
srcRepo ? true,
withAcl ? false,
withAlsaLib ? false,
withAthena ? false,
withCsrc ? true,
withDbus ? stdenv.hostPlatform.isLinux,
withGTK3 ? withPgtk && !noGui,
withGlibNetworking ? withPgtk || withGTK3 || (withX && withXwidgets),
withGpm ? stdenv.hostPlatform.isLinux,
withImageMagick ? lib.versionOlder version "27" && (withX || withNS),
# Emacs 30+ has native JSON support
withJansson ? lib.versionOlder version "30",
withMailutils ? true,
withMotif ? false,
withNS ? stdenv.hostPlatform.isDarwin && !(variant == "macport" || noGui),
withPgtk ? false,
withSelinux ? stdenv.hostPlatform.isLinux,
withSQLite3 ? lib.versionAtLeast version "29",
withSystemd ? lib.meta.availableOn stdenv.hostPlatform systemd,
withToolkitScrollBars ? true,
withTreeSitter ? lib.versionAtLeast version "29",
withWebP ? lib.versionAtLeast version "29",
withX ? !(stdenv.hostPlatform.isDarwin || noGui || withPgtk),
withXinput2 ? withX && lib.versionAtLeast version "29",
withXwidgets ?
!stdenv.hostPlatform.isDarwin
&& !noGui
&& (withGTK3 || withPgtk)
&& (lib.versionOlder version "30"), # XXX: upstream bug 66068 precludes newer versions of webkit2gtk (https://lists.gnu.org/archive/html/bug-gnu-emacs/2024-09/msg00695.html)
withSmallJaDic ? false,
withCompressInstall ? true,
# Options
siteStart ? ./site-start.el,
toolkit ? (
if withGTK3 then
"gtk3"
else if withMotif then
"motif"
else if withAthena then
"athena"
else
"lucid"
),
# macOS dependencies for NS and macPort
Accelerate,
AppKit,
Carbon,
Cocoa,
GSS,
IOKit,
ImageCaptureCore,
ImageIO,
OSAKit,
Quartz,
QuartzCore,
UniformTypeIdentifiers,
WebKit,
}:
assert (withGTK3 && !withNS && variant != "macport") -> withX || withPgtk;
assert noGui -> !(withX || withGTK3 || withNS || variant == "macport");
assert withAcl -> stdenv.hostPlatform.isLinux;
assert withAlsaLib -> stdenv.hostPlatform.isLinux;
assert withGpm -> stdenv.hostPlatform.isLinux;
assert withNS -> stdenv.hostPlatform.isDarwin && !(withX || variant == "macport");
assert withPgtk -> withGTK3 && !withX;
assert withXwidgets -> !noGui && (withGTK3 || withPgtk);
let
libGccJitLibraryPaths =
[
"${lib.getLib libgccjit}/lib/gcc"
"${lib.getLib stdenv.cc.libc}/lib"
]
++ lib.optionals (stdenv.cc ? cc.lib.libgcc) [
"${lib.getLib stdenv.cc.cc.lib.libgcc}/lib"
];
inherit (if variant == "macport" then llvmPackages_14.stdenv else stdenv)
mkDerivation
;
in
mkDerivation (finalAttrs: {
pname =
pname
+ (
if noGui then
"-nox"
else if variant == "macport" then
"-macport"
else if withPgtk then
"-pgtk"
else if withGTK3 then
"-gtk3"
else
""
);
inherit version;
inherit src;
patches =
patches fetchpatch
++ lib.optionals withNativeCompilation [
(replaceVars
(
if lib.versionOlder finalAttrs.version "29" then
./native-comp-driver-options-28.patch
else if lib.versionOlder finalAttrs.version "30" then
./native-comp-driver-options.patch
else
./native-comp-driver-options-30.patch
)
{
backendPath = (
lib.concatStringsSep " " (
builtins.map (x: ''"-B${x}"'') (
[
# Paths necessary so the JIT compiler finds its libraries:
"${lib.getLib libgccjit}/lib"
]
++ libGccJitLibraryPaths
++ [
# Executable paths necessary for compilation (ld, as):
"${lib.getBin stdenv.cc.cc}/bin"
"${lib.getBin stdenv.cc.bintools}/bin"
"${lib.getBin stdenv.cc.bintools.bintools}/bin"
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
# The linker needs to know where to find libSystem on Darwin.
"${apple-sdk.sdkroot}/usr/lib"
]
)
)
);
}
)
];
postPatch = lib.concatStringsSep "\n" [
(lib.optionalString srcRepo ''
rm -fr .git
'')
# Add the name of the wrapped gvfsd
# This used to be carried as a patch but it often got out of sync with
# upstream and was hard to maintain for emacs-overlay.
(lib.concatStrings (
map
(fn: ''
sed -i 's#(${fn} "gvfs-fuse-daemon")#(${fn} "gvfs-fuse-daemon") (${fn} ".gvfsd-fuse-wrapped")#' lisp/net/tramp-gvfs.el
'')
[
"tramp-compat-process-running-p"
"tramp-process-running-p"
]
))
# Reduce closure size by cleaning the environment of the emacs dumper
''
substituteInPlace src/Makefile.in \
--replace-warn 'RUN_TEMACS = ./temacs' 'RUN_TEMACS = env -i ./temacs'
''
''
substituteInPlace lisp/international/mule-cmds.el \
--replace-warn /usr/share/locale ${gettext}/share/locale
for makefile_in in $(find . -name Makefile.in -print); do
substituteInPlace $makefile_in --replace-warn /bin/pwd pwd
done
''
""
];
nativeBuildInputs =
[
makeWrapper
pkg-config
]
++ lib.optionals (variant == "macport") [
texinfo
]
++ lib.optionals srcRepo [
autoreconfHook
texinfo
]
++ lib.optionals (withPgtk || withX && (withGTK3 || withXwidgets)) [ wrapGAppsHook3 ];
buildInputs =
[
gettext
gnutls
(lib.getDev harfbuzz)
]
++ lib.optionals withJansson [
jansson
]
++ [
libxml2
ncurses
]
++ lib.optionals withAcl [
acl
]
++ lib.optionals withAlsaLib [
alsa-lib
]
++ lib.optionals withGpm [
gpm
]
++ lib.optionals withDbus [
dbus
]
++ lib.optionals withSelinux [
libselinux
]
++ lib.optionals (!stdenv.hostPlatform.isDarwin && withGTK3) [
gsettings-desktop-schemas
]
++ lib.optionals (stdenv.hostPlatform.isLinux && withX) [
libotf
m17n_lib
]
++ lib.optionals (withX && withGTK3) [
gtk3-x11
]
++ lib.optionals (withX && withMotif) [
motif
]
++ lib.optionals withGlibNetworking [
glib-networking
]
++ lib.optionals withNativeCompilation [
libgccjit
zlib
]
++ lib.optionals withImageMagick [
imagemagick
]
++ lib.optionals withPgtk [
giflib
gtk3
libXpm
libjpeg
libpng
librsvg
libtiff
]
++ lib.optionals withSQLite3 [
sqlite
]
++ lib.optionals withSystemd [
systemd
]
++ lib.optionals withTreeSitter [
tree-sitter
]
++ lib.optionals withWebP [
libwebp
]
++ lib.optionals withX [
Xaw3d
cairo
giflib
libXaw
libXpm
libjpeg
libpng
librsvg
libtiff
]
++ lib.optionals withXinput2 [
libXi
]
++ lib.optionals withXwidgets [
webkitgtk_4_0
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
sigtool
]
++ lib.optionals withNS [
librsvg
AppKit
GSS
ImageIO
]
++ lib.optionals (variant == "macport") [
Accelerate
AppKit
Carbon
Cocoa
IOKit
OSAKit
Quartz
QuartzCore
WebKit
# TODO are these optional?
GSS
ImageCaptureCore
ImageIO
]
++ lib.optionals (variant == "macport" && stdenv.hostPlatform.isAarch64) [
UniformTypeIdentifiers
];
# Emacs needs to find movemail at run time, see info (emacs) Movemail
propagatedUserEnvPkgs = lib.optionals withMailutils [
mailutils
];
hardeningDisable = [ "format" ];
configureFlags =
[
(lib.enableFeature false "build-details") # for a (more) reproducible build
(lib.withFeature true "modules")
]
++ (
if withNS then
[
(lib.enableFeature false "ns-self-contained")
]
else if withX then
[
(lib.withFeatureAs true "x-toolkit" toolkit)
(lib.withFeature true "cairo")
(lib.withFeature true "xft")
]
else if withPgtk then
[
(lib.withFeature true "pgtk")
]
else
[
(lib.withFeature false "gif")
(lib.withFeature false "jpeg")
(lib.withFeature false "png")
(lib.withFeature false "tiff")
(lib.withFeature false "x")
(lib.withFeature false "xpm")
]
)
++ lib.optionals (variant == "macport") [
(lib.enableFeatureAs true "mac-app" "$$out/Applications")
(lib.withFeature true "gnutls")
(lib.withFeature true "mac")
(lib.withFeature true "xml2")
]
++ lib.optionals stdenv.hostPlatform.isDarwin [
(lib.withFeature withNS "ns")
]
++ [
(lib.withFeature withCompressInstall "compress-install")
(lib.withFeature withToolkitScrollBars "toolkit-scroll-bars")
(lib.withFeature withNativeCompilation "native-compilation")
(lib.withFeature withImageMagick "imagemagick")
(lib.withFeature withMailutils "mailutils")
(lib.withFeature withSmallJaDic "small-ja-dic")
(lib.withFeature withTreeSitter "tree-sitter")
(lib.withFeature withXinput2 "xinput2")
(lib.withFeature withXwidgets "xwidgets")
(lib.withFeature withDbus "dbus")
(lib.withFeature withSelinux "selinux")
];
env =
lib.optionalAttrs withNativeCompilation {
NATIVE_FULL_AOT = "1";
LIBRARY_PATH = lib.concatStringsSep ":" libGccJitLibraryPaths;
}
// lib.optionalAttrs (variant == "macport") {
# Fixes intermittent segfaults when compiled with LLVM >= 7.0.
# See https://github.com/NixOS/nixpkgs/issues/127902
NIX_CFLAGS_COMPILE = "-include ${./macport_noescape_noop.h}";
};
enableParallelBuilding = true;
installTargets = [
"tags"
"install"
];
postInstall =
''
mkdir -p $out/share/emacs/site-lisp
cp ${siteStart} $out/share/emacs/site-lisp/site-start.el
$out/bin/emacs --batch -f batch-byte-compile $out/share/emacs/site-lisp/site-start.el
siteVersionDir=`ls $out/share/emacs | grep -v site-lisp | head -n 1`
rm -r $out/share/emacs/$siteVersionDir/site-lisp
''
+ lib.optionalString withCsrc ''
for srcdir in src lisp lwlib ; do
dstdir=$out/share/emacs/$siteVersionDir/$srcdir
mkdir -p $dstdir
find $srcdir -name "*.[chm]" -exec cp {} $dstdir \;
cp $srcdir/TAGS $dstdir
echo '((nil . ((tags-file-name . "TAGS"))))' > $dstdir/.dir-locals.el
done
''
+ lib.optionalString withNS ''
mkdir -p $out/Applications
mv nextstep/Emacs.app $out/Applications
''
+ lib.optionalString (withNativeCompilation && (withNS || variant == "macport")) ''
ln -snf $out/lib/emacs/*/native-lisp $out/Applications/Emacs.app/Contents/native-lisp
''
+ lib.optionalString withNativeCompilation ''
echo "Generating native-compiled trampolines..."
# precompile trampolines in parallel, but avoid spawning one process per trampoline.
# 1000 is a rough lower bound on the number of trampolines compiled.
$out/bin/emacs --batch --eval "(mapatoms (lambda (s) \
(when (subr-primitive-p (symbol-function s)) (print s))))" \
| xargs -n $((1000/NIX_BUILD_CORES + 1)) -P $NIX_BUILD_CORES \
$out/bin/emacs --batch -l comp --eval "(while argv \
(comp-trampoline-compile (intern (pop argv))))"
mkdir -p $out/share/emacs/native-lisp
$out/bin/emacs --batch \
--eval "(add-to-list 'native-comp-eln-load-path \"$out/share/emacs/native-lisp\")" \
-f batch-native-compile $out/share/emacs/site-lisp/site-start.el
'';
postFixup = lib.optionalString (stdenv.hostPlatform.isLinux && withX && toolkit == "lucid") ''
patchelf --add-rpath ${lib.makeLibraryPath [ libXcursor ]} $out/bin/emacs
patchelf --add-needed "libXcursor.so.1" "$out/bin/emacs"
'';
passthru = {
inherit withNativeCompilation;
inherit withTreeSitter;
inherit withXwidgets;
pkgs = recurseIntoAttrs (emacsPackagesFor finalAttrs.finalPackage);
tests = { inherit (nixosTests) emacs-daemon; };
};
meta = meta // {
broken = withNativeCompilation && !(stdenv.buildPlatform.canExecute stdenv.hostPlatform);
};
})