YAMBS
(Yet Another Meta Build System) is a command-line based meta build system for C++, written in Rust.
YAMBS
is intended to be a quick and easy build system for developers to easily maintain and manage their C++ project.
The idea is that development of a C++ project with YAMBS
shall have focus on the C++ language, without the need of knowing a separate
scripting language for maintaining your project.
YAMBS
is a simple system. From a manifest file that contains all files that is required to build your project, YAMBS
generates
build files for your project and then builds your project from that. That's it.
By writing the minimal amount of boilerplate code, a user gets a well equipped build environment with easily modifiable runtime configurations.
YAMBS
focuses on keeping it simple. That comes with a cost of configurability. YAMBS
is not intended to be heavily configurated. It is meant to create
build files for your projects in a simple and fast way, with minimal hassle.
- Linux (Tested on Manjaro (Kernel version 5.10.136-1-MANJARO))
YAMBS
is an ongoing project. It has bugs and needs better test coverage.
This project begun for fun and as a way for me to get familiarized in Rust and understand how meta build systems work.
There might of course not be the best solutions for all things here.
YAMBS
is not intended to replace any of the popular systems that exist today.
If however it proves to be something that people would like to use, more features can be added. Contributions are welcome!
Any contribution to the project is welcome. Please create a PR with proper intent and description of what you are adding or modifying.
- Support other platforms (Linux, MacOS, Windows)
- Different generators (Make and possibly different flavors, Ninja, MSVC)
- Better support for toolchain specifications
- Support other package managers (conan, vcpkg, pkgbuild, ...)
Currently you can only get YAMBS
from a source build. Once the project is at a stable state,
binary distributions can be made.
YAMBS
can be built using cargo
:
git clone https://github.com/fredriksd/yambs.git
cd yambs
cargo build
Tests are also built and run through cargo
:
cargo test
YAMBS
requires a manifest file located in the root of the project. The manifest is a TOML file named yambs.toml
.
The simplest example of using YAMBS
with a single C++ file, main.cpp
, that yields the executable x
, requires the following content
[executable.x]
sources = ["main.cpp"]
Before building, YAMBS
requires that the following environment variables are set:
- CXX (supports clang++ and g++)
Finally, to build the project you invoke the meta build system like this:
yambs build -b build
YAMBS
will generate the necessary build files for the project in debug configuration and then build the project.
The program produces the following directory tree:
build
├── cache
│ ├── compiler
│ ├── manifest
│ └── targets
├── debug
│ ├── main.d
│ ├── main.o
│ ├── Makefile
│ ├── progress.json
│ └── x
├── make_include
│ ├── debug.mk
│ ├── default_make.mk
│ ├── defines.mk
│ ├── release.mk
│ └── warnings.mk
├── sample
│ ├── a.out
│ └── main.cpp
└── yambs_log.txt
Additional examples can be found in examples
The manifest is a TOML file that must contain targets. The targets can be executables or libraries. A target is defined as a map entry in TOML land.
The manifest follows TOML v0.5.0.
An executable is formed with the syntax:
[executable.<name>]
Similarily, a library is formed with:
[library.<name>]
A target accepts the following fields:
sources
: An array of strings of file paths.cxxflags_append
: An array of strings that passes additional CXX flags for that target.cppflags_append
: An array of strings that passes additional CPP flags for that target.dependencies
: A table specifying the projects this target depends on.- Dependencies can be of two types
- From source: Specify a dependency as a
YAMBS
project. Currently this is supported as a project on your filesystem. - From binary: Specify a binary to be used as a dependency.
- From source: Specify a dependency as a
- Dependencies can be of two types
A library has an additional field:
type
: String specifying this library as a static or shared library.- Allowed values: "shared", "static".
- Default: "static"