12 # Build an SRPM for OpenAFS, given a src and doc tarball, release notes,
18 my $changelog = shift;
19 my $cellservdb = shift;
21 if (!$srcball && !$docball) {
22 printf "Usage: makesrpm <src.tar.bz2> <doc.tar.bz2> [<relnotes> [<changelog> [<cellservdb>]]]\n";
27 die "Unable to open $srcball\n";
30 my $tmpdir = File::Temp::tempdir(CLEANUP => 1);
32 system("tar -C $tmpdir -xvjf $srcball '\*/configure.ac' ".
33 "'\*/src/packaging/RedHat' ".
35 "'\*/build-tools' > /dev/null")==0
36 or die "Unable to unpack src tar ball\n";
38 my $dirh = IO::Dir->new($tmpdir);
40 while (defined($vdir = $dirh->read) && $vdir=~/^\./) {};
42 die "Unable to find unpacked source code\n" if !$vdir;
44 my $srcdir = $tmpdir."/".$vdir;
46 # Work out which version we're dealing with from the configure.ac file
50 my $fh = new IO::File $srcdir."/configure.ac"
51 or die "Unable to find unpacked configure.ac file";
55 if (/AM_INIT_AUTOMAKE\(openafs,(.*)\)/) {
59 if (/LINUX_PKGVER=(.*)/) {
63 if (/LINUX_PKGREL=(.*)/) {
70 if (not defined($afsversion)) {
71 $afsversion = `"$srcdir/build-tools/git-version" "$srcdir"`;
74 # Figure out a major, minor and release so that we know which version we're
75 # building, and therefore what the srpm is going to be called
76 $afsversion=~/([0-9]+)\.([0-9]+)\.([0-9]+)/;
83 print "Building version $afsversion\n";
84 File::Path::mkpath([ $tmpdir."/rpmdir/SPECS",
85 $tmpdir."/rpmdir/SRPMS",
86 $tmpdir."/rpmdir/SOURCES"], 0, 0755);
88 File::Copy::copy($srcball,
89 $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-src.tar.bz2")
90 or die "Unable to copy $srcball into position\n";
92 File::Copy::copy($docball,
93 $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-doc.tar.bz2")
94 or die "Unable to copy $docball into position\n";
96 # Populate it with all the stuff in the packaging directory, except the
98 my $pkgdirh = IO::Dir->new($srcdir."/src/packaging/RedHat")
99 or die "Unable to find RedHat packaging directory\n";
101 while (defined($file = $pkgdirh->read)) {
102 if (-f $srcdir."/src/packaging/RedHat/".$file) {
103 next if $file eq "openafs.spec.in";
105 print "Copying $file into place\n";
106 File::Copy::copy($srcdir."/src/packaging/RedHat/".$file,
107 $tmpdir."/rpmdir/SOURCES/".$file);
112 # Some files need particular modes.
113 chmod 0755, $tmpdir."/rpmdir/SOURCES/openafs-kernel-version.sh";
114 chmod 0755, $tmpdir."/rpmdir/SOURCES/openafs-kvers-is.sh";
116 # Create the specfile. Use sed for this, cos its easier
117 system("cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in | ".
118 "sed -e 's/\@VERSION\@/$afsversion/g' ".
119 " -e 's/\@LINUX_PKGVER\@/$linuxver/g' ".
120 " -e 's/\@LINUX_PKGREL\@/$linuxrel/g' ".
121 " -e 's/\%define afsvers.*/%define afsvers $afsversion/g' ".
122 " -e 's/\%define pkgvers.*/%define pkgvers $linuxver/g' > ".
123 $tmpdir."/rpmdir/SPECS/openafs.spec") == 0
124 or die "sed failed : $!\n";
127 File::Copy::copy($cellservdb,
128 $tmpdir."/rpmdir/SOURCES/$cellservdb")
129 or die "Unable to copy $cellservdb into position\n";
131 system("cd ".$tmpdir."/rpmdir/SOURCES && wget `cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in |grep dl/cellservdb |awk '{print \$2}'`")
135 File::Copy::copy($relnotes,
136 $tmpdir."/rpmdir/SOURCES/RELNOTES-$afsversion")
137 or die "Unable to copy $relnotes into position\n";
139 print "WARNING: No release notes provided. Using empty file\n";
140 system("touch $tmpdir/rpmdir/SOURCES/RELNOTES-$afsversion");
144 File::Copy::copy($changelog,
145 $tmpdir."/rpmdir/SOURCES/ChangeLog")
146 or die "Unable to copy $changelog into position\n";
148 print "WARNING: No changelog provided. Using empty file\n";
149 system("touch $tmpdir/rpmdir/SOURCES/ChangeLog");
153 system("rpmbuild -bs --define \"dist %undefined\" ".
154 "--define \"_topdir $tmpdir/rpmdir\" ".
155 "$tmpdir/rpmdir/SPECS/openafs.spec > /dev/null") == 0
156 or die "rpmbuild failed : $!\n";
158 # Copy it out to somewhere useful
159 if ($major > 1 || ($major == 1 && $minor >= 6)) {
160 File::Copy::copy("$tmpdir/rpmdir/SRPMS/openafs-$linuxver-$linuxrel.src.rpm",
161 "openafs-$linuxver-$linuxrel.src.rpm")
162 or die "Unable to copy output RPM : $!\n";
164 print "SRPM is openafs-$linuxver-$linuxrel.src.rpm\n";
166 File::Copy::copy("$tmpdir/rpmdir/SRPMS/openafs-$linuxver-1.$linuxrel.src.rpm",
167 "openafs-$linuxver-1.$linuxrel.src.rpm")
168 or die "Unable to copy output RPM : $!\n";
170 print "SRPM is openafs-$linuxver-1.$linuxrel.src.rpm\n";