# Copyright (C) 2001-2007, The Perl Foundation. # $Id: BuildUtil.pm 22083 2007-10-14 12:45:48Z paultcochrane $ =head1 NAME lib/Parrot/BuildUtil.pm - Utilities for building Parrot =head1 DESCRIPTION This package holds three subroutines: C, C, and C. Subroutines are not exported--each must be requested by using a fully qualified name. =cut package Parrot::BuildUtil; use strict; use warnings; =head1 SUBROUTINES =over 4 =item C Determines the current version number for Parrot from the VERSION file and returns it in a context-appropriate manner. $parrot_version = Parrot::BuildUtil::parrot_version(); # $parrot_version is '0.4.11' @parrot_version = Parrot::BuildUtil::parrot_version(); # @parrot_version is (0, 4, 11) =cut # cache for repeated calls my ( $parrot_version, @parrot_version ); sub parrot_version { if ( defined $parrot_version ) { return wantarray ? @parrot_version : $parrot_version; } # Obtain the official version number from the VERSION file. open my $VERSION, '<', 'VERSION' or die "Could not open VERSION file!"; chomp( $parrot_version = <$VERSION> ); close $VERSION; $parrot_version =~ s/\s+//g; @parrot_version = split( /\./, $parrot_version ); if ( scalar(@parrot_version) < 3 ) { die "Too few components to VERSION file contents: '$parrot_version' (should be 3 or 4)!"; } if ( scalar(@parrot_version) > 4 ) { die "Too many components to VERSION file contents: '$parrot_version' (should be 3 or 4)!"; } foreach my $component (@parrot_version) { die "Illegal version component: '$component' in VERSION file!" unless $component =~ m/^\d+$/; } $parrot_version = join( '.', @parrot_version ); return wantarray ? @parrot_version : $parrot_version; } =item C Slurps up the filename and returns the content as one string. While doing so, it converts all DOS-style line endings to newlines. =cut sub slurp_file { my ($file_name) = @_; open( my $SLURP, '<', $file_name ) or die "open '$file_name': $!"; local $/ = undef; my $file = <$SLURP> . ''; $file =~ s/\cM\cJ/\n/g; close $SLURP; return $file; } =item C Returns a comment to mark a generated file and detail how it was created. C<$filename> is the name of the file on which the generated file is based, C<$style> is the style of comment--C<'perl'> and C<'c'> are permitted, other values produce an error. =cut sub generated_file_header { my ( $filename, $style ) = @_; die "unknown style '$style'" if $style !~ m/\A(perl|c)\z/; require File::Spec; my $script = File::Spec->abs2rel($0); $script =~ s/\\/\//g; my $header = <