NAME
Make - Pure-Perl implementation of a somewhat GNU-like make.
SYNOPSIS
require Make;
my $make = Make->new;
$make->parse($file);
$make->Make(@ARGV);
# to see what it would have done
print $make->Script(@ARGV);
# to see an expanded version of the makefile
$make->Print(@ARGV);
my $targ = $make->target($name);
my $rule = Make::Rule->new(':', \@prereqs, \@recipe);
$targ->add_rule($rule);
my @rules = @{ $targ->rules };
my @prereqs = @{ $rule->prereqs };
my @commands = @{ $rule->recipe };
DESCRIPTION
Implements in pure Perl a somewhat GNU-like make, intended to be highly customisable.
Via pure-perl-make Make has built perl/Tk from the MakeMaker
generated Makefiles...
MAKEFILE SYNTAX
Broadly, there are macros, directives, and rules (including recipes).
Macros:
varname = value
Directives:
vpath %.c src/%.c
[-]include otherfile.mk # - means no warn on failure to include
Please note the vpath
does not have the GNU-make behaviour of discarding the found path if an inferred target must be rebuilt, since this is too non-deterministic / confusing behaviour for this author.
Rules:
target : prerequisite1 prerequisite2[; immediate recipe]
(tab character)follow-on recipe...
Recipe lines can start with @
(do not echo), -
(continue on failure).
In addition to traditional
.c.o :
$(CC) -c ...
GNU make's 'pattern' rules e.g.
%.o : %.c
$(CC) -c ...
The former gets internally translated to the latter.
METHODS
There are other methods (used by parse) which can be used to add and manipulate targets and their prerequites.
new
Class method, takes pairs of arguments in name/value form. Arguments:
Vars
A hash-ref of values that sets variables, overridable by the makefile.
Jobs
Number of concurrent jobs to run while building. Not implemented.
GNU
If true, then GNUmakefile is looked for first.
FunctionPackages
Array-ref of package names to search for GNU-make style functions. Defaults to Make::Functions.
FSFunctionMap
Hash-ref of file-system functions by which to access the file-system. Created to help testing, but might be more widely useful. Defaults to code accessing the actual local filesystem. The various functions are expected to return real Perl filehandles. Relevant keys: glob
, fh_open
, fh_write
, mtime
.
InDir
Optional. If supplied, will be treated as the current directory instead of the default which is the real current directory.
parse
Parses the given makefile. If none or undef
, these files will be tried, in order: GNUmakefile if "GNU", makefile, Makefile.
If a scalar-ref, will be makefile text.
Make
Given a target-name, builds the target(s) specified, or the first 'real' target in the makefile.
Print to current select
'ed stream a form of the makefile with all variables expanded.
Script
Print to current select
'ed stream the equivalent bourne shell script that a make would perform i.e. the output of make -n
.
set_var
Given a name and value, sets the variable to that.
May gain a "type" parameter to distinguish immediately-expanded from recursively-expanded (the default).
expand
Uses "subsvars" to return its only arg with any macros expanded.
target
Find or create Make::Target for given target-name.
has_target
Find Make::Target for given target-name, or undef.
patrule
Search registered pattern-rules for one matching given target-name. Returns a Make::Rule for that of the given kind, or false.
Uses GNU make's "exists or can be made" algorithm on each rule's proposed requisite to see if that rule matches.
ATTRIBUTES
These are read-only.
vars
Returns a hash-ref of the current set of variables.
function_packages
Returns an array-ref of the packages to search for macro functions.
fsmap
Returns a hash-ref of the "FSFunctionMap".
FUNCTIONS
parse_makefile
Given a file-handle, returns array-ref of Abstract Syntax-Tree (AST) fragments, representing the contents of that file. Each is an array-ref whose first element is the node-type (comment
, include
, vpath
, var
, rule
), followed by relevant data.
tokenize
Given a line, returns array-ref of the space-separated "tokens". Also splits on any further args.
subsvars
my $expanded = Make::subsvars(
'hi $(shell echo there)',
\@function_packages,
[ \%vars ],
$fsmap,
);
# "hi there"
Given a piece of text, will substitute any macros in it, either a single-character macro, or surrounded by either {}
or ()
. These can be nested. Uses the array-ref as a list of hashes to search for values.
If the macro is of form $(varname:a=b)
, then this will be a GNU (and others) make-style "substitution reference". First "varname" will be expanded. Then all occurrences of "a" at the end of words within the expanded text will be replaced with "b". This is intended for file suffixes.
For GNU-make style functions, see Make::Functions.
DEBUGGING
To see debugging messages on STDERR
, set environment variable MAKE_DEBUG
to a true value;
BUGS
More attention needs to be given to using the package to write makefiles.
The rules for matching 'dot rules' e.g. .c.o and/or pattern rules e.g. %.o : %.c are suspect. For example give a choice of .xs.o vs .xs.c + .c.o behaviour seems a little odd.
SEE ALSO
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html POSIX standard for make
https://www.gnu.org/software/make/manual/make.html GNU make docs
AUTHOR
Nick Ing-Simmons
COPYRIGHT AND LICENSE
Copyright (c) 1996-1999 Nick Ing-Simmons.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.