=head1 NAME

makepp_functions -- Functions in makepp

=for vc $Id: makepp_functions.pod,v 1.37 2008/09/01 07:49:18 pfeiffer Exp $

=head1 DESCRIPTION

L<B<a>bsolute_filename|/absolute_filename>, L</addprefix>, L</addsuffix>,E<nbsp>
L<B<b>asename|/basename>,E<nbsp>
L<B<c>all|/call>,E<nbsp>
L<B<d>ir|/dir>, L</dir_noslash>,E<nbsp>
L<B<f>ilesubst|/filesubst>, L</filter>, L</filter_out>, L</filter_out_dirs>, L</findfile>, L</findstring>,
 L</find_program>, L</find_upwards>, L</find_first_upwards>,
  L</first_available>, L</firstword>,E<nbsp>
L<B<i>f|/if>, L</iftrue>, L</infer_linker>, L</infer_objects>,E<nbsp>
L<B<j>oin|/join>,E<nbsp>
L<B<m>ake|/prebuild>, L<makemap|/map>, L<makeperl|/perl>, L</map>, L</mktemp>,E<nbsp>
L<B<n>otdir|/notdir>,E<nbsp>
L<B<o>nly_generated|/only_generated>, L</only_nontargets>, L</only_phony_targets>,
  L</only_stale>, L</only_targets>, L</origin>,E<nbsp>
L<B<p>atsubst|/patsubst>, L</perl>, L</phony>, L</prebuild>, L</print>,E<nbsp>
L<B<r>elative_filename|/relative_filename>, L</relative_to>,E<nbsp>
L<B<s>hell|/shell>, L</sort>, L</sorted_dependencies>,
  L</sorted_inputs>, L</stem>, L</strip>, L</subst>, L</suffix>,E<nbsp>
L<B<t>emporary|/temporary>,E<nbsp>
L<B<w>ildcard|/wildcard>, L</word>, L</wordlist>, L</words>,E<nbsp>
L<B<x>args|/xargs>

Any expression of the format S<C<$(name arg1 arg2 arg3)>> or C<$(name)> where
C<name> is not the name of a variable, is interpreted as a function call.  The
name may contain letters, underscores, or hyphens; to avoid confusion, you may
use hyphens or underscores interchangeably, since internally hyphens are
converted to underscores.  Evaluating such an expression simply invokes a perl
subroutine.  If C<name> is preceded by C<&> it runs the L<builtin
command|makepp_builtins> or script of that name within the makepp process, and
returns the standard output.

As for variables you have a choice of C<$(name ...)> or C<${name ...}>.  Where
the arguments contain these signs, either use the other, or double it as in
C<$((name ...() ))>.  Doubling is also useful if you need the arguments to
span several lines.  The newlines are then treated as spaces, except maybe in
C<define>.  There is also the syntax C<$[name ...]> or C<$[[name ...]]>, which
gets evalutated while reading the makefile, before parsing.

Makepp has a number of builtin functions which may be useful.  It supports
almost all of GNU make's textual functions (see GNU make's documentation for
details), and some of its own.  You can define perl subroutines to do whatever
you like.  See the C<sub> statement and the section on L<extending
makepp|makepp_extending> for more details.

=head2 File and Filename Functions

=over 4

=item absolute_filename files X<absolute_filename>

Converts relative filenames into absolutes.  For example,
S<C<$(absolute_filename xyz.c)>> might return
C</usr/src/our_project/subdir/xyz.c>.

=item basename filenames X<basename>

The basename is the entire file name (with the directory), minus the text
after the last period.  E.g., S<C<$(basename myfile/version-1.0-module.c)>> is
C<myfile/version-1.0-module>

=item dir filenames X<dir>

Extracts the directory part of each file in the filename list, including the
trailing slash.  Returns C<./> if there is no directory in the filename.

=item dir_noslash filename X<dir_noslash>

Same as S<C<$(dir )>> except that it doesn't return the trailing slash.

=item filter_out_dirs filenames X<filter_out_dirs>

Returns all filenames that do not refer to directories.

=item findfile filename, path X<findfile>

