Building RLC from sources
This section is about building rlc itself, not about building things with Rulebook. If the difference is not clear to you, you are not interested in this page.
Building on windows is supported but at the moment undocumented.
Downloading sources
Execute line by line the content of setup.sh. If you are on a “normal enough” linux or mac machine you can just download the file and execute it, but the stranger is your machine configuration the more likelly is to break.
setup.sh will
check that you have python3, ninja and cmake.
it will clone rlc into rlc_infrastructure.
it will create a python virtual environment to not pollute your machine with python packages.
it will install those packages.
it will initialize python submodules (google-test, and google-benchmarks, a testing and a benchmarking library used by rlc at build time only.)
At this stage you will have a folder with the following structure
rlc-infrastructure/rlc # source directory
rlc-infrastructure/.venv # python cache for packages
environment.sh
IMPORTANT every time you open a new shell that you wish to use for RLC, you must run:
source rlc-infrastructure/rlc/environment.sh
Beside making sure that you have the correct python virtual environment enabled, this command will make sure that when we build LLVM it is available to RLC, even without installing LLVM.
Building
A properly compiled RLC minimal installation depends on nothing except typical cpp libraries, but when building RLC itself we need a specific configuration of LLVM. For this reason we provide a build script that will configure the directories in a resonable configuration.
to do so, you can run
# linux
cd rlc-infrastructure
python rlc/build.py # --dry-run to see what it does without running it
# mac
cd rlc-infrastructure
python rlc/build.py --no-use-lld # --dry-run to see what it does without running it
What the script will do is:
clone LLVM
build LLVM in debug mode
install LLVM debug inside rlc-infrastructure
build LLVM in release mode
install LLVM release inside rlc-infrastructure
build rlc-debug
test rlc-debug
build rlc-release
test rlc-release
install rlc-release in rlc-infrastructure/rlc-release
at the end of this step you will have in your rlc-infrastructure-directory
rlc
.venv
llvm-debug
llvm-install-debug
llvm-release
llvm-install-release
rlc-debug
rlc-release
rlc-release/install # here is the installation you care about, probably
After this has compleated successfully, you can disregard build.py, use regular ninja commands
Successive builds
After the first build, if you change the source code of rlc you don’t need to run build.py, you can run
cd rlc-infrastructure/rlc-release # or rlc-debug
ninja all
ninja install # optional
this will build and install rlc.
Running tests
You can can run all tests as follow
cd rlc-infrastructure/rlc-release # or rlc-debug
ctest --verbose # runs all tests
ctest -R name --verbose # filter tests by name
lit --verbose tool/rlc/test # run end to end compiler tests
lit --verbose tool/rlc/test --filter NAME # run end to end compiler tests
Running the built rlc
If you have built rlc from sources there are two ways of doing it. You can first install it, and use it from the insall directory
cd rlc-infrastructure
ninja all
ninja install
./install/bin/rlc file.rl -o executable
of you can skip installing it every time and use the built one.
cd rlc-infrastructure/rlc-release # will not work in debug, there you have to write tests
ninja all
./tool/rlc/rlc file.rl -o exec -i ../rlc/stdlib --runtime-lib lib/runtime/libruntime.so # or libruntime.dylib on mac.
You must manually specify the location of the standard library and of the runtime lib because the directory structure of the build directory is different than the release structure, and so the built version has no idea where those things are.
Packaging for PIP
You can make a pip package with
cd rlc-infrastructure/
ninja all
ninja install
ninja pip_package
which you can then install with
pip install rlc-infrastructure/rlc-release/dist/PACKAGE_NAME.whl
where the package name depends on the current version of rlc.
Compiler speed
You can use
rlc --timing file.rl -o out
to see the time it takes to run each compiler pass.
Running benchmarks
We have some benchmarks for the speed of the produced code. You can run them with
cd rlc-infrastructure/rlc-release
./lib/utils/benchmark/ConnectFourBenchmark
All benchmarks live in the ./lib/utils/benchmark
directory.