Skip to content

Instantly share code, notes, and snippets.

@AllenDang
Last active July 7, 2024 09:42
Show Gist options
  • Save AllenDang/f019593e65572a8e0aefc96058a2d23e to your computer and use it in GitHub Desktop.
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!

@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