Finds a file in the specified path, or in the environment variable PATH
if nothing is specified.  This can be useful for finding binaries or
include files.  For example,

    TCL_INCLUDE := -I$(dir_noslash $(findfile tcl.h, \
 	/usr/local/stow/tcl-8.4.5-nothread/include \
 	/usr/include/tcl8.4 /usr/include/tcl \
 	/net/na1/tcl8.4a3/include /net/na1/tcl8.4a3/include))

This locates the file F<tcl.h> by searching all of the above
directories.  The absolute path to the file is returned.  Then
S<C<$(dir_noslash )>> extracts that directory, and it is put into the
include path.

=item find_program name X<find_program>

Return the first program in the list that can be found in the PATH.
This is useful when there are multiple equivalent programs that may be
used, and you just want to pick one of them.  For example, here is the
default definition of several common variables that makepp supplies if
you do not put one in your makefile:

    CC = $(find_program gcc egcc pgcc c89 cc) # and more, depending on machine
    F77 = $(find_program f77 g77 fort77)
    CXX = $(find_program g++ c++ pg++ cxx CC aCC)

If none of the programs is found, S<C<$(find_program )>> returns the string
not-found, and logs what ws not found.  This usually won't result in a
functional makefile, but it will tend to make for better error messages.  For
example, if you do something like this:

    %.o : %.c
 	$(CC) $(inputs) -o $(outputs)

and makepp can't find a C compiler in the list above, it will substitute
not-found.  Otherwise the shell would attempt to execute the source file and
the resulting error message might be really strange.

=item find_upwards filename X<find_upwards>

Searches for a file of the given name in the directory ., .., ../..,
../../.., etc., until the file is found or the root directory is reached
or the directory is located on a different file system.  (This last
requirement is to prevent problems with automounters or hung network
filesystems.)

For example, if you have a project with many levels of subdirectories, you
could include this common fragment in all of the makefiles (e.g., by using the
C<include> statement):

    TOP_LEVEL_INCLUDE_DIR := $(find_upwards includes)
 				# Searches for a directory that contains the
 				# includes subdirectory.
 
    %.o : %.c
 	$(CC) $(CFLAGS) -I$(TOP_LEVEL_INCLUDE_DIR) -c $(input) -o $(output)

Another problem that C<find_upwards> can help solve is locating the
top-level directory of a build.  Often it is useful to define a variable
like this:

    TOP := ../../..

if you have some important information located only in the top-level
directory.  But this is hard to maintain, because the number of C<..> is
different for different levels of the directory tree.  Instead, you can
use C<find_upwards> to locate a file which is known to be present only
in the top level directory.  Suppose, for example, that the file
C<LICENSE> is located only in the top level directory.  Then
you could do this:

    TOP := $(dir_noslash $(find_upwards LICENSE))

S<C<$(find_upwards LICENSE)>> returns the full path of the license file;
S<C<$(dir_noslash ...)>> strips off the filename, returning only the directory.

(Note that the C<include> statement automatically searches upwards for files,
so there is no need to do something like this:

    include $(find_upwards top_level_rules.mk)

Instead, you can just do

    include top_level_rules.mk

and it will work just as well.)

If the file is not found, C<find_upwards> will abort the build with an
error message.

If you specify more than one file, find_upwards will search for the
first one, then the second one, and so on.  In other words,

    $(find_upwards file1 file2)

is equivalent to

    $(find_upwards file1) $(find_upwards file2)

If you want to look for any one of the files, then use
C<find_first_upwards> instead.

=item find_first_upwards file1 file2 ... X<find_first_upwards>

This function behaves like C<find_upwards> except that it returns the
first file of any files in the list that it finds.  Specifically,
it checks the current directory for any of the files in the list, and
returns the first file which exists or can be built.  If none of the
files exist or can be built in that directory, it checks F<..>, then
F<../..>, etc., until it reaches either the root directory or a
directory which is located on a different file system.

=item first_available file1 file2 .. X<first_available>

Return the first file in a list that exists or can be built.  This can
be useful for adapting your makefiles to work on several different
machines or networks, where important files may be located in different
places.  For example, here's a line from one of my makefiles:

    TCL_LIB = $(first_available \
 	/usr/local/stow/tcl-8.4.5-nothread/lib/libtcl8.4.so \
 	/usr/lib/libtcl8.4.so /usr/lib/libtcl.so \
 	/net/na1/tcl8.4a3/lib/libtcl8.4.a \
 	/net/na1/tcl8.4a3/lib/libtcl8.4.sl)

