package Panotools::Makefile::Variable; =head1 NAME Panotools::Makefile::Variable - Assemble Makefile Variable definitions =head1 SYNOPSIS Simple interface for generating Makefile syntax =head1 DESCRIPTION Writing Makefiles directly from perl scripts with print and "\t" etc... is prone to error, this library provides a simple perl interface for assembling Makefiles. =cut use strict; use warnings; use Panotools::Makefile::Utils qw/quotetarget quoteprerequisite quoteshell/; =head1 USAGE $var = new Panotools::Makefile::Variable; ..or define the 'variable name' at the same time: $var = new Panotools::Makefile::Variable ('USERS'); ..or define the name and values at the same time: $var = new Panotools::Makefile::Variable ('USERS', 'Andy Pandy'); =cut sub new { my $class = shift; $class = ref $class || $class; my $self = bless {name => shift, value => [@_]}, $class; return $self; } =pod Set or query the name: $var->Name ('USERS'); $text = $var->Name; =cut sub Name { my $self = shift; $self->{name} = shift if @_; return $self->{name}; } sub NameRef { my $self = shift; return '$('. $self->Name .')'; } sub NameRefShell { my $self = shift; return '$('. $self->Name .'_SHELL)'; } =pod $var->Values ('James Brine', 'George Loveless'); $var->Values ('Thomas Standfield'); =cut sub Values { my $self = shift; push @{$self->{value}}, @_; return $self->{value}; } =pod Construct a text fragment that defines this variable suitable for use in a Makefile like so: $text = $var->Assemble; =cut sub Assemble { my $self = shift; return '' unless defined $self->{name}; my $text; $text .= quotetarget ($self->{name}); $text .= ' = '; $text .= join ' ', (map { quotetarget ($_)} grep /./, @{$self->{value}}); $text .= "\n"; $text .= quotetarget ($self->{name} .'_SHELL'); $text .= ' = '; my @items = map { quoteshell ($_)} grep /./, @{$self->{value}}; @items = map {s/\$\(([^)]+)\)/\$($1_SHELL)/g; $_} @items; $text .= join ' ', @items; $text .= "\n"; return $text; } 1;