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