makerel revision 1.4
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 a-w"); 82system("find . -type d -print | xargs chmod 0755"); 83 84# the right files should already have the execute bit set 85# in the repository, but this is just insurance 86system("find t -name '*.t' -print | xargs chmod a+x"); 87my @exe = qw( 88 Configure 89 configure.gnu 90 configpm 91 installperl 92 installhtml 93 installman 94 embed.pl 95 keywords.pl 96 opcode.pl 97 warnings.pl 98 perly.fixer 99 t/TEST 100 t/*/*.t 101 *.SH 102 vms/ext/Stdio/test.pl 103 vms/ext/*.t 104 x2p/*.SH 105 Porting/patchls 106 Porting/makerel 107); 108system("chmod +x @exe"); 109 110my @writables = qw( 111 keywords.h 112 opcode.h 113 opnames.h 114 pp_proto.h 115 pp.sym 116 proto.h 117 embed.h 118 embedvar.h 119 global.sym 120 pod/perlintern.pod 121 pod/perlapi.pod 122 objXSUB.h 123 perlapi.h 124 perlapi.c 125 ext/ByteLoader/byterun.h 126 ext/ByteLoader/byterun.c 127 ext/B/B/Asmdata.pm 128 regnodes.h 129 warnings.h 130 lib/warnings.pm 131 vms/perly_c.vms 132 vms/perly_h.vms 133 win32/Makefile 134 win32/makefile.mk 135 win32/config_H.bc 136 win32/config_H.bc 137 win32/config_H.gc 138 win32/config_H.vc 139); 140system("chmod +w @writables"); 141 142print "Adding CRs to DOSish files...\n"; 143my @crlf = qw( 144 djgpp/configure.bat 145 README.dos 146 README.win32 147 win32/Makefile 148 win32/makefile.mk 149); 150system("perl -pi -e 's/\$/\\r/' @crlf"); 151print "\n"; 152 153chdir ".." or die $!; 154 155print "Creating and compressing the tar file...\n"; 156my $src = (-e $perl) ? $perl : 'perl'; # 'perl' in maint branch 157$cmd = "tar cf - $reldir | gzip --best > $reldir.tar.gz"; 158system($cmd) == 0 or die "$cmd failed"; 159print "\n"; 160 161system("ls -ld $perl*"); 162