Sameer Rahmani 71aac7ec33 | ||
---|---|---|
cmake | ||
core | ||
deps | ||
devtools | ||
docs | ||
libserene | ||
libserene.v0 | ||
resources | ||
scripts | ||
serene-repl | ||
serene-tblgen | ||
serenec | ||
.ci.yml | ||
.clang-format | ||
.clang-tidy | ||
.dockerignore | ||
.env.example | ||
.gitignore | ||
.gitmodules | ||
.ignore_sanitize | ||
.pre-commit-config.yaml | ||
CMakeLists.txt | ||
LICENSE | ||
README.org | ||
activate | ||
builder | ||
config | ||
dev.org |
README.org
Serene lang
Build Status:
Setup development environment
Setup the githook and install dependencies using the following commands:
./builder setup
Dependencies
You would need the following dependencies to start get started with Serene development
- LLVM (LLVM Instructions coming up.)
- cmake
- ninja
- doxygen (If you want to build the docs as well)
- Valgrind
- CCache (If you want faster builds specially with the LLVM)
- Boehm GC v8.2.0 (has to be built statically and with
-fPIC
)
LLVM Installation
Important Note: We're trying to keep Serene up to date with the LLVM release cycle till we get
to our first release. So we use the development version of the LLVM. Currently we are using
7240436c94bd02762a723a2e3551528d16c8efdb
commit as our reference.
MLIR is a part of the LLVM project and in order to build it we need to build the LLVM itself as well. Here is a quick guide to build the latest version of the LLVM and MLIR.
## YES we're using the development version of MLIR
git clone https://github.com/llvm/llvm-project.git
mkdir llvm-project/build
cd llvm-project/build
cmake -G Ninja ../llvm \
-DCMAKE_INSTALL_PREFIX=/your/target/path \
-DLLVM_PARALLEL_COMPILE_JOBS=7 \
-DLLVM_PARALLEL_LINK_JOBS=1 \
-DLLVM_BUILD_EXAMPLES=ON \
-DLLVM_TARGETS_TO_BUILD="X86" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_EXTERNAL_PROJECTS=iwyu \ # Only if you want to enable the 'Include what you use' tool
-DLLVM_EXTERNAL_IWYU_SOURCE_DIR=/path/to/iwyu \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_CCACHE_BUILD=ON \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DLLVM_ENABLE_PROJECTS='clang;lldb;lld;mlir;clang-tools-extra;compiler-rt;libcxx;libcxxabi;libunwind' \
-DCMAKE_C_COMPILER=clang \ # If you have clang installed already
-DCMAKE_CXX_COMPILER=clang++ \ # If you have clang installed already
-DLLVM_ENABLE_LLD=ON
cmake --build .
cmake --build . --target check-mlir
cmake -DCMAKE_INSTALL_PREFIX=/your/target/location -P cmake_install.cmake
You need to have clang
and lld
installed to compile the LLVM with the above command. Also if you
are not using ccache
just remove the option related to it from the above command.
Emacs
If you're using Emacs as your development environment just install clangd
and lsp
.
Heads up for devs
While you're working on Serene be mindful of:
-
In
DEBUG
mode we dynamically link againstlibsan
due to the fact that we build thelibserene
as a shared lib by default. This means we need toLD_PRELOAD
thelibclang_rt
before we run any executable. If you're using thebuilder
script you're all set otherwise you can run an executable like:LD_PRELOAD=$(clang -print-file-name=libclang_rt.asan-x86_64.so) /path/to/executable
Build the devtools
We have our own version of `mlir-opt` which is `slir-opt` and also we have an LSP server for SLIR too.
Both are in the devtools
directory and in order to build them all you need to do is to use
-DSERENE_ENABLE_DEVTOOLS=ON
parameter with cmake for example ./builder build -DSERENE_ENABLE_DEVTOOLS=ON
will do the job for you.
How to build
In order to build for development (Debug mode) just use ./builder build
to setup the build and build
the project once and then you can just use ./builder compile
to build the changed files only.
Check out the builder
script for more subcommands and details.
How to Debug
Since we're using the Boehm GC, in order to use a debugger we need to turn off some of the signal
handlers that the debugger sets. In order to run the debugger (by default lldb) with serenec
just use the lldb-run
subcommand of the builder script. In the debugger, after setting the
break point on the main
function (b main
) then use the following commands on:
process handle -p yes -s no -n no SIGPWR
process handle -p yes -s no -n no SIGXCPU
process handle -p yes -s no -n no SIGSEGV
Cheatsheets
License
Copyright (c) 2019-2022 Sameer Rahmani <lxsameer@gnu.org>
Serene is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
Get Help
If you need help or you just want to hangout, you can find us at:
- IRC: #serene-lang on the libera chat server
- MailingList: https://www.freelists.org/list/serene