[Mud-builder-commits] r355 - in trunk: . XSL lib/MUD lib/MUD/Fetch

gcobb at garage.maemo.org gcobb at garage.maemo.org
Thu Jun 17 21:43:20 EEST 2010


Author: gcobb
Date: 2010-06-17 21:43:20 +0300 (Thu, 17 Jun 2010)
New Revision: 355

Added:
   trunk/XSL/target.xsl
Modified:
   trunk/lib/MUD/Build.pm
   trunk/lib/MUD/Fetch/Command.pm
   trunk/lib/MUD/Package.pm
   trunk/mud
Log:
Initial support for building RPMs

Added: trunk/XSL/target.xsl
===================================================================
--- trunk/XSL/target.xsl	                        (rev 0)
+++ trunk/XSL/target.xsl	2010-06-17 18:43:20 UTC (rev 355)
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+
+<xsl:param name="target">chinook</xsl:param>
+
+<!-- Handle target attribute, if present -->
+<xsl:template match="*[@target]">
+ <!-- Only copy the node if the target attribute matches -->
+ <xsl:if test="@target=$target">
+  <xsl:copy>
+    <!-- Copy all the attributes except the target attribute -->
+    <xsl:for-each select="@*">
+       <xsl:if test="name()!='target'">
+	<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
+       </xsl:if>
+    </xsl:for-each>
+    <!-- And recurse -->
+    <xsl:apply-templates/>
+  </xsl:copy>
+ </xsl:if>
+</xsl:template>
+
+<!-- If no target attribute, recurse to the next level -->
+<xsl:template match="*[not(@target)]">
+  <xsl:copy>
+    <xsl:for-each select="@*">
+	<xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute>
+    </xsl:for-each>
+    <xsl:apply-templates/>
+  </xsl:copy>
+</xsl:template>
+
+</xsl:transform>

Modified: trunk/lib/MUD/Build.pm
===================================================================
--- trunk/lib/MUD/Build.pm	2010-06-16 23:04:47 UTC (rev 354)
+++ trunk/lib/MUD/Build.pm	2010-06-17 18:43:20 UTC (rev 355)
@@ -25,7 +25,7 @@
 use strict;
 use utf8;
 use locale;
-use vars qw(@ISA $VERSION @PREVENT_INSTALL $DPKG_BUILDPACKAGE $GTK_ICON_CACHE_REFRESH); 
+use vars qw(@ISA $VERSION @PREVENT_INSTALL $DPKG_BUILDPACKAGE $GTK_ICON_CACHE_REFRESH $RPMBUILD); 
 use Carp;
 use File::Basename;
 use File::Path;
@@ -43,6 +43,10 @@
 # Use -i to ignore .svn directories(among others)
 $DPKG_BUILDPACKAGE      = 'dpkg-buildpackage -d -rfakeroot -i -sa -us -uc';
 $GTK_ICON_CACHE_REFRESH = 'gtk-update-icon-cache -f /usr/share/icons/hicolor';
+$RPMBUILD               = 'rpmbuild'
+    . ' --define "%reconfigure autoreconf -f -i -s; %configure"'
+    . ' --define "%autogen ./autogen.sh; %configure"'
+    . ' --target i386';
 
 
 =item new( OPTS )
@@ -167,14 +171,12 @@
     $version   ||= 1;
     print "Version = $version, buildDir = $buildDir\n";
     $buildDir    = $self->{package} unless $buildDir =~ /^[a-z0-9\-\+]+$/;
+    $self->{data}->version($version);
 
-    my $versionForBuild = $version;
-    $versionForBuild =~ s/-[^-]+$//g;
-    $buildDir   .= "-$versionForBuild";
+    $buildDir .= "-".$self->{data}->shortVersion;
     print "Build dir = $buildDir\n";
     rename $origBDir, $buildDir if $origBDir ne $buildDir;
 
-    $self->{data}->version($version);
     $self->{data}->{build} = File::Spec->rel2abs($buildDir, $self->{workdir});
     print "Set build dir to [".$self->{data}->{build}."]\n";
     system('ln', '-snf', $self->{data}->{build}, $self->{workdir}.'/.build');
@@ -188,7 +190,6 @@
     }
 }
 
-
 =item patch
 
 Apply any patches for the given package and modify Debian control structures