This line will check for the Tcl library in all of the above places,
stopping at the first one that it finds.  The link command then includes
$(TCL_LIB) so we get the appropriate Tcl library.

=item infer_objects

    $(infer_objects object1.o object2.o, *.o)

If you use standard conventions regarding header file names, makepp is capable
of guessing which C<.o> or C<.lo> files need to be linked with your program.
I use this to pick out files from a library directory which contains modules
used in many different programs.  Instead of making a library C<.a> file and
having the linker pick out the relevant modules, makepp can pick out the
relevant modules for you.  This way, only the relevant modules get compiled.

Makepp's algorithm for inferring object dependencies depends on the convention
that the implementation of all classes or functions defined in a header file
C<xyz.h> are compiled into an object file called C<xyz.o> (or C<xyz.lo>).  So
makepp's algorithm for inferring object dependencies starts with one or a few
objects that we know have to be linked into the program.  It looks at which
files were included with C<#include> in those sources, and tries to find
corresponding object files for each of the include files.

S<C<$(infer_objects )>> needs to be mentioned in the dependency list of a
program, like this:

    myprog: $(infer_objects main.o another_object.o, \
 		**/*.o /other/library/dirs/**/*.o)
 	$(CXX) $(inputs) -o $(output) $(LIBS)

The C<infer_objects> function takes two arguments (separated by a comma, as
shown).  The first is one or a few object files that are known to be required
(wildcards are permissible here).  The second is a list of possible objects
(normally you would use a wildcard here) that could be linked in if necessary.
The return value from this function is a list that contains first all of the
objects in the first argument, and then after those, all additional objects
that were contained in the second argument that are required by the objects in
the first argument.

For example, suppose C<main.o> comes from C<main.cpp>, which includes
C<my_class.h>.  C<infer_objects> looks for files with the name C<my_class.o>.
If exactly one such file is found, it is added to the list.  (If two object
files C<my_class.o> are found in different directories, a warning message is
printed.)  C<infer_objects> also examines C<my_class.cpp> to see what it
includes, and what additional object files are implied.

=item mktemp

=item mktemp prefix

=item mktemp prefixXXX

=item mktemp /

Returns an unpredictable temporary filename, which does not currently exist.
No name pointing to the same file is returned twice, even with different
relative paths, within one makepp run (except possibly with traditional
recursive make, or if perl code running within a rule action calls
C<f_mktemp>).  At the end of the makepp run all files returned by this
function are deleted, if they exist (again except for those returned by this
function in perl code running within a rule).

Any number of upper case C<X>s at the end of the argument are replaced by that
many random letters and digits.  The more there are, the less likely this is
to collide with other processes, so if you give a prefix like "F</tmp/abc.>",
you should have enough C<X>s.  If there is more than one X, the first
character comes from the process id.  If there are none, it is as though there
were ten, which is supposedly enough (8.4e17 possibilities or 3.7e15 on
Windows).  If there is no argument, the prefix defaults to "F<tmp.>" in the
current directory.

Note that you don't want to give such a name as rule targets and dependencies.
The result would be correct, but it would be recreated every time you run
makepp.

=begin comment
  The C<temporary> function may do what you want in this case:

    TMPFILE ;= $(temporary $(mktemp))	# 1 call; "=" would mean 3 calls: 3 files
    A-count: $(TMPFILE)
 	&grep -c /A/ $(input) -o $(output)
 
    B-count: $(TMPFILE)
 	&grep -c /B/ $(input) -o $(output)
 
    $(TMPFILE):
 	produce-As-and-Bs >$(output)

=end comment

Also, as it is always different, you should use this in a rule action only if
you use C<:build_check ignore_action>:

    TMPFILE ;= $(mktemp)	# 1 call; "=" would mean 3 calls: 3 files
    A-count B-count: :build_check ignore_action
 	produce-As-and-Bs >$(TMPFILE)
 	&grep -c /A/ $(TMPFILE) -o A-count
 	&grep -c /B/ $(TMPFILE) -o B-count

Or you should export it and let the Shell evaluate it:

    export TMPFILE ;= $(mktemp)
    A-count B-count:
 	produce-As-and-Bs >$$TMPFILE # makepp doesn't see the var value
 	fgrep -c A $$TMPFILE >A-count
 	fgrep -c B $$TMPFILE >B-count

