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: <version> <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
46 my $fh = new IO::File $srcdir."/configure.in"
47 or die "Unable to find unpacked configure.in file";
49 if (/AM_INIT_AUTOMAKE\(openafs,(.*)\)/) {
58 print "Building version $version\n";
59 File::Path::mkpath([ $tmpdir."/rpmdir/SPECS",
60 $tmpdir."/rpmdir/SRPMS",
61 $tmpdir."/rpmdir/SOURCES"], 0, 0755);
63 File::Copy::copy($srcball,
64 $tmpdir."/rpmdir/SOURCES/openafs-$version-src.tar.bz2")
65 or die "Unable to copy $srcball into position\n";
67 File::Copy::copy($docball,
68 $tmpdir."/rpmdir/SOURCES/openafs-$version-doc.tar.bz2")
69 or die "Unable to copy $docball into position\n";
71 # Populate it with all the stuff in the packaging directory, except the
73 my $pkgdirh = IO::Dir->new($srcdir."/src/packaging/RedHat")
74 or die "Unable to find RedHat packaging directory\n";
76 while (defined($file = $pkgdirh->read)) {
77 if (-f $srcdir."/src/packaging/RedHat/".$file) {
78 next if $file eq "openafs.spec.in";
80 print "Copying $file into place\n";
81 File::Copy::copy($srcdir."/src/packaging/RedHat/".$file,
82 $tmpdir."/rpmdir/SOURCES/".$file);
87 # Some files need particular modes.
88 chmod 0755, $tmpdir."/rpmdir/SOURCES/openafs-kernel-version.sh";
89 chmod 0755, $tmpdir."/rpmdir/SOURCES/openafs-kvers-is.sh";
91 # Create the specfile. Use sed for this, cos its easier
92 system("cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in | ".
93 "sed -e 's/\@VERSION\@/$version/g' ".
94 " -e 's/\%define afsvers.*/%define afsvers $version/g' ".
95 " -e 's/\%define pkgvers.*/%define pkgvers $version/g' > ".
96 $tmpdir."/rpmdir/SPECS/openafs.spec") == 0
97 or die "sed failed : $!\n";
100 File::Copy::copy($cellservdb,
101 $tmpdir."/rpmdir/SOURCES/$cellservdb")
102 or die "Unable to copy $cellservdb into position\n";
104 system("cd ".$tmpdir."/rpmdir/SOURCES && wget `cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in |grep dl/cellservdb |awk '{print \$2}'`")
108 File::Copy::copy($relnotes,
109 $tmpdir."/rpmdir/SOURCES/RELNOTES-$version")
110 or die "Unable to copy $relnotes into position\n";
112 print "WARNING: No release notes provided. Using empty file\n";
113 system("touch $tmpdir/rpmdir/SOURCES/RELNOTES-$version");
117 File::Copy::copy($changelog,
118 $tmpdir."/rpmdir/SOURCES/ChangeLog")
119 or die "Unable to copy $changelog into position\n";
121 print "WARNING: No changelog provided. Using empty file\n";
122 system("touch $tmpdir/rpmdir/SOURCES/ChangeLog");
126 system("rpmbuild -bs --define \"_topdir $tmpdir/rpmdir\" ".
127 "$tmpdir/rpmdir/SPECS/openafs.spec > /dev/null") == 0
128 or die "rpmbuild failed : $!\n";
130 # Copy it out to somewhere useful
131 File::Copy::copy("$tmpdir/rpmdir/SRPMS/openafs-$version-1.1.src.rpm",
132 "openafs-$version-1.1.src.rpm")
133 or die "Unable to copy output RPM : $!\n";
135 print "SRPM is openafs-$version-1.1.src.rpm\n";