RedHat: Use git-version in makesrpm.pl
[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        "'\*/build-tools' > /dev/null")==0
35   or die "Unable to unpack src tar ball\n";
36
37 my $dirh = IO::Dir->new($tmpdir);
38 my $vdir;
39 while (defined($vdir = $dirh->read) && $vdir=~/^\./) {};
40
41 die "Unable to find unpacked source code\n" if !$vdir;
42
43 my $srcdir = $tmpdir."/".$vdir;
44
45 # Work out which version we're dealing with from the configure.ac file
46 my $afsversion;
47 my $linuxver;
48 my $linuxrel;
49 my $fh = new IO::File $srcdir."/configure.ac"
50   or die "Unable to find unpacked configure.ac file";
51 while(<$fh>) {
52   next if (/^\s*\#/);
53
54   if (/AM_INIT_AUTOMAKE\(openafs,(.*)\)/) {
55     $afsversion = $1;
56     next;
57   }
58   if (/LINUX_PKGVER=(.*)/) {
59     $linuxver = $1;
60     next;
61   }
62   if (/LINUX_PKGREL=(.*)/) {
63     $linuxrel = $1;
64     next;
65   }
66 }
67 undef $fh;
68
69 if (not defined($afsversion)) {
70   $afsversion = `"$srcdir/build-tools/git-version" "$srcdir"`;
71 }
72
73 # Build the RPM root
74
75 print "Building version $afsversion\n";
76 File::Path::mkpath([ $tmpdir."/rpmdir/SPECS",
77                      $tmpdir."/rpmdir/SRPMS",
78                      $tmpdir."/rpmdir/SOURCES"], 0, 0755);
79
80 File::Copy::copy($srcball, 
81                  $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-src.tar.bz2")
82   or die "Unable to copy $srcball into position\n";
83
84 File::Copy::copy($docball,
85                  $tmpdir."/rpmdir/SOURCES/openafs-$afsversion-doc.tar.bz2")
86   or die "Unable to copy $docball into position\n";
87
88 # Populate it with all the stuff in the packaging directory, except the 
89 # specfile
90 my $pkgdirh = IO::Dir->new($srcdir."/src/packaging/RedHat")
91   or die "Unable to find RedHat packaging directory\n";
92 my $file;
93 while (defined($file = $pkgdirh->read)) {
94   if (-f $srcdir."/src/packaging/RedHat/".$file) {
95      next if $file eq "openafs.spec.in";
96
97      print "Copying $file into place\n";
98      File::Copy::copy($srcdir."/src/packaging/RedHat/".$file, 
99                       $tmpdir."/rpmdir/SOURCES/".$file);
100   }
101 }
102 undef $dirh;
103
104 # Some files need particular modes.
105 chmod 0755, $tmpdir."/rpmdir/SOURCES/openafs-kernel-version.sh";
106 chmod 0755, $tmpdir."/rpmdir/SOURCES/openafs-kvers-is.sh";
107
108 # Create the specfile. Use sed for this, cos its easier
109 system("cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in | ".
110        "sed -e 's/\@VERSION\@/$afsversion/g' ".
111        "    -e 's/\@LINUX_PKGVER\@/$linuxver/g' ".
112        "    -e 's/\@LINUX_PKGREL\@/$linuxrel/g' ".
113        "    -e 's/\%define afsvers.*/%define afsvers $afsversion/g' ".
114        "    -e 's/\%define pkgvers.*/%define pkgvers $linuxver/g' > ".
115        $tmpdir."/rpmdir/SPECS/openafs.spec") == 0
116   or die "sed failed : $!\n";
117
118 if ($cellservdb) {
119     File::Copy::copy($cellservdb,
120                      $tmpdir."/rpmdir/SOURCES/$cellservdb")
121         or die "Unable to copy $cellservdb into position\n";
122 } else {
123     system("cd ".$tmpdir."/rpmdir/SOURCES && wget `cat ".$srcdir."/src/packaging/RedHat/openafs.spec.in |grep dl/cellservdb |awk '{print \$2}'`")
124 }
125
126 if ($relnotes) {
127   File::Copy::copy($relnotes,
128                    $tmpdir."/rpmdir/SOURCES/RELNOTES-$afsversion")
129   or die "Unable to copy $relnotes into position\n";
130 } else {
131   print "WARNING: No release notes provided. Using empty file\n";
132   system("touch $tmpdir/rpmdir/SOURCES/RELNOTES-$afsversion");
133 }
134
135 if ($changelog) {
136   File::Copy::copy($changelog,
137                    $tmpdir."/rpmdir/SOURCES/ChangeLog")
138   or die "Unable to copy $changelog into position\n";
139 } else {
140   print "WARNING: No changelog provided. Using empty file\n";
141   system("touch $tmpdir/rpmdir/SOURCES/ChangeLog");
142 }
143
144 # Build an RPM
145 system("rpmbuild -bs --define \"_topdir $tmpdir/rpmdir\" ".
146        "$tmpdir/rpmdir/SPECS/openafs.spec > /dev/null") == 0
147   or die "rpmbuild failed : $!\n";
148
149 # Copy it out to somewhere useful
150 File::Copy::copy("$tmpdir/rpmdir/SRPMS/openafs-$linuxver-1.$linuxrel.src.rpm",
151                  "openafs-$linuxver-1.$linuxrel.src.rpm")
152   or die "Unable to copy output RPM : $!\n";
153
154 print "SRPM is openafs-$linuxver-1.$linuxrel.src.rpm\n";
155