The directory basic/cxx-program
contains a
simple C++ program. This program links against the library
created in our previous example. Here is the main body of our
program:
basic/cxx-program/program.cc
#include <BasicLibrary.hh> int main() { BasicLibrary b(5); b.hello(); return 0; }
This program includes the BasicLibrary.hh
header file from the cxx-library
build
item. Here is the Abuild.mk
for this build
item:
basic/cxx-program/Abuild.mk
TARGETS_bin := cxx-program SRCS_bin_cxx-program := program.cc RULES := ccxx
Notice that this is very similar to the
Abuild.mk
from the library build item. The
only real difference is that the TARGETS
and
SRCS
variables contain the word
bin
instead of lib
. This
tells abuild that these are executable targets rather than
library targets. Notice the conspicuous lack of any references to
the library build item or the location of the headers or libraries
that it makes available. A principal feature of abuild is that
this program build item does not need to know that information.
Instead, it merely declares a dependency on the
cxx-library
build item by name. This is
done in its Abuild.conf
:
basic/cxx-program/Abuild.conf
name: cxx-program platform-types: native deps: cxx-library
Notice the addition of the deps key in this
file. This tells abuild that our program build item
depends on the library build item. When
abuild sees this, it automatically makes all the information in
cxx-library
's
Abuild.interface
available to
cxx-program
's build, alleviating the need
for the cxx-program
build item to know the
locations of these files. This will also tell abuild that
cxx-library
must be built before we can
build cxx-program
.
To build this item, we just run the abuild
command as we did for cxx-library
. This
will automatically build dependency
cxx-library
before building
cxx-program
. In this way, you can can
start a build from any build item and let abuild automatically
take care of building all of its dependencies in the correct
order.
The output of running abuild in the
cxx-program
directory when starting from a
clean build is shown below. Your actual output will differ
slightly from this. In particular, the output below has the
string --topdir--
in place of the path to
doc/example
, and the string
<native>
in place of your native
platform.
[8]
Notice that abuild builds
cxx-library
first and then
cxx-program
:
basic-cxx-program.out
abuild: build starting abuild: cxx-library (abuild-<native>): all make: Entering directory `--topdir--/basic/cxx-library/abuild-<native>' Compiling ../BasicLibrary.cc as C++ Creating basic-library library make: Leaving directory `--topdir--/basic/cxx-library/abuild-<native>' abuild: cxx-program (abuild-<native>): all make: Entering directory `--topdir--/basic/cxx-program/abuild-<native>' Compiling ../program.cc as C++ Creating cxx-program executable make: Leaving directory `--topdir--/basic/cxx-program/abuild-<native>' abuild: build complete
To remove all of the files that abuild created in any build item's directory, you can run abuild clean in that directory. To clean everything in the build tree, run abuild --clean=all. More details of how to specify what to build and what to clean can be found in Chapter 9, Telling Abuild What to Build.
[8] All example output in this document is normalized this way since it all comes directly from abuild's test suite. Testing all the examples in the test suite guarantees the accuracy of the examples and ensures that they work as advertised on all platforms for which abuild is released. Should you wish to study abuild's test suite with the examples, be aware that the bold italicized text preceding each block of example output is the name of the expected output file from the test suite.