=head1 NAME
makepp_builtin -- Built in rules
for
makepp
=
for
vc
$Id
: makepp_builtin.pod,v 1.9 2007/05/29 20:06:20 pfeiffer Exp $
=head1 DESCRIPTION
Makepp may be able to figure out how to compile and
link
your program even
if
you specify
no
rules at all (or
if
you don't even have a Makeppfile). After
every Makeppfile is loaded, makepp also loads a set of
default
rules. (These
rules are special in that they
do
not
override
any other rules in the
Makeppfile.) The
default
rule database is stored in the file
C<makepp_builtin_rules.mk> in the makepp distribution or library directory, so
you can always look at that to see exactly what the
default
rules are.
Makepp's builtin rules are almost the same as the rules in GNU make, except
that it
has
no
rules
for
some of the rare languages that GNU make
has
rules
for
. (This is deliberate; I often ran into trouble
with
GNU make on several
projects that accidently reused some of the suffixes that GNU make assigned to
those rare languages.) The rules
use
the same variables as GNU make,
with
some possibly useful additions. Makepp is smarter than GNU make about
inferring which compiler to
use
, and which other objects and libraries to
link
in.
=head2 Default variable
values
Makepp supplies
default
values
for
a number of variables. Most of these are
typically used in rules, and are indeed used in the
default
rules. Their
values
can be overridden by assigning to these variables in your Makeppfile or
on the command line.
These variables are documented in L<makepp_variables/Predefined Variables>.
If you have any questions about what any variable evaluates to, you can
always put a line like either of these lines in your Makeppfile:
dummy := $(
print
$(CC))
&echo
-- $(CC)
which simply prints the value of the C<$(CC)> variable
when
the Makeppfile
is loaded. (Incidently, this is a useful way to debug any expression
that you're not sure is right.)
=head2 Compilation rules
In simplified form, here is approximately what the compilation rules
look like. If you change the
values
of any of the indicated variables,
the compilation command is changed as expected.
%.o: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) -c $(input) -o $(output)
%.o: %.cxx
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $(input) -o $(output)
%.o: %.f
$(FC) $(FFLAGS) -c $(input) -o $(output)
%.c: %.y
$(YACC) $(YFLAGS) $(input)
&mv
-f y.tab.c $(output)
%.c: %.l
$(LEX) $(LFLAGS) -t $(input) -o $(output)
If you're curious about the exact details, you can look in the file
F<makepp_builtin_rules.mk> in the makepp distribution.
=head2 Link rules
Makepp also knows how to
link
programs, too. Makepp attempts to be more
clever than the standard Unix make
when
it comes to figuring out a
link
command. Suppose you are trying to build the target program C<xyz>.
Makepp will
try
to build this from C<xyz.o>, and (unlike the standard
unix make) it will also attempt to infer whether any other objects or
libraries need to be linked in.
The
link
rule looks something like this:
xyz: $(infer_objects xyz.o, *.o)
$(infer_linker $(inputs)) $(inputs) $(LDFLAGS) $(LDLIBS) $(LIBS) -o $(output)
C<infer_objects> attempts to infer what other C<.o> files need to be linked in
based on what C<.h> files are included; see L<makepp_functions/infer_objects>
for
details.
The
"inferred linker"
is a special bit of magic that turns into C<$(CC)>
if
all the sources are C code, C<$(CXX)>
if
any of the sources are C++,
or C<$(F77)>
if
any of the sources are Fortran.
=head2 Turning off the built-in rules
If you don
't like the built-in rules, don'
t
use
them. If they don't
work
for
you, your built is probably sufficiently complicated that you
need your own custom Makeppfile anyway.
X<makepp_no_builtin>To turn off the builtin rules, you can add a line like
this to your Makeppfile:
makepp_no_builtin = 1
X<makepp_no_builtin_linker>If you
do
use
them, but not the fairly expensive
builtin linker rules, you can turn those off
with
:
makepp_no_builtin_linker = 1
For backward compatibility, makepp also turns off its
default
rules
if
you include this line somewhere in your Makeppfile:
.SUFFIXES:
You can turn off builtin rules
for
every Makeppfile in the entire build by
specifying the C<--
no
-builtin-rules> option on the command line.