The last form repeats the previous return value, so you can use it in a
pattern rule:

    %.x: %.y
 	&grep foo $(input) -o $(mktemp)
 	&sed bar $(mktemp /) -o $(output) # Operate on the output of &grep

=item notdir filenames X<notdir>

Returns the non-directory portion of the filename(s), i.e., everything after
the last slash if there is one, or the whole filename otherwise.

=item only_generated filenames X<only_generated>

Returns only those filenames in the list that were generated by makepp
and not since modified, according to the build info file.

This function is useful in clean target rules (though of course C<makeppclean>
is the preferred variant):

    $(phony clean):
 	&rm -f $(only_generated **/*)

=item only_nontargets filenames X<only_nontargets>

Returns only those filenames in the list that are not targets of any
rule (either explicit or pattern rules).  You may specify a wildcard
(see the S<C<$(wildcard )>> function for more details on makepp's
wildcards).  This can be used for generating a distribution target, for
example:

    .PHONY: distribution
 
    distribution:
 	&mkdir our_product-$(VERSION)
 	&cp $(filter-out %~, $(only_nontargets *)) our_product-$(VERSION)
 	tar cf - our_product-$(VERSION) | gzip -9c > our_product-$(VERSION).tar.gz


In this case, the C<$(only_nontargets *)> returns every file in the current
directory that is not a target of some rule.  The C<$(filter_out %~, ...)>
removes editor backups.

Similar to C<only_targets> (see above), C<only_nontargets> only knows about
targets that have been defined already.  This is only a problem if you use it
to define variables with the C<:=> assignment; if you use it in the
dependency list or in the body of a rule, all other rules will already
have been seen.

=item only_stale filenames X<only_stale>

Returns only those filenames in the list that were generated by makepp
and not since modified, according to the build info file, but are no longer
targets of any rule.

This function is useful for ensuring that there are no dependencies on such
files, without forcing a clean build of all of the targets:

    $(phony flush):
 	&rm -f $(only_stale **/*)

Actually, it's probably better instead to write a script that calls makepp
to generate the list of stale files, and then have that script remove all of
the listed files that aren't currently under source control, just in case a
generated file becomes a source file. Makepp doesn't have such a function
built in because makepp is (and probably ought to remain) agnostic about
source control.

=item only_targets filenames X<only_targets>