@@ -298,8 +299,61 @@
 sub compile {
     my $self = shift;
 
+    if ($::OPTS{rpm}) {
+	$self->compile_rpm();
+    } else {
+	$self->compile_deb();
+    }
+}
+
+sub compile_rpm {
+    my $self = shift;
+
     chdir $self->{data}->{build} || croak "Build dir not set.\n";
 
+    my $name = $self->{package};
+    my $version = $self->{data}->shortVersion;
+    my $release = $self->{data}->releaseVersion;
+    $release =~ s/^-//;
+    $release ||= 0;
+
+    rmtree '../BUILD' if (-d '../BUILD'); mkdir '../BUILD' or die "Could not make RPM BUILD directory";
+    rmtree '../RPMS' if (-d '../RPMS'); mkdir '../RPMS' or die "Could not make RPM RPMS directory";
+    rmtree '../SOURCES' if (-d '../SOURCES'); mkdir '../SOURCES' or die "Could not make RPM SOURCES directory";
+    rmtree '../SPECS' if (-d '../SPECS'); mkdir '../SPECS' or die "Could not make RPM SPECS directory";
+    rmtree '../SRPMS' if (-d '../SRPMS'); mkdir '../SRPMS' or die "Could not make RPM SRPMS directory";
+
+    # Let's see if we can find a specfile
+    if (-f "$name.spec") {
+	print "Using specfile: $name.spec\n";
+	system("sed -e 's/\$name/$name/g\' -e 's/\$version/$version/g' -e 's/\$release/$release/g' <$name.spec >../SPECS/$name.spec");
+    }
+    if (-f "$name.yaml") {
+	print "Using spectacle file: $name.yaml\n";
+	system("sed -e 's/\$name/$name/g\' -e 's/\$version/$version/g' -e 's/\$release/$release/g' <$name.yaml >../SPECS/$name.yaml"
+	       . "&& specify ../SPECS/$name.yaml"
+	       . "&& cp ../SPECS/$name.yaml ../SOURCES/");
+    }
+    $self->genSpecfile() unless (-f "../SPECS/$name.spec");
+    system('cp',"../SPECS/$name.spec",'../SOURCES/');
+
+    # Source tarball
+    system('tar','c','-C','..','-zf',"../SOURCES/$name-$version.tgz","$name-$version"); 
+
+    my $topdir = File::Spec->rel2abs("..",$self->{data}->{build});
+    my $rpmbuild = $RPMBUILD
+	." --define '_topdir $topdir'"
+	." -bb ../SPECS/$name.spec"
+	."| tee ../log";
+    print "$rpmbuild\n";
+    system($rpmbuild);
+}
+
+sub compile_deb {
+    my $self = shift;
+
+    chdir $self->{data}->{build} || croak "Build dir not set.\n";
+
     # -- Tweak for Maemo compatibility...
     #
     $self->patchDebControl();
@@ -347,9 +401,36 @@
 sub source {
     my $self = shift;
 
+    if ($::OPTS{rpm}) {
+	$self->source_rpm();
+    } else {
+	$self->source_deb();
+    }
+}
+
+sub source_rpm {
+    my $self = shift;
+
     chdir $self->{data}->{build} || croak "Build dir not set.\n";
 
+    my $name = $self->{package};
+
     # Now build source package for upload
+    my $topdir = File::Spec->rel2abs("..",$self->{data}->{build});
+    my $rpmbuild = $RPMBUILD
+	." --define '_topdir $topdir'"
+	." -bs ../SPECS/$name.spec"
+	."| tee ../log";
+    print "$rpmbuild\n";
+    system($rpmbuild);
+}
+
+sub source_deb {
+    my $self = shift;
+
+    chdir $self->{data}->{build} || croak "Build dir not set.\n";
+
+    # Now build source package for upload
     system("$DPKG_BUILDPACKAGE -S | tee -a ../log"); 
 }
 
@@ -381,7 +462,11 @@
 
     my $output = $self->{config}->directory('UPLOAD_DIR', 1);
     print "+++ Calculating dependencies to copy to [$output]\n";
-    $self->addDebs(\%debs, $self->{workdir}, '*');
+    if ($::OPTS{rpm}) {
+	$self->addRpms(\%debs, $self->{workdir}, '*');
+    } else {
+	$self->addDebs(\%debs, $self->{workdir}, '*');
+    }
     foreach my $deb (keys(%debs)) {
         system('cp', '-v', $deb, "$output/");
     }
@@ -405,6 +490,20 @@
     }
 }
 
