I've recently added the concept of a
build file to C2. I would like to explain some design choices here.
The C2 compiler used to use a single configuration file called the
recipe. The recipe describes:
- which targets and type (executable or library
- which source files for each target
- the configuration options
- some output options (whether to generate-c, deps, refs, etc)
- which libraries the targets depend on
So the recipe only specifies
which dependencies, not
where to find them. Because C2 is also meant
for embedded systems where cross-compilation is a basic need, it should be easy to do. To handle
this, there now is a build file that specifies:
- The target triple (eg arm-unknown-linux-gnueabi or x86_64-unknown-linux-gnu)
- A list of library search directories
- toolchain settings for the C-backend
When using a build file, C2C will only use paths from that build file. This makes it trivial
to isolate cross-builds between different targets. No need for sysroot like constructs.
The general idea is that the
recipe file is written by the develops of the project. If the project has a lot
of configuration options (which could change the files that need to be compiled), a 'make menuconfig'
like tool could generate this.
The
build file is either written by users or generated by a 3rd party build system like yocto/buildroot etc
The same recipe could be used to build for different targets by using a different build file for each.
To demonstrate this, the C2-examples archive has a working example for Ubuntu 17.04. See the README.md
for instructions.
Future workCurrently C2 uses a <triple> subdirectory in each library directory, so it can hold libraries for multiple targets.
This is handy for now, but in a real system, an (external) build system will already have populated a sysroot-like
directory with all required libs. So this directory will be removed in the future.
Another step will be to add a
Cargo-like (from Rust) tool that reads the recipe, downloads all required libraries and
generates the build file.
Cross-compilation for ansi-C is quire a hassle. Hopefully C2 can make this a lot easier.
For more documentation see
http://c2lang.org/site/build_system/intro/As always, other ideas/feedback is welcome.