bob is a buildsystem roughly comparable with autotools+gmake or CMake+gmake. This means you write a list of the executables and libraries etc. you want to have built, and what source files to build them from, and bob takes care of the nitty, gritty details like finding your compiler and knowing how to invoke it. It also can perform configure checks to help you to adapt your code to the underlying system, i.e. makeing it portable.
Other than autotools or CMake, bob combines the various configure and build phases (including make) into one single tool. This allows for better support for generated code. Building a code generator, then running it to find out what (generated) sources to incorporate into the actual program, then building that, is no problem for bob, even when crosscompiling.
Also bob avoids the use of a specialized description language, slowly and painfully evolved into Turing-completeness, harnessing the power of kludgy workarounds, and has you use Python instead, a real & mature programming language, and even one of the better ones.
Actually bob is simply a Python package. This means that instead of a traditional Makefile to be processed by some tool you write a Python3 script using bob commands. The script describes what to build and from what sources. Invoking it uses bob to build.
The conventional filename for the build script is make.py. A minimal example looks like:
#!/usr/bin/env python3 ############################################### from bob import * ############################################### def project_hello(public): Executable('hello', 'src/hello-main.c') ############################################### if __name__=='__main__': build(project_hello) ###############################################
In the end your source tree should look something like this:
your source root +--bob +--make.py +--more stuff
For details see the bob-manual.