+sub addRpms {
+    my $self = shift;
+    my ($ref, $dir, $pattern) = @_;
+
+    print "Finding rpms for [$pattern] in [$dir]\n";
+    my @results = `find '$dir' -type f -name '$pattern.rpm' -o -name '${pattern}.src.rpm'`;
+    my @add     = ();
+    foreach my $d (@results) {
+        chomp($d);
+        $ref->{$d}++;
+	# Do not attempt to follow dependencies chain as that is hard for RPMs
+    }
+}
+
 sub genDebControl {
     my $self = shift;
 

Modified: trunk/lib/MUD/Fetch/Command.pm
===================================================================
--- trunk/lib/MUD/Fetch/Command.pm	2010-06-16 23:04:47 UTC (rev 354)
+++ trunk/lib/MUD/Fetch/Command.pm	2010-06-17 18:43:20 UTC (rev 355)
@@ -21,9 +21,9 @@
     croak "No command specfied" unless my $cmd = $self->{package}->{data}->{fetch}->{command};
   
     print "+++ Executing [$cmd]...\n";
-    open(OUT, '>fetch.sh') or croak "Unable to write command.sh: $!\n";
+    open(OUT, '>fetch.sh') or croak "Unable to write fetch.sh: $!\n";
     print OUT $cmd;
-    close(OUT) or croak "Unable to close command.sh: $!\n";
+    close(OUT) or croak "Unable to close fetch.sh: $!\n";
     my @start = <*>;
     system('sh', 'fetch.sh');
     croak "Unable to execute command: $@\n" if $@;

Modified: trunk/lib/MUD/Package.pm
===================================================================
--- trunk/lib/MUD/Package.pm	2010-06-16 23:04:47 UTC (rev 354)
+++ trunk/lib/MUD/Package.pm	2010-06-17 18:43:20 UTC (rev 355)
@@ -137,16 +137,18 @@
     
   # -- Now load the information, applying any XSLT...
   #
-  # FIXME: Should do heuristics to work out default sdk name
   my $sdk = $::OPTS{sdk} || 'diablo';
+  my $target = $::OPTS{target} || 'maemo';
 
-  my $xsl = "$self->{config}->{base}/XSL/SDK.xsl";
-  $xsl = $::OPTS{xsl} if $::OPTS{xsl};
-  croak("Missing XSLT file: $xsl") unless -f $xsl;
+  my $xslsdk = $::OPTS{xsl} || "$self->{config}->{base}/XSL/SDK.xsl";
+  croak("Missing XSLT file: $xslsdk") unless -f $xslsdk;
+  my $xsltarget = "$self->{config}->{base}/XSL/target.xsl";
+  croak("Missing XSLT file: $xsltarget") unless -f $xsltarget;
 
   my $holdTerminator = $/;
   undef $/;
-  open(XMLFILE,"xsltproc --stringparam sdk $sdk $xsl $file |") or croak("Unable to perform XSL Transformation on [$file]: $!\nHave you installed xsltproc?");
+  open(XMLFILE,"xsltproc --stringparam sdk $sdk $xslsdk $file | xsltproc --stringparam target $target $xsltarget - |") 
+      or croak("Unable to perform XSL Transformation on [$file]: $!\nHave you installed xsltproc?");
   $file = <XMLFILE>;
   close(XMLFILE);
   $/ = $holdTerminator;
@@ -157,6 +159,7 @@
   $self->{data} = XMLin($file) or croak("Unable to parse configuration for '$name': error in [$file]?");
   $self->{name} = $name;
   $self->{sdk}  = $sdk;
+  $self->{target}  = $target;
 
   if ($self->{data}->{build}->{env}) {
     while(my ($k, $v) = each %{ $self->{data}->{build}->{env} }) {
@@ -402,7 +405,36 @@
   return $self->{data}->{deb}->{version} || $self->{version};
 }
 
+=item shortVersion
 
+Return the version number which should be used for this package, 
+without the "debian version" or "release" number.
+
+=cut
+
+sub shortVersion {
+  my $self = shift;
+  my $version = $self->version;
+  
+  return ($version =~ /^([^-]+)-.*/) ? $1 : $version;
+}
+
+=item releaseVersion
+
+Return the "debian version" or "release" number (which 
+may be an empty string).  If the return value is non-empty
+it will start with "-".
+
+=cut
+
+sub releaseVersion {
+  my $self = shift;
+  my $version = $self->version;
+  
+  return ($version =~ /^[^-]+(-.*)/) ? $1 : '';
+}
+
+
 =item extras
 
 Return an array of L<MUD::ExtrasEntry>s which should be 

Modified: trunk/mud
===================================================================
--- trunk/mud	2010-06-16 23:04:47 UTC (rev 354)
+++ trunk/mud	2010-06-17 18:43:20 UTC (rev 355)
@@ -32,7 +32,9 @@
                    'config=s',
                    'all',
                    'depend-nobuild',
+                   'rpm',
                    'sdk=s',
+                   'target=s',
                    'xsl=s');
 
 if ($OPTS{help} or !@ARGV or !$ACTIONS{$ARGV[0]}) {
@@ -49,8 +51,11 @@
     -c, --config=FILE         Use FILE for configuration rather than 'config'.
     -d, --depend-nobuild      Do not build any dependencies, assume they are
                               up to date.
+    -r, --rpm                 Build an RPM instead of a DEB
     -s, --sdk=CODENAME        Use CODENAME as the SDK name when processing
                               packages.
+    -t, --target=PLATFORM     Use PLATFORM as the TARGET name when processing
+                              packages (defaults to 'maemo')
     -x, --xsl=FILE            Use FILE as XSL Transformation for package files.
 
 Actions:
@@ -68,22 +73,38 @@
     exit;
 }
 
+$OPTS{target}  ||= (-f "/etc/meego-release") ? 'meego' : 'maemo';
+$OPTS{rpm} ||= $OPTS{target} =~ /^meego.*/;
+
 if (!$OPTS{sdk}) {
-  MUD::Build::quietlyInstall("maemo-version");
-  if (open(IN, "</etc/maemo_version")) {
-    chomp(my $line = <IN>);
-    my ($sdk) = $line =~ /^([\d\.]+)/;
-    
-    $OPTS{sdk} = $sdk =~ /^5(\..*)?$/ ? 'fremantle'
-               : $sdk =~ /^4\.1(\..*)?$/ ? 'diablo'
-               : $sdk =~ /^4\.0(\..*)?$/ ? 'chinook'
-               : $sdk =~ /^3(\..*)?$/ ? 'bora'
-               : $sdk =~ /^2(\..*)?$/ ? 'gregale'
-               : $sdk =~ /^1(\..*)?$/ ? 'mistral'
-               : '';
-    close(IN);
-    print "+++ Guessed SDK = [$OPTS{sdk}]\n";
-  }
+    if ($OPTS{target} =~ /^maemo.*/) {
+	MUD::Build::quietlyInstall("maemo-version");
+	  if (open(IN, "</etc/maemo_version")) {
+	      chomp(my $line = <IN>);
+	      my ($sdk) = $line =~ /^([\d\.]+)/;
+	      
+	      $OPTS{sdk} = $sdk =~ /^5(\..*)?$/ ? 'fremantle'
+		  : $sdk =~ /^4\.1(\..*)?$/ ? 'diablo'
+		  : $sdk =~ /^4\.0(\..*)?$/ ? 'chinook'
+		  : $sdk =~ /^3(\..*)?$/ ? 'bora'
+		  : $sdk =~ /^2(\..*)?$/ ? 'gregale'
+		  : $sdk =~ /^1(\..*)?$/ ? 'mistral'
+		  : '';
+	      close(IN);
+	      print "+++ Guessed SDK = [$OPTS{sdk}]\n";
+	  }
+      } else {
+	  if (open(IN, "</etc/meego-release")) {
+	      my $holdTerminator = $/;
+	      undef $/;
+	      my $buf = <IN>;
+	      $/ = $holdTerminator;
+	      $buf =~ /BUILD: meego-([\d\.]+-[a-z]+)/;
+	      $OPTS{sdk} = $buf =~ /BUILD: meego-([\d\.]+-[a-z]+)/ ? $1
+		  : '';
+	      print "+++ Guessed SDK = [$OPTS{sdk}]\n";
+	  }
+      }
 }
 
 $config = { base => $Bin };



More information about the Mud-builder-commits mailing list