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:
basic/cxx-library/BasicLibrary.hh
#ifndef __BASICLIBRARY_HH__ #define __BASICLIBRARY_HH__ class BasicLibrary { public: BasicLibrary(int); void hello(); private: int n; }; #endif // __BASICLIBRARY_HH__
basic/cxx-library/BasicLibrary.cc
#include "BasicLibrary.hh" #include <iostream> BasicLibrary::BasicLibrary(int n) : n(n) { } void BasicLibrary::hello() { std::cout << "Hello. This is BasicLibrary(" << n << ")." << std::endl; }
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:
basic/cxx-library/Abuild.mk
TARGETS_lib := basic-library SRCS_lib_basic-library := BasicLibrary.cc RULES := ccxx
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.