Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
3.6 KiB
Compiling Lean with Split Stacks
Split stacks is a relatively new feature in gcc. It allows the stack to grown automatically as needed. There is a small performance penalty since the program stack is stored in the heap. However, we can have multiple threads, each starting with a small stack, and have the stack grow and shrink as required by the program.
In principle, it is possible to build a program that uses split-stacks with libraries that do not. However, it did not work in our experiments. To be able to compile Lean with split-stacks, we also have to compile GMP, MPFR and Lua using split-stacks.
We also had to use the [gold linker](http://en.wikipedia.org/wiki/Gold_(linker).
Gold linker
The gold linker is called ld.gold
(in our test system). On Ubuntu, you
can install it by executing
sudo apt-get install binutils-gold
Before we compiled GMP, MPFR, Lua, and Lean, we created an alias
alias ld=ld.gold
If everything is working correctly, when we execute ld --version
, we should
get an output like the following one:
GNU gold (GNU Binutils for Ubuntu 2.22) 1.11
Copyright 2011 Free Software Foundation, Inc.
...
Compiling GMP using split-stacks
Download GMP from https://gmplib.org; uncompress the gmp tar-ball at $HOME/tools
; and configure it using
./configure CFLAGS=-fsplit-stack --prefix=$HOME/tools/split-stack --enable-static
Then, build and install using
make
make install
We should have the file libgmp.a
at $HOME/tools/split-stack/lib
.
Compiling MPFR using split-stacks
Download MPFR from http://www.mpfr.org/; uncompress the mpfr tar-ball at $HOME/tools
; and configure it using
./configure CFLAGS=-fsplit-stack --prefix=$HOME/tools/split-stack --with-gmp-include=$HOME/tools/split-stack/include --with-gmp-lib=$HOME/tools/split-stack/lib --enable-static
Make sure MPFR does not produce any warning/error message. Then, build and install using:
make
make install
We should have the file libmpfr.a
at $HOME/tools/split-stack/lib
.
Compiling Lua using split-stacks
Download Lua from http://www.lua.org/; uncompress the Lua tar-ball at $HOME/tools
.
Then, modify the following line in the file src/Makefile
in the Lua directory.
CFLAGS= -O2 -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS)
We should include the option -fsplit-stack
CFLAGS= -O2 -fsplit-stack -Wall -DLUA_COMPAT_ALL $(SYSCFLAGS) $(MYCFLAGS)
Then, build and install using
make linux
make linux install INSTALL_TOP=$HOME/tools/split-stack
We should have the file liblua.a
at $HOME/tools/split-stack/lib
.
Compiling Lean using split-stacks
Go to the Lean directory, and create the folder build/release
mkdir build/release
Configure Lean using
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_CXX_COMPILER=g++ -D TCMALLOC=OFF -D LUA_LIBRARIES=$HOME/tools/split-stack/lib/liblua.a -D LUA_INCLUDE_DIR=$HOME/tool/split-stack/include -D GMP_INCLUDE_DIR=$HOME/tools/split-stack/include -D GMP_LIBRARIES=$HOME/tools/split-stack/lib/libgmp.a -D MPFR_LIBRARIES=$HOME/tools/split-stack/lib/libmpfr.a ../../src
Remark: if you have ninja build tool installed in your system, you can also provide -G Ninja
Then, build using
make
and, test it
yes "C" | ctest
The Lean executable will be located at build/release/shell/lean
.