Blame devel/buildperl.pl

Packit 7d6a7d
#!/usr/bin/perl -w
Packit 7d6a7d
################################################################################
Packit 7d6a7d
#
Packit 7d6a7d
#  buildperl.pl -- build various versions of perl automatically
Packit 7d6a7d
#
Packit 7d6a7d
################################################################################
Packit 7d6a7d
#
Packit 7d6a7d
#  Version 3.x, Copyright (C) 2004-2013, Marcus Holland-Moritz.
Packit 7d6a7d
#  Version 2.x, Copyright (C) 2001, Paul Marquess.
Packit 7d6a7d
#  Version 1.x, Copyright (C) 1999, Kenneth Albanowski.
Packit 7d6a7d
#
Packit 7d6a7d
#  This program is free software; you can redistribute it and/or
Packit 7d6a7d
#  modify it under the same terms as Perl itself.
Packit 7d6a7d
#
Packit 7d6a7d
################################################################################
Packit 7d6a7d
Packit 7d6a7d
use strict;
Packit 7d6a7d
use Getopt::Long;
Packit 7d6a7d
use Pod::Usage;
Packit 7d6a7d
use File::Find;
Packit 7d6a7d
use File::Path;
Packit 7d6a7d
use Data::Dumper;
Packit 7d6a7d
use IO::File;
Packit 7d6a7d
use Cwd;
Packit 7d6a7d
Packit 7d6a7d
# TODO: - extra arguments to Configure
Packit 7d6a7d
Packit 7d6a7d
#
Packit 7d6a7d
#  --test-archives=1      check if archives can be read
Packit 7d6a7d
#  --test-archives=2      like 1, but also extract archives
Packit 7d6a7d
#  --test-archives=3      like 2, but also apply patches
Packit 7d6a7d
#
Packit 7d6a7d
Packit 7d6a7d
my %opt = (
Packit 7d6a7d
  prefix    => '/tmp/perl/install/<config>/<perl>',
Packit 7d6a7d
  build     => '/tmp/perl/build/<config>',
Packit 7d6a7d
  source    => '/tmp/perl/source',
Packit 7d6a7d
  force     => 0,
Packit 7d6a7d
  test      => 0,
Packit 7d6a7d
  install   => 1,
Packit 7d6a7d
  oneshot   => 0,
Packit 7d6a7d
  configure => 0,
Packit 7d6a7d
  'test-archives' => 0,
Packit 7d6a7d
);
Packit 7d6a7d
Packit 7d6a7d
my %config = (
Packit 7d6a7d
  default     => {
Packit 7d6a7d
                   config_args => '-des',
Packit 7d6a7d
                 },
Packit 7d6a7d
  thread      => {
Packit 7d6a7d
                   config_args     => '-des -Dusethreads',
Packit 7d6a7d
                   masked_versions => [ qr/^5\.00[01234]/ ],
Packit 7d6a7d
                 },
Packit 7d6a7d
  thread5005  => {
Packit 7d6a7d
                   config_args     => '-des -Duse5005threads',
Packit 7d6a7d
                   masked_versions => [ qr/^5\.00[012345]|^5\.(9|\d\d)|^5\.8\.9/ ],
Packit 7d6a7d
                 },
Packit 7d6a7d
  debug       => {
Packit 7d6a7d
                   config_args => '-des -Doptimize=-g',
Packit 7d6a7d
                 },
Packit 7d6a7d
);
Packit 7d6a7d
Packit 7d6a7d
my @patch = (
Packit 7d6a7d
  {
Packit 7d6a7d
    perl => [
Packit 7d6a7d
              qr/^5\.00[01234]/,
Packit 7d6a7d
              qw/
Packit 7d6a7d
                5.005
Packit 7d6a7d
                5.005_01
Packit 7d6a7d
                5.005_02
Packit 7d6a7d
                5.005_03
Packit 7d6a7d
              /,
Packit 7d6a7d
            ],
Packit 7d6a7d
    subs => [
Packit 7d6a7d
              [ \&patch_db, 1 ],
Packit 7d6a7d
            ],
Packit 7d6a7d
  },
Packit 7d6a7d
  {
Packit 7d6a7d
    perl => [
Packit 7d6a7d
              qw/
Packit 7d6a7d
                5.6.0
Packit 7d6a7d
                5.6.1
Packit 7d6a7d
                5.7.0
Packit 7d6a7d
                5.7.1
Packit 7d6a7d
                5.7.2
Packit 7d6a7d
                5.7.3
Packit 7d6a7d
                5.8.0
Packit 7d6a7d
              /,
Packit 7d6a7d
            ],
Packit 7d6a7d
    subs => [
Packit 7d6a7d
              [ \&patch_db, 3 ],
Packit 7d6a7d
            ],
Packit 7d6a7d
  },
Packit 7d6a7d
  {
Packit 7d6a7d
    perl => [
Packit 7d6a7d
              qr/^5\.004_0[1234]$/,
Packit 7d6a7d
            ],
Packit 7d6a7d
    subs => [
Packit 7d6a7d
              [ \&patch_doio ],
Packit 7d6a7d
            ],
Packit 7d6a7d
  },
Packit 7d6a7d
  {
Packit 7d6a7d
    perl => [
Packit 7d6a7d
              qw/
Packit 7d6a7d
                5.005
Packit 7d6a7d
                5.005_01
Packit 7d6a7d
                5.005_02
Packit 7d6a7d
              /,
Packit 7d6a7d
            ],
Packit 7d6a7d
    subs => [
Packit 7d6a7d
              [ \&patch_sysv, old_format => 1 ],
Packit 7d6a7d
            ],
Packit 7d6a7d
  },
Packit 7d6a7d
  {
Packit 7d6a7d
    perl => [
Packit 7d6a7d
              qw/
Packit 7d6a7d
                5.005_03
Packit 7d6a7d
                5.005_04
Packit 7d6a7d
              /,
Packit 7d6a7d
              qr/^5\.6\.[0-2]$/,
Packit 7d6a7d
              qr/^5\.7\.[0-3]$/,
Packit 7d6a7d
              qr/^5\.8\.[0-8]$/,
Packit 7d6a7d
              qr/^5\.9\.[0-5]$/
Packit 7d6a7d
            ],
Packit 7d6a7d
    subs => [
Packit 7d6a7d
              [ \&patch_sysv ],
Packit 7d6a7d
            ],
Packit 7d6a7d
  },
Packit 7d6a7d
  {
Packit 7d6a7d
    perl => [
Packit 7d6a7d
              qr/^5\.004_05$/,
Packit 7d6a7d
              qr/^5\.005(?:_0[1-4])?$/,
Packit 7d6a7d
              qr/^5\.6\.[01]$/,
Packit 7d6a7d
            ],
Packit 7d6a7d
    subs => [
Packit 7d6a7d
              [ \&patch_configure ],
Packit 7d6a7d
              [ \&patch_makedepend_lc ],
Packit 7d6a7d
            ],
Packit 7d6a7d
  },
Packit 7d6a7d
  {
Packit 7d6a7d
    perl => [
Packit 7d6a7d
              '5.8.0',
Packit 7d6a7d
            ],
Packit 7d6a7d
    subs => [
Packit 7d6a7d
              [ \&patch_makedepend_lc ],
Packit 7d6a7d
            ],
Packit 7d6a7d
  },
Packit 7d6a7d
);
Packit 7d6a7d
Packit 7d6a7d
my(%perl, @perls);
Packit 7d6a7d
Packit 7d6a7d
GetOptions(\%opt, qw(
Packit 7d6a7d
  config=s@
Packit 7d6a7d
  prefix=s
Packit 7d6a7d
  build=s
Packit 7d6a7d
  source=s
Packit 7d6a7d
  perl=s@
Packit 7d6a7d
  force
Packit 7d6a7d
  test
Packit 7d6a7d
  install!
Packit 7d6a7d
  test-archives=i
Packit 7d6a7d
  patch!
Packit 7d6a7d
  oneshot
Packit 7d6a7d
)) or pod2usage(2);
Packit 7d6a7d
Packit 7d6a7d
my %current;
Packit 7d6a7d
Packit 7d6a7d
if ($opt{patch} || $opt{oneshot}) {
Packit 7d6a7d
  @{$opt{perl}} == 1 or die "Exactly one --perl must be given with --patch or --oneshot\n";
Packit 7d6a7d
  my $perl = $opt{perl}[0];
Packit 7d6a7d
  patch_source($perl) if !exists $opt{patch} || $opt{patch};
Packit 7d6a7d
  if (exists $opt{oneshot}) {
Packit 7d6a7d
    eval { require String::ShellQuote };
Packit 7d6a7d
    die "--oneshot requires String::ShellQuote to be installed\n" if $@;
Packit 7d6a7d
    %current = (config => 'oneshot', version => $perl);
Packit 7d6a7d
    $config{oneshot} = { config_args => String::ShellQuote::shell_quote(@ARGV) };
Packit 7d6a7d
    build_and_install($perl{$perl});
Packit 7d6a7d
  }
Packit 7d6a7d
  exit 0;
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
if (exists $opt{config}) {
Packit 7d6a7d
  for my $cfg (@{$opt{config}}) {
Packit 7d6a7d
    exists $config{$cfg} or die "Unknown configuration: $cfg\n";
Packit 7d6a7d
  }
Packit 7d6a7d
}
Packit 7d6a7d
else {
Packit 7d6a7d
  $opt{config} = [sort keys %config];
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
find(sub {
Packit 7d6a7d
  /^(perl-?(5\..*))\.tar\.(gz|bz2|lzma)$/ or return;
Packit 7d6a7d
  $perl{$1} = { version => $2, source => $File::Find::name, compress => $3 };
Packit 7d6a7d
}, $opt{source});
Packit 7d6a7d
Packit 7d6a7d
if (exists $opt{perl}) {
Packit 7d6a7d
  for my $perl (@{$opt{perl}}) {
Packit 7d6a7d
    my $p = $perl;
Packit 7d6a7d
    exists $perl{$p} or $p = "perl$perl";
Packit 7d6a7d
    exists $perl{$p} or $p = "perl-$perl";
Packit 7d6a7d
    exists $perl{$p} or die "Cannot find perl: $perl\n";
Packit 7d6a7d
    push @perls, $p;
Packit 7d6a7d
  }
Packit 7d6a7d
}
Packit 7d6a7d
else {
Packit 7d6a7d
  @perls = sort keys %perl;
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
if ($opt{'test-archives'}) {
Packit 7d6a7d
  my $test = 'test';
Packit 7d6a7d
  my $cwd = cwd;
Packit 7d6a7d
  -d $test or mkpath($test);
Packit 7d6a7d
  chdir $test or die "chdir $test: $!\n";
Packit 7d6a7d
  for my $perl (@perls) {
Packit 7d6a7d
    eval {
Packit 7d6a7d
      my $d = extract_source($perl{$perl});
Packit 7d6a7d
      if ($opt{'test-archives'} > 2) {
Packit 7d6a7d
        my $cwd2 = cwd;
Packit 7d6a7d
        chdir $d or die "chdir $d: $!\n";
Packit 7d6a7d
        patch_source($perl{$perl}{version});
Packit 7d6a7d
        chdir $cwd2 or die "chdir $cwd2:$!\n"
Packit 7d6a7d
      }
Packit 7d6a7d
      rmtree($d) if -e $d;
Packit 7d6a7d
    };
Packit 7d6a7d
    warn $@ if $@;
Packit 7d6a7d
  }
Packit 7d6a7d
  chdir $cwd or die "chdir $cwd: $!\n";
Packit 7d6a7d
  print STDERR "cleaning up\n";
Packit 7d6a7d
  rmtree($test);
Packit 7d6a7d
  exit 0;
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
for my $cfg (@{$opt{config}}) {
Packit 7d6a7d
  for my $perl (@perls) {
Packit 7d6a7d
    my $config = $config{$cfg};
Packit 7d6a7d
    %current = (config => $cfg, perl => $perl, version => $perl{$perl}{version});
Packit 7d6a7d
Packit 7d6a7d
    if (is($config->{masked_versions}, $current{version})) {
Packit 7d6a7d
      print STDERR "skipping $perl for configuration $cfg (masked)\n";
Packit 7d6a7d
      next;
Packit 7d6a7d
    }
Packit 7d6a7d
Packit 7d6a7d
    if (-d expand($opt{prefix}) and !$opt{force}) {
Packit 7d6a7d
      print STDERR "skipping $perl for configuration $cfg (already installed)\n";
Packit 7d6a7d
      next;
Packit 7d6a7d
    }
Packit 7d6a7d
Packit 7d6a7d
    my $cwd = cwd;
Packit 7d6a7d
Packit 7d6a7d
    my $build = expand($opt{build});
Packit 7d6a7d
    -d $build or mkpath($build);
Packit 7d6a7d
    chdir $build or die "chdir $build: $!\n";
Packit 7d6a7d
Packit 7d6a7d
    print STDERR "building $perl with configuration $cfg\n";
Packit 7d6a7d
    buildperl($perl, $config);
Packit 7d6a7d
Packit 7d6a7d
    chdir $cwd or die "chdir $cwd: $!\n";
Packit 7d6a7d
  }
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub expand
Packit 7d6a7d
{
Packit 7d6a7d
  my $in = shift;
Packit 7d6a7d
  $in =~ s/(<(\w+)>)/exists $current{$2} ? $current{$2} : $1/eg;
Packit 7d6a7d
  return $in;
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub is
Packit 7d6a7d
{
Packit 7d6a7d
  my($s1, $s2) = @_;
Packit 7d6a7d
Packit 7d6a7d
  defined $s1 != defined $s2 and return 0;
Packit 7d6a7d
Packit 7d6a7d
  ref $s2 and ($s1, $s2) = ($s2, $s1);
Packit 7d6a7d
Packit 7d6a7d
  if (ref $s1) {
Packit 7d6a7d
    if (ref $s1 eq 'ARRAY') {
Packit 7d6a7d
      is($_, $s2) and return 1 for @$s1;
Packit 7d6a7d
      return 0;
Packit 7d6a7d
    }
Packit 7d6a7d
    return $s2 =~ $s1;
Packit 7d6a7d
  }
Packit 7d6a7d
Packit 7d6a7d
  return $s1 eq $s2;
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub buildperl
Packit 7d6a7d
{
Packit 7d6a7d
  my($perl, $cfg) = @_;
Packit 7d6a7d
Packit 7d6a7d
  my $d = extract_source($perl{$perl});
Packit 7d6a7d
  chdir $d or die "chdir $d: $!\n";
Packit 7d6a7d
Packit 7d6a7d
  patch_source($perl{$perl}{version});
Packit 7d6a7d
Packit 7d6a7d
  build_and_install($perl{$perl});
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub extract_source
Packit 7d6a7d
{
Packit 7d6a7d
  eval { require Archive::Tar };
Packit 7d6a7d
  die "Archive processing requires Archive::Tar to be installed\n" if $@;
Packit 7d6a7d
Packit 7d6a7d
  my $perl = shift;
Packit 7d6a7d
Packit 7d6a7d
  my $what = $opt{'test-archives'} ? 'test' : 'read';
Packit 7d6a7d
  print "${what}ing $perl->{source}\n";
Packit 7d6a7d
Packit 7d6a7d
  my $target;
Packit 7d6a7d
Packit 7d6a7d
  for my $f (Archive::Tar->list_archive($perl->{source})) {
Packit 7d6a7d
    my($t) = $f =~ /^([^\\\/]+)/ or die "ooops, should always match...\n";
Packit 7d6a7d
    die "refusing to extract $perl->{source}, as it would not extract to a single directory\n"
Packit 7d6a7d
        if defined $target and $target ne $t;
Packit 7d6a7d
    $target = $t;
Packit 7d6a7d
  }
Packit 7d6a7d
Packit 7d6a7d
  if ($opt{'test-archives'} == 0 || $opt{'test-archives'} > 1) {
Packit 7d6a7d
    if (-d $target) {
Packit 7d6a7d
      print "removing old build directory $target\n";
Packit 7d6a7d
      rmtree($target);
Packit 7d6a7d
    }
Packit 7d6a7d
Packit 7d6a7d
    print "extracting $perl->{source}\n";
Packit 7d6a7d
Packit 7d6a7d
    Archive::Tar->extract_archive($perl->{source})
Packit 7d6a7d
        or die "extract failed: " . Archive::Tar->error() . "\n";
Packit 7d6a7d
Packit 7d6a7d
    -d $target or die "oooops, $target not found\n";
Packit 7d6a7d
  }
Packit 7d6a7d
Packit 7d6a7d
  return $target;
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub patch_source
Packit 7d6a7d
{
Packit 7d6a7d
  my $version = shift;
Packit 7d6a7d
Packit 7d6a7d
  for my $p (@patch) {
Packit 7d6a7d
    if (is($p->{perl}, $version)) {
Packit 7d6a7d
      for my $s (@{$p->{subs}}) {
Packit 7d6a7d
        my($sub, @args) = @$s;
Packit 7d6a7d
        $sub->(@args);
Packit 7d6a7d
      }
Packit 7d6a7d
    }
Packit 7d6a7d
  }
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub build_and_install
Packit 7d6a7d
{
Packit 7d6a7d
  my $perl = shift;
Packit 7d6a7d
  my $prefix = expand($opt{prefix});
Packit 7d6a7d
Packit 7d6a7d
  run_or_die(q{sed -i -e "s:\\*/\\*) finc=\\"-I\\`echo \\$file | sed 's#/\\[^/\\]\\*\\$##\\`\\" ;;:*/*) finc=\\"-I\\`echo \\$file | sed 's#/[^/]\\*\\$##'\\`\\" ;;:" makedepend.SH});
Packit 7d6a7d
Packit 7d6a7d
  print "building perl $perl->{version} ($current{config})\n";
Packit 7d6a7d
Packit 7d6a7d
  run_or_die("./Configure $config{$current{config}}{config_args} -Dusedevel -Uinstallusrbinperl -Dprefix=$prefix");
Packit 7d6a7d
  if (-f "x2p/makefile") {
Packit 7d6a7d
    run_or_die("sed -i -e '/^.*<builtin>/d' -e '/^.*<built-in>/d' -e '/^.*<command line>/d' -e '/^.*<command-line>/d' makefile x2p/makefile");
Packit 7d6a7d
  }
Packit 7d6a7d
  run_or_die("make all");
Packit 7d6a7d
  run("make test") if $opt{test};
Packit 7d6a7d
  if ($opt{install}) {
Packit 7d6a7d
    run_or_die("make install");
Packit 7d6a7d
  }
Packit 7d6a7d
  else {
Packit 7d6a7d
    print "\n*** NOT INSTALLING PERL ***\n\n";
Packit 7d6a7d
  }
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub patch_db
Packit 7d6a7d
{
Packit 7d6a7d
  my $ver = shift;
Packit 7d6a7d
  print "patching ext/DB_File/DB_File.xs\n";
Packit 7d6a7d
  run_or_die("sed -i -e 's/<db.h>/<db$ver\\/db.h>/' ext/DB_File/DB_File.xs");
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub patch_doio
Packit 7d6a7d
{
Packit 7d6a7d
  patch(<<'END');
Packit 7d6a7d
--- doio.c.org	2004-06-07 23:14:45.000000000 +0200
Packit 7d6a7d
+++ doio.c	2003-11-04 08:03:03.000000000 +0100
Packit 7d6a7d
@@ -75,6 +75,16 @@
Packit 7d6a7d
 #  endif
Packit 7d6a7d
 #endif
Packit 7d6a7d
Packit 7d6a7d
+#if _SEM_SEMUN_UNDEFINED
Packit 7d6a7d
+union semun
Packit 7d6a7d
+{
Packit 7d6a7d
+  int val;
Packit 7d6a7d
+  struct semid_ds *buf;
Packit 7d6a7d
+  unsigned short int *array;
Packit 7d6a7d
+  struct seminfo *__buf;
Packit 7d6a7d
+};
Packit 7d6a7d
+#endif
Packit 7d6a7d
+
Packit 7d6a7d
 bool
Packit 7d6a7d
 do_open(gv,name,len,as_raw,rawmode,rawperm,supplied_fp)
Packit 7d6a7d
 GV *gv;
Packit 7d6a7d
END
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub patch_sysv
Packit 7d6a7d
{
Packit 7d6a7d
  my %opt = @_;
Packit 7d6a7d
Packit 7d6a7d
  # check if patching is required
Packit 7d6a7d
  return if $^O ne 'linux' or -f '/usr/include/asm/page.h';
Packit 7d6a7d
Packit 7d6a7d
  if ($opt{old_format}) {
Packit 7d6a7d
    patch(<<'END');
Packit 7d6a7d
--- ext/IPC/SysV/SysV.xs.org	1998-07-20 10:20:07.000000000 +0200
Packit 7d6a7d
+++ ext/IPC/SysV/SysV.xs	2007-08-12 10:51:06.000000000 +0200
Packit 7d6a7d
@@ -3,9 +3,6 @@
Packit 7d6a7d
 #include "XSUB.h"
Packit 7d6a7d
 
Packit 7d6a7d
 #include <sys/types.h>
Packit 7d6a7d
-#ifdef __linux__
Packit 7d6a7d
-#include <asm/page.h>
Packit 7d6a7d
-#endif
Packit 7d6a7d
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
Packit 7d6a7d
 #include <sys/ipc.h>
Packit 7d6a7d
 #ifdef HAS_MSG
Packit 7d6a7d
END
Packit 7d6a7d
  }
Packit 7d6a7d
  else {
Packit 7d6a7d
    patch(<<'END');
Packit 7d6a7d
--- ext/IPC/SysV/SysV.xs.org	2007-08-11 00:12:46.000000000 +0200
Packit 7d6a7d
+++ ext/IPC/SysV/SysV.xs	2007-08-11 00:10:51.000000000 +0200
Packit 7d6a7d
@@ -3,9 +3,6 @@
Packit 7d6a7d
 #include "XSUB.h"
Packit 7d6a7d
 
Packit 7d6a7d
 #include <sys/types.h>
Packit 7d6a7d
-#ifdef __linux__
Packit 7d6a7d
-#   include <asm/page.h>
Packit 7d6a7d
-#endif
Packit 7d6a7d
 #if defined(HAS_MSG) || defined(HAS_SEM) || defined(HAS_SHM)
Packit 7d6a7d
 #ifndef HAS_SEM
Packit 7d6a7d
 #   include <sys/ipc.h>
Packit 7d6a7d
END
Packit 7d6a7d
  }
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub patch_configure
Packit 7d6a7d
{
Packit 7d6a7d
  patch(<<'END');
Packit 7d6a7d
--- Configure
Packit 7d6a7d
+++ Configure
Packit 7d6a7d
@@ -3380,6 +3380,18 @@
Packit 7d6a7d
 test "X$gfpthkeep" != Xy && gfpth=""
Packit 7d6a7d
 EOSC
Packit 7d6a7d
 
Packit 7d6a7d
+# gcc 3.1 complains about adding -Idirectories that it already knows about,
Packit 7d6a7d
+# so we will take those off from locincpth.
Packit 7d6a7d
+case "$gccversion" in
Packit 7d6a7d
+3*)
Packit 7d6a7d
+    echo "main(){}">try.c
Packit 7d6a7d
+    for incdir in `$cc -v -c try.c 2>&1 | \
Packit 7d6a7d
+       sed '1,/^#include <\.\.\.>/d;/^End of search list/,$d;s/^ //'` ; do
Packit 7d6a7d
+       locincpth=`echo $locincpth | sed s!$incdir!!`
Packit 7d6a7d
+    done
Packit 7d6a7d
+    $rm -f try try.*
Packit 7d6a7d
+esac
Packit 7d6a7d
+
Packit 7d6a7d
 : What should the include directory be ?
Packit 7d6a7d
 echo " "
Packit 7d6a7d
 $echo $n "Hmm...  $c"
Packit 7d6a7d
END
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub patch_makedepend_lc
Packit 7d6a7d
{
Packit 7d6a7d
  patch(<<'END');
Packit 7d6a7d
--- makedepend.SH
Packit 7d6a7d
+++ makedepend.SH
Packit 7d6a7d
@@ -58,6 +58,10 @@ case $PERL_CONFIG_SH in
Packit 7d6a7d
       ;;
Packit 7d6a7d
 esac
Packit 7d6a7d
 
Packit 7d6a7d
+# Avoid localized gcc/cc messages
Packit 7d6a7d
+LC_ALL=C
Packit 7d6a7d
+export LC_ALL
Packit 7d6a7d
+
Packit 7d6a7d
 # We need .. when we are in the x2p directory if we are using the
Packit 7d6a7d
 # cppstdin wrapper script.
Packit 7d6a7d
 # Put .. and . first so that we pick up the present cppstdin, not
Packit 7d6a7d
END
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub patch
Packit 7d6a7d
{
Packit 7d6a7d
  my($patch) = @_;
Packit 7d6a7d
  print "patching $_\n" for $patch =~ /^\+{3}\s+(\S+)/gm;
Packit 7d6a7d
  my $diff = 'tmp.diff';
Packit 7d6a7d
  write_or_die($diff, $patch);
Packit 7d6a7d
  run_or_die("patch -s -p0 <$diff");
Packit 7d6a7d
  unlink $diff or die "unlink $diff: $!\n";
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub write_or_die
Packit 7d6a7d
{
Packit 7d6a7d
  my($file, $data) = @_;
Packit 7d6a7d
  my $fh = new IO::File ">$file" or die "$file: $!\n";
Packit 7d6a7d
  $fh->print($data);
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub run_or_die
Packit 7d6a7d
{
Packit 7d6a7d
  # print "[running @_]\n";
Packit 7d6a7d
  system "@_" and die "@_: $?\n";
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
sub run
Packit 7d6a7d
{
Packit 7d6a7d
  # print "[running @_]\n";
Packit 7d6a7d
  system "@_" and warn "@_: $?\n";
Packit 7d6a7d
}
Packit 7d6a7d
Packit 7d6a7d
__END__
Packit 7d6a7d
Packit 7d6a7d
=head1 NAME
Packit 7d6a7d
Packit 7d6a7d
buildperl.pl - build/install perl distributions
Packit 7d6a7d
Packit 7d6a7d
=head1 SYNOPSIS
Packit 7d6a7d
Packit 7d6a7d
  perl buildperl.pl [options]
Packit 7d6a7d
Packit 7d6a7d
  --help                      show this help
Packit 7d6a7d
Packit 7d6a7d
  --source=directory          directory containing source tarballs
Packit 7d6a7d
                              [default: /tmp/perl/source]
Packit 7d6a7d
Packit 7d6a7d
  --build=directory           directory used for building perls [EXPAND]
Packit 7d6a7d
                              [default: /tmp/perl/build/<config>]
Packit 7d6a7d
Packit 7d6a7d
  --prefix=directory          use this installation prefix [EXPAND]
Packit 7d6a7d
                              [default: /tmp/perl/install/<config>/<perl>]
Packit 7d6a7d
Packit 7d6a7d
  --config=configuration      build this configuration [MULTI]
Packit 7d6a7d
                              [default: all possible configurations]
Packit 7d6a7d
Packit 7d6a7d
  --perl=version              build this version of perl [MULTI]
Packit 7d6a7d
                              [default: all possible versions]
Packit 7d6a7d
Packit 7d6a7d
  --force                     rebuild and install already installed versions
Packit 7d6a7d
Packit 7d6a7d
  --test                      run test suite after building
Packit 7d6a7d
Packit 7d6a7d
  --noinstall                 don't install after building
Packit 7d6a7d
Packit 7d6a7d
  --patch                     only patch the perl source in the current directory
Packit 7d6a7d
Packit 7d6a7d
  --oneshot                   build from the perl source in the current directory
Packit 7d6a7d
                              (extra arguments are passed to Configure)
Packit 7d6a7d
Packit 7d6a7d
  options tagged with [MULTI] can be given multiple times
Packit 7d6a7d
Packit 7d6a7d
  options tagged with [EXPAND] expand the following items
Packit 7d6a7d
Packit 7d6a7d
    <perl>      versioned perl directory  (e.g. 'perl-5.6.1')
Packit 7d6a7d
    <version>   perl version              (e.g. '5.6.1')
Packit 7d6a7d
    <config>    name of the configuration (e.g. 'default')
Packit 7d6a7d
Packit 7d6a7d
=head1 EXAMPLES
Packit 7d6a7d
Packit 7d6a7d
The following examples assume that your Perl source tarballs are
Packit 7d6a7d
in F</tmp/perl/source>. If they are somewhere else, use the C<--source>
Packit 7d6a7d
option to specify a different source directory.
Packit 7d6a7d
Packit 7d6a7d
To build a default configuration of perl5.004_05 and install it
Packit 7d6a7d
to F</opt/perl5.004_05>, you would say:
Packit 7d6a7d
Packit 7d6a7d
  buildperl.pl --prefix='/opt/<perl>' --perl=5.004_05 --config=default
Packit 7d6a7d
Packit 7d6a7d
To build debugging configurations of all perls in the source directory
Packit 7d6a7d
and install them to F</opt>, use:
Packit 7d6a7d
Packit 7d6a7d
  buildperl.pl --prefix='/opt/<perl>' --config=debug
Packit 7d6a7d
Packit 7d6a7d
To build all configurations for perl-5.8.5 and perl-5.8.6, test them
Packit 7d6a7d
and don't install them, run:
Packit 7d6a7d
Packit 7d6a7d
  buildperl.pl --perl=5.8.5 --perl=5.8.6 --test --noinstall
Packit 7d6a7d
Packit 7d6a7d
To build and install a single version of perl with special configuration
Packit 7d6a7d
options, use:
Packit 7d6a7d
Packit 7d6a7d
  buildperl.pl --perl=5.6.0 --prefix=/opt/p560ld --oneshot -- -des -Duselongdouble
Packit 7d6a7d
Packit 7d6a7d
=head1 COPYRIGHT
Packit 7d6a7d
Packit 7d6a7d
Copyright (c) 2004-2013, Marcus Holland-Moritz.
Packit 7d6a7d
Packit 7d6a7d
This program is free software; you can redistribute it and/or
Packit 7d6a7d
modify it under the same terms as Perl itself.
Packit 7d6a7d
Packit 7d6a7d
=head1 SEE ALSO
Packit 7d6a7d
Packit 7d6a7d
See L<Devel::PPPort> and L<HACKERS>.