Skip to content

Instantly share code, notes, and snippets.

@mikroskeem
Last active July 11, 2023 14:59
Show Gist options
  • Star 47 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save mikroskeem/0a5c909c1880408adf732ceba6d3f9ab to your computer and use it in GitHub Desktop.
Save mikroskeem/0a5c909c1880408adf732ceba6d3f9ab to your computer and use it in GitHub Desktop.
gccemacs on OSX

gccemacs on OS X

Read this first: http://akrl.sdf.org/gccemacs.html

Prerequisites

1) GCC with libgccjit enabled

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)

2) Bunch of dependencies

  • 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)

3) Source

Clone https://github.com/emacs-mirror/emacs and checkout feature/native-comp branch

2) Building

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

@bryanmobrien
Copy link

Late to this game, but very thankful for this gist (and all the tips/tricks within).
With the following pieces,

Big Sur 11.2 (Intel) 
HOMEBREW_VERSION: 2.7.5-237-gf7a718c
gcc: stable 10.2.0 (bottled), HEAD
libgccjit: stable 10.2.0 (bottled), HEAD
git branch: feature/native-comp b8d3ae78c5 [origin/feature/native-comp] 
src-dir:  /Users/bobrien/src/gnu-emacs/gccemacs

I was failing time and time again with this error

emacs: dlopen(/Users/bobrien/src/gnu-emacs/gccemacs/nextstep/Emacs.app/Contents/MacOS/  
../native-lisp/28.0.50-x86_64-apple-darwin20.3.0-97a65566abd4d693149e0aa232898a68/mouse-  
15f283fa50e83fc2aec8714353ada84c-de78d65d134dc032624554b36cd56584.eln, 1): image not found

I was finally able to successfully build (and run) with the following build.sh:

export CC=clang
export LDFLAGS=-L/usr/local/Cellar/libgccjit/10.2.0_1/lib/gcc/10
export CXXFLAGS=-I/usr/local/Cellar/libgccjit/10.2.0_1/include
./configure --with-nativecomp
make bindir=$(pwd)/nextstep/Emacs.app/Contents/MacOS bootstrap && make install

The piece that got me past the error was passing bindir to make (thank you @shshkn)
I didn't have to symlink any directories in the src-dir ;-)
I symlinked the built gccemacs as:

ln -sf ~/src/gnu-emacs/gccemacs/nextstep/Emacs.app ~/Applications/GCCEmacs.app

I was able to run Emacs via command line and finder (mouse-click).
Emacsclient was aliased as

em="~/src/gnu-emacs/gccemacs/nextstep/Emacs.app/bin/emacsclient -c -n -a ''

and emacsclient is working as well.

Again, thank all of you for this gist and especially the bindir= tip.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment