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.gz> <doc.tar.gz> [<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.in' ".
33 "'\*/src/packaging/RedHat' > /dev/null")==0
34 or die "Unable to unpack src tar ball\n";
36 my $dirh = IO::Dir->new($tmpdir);
38 while (defined($vdir = $dirh->read) && $vdir=~/^\./) {};
40 die "Unable to find unpacked source code\n" if !$vdir;
42 my $srcdir = $tmpdir."/".$vdir;
44 # Work out which version we're dealing with from the configure.in file
48 my $fh = new IO::File $srcdir."/configure.in"
49 or die "Unable to find unpacked configure.in file";
51 if (/AM_INIT_AUTOMAKE\(openafs,(.*)\)/) {
55 if (/LINUX_PKGVER=(.*)/) {
59 if (/LINUX_PKGREL=(.*)/) {
68 print "Building version $afsversion\n";
69 File::Path::mkpath([ $tmpdir."/rpmdir/SPECS",
70 $tmpdir."/rpmdir/SRPMS",
71 $tmpdir."/rpmdir/SOURCES"], 0, 0755);
73 File::Copy::copy($srcball,
74 $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-src.tar.bz2")
75 or die "Unable to copy $srcball into position\n";
77 File::Copy::copy($docball,
78 $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-doc.tar.bz2")
79 or die "Unable to copy $docball into position\n";
81 # Populate it with all the stuff in the packaging directory, except the
83 my $pkgdirh = IO::Dir->new($srcdir."/src/packaging/RedHat")
84 or die "Unable to find RedHat packaging directory\n";
86 while (defined($file = $pkgdirh->read)) {
87 if (-f $srcdir."/src/packaging/RedHat/".$file) {
88 next if $file eq "openafs.spec.in";
90 print "Copying $file into place\n";
91 File::Copy::copy($srcdir."/src/packaging/RedHat/".$file,
92 $tmpdir."/rpmdir/SOURCES/".$file);
97 # Some files need particular modes.
98 chmod 0755, $tmpdir."/rpmdir/SOURCES/openafs-kernel-version.sh";
99 chmod 0755, $tmpdir."/rpmdir/SOURCES/openafs-kvers-is.sh";
101 # Create the specfile. Use sed for this, cos its easier
102 system("cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in | ".
103 "sed -e 's/\@VERSION\@/$afsversion/g' ".
104 " -e 's/\@LINUX_PKGVER\@/$linuxver/g' ".
105 " -e 's/\@LINUX_PKGREL\@/$linuxrel/g' ".
106 " -e 's/\%define afsvers.*/%define afsvers $afsversion/g' ".
107 " -e 's/\%define pkgvers.*/%define pkgvers $linuxver/g' > ".
108 $tmpdir."/rpmdir/SPECS/openafs.spec") == 0
109 or die "sed failed : $!\n";
112 File::Copy::copy($cellservdb,
113 $tmpdir."/rpmdir/SOURCES/$cellservdb")
114 or die "Unable to copy $cellservdb into position\n";
116 system("cd ".$tmpdir."/rpmdir/SOURCES && wget `cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in |grep dl/cellservdb |awk '{print \$2}'`")
120 File::Copy::copy($relnotes,
121 $tmpdir."/rpmdir/SOURCES/RELNOTES-$afsversion")
122 or die "Unable to copy $relnotes into position\n";
124 print "WARNING: No release notes provided. Using empty file\n";
125 system("touch $tmpdir/rpmdir/SOURCES/RELNOTES-$afsversion");
129 File::Copy::copy($changelog,
130 $tmpdir."/rpmdir/SOURCES/ChangeLog")
131 or die "Unable to copy $changelog into position\n";
133 print "WARNING: No changelog provided. Using empty file\n";
134 system("touch $tmpdir/rpmdir/SOURCES/ChangeLog");
138 system("rpmbuild -bs --define \"_topdir $tmpdir/rpmdir\" ".
139 "$tmpdir/rpmdir/SPECS/openafs.spec > /dev/null") == 0
140 or die "rpmbuild failed : $!\n";
142 # Copy it out to somewhere useful
143 File::Copy::copy("$tmpdir/rpmdir/SRPMS/openafs-$linuxver-1.$linuxrel.src.rpm",
144 "openafs-$linuxver-1.$linuxrel.src.rpm")
145 or die "Unable to copy output RPM : $!\n";
147 print "SRPM is openafs-$linuxver-1.$linuxrel.src.rpm\n";