Rodrigo worked on an internship with the GHC team at Well-Typed this summer. In this post he reports on his progress improving GHC’s configuration tooling as a step towards better cross-compiler support.
GHC, like most high-level language compilers, depends upon a set of tools like assemblers, linkers, and archivers for the production of machine code. Collectively these tools are known as a toolchain and capture a great deal of platform-dependent knowledge.
Traditionally, developers generate a
./configure script using the venerable
autoconf tool, then users execute this script when they install a GHC binary distribution. The
./configure script determines the location of programs (such as the C compiler) and which options GHC will need to pass them.
autoconf-centric model of toolchain configuration has served GHC well, it has two key issues:
For cross-compiling to a different platform, it would be highly valuable to users if GHC would become a runtime-retargetable compiler (like
go). That is, the user should be able to download a single GHC binary distribution and use it to compile not only for their local machine, but also any other targets that GHC supports.
shfile that is GHC’s
./configurescript has historically been challenging to maintain and test. Modifications to the
./configurescript are among the most risky changes routinely made to the compiler, because it is easy to introduce a bug on some specific toolchain configuration, and infeasible to test all possible configurations in CI.
To address these issues, we are introducing
ghc-toolchain, a new way to configure the toolchain for GHC, which will eventually replace the existing toolchain configuration logic in the
./configure script. Its main goal is to allow new compilation toolchains to be configured for GHC at any point in time, notably after the compiler has been installed. For example, calling
ghc-toolchain --triple=x86_64-w64-mingw32 will configure a compilation toolchain on the host machine capable of producing code for an x86_64 machine running Windows using MinGW. This is an important step towards making GHC runtime-retargetable, and since
ghc-toolchain is implemented in Haskell, it will be much easier to modify and test than the
In this post we explain in more detail how GHC interacts with the system toolchain and how
ghc-toolchain facilitates our future goal of making GHC a runtime-retargetable compiler.