1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
#!/usr/bin/perl -w
# A first attempt at some automated support for making a perl release.
# Very basic but functional - if you're on a unix system.
#
# No matter how automated this gets, you'll always need to read
# and re-read pumpkin.pod checking for things to be done at various
# stages of the process.
#
# Tim Bunce, June 1997
use ExtUtils::Manifest qw(fullcheck);
$|=1;
$relroot = ".."; # XXX make an option
die "Must be in root of the perl source tree.\n"
unless -f "./MANIFEST" and -f "patchlevel.h";
open PATCHLEVEL,"<patchlevel.h" or die;
my @patchlevel_h = <PATCHLEVEL>;
close PATCHLEVEL;
my $patchlevel_h = join "", grep { /^#\s*define/ } @patchlevel_h;
print $patchlevel_h;
$revision = $1 if $patchlevel_h =~ /PERL_REVISION\s+(\d+)/;
$patchlevel = $1 if $patchlevel_h =~ /PERL_VERSION\s+(\d+)/;
$subversion = $1 if $patchlevel_h =~ /PERL_SUBVERSION\s+(\d+)/;
die "Unable to parse patchlevel.h" unless $subversion >= 0;
$vers = sprintf("%d.%d.%d", $revision, $patchlevel, $subversion);
$vms_vers = sprintf("%d_%d_%d", $revision, $patchlevel, $subversion);
# fetch list of local patches
my (@local_patches, @lpatch_tags, $lpatch_tags);
@local_patches = grep { /^static.*local_patches/../^};/ } @patchlevel_h;
@local_patches = grep { !/^\s*,?NULL/ } @local_patches;
@lpatch_tags = map { /^\s*,"(\w+)/ } @local_patches;
$lpatch_tags = join "-", @lpatch_tags;
$perl = "perl-$vers";
$reldir = "$perl";
$reldir .= "-$lpatch_tags" if $lpatch_tags;
print "\nMaking a release for $perl in $relroot/$reldir\n\n";
print "Cross-checking the MANIFEST...\n";
($missfile, $missentry) = fullcheck();
warn "Can't make a release with MANIFEST files missing.\n" if @$missfile;
warn "Can't make a release with files not listed in MANIFEST.\n" if @$missentry;
if ("@$missentry" =~ m/\.orig\b/) {
# Handy listing of find command and .orig files from patching work.
# I tend to run 'xargs rm' and copy and paste the file list.
my $cmd = "find . -name '*.orig' -print";
print "$cmd\n";
system($cmd);
}
die "Aborted.\n" if @$missentry or @$missfile;
print "\n";
# VMS no longer has hardcoded version numbers descrip.mms
#print "Updating VMS version specific files with $vms_vers...\n";
#system("perl -pi -e 's/^\QPERL_VERSION = \E\d\_\d+(\s*\#)/PERL_VERSION = $vms_vers$1/' vms/descrip.mms");
print "Creating $relroot/$reldir release directory...\n";
die "$relroot/$reldir release directory already exists\n" if -e "$relroot/$reldir";
die "$relroot/$reldir.tar.gz release file already exists\n" if -e "$relroot/$reldir.tar.gz";
mkdir("$relroot/$reldir", 0755) or die "mkdir $relroot/$reldir: $!\n";
print "\n";
print "Copying files to release directory...\n";
# ExtUtils::Manifest maniread does not preserve the order
$cmd = "awk '{print \$1}' MANIFEST | cpio -pdm $relroot/$reldir";
system($cmd) == 0
or die "$cmd failed";
print "\n";
chdir "$relroot/$reldir" or die $!;
print "Setting file permissions...\n";
system("find . -type f -print | xargs chmod 0444");
system("find . -type d -print | xargs chmod 0755");
system("find t ext lib -name '*.t' -print | xargs chmod +x");
system("find t ext lib -name 'test.pl' -print | xargs chmod +x");
my @exe = qw(
Configure
configpm
configure.gnu
embed.pl
installperl
installman
keywords.pl
opcode.pl
perly.fixer
t/TEST
*.SH
vms/ext/Stdio/test.pl
vms/ext/filespec.t
x2p/*.SH
Porting/findrfuncs
Porting/genlog
Porting/makerel
Porting/p4genpatch
Porting/patchls
Porting/*.pl
mpeix/nm
mpeix/relink
Cross/generate_config_sh
Cross/warp
);
system("chmod +x @exe") == 0
or die "system: $!";
my @writables = qw(
NetWare/config_H.wc
NetWare/Makefile
keywords.h
opcode.h
opnames.h
pp_proto.h
pp.sym
proto.h
embed.h
embedvar.h
global.sym
pod/perlintern.pod
pod/perlapi.pod
perlapi.h
perlapi.c
ext/ByteLoader/byterun.h
ext/ByteLoader/byterun.c
ext/B/B/Asmdata.pm
ext/Devel/PPPort/PPPort.xs
ext/Devel/PPPort/module2.c
ext/Devel/PPPort/module3.c
regnodes.h
warnings.h
lib/warnings.pm
vms/perly_c.vms
vms/perly_h.vms
win32/Makefile
win32/makefile.mk
win32/config_H.bc
win32/config_H.gc
win32/config_H.vc
wince/config_H.ce
wince/Makefile.ce
);
system("chmod +w @writables") == 0
or die "system: $!";
print "Adding CRs to DOSish files...\n";
my @crlf = qw(
djgpp/configure.bat
README.ce
README.dos
README.win32
win32/Makefile
win32/makefile.mk
wince/Makefile.ce
wince/compile-all.bat
wince/README.perlce
wince/registry.bat
);
system("perl -pi -e 's/\\015*\\012/\\015\\012/' @crlf") == 0
or die "system: $!";
print "\n";
chdir ".." or die $!;
print "Creating and compressing the tar file...\n";
my $src = (-e $perl) ? $perl : 'perl'; # 'perl' in maint branch
$cmd = "tar cf - $reldir | gzip --best > $reldir.tar.gz";
system($cmd) == 0
or die "$cmd failed";
print "\n";
system("ls -ld $perl*");
|