Import Upstream version 1.8.5
[hcoop/debian/openafs.git] / src / packaging / RedHat / makesrpm.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use IO::Dir;
7 use IO::File;
8 use File::Path;
9 use File::Copy;
10 use File::Temp;
11
12 # Build an SRPM for OpenAFS, given a src and doc tarball, release notes,
13 # and ChangeLog.
14
15 my $srcball = shift;
16 my $docball = shift;
17 my $relnotes = shift;
18 my $changelog = shift;
19 my $cellservdb = shift;
20
21 if (!$srcball && !$docball) {
22 printf "Usage: makesrpm <src.tar.bz2> <doc.tar.bz2> [<relnotes> [<changelog> [<cellservdb>]]]\n";
23 exit(1);
24 }
25
26 if (! -f $srcball) {
27 die "Unable to open $srcball\n";
28 }
29
30 my $tmpdir = File::Temp::tempdir(CLEANUP => 1);
31
32 system("tar -C $tmpdir -xvjf $srcball '\*/configure.ac' ".
33 "'\*/src/packaging/RedHat' ".
34 "'\*/.version' ".
35 "'\*/build-tools' > /dev/null")==0
36 or die "Unable to unpack src tar ball\n";
37
38 my $dirh = IO::Dir->new($tmpdir);
39 my $vdir;
40 while (defined($vdir = $dirh->read) && $vdir=~/^\./) {};
41
42 die "Unable to find unpacked source code\n" if !$vdir;
43
44 my $srcdir = $tmpdir."/".$vdir;
45
46 # Work out which version we're dealing with from git-version script
47 # (which may use a .version file)
48 my $afsversion;
49 my $linuxver;
50 my $linuxrel;
51
52 if (not defined($afsversion)) {
53 $afsversion = `"/bin/sh" "$srcdir/build-tools/git-version" "$srcdir"`;
54 }
55
56 # Build the Linux version and release information from the package version
57 # We need to handle a number of varieties of package version -
58 # Normal: 1.7.0
59 # Prereleases: 1.7.0pre1
60 # Development trees: 1.7.0dev
61 # and RPMS which are built from trees midway between heads, such as
62 # 1.7.0-45-gabcdef or 1.7.0pre1-37-g12345 or 1.7.0dev-56-g98765
63
64 if ($afsversion=~m/(.*)(pre[0-9]+)/) {
65 $linuxver=$1;
66 $linuxrel="0.$2";
67 } elsif ($afsversion=~m/(.*)dev/) {
68 $linuxver=$1;
69 $linuxrel="0.dev";
70 } else {
71 $linuxver=$afsversion;
72 $linuxrel=1;
73 }
74
75 if ($afsversion=~m/(.*)-([0-9]+)-(g[a-f0-9]+)$/) {
76 $linuxver = $1 if ($linuxver eq $afsversion);
77 $linuxrel.=".$2.$3";
78 }
79
80 print "Linux release is $linuxrel\n";
81 print "Linux version is $linuxver\n";
82
83 # Figure out a major, minor and release so that we know which version we're
84 # building, and therefore what the srpm is going to be called
85 $linuxver=~/([0-9]+)\.([0-9]+)\.([0-9]+)/;
86 my $major = $1;
87 my $minor = $2;
88 my $patchlevel = $3;
89
90 # Build the RPM root
91
92 print "Building version $afsversion\n";
93 File::Path::mkpath([ $tmpdir."/rpmdir/SPECS",
94 $tmpdir."/rpmdir/SRPMS",
95 $tmpdir."/rpmdir/SOURCES"], 0, 0755);
96
97 File::Copy::copy($srcball,
98 $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-src.tar.bz2")
99 or die "Unable to copy $srcball into position\n";
100
101 File::Copy::copy($docball,
102 $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-doc.tar.bz2")
103 or die "Unable to copy $docball into position\n";
104
105 # Populate it with all the stuff in the packaging directory, except the
106 # specfile
107 my $pkgdirh = IO::Dir->new($srcdir."/src/packaging/RedHat")
108 or die "Unable to find RedHat packaging directory\n";
109 my $file;
110 while (defined($file = $pkgdirh->read)) {
111 if (-f $srcdir."/src/packaging/RedHat/".$file) {
112 next if $file eq "openafs.spec.in";
113
114 print "Copying $file into place\n";
115 File::Copy::copy($srcdir."/src/packaging/RedHat/".$file,
116 $tmpdir."/rpmdir/SOURCES/".$file);
117 }
118 }
119 undef $dirh;
120
121 # This file needs particular modes.
122 chmod 0755, $tmpdir."/rpmdir/SOURCES/openafs-kvers-is.sh";
123
124 # Create the specfile. Use sed for this, cos its easier
125 system("cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in | ".
126 "sed -e 's/\@VERSION\@/$afsversion/g' ".
127 " -e 's/\@LINUX_PKGVER\@/$linuxver/g' ".
128 " -e 's/\@LINUX_PKGREL\@/$linuxrel/g' ".
129 " -e 's/\%define afsvers.*/%define afsvers $afsversion/g' ".
130 " -e 's/\%define pkgvers.*/%define pkgvers $linuxver/g' > ".
131 $tmpdir."/rpmdir/SPECS/openafs.spec") == 0
132 or die "sed failed : $!\n";
133
134 if ($cellservdb) {
135 File::Copy::copy($cellservdb,
136 $tmpdir."/rpmdir/SOURCES/$cellservdb")
137 or die "Unable to copy $cellservdb into position\n";
138 } else {
139 system("cd ".$tmpdir."/rpmdir/SOURCES && wget `cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in |grep dl/cellservdb |awk '{print \$2}'`")
140 }
141
142 if ($relnotes) {
143 File::Copy::copy($relnotes,
144 $tmpdir."/rpmdir/SOURCES/RELNOTES-$afsversion")
145 or die "Unable to copy $relnotes into position\n";
146 } else {
147 print "WARNING: No release notes provided. Using empty file\n";
148 system("touch $tmpdir/rpmdir/SOURCES/RELNOTES-$afsversion");
149 }
150
151 if ($changelog) {
152 File::Copy::copy($changelog,
153 $tmpdir."/rpmdir/SOURCES/ChangeLog")
154 or die "Unable to copy $changelog into position\n";
155 } else {
156 print "WARNING: No changelog provided. Using empty file\n";
157 system("touch $tmpdir/rpmdir/SOURCES/ChangeLog");
158 }
159
160 # Build an RPM
161 system("rpmbuild -bs --nodeps --define \"dist %undefined\" ".
162 "--define \"build_modules 0\" ".
163 "--define \"_topdir $tmpdir/rpmdir\" ".
164 "$tmpdir/rpmdir/SPECS/openafs.spec > /dev/null") == 0
165 or die "rpmbuild failed : $!\n";
166
167 # Copy it out to somewhere useful
168 if (!defined($major) || $major > 1 || ($major == 1 && $minor >= 6)) {
169 File::Copy::copy("$tmpdir/rpmdir/SRPMS/openafs-$linuxver-$linuxrel.src.rpm",
170 "openafs-$linuxver-$linuxrel.src.rpm")
171 or die "Unable to copy output RPM : $!\n";
172
173 print "SRPM is openafs-$linuxver-$linuxrel.src.rpm\n";
174 } else {
175 File::Copy::copy("$tmpdir/rpmdir/SRPMS/openafs-$linuxver-1.$linuxrel.src.rpm",
176 "openafs-$linuxver-1.$linuxrel.src.rpm")
177 or die "Unable to copy output RPM : $!\n";
178
179 print "SRPM is openafs-$linuxver-1.$linuxrel.src.rpm\n";
180 }
181
182