Read this first: http://akrl.sdf.org/gccemacs.html
For that you need to compile gcc (duh). I edited Homebrew's gcc formula:
diff --git a/Formula/gcc.rb b/Formula/gcc.rb
index 1bd636d496..03ad124218 100644
--- a/Formula/gcc.rb
+++ b/Formula/gcc.rb
@@ -53,7 +53,7 @@ class Gcc < Formula
# - Ada, which requires a pre-existing GCC Ada compiler to bootstrap
# - Go, currently not supported on macOS
# - BRIG
- languages = %w[c c++ objc obj-c++ fortran]
+ languages = %w[c c++ objc obj-c++ fortran jit]
osmajor = `uname -r`.split(".").first
pkgversion = "Homebrew GCC #{pkg_version} #{build.used_options*" "}".strip
@@ -73,6 +73,7 @@ class Gcc < Formula
--with-system-zlib
--with-pkgversion=#{pkgversion}
--with-bugurl=https://github.com/Homebrew/homebrew-core/issues
+ --enable-host-shared
]
# Xcode 10 dropped 32-bit support
(easy way to apply this is to cd into /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
and
run pbpaste | git apply -
after copying the diff into clipboard 😄)
(or whereever is your Homebrew library set up)
- giflib
- jpeg
- libtiff
- gnutls
And XQuartz, because GCC is not able to parse Objective-C dialect changes what Apple has done for now and thus Apple Cocoa support is not available. (See: https://lists.gnu.org/archive/html/emacs-devel/2019-08/msg00056.html)
Clone https://github.com/emacs-mirror/emacs and checkout feature/native-comp
branch
Here's the script I used (note to adjust package versions if needed):
libs=(
/usr/local/Cellar/gcc/9.2.0_2
/usr/local/Cellar/giflib/5.2.1
/usr/local/Cellar/jpeg/9c
/usr/local/Cellar/libtiff/4.1.0
/usr/local/Cellar/gnutls/3.6.10
# Required by gnutls
/usr/local/Cellar/nettle/3.4.1
/usr/local/Cellar/libtasn1/4.15.0
/usr/local/Cellar/p11-kit/0.23.18.1
)
export PATH="/usr/local/Cellar/gcc/9.2.0_2/bin:${PATH}"
export CC="gcc-9"
export CPP="cpp-9"
CFLAGS=""
LDFLAGS=""
PKG_CONFIG_PATH=""
for dir in "${libs[@]}"; do
CFLAGS="${CFLAGS}-I${dir}/include "
LDFLAGS="${LDFLAGS}-L${dir}/lib "
PKG_CONFIG_PATH="${PKG_CONFIG_PATH}${dir}/lib/pkgconfig:"
done
export CPPFLAGS="${CFLAGS}"
export CFLAGS
export LDFLAGS
export PKG_CONFIG_PATH
./configure \
--prefix="${HOME}"/gccemacs \
--with-nativecomp \
--without-ns
Save it into build.sh
Then run:
sh build.sh && make bootstrap && make install
And result is in ~/gccemacs
. Add ~/gccemacs/bin
into PATH and start experimenting with el native building
I've been doing two things to address this:
make install
, copy the contents of thelisp
directory into the app bundle because that's where it ends up looking for theeln
files.libgccjit
and dependencies on the library path socomp
can find them while Emacs is running.#1 seems undesirable because
make install
puts the lisp directory in/usr/local/share/emacs/28.0.50/lisp/
. Would changingbin-dest-dir
cause Emacs to look there foreln
files on startup instead of in the app bundle?For #2, clearly those libraries need to be located at runtime. Can the linker be configured to hard code those dependency paths so the environment doesn't need configuring?
And would either of those strategies affect
emacsclient
oremacs -nw
?