3.4. Building a C++ Library

The directory cxx-library under
doc/example/basic contains a simple C++
library. Our library is called
basic-library. It implements the single C++
class called BasicLibrary using the header
file BasicLibrary.hh and the source file
BasicLibrary.cc. Here are the contents of
those files:

Building this library is quite straightforward. Abuild's build
files are generally declarative in nature: they describe what
needs to be done rather than how it is done. Building a C or C++
library is a simple matter of creating an
Abuild.mk file that describes what the names
of the library targets are and what each library's sources are,
and then tells abuild to build the targets using the C and C++
rules. Here is this library's Abuild.mk
file:

The string ccxx as the value of the
RULES variable indicates that this is C or C++
code (“c” or “cxx”). In order for
abuild to actually build this item, we also need to create an
Abuild.conf file for it. The existence of
this file is what makes this into a build item. We present the
file here:

basic/cxx-library/Abuild.conf

name: cxx-library
platform-types: native

In this file, the name key is used to
specify the name of the build item and the
platform-types key is used to help abuild
figure out on which platforms it should attempt to build this
item. Finally, we want this build item to be able to make the
resulting library and header file available to other build items.
This is done in its Abuild.interface file:

basic/cxx-library/Abuild.interface

INCLUDES = .
LIBDIRS = $(ABUILD_OUTPUT_DIR)
LIBS = basic-library

This tells abuild to add the directory containing this file to
the include path, the output directory in which the generated
targets were created to the library path, and the
basic-library library to the list of
libraries to be linked with. Notice that the name of the library
assigned to the LIBS variable is the same as
the value assigned to the TARGETS_lib variable
in the Abuild.mk file, and that the
abuild-provided variable
$(ABUILD_OUTPUT_DIR) is used as the library
directory. All relative paths specified in the
Abuild.interface file are relative to the
directory that contains the Abuild.interface
file. They are automatically converted internally by abuild to
absolute paths, which helps to keep build items
location-independent.

To build this item, you would run the command
abuild in the
basic/cxx-library directory. Abuild will
create an output directory whose name would start with
abuild- and be based on the platform or
platforms on which abuild was building this item. This is the
directory to which the variable
$(ABUILD_OUTPUT_DIR) refers in the
Abuild.interface file.

There is a lot of capability hiding beneath the surface here and
quite a bit of flexibility in the exact way in which this can be
done, but this is the basic pattern you will observe for the
majority of C and C++ library build items.