Compiling GCC 9 on macOS Catalina
Posted on October 12, 2019 by Paul
In this tutorial, I will show you how to compile from source and install the current stable version of GCC on your macOS computer. The instructions from this tutorial were tested on Catalina (macOS 10.15).
Clang, the default compiler for macOS, supports only C, C++, Objective-C and Objective-C++. If you are interested in a modern Fortran compiler, e.g. you will need gfortran that comes with GCC. Another reason to have the latest stable version of GCC on your macOS is that it provides you with an alternative C and C++ compiler. Testing your code with two different compilers is always a good idea.
Building GCC 9 from sources could take some time, in my case it took about two hours on a MacBook Air with a 16GB of RAM.
In order to compile GCC from sources you will need a working C++ compiler. In the remaining of this article I will assume that you have installed the Command Line Tools for Xcode. At the time of this writing Apple’s Command Line Tools maps the gcc and g++ to clang and clang++. If you don’t have the Command Line Tools installed, open a Terminal and write:
which will guide you through the installation process.
Let’s start by creating a working folder:
Next, we can download and extract the latest stable version of GCC:
GCC 9 depends on a couple of other libraries (GSL, GMP, MPFR and ISL) that can be downloaded with:
the above four prerequisites will be built during the GCC build.
GCC expects to find the system headers in /usr/include which was removed starting with macOS Mojave. As a workaround, let’s create a folder with symbolic links to the system headers and libraries:
Please note that in the above, the last line does a deep copy of the include folder, we do a copy because we need to modify one of the header file in order to be able to build GCC. On a typical GNU/Linux system a more elegant solution would be to use fixinclude from GCC and the auotgen utility instead of manually modifying one of the system header files.
Next, we need to edit the file /usr/local/gcc_system_root/usr/include/Availability.h, at about line 300, just before:
find line 300 and paste the next snippet:
This is how the file looks around line 300 before the change:
This is how the file looks around line 300 after the change:
We are ready to compile GCC now. Be prepared that this could take some time … Since I’m interested only in the C, C++ and Fortran compilers, this is the configure command I’ve used on my machine:
The above command instructs the configure app to add a prefix to all the resulting executable programs, so for example if you want to invoke GCC 9.2.0 you will write gcc-9.2, the gcc command will invoke Apple’s version of clang.
If you are interested in building more compilers available in the GCC collection modify the –enable-languages configure option.
And now, the final touches:
Grab a coffee, maybe a book, and wait … this should take approximately, depending on your computer configuration, an hour … or more … and about 4.15GB of your disk space for the build folder.
Install the compiled gcc in /usr/local/gcc-9.2:
Now, you can keep the new compiler completely isolated from your Apple’s gcc compiler and, when you need to use it, just modify your path by writing in Terminal:
If you want to avoid writing the above command each time you open a Terminal, save the above command in the file .zshrc from your Home folder, e.g:
You should be able to invoke any of the newly compiled compilers C, C++, Fortran …, invoking g++ is as simple as writing in your Terminal:
Remember to erase the working folder from your HOME if you want to recover some space:
Next, I’ll show you how to check if the compiler was properly installed by compiling and running a few examples. GCC 9 uses by default the C++14 standard and C11 for the C coders, you should be able to compile any valid C++14 code directly. In your favorite text editor, copy and save this test program (I’ll assume you will save the file in your Home directory):
Compiling and running the above lambda example:
We could also compile a C++ code that uses threads:
Next, we present a simple C++ code that uses regular expressions to check if the input read from stdin is a floating point number:
If you are a Fortran programmer, you can use some of the Fortran 2008 features like do concurrent with gfortran-9.2:
The above code can be compiled with (assuming you’ve saved it as tst_concurrent_do.f90):
If you are interested in learning more about the new C++11/C++14 syntax I would recommend reading The C++ Programming Language by Bjarne Stroustrup.
or, Professional C++ by M. Gregoire, N. A. Solter, S. J. Kleper 2nd edition:
If you need to brush your Fortran knowledge a good book is Modern Fortran Explained by M. Metcalf, J. Reid and M. Cohen: