Skip to content

Instantly share code, notes, and snippets.

@AllenDang
Last active August 15, 2023 15:45
  • Star 60 You must be signed in to star a gist
  • Fork 7 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save AllenDang/f019593e65572a8e0aefc96058a2d23e to your computer and use it in GitHub Desktop.
Build gccemacs on MacOS catalina with gcc 10 installed by homebrew.

Use pre-built gccemacs

Fortunatly we could use pre-built gccemacs right now.

Those two repos did the greate job for us.

https://github.com/twlz0ne/nix-gccemacs-darwin

https://github.com/twlz0ne/nix-gccemacs-sierra

Here is the tutorial:

Install nix

https://nixos.org/

For MacOS catalina

Install

nix-env -iA cachix -f https://cachix.org/api/v1/install
cachix use gccemacs-darwin
nix-env -iA emacsGccDarwin -f https://github.com/twlz0ne/nix-gccemacs-darwin/archive/master.zip

Update

nix-env -iA emacsGccDarwin -f https://github.com/twlz0ne/nix-gccemacs-darwin/archive/master.zip

For MacOS sierra

Install

nix-env -iA cachix -f https://cachix.org/api/v1/install
cachix use gccemacs-sierra
nix-env -iA emacsGccSierra -f https://github.com/twlz0ne/nix-gccemacs-sierra/archive/master.zip

Update

nix-env -iA emacsGccSierra -f https://github.com/twlz0ne/nix-gccemacs-sierra/archive/master.zip

It's done

Launch emacs from terminal, and you could find related app bundle's path by right click emacs icon in Docker.

Build gccemacs on MacOS catalina

It's a hard time to make gccemacs work on MacOS catalina. I've met countless problems by following every tutorials I can get from google. Fortunately I finally get it work!

Hope this tutorial could help you.

GCC with libgccjit enabled

cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

Edit gcc.rb like this

@@ -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

Build gcc by homebrew brew install gcc --build-from-source --force

Get gccemacs source code

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

Build using this script

Create a build.sh outside emacs source code folder.

# native-comp optimization
export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:${PATH}"
export CFLAGS="-I/usr/local/Cellar/gcc/10.1.0/include"
export LDFLAGS="-L/usr/local/Cellar/gcc/10.1.0/lib/gcc/10 -I/usr/local/Cellar/gcc/10.1.0/include"
export LIBRARY_PATH="/usr/local/Cellar/gcc/10.1.0/lib/gcc/10:${LIBRARY_PATH:-}"

cd emacs || exit

git clean -xfd

./autogen.sh

./configure \
     --disable-dependency-tracking \
     --disable-silent-rules \
     --enable-locallisppath=/usr/local/share/emacs/28.0.50/site-lisp \
     --prefix=/usr/local/opt/gccemacs \
     --without-dbus \
     --without-imagemagick \
     --with-mailutils \
     --with-ns \
     --disable-ns-self-contained \
     --with-cairo \
     --with-modules \
     --with-xml2 \
     --with-gnutls \
     --with-json \
     --with-rsvg \
     --with-nativecomp

# Ensure /usr/local/opt/gccemacs exists
rm -rf /usr/local/opt/gccemacs
mkdir /usr/local/opt/gccemacs

# Ensure the directory to which we will dump Emacs exists and has the correct
# permissions set.
libexec=/usr/local/libexec/emacs/28.0.50
if [ ! -d $libexec ]; then
  sudo mkdir -p $libexec
  sudo chown $USER $libexec
fi

make -j4
make install 

rm -rf "/Applications/Emacs.app"
mv nextstep/Emacs.app "/Applications/"

cd /usr/local/bin || exit
rm emacs
rm emacsclient
ln -s /usr/local/opt/gccemacs/bin/emacs .
ln -s /usr/local/opt/gccemacs/bin/emacsclient .


cd /Applications/Emacs.app/Contents || exit
ln -s /usr/local/opt/gccemacs/share/emacs/28.0.50/lisp .

To use Spacemacs

No special actions are needed.

To use Doom

Latest doom already support to compile all modules with native-comp.

Update to latest version.

To do so, upgrade doom to latest version. doom upgrade

Compile all modules

After that, do doom sync to compile all modules.

Generate local env file

Run doom env to generate local env file.

It's done.

Open emacs and feel the performance boost. Enjoy!

@biswanaths
Copy link

Thank you. Sorry for spamming and missed the above.
Yes installed coreutils and exported the path to make sure Make used that.

@takuma-yoneda
Copy link

For anyone who is still looking at this:
If you're checking out 42fc752a14 or later,
You must replace --with-nativecomp --> --with-native-compilation in the script above.

As of 42fc752a14 the new configure flag to activate the Elisp native compilation is --with-native-compilation.

(See https://akrl.sdf.org/gccemacs.html#orgf5ebdd1)

@takuma-yoneda
Copy link

After compilation finishes, if you fail to launch emacs with an error like this:

emacs: dlopen(/Applications/Emacs.app/Contents/MacOS/../native-lisp/28.0.50-54532fd9/window-0d1b8b93-738411b0.eln, 1): image not found

You just need to symlink the proper native-lisp directory as:

ln -snf /usr/local/opt/gccemacs/lib/emacs/28.0.50/native-lisp /Applications/Emacs.app/Contents/MacOS/../native-lisp

(Actually, this is already posted above)

@hraban
Copy link

hraban commented Aug 17, 2021

I had to link both native-lisp and lisp into the final Emacs.app:

From the source directory:

ln -s "$PWD/native-lisp" nextstep/Emacs.app/Contents/
ln -s "$PWD/lisp" nextstep/Emacs.app/Contents/Resources/

Not sure what's happening. Commit bf1ec4952e67b474bff813cd26e4d612a359baf1, from Tue Aug 17 11:11:35 2021 +0300. Compilation flags ./configure --enable-link-time-optimization --with-imagemagick --with-native-compilation --with-json CFLAGS=-O3

@hraban
Copy link

hraban commented Aug 29, 2021

Update: it was me all along: I had this problem because I only ran make, not make install. I thought make install would copy Emacs to my /usr/something, but it turns out that it installs the necessary extra tools into nextstep/Emacs.app. So: make install is necessary for building on mac os, after which you can move the Emacs.app to /Applications.

@sevillaarvin
Copy link

@agzam Same issue with ashton314, you could try to use CC=/usr/bin/clang ./configure and see if it works.

It worked, thanks! I was agonizing over this for days.

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