remove defunct "Changes" file step from RMG
[p5sagit/p5-mst-13.2.git] / Porting / makerel
CommitLineData
23b3bd7f 1#!/usr/bin/perl -w
08aa1457 2
63d690b1 3# A tool to build a perl release tarball
08aa1457 4# Very basic but functional - if you're on a unix system.
08aa1457 5#
6# No matter how automated this gets, you'll always need to read
63d690b1 7# and re-read pumpkin.pod and release_managers_guide.pod to
8# check for things to be done at various stages of the process.
08aa1457 9#
10# Tim Bunce, June 1997
11
12use ExtUtils::Manifest qw(fullcheck);
5f244db9 13$ExtUtils::Manifest::Quiet = 1;
14use Getopt::Std;
08aa1457 15
16$|=1;
5f244db9 17
18sub usage { die <<EOF; }
85bdf03b 19usage: $0 [ -r rootdir ] [-s suffix ] [ -b ]
5f244db9 20 -r rootdir directory under which to create the build dir and tarball
21 defaults to '..'
22 -s suffix suffix to append to to the perl-x.y.z dir and tarball name
23 defaults to the concatenaion of the local_patches entry
24 in patchlevel.h (or blank, if none)
85bdf03b 25 -b make a .bz2 file in addtion to a .gz file
5f244db9 26EOF
27
28my %opts;
85bdf03b 29getopts('br:s:', \%opts) or usage;
5f244db9 30@ARGV && usage;
31
32$relroot = defined $opts{r} ? $opts{r} : "..";
08aa1457 33
34die "Must be in root of the perl source tree.\n"
35 unless -f "./MANIFEST" and -f "patchlevel.h";
36
3ffabb8c 37open PATCHLEVEL,"<patchlevel.h" or die;
38my @patchlevel_h = <PATCHLEVEL>;
39close PATCHLEVEL;
d4257220 40my $patchlevel_h = join "", grep { /^#\s*define/ } @patchlevel_h;
08aa1457 41print $patchlevel_h;
93136620 42$revision = $1 if $patchlevel_h =~ /PERL_REVISION\s+(\d+)/;
d4257220 43$patchlevel = $1 if $patchlevel_h =~ /PERL_VERSION\s+(\d+)/;
44$subversion = $1 if $patchlevel_h =~ /PERL_SUBVERSION\s+(\d+)/;
55d729e4 45die "Unable to parse patchlevel.h" unless $subversion >= 0;
93136620 46$vers = sprintf("%d.%d.%d", $revision, $patchlevel, $subversion);
08aa1457 47
3ffabb8c 48# fetch list of local patches
49my (@local_patches, @lpatch_tags, $lpatch_tags);
50@local_patches = grep { /^static.*local_patches/../^};/ } @patchlevel_h;
51@local_patches = grep { !/^\s*,?NULL/ } @local_patches;
52@lpatch_tags = map { /^\s*,"(\w+)/ } @local_patches;
53$lpatch_tags = join "-", @lpatch_tags;
54
2a7df08c 55$perl = "perl-$vers";
f27ffc4a 56$reldir = "$perl";
5f244db9 57
58$lpatch_tags = $opts{s} if defined $opts{s};
3ffabb8c 59$reldir .= "-$lpatch_tags" if $lpatch_tags;
08aa1457 60
f27ffc4a 61print "\nMaking a release for $perl in $relroot/$reldir\n\n";
08aa1457 62
08aa1457 63print "Cross-checking the MANIFEST...\n";
64($missfile, $missentry) = fullcheck();
37d29c6f 65@$missentry
66 = grep {$_ !~ m!^\.git/! and $_ !~ m!(?:/|^)\.gitignore!} @$missentry;
9b05e874 67if (@$missfile ) {
68 warn "Can't make a release with MANIFEST files missing:\n";
69 warn "\t".$_."\n" for (@$missfile);
70}
71if (@$missentry ) {
72 warn "Can't make a release with files not listed in MANIFEST\n";
73 warn "\t".$_."\n" for (@$missentry);
74
75}
90248788 76if ("@$missentry" =~ m/\.orig\b/) {
77 # Handy listing of find command and .orig files from patching work.
78 # I tend to run 'xargs rm' and copy and paste the file list.
79 my $cmd = "find . -name '*.orig' -print";
80 print "$cmd\n";
81 system($cmd);
82}
3e3baf6d 83die "Aborted.\n" if @$missentry or @$missfile;
08aa1457 84print "\n";
85
b59922b7 86# VMS no longer has hardcoded version numbers descrip.mms
48e117bb 87
88print "Creating $relroot/$reldir release directory...\n";
89die "$relroot/$reldir release directory already exists\n" if -e "$relroot/$reldir";
90die "$relroot/$reldir.tar.gz release file already exists\n" if -e "$relroot/$reldir.tar.gz";
91mkdir("$relroot/$reldir", 0755) or die "mkdir $relroot/$reldir: $!\n";
92print "\n";
93
94
95print "Copying files to release directory...\n";
96# ExtUtils::Manifest maniread does not preserve the order
97$cmd = "awk '{print \$1}' MANIFEST | cpio -pdm $relroot/$reldir";
86cd7d77 98system($cmd) == 0
99 or die "$cmd failed";
48e117bb 100print "\n";
101
6e24577b 102chdir "$relroot/$reldir" or die $!;
48e117bb 103
d38b68fe 104
105my $SEARCH_ROOTS = 't ext lib dist cpan';
106
08aa1457 107print "Setting file permissions...\n";
bf955a65 108system("find . -type f -print | xargs chmod 0444");
109system("find . -type d -print | xargs chmod 0755");
d38b68fe 110system("find $SEARCH_ROOTS -name '*.t' -print | xargs chmod +x");
111system("find $SEARCH_ROOTS -name 'test.pl' -print | xargs chmod +x");
48e117bb 112my @exe = qw(
08aa1457 113 Configure
114 configpm
b907dc6d 115 configure.gnu
08aa1457 116 embed.pl
117 installperl
118 installman
119 keywords.pl
08aa1457 120 opcode.pl
08aa1457 121 t/TEST
08aa1457 122 *.SH
08aa1457 123 vms/ext/filespec.t
08aa1457 124 x2p/*.SH
bb304ec8 125 Porting/findrfuncs
126 Porting/genlog
08aa1457 127 Porting/makerel
bb304ec8 128 Porting/*.pl
e619572c 129 mpeix/nm
130 mpeix/relink
26e23ede 131 Cross/generate_config_sh
132 Cross/warp
08aa1457 133);
86cd7d77 134system("chmod +x @exe") == 0
135 or die "system: $!";
6e24577b 136
f7f713ed 137my @writables = qw(
f3513db0 138 NetWare/config_H.wc
139 NetWare/Makefile
ac634a9a 140 keywords.h
141 opcode.h
142 opnames.h
143 pp_proto.h
144 pp.sym
145 proto.h
f7f713ed 146 embed.h
147 embedvar.h
f7f713ed 148 global.sym
e9e0c7d0 149 overload.c
150 overload.h
ac634a9a 151 perlapi.h
152 perlapi.c
b2861970 153 cpan/Devel-PPPort/module2.c
154 cpan/Devel-PPPort/module3.c
e9e0c7d0 155 reentr.c
156 reentr.h
157 regcharclass.h
f7f713ed 158 regnodes.h
0ebdc6d5 159 warnings.h
ac634a9a 160 lib/warnings.pm
ac634a9a 161 win32/Makefile
f78a30ba 162 win32/Makefile.ce
ac634a9a 163 win32/makefile.mk
164 win32/config_H.bc
f29c64d6 165 win32/config_H.gc
f7f713ed 166 win32/config_H.vc
61190116 167 utils/Makefile
18b94d96 168 uconfig.h
f7f713ed 169);
86cd7d77 170system("chmod +w @writables") == 0
171 or die "system: $!";
f7f713ed 172
6e24577b 173chdir ".." or die $!;
174
f27ffc4a 175my $src = (-e $perl) ? $perl : 'perl'; # 'perl' in maint branch
85bdf03b 176
177print "Creating and compressing the tar.gz file...\n";
3ffabb8c 178$cmd = "tar cf - $reldir | gzip --best > $reldir.tar.gz";
85bdf03b 179system($cmd) == 0 or die "$cmd failed";
08aa1457 180
85bdf03b 181if ($opts{b}) {
182 print "Creating and compressing the tar.bz2 file...\n";
183 $cmd = "tar cf - $reldir | bzip2 > $reldir.tar.bz2";
184 system($cmd) == 0 or die "$cmd failed";
185}
186
187print "\n";
9b05e874 188
ecc9c9d9 189system("ls -ld $perl*");
190print "\n";
191
192for my $sha (qw(sha1 shasum sha1sum)) {
193 if (`which $sha 2>/dev/null`) {
194 system("$sha $perl*.tar.*");
195 last;
196 }
9b05e874 197}