Returns only those filenames in the list that are actually targets of
some rule (either explicit or pattern rules).  You may specify wildcards
(including makepp's special wildcard, C<**>) in the filenames.  (See the
S<C<$(wildcard )>> function for more details.  This can be used for a
clean target, for example:

    .PHONY: clean
 
    clean:
 	&rm -f $(only_targets *)

Now if you type S<C<makepp clean>>, it will delete everything it knows how to
build.  But don't create a clean target, use C<makeppclean> instead!

Another place where it may be useful is to avoid including stale F<.o> files
in your build.  For example, if you build a library like this:

    mylib.a: *.o
 	&rm -f $(output)
 	$(AR) cr $(output) $(inputs)

and then you delete some source files but forget to delete the corresponding
F<.o> files, the F<.o> files will still be around.  This means they will still
be incorporated into the library despite the fact that they are not useful any
more.  If you modify your rule like this:

    mylib.a: $(only_targets *.o)
 	&rm -f $(output)
 	$(AR) cr $(output) $(inputs)

then this problem won't occur.

Note that this refers only to files that are known to be targets I<at
the time you invoke> C<only-targets>.  If C<only_targets> appears in the
dependencies or actions of a rule, then all possible targets will be
known because dependencies and actions are not evaluated until the rule
is executed.  However, if you evaluate try to evaluate it earlier in the
makefile with a C<:=> variable like this:

    ALL_TARGETS := $(only_targets *)
 
    target1: dependency1
 	actions
 
    target2: dependency2
 	actions

then C<only_targets> will not know about the subsequent rules.

Similarly, C<only_targets> doesn't know about targets produced in
makefiles that are loaded with recursive make.  (But you shouldn't be
using recursive make anyway; use use the C<load_makefile> statement, or
L<implicit makefile loading|makepp_build_algorithm/Implicit loading>
instead.)

=item relative_filename file1 file2 file3 X<relative_filename>

Returns the name of those files relative to the current directory (the one the
makefile is in).  This can also be used to clean unnecessary C<./> and other
junk from the path:

    DIR := .
    SUBDIR := ..
    FNAME := $(DIR)/../otherdir/$(SUBDIR)/files
    X := $(relative_filename $(FNAME))

Each result is guaranteed to contain a slash, so that you can use it as an
executable name without worrying about the command search path overriding
the directory location.

=item relative_to file1 file2 file3, directory X<relative_to>

Returns the name of those files relative to the specified directory.  This is
typically useful when for whatever reason you have to execute a command from a
different directory:

    source_backup.tar:
 	cd .. && tar cf $(relative_to $(output), ..) $(relative_to ., ..)

=item temporary words X<temporary>

Let makepp know that the specified targets may be removed by the rule
that generates them.
Similar to C<phony>, except that makepp expects that a real file of that
name will may be affected by the rule.
A rule is not executed if only its temporary targets are out-of-date.

=item wildcard pattern X<wildcard>

Returns the sorted names of all files matching the given pattern which exist,
or those files which do not yet exist but can be built based on the rules that
makepp knows about at the point when it evaluates the expression.  Ignores
files and directories that are not readable.

Makepp supports all the usual shell wildcards (C<*>, C<?>, and C<[]>).  It
also has a wildcard C<**> which matches any number of intervening directories.
(This idea was stolen from zsh.)  For example, C<**/*.c> matches all the F<.c>
files in the entire source tree.  C<objects/**/*.o> matches all the F<.o>
files contained anywhere in the subdirectory F<objects> or any of its
subdirectories or any of their subdirectories.  The C<**> wildcard will not
follow soft links to directories, nor will it attempt to enter directories
which exist but cannot be read.  Also files which exist but cannot be read
will not be returned by S<C<$(wildcard )>>.

=back

=head2 String Functions

=over 4

=item addprefix prefix, words X<addprefix>

Prepends the prefix string to each of the words.  This is mostly for GNU make
compatibility; using rc-style expansion, this can be done in a more readable
fashion like this:

    MODULES := a b c d
    X_OLD_STYLE := $(addprefix $(OBJDIR)/, $(addsuffix .o, $(MODULES)))
    X_NEW_STYLE := $(OBJDIR)/$(MODULES).o   # Isn't that easier to read?

=item addsuffix suffix, words X<addsuffix>

Appends the suffix string to each of the words.  This is mostly for GNU make
compatibility; using rc-style expansion, this can be done in a more readable
fashion like this:

    X_OLD_STYLE := $(addsuffix .o, $(MODULES))
    X_NEW_STYLE := $(MODULES).o

=item call variable[, words]... X<call>

The function C<call> is unique in that it can be used to regard I<variable> as
a parameterized function.  You can assign a complex expression to I<variable>
and use C<call> to expand its contents to different values parametrized by
I<words> later on.  In other make systems, a variable that is used mainly for
the purpose to be expanded via C<call>, is called a B<macro>.

During expansion of the macro, the temporary variables B<C<$1>>, B<C<$2>>,
B<C<...>> refer to the arguments given to C<call> during its invocation.  The
variable B<C<$0>> will be expanded to the name of the macro (i.e. I<variable>)
that C<call> is currently expanding.

There is no limit, how many arguments a macro may be C<call>ed with or how many
parameters a macro may expect.  If you pass more arguments to C<call> as the
macro need, all exceeding arguments will be discarded.  If you pass less
arguments than a macro expect, all exceeding parameters collapse into the empty
string.

First a simple example:

    rest = $(wordlist 2, $(words $(1)),$(1))
    list = A B C D E
    butfirst := $(call rest,$(list))

Here, the variable C<$(butfirst)> will contain the list S<C<B C D E>>.

And now for a more complex example to show what is possible:

    rest = $(wordlist 2,$(words $(1)),${1})
    mymap = $(if $2,$(call $1,$(firstword $2)) $(call $0,$1,$(call rest,$2)))
    downcase = ${makeperl lc("$1")}
 
    UCWORDS = ALL THESE WORDS ARE UPCASE
    DCWORDS := $(call mymap,downcase,$(UCWORDS))

Now C<$(DCWORDS)> contains S<C<all these words are upcase>>.  By the way: it
makes no difference, whether we access the arguments via B<C<$1>>, B<C<${1}>>
or B<C<$(1)>> within a macro.

=item filter patterns, words X<filter>

Returns all words in the list that match the patterns.  Patterns may simply be
other words, or filename wildcards (i.e., C<*>, C<?>, and C<[a-z]> are
recognized), or they may have a C<%> character, which means to match any
string at that point (same as C<*>).

=item filter_out patterns, words X<filter_out>

Returns all words in the list that do not match the patterns.  Patterns may
simply be other words, or filename wildcards (i.e., C<*>, C<?>, and C<[a-z]>
are recognized), or they may have a C<%> character, which means to match any
string at that point (same as C<*>).

For example:

    libproduction.a: $(filter_out test_*, $(wildcard *.o))

will put all F<.o> files which exist or can be built, except those beginning
with F<test_>, into F<libproduction.a>.

=item findstring find, in X<findstring>

Return I<find>, if it is a substring of I<in>.

=item firstword words X<firstword>

Return the first word.

=item if string, result-if-string-not-blank, result-if-string-blank X<if>

=item iftrue string, result-if-string-true, result-if-string-false X<iftrue>

An alternative to the C<ifeq>, etc., statements.  If the string is not blank
(i.e., the condition is true), the second argument (the "then" clause) is
returned (after variable expansion); if the string is blank, the third
argument (the "else" clause) is returned.

For example,

    CFLAGS := $(if $(filter gcc egcc, $(CC)), -g -Wall, -g)

defines CFLAGS to be C<-g -Wall> if the variable CC is either C<gcc> or
C<egcc>, and C<-g> otherwise.  (This is what the default build rules do.)

C<iftrue> is similar to C<if>, except that the string C<0> is treated as
blank.

=item map words, perlcode

=item makemap words, perlcode

Similarly to perl's map, applies I<perlcode> to each word in turn and returns
the results.  The first variant is plain Perl code, while the second variant
first passes the perlcode through Make-style variable expansion.  The words
are expanded in both cases.

The words are in C<$_> and are returned unless you undef C<$_>.  This is
intended for modifications not easily handled by C<patsubst>.  Only the first
comma is a separator, any others are considered part of the I<perlcode>.

    # Switch words.  Double parens, to allow parens in perlcode, or use ${}:
    X = $((map $(VALUES), s/(.+)-(.+)/$2-$1/))
    # You can use make expressions, but then you must use $$ for perl $:
    Y = $(makemap $(VALUES), tr/$(OLDCHARS)/$(NEWCHARS)/ or $$_ = 'failed')
    # You can eliminate candidates:
    Y = $(map $(VALUES), undef $_ if /no_good/)

=item join words1, words2 X<join>

Do a pairwise join of the first words and the second words.

=item patsubst pattern, substitute, words X<patsubst>

Performs a substitution on each word in the word list.  A
C<%> character matches any string.  This is best
illustrated by an example:

    OBJS = $(patsubst %.c, object_dir/%.o, $(C_SOURCES))

takes every file in C_SOURCES and returns the name of an object
file in object_dir.  Sometimes it is more concise to use a
L<substitution reference|makepp_variables/Substitution References>, e.g.,
the above could have been written as

    OBJS = $(C_SOURCES:%.c=object_dir/%.o)

=item sort word1 word2 word3 ... X<sort>

Sorts the words in lexical order and removes duplicates.

=back

=head2 Miscellaneous Functions

=over 4

=item prebuild targets X<prebuild>

=item make targets

Returns its argument verbatim, but first builds all the files listed.
This is useful when a given file is needed when evaluating a make
expression.  This typically happens when you have a build where the set
of files involved is computed by some shell commands.  For example,

    file_list :
 	# shell commands to compute a list of files to put into the program
 
    my_program : $(&cat $(prebuild file_list))

If you need the list in more than one rule, it would be more efficient to use
an expand at most once variable:

    file_list ;= $(&cat $(prebuild file_list))
 
    my_program1 : a.o $(file_list)
 
    my_program2 : b.o $(file_list)

If instead you specified just S<C<$(&cat file_list)>>, then makepp would not
force file_list to be up-to-date before it executes the shell command.  Using
S<C<$(prebuild )>> is the best way to solve this problem.  You might be
tempted to try other things, like this:

    my_program : file_list $(&cat file_list)

but this won't work because S<C<$(&cat file_list)>> is evaluated
before makepp attempts to build C<file_list>.

=item only_phony_targets names X<only_phony_targets>

Returns only those names in the list that are phony targets of
some rule (either explicit or pattern rules).  You may specify wildcards
(including makepp's special wildcard, C<**>) in the filenames.  (See the
S<C<$(wildcard )>> function for more details.  This can be used for grouping
targets, for example:

    $(phony tests): $(only_phony_targets */**/tests)

=item perl perlcode

=item makeperl perlcode

Evaluates perlcode in a block and returns the result.  The first
variant is plain Perl code, while the second variant first passes the
perlcode through Make-style variable expansion.

Note, that, as with all functions, the function delimiter used may not appear
within the perlcode outside of single or double quoted strings.  But you can
double it as in the last example:

    VAR = 1
    VAR1 = ${perl ($VAR + 1) * 3}
    VAR2 = $(perl do { $VAR *= 3; return $VAR + 1 } if $VAR)
    VAR3 = $(makeperl $(VAR1) * 3 + $$VAR) # one Make var and one Perl var
    VAR = $((perl if( ... ) { ... }))

=item phony words X<phony>

Indicates that the list of words are actually phony targets, and
returns the list of targets.  It's intended to be used like
this:

    $(phony all): my_program
 
    $(phony clean):
 	&rm -f *.o my_program

You can also declare one or more targets as phony with a line like
this anywhere in your makefile:

    .PHONY: all clean

=item print text X<print>

Outputs the text and returns it.  This is mostly useful for
debugging, when you don't understand why variable substitution
has the result that it does.  For example,

    XYZ := $(print $(patsubst %.c, %o, $(SOURCE_FILES)))

will print out the result of the C<patsubst> call.

    XYZ := $(patsubst %.c, %o, $(print $(SOURCE_FILES)))

will print out the last argument to the C<patsubst>
call.

=item shell shell-command X<shell>

Returns the output from the given shell command, with newlines
replaced by spaces.

Note, that, as with all functions, the function delimiter used may not appear
within the shell-command outside of single or double quoted strings.  But you can
double it as in the second example:

    date = $(shell date)	# better: $(perl scalar localtime)
    VAR = ${{shell f() { echo hello; }; f}}

=item wordlist indexlist, words X<wordlist>

=item wordlist firstindex, lastindex, words

In the first form you supply a list of indices (counting from 1 at the
beginning or backwards from -1 at the end) to select the words you want.  In
the second form you specify the range of words you want returned.

=item xargs command list X<xargs>

Returns a newline-separated list of commands that each begin with the
specified command, and end with as many elements of the list as possible
without going over 1000 characters.

The purpose of this is to avoid spilling over the command length limit on your
system.  For example, if there are a lot of generated files, then you would
probably want your clean target (which you should not have, because
C<makeppclean> is more efficient) to look something like this:

    $(phony clean):
 	$(xargs $(RM), $(only_targets **/*))

This also has the side-effect that no command whatsoever is generated if the
list happens to be empty.  But in this case it would be better to use the
builtin C<&rm>, because the arguments to the builtin commands are only limited
by perl's memory:

    $(phony clean):
 	&rm -f $(only_targets **/*)

If a third argument is specified, then it is used to postfix each command.
This is useful for specifying redirectors, e.g. (though here again C<&echo>
would help):

    manifest:
 	&rm -f $@
 	&touch $@
 	$(xargs echo, $(only_nontargets **/*), >> $@)

=back

makepp also supports many other, less useful functions that GNU make has.  See
the GNU make documentation for details, because I don't feel like typing it in
now.  (To my knowledge, the only ones it does not support are C<call>,
C<error>, and C<warning>.)  These are intended mainly to support existing
makefiles; it's very easy to L<write your own functions in
perl|makepp_extending>, or to use the C<perl_begin> or C<sub> statements to
manipulate variables directly in perl inside your makefile, so you can do any
kind of manipulation if one of these built-in functions isn't adequate.

=head1 AUTHOR

Gary Holt (holt-makepp@gholt.net)
