(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
#!/usr/bin/perl
#
# blah blah... license info blah blah seems most other source files have this header comment format
#
# The Original Code was written for:
# Delta Debugging Framework.
#
# The Initial Developer of the Original Code:
# Richard Chu
#
# Contributor(s):
# Elizabeth Chak - Documentation
#
# Date Created: October 10, 2006
# Date Last Modified: October 22, 2006
#
# Version: 0.02
#
# Description:
# A light wrapper around the GNU make utility used to "make" file(s) - compiling source code
# files into object code files using a compiler; then linking the object code into executables
# or libraries. According to Wikipedia.
#
# The exit code of the make utility is one of:
# 0 make is successful
# 2 make encountered an error
# 1 you used the '-q' flag and make determined that some target is not already up to date.
#
# However, I have not figured out how to capture the exit code of make after the command is executed
# to determine whether it was successful or not.
#
# References: http://www.gnu.org/software/make/manual/html_node/Running.html#Running
#
# Change History:
# October 10, 2006:
# - make class created. Initial support for GNU make utility and its multitude of options.
#
# October 22, 2006:
# - removed the debug print statements.
#
###############################################################################
use warnings;
use strict;
package Build::GNUMake;
####
# Create a generic Build element. The values of the anonymous hash ($self)
# is initially undefined and will be used to hold the properties for Build.
# It may be populated with GNU make options via the addOption subroutine.
####
sub new () {
my $class = shift; # first element in @_ is class name
my $self = { };
bless ($self, $class); #change data type of anonymous hash to $class
return $self;
};
#####
# Build subroutine that builds the files depending on the options added via the
# addOption subroutine. When I figure out, it will return GNU make's exit code.
#
# @return rc make's command code
#####
sub build () {
my $self = shift;
my $rc = -1;
my $key;
my $value;
my $options;
while (($key, $value)=each %$self) {
$options .= "$self->{$key} ";
}
$rc = `make $options`;
return $rc;
}
####
# addOption subroutine that allows users to add GNU make options which customizes the build.
# GNU make options are added to the hash which will then be concatenated to the GNU make command code.
# Most GNU make options are covered in this subroutine.
# No error checking or validation is done for the input.
# Options are based on this reference: http://www.gnu.org/software/make/manual/html_node/Options-Summary.html#Options-Summary
####
sub addOption ($;$) {
my $self = shift;
my ($option, $value) = @_;
if (!defined($value)) {
$value = "";
}
if ($option eq "-B" || $option eq "--always-make") {
$self->{"--always-make"} = "--always-make";
}
# NOT SURE about the correctness of this option
elsif ($option eq "-C" || $option eq "--directory") {
$self->{"--directory"} .= " --directory=$value";
}
elsif ($option eq "-d" || $option eq "--debug") {
if ($option eq "-d") {
$value = "a";
}
if ($value eq "a" || $value eq "b" || $value eq "v"
|| $value eq "i" || $value eq "j" || $value eq "m") {
$self->{"--debug"} = "--debug=$value";
}
}
elsif ($option eq "-e" || $option eq "--environment-overrides") {
$self->{"--environment-overrides"} = "--environment-overrides";
}
elsif ($option eq "-f" || $option eq "--file" || $option eq "--makefile") {
$self->{"--makefile"} = "--makefile=$value";
}
elsif ($option eq "-i" || $option eq "--ignore-errors") {
$self->{"--ignore-errors"} = "--ignore-errors";
}
# NOT SURE about the correctness of this option
elsif ($option eq "-I" || $option eq "--include-dir") {
$self->{"--include-dir"} .= " --include-dir=$value";
}
elsif ($option eq "-j" || $option eq "--jobs") {
$self->{"--jobs"} = "--jobs=$value";
}
elsif ($option eq "-k" || $option eq "--keep-going") {
$self->{"--keep-going"} = "--keep-going";
}
#assuming these are aliases...
elsif ($option eq "-l" || $option eq "--load-average" || $option eq "--max-load") {
$self->{"-l"} = "-l $value";
}
elsif ($option eq "-n" || $option eq "--just-print" || $option eq "--dry-run" || $option eq "--recon") {
$self->{"--just-print"} = "--just-print";
}
elsif ($option eq "-o" || $option eq "--old-file" || $option eq "--assume-old") {
$self->{"--old-file"} = "--old-file=$value";
}
elsif ($option eq "-s" || $option eq "--silent" || $option eq "--quiet") {
$self->{"--silent"} = "--silent";
}
}
####
# This subroutine prints the options that have been added via the addOption subroutine
# This method is used for debugging purposes.
####
sub printOptions () {
my $self = shift;
my $key;
my $value;
while (($key, $value)=each %$self) {
print " $self->{$key}";
}
}
1; # last statement in file returns true