[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