Fiasco's build system
Michael Hohmuth
Motivation
##########
My main goal when I designed Fiasco's build system was to allow for
multiple configurations of the kernel, based on different
implementations of the same interface, to coexist in multiple object
directories.
Configuration
#############
Fiasco's build system consists of a number of configuration files. All
configuration files are written in Makefile language.
:src/Makefile:
``Fiasco's build system'' rules
:src/Modules.in:
Standard configuration for Fiasco
:src/Makerules.*:
Make rules for each subsystem defined in Modules
:src/Makerules.local':
(Optional) User-specific configuration files
In the remainder of this section, I describe by example the language
used in Modules file and the contents of the Makerules.* files.
!SUBSYSTEMS = FOO BAR
! # Defines two subsystems, FOO and BAR. This means that there
! # exist two files, Makerules.FOO and Makerules.BAR, that
! # contain rules on how to build the targets of these
! # subsystems. These targets are defined later.
!
!### Definitions for subsystem FOO follow
!
!FOO = foo
! # Defines the main target of subsystem FOO: a file named
! # "foo".
!
!FOO_EXTRA = foo.man
! # (Optional) Defines more targets that should be built for
! # subsystem FOO.
!
!INTERFACES_FOO = foo1 foo2 foo3
! # (Optional) C++ modules for subsystem FOO (written in
! # `preprocess' format; see
! # <URL:http://os.inf.tu-dresden.de/~hohmuth/prj/preprocess/>)
! # Each module normally consists of one implementation file
! # such as foo1.cpp -- unless IMPL definitions such as the
! # following ones are given:
!
!foo2_IMPL = foo2 foo2-more
! # (Optional) C++ module foo2 is implemented in two files
! # foo2.cpp and foo2-more.cpp (instead of just foo2.cpp). The
! # public header file generated from these implementation files
! # will be called foo2.h.
!
!foo3_IMPL = foo3-debug
! # (Optional) C++ module foo3 is implemented in foo3-debug.cpp,
! # not foo3.cpp. The public header file generated from this
! # implementation file will be called foo3.h.
!
!CXXSRC_FOO = frob1.cc frob2.cc
! # (Optional) Additional C++ sources for subsystem FOO (not in
! # `preprocess' format)
!
!CSRC_FOO = frob3.c frob4.c
! # (Optional) Additional C sources for subsystem FOO
!
!ASSRC_FOO = frob5.S
! # (Optional) Additional assembly-language sources for
! # subsystem FOO
!
!OBJ_FOO = frob6.o
! # (Optional) Additional objects for subsystem FOO. These
! # objects can be precompiled or generated using custom rules
! # in Makerules.FOO.
!
!NOPROFILE += frob2
! # (Optional) Basenames of objects that should not be compiled
! # with profiling options in profiling builds.
!
!NOOPT += frob3
! # (Optional) Basenames of objects that should not be compiled
! # with optimization options.
!
!PRIVATE_INCDIR += incdir
! # (Optional) Add incdir to the include path for all source
! # files. (This feature is implemented by l4/Makeconf.)
!
!VPATH += foodir
! # (Optional) Add foodir to Make's source-file search
! # path. (This feature is implemented internally by Make.)
!
!### Definitions for subsystem BAR follow
!### (similar to FOO's definitions)
The Makerules.FOO file usually contains just rules for linking the
subsystem's targets. Additionally, it must contain a rule
"clean-FOO:" that cleans the object directory from files created by
this configuration file.
It can access the following Make variables:
:'FOO', 'FOO_EXTRA':
names of targets
:'OBJ_FOO':
expanded to contain _all_ objects that will be created for subsystem FOO
:'BAR':
targets of other subsystems