diff --git a/Releases.yaml b/Releases.yaml new file mode 100644 index 0000000..73319f9 --- /dev/null +++ b/Releases.yaml @@ -0,0 +1,9 @@ +releases: + - version: 5.18.4 + sha1: 69c34558a0a939a7adbbc1de48c06ea418d81e27 + pause: RJBS + extra_flags: "-A ccflags=-fwrapv" + + - version: 5.20.1 + sha1: cd424d1520ba2686fe5d4422565aaf880e9467f6 + pause: SHAY diff --git a/generate.pl b/generate.pl new file mode 100755 index 0000000..4079113 --- /dev/null +++ b/generate.pl @@ -0,0 +1,137 @@ +#!/usr/bin/env perl +use v5.20; +use strict; +use warnings; +use YAML::XS; + +sub die_with_sample { + die <; +}; + +my $template = do { + local $/; + ; +}; + +my %builds = ( + "64bit" => "-Duse64bitall", + "64bit,threaded" => "-Dusethreads -Duse64bitall", +); + +die_with_sample unless defined $yaml->{releases}; +die_with_sample unless ref $yaml->{releases} eq "ARRAY"; + +for my $release (@{$yaml->{releases}}) { + do { die_with_sample unless $release->{$_}} for (qw(version pause sha1)); + $release->{pause} =~ s#(((.).).*)#$3/$2/$1#; + $release->{extra_flags} = "" unless defined $release->{extra_flags}; + + for my $config (keys %builds) { + my $output = $template; + $output =~ s/{{$_}}/$release->{$_}/mg for (qw(version pause extra_flags)); + $output =~ s/{{args}}/$builds{$config}/mg; + + my $dir = sprintf "%i.%03i.%03i-%s", + ($release->{version} =~ /(\d+)\.(\d+)\.(\d+)/), + $config; + + open my $sha1, ">$dir/sha1.txt" or die "Couldn't open $dir/sha1.txt for writing"; + print $sha1 "$release->{sha1} perl-$release->{version}.tar.bz2\n"; + close $sha1; + + open my $dockerfile, ">$dir/Dockerfile" or die "Couldn't open $dir/Dockerfile for writing"; + print $dockerfile $output; + close $dockerfile; + } +} + +=pod + +=head1 NAME + +generate.pl + +=head1 SYNOPSIS + +generate.pl is a little helper script to reinitalize the Dockerfiles from a YAML file. + +=head1 DESCRIPTION + +generate.pl is meant to be run from the actual repo directory, with a Releases.yaml file +correctly configured. It starts with a 'releases' key, which contains a list of releases, +each with the following keys: + +=over 4 + +=item version + +The actual perl version, such as B<5.20.1>. + +=item sha1 + +The SHA-1 of the C<.tar.bz2> file for that release. + +=item pause + +The PAUSE (CPAN user) account that the release was uploaded to. + +=item (optionally) extra_args + +Additional text to pass to C. At the moment, this is necessary for +5.18.x so that it can get the C<-fwrapv> flag. + +=back + +=cut + +__DATA__ +FROM buildpack-deps +MAINTAINER Peter Martini + +RUN apt-get update && apt-get install -y curl procps + +RUN mkdir /usr/src/perl +WORKDIR /usr/src/perl + +COPY sha1.txt /tmp/sha1.txt +RUN curl -SL https://cpan.metacpan.org/authors/id/{{pause}}/perl-{{version}}.tar.bz2 -o perl-{{version}}.tar.bz2 \ + && sha1sum -c /tmp/sha1.txt \ + && tar --strip-components=1 -xjf perl-{{version}}.tar.bz2 -C /usr/src/perl \ + && rm perl-{{version}}.tar.bz2 /tmp/sha1.txt + +RUN ./Configure {{args}} {{extra_flags}} -des \ + && make -j$(nproc) \ + && TEST_JOBS=$(nproc) make test_harness \ + && make install \ + && make veryclean + +WORKDIR /usr/src +RUN curl -LO https://raw.githubusercontent.com/miyagawa/cpanminus/master/cpanm \ + && chmod +x cpanm \ + && ./cpanm App::cpanminus \ + && rm ./cpanm + +WORKDIR /root + +CMD ["perl{{version}}","-de0"]