Upgrade to 2014-07-15 upstream/2014.07.15
authorZhang Qiang <qiang.z.zhang@intel.com>
Wed, 6 Aug 2014 07:59:36 +0000 (15:59 +0800)
committerZhang Qiang <qiang.z.zhang@intel.com>
Wed, 6 Aug 2014 07:59:36 +0000 (15:59 +0800)
Change-Id: I5cf86c99d49dcd71c95d32397e8f567b16f83055

67 files changed:
Build.pm
Build/Arch.pm
Build/Deb.pm
Build/Kiwi.pm
Build/LiveBuild.pm [new file with mode: 0644]
Build/Rpm.pm
Build/Zypp.pm
Makefile
build
build-pkg [new file with mode: 0644]
build-pkg-arch [new file with mode: 0644]
build-pkg-deb [new file with mode: 0644]
build-pkg-rpm [new file with mode: 0644]
build-recipe [new file with mode: 0644]
build-recipe-arch [new file with mode: 0644]
build-recipe-dsc [new file with mode: 0644]
build-recipe-kiwi [new file with mode: 0644]
build-recipe-livebuild [new file with mode: 0644]
build-recipe-mock [new file with mode: 0644]
build-recipe-preinstallimage [new file with mode: 0644]
build-recipe-spec [new file with mode: 0644]
build-vm [new file with mode: 0644]
build-vm-ec2 [new file with mode: 0644]
build-vm-emulator [new file with mode: 0644]
build-vm-kvm [new file with mode: 0644]
build-vm-lxc [new file with mode: 0644]
build-vm-openstack [new file with mode: 0644]
build-vm-qemu [new file with mode: 0644]
build-vm-uml [new file with mode: 0644]
build-vm-xen [new file with mode: 0644]
build-vm-zvm [new file with mode: 0644]
build_kiwi.sh [deleted file]
changelog2spec
common_functions
computeblocklists
configs/arch.conf
configs/sl13.2.conf
createarchdeps
createrepomddeps
createyastdeps
createzyppdeps [new file with mode: 0755]
detect_architecture.sh [deleted file]
download
emulator/emulator.sh
expanddeps
extractbuild
getchangetarget [deleted file]
getmacros [deleted file]
getoptflags [deleted file]
gettype [deleted file]
init_buildsystem
initscript_qemu_vm [deleted file]
initvm.c
livebuild_pre_run.template [new file with mode: 0755]
mkbaselibs
order
qemu-reg
queryconfig [new file with mode: 0755]
substitutedeps
t/bad.livebuild [new file with mode: 0644]
t/directory.livebuild [new file with mode: 0644]
t/live-build [new file with mode: 0755]
t/standard.livebuild [new file with mode: 0644]
test/common
test/testbuild.sh [new file with mode: 0755]
vc
zvm_functions [deleted file]

index 5024405af4a78fe60360a2b43864e9a6a48e5023..9e6fda3e73060e950f9e4a85077766518c3e7939 100644 (file)
--- a/Build.pm
+++ b/Build.pm
@@ -11,6 +11,7 @@ our $do_rpm;
 our $do_deb;
 our $do_kiwi;
 our $do_arch;
+our $do_livebuild;
 
 sub import {
   for (@_) {
@@ -18,8 +19,9 @@ sub import {
     $do_deb = 1 if $_ eq ':deb';
     $do_kiwi = 1 if $_ eq ':kiwi';
     $do_arch = 1 if $_ eq ':arch';
+    $do_livebuild = 1 if $_ eq ':livebuild';
   }
-  $do_rpm = $do_deb = $do_kiwi = $do_arch = 1 if !$do_rpm && !$do_deb && !$do_kiwi && !$do_arch;
+  $do_rpm = $do_deb = $do_kiwi = $do_arch = $do_livebuild = 1 if !$do_rpm && !$do_deb && !$do_kiwi && !$do_arch && !$do_livebuild;
   if ($do_deb) {
     require Build::Deb;
   }
@@ -29,6 +31,9 @@ sub import {
   if ($do_arch) {
     require Build::Arch;
   }
+  if ($do_livebuild) {
+    require Build::LiveBuild;
+  }
 }
 
 package Build::Features;
@@ -204,6 +209,7 @@ sub read_config {
   $config->{'fileprovides'} = {};
   $config->{'constraint'} = [];
   $config->{'expandflags'} = [];
+  $config->{'buildflags'} = [];
   for my $l (@spec) {
     $l = $l->[1] if ref $l;
     next unless defined $l;
@@ -220,7 +226,7 @@ sub read_config {
       }
       next;
     }
-    if ($l0 eq 'preinstall:' || $l0 eq 'vminstall:' || $l0 eq 'required:' || $l0 eq 'support:' || $l0 eq 'keep:' || $l0 eq 'prefer:' || $l0 eq 'ignore:' || $l0 eq 'conflict:' || $l0 eq 'runscripts:' || $l0 eq 'expandflags:') {
+    if ($l0 eq 'preinstall:' || $l0 eq 'vminstall:' || $l0 eq 'required:' || $l0 eq 'support:' || $l0 eq 'keep:' || $l0 eq 'prefer:' || $l0 eq 'ignore:' || $l0 eq 'conflict:' || $l0 eq 'runscripts:' || $l0 eq 'expandflags:' || $l0 eq 'buildflags:') {
       my $t = substr($l0, 0, -1);
       for my $l (@l) {
        if ($l eq '!*') {
@@ -271,13 +277,15 @@ sub read_config {
          $config->{'order'}->{$l} = 1;
        }
       }
-    } elsif ($l0 eq 'repotype:') { #type of generated repository data
+    } elsif ($l0 eq 'repotype:') { # type of generated repository data
       $config->{'repotype'} = [ @l ];
-    } elsif ($l0 eq 'type:') { #kind of packaging system (spec,dsc,arch,kiwi,...)
+    } elsif ($l0 eq 'type:') { # kind of recipe system (spec,dsc,arch,kiwi,...)
       $config->{'type'} = $l[0];
-    } elsif ($l0 eq 'binarytype:') { #rpm,deb,arch,...
+    } elsif ($l0 eq 'buildengine:') { # build engine (build,mock)
+      $config->{'buildengine'} = $l[0];
+    } elsif ($l0 eq 'binarytype:') { # kind of binary packages (rpm,deb,arch,...)
       $config->{'binarytype'} = $l[0];
-    } elsif ($l0 eq 'patterntype:') { #kind of generated patterns in repository
+    } elsif ($l0 eq 'patterntype:') { # kind of generated patterns in repository
       $config->{'patterntype'} = [ @l ];
     } elsif ($l0 eq 'release:') {
       $config->{'release'} = $l[0];
@@ -324,7 +332,7 @@ sub read_config {
   }
   if (!$config->{'binarytype'}) {
     $config->{'binarytype'} = 'rpm' if $config->{'type'} eq 'spec' || $config->{'type'} eq 'kiwi';
-    $config->{'binarytype'} = 'deb' if $config->{'type'} eq 'dsc';
+    $config->{'binarytype'} = 'deb' if $config->{'type'} eq 'dsc' || $config->{'type'} eq 'livebuild';
     $config->{'binarytype'} = 'arch' if $config->{'type'} eq 'arch';
     $config->{'binarytype'} ||= 'UNDEFINED';
   }
@@ -351,6 +359,13 @@ sub read_config {
       $config->{"expandflags:$_"} = 1;
     }
   }
+  for (@{$config->{'buildflags'} || []}) {
+    if (/^([^:]+):(.*)$/s) {
+      $config->{"buildflags:$1"} = $2;
+    } else {
+      $config->{"buildflags:$_"} = 1;
+    }
+  }
   return $config;
 }
 
@@ -394,32 +409,91 @@ sub do_subst_vers {
   return @res;
 }
 
+sub add_livebuild_packages {
+  my ($config, @deps) = @_;
+
+  if ($config->{'substitute'}->{'build-packages:livebuild'}) {
+    push @deps, @{$config->{'substitute'}->{'build-packages:livebuild'}};
+  } else {
+    # defaults live-build package dependencies base on 4.0~a26 gathered with:
+    # grep Check_package -r /usr/lib/live/build
+    push @deps, (
+      'apt-utils', 'dctrl-tools', 'debconf', 'dosfstools', 'e2fsprogs', 'grub',
+      'librsvg2-bin', 'live-boot', 'live-config', 'mtd-tools', 'parted',
+      'squashfs-tools', 'syslinux', 'syslinux-common', 'wget', 'xorriso',
+      'zsync' );
+  }
+  return @deps;
+}
+
 # Delivers all packages which get used for building
 sub get_build {
   my ($config, $subpacks, @deps) = @_;
+
+  @deps = add_livebuild_packages($config, @deps) if $config->{'type'} eq 'livebuild';
   my @ndeps = grep {/^-/} @deps;
+  my %ndeps = map {$_ => 1} @ndeps;
+  my @directdepsend;
+  if ($ndeps{'--directdepsend--'}) {
+    @directdepsend = @deps;
+    for (splice @deps) {
+      last if $_ eq '--directdepsend--';
+      push @deps, $_;
+    }
+    @directdepsend = grep {!/^-/} splice(@directdepsend, @deps + 1);
+  }
   my @extra = (@{$config->{'required'}}, @{$config->{'support'}});
   if (@{$config->{'keep'} || []}) {
     my %keep = map {$_ => 1} (@deps, @{$config->{'keep'} || []}, @{$config->{'preinstall'}});
     for (@{$subpacks || []}) {
-      push @ndeps, "-$_" unless $keep{$_};
+      next if $keep{$_};
+      push @ndeps, "-$_";
+      $ndeps{"-$_"} = 1;
     }
   } else {
     # new "empty keep" mode, filter subpacks from required/support
     my %subpacks = map {$_ => 1} @{$subpacks || []};
     @extra = grep {!$subpacks{$_}} @extra;
   }
-  my %ndeps = map {$_ => 1} @ndeps;
   @deps = grep {!$ndeps{$_}} @deps;
   push @deps, @{$config->{'preinstall'}};
   push @deps, @extra;
   @deps = grep {!$ndeps{"-$_"}} @deps;
   @deps = do_subst($config, @deps);
   @deps = grep {!$ndeps{"-$_"}} @deps;
-  @deps = expand($config, @deps, @ndeps);
+  if (@directdepsend) {
+    @directdepsend = do_subst($config, @directdepsend);
+    @directdepsend = grep {!$ndeps{"-$_"}} @directdepsend;
+    unshift @directdepsend, '--directdepsend--' if @directdepsend;
+  }
+  @deps = expand($config, @deps, @ndeps, @directdepsend);
   return @deps;
 }
 
+# return the package needed for setting up the build environment.
+# an empty result means that the packages from get_build should
+# be used instead.
+sub get_sysbuild {
+  my ($config, $buildtype) = @_;
+  my $engine = $config->{'buildengine'} || '';
+  $buildtype ||= $config->{'type'} || '';
+  my @sysdeps;
+  if ($engine eq 'mock' && $buildtype ne 'kiwi') {
+    @sysdeps = @{$config->{'substitute'}->{'system-packages:mock'} || []};
+    @sysdeps = ('mock', 'createrepo') unless @sysdeps;
+  } elsif ($buildtype eq 'livebuild') {
+    # packages used for build environment setup (build-recipe-livebuild deps)
+    @sysdeps = @{$config->{'substitute'}->{'system-packages:livebuild'} || []};
+    @sysdeps = ('apt-utils', 'cpio', 'dpkg-dev', 'live-build', 'lsb-release', 'tar') unless @sysdeps;
+  }
+  return () unless @sysdeps;
+  @sysdeps = Build::get_build($config, [], @sysdeps);
+  return @sysdeps unless $sysdeps[0];
+  shift @sysdeps;
+  @sysdeps = unify(@sysdeps, get_preinstalls($config));
+  return (1, @sysdeps);
+}
+
 # Delivers all packages which shall have an influence to other package builds (get_build reduced by support packages)
 sub get_deps {
   my ($config, $subpacks, @deps) = @_;
@@ -658,13 +732,23 @@ sub expand {
   my $requires = $config->{'requiresh'};
 
   my %xignore = map {substr($_, 1) => 1} grep {/^-/} @p;
+  my @directdepsend;
+  if ($xignore{'-directdepsend--'}) {
+    delete $xignore{'-directdepsend--'};
+    my @directdepsend = @p;
+    for my $p (splice @p) {
+      last if $p eq '--directdepsend--';
+      push @p, $p;
+    }
+    @directdepsend = grep {!/^-/} splice(@directdepsend, @p + 1);
+  }
   @p = grep {!/^-/} @p;
 
   my %p;               # expanded packages
   my %aconflicts;      # packages we are conflicting with
 
   # add direct dependency packages. this is different from below,
-  # because we add packages even if to dep is already provided and
+  # because we add packages even if the dep is already provided and
   # we break ambiguities if the name is an exact match.
   for my $p (splice @p) {
     my @q = @{$whatprovides->{$p} || addproviders($config, $p)};
@@ -682,6 +766,7 @@ sub expand {
     $p{$q[0]} = 1;
     $aconflicts{$_} = 1 for @{$conflicts->{$q[0]} || []};
   }
+  push @p, @directdepsend;
 
   my @pamb = ();
   my $doamb = 0;
@@ -881,6 +966,16 @@ sub add_all_providers {
 
 ###########################################################################
 
+sub recipe2buildtype {
+  my ($recipe) = @_;
+  return $1 if $recipe =~ /\.(spec|dsc|kiwi|livebuild)$/;
+  $recipe =~ s/.*\///;
+  $recipe =~ s/^_service:.*://;
+  return 'arch' if $recipe eq 'PKGBUILD';
+  return 'preinstallimage' if $recipe eq '_preinstallimage';
+  return undef;
+}
+
 sub show {
   my ($conffile, $fn, $field, $arch) = @ARGV;
   my $cf = read_config($arch, $conffile);
@@ -906,8 +1001,25 @@ sub parse {
   return Build::Deb::parse($cf, $fn, @args) if $do_deb && $fn =~ /\.dsc$/;
   return Build::Kiwi::parse($cf, $fn, @args) if $do_kiwi && $fn =~ /config\.xml$/;
   return Build::Kiwi::parse($cf, $fn, @args) if $do_kiwi && $fn =~ /\.kiwi$/;
-  return Build::Arch::parse($cf, $fn, @args) if $do_arch && $fn =~ /(^|\/|-)PKGBUILD$/;
-  return parse_preinstallimage($cf, $fn, @args) if $fn =~ /(^|\/|-)_preinstallimage$/;
+  return Build::LiveBuild::parse($cf, $fn, @args) if $do_livebuild && $fn =~ /\.livebuild$/;
+  my $fnx = $fn;
+  $fnx =~ s/.*\///;
+  $fnx =~ s/^[0-9a-f]{32,}-//; # hack for OBS srcrep implementation
+  $fnx =~ s/^_service:.*://;
+  return Build::Arch::parse($cf, $fn, @args) if $do_arch && $fnx eq 'PKGBUILD';
+  return parse_preinstallimage($cf, $fn, @args) if $fnx eq '_preinstallimage';
+  return undef;
+}
+
+sub parse_typed {
+  my ($cf, $fn, $buildtype, @args) = @_;
+  $buildtype ||= '';
+  return Build::Rpm::parse($cf, $fn, @args) if $do_rpm && $buildtype eq 'spec';
+  return Build::Deb::parse($cf, $fn, @args) if $do_deb && $buildtype eq 'dsc';
+  return Build::Kiwi::parse($cf, $fn, @args) if $do_kiwi && $buildtype eq 'kiwi';
+  return Build::LiveBuild::parse($cf, $fn, @args) if $do_livebuild && $buildtype eq 'livebuild';
+  return Build::Arch::parse($cf, $fn, @args) if $do_arch && $buildtype eq 'arch';
+  return parse_preinstallimage($cf, $fn, @args) if $buildtype eq 'preinstallimage';
   return undef;
 }
 
index 8e561c3215772e91071161ec305f0064df925650..9d4f7279eb97366aff1b7c08d69e995652e79a36 100644 (file)
@@ -55,7 +55,7 @@ sub parse {
     my $var = $1;
     my $val = $3;
     if ($2) {
-      while ($val !~ s/\)\s*$//s) {
+      while ($val !~ s/\)\s*(?:#.*)?$//s) {
        my $nextline = <PKG>;
        last unless defined $nextline;
        chomp $nextline;
@@ -68,6 +68,7 @@ sub parse {
   $ret->{'name'} = $vars{'pkgname'}->[0] if $vars{'pkgname'};
   $ret->{'version'} = $vars{'pkgver'}->[0] if $vars{'pkgver'};
   $ret->{'deps'} = $vars{'makedepends'} || [];
+  push @{$ret->{'deps'}}, @{$vars{'checkdepends'} || []};
   push @{$ret->{'deps'}}, @{$vars{'depends'} || []};
   $ret->{'source'} = $vars{'source'} if $vars{'source'};
   return $ret;
@@ -173,6 +174,7 @@ sub query {
   # arch packages don't seem to have a source :(
   # fake it so that the package isn't confused with a src package
   $ret->{'source'} = $ret->{'name'} if defined $ret->{'name'};
+  $ret->{'buildtime'} = $vars->{'builddate'}->[0] if $opts{'buildtime'} && $vars->{'builddate'};
   return $ret;
 }
 
index 3878fd46b660ffbf133b52dbbbea9e25da4841b9..2ee5602cd77f3ceca3fe8eb9dd8dc158ee64d7f2 100644 (file)
@@ -25,6 +25,7 @@ sub parse {
   $arch = 'all' if !defined($arch) || $arch eq 'noarch';
   $arch = 'i386' if $arch =~ /^i[456]86$/;
   $arch = 'powerpc' if $arch eq 'ppc';
+  $arch = 'ppc64el' if $arch eq 'ppc64le';
   $arch = 'amd64' if $arch eq 'x86_64';
   $arch = 'armel' if $arch =~ /^armv[4567]l$/;
   $arch = 'armhf' if $arch eq 'armv7hl';
index f9760298422b3edac3b97e8213e491e332ed7723..515057d8d52cf7ffaf7187b616c13499c501369c 100644 (file)
@@ -188,6 +188,7 @@ sub kiwiparse {
     if ($instsource->{'productoptions'}) {
       my $productoptions = $instsource->{'productoptions'}->[0] || {};
       for my $po (@{$productoptions->{'productvar'} || []}) {
+       $ret->{'drop_repository'} = $po->{'_content'} if $po->{'name'} eq 'DROP_REPOSITORY';
        $ret->{'version'} = $po->{'_content'} if $po->{'name'} eq 'VERSION';
       }
       for my $po (@{$productoptions->{'productoption'} || []}) {
diff --git a/Build/LiveBuild.pm b/Build/LiveBuild.pm
new file mode 100644 (file)
index 0000000..00da9e3
--- /dev/null
@@ -0,0 +1,99 @@
+#
+# Author: Jan Blunck <jblunck@infradead.org>
+#
+# This file is part of build.
+#
+# build is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# build is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with build.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+package Build::LiveBuild;
+
+use strict;
+
+eval { require Archive::Tar; };
+*Archive::Tar::new = sub {die("Archive::Tar is not available\n")} unless defined &Archive::Tar::new;
+
+sub filter {
+  my ($content) = @_;
+
+  return '' unless defined $content;
+
+  $content =~ s/^#.*$//mg;
+  $content =~ s/^!.*$//mg;
+  $content =~ s/^\s*//mg;
+  return $content;
+}
+
+sub parse_package_list {
+  my ($content) = @_;
+  my @packages = split /\n/, filter($content);
+
+  return @packages;
+};
+
+sub parse_archive {
+  my ($content) = @_;
+  my @repos;
+
+  my @lines = split /\n/, filter($content);
+  for (@lines) {
+    next if /^deb-src /;
+
+    die("bad path using not obs:/ URL: $_\n") unless $_ =~ /^deb\s+obs:\/\/\/?([^\s\/]+)\/([^\s\/]+)\/?\s+.*$/;
+    push @repos, "$1/$2";
+  }
+
+  return @repos;
+}
+
+sub unify {
+  my %h = map {$_ => 1} @_;
+  return grep(delete($h{$_}), @_);
+}
+
+sub parse {
+  my ($config, $filename, @args) = @_;
+  my $ret = {};
+
+  # check that filename is a tar
+  my $tar = Archive::Tar->new;
+  unless($tar->read($filename)) {
+    warn("$filename: " . $tar->error . "\n");
+    $ret->{'error'} = "$filename: " . $tar->error;
+    return $ret;
+  }
+
+  # check that directory layout matches live-build directory structure
+  for my $file ($tar->list_files('')) {
+    next unless $file =~ /^(.*\/)?config\/archives\/.*\.list.*/;
+    warn("$filename: config/archives/*.list* files not allowed!\n");
+    $ret->{'error'} = "$filename: config/archives/*.list* files not allowed!";
+    return $ret;
+  }
+
+  # always require the list of packages required by live-boot for
+  # bootstrapping the target distribution image (e.g. with debootstrap)
+  my @packages = ( 'live-build-desc' );
+
+  for my $file ($tar->list_files('')) {
+    next unless $file =~ /^(.*\/)?config\/package-lists\/.*\.list.*/;
+    push @packages, parse_package_list($tar->get_content($file));
+  }
+
+  ($ret->{'name'} = $filename) =~ s/\.[^.]+$//;
+  $ret->{'deps'} = [ unify(@packages) ];
+  return $ret;
+}
+
+1;
index e6a18153383548b1427014d47bb1fbaa1856d646..2d8cf0815508c86a1327b0dd7aaea8572818e765 100644 (file)
@@ -348,10 +348,20 @@ reexpand:
          }
          $macalt = $macros{$macname} unless defined $macalt;
          $macalt = '' if $mactest == -1;
-         $line = "$macalt$line";
+         if ($macalt =~ /%/) {
+           push @expandstack, ('', $line, 1) if $line ne '';
+           $line = $macalt;
+         } else {
+           $expandedline .= $macalt;
+         }
        } elsif ($mactest) {
          $macalt = '' if !defined($macalt) || $mactest == 1;
-         $line = "$macalt$line";
+         if ($macalt =~ /%/) {
+           push @expandstack, ('', $line, 1) if $line ne '';
+           $line = $macalt;
+         } else {
+           $expandedline .= $macalt;
+         }
        } else {
          $expandedline .= "%$macorig" unless $macname =~ /^-/;
        }
@@ -360,12 +370,15 @@ reexpand:
       if (@expandstack) {
        my $m = pop(@expandstack);
        if ($m) {
-         $optmacros = adaptmacros(\%macros, $optmacros, $m);
+         $optmacros = adaptmacros(\%macros, $optmacros, $m) if ref $m;
          $expandstack[-2] .= $line;
-         $line = '';
+         $line = pop(@expandstack);
+         $expandedline = pop(@expandstack);
+       } else {
+         my $todo = pop(@expandstack);
+         $expandedline = pop(@expandstack);
+         push @expandstack, ('', $todo, 1) if $todo ne '';
        }
-       $line = $line . pop(@expandstack);
-       $expandedline = pop(@expandstack);
        goto reexpand;
       }
     }
@@ -565,6 +578,7 @@ my %rpmstag = (
   "EPOCH"          => 1003,
   "SUMMARY"        => 1004,
   "DESCRIPTION"    => 1005,
+  "BUILDTIME"      => 1006,
   "ARCH"           => 1022,
   "OLDFILENAMES"   => 1027,
   "SOURCERPM"      => 1044,
@@ -580,6 +594,7 @@ my %rpmstag = (
   "DIRINDEXES"     => 1116,
   "BASENAMES"      => 1117,
   "DIRNAMES"       => 1118,
+  "DISTURL"        => 1123,
 );
 
 sub rpmq {
@@ -842,6 +857,8 @@ sub query {
   push @tags, qw{EPOCH VERSION RELEASE ARCH};
   push @tags, qw{FILENAMES} if $opts{'filelist'};
   push @tags, qw{SUMMARY DESCRIPTION} if $opts{'description'};
+  push @tags, qw{DISTURL} if $opts{'disturl'};
+  push @tags, qw{BUILDTIME} if $opts{'buildtime'};
   my %res = rpmq($handle, @tags);
   return undef unless %res;
   my $src = $res{'SOURCERPM'}->[0];
@@ -894,6 +911,8 @@ sub query {
     $data->{'summary'} = $res{'SUMMARY'}->[0];
     $data->{'description'} = $res{'DESCRIPTION'}->[0];
   }
+  $data->{'buildtime'} = $res{'BUILDTIME'}->[0] if $opts{'buildtime'};
+  $data->{'disturl'} = $res{'DISTURL'}->[0] if $opts{'disturl'} && $res{'DISTURL'};
   return $data;
 }
 
index 354adca3492d1ce3f8acbf3df8242b1a842ecb9f..bd0ced0915f2773b188615ce27ae5cd537ccb5b0 100644 (file)
@@ -4,30 +4,49 @@ use strict;
 
 our $root = '';
 
-sub parsecfg($)
-{
-  my $file = shift;
-  my $repocfg = "$root/etc/zypp/repos.d/$file.repo";
+sub parsecfg {
+  my ($repocfg, $reponame) = @_;
+
   local *REPO;
-  open(REPO, '<', $repocfg) or return undef;
+  open(REPO, '<', "$root/etc/zypp/repos.d/$repocfg.repo") or return undef;
   my $name;
   my $repo = {};
   while (<REPO>) {
     chomp;
     if (/^\[(.+)\]/) {
-      $name = $1;
-    } else {
-      my ($key, $value) = split(/=/,$_,2);
+      $name = $1 if !defined($reponame) || $reponame eq $1;
+    } elsif (defined($name)) {
+      my ($key, $value) = split(/=/, $_, 2);
       $repo->{$key} = $value if defined $key;
     }
   }
   close(REPO);
-  return undef unless $name;
+  return undef unless defined $name;
   $repo->{'description'} = $repo->{'name'} if exists $repo->{'name'};
   $repo->{'name'} = $name;
   return $repo;
 }
 
+sub parserepo($) {
+  my ($reponame) = @_;
+  # first try matching .repo file
+  if (-e "$root/etc/zypp/repos.d/$reponame.repo") {
+    my $repo = parsecfg($reponame, $reponame);
+    return $repo if $repo;
+  }
+  # then try all repo files
+  my @r;
+  if (opendir(D, "$root/etc/zypp/repos.d")) {
+    @r = grep {!/^\./ && /.repo$/} readdir(D);
+    closedir D;
+  }
+  for my $r (sort @r) {
+    my $repo = parsecfg($r, $reponame);
+    return $repo if $repo;
+  }
+  die("could not find repo '$reponame'\n");
+}
+
 1;
 
 # vim: sw=2
index 5bd4bf9824aea9a8411111ed56ec01805d1904b9..fd3ec66106d9665f02c08d3b999297dee8f305ce 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ SCM=$(shell if test -d .svn; then echo svn; elif test -d .git; then echo git; fi
 DATE=$(shell date +%Y%m%d%H%M)
 BUILD=build
 
-INITVM_ARCH=$(shell bash detect_architecture.sh)
+INITVM_ARCH=$(shell bash -c '. common_functions ; build_host_arch; echo $$BUILD_INITVM_ARCH')
 
 ifeq ($(SCM),svn)
 SVNVER=_SVN$(shell LANG=C svnversion .)
@@ -30,7 +30,6 @@ install:
            $(DESTDIR)$(man1dir)
        install -m755 \
            build \
-           build_kiwi.sh \
            vc \
            createrpmdeps \
            order \
@@ -39,19 +38,16 @@ install:
            extractbuild \
            getbinaryid \
            killchroot \
-           getmacros \
-           getoptflags \
-           gettype \
-           getchangetarget \
+           queryconfig \
            common_functions \
            init_buildsystem \
-           initscript_qemu_vm \
            substitutedeps \
            debtransform \
            debtransformbz2 \
            debtransformzip \
            mkbaselibs \
            mkdrpms \
+           createzyppdeps \
            createarchdeps \
            createrepomddeps \
            createyastdeps \
@@ -62,11 +58,13 @@ install:
            spectool \
            signdummy \
            unrpm \
-           zvm_functions \
            $(DESTDIR)$(pkglibdir)
        install -m755 emulator/emulator.sh $(DESTDIR)$(pkglibdir)/emulator/
        install -m644 Build/*.pm $(DESTDIR)$(pkglibdir)/Build
        install -m644 qemu-reg $(DESTDIR)$(pkglibdir)
+       install -m644 build-vm build-vm-* $(DESTDIR)$(pkglibdir)
+       install -m644 build-recipe build-recipe-* $(DESTDIR)$(pkglibdir)
+       install -m644 build-pkg build-pkg-* $(DESTDIR)$(pkglibdir)
        install -m644 *.pm baselibs_global*.conf lxc.conf $(DESTDIR)$(pkglibdir)
        install -m644 configs/* $(DESTDIR)$(pkglibdir)/configs
        install -m644 build.1 $(DESTDIR)$(man1dir)
diff --git a/build b/build
index aa7a217053478910c6987ea94a4614227af500b9..9f9fb722d9eb33c321b405eb8827c1b415101c8d 100755 (executable)
--- a/build
+++ b/build
@@ -1,17 +1,18 @@
 #!/bin/bash
 # Script to build a package.  It uses init_buildsystem to setup a chroot
 # building tree.  This script needs a directory as parameter.  This directory
-# has to include sources and a spec file.
+# has to include sources and a recipe file.
 #
 # BUILD_ROOT        here the packages will be built
 #
 # (c) 1997-2008 SuSE GmbH Nuernberg, Germany
 
 # some VMs do not allow to specify the init process...
-if test "$0" = "/sbin/init" ; then
-   exec /.build/build "$@"
+if test "$0" = /sbin/init ; then
+    exec /.build/build "$@"
 fi
 
+test -z "$BUILD_DIR" -a -e /.build/build.data -a -z "$BUILD_IGNORE_2ND_STAGE" && BUILD_DIR=/.build
 test -z "$BUILD_DIR" && BUILD_DIR=/usr/lib/build
 test -z "$BUILD_ROOT" && BUILD_ROOT=/var/tmp/build-root
 test -z "$CONFIG_DIR" && CONFIG_DIR="$BUILD_DIR/configs"
@@ -19,55 +20,23 @@ test -z "$CONFIG_DIR" && CONFIG_DIR="$BUILD_DIR/configs"
 export BUILD_ARCH BUILD_HOST_ARCH BUILD_ROOT BUILD_RPMS BUILD_DIR BUILD_DEBUG
 export BUILD_DIST
 
-ccache=0
 icecream=0
-statistics=0
-shell=
 definesnstuff=()
 repos=()
 old_packages=()
 
-# defaults for vm_img_mkfs
-vm_img_mkfs_ext4_options='-O ^has_journal,^huge_file,^resize_inode,sparse_super'
-vm_img_mkfs_ext4_extra='-E lazy_itable_init,discard'
-vm_img_mkfs_ext4="mkfs.ext4 -m 0 -q -F $vm_img_mkfs_ext4_options"
-vm_img_tunefs_ext4='tune2fs -c 0'
-vm_img_mkfs_ext3='mkfs.ext3 -m 0 -q -F'
-vm_img_tunefs_ext3='tune2fs -c 0 -o journal_data_writeback'
-vm_img_mkfs_ext2='mkfs.ext2 -m 0 -q -F'
-vm_img_tunefs_ext2='tune2fs -c 0'
-vm_img_mkfs_reiserfs='mkreiserfs -q -f'
-vm_img_mkfs_btrfs='mkfs.btrfs'
-vm_img_mkfs_xfs='mkfs.xfs -f'
-
-vm_kernel=/boot/vmlinuz
-vm_initrd=/boot/initrd
-qemu_bin=/usr/bin/qemu
-uml_kernel=/boot/vmlinux-um
-uml_initrd=/boot/initrd-um
-
-# z/VM: use default kernel image from local machine
-# lets go with the default parameters. However zvm_initrd will be a required parameter
-#zvm_kernel=/boot/image
-#zvm_initrd=/boot/initrd_worker
-zvm_param="root=/dev/disk/by-path/ccw-0.0.0150-part1 hvc_iucv=8 console=hvc0"
-zvm_mult_pass="THR4ME"
-#zvm_worker_nr="1"
-zvm_init_script="/.build/build"
-
-kvm_bin=/usr/bin/qemu-kvm
-# whether we have virtio support
-kvm_virtio=
-
-# guest visible console device name
-console=ttyS0
+# slurp in vm support
+. "$BUILD_DIR/build-vm"
+
+# slurp in recipe support
+. "$BUILD_DIR/build-recipe"
+
+# slurp in package binary support
+. "$BUILD_DIR/build-pkg"
 
 # need to restore build root owner for non-root builds
 browner=
 
-# additional kiwi parameters, used for appliance builds with obsrepositories:/ directive
-KIWI_PARAMETERS=
-
 # Default uid:gid for the build user
 ABUILD_UID=399
 ABUILD_GID=399
@@ -76,26 +45,14 @@ DO_INIT=true
 DO_LINT=
 DO_CHECKS=true
 CLEAN_BUILD=
-USE_SYSTEM_QEMU=
-SPECFILES=()
+RECIPEFILES=()
 SRCDIR=
 BUILD_JOBS=
 ABUILD_TARGET=
 CREATE_BASELIBS=
 USEUSEDFORBUILD=
 LIST_STATE=
-VM_IMAGE=
-VM_SWAP=
-VM_KERNEL=
-VM_INITRD=
-VMDISK_ROOTSIZE=4096
-VMDISK_SWAPSIZE=1024
-VMDISK_FILESYSTEM=ext4
-# settings are for speed and not data safety, we format anyway on next run
-VMDISK_MOUNT_OPTIONS=__default
-VMDISK_CLEAN=
-HUGETLBFSPATH=
-MEMSIZE=
+
 RUNNING_IN_VM=
 RPMLIST=
 RELEASE=
@@ -105,7 +62,6 @@ LOGFILE=
 KILL=
 CHANGELOG=
 BUILD_DEBUG=
-PERSONALITY_SYSCALL=
 INCARNATION=
 DISTURL=
 LINKSOURCES=
@@ -114,10 +70,10 @@ RSYNCSRC=
 RSYNCDEST=
 RSYNCDONE=
 SIGNDUMMY=
-HOST_ARCH=
-EMULATOR_SCRIPT=
-KVM_OPTIONS=
-BUILD_EC2_TYPE="t1.micro"
+DO_STATISTICS=
+RUN_SHELL=
+CCACHE=
+CACHE_DIR=/var/cache/build
 
 
 # This is for insserv
@@ -134,7 +90,7 @@ echo_help () {
 Some comments for build
 -----------------------
 
-With build you can create rpm packages.  They will be built in a chroot
+With build you can create binary packages.  They will be built in a chroot
 system.  This chroot system will be setup automatically.  Normally you can
 simply call build with a spec file as parameter - nothing else has to be
 set.
@@ -174,7 +130,7 @@ Known Parameters:
   --no-init   Skip initialization of build root and start with build
               immediately.
 
-  --no-checks Do not run post-build checks
+  --no-checks Do not run checks (postbuild and %check)
 
   --lint      Run rpmlint after build.
 
@@ -358,8 +314,9 @@ Remember to have fun!
 [*] Maximum RPM: http://www.rpm.org/max-rpm/
 EOT
 }
+
 usage () {
-    echo "Usage: `basename $0` [--no-init|--clean|--rpms path|--verify|--help] [dir-to-build|spec-to-build]"
+    echo "Usage: `basename $0` [--no-init|--clean|--rpms path|--verify|--help] [dir-to-build|recipe-to-build]"
     cleanup_and_exit 1
 }
 
@@ -383,62 +340,25 @@ cleanup_and_exit () {
     if test -n "$RUNNING_IN_VM" ; then
        echo "$1" >  /.build/_exitcode
        test -n "$browner" && chown "$browner" $BUILD_ROOT
-       cd /
-       if test -n "$VM_SWAP" -a -e "$VM_SWAP" ; then
-           swapoff "$VM_SWAP" 2>/dev/null
-           echo -n "BUILDSTATUS$1" >"$VM_SWAP"
-       fi
-       exec >&0 2>&0        # so that the logging tee finishes
-       sleep 1                # wait till tee terminates
-       if test "$VM_TYPE" != lxc; then
-           kill -9 -1        # goodbye cruel world
-           if ! test -x /sbin/halt ; then
-               test -e /proc/sysrq-trigger || mount -n -tproc none /proc
-               sync
-               sleep 2 # like halt does
-               if test -e /proc/sysrq-trigger; then
-                   echo o > /proc/sysrq-trigger
-                   sleep 5 # wait for sysrq to take effect
-               else
-                   echo "Warning: VM doesn't support sysrq and /sbin/halt not installed"
-               fi
-           else
-               halt -f -p
-           fi
-           echo "Warning: clean shut down of the VM didn't work"
-       fi
+       vm_shutdown "$1"
     else
-        # nop if unused
-        cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_NAME"
-        cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_SWAP"
-        cloud_volume_detach "$VM_SERVER" "$EC2_EXTRACT_VOLUME_root"
-        cloud_volume_detach "$VM_SERVER" "$EC2_EXTRACT_VOLUME_swap"
-
-        [ -n "$EC2_SNAP_root" ] && ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root"
-        [ -n "$EC2_SNAP_swap" ] && ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap"
-        [ -n "$EC2_EXTRACT_VOLUME_root" ] && ec2-delete-volume --region "$BUILD_EC2_REGION" "$EC2_EXTRACT_VOLUME_root"
-        [ -n "$EC2_EXTRACT_VOLUME_swap" ] && ec2-delete-volume --region "$BUILD_EC2_REGION" "$EC2_EXTRACT_VOLUME_swap"
-
        umount -n $BUILD_ROOT/proc/sys/fs/binfmt_misc 2> /dev/null || true
        umount -n $BUILD_ROOT/proc 2>/dev/null || true
        umount -n $BUILD_ROOT/dev/pts 2>/dev/null || true
        umount -n $BUILD_ROOT/dev/shm 2>/dev/null || true
-       test "$VM_IMAGE" = 1 && VM_IMAGE=
-       [ -n "$VM_IMAGE" ] && umount $BUILD_ROOT 2>/dev/null || true
+       umount -n $BUILD_ROOT/sys 2>/dev/null || true
+       test -n "$VM_IMAGE" -a "$VM_IMAGE" != 1 && umount $BUILD_ROOT 2>/dev/null || true
+       test -n "$VM_TYPE" && vm_cleanup
     fi
-
-#    echo "pid $$ exit $1"
     exit $1
 }
 
-fail_exit()
-{
-  cleanup_and_exit 1
+fail_exit() {
+    cleanup_and_exit 1
 }
 
-shellquote()
-{
-    for arg; do
+shellquote() {
+    for arg ; do
        arg=${arg/\\/\\\\}
        arg=${arg/\$/\\\$}
        arg=${arg/\"/\\\"}
@@ -449,17 +369,15 @@ shellquote()
 
 # create a shell script from command line. Used for preserving arguments
 # through /bin/su -c
-toshellscript()
-{
-       echo "#!/bin/sh -x"
-       echo -n exec
-       shellquote "$@"
-       echo
+toshellscript() {
+    echo "#!/bin/sh -x"
+    echo -n exec
+    shellquote "$@"
+    echo
 }
 
-setupccache()
-{
-    if [ "$ccache" = 1 ]; then
+setupccache() {
+    if test -n "$CCACHE" ; then
        if mkdir -p $BUILD_ROOT/var/lib/build/ccache/bin; then
            for i in $(ls $BUILD_ROOT/usr/bin | grep -E '^(cc|gcc|[cg][+][+])([-]?[234][.]?[0-9])*$'); do
 #                ln -sf /usr/bin/ccache $BUILD_ROOT/var/lib/build/ccache/bin/$i
@@ -473,7 +391,7 @@ setupccache()
                echo "Installed ccache wrapper as $BUILD_ROOT/var/lib/build/ccache/bin/$i"
            done
        fi
-       mkdir -p "$BUILD_ROOT"/.ccache
+       mkdir -p "$BUILD_ROOT/.ccache"
        chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT/.ccache"
        echo "export CCACHE_DIR=/.ccache" > "$BUILD_ROOT"/etc/profile.d/build_ccache.sh
        echo 'export PATH=/var/lib/build/ccache/bin:$PATH' >> "$BUILD_ROOT"/etc/profile.d/build_ccache.sh
@@ -482,23 +400,21 @@ setupccache()
     fi
 }
 
-setupicecream()
-{
-    if [ "$icecream" -eq 0 ]; then
+setupicecream() {
+    if test "$icecream" -eq 0 ; then
        rm -rf "$BUILD_ROOT/var/run/icecream"
        rm -f "$BUILD_ROOT/etc/profile.d/build_icecream.sh"
-       return
+       return 0
     fi
 
     if ! chroot "$BUILD_ROOT" rpm -q icecream >/dev/null 2>/dev/null; then
        echo "*** icecream package not installed ***"
-       false
-       return
+       return 1
     fi
 
     echo "using icecream with $icecream jobs"
 
-    if [ "$ccache" -ne 1 ]; then
+    if test -z "$CCACHE" ; then
        echo 'export PATH=/usr/lib/icecc/bin:/opt/icecream/bin:$PATH' > "$BUILD_ROOT"/etc/profile.d/build_icecream.sh
     else
        echo 'export CCACHE_PATH=/usr/lib/icecc/bin:/opt/icecream/bin' > "$BUILD_ROOT"/etc/profile.d/build_icecream.sh
@@ -509,25 +425,24 @@ setupicecream()
 
     # XXX use changelog like autobuild does instead?
     # only run create-env if compiler or glibc changed
-    if [ -z "$icecc_vers" \
+    if test -z "$icecc_vers" \
        -o ! -e "$BUILD_ROOT/$icecc_vers" \
        -o "$BUILD_ROOT/usr/bin/gcc" -nt "$BUILD_ROOT/$icecc_vers" \
        -o "$BUILD_ROOT/usr/bin/g++" -nt "$BUILD_ROOT/$icecc_vers" \
        -o "$BUILD_ROOT/usr/bin/as" -nt "$BUILD_ROOT/$icecc_vers" \
-       -o "$BUILD_ROOT/lib/libc.so.6" -nt "$BUILD_ROOT/$icecc_vers" ]
+       -o "$BUILD_ROOT/lib/libc.so.6" -nt "$BUILD_ROOT/$icecc_vers"
     then
        rm -rf "$BUILD_ROOT/var/run/icecream"
        mkdir -p "$BUILD_ROOT/var/run/icecream"
-       if [ -e "$BUILD_ROOT"/usr/bin/create-env ]; then
-         createenv=/usr/bin/create-env
-       elif [ -e "$BUILD_ROOT"/usr/lib/icecc/icecc-create-env ]; then
-         createenv="/usr/lib/icecc/icecc-create-env /usr/bin/gcc /usr/bin/g++" # XXX
-       elif [ -e "$BUILD_ROOT"/usr/lib64/icecc/icecc-create-env ]; then
-         createenv="/usr/lib64/icecc/icecc-create-env /usr/bin/gcc /usr/bin/g++" # XXX
+       if test -e "$BUILD_ROOT"/usr/bin/create-env ; then
+           createenv=/usr/bin/create-env
+       elif test -e "$BUILD_ROOT"/usr/lib/icecc/icecc-create-env ; then
+           createenv="/usr/lib/icecc/icecc-create-env /usr/bin/gcc /usr/bin/g++" # XXX
+       elif test -e "$BUILD_ROOT"/usr/lib64/icecc/icecc-create-env ; then
+           createenv="/usr/lib64/icecc/icecc-create-env /usr/bin/gcc /usr/bin/g++" # XXX
        else
-         echo "create-env not found"
-         false
-         return
+           echo "create-env not found"
+           return 1
        fi
        chroot $BUILD_ROOT bash -c "cd /var/run/icecream; $createenv" || cleanup_and_exit 1
        icecc_vers=(`shopt -s nullglob; echo $BUILD_ROOT/var/run/icecream/*.tar.{bz2,gz}`)
@@ -535,14 +450,13 @@ setupicecream()
     else
        echo "reusing existing icecream environment $icecc_vers"
     fi
-    if [ -n "$icecc_vers" ]; then
-      echo "export ICECC_VERSION=$icecc_vers" >> "$BUILD_ROOT"/etc/profile.d/build_icecream.sh
+    if test -n "$icecc_vers" ; then
+       echo "export ICECC_VERSION=$icecc_vers" >> "$BUILD_ROOT"/etc/profile.d/build_icecream.sh
     fi
 }
 
-setmemorylimit()
-{
-    if [ -n "$VM_IMAGE" -o -n "$RUNNING_IN_VM" ]; then
+setmemorylimit() {
+    if test -n "$VM_IMAGE" -o -n "$RUNNING_IN_VM" ; then
        return
     fi
     local mem
@@ -564,17 +478,16 @@ setmemorylimit()
     echo "Memory limit set to ${limit}KB"
 }
 
-create_baselibs()
-{
+create_baselibs() {
     local pkgs=()
     local line
 
     BASELIBS_CFG=
 
-    if test "$BUILDTYPE" == "arch" ; then
+    if test "$BUILDTYPE" == arch ; then
        return
     fi
-    if test "$BUILDTYPE" == "dsc" ; then
+    if test "$BUILDTYPE" == dsc ; then
        pkgs=($DEBS)
     else # spec and kiwi
        if test -e $BUILD_ROOT$TOPDIR/SOURCES/baselibs.conf ; then
@@ -633,20 +546,19 @@ create_baselibs()
     rm -rf "$BUILD_ROOT/.mkbaselibs"
 }
 
-copy_oldpackages()
-{
+copy_oldpackages() {
     local i=0
     local d
     local dest
-    [ -z "$RUNNING_IN_VM" ] || return 0
-    if [ -z "$old_packages" ]; then
+    test -z "$RUNNING_IN_VM" || return 0
+    if test -z "$old_packages" ; then
        rm -rf "$BUILD_ROOT"/.build.oldpackages*
        return 0
     fi
     for d in "${old_packages[@]}"; do
        dest="$BUILD_ROOT/.build.oldpackages"
        test "$i" = 0 || dest="$dest$i"
-       if [ -d "$d" -a "$d" != "$dest" ] ; then
+       if test -d "$d" -a "$d" != "$dest" ; then
            rm -rf "$dest"
            mkdir -p "$dest"
            cp -L $d/* "$dest"
@@ -655,788 +567,280 @@ copy_oldpackages()
     done
 }
 
-vm_img_create()
-{
-    local img="$1"
-    local size="$2"
-
-    echo "Creating $img (${size}M)"
-    mkdir -p "${img%/*}" || cleanup_and_exit 3
-
-    # prefer fallocate, which avoids fragmentation
-    r=1
-    if type -p fallocate > /dev/null; then
-        fallocate -l "${size}M" "$img"
-        r=$?
-    fi
-    # fall back to dd method if fallocate is not supported
-    if [ "$r" -gt "0" ]; then
-        dd if=/dev/zero of="$img" bs=1M count=0 seek="$size" || cleanup_and_exit 3
-    fi
-}
-
-vm_img_mkfs()
-{
-    local fs="$1"
-    local img="$2"
-    local mkfs tunefs
-    eval "mkfs=\"\$vm_img_mkfs_${fs}\""
-    eval "mkfs_exta_options=\"\$vm_img_mkfs_${fs}_extra\""
-    eval "tunefs=\"\$vm_img_tunefs_${fs}\""
-
-    if test -z "$mkfs"; then
-       echo "filesystem \"$fs\" isn't supported"
-       cleanup_and_exit 3
-    fi
-
-
-    echo "Creating $fs filesystem on $img"
-    if ! $mkfs $mkfs_exta_options "$img"; then
-        if test -z "$mkfs_exta_options"; then
-            cleanup_and_exit 3
-        else
-            echo "Format call failed, trying again without extra options..."
-            $mkfs "$img" || cleanup_and_exit 3
-        fi
-    fi
-    if test -n "$tunefs" ; then
-       $tunefs "$img" || cleanup_and_exit 3
-    fi
-}
-
-background_monitor_process()
-{
-  max_disk=0
-  max_mem=0
-  while sleep 5; do
-
-    # memory usage
-    if [ -e /proc/meminfo ]; then
-      memtotal=0
-      while read key value unit; do
-        case $key in
-          MemTotal:|SwapTotal:)
-            memtotal=$(( $memtotal + $value ))
-            ;;
-          MemFree:|SwapFree:|SwapCached:|Cached:|Buffers:)
-            memtotal=$(( $memtotal - $value ))
-            ;;
-        esac
-      done < /proc/meminfo
-
-      if [ ${memtotal} -gt $max_mem ]; then
-        max_mem="${memtotal}"
-        echo -n $(( $max_mem / 1024 )) > /.build/_statistics.memory.new && mv /.build/_statistics.memory.new /.build/_statistics.memory
-      fi
-    fi
-
-    # disk storage usage
-    if type -p df >& /dev/null; then
-      c=(`df -m / 2>/dev/null | tail -n 1`)
-
-      if [ ${c[2]} -gt $max_disk ]; then
-        max_disk="${c[2]}"
-        echo -n $max_disk > /.build/_statistics.df.new && mv /.build/_statistics.df.new /.build/_statistics.df
-      fi
-    fi
-
-    [ -e /.build/_statistics.exit ] && exit 0
-  done
-}
-
-detect_vm_2nd_stage()
-{
-    if test -e /.build/build.data; then
-        . /.build/build.data
-    fi
-    if test -z "$VM_TYPE" ; then
-       return 1
-    fi
-    if test $$ -eq 1 || test $$ -eq 2; then
-       # ignore special init signals if we're init
-       # we're using ' ' instead of '' so that the signal handlers
-       # are reset in the child processes
-       trap ' ' HUP TERM
-       $0 "$@"
-       cleanup_and_exit $?
-    fi
-    echo "2nd stage started in virtual machine"
-    BUILD_ROOT=/
-    BUILD_DIR=/.build
-    echo "machine type: `uname -m`"
-    if test "$PERSONALITY" != 0 -a -z "$PERSONALITY_SET" ; then
-       export PERSONALITY_SET=true
-       echo "switching personality to $PERSONALITY..."
-       # this is 32bit perl/glibc, thus the 32bit syscall number
-       exec perl -e 'syscall(136, '$PERSONALITY') == -1 && warn("personality: $!\n");exec "/.build/build" || die("/.build/build: $!\n")'
-    fi
-    RUNNING_IN_VM=true
-    test -e /proc/version || mount -orw -n -tproc none /proc
-    if test "$VM_TYPE" != 'lxc'; then
-       mount -n ${VMDISK_MOUNT_OPTIONS},remount,rw /
-    fi
-    umount /run >/dev/null 2>&1
-# qemu inside of xen does not work, check again with kvm later before enabling this
-#    if [ -e /dev/kqemu ]; then
-#        # allow abuild user to run qemu
-#        chmod 0666 /dev/kqemu
-#    fi
-    if test "$VM_TYPE" = 'zvm' ; then
-        VM_SWAP='/dev/dasdb1'
-    fi
-    if test "$VM_TYPE" = 'ec2' ; then
-        VM_SWAP='/dev/sdb1'
-        # Usually the external system is writing the swap signature, but EC2 volume
-        # attach is very slow, so let's do it in the VM for now.
-        mkswap "$VM_SWAP"
-    fi
-    if test -n "$VM_SWAP" ; then
-       for i in 1 2 3 4 5 6 7 8 9 10 ; do
-           test -e "$VM_SWAP" && break
-           test $i = 1 && echo "waiting for $VM_SWAP to appear"
-           echo -n .
-           sleep 1
-       done
-       test $i = 1 || echo
-       # recreate the swap device manually if it didn't exist for some
-       # reason, hardcoded to hda2 atm
-       if ! test -b "$VM_SWAP" ; then
-           rm -f "$VM_SWAP"
-           umask 027
-           mknod "$VM_SWAP" b 3 2
-           umask 022
-       fi
-       swapon -v "$VM_SWAP" || exit 1
-    fi
-    HOST="$MYHOSTNAME"
-
-    # fork a process monitoring max filesystem fillment during build
-    if test "$statistics" = "1"; then
-        background_monitor_process &
-    fi
-
-    if [ ! -e /dev/.udev ]; then
-        echo "WARNING: udev not running, creating extra device nodes"
-        test -e /dev/fd || ln -sf /proc/self/fd /dev/fd
-        test -e /etc/mtab || ln -sf /proc/mounts /etc/mtab
-    fi
-
-    # set date to build start on broken systems (now < build start)
-    if [ $(date '+%s') -lt $(date -r /.build/.date '+%s') ]; then
-        echo -n "WARNING: system has a broken clock, setting it to a newer time: "
-        date -s `cat /.build/.date`
-    fi
-
-    return 0
-}
-
-find_spec_files()
-{
-    local spec files
-    if [ -z "$SPECFILES" ]; then
-       set -- "`pwd`"
-    else
-       set -- "${SPECFILES[@]}"
-    fi
-    SPECFILES=()
-    for spec in "$@"; do
-       if [ "$spec" = "${spec#/}" ]; then
-           spec="`pwd`/$spec"
-       fi
-
-       if [ -d "$spec" ]; then
-           specs=("$spec"/*.spec)
-           if [ -n "$specs" ]; then
-               SPECFILES=("${SPECFILES[@]}" "${specs[@]}")
-           else
-               specs=("$spec"/*.spec)
-               if [ -n "$specs" ]; then
-                   SPECFILES=("${SPECFILES[@]}" "${specs[@]}")
-               fi
-           fi
-       else
-           SPECFILES[${#SPECFILES[@]}]="$spec";
-       fi
-    done
-
-    if test -z "$SPECFILES"; then
-       echo no spec files or src rpms found in $@. exit...
-       cleanup_and_exit 1
-    fi
-}
-
-become_root_or_fail()
-{
-    if [ ! -w /root ]; then
+become_root_or_fail() {
+    if test ! -w /root ; then
        echo "You have to be root to use $0" >&2
        exit 1
     fi
     cleanup_and_exit 1
 }
 
-mkdir_build_root()
-{
-    if [ -d "$BUILD_ROOT" ]; then
+mkdir_build_root() {
+    if test -d "$BUILD_ROOT" ; then
        # check if it is owned by root
-       if [ -z "$RUNNING_IN_VM" -a \! -O "$BUILD_ROOT" -a "`stat -c %u $BUILD_ROOT`" -ne 0 ]; then
+       if test -z "$RUNNING_IN_VM" -a \! -O "$BUILD_ROOT" -a "`stat -c %u $BUILD_ROOT`" -ne 0 ; then
            echo "BUILD_ROOT=$BUILD_ROOT must be owned by root. Exit..."
            cleanup_and_exit 1
        fi
     else
        test "$BUILD_ROOT" != "${BUILD_ROOT%/*}" && mkdir -p "${BUILD_ROOT%/*}"
-       if ! mkdir $BUILD_ROOT; then
+       if ! mkdir $BUILD_ROOT ; then
            echo "can not create BUILD_ROOT=$BUILD_ROOT. Exit..."
            cleanup_and_exit 1
        fi
     fi
 
-    if [ ! -w "$BUILD_ROOT" ]; then
+    if test ! -w "$BUILD_ROOT" ; then
        echo "Error: BUILD_ROOT=$BUILD_ROOT not writeable, try --clean."
        cleanup_and_exit 3
     fi
 
     rm -rf "$BUILD_ROOT/.build.packages"
-    if [ -z "$VM_TYPE" -a -z "$RUNNING_IN_VM" ]; then
-       # don't touch this in VM
-       rm -rf "$BUILD_ROOT/.build"
-       mkdir -p "$BUILD_ROOT/.build"
+    if test -z "$VM_TYPE" -a -z "$RUNNING_IN_VM" ; then
+         # don't touch this in VM
+         rm -rf "$BUILD_ROOT/.build"
+         mkdir -p "$BUILD_ROOT/.build"
     fi
 }
 
-ec2_volume_state()
-{
-    local VM_VOL_NAME="$1"
-    temp_file=`mktemp`
-    ec2-describe-volumes "$VM_VOL_NAME" --region "$BUILD_EC2_REGION" > $temp_file
-
-    if grep -q ^ATTACHMENT "$temp_file"; then
-      grep ^ATTACHMENT "$temp_file" | awk '{ print $5 }'
+copy_overlay() {
+    if test -d "$OVERLAY"; then
+       pushd $OVERLAY
+       echo "Copying overlay to BUILD_ROOT"
+       tar -cpf - . | (cd $BUILD_ROOT ; tar -xvf -)
+       popd
     else
-      grep ^VOLUME "$temp_file" | awk '{ print $5 }'
-    fi
-    rm "$temp_file"
-}
-
-cloud_volume_attach()
-{
-    local VM_SERVER="$1"
-    local VM_VOL_NAME="$2"
-    local VM_VOL_DEV="$3"
-
-    if [ "$VM_TYPE" = 'openstack' ]; then
-      if ! nova volume-attach "$VM_SERVER" "$VM_VOL_NAME" "$VM_VOL_DEV"; then
-          echo "ERROR: nova attach failed. $?" >&2
-          return 3
-      fi
-      while true; do
-          state=`nova volume-show "$VM_VOL_NAME" | sed -n 's,^|[ ]*status[ ]*|[ ]*\([^ ]*\).*,\1,p'`
-          [ "$state" == "in-use" ] && break
-          if [ -z "$state" ]; then
-             echo "ERROR: unable to find state of volume $VM_VOL_NAME" >&2
-             return 3
-          fi
-          if [ "$state" == "available" ]; then
-             echo "WARNING: volume $VM_VOL_NAME got not attached, retrying" >&2
-             if ! nova volume-attach "$VM_SERVER" "$VM_VOL_NAME" "$VM_VOL_DEV"; then
-                 echo "ERROR: nova attach failed. $?" >&2
-                 return 3
-             fi
-          fi
-          sleep 3
-      done
-
-      if [ ! -e "$VM_VOL_DEV" ]; then
-          #GROSS HACK: kernel does not care about the given device name
-#          VM_VOL_DEV="/dev/"`dmesg| sed -n 's,.*\(vd.\): unknown partition tab.*,\1,p' | tail -n 1`
-          VM_VOL_DEV=`ls -1 /dev/vd? | tail -n 1`
-      fi
-      echo "$VM_VOL_DEV"
-    elif [ "$VM_TYPE" = 'ec2' ]; then
-      temp_file=`mktemp`
-      if ! ec2-attach-volume "$VM_VOL_NAME" -d /dev/sdz -i `ec2-instance-id` --region $BUILD_EC2_REGION > "$temp_file"; then
-         rm "$temp_file"
-         cleanup_and_exit 1
-      fi
-      # wait that it becomes available
-      while true; do
-        state=`ec2_volume_state "$VM_VOL_NAME"`
-        [ "$state" = "attached" ] && break
-        sleep 1
-      done
-      # print device node
-      grep ^ATTACHMENT "$temp_file" | awk '{ print $4 }'
-      rm "$temp_file"
-    fi
-}
-
-cloud_volume_detach()
-{
-    local VM_SERVER="$1"
-    local VM_VOL_NAME="$2"
-    if [ "$VM_TYPE" = 'openstack' ]; then
-      # needed at all?
-      nova volume-show "$VM_VOL_NAME" | grep -q in-use || return 0
-
-      # umount seems not to be enough
-      sync
-
-      if ! nova volume-detach "$VM_SERVER" "$VM_VOL_NAME"; then
-          echo "ERROR: nova detach of $VM_VOL_NAME failed." >&2
-          return 3
-      fi
-      while nova volume-show "$VM_VOL_NAME" | grep -q availabe; do
-          sleep 3
-      done
-    elif [ "$VM_TYPE" = 'ec2' ]; then
-       state=`ec2_volume_state "$VM_VOL_NAME"`
-       if [ "$state" != "available" ]; then
-         ec2-detach-volume "$VM_VOL_NAME" --region $BUILD_EC2_REGION || return 3
-       fi
+       echo "OVERLAY ($OVERLAY) is no directory - skipping"
     fi
-    return 0
 }
 
-linux64()
-{
-       perl -e 'syscall('$PERSONALITY_SYSCALL', 0); exec(@ARGV) || die("$ARGV[0]: $!\n")' "$@"
-}
-
-check_for_arm()
-{
-    local uname
-
-    uname=$(uname -m)
-
-    if [ "$uname" != "armv7l" ]; then
-        return
-    fi
-
-    export HOST_ARCH=armv7l
-
-    export kvm_bin="/usr/bin/qemu-system-arm"
-    export console=ttyAMA0
-    export KVM_OPTIONS="-enable-kvm -M vexpress-a15 -dtb /boot/a15-guest.dtb -cpu cortex-a15"
-    VM_KERNEL=/boot/zImage
-    VM_INITRD=/boot/initrd
-    # prefer the guest kernel
-    if [ -e /boot/zImage.guest ]; then
-        VM_KERNEL=/boot/zImage.guest
-    fi
-    # prefer the guest initrd
-    if [ -e /boot/initrd.guest ]; then
-        VM_INITRD=/boot/initrd.guest
+run_rsync() {
+    if test -n "$RSYNCDEST" ; then
+       if test -d "$RSYNCSRC" ; then
+           if ! test -d "$BUILD_ROOT/$RSYNCDEST" ; then
+               echo "ATTENTION! Creating missing target directory ($BUILD_ROOT/$RSYNCDEST)."
+               mkdir -p $BUILD_ROOT/$RSYNCDEST
+           fi
+           echo "Running rsync ..."
+           rsync -av $RSYNCSRC/* $BUILD_ROOT/$RSYNCDEST/
+           chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT/$RSYNCDEST"
+           RSYNCDONE=true
+           echo "... done"
+       else
+           echo "RSYNCSRC is not a directory - skipping"
+       fi
+    else
+       echo "RSYNCSRC given, but not RSYNCDEST - skipping"
     fi
-    export VM_KERNEL
-    export VM_INITRD
-}
-
-check_for_ppc()
-{
-    local uname
-
-    uname=$(uname -m)
-
-    case $uname in
-         ppc|ppc64) export VM_KERNEL=/boot/vmlinux
-                    export VM_INITRD=/boot/initrd
-                    ;;
-         ppc64le)   export VM_INITRD=/boot/vmlinuxle
-                    export VM_INITRD=/boot/initrdle
-                    ;;
-         *)         return ;;
-    esac
-
-    grep -q "PowerNV" /proc/cpuinfo && export HOST_ARCH=power7 || export HOST_ARCH=ppc970
-
-    export kvm_bin="/usr/bin/qemu-system-ppc64"
-    export console=hvc0
-    export KVM_OPTIONS="-enable-kvm -M pseries"
-    if [ -z "$RUNNING_IN_VM" -a -n "$HUGETLBFSPATH" ];then
-      if ! grep -q "$HUGETLBFSPATH" /proc/mounts; then
-         echo "hugetlbfs is not mounted"
-         exit 1
-      fi
-         PAGES_FREE=$(cat /sys/kernel/mm/hugepages/hugepages-16384kB/free_hugepages)
-         PAGES_REQ=$(( ${MEMSIZE:-64} / 16 ))
-      if [ "$PAGES_FREE" -lt "$PAGES_REQ" ];then
-         echo "please adjust nr_hugepages"
-         exit 1
-      fi
-      if [ "$HOST_ARCH" = "ppc970" ];then
-          if ! grep -q -E '(kvm_rma_count.*kvm_hpt_count)|(kvm_hpt_count.*kvm_rma_count)' /proc/cmdline; then
-             echo "put kvm_rma_count=<VM number> or kvm_hpt_count=<> to your boot options"
-             exit 1
-          fi
-      fi
-   fi
 }
 
 #### main ####
 
 trap fail_exit EXIT
 
-archname=`perl -V:archname`
-archname="${archname#archname=?}"
-case "$archname" in
-    x86_64*) PERSONALITY_SYSCALL=135 ;;
-    alpha*) PERSONALITY_SYSCALL=324 ;;
-    sparc*) PERSONALITY_SYSCALL=191 ;;
-    ia64*) PERSONALITY_SYSCALL=1140 ;;
-    i?86*|ppc*|aarch64*|arm*|sh4|cris|m68k*|s390*|unicore32|microblaze)   PERSONALITY_SYSCALL=136 ;;
-    *) echo "ARCHITECTURE PERSONALITY IS UNKNOWN"; exit 1;;
-esac
-
 shopt -s nullglob
 
-export PATH=$BUILD_DIR:/sbin:/usr/sbin:$PATH
+export PATH=$BUILD_DIR:/sbin:/usr/sbin:/bin:/usr/bin:$PATH
 
-if detect_vm_2nd_stage ; then
-    set "/.build-srcdir/$SPECFILE"
+if vm_detect_2nd_stage ; then
+    set "/.build-srcdir/$RECIPEFILE"
     export PATH=/.build:$PATH
 fi
 
 . $BUILD_DIR/common_functions || exit 1
-. $BUILD_DIR/zvm_functions || exit 1
 
 export HOST
 
-needarg()
-{
-  if [ -z "$ARG" ]; then
-    echo "$PARAM needs an agrument" >&2
-    cleanup_and_exit 1
-  fi
+needarg() {
+    if test -z "$ARG" ; then
+       echo "$PARAM needs an agrument" >&2
+       cleanup_and_exit 1
+    fi
 }
 
 while test -n "$1"; do
-  PARAM="$1"
-  UNSTRIPPED_ARG="$2"
-  ARG="$2"
-  [ "$ARG" = "${ARG#-}" ] || ARG=""
-  ARG2="$3"
-  [ "$ARG2" = "${ARG2#-}" ] || ARG2=""
-  shift
-  case $PARAM in
-    *-*=*)
-      ARG=${PARAM#*=}
-      PARAM=${PARAM%%=*}
-      set -- "----noarg=$PARAM" "$@"
-  esac
-  case $PARAM in
-      *-help|-h)
+    PARAM="$1"
+    ARG="$2"
+    test "$ARG" = "${ARG#-}" || ARG=
+    shift
+    case $PARAM in
+      *-*=*)
+       ARG=${PARAM#*=}
+       PARAM=${PARAM%%=*}
+       set -- "----noarg=$PARAM" "$@"
+       ;;
+    esac
+    case ${PARAM/#--/-} in
+      -help|-h)
        echo_help
        cleanup_and_exit
       ;;
-      *-no*init)
+      -noinit|-no-init)
        DO_INIT=false
       ;;
-      *-no*checks)
+      -nochecks|-no-checks)
        DO_CHECKS=false
       ;;
-      -clean|--clean)
+      -clean)
        CLEAN_BUILD='--clean'
       ;;
-      *-kill)
+      -kill)
        KILL=true
       ;;
-      *-rpms)
+      -rpms)
        needarg
        BUILD_RPMS="$ARG"
        shift
       ;;
-      *-arch)
+      -arch)
        needarg
        BUILD_ARCH="$ARG"
        shift
       ;;
-      *-verify)
+      -verify)
        export VERIFY_BUILD_SYSTEM=true
       ;;
-      *-target)
+      -target)
        needarg
        ABUILD_TARGET="$ARG"
        shift
       ;;
-      *-jobs)
+      -jobs)
        needarg
        BUILD_JOBS="$ARG"
        shift
       ;;
-      *-threads)
+      -threads)
        needarg
        BUILD_THREADS="$ARG"
        shift
       ;;
-      *-extra*packs|-X)
+      -extrapacks|-extra-packs|-X)
        needarg
        BUILD_EXTRA_PACKS="$BUILD_EXTRA_PACKS $ARG"
        shift
       ;;
-      *-lint)
+      -lint)
        DO_LINT=true
        ;;
-      *-baselibs)
+      -baselibs)
        CREATE_BASELIBS=true
        ;;
-      --kiwi-parameter)
-       KIWI_PARAMETERS="$KIWI_PARAMETERS $UNSTRIPPED_ARG"
-       shift
-       ;;
-      *-baselibs-internal)
+      -baselibs-internal)
        CREATE_BASELIBS=internal
        ;;
-      *-use-system-qemu)
-       USE_SYSTEM_QEMU="--use-system-qemu"
-      ;;
-      *-root)
+      -root)
        needarg
        BUILD_ROOT="$ARG"
        shift
       ;;
-      *-cachedir)
+      -cachedir)
        needarg
        CACHE_DIR="$ARG"
        shift
       ;;
-      *-oldpackages)
+      -oldpackages)
        needarg
        old_packages=("${old_packages[@]}" "$ARG")
        shift
       ;;
-      *-dist)
+      -dist)
        needarg
        BUILD_DIST="$ARG"
        shift
       ;;
-      *-emulator-script)
-       needarg
-       EMULATOR_SCRIPT="$ARG"
-       shift
-      ;;
-      *-xen|*-kvm|--uml|--qemu|--emulator)
-       VM_TYPE=${PARAM##*-}
-       if [ -n "$ARG" ]; then
-           VM_IMAGE="$ARG"
-           shift
-       else
-           VM_IMAGE=1
-       fi
-      ;;
-      *-zvm)
-        VM_TYPE="zvm"
-       shift
-      ;;
-      --lxc)
-       VM_TYPE=${PARAM##*-}
-      ;;
-      --vm-type)
-       needarg
-       VM_TYPE="$ARG"
-       case "$VM_TYPE" in
-            zvm) ;;
-            ec2)
-               test -z "$VM_IMAGE" && VM_IMAGE=1
-                . /etc/profile.d/ec2.sh
-                EC2_INSTANCE_ID=`ec2-instance-id`
-                BUILD_EC2_ZONE=`ec2-meta-data placement/availability-zone`
-                BUILD_EC2_REGION=${BUILD_EC2_ZONE%?}
-               ;;
-           xen|kvm|uml|qemu|lxc|emulator|openstack)
-               test -z "$VM_IMAGE" && VM_IMAGE=1
-               ;;
-           none|chroot) VM_TYPE='' ;;
-           *)
-               echo "VM $VM_TYPE not supported"
-               cleanup_and_exit
-           ;;
-       esac
-       shift
-      ;;
-      --vm-worker)
-        needarg
-        VM_WORKER="$ARG"
-        shift
-      ;;
-      --vm-worker-nr)
-        needarg
-        zvm_worker_nr="$ARG"
-        shift
-      ;;
-      --vm-server|--vm-region)
-       needarg
-       VM_SERVER="$ARG"
-       shift
-      ;;
-      --vm-volumes)
-       needarg
-       VM_VOLUME_NAME="$ARG"
-       shift
-       needarg
-       VM_VOLUME_SWAP="$ARG2"
-       shift
-      ;;
-      --vm-disk)
-       needarg
-       VM_IMAGE="$ARG"
-       shift
-      ;;
-      *-xenswap|*-swap)
-       needarg
-       VM_SWAP="$ARG"
-       shift
-      ;;
-      *-xenmemory|*-memory)
-       needarg
-       MEMSIZE="$ARG"
-       shift
-      ;;
-      *-vm-kernel)
-       needarg
-       VM_KERNEL="$ARG"
-       shift
-      ;;
-      *-vm-initrd)
-       needarg
-       VM_INITRD="$ARG"
-       shift
-      ;;
-      *-vmdisk-rootsize|--vm-disk-size)
-       needarg
-       VMDISK_ROOTSIZE="$ARG"
-       shift
-      ;;
-      *-vmdisk-swapsize|--vm-swap-size)
-       needarg
-       VMDISK_SWAPSIZE="$ARG"
-       shift
-      ;;
-      *-vmdisk-filesystem|--vm-disk-filesystem)
-       needarg
-       VMDISK_FILESYSTEM="$ARG"
-       shift
-      ;;
-      *-vmdisk-mount-options|--vm-disk-mount-options)
-       needarg
-        # options needs to be quoted to handle argument which might start with "-o ..."
-       VMDISK_MOUNT_OPTIONS=$(echo $ARG | sed 's/^\"\(.*\)\"$/\1/g')
-       shift
-      ;;
-      *-vmdisk-clean)
-       # delete old root/swap to get rid of the old blocks
-        VMDISK_CLEAN=true
-      ;;
-      *-rpmlist)
-       needarg
-       RPMLIST="--rpmlist $ARG"
-       BUILD_RPMS=
-       shift
-      ;;
-      *-hugetlbfs)
-        HUGETLBFSPATH="$ARG"
-       shift
-      ;;
-      *-release)
+      -release)
        needarg
        RELEASE="$ARG"
        shift
       ;;
-      *-logfile)
+      -logfile)
        needarg
        LOGFILE="$ARG"
        shift
       ;;
-      *-reason)
+      -reason)
        needarg
        REASON="$ARG"
        shift
       ;;
-      *-norootforbuild)
+      -norootforbuild)
        NOROOTFORBUILD=true
       ;;
-      *-stage)
-       needarg
-       BUILD_RPM_BUILD_STAGE="$ARG"
-       shift
-      ;;
-      *-useusedforbuild)
+      -useusedforbuild)
        USEUSEDFORBUILD="--useusedforbuild"
       ;;
-      *-configdir)
+      -configdir)
         needarg
        CONFIG_DIR="$ARG"
         shift
       ;;
-      *-list*state)
+      -list*state)
        LIST_STATE=true
       ;;
-      --define|--with|--without)
+      -define|-with|-without)
        needarg
-       definesnstuff[${#definesnstuff[@]}]="$PARAM";
-       definesnstuff[${#definesnstuff[@]}]="$ARG";
+        PARAM="-${PARAM/#--/-}"
+       definesnstuff[${#definesnstuff[@]}]="$PARAM"
+       definesnstuff[${#definesnstuff[@]}]="$ARG"
        shift
       ;;
-      --repository|--repo)
+      -repository|-repo)
        needarg
-       repos[${#repos[@]}]="$PARAM";
-       repos[${#repos[@]}]="$ARG";
+       repos[${#repos[@]}]="--repository"
+       repos[${#repos[@]}]="$ARG"
        shift
       ;;
-      --icecream)
+      -icecream)
        needarg
        icecream="$ARG"
-       if [ "$icecream" -gt 0 ]; then
-               BUILD_JOBS="$ARG"
-       fi
+       test "$icecream" -gt 0 && BUILD_JOBS="$ARG"
        shift
       ;;
-      --ccache)
-       ccache=1
+      -ccache)
+       CCACHE=true
       ;;
-      --statistics)
-       statistics=1
+      -statistics)
+       DO_STATISTICS=1
       ;;
-      --debug)
+      -debug)
        BUILD_DEBUG=1
       ;;
-      --incarnation)
+      -incarnation)
        needarg
        INCARNATION=$ARG
        shift
       ;;
-      --disturl)
+      -disturl)
        needarg
        DISTURL=$ARG
        shift
       ;;
-      --linksources)
+      -linksources)
        LINKSOURCES=true
       ;;
-      ----noarg)
-       echo "$ARG does not take an argument"
-       cleanup_and_exit
-      ;;
-      *-changelog)
+      -changelog)
        CHANGELOG=true
       ;;
-      --overlay)
+      -overlay)
        needarg
        OVERLAY=$ARG
        shift
       ;;
-      --rsync-src)
+      -rsync-src)
        needarg
        RSYNCSRC=$ARG
        shift
       ;;
-      --rsync-dest)
+      -rsync-dest)
        needarg
        RSYNCDEST=$ARG
        shift
       ;;
-      --uid)
+      -uid)
        needarg
        ABUILD_ID="$ARG"
-       if test -n "${ABUILD_ID//[0-9:]/}"; then
+       if test -n "${ABUILD_ID//[0-9:]/}" ; then
            echo "--uid argument must be uid:gid"
            cleanup_and_exit
        fi
@@ -1444,348 +848,73 @@ while test -n "$1"; do
        ABUILD_GID=${ABUILD_ID#*:}
        shift
       ;;
-      --shell)
-         shell=1
-         shift
+      -rpmlist)
+       needarg
+       RPMLIST="--rpmlist $ARG"
+       BUILD_RPMS=
+       shift
+      ;;  
+      -shell)
+       RUN_SHELL=1
+       shift
       ;;
-      --signdummy)
+      -signdummy)
        SIGNDUMMY=1
       ;;
+      ---noarg)
+       echo "$ARG does not take an argument"
+       cleanup_and_exit
+      ;;
       -*)
-       echo Unknown Option "$PARAM". Exit.
-       cleanup_and_exit 1
+       if vm_parse_options "$@" ; then
+           set -- "${nextargs[@]}"
+       elif recipe_parse_options "$@" ; then
+           set -- "${nextargs[@]}"
+       else
+           echo "Unknown option '$PARAM'. Exit."
+           cleanup_and_exit 1
+       fi
       ;;
       *)
-       SPECFILES[${#SPECFILES[@]}]="$PARAM";
+       RECIPEFILES[${#RECIPEFILES[@]}]="$PARAM"
       ;;
     esac
 done
 
-check_for_ppc
-check_for_arm
-
-if test "$VM_TYPE" = "lxc"; then
-    VM_IMAGE=''
-    VM_SWAP=''
-fi
-
-if test "$VM_TYPE" = "zvm"; then
-    VM_IMAGE='/dev/dasda1'
-    VM_SWAP='/dev/dasdb1'
-fi
-
-if test "$VM_TYPE" = "ec2"; then
-    # We can not use bash hashes because old bash does not support it
-    # This is always the x86_64 loader, we use also by default the
-    # local x86_64 kernel, which should be able to run a 32bit system
-    if [ "$BUILD_EC2_ZONE" = "us-east-1" ]; then
-        BUILD_EC2_AKI="aki-88aa75e1"
-    elif [ "$BUILD_EC2_ZONE" = "us-west-1" ]; then
-        BUILD_EC2_AKI="aki-f77e26b2"
-    elif [ "$BUILD_EC2_ZONE" = "us-west-2" ]; then
-        BUILD_EC2_AKI="aki-fc37bacc"
-    elif [ "$BUILD_EC2_ZONE" = "eu-west-1" ]; then
-        BUILD_EC2_AKI="aki-71665e05"
-    elif [ "$BUILD_EC2_ZONE" = "ap-southeast-1" ]; then
-        BUILD_EC2_AKI="aki-fe1354ac"
-    elif [ "$BUILD_EC2_ZONE" = "ap-southeast-2" ]; then
-        BUILD_EC2_AKI="aki-3f990e05"
-    elif [ "$BUILD_EC2_ZONE" = "ap-northeast-1" ]; then
-        BUILD_EC2_AKI="aki-44992845"
-    elif [ "$BUILD_EC2_ZONE" = "sa-east-1" ]; then
-        BUILD_EC2_AKI="aki-c48f51d9"
-    elif [ "$BUILD_EC2_ZONE" = "us-gov-west-1" ]; then
-        BUILD_EC2_AKI="aki-79a4c05a"
-    else
-        echo "Unknown Amazon EC2 Zone: $BUILD_EC2_ZONE"
-        exit 1
-    fi
-fi
-
-if test "$VMDISK_MOUNT_OPTIONS" = __default; then
-    if test "$VMDISK_FILESYSTEM" = reiserfs ; then
-       VMDISK_MOUNT_OPTIONS='-o data=writeback,commit=150,noatime'
-    elif test "$VMDISK_FILESYSTEM" = btrfs ; then
-        VMDISK_MOUNT_OPTIONS='-o nobarrier,noatime'
-    elif test "$VMDISK_FILESYSTEM" = "ext4" ; then
-       VMDISK_MOUNT_OPTIONS='-o noatime'
-    elif test "$VMDISK_FILESYSTEM" = "ext3" ; then
-       VMDISK_MOUNT_OPTIONS='-o data=writeback,nobarrier,commit=150,noatime'
-    elif test "$VMDISK_FILESYSTEM" = "ext2" ; then
-       VMDISK_MOUNT_OPTIONS='-o noacl,noatime'
-    elif test "$VMDISK_FILESYSTEM" = "xfs" ; then
-       VMDISK_MOUNT_OPTIONS='-o noatime'
-    else
-       VMDISK_MOUNT_OPTIONS='-o noatime'
-    fi
-fi
-
 if test -n "$KILL" ; then
     test -z "$SRCDIR" || usage
     if test -n "$VM_IMAGE" -a -n "$VM_SWAP" -a -n "$VM_TYPE"; then
        # mark job as failed so that we don't extract packages
-       if test "$VM_TYPE" != "zvm"; then
+       if test "$VM_TYPE" != zvm ; then
            echo -n "BUILDSTATUS1" >"$VM_SWAP"
         fi
     fi
     (set -C; > "$BUILD_ROOT/exit" 2>/dev/null || true)
-    if test "$VM_TYPE" = 'lxc'; then
-       LXCID=${BUILD_ROOT##*/}
-       lxc-stop -n "$LXCID" || true
-       lxc-destroy -n "$LXCID"
-    elif test -z "$VM_IMAGE" ; then
+    if test -n "$VM_TYPE" ; then
+        vm_kill
+    else
        if ! $BUILD_DIR/killchroot -s 9 $BUILD_ROOT ; then
            echo "could not kill build in $BUILD_ROOT"
            cleanup_and_exit 1
        fi
-    elif test "$VM_TYPE" = 'xen'; then
-       XENID="${VM_IMAGE%/root}"
-       XENID="${XENID%/tmpfs}"
-       XENID="${XENID##*/}"
-       XENID="${XENID#root_}"
-       if xm list "build_$XENID" >/dev/null 2>&1 ; then
-           if ! xm destroy "build_$XENID" ; then
-               echo "could not kill xen build $XENID"
-               cleanup_and_exit 1
-           fi
-       fi
-    elif test "$VM_TYPE" = 'zvm'; then
-       if vmcp q "$VM_WORKER" > /dev/null 2>&1 ; then
-            if ! zvm_cp destroy $VM_WORKER ; then
-               echo "could not kill zvm worker $VM_WORKER"
-               cleanup_and_exit 1
-            fi
-        fi
-    elif test "$VM_TYPE" = 'ec2'; then
-       if ec2-describe-instance-status "$VM_BUILD_INSTANCE" --region $BUILD_EC2_REGION >/dev/null 2>&1 ; then
-           if ec2-terminate-instances "$VM_BUILD_INSTANCE" >/dev/null 2>&1 ; then
-               echo "could not kill EC2 instance $VM_BUILD_INSTANCE"
-               cleanup_and_exit 1
-           fi
-       fi
-    elif test "$VM_TYPE" = 'openstack'; then
-       if nova show "$VM_VOLUME_NAME" >/dev/null 2>&1 ; then
-           if ! nova delete "$VM_VOLUME_NAME" ; then
-               echo "could not kill openstack vm build $VM_VOLUME_NAME"
-               cleanup_and_exit 1
-           fi
-       fi
-    elif test -n "$VM_TYPE"; then
-       if ! fuser -k -TERM "$VM_IMAGE"; then
-           echo "could not kill build in $VM_IMAGE"
-           cleanup_and_exit 1
-       fi
-    else
-       echo "don't know how to kill this build job"
-       cleanup_and_exit 1
     fi
     cleanup_and_exit 0
 fi
 
-if [ "$VM_TYPE" = 'xen' -a -z "$RUNNING_IN_VM" ]; then
-    # XXX: merge with kvm path?
-    if [ -n "$VM_KERNEL" ]; then
-       vm_kernel="$VM_KERNEL"
-    elif [ -e "/boot/vmlinuz-xen" ]; then
-       vm_kernel="/boot/vmlinuz-xen"
-    fi
-    if [ -n "$VM_INITRD" ]; then
-       vm_initrd="$VM_INITRD"
-    elif [ -e "/boot/initrd-xen" ]; then
-       vm_initrd="/boot/initrd-xen"
-    fi
-fi
-
-if [ "$VM_TYPE" = 'zvm' -a -z "$RUNNING_IN_VM" ]; then
-    # verify settings
-    # In z/VM, this is a 4 digit hex number instead of a linux device.
-    # This is the root disk defined in user direct
-    # This number can be given with the parameter --root NR.
-    if [ -z "$VM_VOLUME_ROOT" ]; then
-        if [ -n "$BUILD_ROOT" -a ${#BUILD_ROOT} -le 4 ]; then
-            VM_VOLUME_ROOT="$BUILD_ROOT"
-        else
-            VM_VOLUME_ROOT="0150"
-        fi
-    fi
-    # In z/VM, this is a 4 digit hex number instead of a linux device.
-    # This is the swap disk defined in user direct
-    # This number can be given with the parameter --swap NR.
-    if [ -z "$VM_VOLUME_SWAP" ]; then
-        if [ -n "$VM_SWAP" -a ${#VM_SWAP} -le 4 ]; then
-            VM_VOLUME_SWAP="$VM_SWAP"
-        else
-            VM_VOLUME_SWAP="0250"
-        fi
-    fi
-    # z/VM guest name that is already defined in z/VM
-    if [ -z "$VM_WORKER" ]; then
-        echo "ERROR: No z/VM worker id specified"
-       cleanup_and_exit 3
-    fi
-    if [ -z "$zvm_worker_nr" ]; then
-        echo "ERROR: No z/VM worker number specified"
-        cleanup_and_exit 3
-    fi
-    # need the name for a kernel in zvm
-    if [ -n "$VM_KERNEL" ]; then
-        vm_kernel="$VM_KERNEL"
-    elif [ -e "/boot/vmlinux.gz" ]; then
-        vm_kernel="/boot/vmlinux.gz"
-    else
-        echo "ERROR: No z/VM kernel specified"
-       cleanup_and_exit 3
-    fi
-    # need the name for an initrd in zvm
-    # this normally will not be the local initrd
-    if [ -n "$VM_INITRD" ]; then
-        vm_initrd="$VM_INITRD"
-    else
-        echo "ERROR: No z/VM initrd specified"
-       cleanup_and_exit 3
-    fi
-fi
-
-if [ "$VM_TYPE" = 'ec2' -a -z "$RUNNING_IN_VM" ]; then
-    # verify settings
-    if [ -z "$AWS_ACCESS_KEY" -o -z "$AWS_ACCESS_KEY" ]; then
-       echo "ERROR:No amazon EC2 environment set. Set AWS_ACCESS_KEY and AWS_SECRET_KEY."
-       cleanup_and_exit 3
-    fi
-    if [ -z "$BUILD_EC2_AKI"  ]; then
-       echo "ERROR: No image refering to kernel and ramdisk is defined in BUILD_EC2_AKI env."
-       cleanup_and_exit 3
-    fi
-    if [ -z "$VM_VOLUME_NAME" ]; then
-       echo "ERROR: No worker root VM volume name specified."
-       cleanup_and_exit 3
-    fi
-    if [ -z "$VM_VOLUME_SWAP" ]; then
-       echo "ERROR: No worker swap VM volume name specified."
-       cleanup_and_exit 3
-    fi
-
-    # go
-    VM_IMAGE=`cloud_volume_attach "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"`
-    [ "${VM_IMAGE:0:5}" == "/dev/" ] || cleanup_and_exit 3
-fi
-
-if [ "$VM_TYPE" = 'openstack' -a -z "$RUNNING_IN_VM" ]; then
-    # verify settings
-    if [ -z "$OS_AUTH_URL" ]; then
-       echo "ERROR:No openstack environment set. This vm-type works only inside of an openstack VM."
-       cleanup_and_exit 3
-    fi
-    if [ -z "$OBS_OPENSTACK_KERNEL_IMAGE_ID" ]; then
-       echo "ERROR: No image refering to kernel and ramdisk is defined in OBS_OPENSTACK_KERNEL_IMAGE_ID env."
-       cleanup_and_exit 3
-    fi
-    if [ -z "$VM_VOLUME_NAME" ]; then
-       echo "ERROR: No worker root VM volume name specified."
-       cleanup_and_exit 3
-    fi
-    if [ -z "$VM_VOLUME_SWAP" ]; then
-       echo "ERROR: No worker swap VM volume name specified."
-       cleanup_and_exit 3
-    fi
-    if [ -z "$VM_SERVER" ]; then
-       echo "ERROR: No VM server nod name specified (usually this instance)."
-       cleanup_and_exit 3
-    fi
-
-    # go
-    VM_IMAGE=`cloud_volume_attach "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"`
-    [ "${VM_IMAGE:0:5}" == "/dev/" ] || cleanup_and_exit 3
+if test -n "$CLEAN_BUILD" ; then
+    DO_INIT=true
 fi
 
-if [ "$VM_TYPE" = 'kvm' -a -z "$RUNNING_IN_VM" ]; then
-    if [ ! -r /dev/kvm -o ! -x "$kvm_bin" ]; then
-       echo "host doesn't support kvm"
-       echo "either the kvm kernel-module is not loaded or kvm is not installed or hardware virtualization is deactivated in the BIOS."
-       cleanup_and_exit 3
-    fi
-    qemu_bin="$kvm_bin"
-    if [ -n "$VM_KERNEL" ]; then
-       vm_kernel="$VM_KERNEL"
-    fi
-
-    # check if a SUSE system with virtio initrd is running
-    if [ -z "$VM_INITRD" -a -e /etc/sysconfig/kernel ]; then
-       a=$( source /etc/sysconfig/kernel; echo $INITRD_MODULES )
-       have_virtio_pci=""
-       have_virtio_blk=""
-       for i in $a; do
-          [ "$i" == "virtio_pci" ] && have_virtio_pci="1"
-          [ "$i" == "virtio_blk" ] && have_virtio_blk="1"
-       done
-       [ -n "$have_virtio_pci" -a -n "$have_virtio_blk" ] && VM_INITRD="/boot/initrd"
-    fi
-
-    if [ -n "$VM_INITRD" ]; then
-       vm_initrd="$VM_INITRD"
-       kvm_virtio=1
-    elif [ -e "${vm_initrd}-build" ]; then
-       vm_initrd="${vm_initrd}-build"
-       kvm_virtio=1
-    else
-       if [ -L "$vm_initrd" ]; then
-           vm_initrd=`readlink -f "$vm_initrd"` || cleanup_and_exit 3
-       fi
-       vm_initrd_virtio="${vm_initrd}-virtio"
-
-       if [ ! -e ${vm_initrd_virtio} -o $vm_kernel -nt ${vm_initrd_virtio} ]; then
-           mkinitrd_virtio_cmd=(env rootfstype="$VMDISK_FILESYSTEM" \
-                   mkinitrd -d /dev/null \
-                   -m "ext3 ext4 btrfs reiserfs binfmt_misc virtio_pci virtio_blk" \
-                   -k $vm_kernel \
-                   -i ${vm_initrd_virtio})
-           if [ ! -w /root -o -n "$RPMLIST" ]; then
-               echo "No initrd that provides virtio support found. virtio accelleration disabled."
-               echo "Run the following command as root to enable virtio:"
-               shellquote "${mkinitrd_virtio_cmd[@]}"
-               echo
-           elif /sbin/modinfo virtio_pci >/dev/null 2>&1; then
-               echo "creating $vm_initrd_virtio"
-               "${mkinitrd_virtio_cmd[@]}" || cleanup_and_exit 1
-               kvm_virtio=1
-               vm_initrd="${vm_initrd_virtio}"
-           fi
-       else
-           kvm_virtio=1
-           vm_initrd="${vm_initrd_virtio}"
-       fi
-    fi
-
-    case $HOST_ARCH in
-        power7|armv7l) kvm_virtio=1;;
-        ppc970) kvm_virtio=;;
-    esac
-
-    if [ "$kvm_virtio" = 1 ]; then
-       VM_SWAPDEV=/dev/vdb
-       qemu_rootdev=/dev/vda
-    else
-       VM_SWAPDEV=/dev/sdb
-       qemu_rootdev=/dev/sda
+if test -n "$VM_TYPE" -a -z "$RUNNING_IN_VM" ; then
+    if test -z "$VMDISK_FILESYSTEM" -a -n "$BUILD_DIST" ; then
+       VMDISK_FILESYSTEM=`queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" buildflags vmfstype`
     fi
+    test -n "$VMDISK_FILESYSTEM" || VMDISK_FILESYSTEM=ext3
+    vm_verify_options
 fi
 
-if [ "$VM_TYPE" = 'openstack' ]; then
-    VM_SWAPDEV=/dev/vdb
-    qemu_rootdev=/dev/vda
-fi
-
-if [ "$VM_TYPE" = 'qemu' ]; then
-    VM_SWAPDEV=/dev/sdb
-    qemu_rootdev=/dev/sda
-fi
-
-if [ "$VM_TYPE" = 'uml' ]; then
-    VM_SWAPDEV=/dev/ubdb
-fi
-
-if [ -z "$RPMLIST" -a -z "$RUNNING_IN_VM" ]; then
-    if [ -z "$repos" -a -z "$BUILD_RPMS" ]; then
+if test -z "$RPMLIST" -a -z "$RUNNING_IN_VM" ; then
+    if test -z "$repos" -a -z "$BUILD_RPMS" ; then
        repos=(--repository 'zypp://')
     fi
 else
@@ -1794,158 +923,56 @@ fi
 
 set_build_arch
 
-if [ -n "$CLEAN_BUILD" ]; then
-    DO_INIT=true
-fi
-
-find_spec_files
+expand_recipe_directories
 
 if test -n "$LIST_STATE" ; then
     BUILD_ROOT=`mktemp -d /var/tmp/build-list-state-XXXXXX`
     test -d "$BUILD_ROOT" || cleanup_and_exit 3
-    SPECFILE=$SPECFILES # only one specified anyways
-    if test "$SPECFILE" != "${SPECFILE%.src.rpm}" ; then
-       rm -rf "$BUILD_ROOT/usr/src/packages"
-       mkdir -p $BUILD_ROOT/usr/src/packages/SOURCES $BUILD_ROOT/usr/src/packages/SPECS
-       rpm -i --nodigest --nosignature --root $BUILD_ROOT $SPECFILE || {
-          echo "could not install $SPECFILE." 2>&1
-          rm -rf "$BUILD_ROOT"
-          cleanup_and_exit 3
-       }
-       for SPECFILE in $BUILD_ROOT/usr/src/packages/SPECS/*.spec ; do : ; done
+    RECIPEFILE=$RECIPEFILES # only one specified anyways
+    if test "$RECIPEFILE" != "${RECIPEFILE%.src.rpm}" ; then
+       MYSRCDIR="$BUILD_ROOT/usr/src/packages/SOURCES"
+       recipe_unpack_srcrpm
+       RECIPEFILE="$MYSRCDIR/$RECIPEFILE"
     fi
-    init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" --list-state "${definesnstuff[@]}" "${repos[@]}" $USEUSEDFORBUILD $SPECFILE $BUILD_EXTRA_PACKS
+    init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" --list-state "${definesnstuff[@]}" "${repos[@]}" $USEUSEDFORBUILD $RECIPEFILE $BUILD_EXTRA_PACKS
     ERR=$?
     rm -rf "$BUILD_ROOT"
     cleanup_and_exit $ERR
 fi
 
-# z/VM:
-# 1. make sure that no buildjob exists anymore by doing an ipl of cms
-# 2. detach the root device from the worker
-# 3. link the device to the controlling guest
-#    -> Need a uniq worker id to calculate a uniq device address for linking
-#    -> VM_IMAGE is the resulting block device
-if [ "$VM_TYPE" = 'zvm' ]; then
-    if [ ! "$0" = "/.build/build" ] ; then
-       echo "in controlling guest"
-        zvm_cp worker_init $VM_WORKER $VM_VOLUME_ROOT $VM_VOLUME_SWAP $zvm_worker_nr
-        zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT
-        zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP
-        VM_IMAGE=$(zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_ROOT $zvm_mult_pass $zvm_worker_nr )
-        VM_SWAP=$(zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_SWAP $zvm_mult_pass $zvm_worker_nr )
-        if [ ! "${VM_IMAGE}" = "dasd${VM_IMAGE#dasd}" -o ! "${VM_SWAP}" = "dasd${VM_SWAP#dasd}" ]; then
-            echo "did not get a real device for VM_IMAGES: $VM_IMAGE $VM_SWAP"
-            cleanup_and_exit 3
-        else 
-            VM_IMAGE="/dev/"${VM_IMAGE}
-           VM_SWAP="/dev/"${VM_SWAP}
-        fi
-    fi
-fi
-
-echo "VM_IMAGE: $VM_IMAGE, VM_SWAP: $VM_SWAP"
-
-# doing setup
-if test -z "$RUNNING_IN_VM" ; then
-    if test -n "$VM_IMAGE" ; then
-       if test "$VM_IMAGE" = 1 ; then
-           VM_IMAGE="$BUILD_ROOT.img"
-           echo "using $VM_IMAGE as vm image"
-           if test -z "$VM_SWAP" -a "$VM_TYPE" != "emulator"; then
-               VM_SWAP="$BUILD_ROOT.swap"
-               echo "using $VM_SWAP as vm swap"
-           fi
-       fi
-       if [ "$VM_TYPE" = 'xen' ]; then
-           # this should not be needed, but sometimes a xen instance got lost
-           XENID="${VM_IMAGE%/root}"
-           XENID="${XENID%/tmpfs}"
-           XENID="${XENID##*/}"
-           XENID="${XENID#root_}"
-           xm destroy "build_$XENID" >/dev/null 2>&1
-       fi
-       if test -n "$VMDISK_CLEAN" ; then
-           # delete old root/swap to get rid of the old blocks
-           if test -f "$VM_IMAGE" ; then
-               echo "Deleting old $VM_IMAGE"
-               rm -rf "$VM_IMAGE"
-           fi
-           if test -n "$VM_SWAP" -a -f "$VM_SWAP" ; then
-               echo "Deleting old $VM_SWAP"
-               rm -rf "$VM_SWAP"
-           fi
-       fi
-       if test ! -e "$VM_IMAGE"; then
-           vm_img_create "$VM_IMAGE" "$VMDISK_ROOTSIZE"
-           if test -z "$CLEAN_BUILD" ; then
-               vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_IMAGE"
-           fi
-       fi
-       if test -n "$VM_SWAP" -a ! -e "$VM_SWAP" -a ! -b "$VM_SWAP"; then
-           vm_img_create "$VM_SWAP" "$VMDISK_SWAPSIZE"
-       fi
-       if test ! -e "$VM_IMAGE" ; then
-           echo "you need to create $VM_IMAGE first"
-           cleanup_and_exit 3
-       fi
-       if test -n "$CLEAN_BUILD" ; then
-           vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_IMAGE" || cleanup_and_exit 3
-       fi
-       mkdir_build_root
-       if [ -w /root ]; then
-            if [ -b $VM_IMAGE ]; then
-                # mount device directly
-               mount $VMDISK_MOUNT_OPTIONS $VM_IMAGE $BUILD_ROOT || cleanup_and_exit 3
-           else
-               mount ${VMDISK_MOUNT_OPTIONS},loop $VM_IMAGE $BUILD_ROOT || cleanup_and_exit 3
-            fi
-       else
-           if ! mount $BUILD_ROOT; then
-               echo "mounting the build root failed. An fstab entry is probably missing or incorrect."
-               echo "/etc/fstab should contain an entry like this:"
-               echo "$VM_IMAGE $BUILD_ROOT auto noauto,user,loop 0 0"
-               cleanup_and_exit 3
-           fi
-       fi
-    else
-       test -w /root || become_root_or_fail
-    fi
-    if test -n "$VM_SWAP" ; then
-       dd if=/dev/zero of="$VM_SWAP" bs=1024 count=1 conv=notrunc 2>/dev/null
-       echo "mkswap $VM_SWAP"
-       mkswap "$VM_SWAP"
-        [ "$VM_TYPE" = 'openstack' ] && openstack_volume_detach "$VM_SERVER" "$VM_VOLUME_SWAP"
-    fi
+# do vm setup if needed
+if test -z "$RUNNING_IN_VM" -a -n "$VM_TYPE" -a -n "$VM_IMAGE" ; then
+    vm_setup
 fi
 
 mkdir_build_root
 
-if [ "$BUILD_ROOT" = / ]; then
+if test "$BUILD_ROOT" = / ; then
     browner="$(stat -c %u /)"
 fi
 
 rm -f $BUILD_ROOT/exit
 
-if [ -w /root ]; then
+if test -w /root ; then
     mkdir -p $BUILD_ROOT/proc
+    mkdir -p $BUILD_ROOT/sys
     mkdir -p $BUILD_ROOT/dev/pts
     mount -n -tproc none $BUILD_ROOT/proc || true
     mount -n -tdevpts -omode=0620,gid=5 none $BUILD_ROOT/dev/pts
 fi
 
-if test -z "$VM_IMAGE" -a -z "$LOGFILE"; then
+if test -z "$VM_IMAGE" -a -z "$LOGFILE" ; then
     LOGFILE="$BUILD_ROOT/.build.log"
 fi
 
-if test -n "$LOGFILE" -a -z "$shell" ; then
-    echo  logging output to $LOGFILE...
+if test -n "$LOGFILE" -a -z "$RUN_SHELL" ; then
+    echo "logging output to $LOGFILE..."
     rm -f $LOGFILE
     touch $LOGFILE
     # set start time, to be substracted for build log timestamps
     STARTTIME=`perl -e 'print time()'`
 
-    if [ -n "$RUNNING_IN_VM" ]; then
+    if test -n "$RUNNING_IN_VM" ; then
         # no additional timestamps in inner vm build system
        exec 1> >(exec -a 'build logging' tee -a $LOGFILE) 2>&1
     elif test -n "$VM_IMAGE" ; then
@@ -1964,7 +991,7 @@ setmemorylimit
 #
 test -z "$HOST" && HOST=`hostname`
 
-if [ -z "$RUNNING_IN_VM" ]; then
+if test -z "$RUNNING_IN_VM" ; then
     echo Using BUILD_ROOT=$BUILD_ROOT
     test -n "$BUILD_RPMS" && echo Using BUILD_RPMS=$BUILD_RPMS
     echo Using BUILD_ARCH=$BUILD_ARCH
@@ -1975,29 +1002,16 @@ fi
 test "$BUILD_ARCH" = all && BUILD_ARCH=
 BUILD_USER_ABUILD_USED=
 
-for SPECFILE in "${SPECFILES[@]}" ; do
+for RECIPEFILE in "${RECIPEFILES[@]}" ; do
 
-    SRCDIR="${SPECFILE%/*}"
-    SPECFILE="${SPECFILE##*/}"
+    SRCDIR="${RECIPEFILE%/*}"
+    RECIPEFILE="${RECIPEFILE##*/}"
 
-    BUILDTYPE=
-    case $SPECFILE in
-      *.spec|*.src.rpm) BUILDTYPE=spec ;;
-      *.dsc) BUILDTYPE=dsc ;;
-      *.kiwi) BUILDTYPE=kiwi ;;
-      PKGBUILD) BUILDTYPE=arch ;;
-      _preinstallimage) BUILDTYPE=preinstallimage ;;
-    esac
-    if test -z "$BUILDTYPE" ; then
-       echo "don't know how to build $SPECFILE"
-       cleanup_and_exit 1
-    fi
+    recipe_set_buildtype
 
-    cd "$SRCDIR"
-
-    if [ -z "$RUNNING_IN_VM" ]; then
+    if test -z "$RUNNING_IN_VM" ; then
        echo
-       echo "$HOST started \"build $SPECFILE\" at `date --utc`."
+       echo "$HOST started \"build $RECIPEFILE\" at `date --utc`."
        echo
        test -n "$REASON" && echo "$REASON"
        echo
@@ -2007,584 +1021,42 @@ for SPECFILE in "${SPECFILES[@]}" ; do
     #
     # first setup building directory...
     #
-    test -s "$SPECFILE" || {
-       echo "$SPECFILE" is empty.  This should not happen...
-       cleanup_and_exit 1
-    }
-
-    if test "$SPECFILE" != "${SPECFILE%.src.rpm}" ; then
-       echo processing src rpm $SRCDIR/$SPECFILE ...
-       MYSRCDIR=$BUILD_ROOT/.build-srcdir
-       rm -rf "$MYSRCDIR"
-       mkdir -p "$MYSRCDIR"
-       cd $MYSRCDIR || cleanup_and_exit 1
-       $BUILD_DIR/unrpm -q $SRCDIR/$SPECFILE || {
-           echo "could not install $SPECFILE."
-           cleanup_and_exit 1
-       }
-       for SPECFILE in *.spec ; do : ; done
-    else
-       MYSRCDIR="$SRCDIR"
-    fi
-
-    # FIX to work with baselibs_$PROJ etc
-    if test "$BUILDTYPE" == "dsc" -a -e ${SRCDIR}/baselibs-deb.conf ; then
-       # Set CREATE_BASELIBS if not set
-       echo "dsc build and baselibs-deb.conf present: forcing --baselibs to true"
-       CREATE_BASELIBS=true
+    cd "$SRCDIR"
+    if ! test -s "$RECIPEFILE" ; then
+        echo "$RECIPEFILE is empty.  This should not happen..."
+        cleanup_and_exit 1
     fi
+    MYSRCDIR="$SRCDIR"
 
-# Currently local osc build does not allow extra .deb packages to be
-# specified on the command line. Both init_buildsystem and expanddeps
-# need to handle .deb dependencies first
-#    if test -n "$CREATE_BASELIBS" ; then
-#        case $BUILDTYPE in
-#            spec) ;;
-#            dsc) BUILD_EXTRA_PACKS="$BUILD_EXTRA_PACKS libparse-debcontrol-perl" ;;
-#        esac
-#    fi
+    # special hack to build from a .src.rpm
+    test "$RECIPEFILE" != "${RECIPEFILE%.src.rpm}" && recipe_unpack_srcrpm
 
-    echo processing specfile $MYSRCDIR/$SPECFILE ...
+    echo "processing recipe $MYSRCDIR/$RECIPEFILE ..."
 
-    ADDITIONAL_PACKS=""
+    ADDITIONAL_PACKS=
     test -z "$BUILD_EXTRA_PACKS" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS $BUILD_EXTRA_PACKS"
     test -z "$CREATE_BASELIBS" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS build"
-    test "$ccache" = '0' || ADDITIONAL_PACKS="$ADDITIONAL_PACKS ccache"
+    test -z "$CCACHE" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS ccache"
     test "$icecream" = 0 || ADDITIONAL_PACKS="$ADDITIONAL_PACKS icecream gcc-c++"
     test -z "$DO_LINT" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS rpmlint-Factory"
-    test "$VMDISK_FILESYSTEM" = 'xfs' && ADDITIONAL_PACKS="$ADDITIONAL_PACKS libblkid1"
-    test "$VM_TYPE" = 'zvm' && ADDITIONAL_PACKS="$ADDITIONAL_PACKS udev libcap2"
+    test "$VMDISK_FILESYSTEM" = xfs && ADDITIONAL_PACKS="$ADDITIONAL_PACKS libblkid1"
+    test "$VM_TYPE" = zvm && ADDITIONAL_PACKS="$ADDITIONAL_PACKS udev libcap2"
 
+    # we need to do this before the vm is started
     if test -n "$CHANGELOG" -a -z "$RUNNING_IN_VM" ; then
        rm -f $BUILD_ROOT/.build-changelog
-       case $SPECFILE in
-         *.dsc) CFFORMAT=debian ;;
-         *) CFFORMAT=rpm ;;
+       case $RECIPEFILE in
+           *.dsc) CFFORMAT=debian ;;
+           *) CFFORMAT=rpm ;;
        esac
-       echo "running changelog2spec --target $CFFORMAT --file $MYSRCDIR/$SPECFILE"
-       if ! $BUILD_DIR/changelog2spec --target $CFFORMAT --file "$MYSRCDIR/$SPECFILE" > $BUILD_ROOT/.build-changelog ; then
+       echo "running changelog2spec --target $CFFORMAT --file $MYSRCDIR/$RECIPEFILE"
+       if ! $BUILD_DIR/changelog2spec --target $CFFORMAT --file "$MYSRCDIR/$RECIPEFILE" > $BUILD_ROOT/.build-changelog ; then
            rm -f $BUILD_ROOT/.build-changelog
        fi
     fi
 
     if test -n "$VM_TYPE" -a -z "$RUNNING_IN_VM"; then
-       rm -rf "$BUILD_ROOT/.build"
-       mkdir -p "$BUILD_ROOT/.build"
-       if test "$DO_INIT" = true ; then
-           # do first stage of init_buildsystem
-           rm -f $BUILD_ROOT/.build.success
-           set -- init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" --prepare "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USE_SYSTEM_QEMU $USEUSEDFORBUILD $RPMLIST "$MYSRCDIR/$SPECFILE" $ADDITIONAL_PACKS
-           echo "$* ..."
-            start_time=`date +%s`
-           "$@" || cleanup_and_exit 1
-           check_exit
-            TIME_PREINSTALL=$(( `date +%s` - $start_time ))
-            unset start_time
-           if [ ! -w /root ]; then
-               # remove setuid bit if files belong to user to make e.g. mount work
-               find $BUILD_ROOT/{bin,sbin,usr/bin,usr/sbin} -type f -uid $UID -perm +4000 -print0 | xargs -0 --no-run-if-empty chmod -s
-           fi
-           copy_oldpackages
-       fi
-
-       # start up xen, rerun ourself
-       cp -a $BUILD_DIR/. $BUILD_ROOT/.build
-       if ! test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then
-           rm -rf "$BUILD_ROOT/.build-srcdir"
-           mkdir "$BUILD_ROOT/.build-srcdir"
-           if test "$BUILDTYPE" = kiwi ; then
-               cp -pRL "$MYSRCDIR"/* $BUILD_ROOT/.build-srcdir
-           else
-               cp -p "$MYSRCDIR"/* $BUILD_ROOT/.build-srcdir
-           fi
-           MYSRCDIR=$BUILD_ROOT/.build-srcdir
-       else
-           # cwd is at $BUILD_ROOT/.build-srcdir which we want to
-           # umount later so step aside
-           cd "$SRCDIR"
-       fi
-       Q="'\''"
-       echo "SPECFILE='${SPECFILE//"'"/$Q}'" > $BUILD_ROOT/.build/build.data
-       echo "BUILD_JOBS='${BUILD_JOBS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "BUILD_ARCH='${BUILD_ARCH//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "BUILD_RPMS='${BUILD_RPMS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       case $BUILD_DIST in
-           */*)
-               cp $BUILD_DIST $BUILD_ROOT/.build/build.dist
-               BUILD_DIST=/.build/build.dist
-               ;;
-       esac
-       echo "BUILD_DIST='${BUILD_DIST//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "RELEASE='${RELEASE//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "BUILD_DEBUG='${BUILD_DEBUG//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "SIGNDUMMY='${SIGNDUMMY//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "DO_LINT='${DO_LINT//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "DO_CHECKS='${DO_CHECKS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "NOROOTFORBUILD='${NOROOTFORBUILD//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "CREATE_BASELIBS='$CREATE_BASELIBS'" >> $BUILD_ROOT/.build/build.data
-       echo "REASON='${REASON//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "CHANGELOG='${CHANGELOG//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "INCARNATION='${INCARNATION//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "DISTURL='${DISTURL//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "DO_INIT='${DO_INIT//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       echo "KIWI_PARAMETERS='${KIWI_PARAMETERS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
-       # FIXME: this depends on the kernel and vm.
-       # could be hda2, sda2 for xen or hdb/sdb for qemu
-       test -n "$VM_SWAP" && echo "VM_SWAP='${VM_SWAPDEV:-/dev/hda2}'" >> $BUILD_ROOT/.build/build.data
-       test -n "$VMDISK_MOUNT_OPTIONS" && echo "VMDISK_MOUNT_OPTIONS='${VMDISK_MOUNT_OPTIONS}'" >> $BUILD_ROOT/.build/build.data
-       PERSONALITY=0
-       if test "$VM_TYPE" != 'lxc'; then
-           test -n "$PERSONALITY_SYSCALL" && PERSONALITY=`perl -e 'print syscall('$PERSONALITY_SYSCALL', 0)."\n"'`
-       fi
-       if test "$(uname -m)" = 'ppc'; then
-            # ppc kernel never tells us if a 32bit personality is active
-            PERSONALITY=8
-        fi
-       echo "PERSONALITY='$PERSONALITY'" >> $BUILD_ROOT/.build/build.data
-       echo "MYHOSTNAME='`hostname`'" >> $BUILD_ROOT/.build/build.data
-       echo -n "definesnstuff=(" >> $BUILD_ROOT/.build/build.data
-       shellquote "${definesnstuff[@]}" >> $BUILD_ROOT/.build/build.data
-       echo ")" >> $BUILD_ROOT/.build/build.data
-       echo -n "repos=(" >> $BUILD_ROOT/.build/build.data
-       shellquote "${repos[@]}" >> $BUILD_ROOT/.build/build.data
-       echo ")" >> $BUILD_ROOT/.build/build.data
-       echo "VM_TYPE='$VM_TYPE'" >> $BUILD_ROOT/.build/build.data
-       echo "shell='$shell'" >> $BUILD_ROOT/.build/build.data
-       echo "statistics='$statistics'" >> $BUILD_ROOT/.build/build.data
-        # fallback time for broken hosts
-        date '+@%s' > $BUILD_ROOT/.build/.date
-       if [ "$VM_TYPE" = 'emulator' ]; then
-            ln -sf /.build/build $BUILD_ROOT/sbin/init
-        fi
-        if [ "$VM_TYPE" = 'zvm' ]; then
-            # initrd is created in obsstoragesetup.
-            # If it is desired to use a project dependent kernel, use make_guestinitrd from zvm_functions.
-            # have to copy kernel/initrd and run zipl to be able to IPL
-            # have to set init_script before unmounting, thus doing it statically for now.
-            zvm_init_script="/.build/build"
-            mkdir -p $BUILD_ROOT/boot
-            cp $vm_kernel $vm_initrd $BUILD_ROOT/boot
-            mkdir -p $BUILD_ROOT/boot/zipl
-             # finally, install bootloader to the worker disk
-             zipl -t $BUILD_ROOT/boot/zipl -i ${BUILD_ROOT}${vm_kernel} -r ${BUILD_ROOT}${vm_initrd} \
-                --parameters "${zvm_param} init=$zvm_init_script rootfsopts=noatime"
-        fi
-       umount -n $BUILD_ROOT/proc/sys/fs/binfmt_misc 2> /dev/null || true
-       umount -n $BUILD_ROOT/proc 2> /dev/null || true
-       umount -n $BUILD_ROOT/dev/pts 2> /dev/null || true
-       umount -n $BUILD_ROOT/dev/shm 2> /dev/null || true
-       umount -n $BUILD_ROOT/mnt 2> /dev/null || true
-
-       if check_use_emulator; then
-           if [ -e $BUILD_DIR/initvm.$BUILD_HOST_ARCH -a -e "$BUILD_DIR/qemu-reg" ]; then
-                chmod 0755 "$BUILD_DIR/initvm.$BUILD_HOST_ARCH"
-                vm_init_script="/.build/initvm.$BUILD_HOST_ARCH"
-           else
-               echo "Warning: can't find initscript to register binfmts"
-           fi
-       else
-           vm_init_script="/.build/build"
-       fi
-
-       if [ "$VM_TYPE" = 'emulator' ]; then
-                # generic emulator hook. an external script is needed to define
-                # the emulator startup
-                sync
-                pushd $BUILD_DIR/emulator
-                if [ -z "$EMULATOR_SCRIPT" ]; then
-                   EMULATOR_SCRIPT="./emulator.sh"
-                elif [ "${EMULATOR_SCRIPT:0:1}" != "/" ]; then
-                   EMULATOR_SCRIPT="./$EMULATOR_SCRIPT"
-                fi
-               set -- "$EMULATOR_SCRIPT" "$VM_IMAGE"
-               echo "$@"
-               if ! "$@"; then
-                     popd
-                     echo "ERROR: The emulator return with an failure"
-                     cleanup_and_exit 3
-                fi
-                popd
-
-       fi
-
-        if [ "$VM_TYPE" = 'openstack' -o "$VM_TYPE" = 'ec2' ]; then
-            # No way to handle this via init= parameter here....
-            echo "#!/bin/sh"               >  "$BUILD_ROOT/sbin/init"
-            echo 'exec /.build/build "$@"' >> "$BUILD_ROOT/sbin/init"
-            chmod 0755 "$BUILD_ROOT/sbin/init"
-        fi
-        if [ "$VM_TYPE" = 'ec2' ]; then
-            # use the instance kernel, if no kernel got installed via preinstall
-            if ! test -e "$BUILD_ROOT/boot/vmlinuz"; then
-                cp /boot/vmlinuz-ec2 "$BUILD_ROOT/boot/vmlinuz"
-                cp /boot/initrd-ec2 "$BUILD_ROOT/boot/initrd"
-            fi
-            # install menu.lst for pv grub
-            if ! test -e "$BUILD_ROOT/boot/grub/menu.lst"; then
-                mkdir -p "$BUILD_ROOT/boot/grub"
-                echo "serial --unit=0 --speed=9600"                                                   >  "$BUILD_ROOT/boot/grub/menu.lst"
-                echo "terminal --dumb serial"                                                         >> "$BUILD_ROOT/boot/grub/menu.lst"
-                echo "default 0"                                                                      >> "$BUILD_ROOT/boot/grub/menu.lst"
-                echo "timeout 0"                                                                      >> "$BUILD_ROOT/boot/grub/menu.lst"
-                echo "hiddenmenu"                                                                     >> "$BUILD_ROOT/boot/grub/menu.lst"
-                echo ""                                                                               >> "$BUILD_ROOT/boot/grub/menu.lst"
-                echo "title default"                                                                  >> "$BUILD_ROOT/boot/grub/menu.lst"
-                echo "   root (hd0)"                                                                  >> "$BUILD_ROOT/boot/grub/menu.lst"
-                echo "   kernel /boot/vmlinuz root=/dev/sda1 xencons=xvc0 console=xvc0 splash=silent" >> "$BUILD_ROOT/boot/grub/menu.lst"
-                echo "   initrd /boot/initrd"                                                         >> "$BUILD_ROOT/boot/grub/menu.lst"
-            fi
-        fi
-       if [ -n "$VM_IMAGE" ]; then
-           check_exit
-           # needs to work otherwise we have a corrupted file system
-           umount $BUILD_ROOT || cleanup_and_exit 3
-       fi
-
-        if [ "$VM_TYPE" = 'openstack' -o "$VM_TYPE" = 'ec2' ]; then
-          cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_NAME" || cleanup_and_exit 3
-        fi
-
-       if [ -n "$VM_IMAGE" -a "$VM_TYPE" = "zvm" ]; then
-          # detach the worker root and swap locally and link it in the worker
-          zvm_cp volume_detach_local $VM_VOLUME_ROOT ${zvm_worker_nr}
-          zvm_cp volume_detach_local $VM_VOLUME_SWAP ${zvm_worker_nr}
-          zvm_cp volume_attach $VM_WORKER $VM_VOLUME_ROOT
-          zvm_cp volume_attach $VM_WORKER $VM_VOLUME_SWAP
-       fi
-
-       if [ "$VM_TYPE" = 'xen' ]; then
-               XMROOT="file:$(readlink -f $VM_IMAGE)"
-               XMROOT=${XMROOT/#file:\/dev/phy:/dev}
-               XMROOT="disk=$XMROOT,hda1,w"
-               XMSWAP=
-               if test -n "$VM_SWAP" ; then
-                   XMSWAP="file:$(readlink -f $VM_SWAP)"
-                   XMSWAP=${XMSWAP/#file:\/dev/phy:/dev}
-                   XMSWAP="disk=$XMSWAP,hda2,w"
-               fi
-               XENID="${VM_IMAGE%/root}"
-               XENID="${XENID%/tmpfs}"
-               XENID="${XENID##*/}"
-               XENID="${XENID#root_}"
-
-               echo "booting XEN kernel ..."
-               if xm list "build_$XENID" >/dev/null 2>&1 ; then
-                  echo "Instance already exist, something really went wrong..."
-                  echo "Please report to your server admin, there might be multiple services running for same domain"
-                  cleanup_and_exit 3
-               fi
-               XEN_CONF_FILE=`mktemp /var/tmp/build.xen.conf-XXXXXXXXX` || cleanup_and_exit 3
-               echo "kernel = \"$vm_kernel\""                                           >  $XEN_CONF_FILE
-               echo "ramdisk = \"$vm_initrd\""                                          >> $XEN_CONF_FILE
-               echo "memory = ${MEMSIZE:-64}"                                           >> $XEN_CONF_FILE
-               echo "vcpus = $BUILD_JOBS"                                               >> $XEN_CONF_FILE
-               echo "root = \"/dev/hda1 ro\""                                           >> $XEN_CONF_FILE
-               echo "extra = \"init=/bin/bash console=ttyS0 panic=1 udev_timeout=360\"" >> $XEN_CONF_FILE
-               echo "on_poweroff = 'destroy'"                                           >> $XEN_CONF_FILE
-               echo "on_reboot = 'destroy'"                                             >> $XEN_CONF_FILE
-               echo "on_crash = 'destroy'"                                              >> $XEN_CONF_FILE
-               set -- xm create -c $XEN_CONF_FILE name="build_$XENID" $XMROOT $XMSWAP extra="quiet init="$vm_init_script" elevator=noop panic=1 console=ttyS0"
-               if test "$PERSONALITY" != 0 ; then
-                   # have to switch back to PER_LINUX to make xm work
-                   set -- linux64 "$@"
-               fi
-               echo "$@"
-               "$@" || cleanup_and_exit 3
-               rm "$XEN_CONF_FILE"
-       elif [ "$VM_TYPE" = 'uml' ]; then
-               echo "booting UML kernel ..."
-               set -- $uml_kernel initrd=$uml_initrd root=ubda init="$vm_init_script" panic=1 elevator=noop quiet ubda=$VM_IMAGE ubdb=$VM_SWAP ${MEMSIZE:+mem=$MEMSIZE}
-               echo "$@"
-               "$@"
-       elif [ "$VM_TYPE" = 'qemu' -o "$VM_TYPE" = 'kvm' ]; then
-               echo "booting $VM_TYPE ..."
-                if [ "$VM_TYPE" = 'kvm' -a -b "$VM_IMAGE" ]; then
-                  # speed optimization when using kvm with raw devices
-                 CACHE=",cache=none"
-                else
-                  # speed optimization when using kvm with raw files
-                 CACHE=",cache=unsafe"
-               fi
-
-               # we do not want to have sound inside the VMs
-               export QEMU_AUDIO_DRV=none
-
-               if [ "$kvm_virtio" = 1 ]; then
-                   qemu_args=(-drive file="$VM_IMAGE",if=virtio$CACHE -drive file="$VM_IMAGE",if=ide,index=0$CACHE)
-                   if [ -n "$VM_SWAP" ]; then
-                       qemu_args=("${qemu_args[@]}" "-drive")
-                       qemu_args=("${qemu_args[@]}" "file=$VM_SWAP,if=virtio$CACHE")
-                   fi
-                   if [ "$HOST_ARCH" = "armv7l" ]; then
-                       qemu_args=(-drive file="$VM_IMAGE",if=none,id=disk$CACHE -device virtio-blk,transport=virtio-mmio.0,drive=disk)
-                       qemu_args=("${qemu_args[@]}" "-drive")
-                       qemu_args=("${qemu_args[@]}" "file=$VM_SWAP,if=none,id=swap$CACHE")
-                       qemu_args=("${qemu_args[@]}" "-device")
-                       qemu_args=("${qemu_args[@]}" "virtio-blk,transport=virtio-mmio.1,drive=swap")
-                   fi
-               else
-                       if [ "$HOST_ARCH" = "ppc970" ];then
-                               qemu_args=( "-drive" )
-                               qemu_args=("${qemu_args[@]}" "file=$VM_IMAGE,if=scsi,cache=unsafe")
-                       else
-                               qemu_args=(-hda "$VM_IMAGE")
-                       fi
-                       if [ -n "$VM_SWAP" ]; then
-                               qemu_args=("${qemu_args[@]}" "-drive")
-                               if [ "$HOST_ARCH" = "ppc970" ];then
-                                       DISK_IF=scsi
-                               else
-                                       DISK_IF=ide
-                               fi
-                               qemu_args=("${qemu_args[@]}" "file=$VM_SWAP,if=$DISK_IF,index=1$CACHE")
-                       fi
-               fi
-               if [ -n "$BUILD_JOBS" -a "$icecream" = 0 -a -z "$BUILD_THREADS" ]; then
-                   qemu_args=("${qemu_args[@]}" "-smp" "$BUILD_JOBS")
-               elif [ -n "$BUILD_JOBS" -a -n "$BUILD_THREADS" ]; then
-                   qemu_args=("${qemu_args[@]}" "-smp" "$BUILD_JOBS,threads=$BUILD_THREADS")
-               fi
-               if [ "$VM_TYPE" = 'kvm' -a "$HOST_ARCH" != "armv7l" ]; then
-                       KVM_OPTIONS="$KVM_OPTIONS -cpu host"
-                       if [ -n "$HUGETLBFSPATH" ]; then
-                             KVM_OPTIONS="$KVM_OPTIONS -mem-path $HUGETLBFSPATH"
-                       fi
-               fi
-
-               set -- $qemu_bin -no-reboot -nographic -vga none -net none $KVM_OPTIONS \
-                   -kernel $vm_kernel \
-                   -initrd $vm_initrd \
-                   -append "root=$qemu_rootdev panic=1 quiet no-kvmclock nmi_watchdog=0 rw elevator=noop console=$console init=$vm_init_script" \
-                   ${MEMSIZE:+-m $MEMSIZE} \
-                   "${qemu_args[@]}"
-
-               if test "$PERSONALITY" != 0 ; then
-                   # have to switch back to PER_LINUX to make qemu work
-                   set -- linux64 "$@"
-               fi
-               echo "$@"
-               "$@"
-       elif [ "$VM_TYPE" = 'ec2' ]; then
-               echo "booting $VM_TYPE ..."
-                EC2_SNAP_root=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$VM_VOLUME_NAME" | awk '{ print $2 }'`
-                if [ "$EC2_SNAP_root" == "${EC2_SNAP_root#snap-}" ]; then
-                    echo "ERROR: Failed to create snapshot for root disk $VM_VOLUME_NAME"
-                    cleanup_and_exit 3
-                fi
-                EC2_SNAP_swap=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$VM_VOLUME_SWAP" | awk '{ print $2 }'`
-                if [ "$EC2_SNAP_swap" == "${EC2_SNAP_swap#snap-}" ]; then
-                    echo "ERROR: Failed to create snapshot for swap disk $VM_VOLUME_SWAP"
-                    ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root"
-                    cleanup_and_exit 3
-                fi
-                # wait for snapshots being processed
-                while true; do
-                    c=`ec2-describe-snapshots --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" "$EC2_SNAP_swap" | grep completed | wc -l`
-                    [ "$c" == "2" ] && break
-                done
-                EC2_AMI=`ec2-register --region "$BUILD_EC2_REGION" -n build-$VM_VOLUME_NAME  -a x86_64 -b "/dev/sda1=$EC2_SNAP_root::false" -b "/dev/sdb1=$EC2_SNAP_swap::false" --kernel "$BUILD_EC2_AKI" | awk '{ print $2 }'`
-                if [ "$EC2_AMI" == "${EC2_AMI#ami-}" ]; then
-                    echo "ERROR: Failed to register the AMI"
-                    ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root"
-                    ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap"
-                    cleanup_and_exit 3
-                fi
-                INSTANCE=`ec2-run-instances --region "$BUILD_EC2_REGION" -z "$BUILD_EC2_ZONE" -t $BUILD_EC2_TYPE --kernel "$BUILD_EC2_AKI" --instance-initiated-shutdown-behavior terminate "$EC2_AMI" | grep ^INSTANCE | awk '{ print $2 }'`
-                if [ "$INSTANCE" == "${INSTANCE#i-}" ]; then
-                    echo "ERROR: Failed to run the instance for AMI $EC2_AMI"
-                    ec2-deregister --region "$BUILD_EC2_REGION" "$EC2_AMI"
-                    ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root"
-                    ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap"
-                    cleanup_and_exit 3
-                fi
-                echo "Waiting for finishing the build. No log file until then on EC2 ...."
-                I=0
-                L=0
-                EC2_EXTRACT_VOLUME_root=""
-                EC2_EXTRACT_VOLUME_swap=""
-                temp_file=`mktemp`
-                while true; do
-                    ec2-describe-instances --region "$BUILD_EC2_REGION" "$INSTANCE" > $temp_file
-                    state=`grep ^INSTANCE "$temp_file"`
-                    if [ -z "$EC2_EXTRACT_VOLUME_root" ]; then
-                        EC2_EXTRACT_VOLUME_root=`grep ^BLOCKDEVICE $temp_file | grep /dev/sda1 | awk '{ print $3 }'`
-                        EC2_EXTRACT_VOLUME_swap=`grep ^BLOCKDEVICE $temp_file | grep /dev/sdb1 | awk '{ print $3 }'`
-                    fi
-                    # the column of the state is at a differen position depending on the state :/
-#                    [ "$state" == "${state/stopped/}" ] || break
-                    [ "$state" == "${state/terminated/}" ] || break
-                    I=$(( $I + 1 ))
-                    if [ $I -gt 10 ]; then
-                       echo -n .
-                       I="0"
-                       L=$(( $L + 1 ))
-                    fi
-                    if [ $L -gt 10 ]; then
-                       # dump entire console log as raw here
-                       ec2-get-console-output --region "$BUILD_EC2_REGION" -r "$INSTANCE"
-                       L="0"
-                    fi
-                    sleep 1
-                done
-                rm "$temp_file"
-                echo
-                ec2-deregister --region "$BUILD_EC2_REGION" "$EC2_AMI"
-                # snapshots get deleted after extract
-       elif [ "$VM_TYPE" = 'openstack' ]; then
-               echo "booting $VM_TYPE ..."
-                nova boot --image $OBS_OPENSTACK_KERNEL_IMAGE_ID --flavor m1.small --block_device_mapping vda=${VM_VOLUME_NAME}::$(( $VMDISK_ROOTSIZE / 1024 )):0 --block_device_mapping vdb=${VM_VOLUME_SWAP}::1:0 --poll "build-$VM_VOLUME_NAME" || cleanup_and_exit 3
-                
-#                while [ `nova show "build-$VM_VOLUME_NAME" | sed -n -e 's,|[ ]*status[ ]*|[ ]*\([^ ]*\).*,\1,p'` == "ACTIVE" ]; do
-#                  sleep 5
-#                done
-                nova console-log "build-$VM_VOLUME_NAME"
-       elif [ "$VM_TYPE" = 'lxc' ]; then
-               echo "booting $VM_TYPE ..."
-               LXCCONF="$BUILD_ROOT/.build.lxc.conf"
-               rm -f "$LXCCONF"
-               cat $BUILD_DIR/lxc.conf > "$LXCCONF"
-               cat >> "$LXCCONF" <<-EOF
-               lxc.rootfs = $BUILD_ROOT
-               EOF
-               # XXX: do this always instead of leaking the hosts' one?
-               echo "rootfs / rootfs rw 0 0" > $BUILD_ROOT/etc/mtab
-               LXCID=${BUILD_ROOT##*/}
-               lxc-destroy -n "$LXCID" >/dev/null 2>&1 || true
-               lxc-create -n "$LXCID" -f "$LXCCONF" || cleanup_and_exit 1
-               lxc-start -n "$LXCID" "$vm_init_script"
-               BUILDSTATUS="$?"
-               test "$BUILDSTATUS" != 255 || BUILDSTATUS=3
-               cleanup_and_exit "$BUILDSTATUS"
-        elif [ "$VM_TYPE" = 'zvm' ]; then
-                echo "booting $VM_TYPE ..."
-                zvm_cp ipl $VM_WORKER $VM_VOLUME_ROOT
-                # start IUCV Console
-                # IPL needs some time until IPL really starts...
-                 sleep 2
-                 # start iucv console. This blocks until build process is finished.
-                iucvconn $VM_WORKER lnxhvc0
-                # Take root and swap devices from worker
-                # This might be critical regarding timing (IUCV_CONSOLE down, but machine still running)
-                sleep 5
-                zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT
-                zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP
-                VM_IMAGE="/dev/$(zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_ROOT $zvm_mult_pass $zvm_worker_nr)"
-                VM_SWAP="/dev/$(zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_SWAP $zvm_mult_pass $zvm_worker_nr)"
-       fi
-
-       if [ "$VM_TYPE" = 'openstack' ]; then
-           VM_IMAGE=`cloud_volume_attach "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"`
-           [ "${VM_IMAGE:0:5}" == "/dev/" ] || cleanup_and_exit 3
-           VM_SWAP=`cloud_volume_attach "$VM_SERVER" "$VM_VOLUME_SWAP" "$VM_SWAP"`
-           [ "${VM_SWAP:0:5}" == "/dev/" ] || cleanup_and_exit 3
-        fi
-       if [ "$VM_TYPE" = 'ec2' ]; then
-           VM_IMAGE=`cloud_volume_attach "$VM_SERVER" "$EC2_EXTRACT_VOLUME_root" "$VM_IMAGE"`
-           [ "${VM_IMAGE:0:5}" == "/dev/" ] || cleanup_and_exit 3
-           VM_SWAP=`cloud_volume_attach "$VM_SERVER" "$EC2_EXTRACT_VOLUME_swap" "$VM_SWAP"`
-           [ "${VM_SWAP:0:5}" == "/dev/" ] || cleanup_and_exit 3
-        fi
-
-        # Exctract build resutls from VM
-       if [ "$VM_TYPE" = 'emulator' ]; then
-            # Emulators may not offer to use a second swap space.
-            # So we just mount the filesystem.
-            # WARNING: This is not safe against attacks.
-
-           mkdir -p $BUILD_ROOT/.build.packages
-           cd $BUILD_ROOT/.build.packages || cleanup_and_exit 1
-            mkdir -p .mount
-            mount $VM_IMAGE -o loop .mount
-            if [ -e .mount/.build.packages ]; then
-              cp -a .mount/.build.packages/* .
-            fi
-            exitcode=`cat .mount/.build/_exitcode`
-            umount .mount
-            rmdir .mount
-
-           cleanup_and_exit "$exitcode"
-
-       elif test -n "$VM_SWAP" ; then
-           BUILDSTATUS=`dd if="$VM_SWAP" bs=12 count=1 2>/dev/null`
-           case $BUILDSTATUS in
-             BUILDSTATUS[02])
-               mkdir -p $BUILD_ROOT/.build.packages
-               cd $BUILD_ROOT/.build.packages || cleanup_and_exit 1
-               echo "build: extracting built packages..."
-               extractbuild --disk "$VM_IMAGE" --input "$VM_SWAP" --skip 512 -v || cleanup_and_exit 3
-               # create same layout as with plain chroot
-               if test "$BUILDTYPE" = spec ; then
-                   mkdir -p SRPMS
-                   for i in *src.rpm *.desktopfiles ; do
-                       test -e "$i" || continue
-                       mv "$i" SRPMS/
-                   done
-                   for i in *.rpm ; do
-                       test -e "$i" || continue
-                       arch=${i%.rpm}
-                       arch=${i%.delta}
-                       arch=${arch##*\.}
-                       mkdir -p RPMS/$arch
-                       mv "$i" RPMS/$arch/
-                   done
-               elif test "$BUILDTYPE" = dsc ; then
-                   mkdir -p DEBS
-                   find . -type f | while read i; do mv "$i" DEBS/; done
-               elif test "$BUILDTYPE" = arch ; then
-                   mkdir -p ARCHPKGS
-                   find . -type f | while read i; do mv "$i" ARCHPKGS/; done
-               elif test "$BUILDTYPE" = kiwi ; then
-                   mkdir -p KIWI
-                   find . -type f | while read i; do mv "$i" KIWI/; done
-               fi
-               for i in * ; do
-                   test -f "$i" || continue
-                   case $i in
-                       _*|.*) ;;
-                       *) mkdir -p OTHER ; mv $i OTHER/ ;;
-                   esac
-               done
-                if test "$statistics" = 1; then
-                    mkdir -p OTHER
-                    [ -e _statistics ] && mv _statistics OTHER/
-                    [ -n "$TIME_PREINSTALL" ] && echo "TIME_preinstall: $TIME_PREINSTALL"  >> OTHER/_statistics
-                    TIME_TOTAL=$(( `date +%s` - $TIME_START_TIME ))
-                    echo "TIME_total: $TIME_TOTAL"  >> OTHER/_statistics
-                fi
-               if [ "$VM_TYPE" = 'zvm' ]; then
-                   # free worker devices
-                   zvm_cp volume_detach_local $VM_VOLUME_ROOT ${zvm_worker_nr}
-                   zvm_cp volume_detach_local $VM_VOLUME_SWAP ${zvm_worker_nr}
-               fi
-               if [ "$VM_TYPE" = 'openstack' ]; then
-                    cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_NAME"
-                    cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_SWAP"
-                fi
-               cleanup_and_exit ${BUILDSTATUS#BUILDSTATUS}
-               ;;
-             BUILDSTATUS*)
-               if [ "$VM_TYPE" = 'zvm' ]; then
-                   # free worker devices
-                   zvm_cp volume_detach_local $VM_VOLUME_ROOT ${zvm_worker_nr}
-                   zvm_cp volume_detach_local $VM_VOLUME_SWAP ${zvm_worker_nr}
-               fi
-               cleanup_and_exit ${BUILDSTATUS#BUILDSTATUS}
-               ;;
-             *)
-               if [ "$VM_TYPE" = 'zvm' ]; then
-                   # free worker devices
-                   zvm_cp volume_detach_local $VM_VOLUME_ROOT ${zvm_worker_nr}
-                   zvm_cp volume_detach_local $VM_VOLUME_SWAP ${zvm_worker_nr}
-               fi
-               echo "No buildstatus set, either the base system is broken (glibc/bash/perl)"
-               echo "or the build host has a kernel or hardware problem..."
-               cleanup_and_exit 3
-               ;;
-           esac
-
-           cleanup_and_exit 1
-       fi
-
+       vm_first_stage
        cleanup_and_exit 0
     fi
 
@@ -2597,8 +1069,10 @@ for SPECFILE in "${SPECFILES[@]}" ; do
        echo "BUILD_INCARNATION=$INCARNATION" > $BUILD_ROOT/.buildenv
        CREATE_BUILD_BINARIES=
        test "$BUILDTYPE" = preinstallimage && mkdir -p $BUILD_ROOT/.preinstall_image
-       egrep '^#[       ]*needsbinariesforbuild[       ]*$' >/dev/null <$MYSRCDIR/$SPECFILE && CREATE_BUILD_BINARIES=--create-build-binaries
-       set -- init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USE_SYSTEM_QEMU $USEUSEDFORBUILD $CREATE_BUILD_BINARIES $RPMLIST "$MYSRCDIR/$SPECFILE" $ADDITIONAL_PACKS
+       egrep '^#[       ]*needsbinariesforbuild[       ]*$' >/dev/null <$MYSRCDIR/$RECIPEFILE && CREATE_BUILD_BINARIES=--create-build-binaries
+       test "$BUILDTYPE" = mock && CREATE_BUILD_BINARIES=--create-build-binaries
+       test "$BUILDTYPE" = livebuild && CREATE_BUILD_BINARIES=--create-build-binaries
+       set -- init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USEUSEDFORBUILD $CREATE_BUILD_BINARIES $RPMLIST "$MYSRCDIR/$RECIPEFILE" $ADDITIONAL_PACKS
        echo "$* ..."
         start_time=`date +%s`
        "$@" || cleanup_and_exit 1
@@ -2620,45 +1094,9 @@ for SPECFILE in "${SPECFILES[@]}" ; do
        copy_oldpackages
     fi
 
+    # hack to process preinstallimages early
     if test "$BUILDTYPE" = preinstallimage ; then
-       echo "creating preinstall image..."
-       test -d "$BUILD_ROOT/.preinstall_image" || cleanup_and_exit 1
-       cd $BUILD_ROOT || cleanup_and_exit 1
-       TAR="tar"
-       if test -x /usr/bin/bsdtar; then
-           TAR="/usr/bin/bsdtar --format gnutar --chroot"
-       fi
-       TOPDIRS=
-       for DIR  in .* * ; do
-         case "$DIR" in
-           .|..) continue ;;
-           .build*) continue ;;
-           .preinstallimage*) continue ;;
-           .srcfiles*) continue ;;
-           .pkgs) continue ;;
-           .rpm-cache) continue ;;
-           installed-pkg) continue ;;
-           proc|sys) continue ;;
-         esac
-         TOPDIRS="$TOPDIRS $DIR"
-        done
-       if ! $TAR -czf .preinstallimage.$$.tar.gz --one-file-system $TOPDIRS ; then
-           cleanup_and_exit 1
-       fi
-       echo "image created."
-       TOPDIR=/usr/src/packages
-       mkdir -p $BUILD_ROOT$TOPDIR/OTHER
-       rm -f $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.info
-       for PKG in $BUILD_ROOT/.preinstall_image/* ; do
-           PKG=${PKG##*/}
-           read PKG_HDRMD5 PKGID < $BUILD_ROOT/.preinstall_image/$PKG
-           test -n "$PKG_HDRMD5" || cleanup_and_exit 1
-           echo "$PKG_HDRMD5  $PKG" >> $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.info
-       done
-       mv $BUILD_ROOT/.preinstallimage.$$.tar.gz $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.tar.gz
-       rm -f $BUILD_ROOT/.build.packages
-       ln -s ${TOPDIR#/} $BUILD_ROOT/.build.packages
-       test -d "$SRCDIR" && cd "$SRCDIR"
+       recipe_build
        continue
     fi
 
@@ -2666,15 +1104,6 @@ for SPECFILE in "${SPECFILES[@]}" ; do
        read BUILD_DIST < $BUILD_ROOT/.guessed_dist
     fi
 
-    #
-    # fix rpmrc if we are compiling for i686
-    #
-    test -f $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 && mv $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 $BUILD_ROOT/usr/lib/rpm/rpmrc
-    if test -e $BUILD_ROOT/usr/lib/rpm/rpmrc -a "$BUILD_ARCH" != "${BUILD_ARCH#i686}" ; then
-       mv $BUILD_ROOT/usr/lib/rpm/rpmrc $BUILD_ROOT/usr/lib/rpm/rpmrc_i586
-       sed -e 's/^buildarchtranslate: athlon.*/buildarchtranslate: athlon: i686/' -e 's/^buildarchtranslate: i686.*/buildarchtranslate: i686: i686/' < $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 > $BUILD_ROOT/usr/lib/rpm/rpmrc
-    fi
-
     #
     # install dummy sign program if needed
     #
@@ -2691,23 +1120,22 @@ for SPECFILE in "${SPECFILES[@]}" ; do
     BUILD_USER=abuild
     if test -x $BUILD_ROOT/bin/rpm ; then
        SUSE_VERSION=`chroot $BUILD_ROOT /bin/rpm --eval '%{?suse_version}' 2>/dev/null`
-       if test -n "$SUSE_VERSION" && test "$SUSE_VERSION" -le 1020 ; then
-           BUILD_USER=root
-       fi
+       test -n "$SUSE_VERSION" -a "${SUSE_VERSION:-0}" -le 1020 && BUILD_USER=root
     fi
     if test "$BUILD_USER" = abuild ; then
-       egrep '^#[       ]*needsrootforbuild[       ]*$' >/dev/null <$SPECFILE && BUILD_USER=root
+       egrep '^#[       ]*needsrootforbuild[       ]*$' >/dev/null <$RECIPEFILE && BUILD_USER=root
     else
-       egrep '^#[       ]*norootforbuild[       ]*$' >/dev/null <$SPECFILE && BUILD_USER=abuild
+       egrep '^#[       ]*norootforbuild[       ]*$' >/dev/null <$RECIPEFILE && BUILD_USER=abuild
     fi
     test -n "$NOROOTFORBUILD" && BUILD_USER=abuild
 
     # appliance builds must run as root
-    if test "$BUILDTYPE" = kiwi; then
-      imagetype=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $SPECFILE imagetype)
-      test "$imagetype" = 'product' || BUILD_USER=root
+    if test "$BUILDTYPE" = kiwi ; then
+       imagetype=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $RECIPEFILE imagetype)
+       test "$imagetype" = product || BUILD_USER=root
     fi
 
+    # fixup passwd/group
     if test $BUILD_USER = abuild ; then
        if ! egrep '^abuild:' >/dev/null <$BUILD_ROOT/etc/passwd ; then
            echo "abuild:x:${ABUILD_UID}:${ABUILD_GID}:Autobuild:/home/abuild:/bin/bash" >>$BUILD_ROOT/etc/passwd
@@ -2728,10 +1156,10 @@ for SPECFILE in "${SPECFILES[@]}" ; do
            fi
        fi
        if test -f $BUILD_ROOT/etc/shadow ; then
-           sed -e "s@^root::@root:*:@" < $BUILD_ROOT/etc/shadow > $BUILD_ROOT/etc/shadow.t && mv $BUILD_ROOT/etc/shadow.t $BUILD_ROOT/etc/shadow
+           sed -i -e "s@^root::@root:*:@" $BUILD_ROOT/etc/shadow
        fi
        if test -f $BUILD_ROOT/etc/gshadow ; then
-           sed -e "s@^root::@root:*:@" < $BUILD_ROOT/etc/gshadow > $BUILD_ROOT/etc/gshadow.t && mv $BUILD_ROOT/etc/gshadow.t $BUILD_ROOT/etc/gshadow
+           sed -i -e "s@^root::@root:*:@" $BUILD_ROOT/etc/gshadow
        fi
        BUILD_USER_ABUILD_USED=true
     else
@@ -2740,318 +1168,92 @@ for SPECFILE in "${SPECFILES[@]}" ; do
        ABUILD_GID=0
        if egrep '^abuild:' >/dev/null <$BUILD_ROOT/etc/passwd ; then
            rm -rf "$BUILD_ROOT/home/abuild"
-           egrep -v '^abuild:' <$BUILD_ROOT/etc/passwd >$BUILD_ROOT/etc/passwd.new
-           mv $BUILD_ROOT/etc/passwd.new $BUILD_ROOT/etc/passwd
-           egrep -v '^abuild:' <$BUILD_ROOT/etc/group >$BUILD_ROOT/etc/group.new
-           mv $BUILD_ROOT/etc/group.new $BUILD_ROOT/etc/group
+           sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/passwd
+           sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/group
            if test -f $BUILD_ROOT/etc/shadow ; then
-             egrep -v '^abuild:' <$BUILD_ROOT/etc/shadow >$BUILD_ROOT/etc/shadow.new
-             mv $BUILD_ROOT/etc/shadow.new $BUILD_ROOT/etc/shadow
+               sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/shadow
            fi
            if test -f $BUILD_ROOT/etc/gshadow ; then
-             egrep -v '^abuild:' <$BUILD_ROOT/etc/gshadow >$BUILD_ROOT/etc/gshadow.new
-             mv $BUILD_ROOT/etc/gshadow.new $BUILD_ROOT/etc/gshadow
+               sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/gshadow
            fi
        fi
     fi
 
-    if test "$BUILDTYPE" = spec ; then
-       TOPDIR=`chroot $BUILD_ROOT su -c "rpm --eval '%_topdir'" - $BUILD_USER`
-       if test -z "$TOPDIR"; then
-           echo "Error: TOPDIR empty"
-           cleanup_and_exit 1
-       fi
-    else
-       TOPDIR=/usr/src/packages
-       mkdir -p $BUILD_ROOT$TOPDIR
-    fi
-
-    rm -f $BUILD_ROOT/.build.packages
-    ln -s ${TOPDIR#/} $BUILD_ROOT/.build.packages
-
     mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null
     mount -n -tdevpts -omode=0620,gid=5 none $BUILD_ROOT/dev/pts 2> /dev/null
     # needed for POSIX semaphores
+    test -d $BUILD_ROOT/dev/shm || rm -f $BUILD_ROOT/dev/shm
+    mkdir -p $BUILD_ROOT/dev/shm
     mount -n -ttmpfs none $BUILD_ROOT/dev/shm 2> /dev/null
 
-    setupicecream
+    if test -n "$RUNNING_IN_VM" ; then
+       if test -x /sbin/ip ; then
+           ip addr add 127.0.0.1/8 dev lo
+           ip addr add ::1/128 dev lo
+           ip link set lo up
+       else
+           ifconfig lo 127.0.0.1 up
+           ifconfig lo add ::1/128
+       fi
+       if test -n "$MYHOSTNAME" ; then
+           hostname "$MYHOSTNAME"
+       fi
+    fi
 
+    setupicecream
     setupccache
 
+    # fill build directories with sources. Also sets TOPDIR
+    recipe_setup
+    
+    # strip prefix from autogenerated files of source services.
+    for i in $BUILD_ROOT$TOPDIR/SOURCES/_service\:* ; do
+        mv "$i" "${i%/*}/${i##*:}"
+    done
+    RECIPEFILE="${RECIPEFILE##*:}"
+
+    # create .build.packages link
+    rm -f $BUILD_ROOT/.build.packages
+    ln -s ${TOPDIR#/} $BUILD_ROOT/.build.packages
+
     # nasty hack to prevent rpath on known paths
     # FIXME: do this only for suse
     if test -d "$BUILD_ROOT/etc/profile.d" ; then
        echo "export SUSE_IGNORED_RPATHS=/etc/ld.so.conf" > "$BUILD_ROOT/etc/profile.d/buildsystem.sh"
     fi
 
-    #
-    # now clean up RPM building directories
-    #
-    rm -rf "$BUILD_ROOT$TOPDIR"
-    for i in BUILD RPMS/`uname -m` RPMS/i386 RPMS/noarch SOURCES SPECS SRPMS BUILDROOT OTHER ; do
-       mkdir -p $BUILD_ROOT$TOPDIR/$i
-    done
-    chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
-    check_exit
-
-    mkdir -p $BUILD_ROOT$TOPDIR/SOURCES
-    if test "$BUILDTYPE" = kiwi ; then
-       mkdir -p $BUILD_ROOT$TOPDIR/KIWI
-       if test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then
-           mv "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
-       else
-           if test -z "$LINKSOURCES" ; then
-               cp -dLR "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
-           else
-               cp -lR "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
-           fi
-           if test "$?" != 0 ; then
-               echo "source copy failed"
-               cleanup_and_exit 1
-           fi
-       fi
-    else
-       cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
-    fi
-    # strip prefix from autogenerated files of source services.
-    for i in $BUILD_ROOT$TOPDIR/SOURCES/_service\:*; do
-      mv "$i" "${i%/*}/${i##*:}"
-    done
-    SPECFILE="${SPECFILE##*:}"
-
+    # get rid of old src dir, it is no longer needed and just wastes space
     test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir && rm -rf "$MYSRCDIR"
-    CHANGELOGARGS=
-    test -n "$CHANGELOG" -a -f "$BUILD_ROOT/.build-changelog" && CHANGELOGARGS="--changelog $BUILD_ROOT/.build-changelog"
-
-    if test "$BUILDTYPE" = spec ; then
-       # do buildrequires/release substitution
-       args=()
-       if test -n "$RELEASE"; then
-               args=(--release "$RELEASE")
-       fi
-       substitutedeps "${args[@]}" --root "$BUILD_ROOT" --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" $CHANGELOGARGS "$BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE" "$BUILD_ROOT/.spec.new" || cleanup_and_exit 1
-       # extract macros from configuration
-       getmacros --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" > $BUILD_ROOT/root/.rpmmacros
-       if test -n "$BUILD_DEBUG" ; then
-           echo '
-%prep %{?!__debug_package:%{?_build_create_debug:%?_build_insert_debug_package}}%%prep
-%package %{?!__debug_package:%{?_build_create_debug:%?_build_insert_debug_package}}%%package
-%_build_insert_debug_package \
-%global __debug_package 1 \
-%undefine _enable_debug_packages \
-%debug_package
-
-' >> $BUILD_ROOT/root/.rpmmacros
-       fi
-
-       if [ -n "$BUILD_JOBS" ]; then
-               cat >> $BUILD_ROOT/root/.rpmmacros <<-EOF
-               %jobs $BUILD_JOBS
-               %_smp_mflags -j$BUILD_JOBS
-               EOF
-       fi
-       test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/.rpmmacros $BUILD_ROOT/home/abuild/.rpmmacros
-       # extract optflags from configuration
-       getoptflags --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" ${BUILD_DEBUG:+--debug} > $BUILD_ROOT/root/.rpmrc
-       test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/.rpmrc $BUILD_ROOT/home/abuild/.rpmrc
-       if test -z "$ABUILD_TARGET"; then
-           ABUILD_TARGET=$(getchangetarget --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" )
-           test -z "$ABUILD_TARGET" || echo "build target is $ABUILD_TARGET"
-       fi
-    fi
-    if test -f $BUILD_ROOT/.spec.new ; then
-       if ! cmp -s $BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE $BUILD_ROOT/.spec.new ; then
-           echo -----------------------------------------------------------------
-           echo "I have the following modifications for $SPECFILE:"
-           sed -e "/^%changelog/q" $BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE > $BUILD_ROOT/.spec.t1
-           sed -e "/^%changelog/q" $BUILD_ROOT/.spec.new > $BUILD_ROOT/.spec.t2
-           diff $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2
-           rm -f $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2
-           mv $BUILD_ROOT/.spec.new $BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE
-       else
-           rm -f $BUILD_ROOT/.spec.new
-       fi
-    fi
-
-    if test "$BUILDTYPE" = dsc ; then
-       rm -rf "$BUILD_ROOT$TOPDIR/BUILD"
-       mkdir -p $BUILD_ROOT$TOPDIR/SOURCES.DEB
-       chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
-       DEB_TRANSFORM=
-       DEB_SOURCEDIR=$TOPDIR/SOURCES
-       DEB_DSCFILE=$SPECFILE
-       for f in $BUILD_ROOT$TOPDIR/SOURCES/debian.* ; do
-           test -f $f && DEB_TRANSFORM=true
-       done
-       if test -n "$DEB_TRANSFORM" ; then
-           echo "running debian transformer..."
-           if ! debtransform $CHANGELOGARGS $BUILD_ROOT$TOPDIR/SOURCES $BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE $BUILD_ROOT$TOPDIR/SOURCES.DEB ; then
-               echo "debian transforming failed."
-               cleanup_and_exit 1
-           fi
-           DEB_SOURCEDIR=$TOPDIR/SOURCES.DEB
-           for DEB_DSCFILE in $BUILD_ROOT/$DEB_SOURCEDIR/*.dsc ; do : ; done
-           DEB_DSCFILE="${DEB_DSCFILE##*/}"
-       fi
-       chroot $BUILD_ROOT su -c "dpkg-source -x $DEB_SOURCEDIR/$DEB_DSCFILE $TOPDIR/BUILD" - $BUILD_USER
-    fi
 
-    if test "$BUILDTYPE" = arch ; then
-       echo "Preparing sources..."
-       chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && makepkg -s -o 2>&1 >/dev/null" - $BUILD_USER
-       mv $BUILD_ROOT/$TOPDIR/SOURCES/* -t $BUILD_ROOT/$TOPDIR/BUILD
-    fi
+    # patch recipes
+    recipe_prepare
 
+    # hmmm
     chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
+
     cd $BUILD_ROOT$TOPDIR/SOURCES || cleanup_and_exit 1
 
     echo -----------------------------------------------------------------
     if test "$BUILD_USER" = root ; then
-       echo ----- building $SPECFILE
+       echo ----- building $RECIPEFILE
     else
-       echo ----- building $SPECFILE "(user $BUILD_USER)"
+       echo ----- building $RECIPEFILE "(user $BUILD_USER)"
     fi
     echo -----------------------------------------------------------------
     echo -----------------------------------------------------------------
-    if [ -n "$RUNNING_IN_VM" ]; then
-       if [ -x /sbin/ip ]; then
-           ip addr add 127.0.0.1/8 dev lo
-           ip link set lo up
-       else
-           ifconfig lo 127.0.0.1 up
-       fi
-       if [ -n "$MYHOSTNAME" ]; then
-           hostname "$MYHOSTNAME"
-       fi
-    fi
-
     BUILD_SUCCEEDED=false
 
     if test -n "$OVERLAY" ; then
-       if test -d "$OVERLAY"; then
-           pushd $OVERLAY
-           echo "Copying overlay to BUILD_ROOT"
-           tar -cpf - . | (cd $BUILD_ROOT ; tar -xvf -)
-           popd
-       else
-           echo "OVERLAY ($OVERLAY) is no directory - skipping"
-       fi
+       copy_overlay
     fi
 
     if test -n "$RSYNCSRC" ; then
-       if test -n "$RSYNCDEST"; then
-           if test -d "$RSYNCSRC"; then
-               if ! test -d "$BUILD_ROOT/$RSYNCDEST"; then
-                   echo "ATTENTION! Creating target directory ($BUILD_ROOT/$RSYNCDEST) as its not there."
-                   mkdir -p $BUILD_ROOT/$RSYNCDEST
-               fi
-               echo "Running rsync ..."
-               rsync -av $RSYNCSRC/* $BUILD_ROOT/$RSYNCDEST/
-               chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT/$RSYNCDEST"
-               RSYNCDONE=true
-               echo "... done"
-           else
-               echo "RSYNCSRC is no directory - skipping"
-           fi
-       else
-           echo "RSYNCSRC given, but not RSYNCDEST - skipping"
-       fi
+       run_rsync
     fi
 
     start_time=`date +%s`
-    if test "$BUILDTYPE" = spec ; then
-       test -z "$BUILD_RPM_BUILD_STAGE" && BUILD_RPM_BUILD_STAGE=-ba
-
-       rpmbuild=rpmbuild
-       test -x $BUILD_ROOT/usr/bin/rpmbuild || rpmbuild=rpm
-
-       # XXX: move _srcdefattr to macro file?
-       rpmbopts=("$BUILD_RPM_BUILD_STAGE" "--define" "_srcdefattr (-,root,root)")
-       if test "$rpmbuild" == "rpmbuild" ; then
-                # use only --nosignature for rpm v4
-           rpmbopts[${#rpmbopts[@]}]="--nosignature"
-       fi
-       if test -n "$ABUILD_TARGET" ; then
-           rpmbopts[${#rpmbopts[@]}]="--target=$ABUILD_TARGET"
-       fi
-       if test -n "$BUILD_DEBUG" ; then
-           rpmbopts[${#rpmbopts[@]}]='--define'
-           rpmbopts[${#rpmbopts[@]}]="_build_create_debug 1"
-       fi
-       if test -n "$DISTURL" ; then
-           rpmbopts[${#rpmbopts[@]}]='--define'
-           rpmbopts[${#rpmbopts[@]}]="disturl $DISTURL"
-       fi
-       if test -n "$RSYNCDONE" ; then
-           rpmbopts[${#rpmbopts[@]}]='--define'
-           rpmbopts[${#rpmbopts[@]}]="RSYNCDONE 1"
-       fi
-
-       # su involves a shell which would require even more
-       # complicated quoting to bypass than this
-       toshellscript $rpmbuild \
-               "${definesnstuff[@]}" \
-               "${rpmbopts[@]}" \
-               "$TOPDIR/SOURCES/$SPECFILE" \
-               > $BUILD_ROOT/.build.command
-       chmod 755 $BUILD_ROOT/.build.command
-       check_exit
-       if test -n "$shell"; then
-           chroot $BUILD_ROOT su -
-       else
-           chroot $BUILD_ROOT su -c /.build.command - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true
-       fi
-    fi
-
-    if test "$BUILDTYPE" = dsc ; then
-       # Checks to see if a build script should be used
-       # this allows the build environment to be manipulated
-       # and alternate build commands can be used
-# Debian policy requires to build with single CPU by default
-#      if [ -n "$BUILD_JOBS" ]; then
-#          DSC_BUILD_JOBS="-j$BUILD_JOBS"
-#      fi
-       DSC_BUILD_CMD="dpkg-buildpackage -us -uc -rfakeroot-tcp $DSC_BUILD_JOBS"
-       if test -e $BUILD_ROOT/$TOPDIR/SOURCES/build.script ; then
-           echo "Sourcing build.script to build - it should normally run 'dpkg-buildpackage -us -uc -rfakeroot-tcp'"
-           DSC_BUILD_CMD="source $TOPDIR/SOURCES/build.script"
-           chmod +x $BUILD_ROOT/$TOPDIR/SOURCES/build.script
-       fi
-
-       if test -n "$shell"; then
-           chroot $BUILD_ROOT su -
-       else
-           chroot $BUILD_ROOT su -c "cd $TOPDIR/BUILD && $DSC_BUILD_CMD" - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true
-           if test "$BUILD_SUCCEEDED" = true -a "$DO_CHECKS" != "false"; then
-               DEB_CHANGESFILE=${SPECFILE%.dsc}_"$(chroot $BUILD_ROOT su -c 'dpkg-architecture -qDEB_BUILD_ARCH')".changes
-               chroot $BUILD_ROOT su -c "which lintian > /dev/null && cd $TOPDIR && echo Running lintian && (set -x && lintian -i $DEB_SOURCEDIR/$DEB_DSCFILE)" - $BUILD_USER < /dev/null
-           fi
-       fi
-
-       mkdir -p $BUILD_ROOT/$TOPDIR/DEBS
-       for DEB in $BUILD_ROOT/$TOPDIR/*.deb ; do
-           test -e "$DEB" && mv "$DEB" "$BUILD_ROOT/$TOPDIR/DEBS"
-       done
-       # link sources over
-       ln $BUILD_ROOT/$DEB_SOURCEDIR/$DEB_DSCFILE $BUILD_ROOT/$TOPDIR/DEBS/
-       while read f ; do
-           ln $BUILD_ROOT/$DEB_SOURCEDIR/$f $BUILD_ROOT/$TOPDIR/DEBS/
-       done < <(sed -ne '/^Files:/,$s/^ ................................ [0-9][0-9]* //p' < $BUILD_ROOT/$DEB_SOURCEDIR/$DEB_DSCFILE)
-    fi
-
-    if test "$BUILDTYPE" = arch ; then
-       chroot $BUILD_ROOT su -c "cd $TOPDIR/BUILD && makepkg -f" - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true
-       mkdir -p $BUILD_ROOT/$TOPDIR/ARCHPKGS
-       for PKG in $BUILD_ROOT/$TOPDIR/BUILD/*.pkg.tar.?z ; do
-           test -e "$PKG" && mv "$PKG" "$BUILD_ROOT/$TOPDIR/ARCHPKGS"
-       done
-    fi
-
-    if test "$BUILDTYPE" = kiwi ; then
-       . $BUILD_DIR/build_kiwi.sh
-       run_kiwi
-    fi
-    if test "$statistics" = 1; then
+    recipe_build
+    if test "$DO_STATISTICS" = 1; then
         mkdir -p $TOPDIR/OTHER
         echo "TIME_main_build: $(( `date +%s` - $start_time ))"  >> $TOPDIR/OTHER/_statistics
     fi
@@ -3061,7 +1263,7 @@ for SPECFILE in "${SPECFILES[@]}" ; do
     test -d "$SRCDIR" && cd "$SRCDIR"
 done
 
-if test -n "$RUNNING_IN_VM" -a -n "$VM_SWAP"; then
+if test -n "$RUNNING_IN_VM" -a -n "$DO_STATISTICS" ; then
     touch /.build/_statistics.exit
 fi
 
@@ -3069,60 +1271,30 @@ RPMS=`find $BUILD_ROOT/$TOPDIR/RPMS -type f -name "*.rpm" 2>/dev/null || true`
 DEBS=`find $BUILD_ROOT/$TOPDIR/DEBS -type f -name "*.deb" 2>/dev/null || true`
 
 if test -n "$RPMS" -a -n "$BUILD_USER_ABUILD_USED" ; then
-    echo "... checking for files with abuild user/group"
-    BADFILE=
-    while read un gn fn ; do
-       if test "$un" = abuild -o "$gn" = abuild -o "$un" = ${ABUILD_UID} -o "$gn" = ${ABUILD_GID} ; then
-           echo "  $un $gn $fn"
-           BADFILE=true
-       fi
-    done < <(rpm -qp --qf '[%{FILEUSERNAME} %{FILEGROUPNAME} %{FILENAMES}\n]' $RPMS)
-    if test -n "$BADFILE" ; then
-       echo "please fix your filelist (e.g. add defattr)"
-       cleanup_and_exit 1
-    fi
+    recipe_check_file_owners
 fi
 
 if test -n "$RPMS" -a -d "$BUILD_ROOT/usr/lib/build/checks" ; then
-    export PNAME=""
     export DO_RPM_REMOVE=true
+    # find package name
+    export PNAME=
     for SRPM in $BUILD_ROOT/$TOPDIR/SRPMS/*src.rpm ; do
        test -f "$SRPM" && PNAME=`rpm --nodigest --nosignature -qp --qf "%{NAME}" $SRPM`
     done
     mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null
     for CHECKSCRIPT in $BUILD_ROOT/usr/lib/build/checks/* ; do
-       echo "... running `basename $CHECKSCRIPT`"
+       echo "... running ${CHECKSCRIPT##*/}"
        $CHECKSCRIPT || cleanup_and_exit 1
     done
     umount -n $BUILD_ROOT/proc 2>/dev/null || true
 fi
 
+# checkscripts may have deleted some binaries
 RPMS=`find $BUILD_ROOT/$TOPDIR/RPMS -type f -name "*.rpm" 2>/dev/null || true`
 DEBS=`find $BUILD_ROOT/$TOPDIR/DEBS -type f -name "*.deb" 2>/dev/null || true`
 
-if test -n "$RPMS" -a "$DO_CHECKS" != "false" -a -x "$BUILD_ROOT/opt/testing/bin/rpmlint" ; then
-    LINT_RPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/RPMS \
-       \( -name "*-debuginfo-*" -o -name "*-debugsource-*" \
-       -o -name "*-32bit-*" -o -name "*-64bit-*" \
-       -o -name "*-x86-*" -o -name "*-ia32-*" \) -prune \
-       -o -type f -name '*.rpm' -print))
-    SRPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/SRPMS -type f -name "*.rpm"))
-    echo
-    echo "RPMLINT report:"
-    echo "==============="
-    rpmlint_logfile=$TOPDIR/OTHER/rpmlint.log
-    rm -f "$BUILD_ROOT$rpmlint_logfile"
-    ret=0
-    mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null
-    chroot $BUILD_ROOT su -s /opt/testing/bin/rpmlint "$BUILD_USER" -- \
-           --info ${LINT_RPM_FILE_LIST[*]#$BUILD_ROOT} \
-           ${SRPM_FILE_LIST[*]#$BUILD_ROOT} > "$BUILD_ROOT$rpmlint_logfile" || ret=1
-           cat "$BUILD_ROOT$rpmlint_logfile"
-           echo
-    umount -n $BUILD_ROOT/proc 2>/dev/null || true
-    if test "$ret" = 1; then
-       cleanup_and_exit 1
-    fi
+if test -n "$RPMS" -a "$DO_CHECKS" != false ; then
+    recipe_run_rpmlint
 fi
 
 if test \( -n "$RPMS" -o -n "$DEBS" \) -a -n "$CREATE_BASELIBS"; then
@@ -3130,102 +1302,23 @@ if test \( -n "$RPMS" -o -n "$DEBS" \) -a -n "$CREATE_BASELIBS"; then
 fi
 
 exitcode=0
-# post build scripts
+
+# post build work
 # TODO: don't hardcode. instead run scripts in a directory as it's done for the checks
-if test -n "$RPMS" \
-       -a -d "$BUILD_ROOT/$TOPDIR/RPMS" \
-       -a -d "$BUILD_ROOT/.build.oldpackages" \
-       ; then
-    if test -x "$BUILD_ROOT/usr/lib/build/same-build-result.sh" ; then
-       echo "... comparing built packages with the former built"
-       mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null
-       if chroot $BUILD_ROOT /usr/lib/build/same-build-result.sh /.build.oldpackages "$TOPDIR/RPMS" "$TOPDIR/SRPMS"; then
-           chroot $BUILD_ROOT touch /.build/.same_result_marker
-           # XXX: dirty build service hack. fix bs_worker. Search for
-           # 'same_result_marker' for traces of a first try to get rid of this
-           if test -n "$REASON" -a -n "$DISTURL"; then
-               exitcode=2
-           fi
-       fi
-        umount -n $BUILD_ROOT/proc 2>/dev/null || true
-    fi
-    if test ! -e $BUILD_ROOT/.build/.same_result_marker \
-       -a -x "$BUILD_ROOT/usr/bin/makedeltarpm" \
-       -a -x $BUILD_ROOT/usr/lib/build/mkdrpms; then
-       echo "... creating delta rpms"
-       ds=("$BUILD_ROOT/$TOPDIR"/RPMS/* "$BUILD_ROOT$TOPDIR/SRPMS")
-       chroot $BUILD_ROOT /usr/lib/build/mkdrpms /.build.oldpackages "${ds[@]#$BUILD_ROOT}"
+if test -n "$RPMS" -a -d "$BUILD_ROOT/.build.oldpackages" ; then
+    recipe_compare_oldpackages
+    # no need to create deltas if the build is the same
+    if test ! -e $BUILD_ROOT/.build/.same_result_marker ; then
+       recipe_create_deltarpms
     fi
 fi
 
-if test -n "$RUNNING_IN_VM"; then
-    if test "$statistics" = 1; then
-         echo "... saving built statistics"
-         [ -n "$TIME_INSTALL" ] && echo "TIME_install: $TIME_INSTALL"  >> $BUILD_ROOT$TOPDIR/OTHER/_statistics
-         if [ -e /.build/_statistics.df ]; then
-           echo -n "MAX_mb_used_on_disk: " >> $TOPDIR/OTHER/_statistics
-           cat /.build/_statistics.df >> $TOPDIR/OTHER/_statistics
-           echo "" >> $TOPDIR/OTHER/_statistics
-           rm /.build/_statistics.df
-         fi
-         if [ -e /.build/_statistics.memory ]; then
-           echo -n "MAX_mb_used_memory: " >> $TOPDIR/OTHER/_statistics
-           cat /.build/_statistics.memory >> $TOPDIR/OTHER/_statistics
-           echo "" >> $TOPDIR/OTHER/_statistics
-           rm /.build/_statistics.memory
-         fi
-         mkdir -p /sys
-         mount -n sys /sys -t sysfs
-         device="hda1"
-         [ -e /dev/sda ] && device="sda"
-         [ -e /dev/vda ] && device="vda"
-         [ -e /dev/dasda ] && device="dasda" # in z/VM
-         [ -e /dev/nfhd0 ] && device="nfhd0" # in aranym
-         if [ -e /sys/block/${device}/stat ]; then
-           disk=(`cat /sys/block/${device}/stat`)
-           [ "0${disk[0]}" -gt 0 ] && echo "IO_requests_read: ${disk[0]}"  >> $TOPDIR/OTHER/_statistics
-           [ "0${disk[2]}" -gt 0 ] && echo "IO_sectors_read: ${disk[2]}"   >> $TOPDIR/OTHER/_statistics
-           [ "0${disk[4]}" -gt 0 ] && echo "IO_requests_write: ${disk[4]}" >> $TOPDIR/OTHER/_statistics
-           [ "0${disk[6]}" -gt 0 ] && echo "IO_sectors_write: ${disk[6]}"  >> $TOPDIR/OTHER/_statistics
-         else
-           echo "ERROR: no root disk device found, yet another new device name?"
-           ls -l /sys/block/
-         fi
-         umount /sys
-    fi
-
-    if test -n "$VM_SWAP"; then
-         echo "... saving built packages"
-         swapoff "$VM_SWAP"
-         args="--padstart 512 --padend 512 -v"
-         case "$BUILDTYPE" in
-             spec)
-                 computeblocklists $args $TOPDIR/RPMS/*/*.{d,}rpm $TOPDIR/SRPMS/* $TOPDIR/OTHER/* > "$VM_SWAP"
-                 ;;
-             dsc)
-                 computeblocklists $args $TOPDIR/DEBS/*.deb $TOPDIR/SOURCES.DEB/* $TOPDIR/OTHER/* > "$VM_SWAP"
-                 ;;
-             kiwi)
-                 computeblocklists $args $TOPDIR/KIWI/* $TOPDIR/OTHER/* > "$VM_SWAP"
-                 ;;
-             arch)
-                 computeblocklists $args $TOPDIR/ARCHPKGS/* $TOPDIR/OTHER/* > "$VM_SWAP"
-                 ;;
-             preinstallimage)
-                 computeblocklists $args $TOPDIR/OTHER/* > "$VM_SWAP"
-                 ;;
-             *)
-                 cleanup_and_exit 1
-                 ;;
-         esac || cleanup_and_exit 1
-    else
-         # quit inside of the emulator
-         cleanup_and_exit "$exitcode"
-    fi
+if test -n "$RUNNING_IN_VM" ; then
+    vm_wrapup_build $(recipe_resultdirs) OTHER
 fi
 
 echo
-echo "$HOST finished \"build $SPECFILE\" at `date --utc`."
+echo "$HOST finished \"build $RECIPEFILE\" at `date --utc`."
 echo
 
 cleanup_and_exit "$exitcode"
diff --git a/build-pkg b/build-pkg
new file mode 100644 (file)
index 0000000..529421f
--- /dev/null
+++ b/build-pkg
@@ -0,0 +1,80 @@
+#
+# binary package specific functions for the build script
+#
+# (C) 2014 SUSE, Inc
+#
+
+for i in rpm deb arch ; do
+    . "$BUILD_DIR/build-pkg-$i"
+done
+
+pkg_initdb() {
+    pkg_initdb_$PSUF "$@"
+}
+
+pkg_get_installed() {
+    pkg_get_installed_$PSUF "$@"
+}
+
+pkg_set_packageid() {
+    pkg_set_packageid_$PSUF "$@"
+}
+
+pkg_install() {
+    pkg_install_$PSUF "$@"
+}
+
+pkg_verify_installed() {
+    pkg_verify_installed_$PSUF "$@"
+}
+
+pkg_erase() {
+    pkg_erase_$PSUF "$@"
+}
+
+pkg_cumulate() {
+    pkg_cumulate_$PSUF "$@"
+}
+
+pkg_finalize() {
+    pkg_finalize_$PSUF "$@"
+}
+
+pkg_preinstall() {
+    pkg_preinstall_$PSUF "$@"
+}
+
+pkg_runscripts() {
+    pkg_runscripts_$PSUF "$@"
+}
+
+pkg_autodetect_type() {
+    if test -n "$PREINSTALL_IMAGE" ; then
+       echo "cannot autodetect build type when using a preinstall image" >&2
+       cleanup_and_exit 1
+    fi
+    PSUF=
+    test -e $BUILD_ROOT/.init_b_cache/rpms/rpm.rpm && PSUF=rpm
+    test -e $BUILD_ROOT/.init_b_cache/rpms/dpkg.deb && PSUF=deb
+    test -e $BUILD_ROOT/.init_b_cache/rpms/pacman.arch && PSUF=arch
+    if test -z "$PSUF" ; then
+       echo "could not autodetect package type" >&2
+       cleanup_and_exit 1
+    fi
+}
+
+pkg_set_type() {
+    PSUF=`queryconfig binarytype --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"`
+    test "$PSUF" = UNDEFINED && PSUF=
+    case "$PSUF" in
+       rpm|deb|arch)
+           ;;
+       '')
+           pkg_autodetect_type
+           ;;
+       *)
+            echo "unknown package type '$PSUF'" >&2
+            cleanup_and_exit 1
+           ;;
+    esac
+}
diff --git a/build-pkg-arch b/build-pkg-arch
new file mode 100644 (file)
index 0000000..919a744
--- /dev/null
@@ -0,0 +1,62 @@
+#
+# Arch specific functions.
+#
+# (C) 2014 SUSE, Inc
+#
+
+pkg_initdb_arch() {
+    mkdir -p $BUILD_ROOT/var/lib/pacman/sync
+    touch $BUILD_ROOT/var/lib/pacman/sync/core.db
+    touch $BUILD_ROOT/var/lib/pacman/sync/extra.db
+    touch $BUILD_ROOT/var/lib/pacman/sync/community.db
+}
+
+pkg_get_installed_arch() {
+    :
+}
+
+pkg_set_packageid_arch() {
+    PKGID=`readlink $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF`
+    PKGID="${PKGID##*/}"
+    PKGID="${PKGID/%.pkg.tar.?z/.arch}"
+    PKGID="${PKGID%.arch} arch"
+}
+
+pkg_erase_arch() {
+    cleanup_and_exit 1
+}
+
+pkg_verify_installed_arch() {
+    return 1
+}
+
+pkg_cumulate_arch() {
+    return 1
+}
+
+pkg_install_arch() {
+    # -d -d disables deps checking
+    ( cd $BUILD_ROOT && chroot $BUILD_ROOT pacman -U --force -d -d --noconfirm .init_b_cache/$PKG.$PSUF 2>&1 || touch $BUILD_ROOT/exit ) | \
+       perl -ne '$|=1;/^(warning: could not get filesystem information for |loading packages|looking for inter-conflicts|Targets |Total Installed Size: |Net Upgrade Size: |Proceed with installation|checking package integrity|loading package files|checking for file conflicts|checking keyring|Packages \(\d+\):|:: Proceed with installation|checking available disk space|installing |upgrading |warning:.*is up to date -- reinstalling|Optional dependencies for|    )/||/^$/||print'
+}
+
+pkg_finalize_arch() {
+    :
+}
+
+pkg_preinstall_arch() {
+    $TAR -f "$BUILD_ROOT/.init_b_cache/rpms/$PKG.arch"
+    if test -f .INSTALL ; then
+       cat .INSTALL > ".init_b_cache/scripts/$PKG.post"
+       echo 'type post_install >/dev/null 2>&1 && post_install' >> ".init_b_cache/scripts/$PKG.post"
+    fi
+    rm -f .PKGINFO .INSTALL
+}
+
+pkg_runscripts_arch() {
+    if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" ; then
+       echo "running $PKG postinstall script"
+       ( cd $BUILD_ROOT && chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.post" < /dev/null )
+       rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post"
+    fi
+}
diff --git a/build-pkg-deb b/build-pkg-deb
new file mode 100644 (file)
index 0000000..199b53f
--- /dev/null
@@ -0,0 +1,111 @@
+#
+# Debian dpkg specific functions.
+#
+# (C) 2014 SUSE, Inc
+#
+
+deb_setup() {
+    mkdir -p $BUILD_ROOT/var/lib/dpkg
+    mkdir -p $BUILD_ROOT/var/log
+    mkdir -p $BUILD_ROOT/etc/default
+    :>> $BUILD_ROOT/var/lib/dpkg/status
+    :>> $BUILD_ROOT/var/lib/dpkg/available
+    :>> $BUILD_ROOT/var/log/dpkg.log
+    :>> $BUILD_ROOT/etc/ld.so.conf
+    :>> $BUILD_ROOT/etc/default/rcS
+}
+
+pkg_initdb_deb() {
+    deb_setup
+    # force dpkg into database to make epoch test work
+    if ! test "$BUILD_ROOT/.init_b_cache/rpms/dpkg.deb" -ef "$BUILD_ROOT/.init_b_cache/dpkg.deb" ; then
+       rm -f $BUILD_ROOT/.init_b_cache/dpkg.deb
+       cp $BUILD_ROOT/.init_b_cache/rpms/dpkg.deb $BUILD_ROOT/.init_b_cache/dpkg.deb || cleanup_and_exit 1
+    fi
+    chroot $BUILD_ROOT dpkg -i --force all .init_b_cache/dpkg.deb >/dev/null 2>&1
+}
+
+pkg_get_installed_deb() {
+    :
+}
+
+pkg_set_packageid_deb() {
+    PKGID=`readlink $BUILD_ROOT/.init_b_cache/rpms/$PKG.deb`
+    PKGID="${PKGID##*/}"
+    PKGID="${PKGID%.deb} debian"
+}
+
+pkg_install_deb() {
+    export DEBIAN_FRONTEND=noninteractive
+    export DEBIAN_PRIORITY=critical
+    ( chroot $BUILD_ROOT dpkg --install --force all .init_b_cache/$PKG.deb 2>&1 || touch $BUILD_ROOT/exit ) | \
+       perl -ne '$|=1;/^(Configuration file|Installing new config file|Selecting previously deselected|Selecting previously unselected|\(Reading database|Unpacking |Setting up|Creating config file|Preparing to replace dpkg)/||/^$/||print'
+    check_exit
+    # ugly workaround for upstart system. some packages (procps) try
+    # to start a service in their configure phase. As we don't have
+    # a running upstart, we just link the start binary to /bin/true
+    if test -e "$BUILD_ROOT/sbin/start"; then
+       if test "$BUILD_ROOT/sbin/start" -ef "$BUILD_ROOT/sbin/initctl" ; then
+           echo "linking /sbin/start to /bin/true"
+           mv "$BUILD_ROOT/sbin/start" "$BUILD_ROOT/sbin/start.disabled"
+           ln -s "/bin/true" "$BUILD_ROOT/sbin/start"
+       fi
+    fi
+    # another workaround, see bug bnc#733699
+    rm -f "$BUILD_ROOT/var/run/init.upgraded"
+}
+
+pkg_erase_deb() {
+    cleanup_and_exit 1
+}
+
+pkg_cumulate_deb() {
+    return 1
+}
+
+pkg_verify_installed_deb() {
+    return 1
+}
+
+pkg_finalize_deb() {
+    echo "configuring all installed packages..."
+    # configure all packages after complete installation, not for each package like rpm does
+    # We need to run this twice, because of cyclic dependencies as it does not succeed on most
+    # debian based distros in the first attempt.
+    if ! chroot $BUILD_ROOT dpkg --configure --pending  2>&1; then
+         echo "first configure attempt failed, trying again..."
+         chroot $BUILD_ROOT dpkg --configure --pending  2>&1 || cleanup_and_exit 1
+    fi
+}
+
+pkg_preinstall_deb() {
+    ar x "$BUILD_ROOT/.init_b_cache/rpms/$PKG.deb"
+    mkdir -p .init_b_cache/scripts/control
+    $TAR -C .init_b_cache/scripts/control -z -f control.tar.gz
+    if test -f "data.tar.gz" ; then
+       $TAR -z -f data.tar.gz
+    elif test -f "data.tar.xz" ; then
+       $TAR -J -f data.tar.xz
+    fi
+    if test -e ".init_b_cache/scripts/$PKG.run" ; then
+       test -e .init_b_cache/scripts/control/preinst && mv .init_b_cache/scripts/control/preinst ".init_b_cache/scripts/$PKG.pre"
+       test -e .init_b_cache/scripts/control/postinst && mv .init_b_cache/scripts/control/postinst ".init_b_cache/scripts/$PKG.post"
+    fi
+    rm -rf .init_b_cache/scripts/control control.tar.gz data.tar.{g,x}z
+}
+
+pkg_runscripts_deb() {
+    if ! test -e $BUILD_ROOT/var/lib/dpkg/status ; then
+       deb_setup
+    fi
+    if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" ; then
+       echo "running $PKG preinstall script"
+       chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.pre" install < /dev/null
+       rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre"
+    fi
+    if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" ; then
+       echo "running $PKG postinstall script"
+       chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.post" configure '' < /dev/null
+       rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post"
+    fi
+}
diff --git a/build-pkg-rpm b/build-pkg-rpm
new file mode 100644 (file)
index 0000000..d0b2ef9
--- /dev/null
@@ -0,0 +1,201 @@
+#
+# RPM specific functions.
+#
+# (C) 2014 SUSE, Inc
+#
+
+#buildhost removed so that id can be generated from repo files
+#RPMIDFMT="%{NAME}-%{VERSION}-%{RELEASE} %{BUILDHOST}-%{BUILDTIME}\n"
+RPMIDFMT="%{NAME}-%{VERSION}-%{RELEASE} %{BUILDTIME}\n"
+
+pkg_initdb_rpm() {
+    echo "initializing rpm db..."
+    mkdir -p $BUILD_ROOT/var/lib/rpm
+    # rpm v5 does not have initdb
+    if ! test -e $BUILD_ROOT/usr/lib/rpm/cpuinfo.yaml ; then
+       if test -x $BUILD_ROOT/usr/bin/rpmdb ; then
+           chroot $BUILD_ROOT /usr/bin/rpmdb --initdb || cleanup_and_exit 1
+       else
+           chroot $BUILD_ROOT rpm --initdb || cleanup_and_exit 1
+       fi
+    fi
+    # hack: add nofsync to db config to speed up install
+    mkdir -p $BUILD_ROOT/root
+    DBI_OTHER=`chroot $BUILD_ROOT rpm --eval '%{?__dbi_other}'`
+    echo "%__dbi_other $DBI_OTHER nofsync" > $BUILD_ROOT/.rpmmacros
+    echo "%__dbi_other $DBI_OTHER nofsync" > $BUILD_ROOT/root/.rpmmacros
+}
+
+pkg_get_installed_rpm() {
+    chroot $BUILD_ROOT rpm -qa --qf "%{NAME} $RPMIDFMT" | (
+       while read pp ii; do
+            echo "$ii" > "$BUILD_ROOT/.init_b_cache/alreadyinstalled/$pp"
+        done
+    )
+    # small hack: we misuse get_installed_rpm as initializer function
+    rpm_set_checkopts
+    rpm_init_cumulate
+}
+
+pkg_erase_rpm() {
+    chroot $BUILD_ROOT rpm --nodeps -e $PKG 2>&1 | {
+       local retry
+       while read line; do
+           case "$line" in
+               r*failed:\ No\ such\ file\ or\ directory) ;;
+               error:\ failed\ to\ stat\ *:\ No\ such\ file\ or\ directory) ;;
+               error:\ *scriptlet\ failed*)
+                   echo "$line"
+                   retry=1
+               ;;
+               *) echo "$line" ;;
+           esac
+       done
+       if test -n "$retry" ; then
+           echo "re-try deleting $PKG using --noscripts"
+           chroot $BUILD_ROOT rpm --nodeps --noscripts -e $PKG || true
+       fi
+    }
+}
+
+rpm_set_checkopts() {
+    RPMCHECKOPTS=
+    RPMCHECKOPTS_HOST=
+    # on Fedora 10 rpmbuild is in a separate package so we need something else to
+    # detect rpm4
+    test -x $BUILD_ROOT/usr/bin/rpmquery && RPMCHECKOPTS="--nodigest --nosignature"
+    test -x /usr/bin/rpmquery && RPMCHECKOPTS_HOST="--nodigest --nosignature"
+}
+
+rpm_init_cumulate() {
+    cumulate=-1
+    CUMULATED_LIST=()
+    CUMULATED_PIDS=()
+    CUMULATED_HMD5=()
+    DO_CUMULATE=
+    typeset -ri suse_version=$(chroot $BUILD_ROOT rpm --eval '%{?suse_version}' 2>/dev/null)
+    if ((suse_version > 1220)) ; then 
+       DO_CUMULATE=true
+    fi
+}
+
+pkg_set_packageid_rpm() {
+    PKGID=`rpm -qp --qf "$RPMIDFMT" $RPMCHECKOPTS_HOST $BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm`
+}
+
+pkg_verify_installed_rpm() {
+    chroot $BUILD_ROOT rpm --verify $PKG 2>&1 | tee $TMPFILE
+    if grep ^missing $TMPFILE > /dev/null ; then
+       return 1
+    fi
+    return 0
+}
+
+pkg_cumulate_rpm() {
+    test "$DO_CUMULATE" = true || return 1
+    # work around for cross-build installs, we must not overwrite the running rpm
+    if test "$PKG" = rpm ; then
+       for i in $BUILD_ROOT/.init_b_cache/preinstalls/rpm-x86-* ; do
+           test -e "$i" && return 1
+       done
+    fi
+    let cumulate++
+    CUMULATED_LIST[$cumulate]=".init_b_cache/$PKG.rpm"
+    CUMULATED_PIDS[$cumulate]="$PKGID"
+    CUMULATED_HMD5[$cumulate]="$PKG_HDRMD5"
+    return 0
+}
+
+pkg_install_rpm() {
+    export ADDITIONAL_PARAMS=
+    if test "$USE_FORCE" = true ; then
+       export ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS --force"
+    fi
+    # work around for cross-build installs, we must not overwrite the running rpm
+    if test "$PKG" = rpm ; then
+       for i in $BUILD_ROOT/.init_b_cache/preinstalls/rpm-x86-* ; do
+           test -e "$i" && ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS --justdb"
+       done
+    fi
+    ( chroot $BUILD_ROOT rpm --ignorearch --nodeps -U --oldpackage --ignoresize $RPMCHECKOPTS \
+               $ADDITIONAL_PARAMS .init_b_cache/$PKG.rpm 2>&1 || \
+         touch $BUILD_ROOT/exit ) | \
+             grep -v "^warning:.*saved as.*rpmorig$"
+}
+
+pkg_finalize_rpm() {
+    if test -n "${CUMULATED_LIST[*]}" ; then
+       echo "now installing cumulated packages"
+       for ((num=0; num<=cumulate; num++)) ; do
+           echo ${CUMULATED_LIST[$num]}
+           PKG=${CUMULATED_LIST[$num]##*/}
+           test "$BUILD_ROOT/.init_b_cache/rpms/$PKG" -ef "$BUILD_ROOT/${CUMULATED_LIST[$num]}" && continue
+           rm -f $BUILD_ROOT/${CUMULATED_LIST[$num]}
+           cp $BUILD_ROOT/.init_b_cache/rpms/$PKG $BUILD_ROOT/${CUMULATED_LIST[$num]} || cleanup_and_exit 1
+       done > $BUILD_ROOT/.init_b_cache/manifest
+       chroot $BUILD_ROOT rpm --ignorearch --nodeps -Uh --oldpackage --ignoresize --verbose $RPMCHECKOPTS \
+               $ADDITIONAL_PARAMS .init_b_cache/manifest 2>&1 || touch $BUILD_ROOT/exit
+       for ((num=0; num<=cumulate; num++)) ; do
+           rm -f $BUILD_ROOT/${CUMULATED_LIST[$num]}
+       done
+       rm -f $BUILD_ROOT/.init_b_cache/manifest
+       check_exit
+       for ((num=0; num<=cumulate; num++)) ; do
+           PKG=${CUMULATED_LIST[$num]##*/}
+           echo "${CUMULATED_PIDS[$num]}" > $BUILD_ROOT/installed-pkg/${PKG%.rpm}
+           test -n "${CUMULATED_HMD5[$num]}" || continue
+           echo "${CUMULATED_HMD5[$num]} ${CUMULATED_PIDS[$num]}" > $BUILD_ROOT/.preinstall_image/${PKG%.rpm}
+       done
+    fi
+}
+
+pkg_preinstall_rpm() {
+    PAYLOADDECOMPRESS=cat
+    case `rpm -qp --nodigest --nosignature --qf "%{PAYLOADCOMPRESSOR}\n" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm"` in
+       lzma) rpm --showrc | egrep 'PayloadIsLzma|_lzma' > /dev/null || PAYLOADDECOMPRESS="lzma -d" ;;
+       xz) rpm --showrc | egrep 'PayloadIsXz|_xz' > /dev/null || PAYLOADDECOMPRESS="xz -d" ;;
+    esac
+    if test "$PAYLOADDECOMPRESS" = "lzma -d" ; then
+       if ! lzma </dev/null >/dev/null 2>&1 ; then
+           test -f "$BUILD_DIR/lzmadec.sh" && PAYLOADDECOMPRESS="bash $BUILD_DIR/lzmadec.sh"
+       fi
+    fi
+    if test "$PAYLOADDECOMPRESS" = "xz -d" ; then
+       if ! xz </dev/null >/dev/null 2>&1 ; then
+           test -f "$BUILD_DIR/xzdec.sh" && PAYLOADDECOMPRESS="bash $BUILD_DIR/xzdec.sh"
+       fi
+    fi
+    if test "$PAYLOADDECOMPRESS" = cat ; then
+       rpm2cpio "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" | $CPIO
+    else
+       rpm2cpio "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" | $PAYLOADDECOMPRESS | $CPIO
+    fi
+    if test -e ".init_b_cache/scripts/$PKG.run" ; then
+       rpm -qp --nodigest --nosignature --qf "%{PREIN}" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" > ".init_b_cache/scripts/$PKG.pre"
+       rpm -qp --nodigest --nosignature --qf "%{POSTIN}" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" > ".init_b_cache/scripts/$PKG.post"
+       echo -n '(none)' > .init_b_cache/scripts/.none
+       cmp -s ".init_b_cache/scripts/$PKG.pre" .init_b_cache/scripts/.none && rm -f ".init_b_cache/scripts/$PKG.pre"
+       cmp -s ".init_b_cache/scripts/$PKG.post" .init_b_cache/scripts/.none && rm -f ".init_b_cache/scripts/$PKG.post"
+       rm -f .init_b_cache/scripts/.none
+    fi
+    # hack for rpm erasures
+    if test -d "$BUILD_ROOT/installed-pkg" ; then
+       # call for rpm-4.x and not rpm-devel
+        test -z "${PKG##rpm-[0-9]*}" && chroot $BUILD_ROOT rpm --rebuilddb
+        # also exec for exchanged rpm !  naming is rpm-x86-<target>-<ver>
+        test -z "${PKG##rpm-x86-*[0-9]*}" && chroot $BUILD_ROOT rpm --rebuilddb
+    fi
+}
+
+pkg_runscripts_rpm() {
+    if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" ; then
+       echo "running $PKG preinstall script"
+       chroot $BUILD_ROOT sh ".init_b_cache/scripts/$PKG.pre" 0
+       rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre"
+    fi
+    if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" ; then
+       echo "running $PKG postinstall script"
+       chroot $BUILD_ROOT sh ".init_b_cache/scripts/$PKG.post" 1
+       rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post"
+    fi
+}
diff --git a/build-recipe b/build-recipe
new file mode 100644 (file)
index 0000000..b8165ec
--- /dev/null
@@ -0,0 +1,108 @@
+#
+# recipe specific functions for the build script
+#
+# (C) 2014 SUSE, Inc
+#
+
+KIWI_PARAMETERS=
+
+for i in spec dsc kiwi arch preinstallimage mock livebuild; do
+    . "$BUILD_DIR/build-recipe-$i"
+done
+
+recipe_setup() {
+    recipe_setup_$BUILDTYPE "$@"
+}
+
+recipe_prepare() {
+    recipe_prepare_$BUILDTYPE "$@"
+}
+
+recipe_build() {
+    recipe_build_$BUILDTYPE "$@"
+}
+
+recipe_resultdirs () {
+    recipe_resultdirs_$BUILDTYPE "$@"
+}
+
+recipe_parse_options() {
+    case ${PARAM/#--/-} in
+      -stage)
+       needarg
+       BUILD_RPM_BUILD_STAGE="$ARG"
+       shift
+       ;;
+      -kiwi-parameter)
+       test -z "$ARG" && ARG="$1"
+       needarg
+       KIWI_PARAMETERS="$KIWI_PARAMETERS $ARG"
+       shift
+       ;;
+      -*)
+       return 1
+       ;;
+    esac
+    nextargs=("$@")
+    return 0
+}
+
+recipe_set_buildtype() {
+    BUILDTYPE=
+    case ${RECIPEFILE##_service:*:} in
+        *.spec|*.src.rpm) BUILDTYPE=spec ;;
+        *.dsc) BUILDTYPE=dsc ;;
+        *.kiwi) BUILDTYPE=kiwi ;;
+        PKGBUILD) BUILDTYPE=arch ;;
+        _preinstallimage) BUILDTYPE=preinstallimage ;;
+        *.livebuild) BUILDTYPE=livebuild ;;
+    esac
+    if test -z "$BUILDTYPE" ; then
+       echo "I don't know how to build $RECIPEFILE"
+       cleanup_and_exit 1
+    fi
+    # we can't query right after vm startup, so we put the BUILDENGINE in the build.data
+    if test -z "$RUNNING_IN_VM" ; then
+       BUILDENGINE=
+       if test -n "$BUILD_DIST" ; then
+           BUILDENGINE=`queryconfig buildengine --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"`
+           test "$BUILDENGINE" = UNDEFINED && BUILDENGINE=
+       fi
+    fi
+    if test "$BUILDENGINE" = mock -a "$BUILDTYPE" = spec ; then
+       BUILDTYPE=mock
+    fi
+}
+
+# expands all directories into files
+expand_recipe_directories() {
+    local f t ff found
+    if test -z "$RECIPEFILES" ; then
+       set -- "`pwd`"
+    else
+       set -- "${RECIPEFILES[@]}"
+    fi
+    RECIPEFILES=()
+    for f in "$@" ; do
+       if test "$f" = "${f#/}" ; then
+           f="`pwd`/$f"
+       fi
+       if test -d "$f" ; then
+           for t in .spec .dsc PKGBUILD .kiwi .src.rpm .nosrc.rpm ; do
+               found=
+               for ff in "$f"/*$t ; do
+                   test -f "$ff" || continue
+                   RECIPEFILES=("${RECIPEFILES[@]}" "$ff")
+                   found=true
+               done
+               test -n "$found" && break
+           done
+       else
+           RECIPEFILES[${#RECIPEFILES[@]}]="$f"
+       fi
+    done
+    if test -z "$RECIPEFILES" ; then
+       echo "no recipe files found in $@. exit..."
+       cleanup_and_exit 1
+    fi
+}
diff --git a/build-recipe-arch b/build-recipe-arch
new file mode 100644 (file)
index 0000000..2db77da
--- /dev/null
@@ -0,0 +1,40 @@
+#
+# Arch specific functions.
+#
+# (C) 2014 SUSE, Inc
+#
+
+recipe_setup_arch() {
+    TOPDIR=/usr/src/packages
+    rm -rf "$BUILD_ROOT$TOPDIR"
+    mkdir -p "$BUILD_ROOT$TOPDIR"
+    mkdir -p "$BUILD_ROOT$TOPDIR/OTHER"
+    mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES"
+    mkdir -p "$BUILD_ROOT/$TOPDIR/ARCHPKGS"
+    mkdir -p "$BUILD_ROOT/$TOPDIR/BUILD"
+    chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
+    cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
+    {
+       echo 'source /etc/makepkg.conf'
+       printf '%s=%s\n' \
+           BUILDDIR $TOPDIR/BUILD \
+           PKGDEST $TOPDIR/ARCHPKGS
+    } > $BUILD_ROOT$TOPDIR/makepkg.conf
+}
+
+recipe_prepare_arch() {
+    echo "Preparing sources..."
+    _arch_recipe_makepkg -so "2>&1" ">/dev/null"
+}
+
+recipe_build_arch() {
+    _arch_recipe_makepkg -ef < /dev/null && BUILD_SUCCEEDED=true
+}
+
+recipe_resultdirs_arch() {
+    echo ARCHPKGS
+}
+
+_arch_recipe_makepkg() {
+    chroot $BUILD_ROOT su -lc "source /etc/profile; cd $TOPDIR/SOURCES && makepkg --config ../makepkg.conf $*" $BUILD_USER
+}
diff --git a/build-recipe-dsc b/build-recipe-dsc
new file mode 100644 (file)
index 0000000..81cd024
--- /dev/null
@@ -0,0 +1,86 @@
+#
+# dsc specific functions.
+#
+# (C) 2014 SUSE, Inc
+#
+
+recipe_setup_dsc() {
+    TOPDIR=/usr/src/packages
+    rm -rf "$BUILD_ROOT$TOPDIR"
+    mkdir -p "$BUILD_ROOT$TOPDIR"
+    mkdir -p "$BUILD_ROOT$TOPDIR/OTHER"
+    mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES"
+    mkdir -p "$BUILD_ROOT/$TOPDIR/DEBS"
+    chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
+    cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
+    # FIX to work with baselibs_$PROJ etc
+    if test -e "$MYSRCDIR/baselibs-deb.conf" ; then
+       echo "dsc build and baselibs-deb.conf present: forcing --baselibs to true"
+       CREATE_BASELIBS=true
+    fi
+}
+
+recipe_prepare_dsc() {
+    rm -rf "$BUILD_ROOT$TOPDIR/BUILD"
+    mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES.DEB"
+    chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
+    DEB_TRANSFORM=
+    DEB_SOURCEDIR="$TOPDIR/SOURCES"
+    DEB_DSCFILE="$RECIPEFILE"
+    for f in $BUILD_ROOT$TOPDIR/SOURCES/debian.* ; do 
+       test -f $f && DEB_TRANSFORM=true
+    done
+    if test -n "$DEB_TRANSFORM" ; then 
+       CHANGELOGARGS=
+       test -n "$CHANGELOG" -a -f "$BUILD_ROOT/.build-changelog" && CHANGELOGARGS="--changelog $BUILD_ROOT/.build-changelog"
+       echo "running debian transformer..."
+       if ! debtransform $CHANGELOGARGS $BUILD_ROOT$TOPDIR/SOURCES $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE $BUILD_ROOT$TOPDIR/SOURCES.DEB ; then 
+           echo "debian transforming failed."
+           cleanup_and_exit 1
+       fi
+       DEB_SOURCEDIR=$TOPDIR/SOURCES.DEB
+       for DEB_DSCFILE in $BUILD_ROOT/$DEB_SOURCEDIR/*.dsc ; do : ; done 
+       DEB_DSCFILE="${DEB_DSCFILE##*/}"
+    fi
+    chroot $BUILD_ROOT su -c "dpkg-source -x $DEB_SOURCEDIR/$DEB_DSCFILE $TOPDIR/BUILD" - $BUILD_USER
+}
+
+recipe_build_dsc() {
+    # Checks to see if a build script should be used
+    # this allows the build environment to be manipulated
+    # and alternate build commands can be used
+    # Debian policy requires to build with single CPU by default
+    #       if test -n "$BUILD_JOBS" ; then
+    #           DSC_BUILD_JOBS="-j$BUILD_JOBS"
+    #       fi
+    DSC_BUILD_CMD="dpkg-buildpackage -us -uc -rfakeroot-tcp $DSC_BUILD_JOBS"
+    if test -e $BUILD_ROOT/$TOPDIR/SOURCES/build.script ; then
+       echo "Sourcing build.script to build - it should normally run 'dpkg-buildpackage -us -uc -rfakeroot-tcp'"
+       DSC_BUILD_CMD="source $TOPDIR/SOURCES/build.script"
+       chmod +x $BUILD_ROOT/$TOPDIR/SOURCES/build.script
+    fi
+
+    if test -n "$RUN_SHELL"; then
+       chroot $BUILD_ROOT su -
+    else
+       chroot $BUILD_ROOT su -c "cd $TOPDIR/BUILD && $DSC_BUILD_CMD" - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true
+       if test "$BUILD_SUCCEEDED" = true -a "$DO_CHECKS" != "false"; then
+          DEB_CHANGESFILE=${RECIPEFILE%.dsc}_"$(chroot $BUILD_ROOT su -c 'dpkg-architecture -qDEB_BUILD_ARCH')".changes
+          chroot $BUILD_ROOT su -c "which lintian > /dev/null && cd $TOPDIR && echo Running lintian && (set -x && lintian -i $DEB_SOURCEDIR/$DEB_DSCFILE)" - $BUILD_USER < /dev/null
+       fi
+    fi
+
+    for DEB in $BUILD_ROOT/$TOPDIR/*.deb ; do
+       test -e "$DEB" && mv "$DEB" "$BUILD_ROOT/$TOPDIR/DEBS"
+    done
+
+    # link used sources over to DEB directory
+    ln $BUILD_ROOT/$DEB_SOURCEDIR/$DEB_DSCFILE $BUILD_ROOT/$TOPDIR/DEBS/
+    while read f ; do
+       ln $BUILD_ROOT/$DEB_SOURCEDIR/$f $BUILD_ROOT/$TOPDIR/DEBS/
+    done < <(sed -ne '/^Files:/,$s/^ ................................ [0-9][0-9]* //p' < $BUILD_ROOT/$DEB_SOURCEDIR/$DEB_DSCFILE)
+}
+
+recipe_resultdirs_dsc() {
+    echo DEBS
+}
diff --git a/build-recipe-kiwi b/build-recipe-kiwi
new file mode 100644 (file)
index 0000000..95afd3f
--- /dev/null
@@ -0,0 +1,469 @@
+#
+# KIWI specific functions. Handle with care.
+#
+# (C) 2014 SUSE, Inc
+#
+
+
+############################################################
+
+# post scriptlet generation functions
+
+kiwi_post_oem() {
+    cat <<-EOF
+       echo "compressing oem images... "
+       cd /$TOPDIR/KIWI-oem
+       # do not store compressed file _and_ uncompressed one
+       [ -e "$imageout.gz" ] && rm -f "$imageout"
+       if [ -e "$imageout.iso" ]; then
+           echo "take iso file and create sha256..."
+           mv "$imageout.iso" "/$TOPDIR/KIWI/$imageout$buildnum.iso"
+           pushd /$TOPDIR/KIWI
+           if [ -x /usr/bin/sha256sum ]; then
+               /usr/bin/sha256sum "$imageout$buildnum.iso" > "$imageout$buildnum.iso.sha256"
+           fi
+           popd
+       fi
+       if [ -e "$imageout.install.iso" ]; then
+           echo "take install.iso file and create sha256..."
+           mv "$imageout.install.iso" "/$TOPDIR/KIWI/$imageout$buildnum.install.iso"
+           pushd /$TOPDIR/KIWI
+           if [ -x /usr/bin/sha256sum ]; then
+               /usr/bin/sha256sum "$imageout$buildnum.install.iso" > "$imageout$buildnum.install.iso.sha256"
+           fi
+           popd
+       fi
+       if [ -e "$imageout.qcow2" ]; then
+           mv "$imageout.qcow2" "/$TOPDIR/KIWI/$imageout$buildnum.qcow2"
+           pushd /$TOPDIR/KIWI
+           if [ -x /usr/bin/sha256sum ]; then
+               echo "Create sha256 file..."
+               /usr/bin/sha256sum "$imageout$buildnum.qcow2" > "$imageout$buildnum.qcow2.sha256"
+           fi
+           popd
+       fi
+       if [ -e "$imageout.raw.install.raw" ]; then
+           compress_tool="bzip2"
+           compress_suffix="bz2"
+           if [ -x /usr/bin/xz ]; then
+               # take xz to get support for sparse files
+               compress_tool="xz -2"
+               compress_suffix="xz"
+           fi
+           mv "$imageout.raw.install.raw" "/$TOPDIR/KIWI/$imageout$buildnum.raw.install.raw"
+           pushd /$TOPDIR/KIWI
+           echo "\$compress_tool raw.install.raw file..."
+           \$compress_tool "$imageout$buildnum.raw.install.raw"
+           if [ -x /usr/bin/sha256sum ]; then
+               echo "Create sha256 file..."
+               /usr/bin/sha256sum "$imageout$buildnum.raw.install.raw.\${compress_suffix}" > "$imageout$buildnum.raw.install.raw.\${compress_suffix}.sha256"
+           fi
+           popd
+       fi
+       if [ -e "$imageout.raw" ]; then
+           compress_tool="bzip2"
+           compress_suffix="bz2"
+           if [ -x /usr/bin/xz ]; then
+               # take xz to get support for sparse files
+               compress_tool="xz -2"
+               compress_suffix="xz"
+           fi
+           mv "$imageout.raw" "/$TOPDIR/KIWI/$imageout$buildnum.raw"
+           pushd /$TOPDIR/KIWI
+           echo "\$compress_tool raw file..."
+           \$compress_tool "$imageout$buildnum.raw"
+           if [ -x /usr/bin/sha256sum ]; then
+               echo "Create sha256 file..."
+               /usr/bin/sha256sum "$imageout$buildnum.raw.\${compress_suffix}" > "$imageout$buildnum.raw.\${compress_suffix}.sha256"
+           fi
+           popd
+       fi
+       EOF
+}
+
+kiwi_post_vmx() {
+    cat <<-EOF
+       echo "compressing vmx images... "
+       cd /$TOPDIR/KIWI-vmx
+       compress_tool="bzip2"
+       compress_suffix="bz2"
+       if [ -x /usr/bin/xz ]; then
+           # take xz to get support for sparse files
+           compress_tool="xz -2"
+           compress_suffix="xz"
+       fi
+       VMXFILES=""
+       SHAFILES=""
+       for suffix in "ovf" "qcow2" "ova" "tar" "vhdfixed" "vhd"; do
+           if [ -e "$imageout.\$suffix" ]; then
+               if [ "\$suffix" == "vhd" -o "\$suffix" == "vhdfixed" ]; then 
+                   mv "$imageout.\$suffix" "/$TOPDIR/KIWI/$imageout$buildnum.\$suffix"
+                   pushd /$TOPDIR/KIWI
+                   echo "\$compress_tool \$suffix file..."
+                   \$compress_tool "$imageout$buildnum.\$suffix"
+                   SHAFILES="\$SHAFILES $imageout$buildnum.\$suffix.\${compress_suffix}"
+                   popd
+               elif [ "\$suffix" == "ovf" ]; then 
+                   mv "$imageout.\${suffix}/$imageout.\$suffix" "/$TOPDIR/KIWI/$imageout$buildnum.\$suffix"
+                   SHAFILES="\$SHAFILES $imageout$buildnum.\$suffix"
+               else 
+                   mv "$imageout.\$suffix" "/$TOPDIR/KIWI/$imageout$buildnum.\$suffix"
+                   SHAFILES="\$SHAFILES $imageout$buildnum.\$suffix"
+               fi
+           fi
+       done
+       # This option has a number of format parameters
+       for i in "$imageout.vmx" "$imageout.vmdk" "$imageout-disk*.vmdk"; do
+           test -e \$i && VMXFILES="\$VMXFILES \$i"
+       done
+       # take raw files as fallback
+       if [ -n "\$VMXFILES" ]; then
+           tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx.tar.bz2" \$VMXFILES
+           SHAFILES="\$SHAFILES $imageout$buildnum-vmx.tar.bz2"
+       elif [ -z "\$SHAFILES" -a -e  "$imageout.raw" ]; then
+           mv "$imageout.raw" "/$TOPDIR/KIWI/$imageout$buildnum-vmx.raw"
+           pushd /$TOPDIR/KIWI
+           echo "\$compress_tool raw file..."
+           \$compress_tool "$imageout$buildnum-vmx.raw"
+           SHAFILES="\$SHAFILES $imageout$buildnum-vmx.raw.\${compress_suffix}"
+           popd
+       fi
+       if [ -e "$imageout.box" ]; then
+           tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx-box.tar.bz2" $imageout.box $imageout.json
+           SHAFILES="\$SHAFILES $imageout$buildnum-vmx-box.tar.bz2"
+       fi
+       if [ -e "$imageout.xenconfig" ]; then
+           tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx.tar.bz2" $imageout.xenconfig $imageout.raw initrd-*
+           SHAFILES="\$SHAFILES $imageout$buildnum-vmx.tar.bz2"
+       fi
+       # FIXME: do we need a single .raw file in any case ?
+
+       cd /$TOPDIR/KIWI
+       if [ -n "\$SHAFILES" -a -x /usr/bin/sha256sum ]; then
+           for i in \$SHAFILES; do
+               echo "Create sha256 file..."
+               /usr/bin/sha256sum "\$i" > "\$i.sha256"
+           done
+       fi
+       tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-raw.tar.bz2" \
+           --exclude="$imageout.iso" --exclude="$imageout.raw" --exclude="$imageout.qcow2" *
+       cd /$TOPDIR/KIWI
+       if [ -x /usr/bin/sha256sum ]; then
+           /usr/bin/sha256sum "$imageout$buildnum-raw.tar.bz2" > "$imageout$buildnum-raw.tar.bz2.sha256"
+       fi
+       EOF
+}
+
+kiwi_post_xen() {
+    cat <<-EOF
+       echo "compressing xen images... "
+       cd /$TOPDIR/KIWI-xen
+       # do not store compressed file _and_ uncompressed one
+       [ -e "$imageout.gz" ] && rm -f "$imageout"
+       tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-xen.tar.bz2" \
+               `grep ^kernel $imageout.xenconfig | cut -d'"'  -f2` \
+               `grep ^ramdisk $imageout.xenconfig | cut -d'"'  -f2` \
+               initrd-* \
+               "$imageout.xenconfig" \
+               "$imageout"
+       if [ -x /usr/bin/sha256sum ]; then
+           echo "Create sha256 file..."
+           cd $TOPDIR/KIWI
+           /usr/bin/sha256sum "$imageout$buildnum-xen.tar.bz2" > "$imageout$buildnum-xen.tar.bz2.sha256"
+       fi
+       EOF
+}
+
+kiwi_post_pxe() {
+    cat <<-EOF
+       echo "compressing pxe images... "
+       cd /$TOPDIR/KIWI-pxe
+       # do not store compressed file _and_ uncompressed one
+       [ -e "$imageout.gz" ] && rm -f "$imageout"
+       tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-pxe.tar.bz2" ${imageout}* initrd-*
+       if [ -x /usr/bin/sha256sum ]; then
+           echo "Create sha256 file..."
+           cd $TOPDIR/KIWI
+           /usr/bin/sha256sum "$imageout$buildnum-pxe.tar.bz2" > "$imageout$buildnum-pxe.tar.bz2.sha256"
+       fi
+       EOF
+}
+
+kiwi_post_iso() {
+    cat <<-EOF
+       cd /$TOPDIR/KIWI-iso
+       for i in *.iso; do
+           mv "\$i" "/$TOPDIR/KIWI/\${i%.iso}$buildnum.iso"
+       done
+       if [ -x /usr/bin/sha256sum ]; then
+           echo "creating sha256 sum for iso images... "
+           cd $TOPDIR/KIWI
+           for i in *.iso; do
+               /usr/bin/sha256sum "\$i" > "\$i.sha256"
+           done
+       fi
+       EOF
+}
+
+kiwi_post_tbz() {
+    cat <<-EOF
+       cd /$TOPDIR/KIWI-tbz
+       for i in *.tbz; do
+           file=\$(readlink -f "\$i")
+           [ -z "\$file" ] && echo readlink failed for $i
+           mv "\$file" "/$TOPDIR/KIWI/\${i%.tbz}$buildnum.tbz"
+       done
+       if [ -x /usr/bin/sha256sum ]; then
+           echo "creating sha256 sum for tar balls... "
+           cd $TOPDIR/KIWI
+           for i in *.tbz; do
+               /usr/bin/sha256sum "\$i" > "\$i.sha256"
+           done
+       fi
+       EOF
+}
+
+kiwi_post_unknown() {
+    cat <<-EOF
+       echo "compressing unkown images... "
+       cd /$TOPDIR/KIWI-$imgtype
+       # do not store compressed file _and_ uncompressed one
+       [ -e "$imageout.gz" ] && rm -f "$imageout"
+       tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-$imgtype.tar.bz2" *
+       if [ -x /usr/bin/sha256sum ]; then
+           echo "Create sha256 file..."
+           cd /$TOPDIR/KIWI
+           /usr/bin/sha256sum "$imageout$buildnum-$imgtype.tar.bz2" > "$imageout$buildnum-$imgtype.tar.bz2.sha256"
+       fi
+       EOF
+}
+
+############################################################
+
+recipe_setup_kiwi() {
+    TOPDIR=/usr/src/packages
+    mkdir -p "$BUILD_ROOT$TOPDIR"
+    mkdir -p "$BUILD_ROOT$TOPDIR/OTHER"
+    mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES"
+    mkdir -p "$BUILD_ROOT$TOPDIR/KIWI"
+    chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
+    if test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then 
+       mv "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
+    else
+       if test -z "$LINKSOURCES" ; then 
+           cp -dLR "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
+       else
+           cp -lR "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
+       fi
+       if test "$?" != 0 ; then 
+           echo "source copy failed"
+           cleanup_and_exit 1
+       fi
+    fi
+}
+
+recipe_prepare_kiwi() {
+    :
+}
+
+## obsolete with current kiwi versions, only needed for kiwi 3.01 version
+run_suse_isolinux() {
+    for i in $BUILD_ROOT/$TOPDIR/KIWIROOT/main/* ; do
+       test -d "$i" || continue
+       i="${i##*/}"
+       test "$i" = scripts && continue
+       test "$i" != "${i%0}" && continue
+       chroot $BUILD_ROOT su -c "suse-isolinux $TOPDIR/KIWIROOT/main/$i $TOPDIR/KIWI/$i.iso" - $BUILD_USER
+    done
+}
+
+build_kiwi_product() {
+    echo "running kiwi --create-instsource..."
+    # runs always as abuild user
+    mkdir -p "$BUILD_ROOT/$TOPDIR/KIWIROOT"
+    # XXX: again?
+    chroot "$BUILD_ROOT" chown -R abuild.abuild "$TOPDIR"
+    chroot "$BUILD_ROOT" rm -rf "$TOPDIR/KIWIROOT"
+    ver=`chroot "$BUILD_ROOT" su -c "/usr/sbin/kiwi --version | sed -n 's,.*kiwi version v\(.*\),\1,p'"`
+    test -n "$ver" || ver=`chroot "$BUILD_ROOT" su -c "/usr/sbin/kiwi --version | sed -n 's,.* vnr: \(.*\),\1,p'"`
+    if test "${ver:0:1}" == "3" ; then
+        # old style kiwi 3 builds
+       chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT -v --logfile terminal -p $TOPDIR/SOURCES --instsource-local --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true
+       test ${ver:2:2} == "01" && run_suse_isolinux
+    else
+       VERBOSE_OPTION="-v 2"
+       # broken kiwi version, not accepting verbose level
+        test "${ver:0:1}" == "4" -a "${ver:2:2}" -lt 90 && VERBOSE_OPTION="-v -v"
+       chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT $VERBOSE_OPTION --logfile terminal -p $TOPDIR/SOURCES --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true
+    fi
+
+    # move created product to correct destination
+    for i in $BUILD_ROOT/$TOPDIR/KIWIROOT/main/* ; do
+       test -e "$i" || continue
+       f=${i##*/}
+       case $f in
+           *.iso) mv $i $BUILD_ROOT/$TOPDIR/KIWI/. ;;
+           *.packages) mv $i $BUILD_ROOT/$TOPDIR/OTHER/. ;;
+           *.report) mv $i $BUILD_ROOT/$TOPDIR/OTHER/. ;;
+           scripts) ;;
+           *0) ;;
+           *) test -d $i -a "$drop_repo" != true  && mv $i $BUILD_ROOT/$TOPDIR/KIWI/. ;;
+       esac
+    done
+}
+
+build_kiwi_appliance() {
+    if test -z "$RUNNING_IN_VM" ; then
+       # NOTE: this must be done with the outer system, because it loads the dm-mod kernel modules, which needs to fit to the kernel.
+       echo "starting device mapper for kiwi..."
+       test -x /etc/init.d/boot.device-mapper && /etc/init.d/boot.device-mapper start
+    fi
+    RUN_BUNDLE="true"
+    for imgtype in $imagetype ; do
+       echo "running kiwi --prepare for $imgtype..."
+       # Do not use $BUILD_USER here, since we always need root permissions
+       chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && kiwi --prepare $TOPDIR/SOURCES --logfile terminal --root $TOPDIR/KIWIROOT-$imgtype $KIWI_PARAMETERS" - root < /dev/null || cleanup_and_exit 1
+       echo "running kiwi --create for $imgtype..."
+       mkdir -p $BUILD_ROOT/$TOPDIR/KIWI-$imgtype
+       chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && kiwi --create $TOPDIR/KIWIROOT-$imgtype --logfile terminal --type $imgtype -d $TOPDIR/KIWI-$imgtype $KIWI_PARAMETERS" - root < /dev/null || cleanup_and_exit 1
+        rm -rf "/$TOPDIR/KIWI.bundle"
+        if chroot $BUILD_ROOT su -c "kiwi --bundle-build $TOPDIR/KIWI-$imgtype -d /$TOPDIR/KIWI.bundle/ --bundle-id Build$RELEASE" - root < /dev/null; then
+            mv "$BUILD_ROOT/$TOPDIR/KIWI.bundle/"* "$BUILD_ROOT/$TOPDIR/KIWI/" || cleanup_and_exit 1
+            rmdir "$BUILD_ROOT/$TOPDIR/KIWI.bundle"
+            unset RUN_BUNDLE
+        fi
+    done
+    BUILD_SUCCEEDED=true
+
+    if test -z "$RUN_BUNDLE"; then
+       # new kiwi has bundled our result already :)
+       return
+    fi
+
+    #
+    # Legacy bundling code for kiwi version below 5.06.106
+    #
+
+    # create tar.gz of images, in case it makes sense
+    buildnum=
+    if test -n "$RELEASE"; then
+       buildnum="-Build$RELEASE"
+    fi
+    imagearch=`uname -m`
+    imageout="$imagename.$imagearch-$imageversion"
+    for imgtype in $imagetype ; do
+       case "$imgtype" in
+           oem) kiwi_post_oem   > $BUILD_ROOT/kiwi_post.sh ;;
+           vmx) kiwi_post_vmx   > $BUILD_ROOT/kiwi_post.sh ;;
+           xen) kiwi_post_xen   > $BUILD_ROOT/kiwi_post.sh ;;
+           pxe) kiwi_post_pxe   > $BUILD_ROOT/kiwi_post.sh ;;
+           iso) kiwi_post_iso   > $BUILD_ROOT/kiwi_post.sh ;;
+           tbz) kiwi_post_tbz   > $BUILD_ROOT/kiwi_post.sh ;;
+           *) kiwi_post_unknown > $BUILD_ROOT/kiwi_post.sh ;;
+       esac
+       cat >> $BUILD_ROOT/kiwi_post.sh <<-EOF
+               cd /$TOPDIR/KIWI-$imgtype
+               if [ -e "$imageout.channel" ]; then
+                   echo "Found kiwi channel list file, exporting as well..."
+                   cp "$imageout.channel" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.channel"
+               fi
+               if [ -e "$imageout.packages" ]; then
+                   echo "Found kiwi package list file, exporting as well..."
+                   cp "$imageout.packages" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.packages"
+               fi
+               if [ -e "$imageout.verified" ]; then
+                   echo "Found rpm verification report, exporting as well..."
+                   cp "$imageout.verified" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.verified"
+               fi
+               EOF
+       chroot $BUILD_ROOT su -c "sh -e /kiwi_post.sh" || cleanup_and_exit 1
+       rm -f $BUILD_ROOT/kiwi_post.sh
+    done
+}
+
+recipe_build_kiwi() {
+    imagetype=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE imagetype)
+    imagename=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE filename)
+    imageversion=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE version)
+    drop_repo=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE drop_repository)
+
+    # prepare rpms as source and createrepo on the repositories
+    ln -sf $TOPDIR/SOURCES/repos $BUILD_ROOT/repos
+    cd $BUILD_ROOT/$TOPDIR/SOURCES/repos
+    for r in */* ; do
+        test -L $r && continue
+        test -d $r || continue
+        repo="$TOPDIR/SOURCES/repos/$r/"
+        # create compatibility link for old kiwi versions
+        rc="${r//:/:/}"
+        if test "$rc" != "$r" ; then
+       rl="${rc//[^\/]}"
+       rl="${rl//?/../}"
+       mkdir -p "${rc%/*}"
+       ln -s $rl$r "${rc%/*}/${rc##*/}"
+       repo="$TOPDIR/SOURCES/repos/${rc%/*}/${rc##*/}/"
+        fi
+        if test "$imagetype" != product -a "$DO_INIT" != "false" ; then
+           echo "creating repodata for $repo"
+           if chroot $BUILD_ROOT createrepo --no-database --simple-md-filenames --help >/dev/null 2>&1 ; then
+               chroot $BUILD_ROOT createrepo --no-database --simple-md-filenames "$repo"
+           else
+               chroot $BUILD_ROOT createrepo "$repo"
+           fi
+        fi
+    done
+
+    # unpack root tar
+    for t in $BUILD_ROOT/$TOPDIR/SOURCES/root.tar* ; do
+       test -f $t || continue
+       mkdir -p $BUILD_ROOT/$TOPDIR/SOURCES/root
+       chroot $BUILD_ROOT tar -C $TOPDIR/SOURCES/root -xf "$TOPDIR/SOURCES/${t##*/}"
+    done
+
+    # fix script permissions
+    chmod a+x $BUILD_ROOT/$TOPDIR/SOURCES/*.sh 2>/dev/null
+
+    # unpack tar files in image directories
+    if test -d $BUILD_ROOT/$TOPDIR/SOURCES/images ; then
+       (
+       cd $BUILD_ROOT/$TOPDIR/SOURCES/images
+       for r in */* ; do
+           test -L $r && continue
+           test -d $r || continue
+           for t in $r/root.tar* ; do
+               test -f $t || continue
+               mkdir -p $r/root
+               chroot $BUILD_ROOT tar -C $TOPDIR/SOURCES/images/$r/root -xf "$TOPDIR/SOURCES/images/$r/${t##*/}"
+           done
+           # fix script permissions
+           chmod a+x $BUILD_ROOT/$TOPDIR/SOURCES/images/$r/*.sh 2>/dev/null
+           # create compatibility link for old kiwi versions
+           rc="${r//:/:/}"
+           if test "$rc" != "$r" ; then
+               rl="${rc//[^\/]}"
+               rl="${rl//?/../}"
+               mkdir -p "${rc%/*}"
+               ln -s $rl$r "${rc%/*}/${rc##*/}"
+           fi
+       done
+       )
+    fi
+
+    rm -f $BUILD_ROOT/$TOPDIR/SOURCES/config.xml
+    ln -s $RECIPEFILE $BUILD_ROOT/$TOPDIR/SOURCES/config.xml
+
+    if test "$imagetype" = product ; then
+       build_kiwi_product
+    else
+       build_kiwi_appliance
+    fi
+
+    # Hook for running post kiwi build scripts like QA scripts if installed
+    if test -x $BUILD_ROOT/usr/lib/build/kiwi_post_run ; then
+       chroot $BUILD_ROOT su -c /usr/lib/build/kiwi_post_run || cleanup_and_exit 1
+    fi
+}
+
+recipe_resultdirs_kiwi() {
+    echo KIWI
+}
diff --git a/build-recipe-livebuild b/build-recipe-livebuild
new file mode 100644 (file)
index 0000000..6ae7046
--- /dev/null
@@ -0,0 +1,222 @@
+#
+# Debian live-build specific functions.
+#
+# Author: Jan Blunck <jblunck@infradead.org>
+#
+# This file is part of build.
+#
+# build is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# build is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with build.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+recipe_setup_livebuild() {
+
+    TOPDIR=/usr/src/packages
+    rm -rf "$BUILD_ROOT$TOPDIR"
+    for i in OTHER SOURCES LIVEBUILD_ROOT ; do
+       mkdir -p "$BUILD_ROOT$TOPDIR/$i"
+    done
+    chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
+    if test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then
+       mv "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
+    else
+       cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
+    fi
+}
+
+recipe_prepare_livebuild() {
+    :
+}
+
+createrepo_debian() {
+    local DIR=${1}
+    local ARCH=${2}
+    local DIST=${3}
+
+    if [ -z "${DIR}" -o ! -d ${DIR} -o ${DIR} = ${DIR##${BUILD_ROOT}} ] ; then
+        return
+    fi
+
+    pushd ${DIR} >/dev/null
+
+    # cleanup existing repository files
+    rm -f Packages Packages.gz Release
+    rm -fr dists
+
+    mkdir -p dists/${DIST}
+    # Suite is symlinked to Codename
+    ln -s ${DIST} dists/stable
+
+    # create Packages and Sources files
+    mkdir -p dists/${DIST}/main/binary-${ARCH}
+    mkdir -p dists/${DIST}/main/source
+    cat > ${BUILD_ROOT}/.createrepo_debian.tmp.sh <<-EOF
+       cd /.build.binaries || exit 1
+       dpkg-scanpackages -m . > dists/${DIST}/main/binary-${ARCH}/Packages
+       gzip -c9 < dists/${DIST}/main/binary-${ARCH}/Packages \
+           > dists/${DIST}/main/binary-${ARCH}/Packages.gz
+       dpkg-scansources . > dists/${DIST}/main/source/Sources
+       gzip -c9 dists/${DIST}/main/source/Sources \
+           > dists/${DIST}/main/source/Sources.gz
+       EOF
+    chroot $BUILD_ROOT su -c "sh /.createrepo_debian.tmp.sh" - root
+    local RESULT=$?
+    rm -f $BUILD_ROOT/.createrepo_debian.tmp.sh
+    [ "${RESULT}" != 0 ] && return
+
+    # create Release file
+    pushd dists/${DIST} >/dev/null
+    cat > Release <<-EOF
+       Origin: Debian
+       Label: Debian
+       Suite: stable
+       Version: 7.1
+       Codename: ${DIST}
+       Date: Sat, 15 Jun 2013 10:55:26 UTC
+       Description: Debian repository created by build-recipe-livebuild
+       Components: main
+       EOF
+    echo "SHA256:" >> Release
+    for file in main/binary-${ARCH}/Packages* ; do
+        local SUM=( $(sha256sum ${file}) )
+        local SIZE=$(stat -c '%s' ${file})
+        echo " ${SUM} ${SIZE} ${file}" >> Release
+    done
+    for file in main/source/Sources* ; do
+        local SUM=( $(sha256sum ${file}) )
+        local SIZE=$(stat -c '%s' ${file})
+        echo " ${SUM} ${SIZE} ${file}" >> Release
+    done
+    popd >/dev/null
+
+    # TODO: this is missing the signature with the private key
+
+    popd >/dev/null
+}
+
+# This script expects that the $BUILD_ROOT is a Debian installation with
+# live-build already installed!
+#
+# Variables:
+# $BUILD_ROOT the Debian chroot
+# $TOPDIR/SOURCES includes the live-build config tarball
+# $TOPDIR/$LIVEBUILD_ROOT where live-build will be called
+# $RECIPEFILE the name of the live-build config tarball
+
+recipe_build_livebuild() {
+    local ARCH=$(chroot $BUILD_ROOT su -c "dpkg-architecture -qDEB_BUILD_ARCH")
+    local DIST=$(chroot $BUILD_ROOT su -c "lsb_release --codename" | awk '{ print $2 }')
+    local LIVEBUILD_ROOT="LIVEBUILD_ROOT"
+
+    [ -z "${ARCH}" -o -z "${DIST}" ] && cleanup_and_exit 1
+
+    test -d $BUILD_ROOT/.build.binaries || cleanup_and_exit 1
+    if test "$DO_INIT" = true -o ! -d "$BUILD_ROOT/.build.binaries/dists" ; then
+       echo "creating repository metadata..."
+        createrepo_debian $BUILD_ROOT/.build.binaries ${ARCH} ${DIST}
+    fi
+
+    # Write our default configuration variables
+    mkdir -p $BUILD_ROOT/etc/live
+    cat > $BUILD_ROOT/etc/live/build.conf <<-EOF
+       LB_DEBIAN_INSTALLER_DISTRIBUTION="${DIST}"
+       LB_DISTRIBUTION="${DIST}"
+       LB_PARENT_DISTRIBUTION="${DIST}"
+       LB_PARENT_DEBIAN_INSTALLER_DISTRIBUTION="${DIST}"
+       LB_PARENT_MIRROR_BOOTSTRAP="file:/.build.binaries/"
+       LB_PARENT_MIRROR_CHROOT="file:/.build.binaries/"
+       LB_PARENT_MIRROR_CHROOT_SECURITY="file:/.build.binaries/"
+       LB_PARENT_MIRROR_BINARY="file:/.build.binaries/"
+       LB_PARENT_MIRROR_BINARY_SECURITY="file:/.build.binaries/"
+       LB_PARENT_MIRROR_DEBIAN_INSTALLER="file:/.build.binaries/"
+       LB_MIRROR_BOOTSTRAP="file:/.build.binaries/"
+       LB_MIRROR_CHROOT="file:/.build.binaries/"
+       LB_MIRROR_CHROOT_SECURITY="file:/.build.binaries/"
+       LB_MIRROR_BINARY="file:/.build.binaries/"
+       LB_MIRROR_BINARY_SECURITY="file:/.build.binaries/"
+       LB_MIRROR_DEBIAN_INSTALLER="file:/.build.binaries/"
+       LB_APT_SECURE="false"
+       EOF
+
+    # Expand live-build configuration to $TOPDIR/$LIVEBUILD_ROOT
+    echo "Expanding live-build configuration"
+    tar -xvf $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE \
+       -C $BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT || cleanup_and_exit 1
+
+    # Skip top-level directory if it matches recipe name, ...
+    local files=($BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/*)
+    # ... but ignore some well known names
+    files=(${files[@]%%*/auto})
+    files=(${files[@]%%*/config})
+    files=(${files[@]%%*/local})
+    if [ ${#files[@]} -eq 1 ] && \
+       [ -d $BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/${RECIPEFILE%.livebuild} ]
+    then
+       LIVEBUILD_ROOT="LIVEBUILD_ROOT/${RECIPEFILE%.livebuild}"
+    fi
+
+    # Sanity check to not configure archives inside configuration
+    files=($BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/config/archives/*)
+    [ ${#files[@]} -gt 0 ] && cleanup_and_exit 1
+
+    # TODO: Add the repository public key
+    # cp ... $BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/config/archives/debian.key
+
+    if [ -x $BUILD_ROOT/usr/lib/build/livebuild_pre_run ] ; then
+       echo "Running OBS build livebuild_pre_run hook"
+       chroot $BUILD_ROOT su -c "/usr/lib/build/livebuild_pre_run" - root \
+           < /dev/null || cleanup_and_exit 1
+    fi
+
+    # TODO: this might move to lb auto/config file
+    if [ -f $BUILD_ROOT/$TOPDIR/SOURCES/livebuild_pre_run ] ; then
+       cp $BUILD_ROOT/$TOPDIR/SOURCES/livebuild_pre_run \
+           $BUILD_ROOT/.build.livebuild_pre_run
+       chmod +x $BUILD_ROOT/.build.livebuild_pre_run
+       echo "Running package livebuild_pre_run hook"
+       chroot $BUILD_ROOT su -c "/.build.livebuild_pre_run" - root \
+           < /dev/null || cleanup_and_exit 1
+    fi
+
+    chroot $BUILD_ROOT su -c "cd $TOPDIR/$LIVEBUILD_ROOT && lb build" - root \
+       < /dev/null || cleanup_and_exit 1
+
+    # Move created product to destination
+    for i in $BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/* ; do
+       test -f "$i" || continue
+       case "${i##*/}" in
+           *.iso)
+               # all created files share the same name without suffix
+               mv ${i%%.iso}.* $BUILD_ROOT/$TOPDIR/OTHER/.
+               BUILD_SUCCEEDED=true
+               ;;
+           *)
+               ;;
+       esac
+    done
+
+    # Fail the build if no ISO was created
+    if [ -z "$(ls $BUILD_ROOT/$TOPDIR/OTHER/*.iso)" ] ; then
+       echo "No ISO image found"
+       cleanup_and_exit 1
+    fi
+}
+
+recipe_resultdirs_livebuild() {
+    # our results are already in OTHER
+    :
+}
+
+# Local Variables:
+# mode: Shell-script
+# End:
diff --git a/build-recipe-mock b/build-recipe-mock
new file mode 100644 (file)
index 0000000..2aa387a
--- /dev/null
@@ -0,0 +1,83 @@
+#
+# mock specific functions.
+#
+# (C) 2014 SUSE, Inc
+#
+
+recipe_setup_mock() {
+    recipe_setup_spec "$@"
+}
+
+recipe_prepare_mock() {
+    recipe_prepare_spec "$@"
+}
+
+recipe_build_mock() {
+    test -d $BUILD_ROOT/.build.binaries || cleanup_and_exit 1
+    if test "$DO_INIT" = true -o ! -d "$BUILD_ROOT/.build.binaries/repodata" ; then
+       echo "creating repository for mock..."
+       chroot $BUILD_ROOT createrepo --no-database --basedir /.build.binaries -o /.build.binaries /.build.binaries
+    fi
+    MOCK_CHROOT_SETUP_CMD="$(queryconfig --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" substitute mock:chroot_setup_cmd)"
+    test -z "$MOCK_CHROOT_SETUP_CMD" && MOCK_CHROOT_SETUP_CMD="groupinstall buildsys-build"
+    echo "config_opts['root'] = 'build'" > $BUILD_ROOT/etc/mock/build.cfg
+    echo "config_opts['target_arch'] = '${BUILD_ARCH%%:*}'" >> $BUILD_ROOT/etc/mock/build.cfg
+    echo "config_opts['plugin_conf']['ccache_enable'] = False" >> $BUILD_ROOT/etc/mock/build.cfg
+    echo "config_opts['chroot_setup_cmd'] = '$MOCK_CHROOT_SETUP_CMD'" >> $BUILD_ROOT/etc/mock/build.cfg
+    cat >> $BUILD_ROOT/etc/mock/build.cfg <<-'EOF'
+       config_opts['yum.conf'] = """
+       [main]
+       cachedir=/var/cache/yum
+       debuglevel=1
+       reposdir=/dev/null
+       logfile=/var/log/yum.log
+       obsoletes=1
+       gpgcheck=0
+       assumeyes=1
+       syslog_ident=mock
+       syslog_device=
+
+       [build]
+       name=build
+       baseurl=file:///.build.binaries
+       """
+       EOF
+    touch $BUILD_ROOT/etc/resolv.conf
+    BUILD_SUCCEEDED=false
+    echo "building src rpm..."
+    MOCK_INIT_ARG=
+    test "$DO_INIT" = true || MOCK_INIT_ARG=--no-clean
+    if chroot $BUILD_ROOT /usr/bin/mock -r build $MOCK_INIT_ARG --buildsrpm --spec "$TOPDIR/SOURCES/$RECIPEFILE" --sources "$TOPDIR/SOURCES" ; then
+       BUILT_SRPM=
+       for i in "$BUILD_ROOT/var/lib/mock/build/result/"*src.rpm ; do
+           test -s "$i" && BUILT_SRPM="${i##*/}"
+       done
+       if test -n "$BUILT_SRPM" ; then
+           mkdir -p "$BUILD_ROOT/$TOPDIR/SRPMS"
+           mv "$BUILD_ROOT/var/lib/mock/build/result/$BUILT_SRPM" "$BUILD_ROOT/$TOPDIR/SRPMS/$BUILT_SRPM"
+           echo "building binary rpms..."
+           if chroot $BUILD_ROOT /usr/bin/mock -v -r build --rebuild --no-clean "$TOPDIR/SRPMS/$BUILT_SRPM" ; then
+               BUILD_SUCCEEDED=true
+               # move result over to TOPDIR
+               rm -f "$TOPDIR/SRPMS/$BUILT_SRPM"
+               for i in "$BUILD_ROOT/var/lib/mock/build/result/"*.rpm ; do
+                   a="${i%.rpm}"
+                   a="${a##*/}"
+                   a="${a##*.}"
+                   if test "$a" = src -o "$a" = nosrc ; then
+                       mkdir -p "$BUILD_ROOT/$TOPDIR/SRPMS"
+                       mv $i "$BUILD_ROOT/$TOPDIR/SRPMS/."
+                   else
+                       mkdir -p "$BUILD_ROOT/$TOPDIR/RPMS/$a"
+                       mv $i "$BUILD_ROOT/$TOPDIR/RPMS/$a/."
+                   fi
+               done
+           fi
+       fi
+    fi
+}
+
+recipe_resultdirs_mock() {
+    echo RPMS SRPMS
+}
+
diff --git a/build-recipe-preinstallimage b/build-recipe-preinstallimage
new file mode 100644 (file)
index 0000000..2dce153
--- /dev/null
@@ -0,0 +1,62 @@
+#
+# preinstall specific functions.
+#
+# (C) 2014 SUSE, Inc
+#
+
+recipe_setup_preinstallimage() {
+    # should never be called
+    cleanup_and_exit 1
+}
+
+recipe_prepare_preinstallimage() {
+    :
+}
+
+recipe_build_preinstallimage() {
+    echo "creating preinstall image..."
+    test -d "$BUILD_ROOT/.preinstall_image" || cleanup_and_exit 1
+    cd $BUILD_ROOT || cleanup_and_exit 1
+    TAR="tar"
+    if test -x /usr/bin/bsdtar; then
+       TAR="/usr/bin/bsdtar --format gnutar --chroot"
+    fi
+    TOPDIRS=
+    for DIR  in .* * ; do
+      case "$DIR" in
+       .|..) continue ;;
+       .build.kernel*) ;; # to be packaged
+       .build.initrd*) ;; # to be packaged
+       .build*) continue ;;
+       .preinstallimage*) continue ;;
+       .srcfiles*) continue ;;
+       .pkgs) continue ;;
+       .rpm-cache) continue ;;
+       installed-pkg) continue ;;
+       proc|sys) continue ;;
+      esac
+      TOPDIRS="$TOPDIRS $DIR"
+    done
+    if ! $TAR -czf .preinstallimage.$$.tar.gz --one-file-system $TOPDIRS ; then
+       cleanup_and_exit 1
+    fi
+    echo "image created."
+    TOPDIR=/usr/src/packages
+    mkdir -p $BUILD_ROOT$TOPDIR/OTHER
+    rm -f $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.info
+    for PKG in $BUILD_ROOT/.preinstall_image/* ; do
+       PKG=${PKG##*/}
+       read PKG_HDRMD5 PKGID < $BUILD_ROOT/.preinstall_image/$PKG
+       test -n "$PKG_HDRMD5" || cleanup_and_exit 1
+       echo "$PKG_HDRMD5  $PKG" >> $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.info
+    done
+    mv $BUILD_ROOT/.preinstallimage.$$.tar.gz $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.tar.gz
+    rm -f $BUILD_ROOT/.build.packages
+    ln -s ${TOPDIR#/} $BUILD_ROOT/.build.packages
+    test -d "$SRCDIR" && cd "$SRCDIR"
+}
+
+recipe_resultdirs_preinstallimage() {
+    :
+}
+
diff --git a/build-recipe-spec b/build-recipe-spec
new file mode 100644 (file)
index 0000000..b120f02
--- /dev/null
@@ -0,0 +1,218 @@
+#
+# spec specific functions.
+#
+# (C) 2014 SUSE, Inc
+#
+
+recipe_setup_spec() {
+    TOPDIR=`chroot $BUILD_ROOT su -c "rpm --eval '%_topdir'" - $BUILD_USER`
+    if test -z "$TOPDIR"; then
+       echo "Error: TOPDIR empty"
+       cleanup_and_exit 1
+    fi
+    rm -rf "$BUILD_ROOT$TOPDIR"
+    for i in BUILD RPMS/`uname -m` RPMS/i386 RPMS/noarch SOURCES SPECS SRPMS BUILDROOT OTHER ; do
+       mkdir -p $BUILD_ROOT$TOPDIR/$i
+    done
+    chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
+    mkdir -p $BUILD_ROOT$TOPDIR/SOURCES
+    cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
+}
+
+recipe_prepare_spec() {
+    args=()
+    if test -n "$RELEASE"; then
+       args=(--release "$RELEASE")
+    fi
+
+    # fixup specfile
+    CHANGELOGARGS=
+    test -n "$CHANGELOG" -a -f "$BUILD_ROOT/.build-changelog" && CHANGELOGARGS="--changelog $BUILD_ROOT/.build-changelog"
+    substitutedeps "${args[@]}" --root "$BUILD_ROOT" --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" $CHANGELOGARGS "$BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE" "$BUILD_ROOT/.spec.new" || cleanup_and_exit 1
+
+    # fix rpmrc if we are compiling for i686
+    test -f $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 && mv $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 $BUILD_ROOT/usr/lib/rpm/rpmrc
+    if test -e $BUILD_ROOT/usr/lib/rpm/rpmrc -a "$BUILD_ARCH" != "${BUILD_ARCH#i686}" ; then
+       mv $BUILD_ROOT/usr/lib/rpm/rpmrc $BUILD_ROOT/usr/lib/rpm/rpmrc_i586
+       sed -e 's/^buildarchtranslate: athlon.*/buildarchtranslate: athlon: i686/' -e 's/^buildarchtranslate: i686.*/buildarchtranslate: i686: i686/' < $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 > $BUILD_ROOT/usr/lib/rpm/rpmrc
+    fi
+
+    # extract macros from configuration
+    queryconfig rawmacros --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" > $BUILD_ROOT/root/.rpmmacros
+    if test -n "$BUILD_DEBUG" ; then
+       echo '
+%prep %{?!__debug_package:%{?_build_create_debug:%?_build_insert_debug_package}}%%prep
+%package %{?!__debug_package:%{?_build_create_debug:%?_build_insert_debug_package}}%%package
+%_build_insert_debug_package \
+%global __debug_package 1 \
+%undefine _enable_debug_packages \
+%debug_package
+
+' >> $BUILD_ROOT/root/.rpmmacros
+    fi
+
+    if test -n "$BUILD_JOBS" ; then
+       cat >> $BUILD_ROOT/root/.rpmmacros <<-EOF
+               %jobs $BUILD_JOBS
+               %_smp_mflags -j$BUILD_JOBS
+               EOF
+    fi
+    test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/.rpmmacros $BUILD_ROOT/home/abuild/.rpmmacros
+
+    # extract optflags from configuration
+    queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" optflags ${BUILD_DEBUG:+debug} > $BUILD_ROOT/root/.rpmrc
+    test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/.rpmrc $BUILD_ROOT/home/abuild/.rpmrc
+
+    if test -z "$ABUILD_TARGET"; then
+       ABUILD_TARGET=$(queryconfig target --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" )
+       test -z "$ABUILD_TARGET" || echo "build target is $ABUILD_TARGET"
+    fi
+
+    # report specfile changes
+    if test -f $BUILD_ROOT/.spec.new ; then
+       if ! cmp -s $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE $BUILD_ROOT/.spec.new ; then
+           echo -----------------------------------------------------------------
+           echo "I have the following modifications for $RECIPEFILE:"
+           sed -e "/^%changelog/q" $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE > $BUILD_ROOT/.spec.t1
+           sed -e "/^%changelog/q" $BUILD_ROOT/.spec.new > $BUILD_ROOT/.spec.t2
+           diff $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2
+           rm -f $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2
+           mv $BUILD_ROOT/.spec.new $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE
+       else
+           rm -f $BUILD_ROOT/.spec.new
+       fi
+    fi
+}
+
+recipe_build_spec() {
+    test -z "$BUILD_RPM_BUILD_STAGE" && BUILD_RPM_BUILD_STAGE=-ba
+
+    rpmbuild=rpmbuild
+    test -x $BUILD_ROOT/usr/bin/rpmbuild || rpmbuild=rpm
+
+    # XXX: move _srcdefattr to macro file?
+    rpmbopts=("$BUILD_RPM_BUILD_STAGE" "--define" "_srcdefattr (-,root,root)")
+    if test "$DO_CHECKS" != true ; then
+       rpmbopts[${#rpmbopts[@]}]="--nocheck"
+    fi
+    if test "$rpmbuild" == "rpmbuild" ; then
+           # use only --nosignature for rpm v4
+       rpmbopts[${#rpmbopts[@]}]="--nosignature"
+    fi
+    if test -n "$ABUILD_TARGET" ; then
+       rpmbopts[${#rpmbopts[@]}]="--target=$ABUILD_TARGET"
+    fi
+    if test -n "$BUILD_DEBUG" ; then
+       rpmbopts[${#rpmbopts[@]}]='--define'
+       rpmbopts[${#rpmbopts[@]}]="_build_create_debug 1"
+    fi
+    if test -n "$DISTURL" ; then
+       rpmbopts[${#rpmbopts[@]}]='--define'
+       rpmbopts[${#rpmbopts[@]}]="disturl $DISTURL"
+    fi
+    if test -n "$RSYNCDONE" ; then
+       rpmbopts[${#rpmbopts[@]}]='--define'
+       rpmbopts[${#rpmbopts[@]}]="RSYNCDONE 1"
+    fi
+
+    # su involves a shell which would require even more
+    # complicated quoting to bypass than this
+    toshellscript $rpmbuild \
+           "${definesnstuff[@]}" \
+           "${rpmbopts[@]}" \
+           "$TOPDIR/SOURCES/$RECIPEFILE" \
+           > $BUILD_ROOT/.build.command
+    chmod 755 $BUILD_ROOT/.build.command
+    check_exit
+    if test -n "$RUN_SHELL"; then
+       chroot $BUILD_ROOT su -
+    else
+       chroot $BUILD_ROOT su -c /.build.command - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true
+    fi
+}
+
+recipe_resultdirs_spec() {
+    echo RPMS SRPMS
+}
+
+recipe_unpack_srcrpm() {
+    test -n "$LIST_STATE" || echo "processing src rpm $SRCDIR/$RECIPEFILE ..."
+    MYSRCDIR="$BUILD_ROOT/.build-srcdir"
+    rm -rf "$MYSRCDIR"
+    mkdir -p "$MYSRCDIR"
+    cd $MYSRCDIR || cleanup_and_exit 1
+    $BUILD_DIR/unrpm -q $SRCDIR/$RECIPEFILE || {
+       echo "could not unpack $RECIPEFILE."
+       cleanup_and_exit 1
+    }
+    for RECIPEFILE in *.spec ; do : ; done
+}
+
+# post build functions... move somewhere else?
+
+recipe_check_file_owners() {
+    echo "... checking for files with abuild user/group"
+    BADFILE=
+    while read un gn fn ; do
+        if test "$un" = abuild -o "$gn" = abuild -o "$un" = ${ABUILD_UID} -o "$gn" = ${ABUILD_GID} ; then
+            echo "  $un $gn $fn"
+            BADFILE=true
+        fi
+    done < <(rpm -qp --qf '[%{FILEUSERNAME} %{FILEGROUPNAME} %{FILENAMES}\n]' $RPMS)
+    if test -n "$BADFILE" ; then
+        echo "please fix your filelist (e.g. add defattr)"
+        cleanup_and_exit 1
+    fi
+}
+
+recipe_run_rpmlint() {
+    if ! test -x "$BUILD_ROOT/opt/testing/bin/rpmlint" ; then 
+       return
+    fi
+    LINT_RPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/RPMS \
+       \( -name "*-debuginfo-*" -o -name "*-debugsource-*" \
+       -o -name "*-32bit-*" -o -name "*-64bit-*" \
+       -o -name "*-x86-*" -o -name "*-ia32-*" \) -prune \
+       -o -type f -name '*.rpm' -print))
+    SRPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/SRPMS -type f -name "*.rpm"))
+    echo 
+    echo "RPMLINT report:"
+    echo "==============="
+    rpmlint_logfile=$TOPDIR/OTHER/rpmlint.log
+    rm -f "$BUILD_ROOT$rpmlint_logfile"
+    ret=0
+    mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null
+    chroot $BUILD_ROOT su -s /opt/testing/bin/rpmlint "$BUILD_USER" -- \
+           --info ${LINT_RPM_FILE_LIST[*]#$BUILD_ROOT} \
+           ${SRPM_FILE_LIST[*]#$BUILD_ROOT} > "$BUILD_ROOT$rpmlint_logfile" || ret=1
+    cat "$BUILD_ROOT$rpmlint_logfile"
+    echo
+    umount -n $BUILD_ROOT/proc 2>/dev/null || true 
+    if test "$ret" = 1 ; then 
+       cleanup_and_exit 1
+    fi   
+}
+
+recipe_compare_oldpackages() {
+    if test -x "$BUILD_ROOT/usr/lib/build/same-build-result.sh" ; then 
+       echo "... comparing built packages with the former built"
+       mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null
+       if chroot $BUILD_ROOT /usr/lib/build/same-build-result.sh /.build.oldpackages "$TOPDIR/RPMS" "$TOPDIR/SRPMS"; then 
+           chroot $BUILD_ROOT touch /.build/.same_result_marker
+           # XXX: dirty build service hack. fix bs_worker. Search for
+           # 'same_result_marker' for traces of a first try to get rid of this
+           if test -n "$REASON" -a -n "$DISTURL" ; then 
+               exitcode=2
+           fi
+       fi
+       umount -n $BUILD_ROOT/proc 2>/dev/null || true 
+    fi   
+}
+
+recipe_create_deltarpms() {
+    if test -x "$BUILD_ROOT/usr/bin/makedeltarpm" -a -x $BUILD_ROOT/usr/lib/build/mkdrpms ; then
+       echo "... creating delta rpms"
+       ds=("$BUILD_ROOT/$TOPDIR"/RPMS/* "$BUILD_ROOT$TOPDIR/SRPMS")
+       chroot $BUILD_ROOT /usr/lib/build/mkdrpms /.build.oldpackages "${ds[@]#$BUILD_ROOT}"
+    fi
+}
diff --git a/build-vm b/build-vm
new file mode 100644 (file)
index 0000000..1981cbb
--- /dev/null
+++ b/build-vm
@@ -0,0 +1,808 @@
+#
+# VM specific functions for the build script
+#
+# (C) 2014 SUSE, Inc
+#
+
+# defaults for vm_img_mkfs
+vm_img_mkfs_ext4_options='-O ^has_journal,^huge_file,^resize_inode,sparse_super'
+vm_img_mkfs_ext4_extra='-E lazy_itable_init,discard'
+vm_img_mkfs_ext4="mkfs.ext4 -m 0 -q -F $vm_img_mkfs_ext4_options"
+vm_img_tunefs_ext4='tune2fs -c 0'
+vm_img_mkfs_ext3='mkfs.ext3 -m 0 -q -F'
+vm_img_tunefs_ext3='tune2fs -c 0 -o journal_data_writeback'
+vm_img_mkfs_ext2='mkfs.ext2 -m 0 -q -F'
+vm_img_tunefs_ext2='tune2fs -c 0'
+vm_img_mkfs_reiserfs='mkreiserfs -q -f'
+vm_img_mkfs_btrfs='mkfs.btrfs'
+vm_img_mkfs_xfs='mkfs.xfs -f'
+
+# guest visible swap device
+VM_SWAPDEV=/dev/hda2
+
+VM_TYPE=
+VM_IMAGE=
+VM_SWAP=
+VM_KERNEL=
+VM_INITRD=
+VM_WORKER=
+VM_SERVER=
+VM_MEMSIZE=
+VMDISK_ROOTSIZE=4096
+VMDISK_SWAPSIZE=1024
+VMDISK_FILESYSTEM=
+VMDISK_MOUNT_OPTIONS=__default
+VMDISK_CLEAN=
+
+# zvm specific?
+VM_WORKER_NR=
+
+# kvm specific?
+HUGETLBFSPATH=
+
+# emulator specific?
+EMULATOR_SCRIPT=
+
+for i in ec2 emulator kvm lxc openstack qemu uml xen zvm ; do
+    . "$BUILD_DIR/build-vm-$i"
+done
+
+VM_WATCHDOG=
+VM_WATCHDOG_PID=
+
+# the following functions just call the corresponding vm versions
+vm_kill() {
+    vm_kill_$VM_TYPE "$@"
+}
+
+vm_verify_options() {
+    vm_verify_options_$VM_TYPE "$@"
+}
+
+vm_attach_root() {
+    vm_attach_root_$VM_TYPE "$@"
+}
+
+vm_attach_swap() {
+    vm_attach_swap_$VM_TYPE "$@"
+}
+
+vm_detach_root() {
+    vm_detach_root_$VM_TYPE "$@"
+}
+
+vm_detach_swap() {
+    vm_detach_swap_$VM_TYPE "$@"
+}
+
+vm_fixup() {
+    vm_fixup_$VM_TYPE "$@"
+}
+
+vm_startup() {
+    vm_startup_$VM_TYPE "$@"
+}
+
+vm_kill() {
+    vm_kill_$VM_TYPE "$@"
+}
+
+vm_cleanup() {
+    kill_watchdog
+    vm_cleanup_$VM_TYPE "$@"
+}
+
+vm_parse_options() {
+    case ${PARAM/#--/-} in
+      -emulator-script)
+       needarg
+       EMULATOR_SCRIPT="$ARG"
+       shift
+      ;;
+      -xen|-kvm|-uml|-qemu|-emulator)
+       VM_TYPE=${PARAM##*-}
+       test -z "$VM_IMAGE" && VM_IMAGE=1
+       if test -n "$ARG" ; then
+           VM_IMAGE="$ARG"
+           shift
+       fi
+      ;;
+      -zvm|-lxc)
+        VM_TYPE=${PARAM##*-}
+       shift
+      ;;
+      -vm-type)
+       needarg
+       VM_TYPE="$ARG"
+       case "$VM_TYPE" in
+           lxc) ;;
+           ec2|xen|kvm|uml|qemu|emulator|openstack|zvm)
+               test -z "$VM_IMAGE" && VM_IMAGE=1
+           ;;
+           none|chroot) VM_TYPE= ;;
+           *)
+               echo "VM '$VM_TYPE' is not supported"
+               cleanup_and_exit
+           ;;
+       esac
+       shift
+      ;;
+      -vm-worker)
+        needarg
+        VM_WORKER="$ARG"
+        shift
+      ;;
+      -vm-worker-nr|-vm-worker-no)
+        needarg
+        VM_WORKER_NR="$ARG"
+        shift
+      ;;
+      -vm-server|-vm-region)
+       needarg
+       VM_SERVER="$ARG"
+       shift
+      ;;
+      -vm-volumes)
+       needarg
+       VM_VOLUME_NAME="$ARG"
+       shift
+        ARG="$1"
+        test "$ARG" = "${ARG#-}" || ARG=
+       needarg
+       VM_VOLUME_SWAP="$ARG"
+       shift
+      ;;
+      -vm-disk)
+       needarg
+       VM_IMAGE="$ARG"
+       shift
+      ;;
+      -xenswap|-vm-swap|-swap)
+       needarg
+       VM_SWAP="$ARG"
+       shift
+      ;;
+      -xenmemory|-vm-memory|-memory)
+       needarg
+       VM_MEMSIZE="$ARG"
+       shift
+      ;;
+      -vm-kernel)
+       needarg
+       VM_KERNEL="$ARG"
+       shift
+      ;;
+      -vm-initrd)
+       needarg
+       VM_INITRD="$ARG"
+       shift
+      ;;
+      -vmdisk-rootsize|-vm-disk-size)
+       needarg
+       VMDISK_ROOTSIZE="$ARG"
+       shift
+      ;;
+      -vmdisk-swapsize|-vm-swap-size)
+       needarg
+       VMDISK_SWAPSIZE="$ARG"
+       shift
+      ;;
+      -vmdisk-filesystem|-vm-disk-filesystem)
+       needarg
+       VMDISK_FILESYSTEM="$ARG"
+       shift
+      ;;
+      -vmdisk-mount-options|-vm-disk-mount-options)
+       needarg
+       # options needs to be quoted to handle argument which might start with "-o ..."
+       VMDISK_MOUNT_OPTIONS=$(echo $ARG | sed 's/^\"\(.*\)\"$/\1/g')
+       shift
+      ;;
+      -vmdisk-clean)
+       # delete old root/swap to get rid of the old blocks
+        VMDISK_CLEAN=true
+      ;;
+      -rpmlist)
+       needarg
+       RPMLIST="--rpmlist $ARG"
+       BUILD_RPMS=
+       shift
+      ;;
+      -hugetlbfs)
+       needarg
+       HUGETLBFSPATH="$ARG"
+       shift
+      ;;
+      -vm-watchdog)
+       VM_WATCHDOG=true
+      ;;
+      -*)
+       return 1
+      ;;
+    esac
+    nextargs=("$@")
+    return 0
+}
+
+
+#
+# shutdown the system from inside the VM
+#
+vm_shutdown() {
+    test -n "$VM_WATCHDOG" && echo "### WATCHDOG MARKER START ###"
+    cd /
+    test -n "$1" || set 1
+    if test -n "$VM_SWAP" -a -e "$VM_SWAP" ; then
+       swapoff "$VM_SWAP" 2>/dev/null
+       echo -n "BUILDSTATUS$1" >"$VM_SWAP"
+    fi
+    exec >&0 2>&0      # so that the logging tee finishes
+    sleep 1            # wait till tee terminates
+    test "$VM_TYPE" = lxc && exit $1
+    kill -9 -1        # goodbye cruel world
+    if ! test -x /sbin/halt ; then
+       test -e /proc/sysrq-trigger || mount -n -tproc none /proc
+       sync
+       sleep 2 # like halt does
+       if test -e /proc/sysrq-trigger; then
+           echo o > /proc/sysrq-trigger
+           sleep 5 # wait for sysrq to take effect
+       else
+           echo "Warning: VM doesn't support sysrq and /sbin/halt not installed"
+       fi
+    else
+       sync    # halt from systemd is not syncing anymore.
+       halt -f -p
+    fi
+    echo "Warning: clean shut down of the VM didn't work"
+    exit $1    # init died...
+}
+
+vm_img_create() {
+    local img="$1"
+    local size="$2"
+
+    echo "Creating $img (${size}M)"
+    mkdir -p "${img%/*}" || cleanup_and_exit 3
+
+    # prefer fallocate, which avoids fragmentation
+    r=1
+    if type -p fallocate > /dev/null ; then
+        fallocate -l "${size}M" "$img"
+        r=$?
+    fi
+    # fall back to dd method if fallocate is not supported
+    if test "$r" -gt 0 ; then
+        dd if=/dev/zero of="$img" bs=1M count=0 seek="$size" || cleanup_and_exit 3
+    fi
+}
+
+vm_img_mkfs() {
+    local fs="$1"
+    local img="$2"
+    local mkfs tunefs
+    eval "mkfs=\"\$vm_img_mkfs_${fs}\""
+    eval "mkfs_exta_options=\"\$vm_img_mkfs_${fs}_extra\""
+    eval "tunefs=\"\$vm_img_tunefs_${fs}\""
+
+    if test -z "$mkfs"; then
+       echo "filesystem \"$fs\" is not supported"
+       cleanup_and_exit 3
+    fi
+
+    echo "Creating $fs filesystem on $img"
+    if ! $mkfs $mkfs_exta_options "$img"; then
+        if test -z "$mkfs_exta_options"; then
+            cleanup_and_exit 3
+        else
+            echo "Format call failed, trying again without extra options..."
+            $mkfs "$img" || cleanup_and_exit 3
+        fi
+    fi
+    if test -n "$tunefs" ; then
+       $tunefs "$img" || cleanup_and_exit 3
+    fi
+}
+
+background_monitor_process() {
+    max_disk=0
+    max_mem=0
+    while sleep 5; do
+       test -e /.build/_statistics.exit  && exit 0
+
+       # memory usage
+       if test -e /proc/meminfo ; then
+           memtotal=0
+           while read key value unit; do
+               case $key in
+                   MemTotal:|SwapTotal:) memtotal=$(( $memtotal + $value )) ;;
+                   MemFree:|SwapFree:|SwapCached:|Cached:|Buffers:) memtotal=$(( $memtotal - $value )) ;;
+               esac
+           done < /proc/meminfo
+           if test ${memtotal} -gt $max_mem ; then
+               max_mem="${memtotal}"
+               echo -n $(( $max_mem / 1024 )) > /.build/_statistics.memory.new && mv /.build/_statistics.memory.new /.build/_statistics.memory
+           fi
+       fi
+
+       # disk storage usage
+       if type -p df >& /dev/null; then
+           c=(`df -m / 2>/dev/null | tail -n 1`)
+
+           if test ${c[2]} -gt $max_disk ; then
+               max_disk="${c[2]}"
+               echo -n $max_disk > /.build/_statistics.df.new && mv /.build/_statistics.df.new /.build/_statistics.df
+           fi
+       fi
+    done
+}
+
+background_watchdog() {
+    WATCHDOG_START=
+    WATCHDOG_TIMEOUT=300
+    while sleep 5 ; do
+       WATCH=`grep "### WATCHDOG MARKER" "$LOGFILE" | tail -n 1`
+       case $WATCH in
+           *WATCHDOG\ MARKER\ START*) test -n "$WATCHDOG_START" || WATCHDOG_START=`date +%s` ;;
+           *WATCHDOG\ MARKER\ END*) WATCHDOG_START= ;;
+       esac
+       if test -n "$WATCHDOG_START" ; then
+           NOW=`date +%s`
+           ELAPSED=$((NOW-WATCHDOG_START))
+           if test $ELAPSED -gt $WATCHDOG_TIMEOUT ; then
+               # kill the VM
+                echo "### WATCHDOG TRIGGERED, KILLING VM ###"
+           fuser -k -TERM "$VM_IMAGE"
+           exit 0
+       fi
+    fi
+    done
+}
+
+start_watchdog() {
+    local wf=$(mktemp)
+    ( background_watchdog & echo $! > "$wf" )
+    read VM_WATCHDOG_PID < "$wf"
+    rm -f "$wf"
+}
+
+kill_watchdog() {
+    test -n "$VM_WATCHDOG_PID" && kill "$VM_WATCHDOG_PID"
+    VM_WATCHDOG_PID=
+}
+
+vm_set_personality_syscall() {
+    local archname
+    archname=`perl -V:archname 2>/dev/null`
+    archname="${archname#archname=?}"
+    case "$archname" in
+       x86_64*) PERSONALITY_SYSCALL=135 ;;
+       alpha*) PERSONALITY_SYSCALL=324 ;;
+       sparc*) PERSONALITY_SYSCALL=191 ;;
+       ia64*) PERSONALITY_SYSCALL=1140 ;;
+       i?86*|ppc*|aarch64*|arm*|sh4|cris|m68k*|s390*|unicore32|microblaze)   PERSONALITY_SYSCALL=136 ;;
+       *) echo "Unknown architecture personality: '$archname'"; cleanup_and_exit 1 ;;
+    esac
+}
+
+# used before calling kvm or xen
+linux64() {
+    perl -e 'syscall('$PERSONALITY_SYSCALL', 0); exec(@ARGV) || die("$ARGV[0]: $!\n")' "$@"
+}
+
+vm_detect_2nd_stage() {
+    if test ! -e /.build/build.data -o -n "$BUILD_IGNORE_2ND_STAGE" ; then
+       return 1
+    fi
+    . /.build/build.data
+    if test -z "$VM_TYPE" ; then
+       return 1
+    fi
+    if test $$ -eq 1 || test $$ -eq 2 ; then
+       # ignore special init signals if we're init
+       # we're using ' ' instead of '' so that the signal handlers
+       # are reset in the child processes
+       trap ' ' HUP TERM
+       $0 "$@"
+       cleanup_and_exit $?
+    fi
+
+    test -n "$VM_WATCHDOG" -a -z "$PERSONALITY_SET" && echo "### WATCHDOG MARKER END ###"
+    echo "2nd stage started in virtual machine"
+    BUILD_ROOT=/
+    BUILD_DIR=/.build
+    echo "machine type: `uname -m`"
+    if test "$PERSONALITY" != 0 -a -z "$PERSONALITY_SET" ; then
+       export PERSONALITY_SET=true
+       echo "switching personality to $PERSONALITY..."
+       # this is 32bit perl/glibc, thus the 32bit syscall number
+       exec perl -e 'syscall(136, '$PERSONALITY') == -1 && warn("personality: $!\n");exec "/.build/build" || die("/.build/build: $!\n")'
+    fi
+    RUNNING_IN_VM=true
+    test -e /proc/version || mount -orw -n -tproc none /proc
+    if test "$VM_TYPE" != lxc ; then
+       mount -n ${VMDISK_MOUNT_OPTIONS},remount,rw /
+    fi
+    umount /run >/dev/null 2>&1
+    # mount /sys
+    if ! test -e /sys/block; then
+       mkdir -p /sys
+       mount -orw -n -tsysfs sysfs /sys
+    fi
+# qemu inside of xen does not work, check again with kvm later before enabling this
+#    if test -e /dev/kqemu ; then
+#        # allow abuild user to run qemu
+#        chmod 0666 /dev/kqemu
+#    fi
+
+    if test -n "$VM_SWAP" ; then
+       for i in 1 2 3 4 5 6 7 8 9 10 ; do
+           test -e "$VM_SWAP" && break
+           test $i = 1 && echo "waiting for $VM_SWAP to appear"
+           echo -n .
+           sleep 1
+       done
+       test $i = 1 || echo
+       # recreate the swap device manually if it didn't exist for some
+       # reason, hardcoded to hda2 atm
+       if ! test -b "$VM_SWAP" ; then
+           rm -f "$VM_SWAP"
+           umask 027
+           mknod "$VM_SWAP" b 3 2
+           umask 022
+       fi
+       # Do not rely on external system writing the signature, it might differ...
+       mkswap "$VM_SWAP"
+       swapon -v "$VM_SWAP" || exit 1
+    fi
+    HOST="$MYHOSTNAME"
+
+    # fork a process monitoring max filesystem usage during build
+    if test "$DO_STATISTICS" = 1 ; then
+       rm -f /.build/_statistics.exit
+        ( background_monitor_process & )
+    fi
+
+    if test ! -e /dev/.udev ; then
+        echo "WARNING: udev not running, creating extra device nodes"
+        test -e /dev/fd || ln -sf /proc/self/fd /dev/fd
+        test -e /etc/mtab || ln -sf /proc/mounts /etc/mtab
+    fi
+
+    # set date to build start on broken systems (now < build start)
+    if test $(date '+%s') -lt $(date -r /.build/.date '+%s') ; then
+        echo -n "WARNING: system has a broken clock, setting it to a newer time: "
+        date -s `cat /.build/.date`
+    fi
+
+    return 0
+}
+
+vm_set_mount_options() {
+    if test "$VMDISK_MOUNT_OPTIONS" = __default; then
+       if test "$VMDISK_FILESYSTEM" = reiserfs ; then
+           VMDISK_MOUNT_OPTIONS='-o data=writeback,commit=150,noatime'
+       elif test "$VMDISK_FILESYSTEM" = btrfs ; then
+           VMDISK_MOUNT_OPTIONS='-o nobarrier,noatime'
+       elif test "$VMDISK_FILESYSTEM" = "ext4" ; then
+           VMDISK_MOUNT_OPTIONS='-o noatime'
+       elif test "$VMDISK_FILESYSTEM" = "ext3" ; then
+           VMDISK_MOUNT_OPTIONS='-o data=writeback,nobarrier,commit=150,noatime'
+       elif test "$VMDISK_FILESYSTEM" = "ext2" ; then
+           VMDISK_MOUNT_OPTIONS='-o noacl,noatime'
+       elif test "$VMDISK_FILESYSTEM" = "xfs" ; then
+           VMDISK_MOUNT_OPTIONS='-o noatime'
+       else
+           VMDISK_MOUNT_OPTIONS='-o noatime'
+       fi
+    fi
+}
+
+#
+# create file system and swap space, mount file system to $BUILD_ROOT
+#
+vm_setup() {
+    vm_set_mount_options
+    if test "$VM_IMAGE" = 1 ; then
+       VM_IMAGE="$BUILD_ROOT.img"
+       if test -z "$VM_SWAP" -a "$VM_TYPE" != emulator; then
+           VM_SWAP="$BUILD_ROOT.swap"
+       fi
+       echo "VM_IMAGE: $VM_IMAGE, VM_SWAP: $VM_SWAP"
+    else
+       echo "VM_IMAGE: $VM_IMAGE, VM_SWAP: $VM_SWAP"
+        vm_attach_root
+    fi
+    # this should not be needed, but sometimes a xen instance got lost
+    test "$VM_TYPE" = xen && vm_purge_xen
+    if test -n "$VMDISK_CLEAN" ; then
+       # delete old root/swap to get rid of the old blocks
+       if test -n "$VM_IMAGE" -a -f "$VM_IMAGE" ; then
+           echo "Deleting old $VM_IMAGE"
+           rm -rf "$VM_IMAGE"
+       fi
+       if test -n "$VM_SWAP" -a -f "$VM_SWAP" ; then
+           echo "Deleting old $VM_SWAP"
+           rm -rf "$VM_SWAP"
+       fi
+    fi
+    if test ! -e "$VM_IMAGE" ; then
+       vm_img_create "$VM_IMAGE" "$VMDISK_ROOTSIZE"
+       if test -z "$CLEAN_BUILD" ; then
+           vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_IMAGE"
+       fi
+    fi
+    if test -n "$VM_SWAP" -a ! -e "$VM_SWAP" -a ! -b "$VM_SWAP" ; then
+       vm_img_create "$VM_SWAP" "$VMDISK_SWAPSIZE"
+    fi
+    if test ! -e "$VM_IMAGE" ; then
+       echo "you need to create $VM_IMAGE first"
+       cleanup_and_exit 3
+    fi
+    if test -n "$CLEAN_BUILD" ; then
+       vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_IMAGE" || cleanup_and_exit 3
+    fi
+    # now mount root/swap
+    mkdir_build_root
+    if test -w /root ; then
+       if test -b $VM_IMAGE ; then
+           # mount device directly
+           mount $VMDISK_MOUNT_OPTIONS $VM_IMAGE $BUILD_ROOT || cleanup_and_exit 3
+       else
+           mount ${VMDISK_MOUNT_OPTIONS},loop $VM_IMAGE $BUILD_ROOT || cleanup_and_exit 3
+       fi
+    else
+       if ! mount $BUILD_ROOT; then
+           echo "mounting the build root failed. An fstab entry is probably missing or incorrect."
+           echo "/etc/fstab should contain an entry like this:"
+           echo "$VM_IMAGE $BUILD_ROOT auto noauto,user,loop 0 0"
+           cleanup_and_exit 3
+       fi
+    fi
+    if test -n "$VM_SWAP" ; then
+       vm_attach_swap
+       dd if=/dev/zero of="$VM_SWAP" bs=1024 count=1 conv=notrunc 2>/dev/null
+       vm_detach_swap
+        # mkswap happens inside of the vm
+    fi
+}
+
+#
+# prepare for vm startup
+#
+vm_first_stage() {
+    vm_set_personality_syscall
+    rm -rf "$BUILD_ROOT/.build"
+    mkdir -p "$BUILD_ROOT/.build"
+    TIME_PREINSTALL=
+    if test "$DO_INIT" = true ; then
+       # do first stage of init_buildsystem
+       rm -f $BUILD_ROOT/.build.success
+       set -- init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" --prepare "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USEUSEDFORBUILD $RPMLIST "$MYSRCDIR/$RECIPEFILE" $ADDITIONAL_PACKS
+       echo "$* ..."
+       start_time=`date +%s`
+       "$@" || cleanup_and_exit 1
+       check_exit
+       TIME_PREINSTALL=$(( `date +%s` - $start_time ))
+       unset start_time
+       if test ! -w /root ; then
+           # remove setuid bit if files belong to user to make e.g. mount work
+           find $BUILD_ROOT/{bin,sbin,usr/bin,usr/sbin} -type f -uid $UID -perm +4000 -print0 | xargs -0 --no-run-if-empty chmod -s
+       fi
+       copy_oldpackages
+    fi
+
+    # start up VM, rerun ourself
+    cp -a $BUILD_DIR/. $BUILD_ROOT/.build
+    if ! test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then
+       rm -rf "$BUILD_ROOT/.build-srcdir"
+       mkdir "$BUILD_ROOT/.build-srcdir"
+       if test "$BUILDTYPE" = kiwi ; then
+           cp -pRL "$MYSRCDIR"/* $BUILD_ROOT/.build-srcdir
+       else
+           cp -p "$MYSRCDIR"/* $BUILD_ROOT/.build-srcdir
+       fi
+       MYSRCDIR=$BUILD_ROOT/.build-srcdir
+    else
+       # cwd is at $BUILD_ROOT/.build-srcdir which we want to
+       # umount later so step aside
+       cd "$SRCDIR"
+    fi
+
+    # do vm specific fixups
+    vm_fixup
+
+    # the watchdog needs a log file
+    test -n "$LOGFILE" || VM_WATCHDOG=
+    # put our config into .build/build.data
+    Q="'\''"
+    echo "RECIPEFILE='${RECIPEFILE//"'"/$Q}'" > $BUILD_ROOT/.build/build.data
+    echo "BUILD_JOBS='${BUILD_JOBS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "BUILD_ARCH='${BUILD_ARCH//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "BUILD_RPMS='${BUILD_RPMS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    case $BUILD_DIST in
+       */*)
+           cp $BUILD_DIST $BUILD_ROOT/.build/build.dist
+           BUILD_DIST=/.build/build.dist
+           ;;
+    esac
+    echo "BUILD_DIST='${BUILD_DIST//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "RELEASE='${RELEASE//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "BUILD_DEBUG='${BUILD_DEBUG//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "SIGNDUMMY='${SIGNDUMMY//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "DO_LINT='${DO_LINT//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "DO_CHECKS='${DO_CHECKS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "NOROOTFORBUILD='${NOROOTFORBUILD//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "CREATE_BASELIBS='$CREATE_BASELIBS'" >> $BUILD_ROOT/.build/build.data
+    echo "REASON='${REASON//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "CHANGELOG='${CHANGELOG//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "INCARNATION='${INCARNATION//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "DISTURL='${DISTURL//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "DO_INIT='${DO_INIT//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    echo "KIWI_PARAMETERS='${KIWI_PARAMETERS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    test -n "$VM_SWAP" && echo "VM_SWAP='${VM_SWAPDEV//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    test -n "$VMDISK_MOUNT_OPTIONS" && echo "VMDISK_MOUNT_OPTIONS='${VMDISK_MOUNT_OPTIONS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+    PERSONALITY=0
+    test -n "$PERSONALITY_SYSCALL" && PERSONALITY=`perl -e 'print syscall('$PERSONALITY_SYSCALL', 0)."\n"'`
+    test "$PERSONALITY" = -1 && PERSONALITY=0  # syscall failed?
+    case $(uname -m) in
+       ppc|ppcle|s390) PERSONALITY=8 ;;        # ppc/s390 kernel never tells us if a 32bit personality is active, assume we run on 64bit
+       aarch64) test "$BUILD_ARCH" != "${BUILD_ARCH#armv}" && PERSONALITY=8 ;; # workaround, to be removed
+    esac
+    test "$VM_TYPE" = lxc && PERSONALITY=0
+    echo "PERSONALITY='$PERSONALITY'" >> $BUILD_ROOT/.build/build.data
+    echo "MYHOSTNAME='`hostname`'" >> $BUILD_ROOT/.build/build.data
+    echo -n "definesnstuff=(" >> $BUILD_ROOT/.build/build.data
+    shellquote "${definesnstuff[@]}" >> $BUILD_ROOT/.build/build.data
+    echo ")" >> $BUILD_ROOT/.build/build.data
+    echo -n "repos=(" >> $BUILD_ROOT/.build/build.data
+    shellquote "${repos[@]}" >> $BUILD_ROOT/.build/build.data
+    echo ")" >> $BUILD_ROOT/.build/build.data
+    echo "VM_TYPE='$VM_TYPE'" >> $BUILD_ROOT/.build/build.data
+    echo "RUN_SHELL='$RUN_SHELL'" >> $BUILD_ROOT/.build/build.data
+    echo "DO_STATISTICS='$DO_STATISTICS'" >> $BUILD_ROOT/.build/build.data
+    echo "TIME_PREINSTALL='$TIME_PREINSTALL'" >> $BUILD_ROOT/.build/build.data
+    echo "VM_WATCHDOG='$VM_WATCHDOG'" >> $BUILD_ROOT/.build/build.data
+    echo "BUILDENGINE='$BUILDENGINE'" >> $BUILD_ROOT/.build/build.data
+    echo "CCACHE='$CCACHE'" >> $BUILD_ROOT/.build/build.data
+    echo "ABUILD_TARGET='$ABUILD_TARGET'" >> $BUILD_ROOT/.build/build.data
+    # fallback time for broken hosts
+    date '+@%s' > $BUILD_ROOT/.build/.date
+    # we're done with the root file system, unmount
+    umount -n $BUILD_ROOT/proc/sys/fs/binfmt_misc 2> /dev/null || true
+    umount -n $BUILD_ROOT/proc 2> /dev/null || true
+    umount -n $BUILD_ROOT/dev/pts 2> /dev/null || true
+    umount -n $BUILD_ROOT/dev/shm 2> /dev/null || true
+    umount -n $BUILD_ROOT/mnt 2> /dev/null || true
+
+    vm_init_script="/.build/build"
+    if check_use_emulator ; then
+       vm_init_script="/.build/$INITVM_NAME"
+    fi
+    if test -n "$VM_IMAGE" ; then
+       # copy out kernel & initrd (if they exist) during unmounting VM image
+       KERNEL_TEMP_DIR=
+       if test -z "$VM_KERNEL" -a -e "$BUILD_ROOT/.build.kernel.$VM_TYPE" ; then
+           KERNEL_TEMP_DIR=`mktemp -d`
+           cp "$BUILD_ROOT/.build.kernel.$VM_TYPE" "$KERNEL_TEMP_DIR/kernel"
+           if test -e  "$BUILD_ROOT/.build.initrd.$VM_TYPE" ; then
+               cp "$BUILD_ROOT/.build.initrd.$VM_TYPE" "$KERNEL_TEMP_DIR/initrd"
+           fi
+       fi
+       check_exit
+       # needs to work otherwise we have a corrupted file system
+       if ! umount $BUILD_ROOT; then
+           rm -rf "$KERNEL_TEMP_DIR"
+           cleanup_and_exit 3
+       fi
+       # copy back the kernel and set it for VM
+       if test -n "$KERNEL_TEMP_DIR" ; then
+           mkdir -p "$BUILD_ROOT/boot"
+           mv "$KERNEL_TEMP_DIR/kernel" "$BUILD_ROOT/boot/kernel"
+           vm_kernel="$BUILD_ROOT/boot/kernel"
+           if test -e "$KERNEL_TEMP_DIR/initrd" ; then
+               mv "$KERNEL_TEMP_DIR/initrd" "$BUILD_ROOT/boot/initrd"
+               test -z "$VM_INITRD" && vm_initrd="$BUILD_ROOT/boot/initrd"
+           fi
+           rmdir "$KERNEL_TEMP_DIR"
+       fi
+    fi
+    vm_detach_root
+
+    # start watchdog if requested
+    if test -n "$VM_WATCHDOG" ; then
+       start_watchdog
+       echo "### WATCHDOG MARKER START ###"
+    fi
+
+    echo "booting $VM_TYPE..."
+    vm_startup
+
+    # kill watchdog again
+    if test -n "$VM_WATCHDOG" ; then
+       echo "### WATCHDOG MARKER END ###"
+       kill_watchdog
+    fi
+
+    vm_attach_root
+    if test -n "$VM_SWAP" ; then
+       vm_attach_swap
+       BUILDSTATUS=`dd if="$VM_SWAP" bs=12 count=1 2>/dev/null`
+       case $BUILDSTATUS in
+         BUILDSTATUS[02])
+           mkdir -p $BUILD_ROOT/.build.packages
+           cd $BUILD_ROOT/.build.packages || cleanup_and_exit 1
+           echo "build: extracting built packages..."
+           extractbuild --disk "$VM_IMAGE" --input "$VM_SWAP" --skip 512 -v || cleanup_and_exit 3
+           if test "$DO_STATISTICS" = 1 ; then
+               mkdir -p OTHER
+               TIME_TOTAL=$(( `date +%s` - $TIME_START_TIME ))
+               echo "TIME_total: $TIME_TOTAL"  >> OTHER/_statistics
+           fi
+           cleanup_and_exit ${BUILDSTATUS#BUILDSTATUS}
+           ;;
+         BUILDSTATUS*)
+           cleanup_and_exit ${BUILDSTATUS#BUILDSTATUS}
+           ;;
+         *)
+           echo "No buildstatus set, either the base system is broken (kernel/initrd/udev/glibc/bash/perl)"
+           echo "or the build host has a kernel or hardware problem..."
+           cleanup_and_exit 3
+           ;;
+       esac
+       cleanup_and_exit 1
+    fi
+}
+
+vm_save_statistics() {
+    echo "... saving statistics"
+    local sys_mounted otherdir
+    otherdir="$BUILD_ROOT$TOPDIR/OTHER"
+    test -n "$TIME_PREINSTALL" && echo "TIME_preinstall: $TIME_PREINSTALL"  >> $otherdir/_statistics
+    test -n "$TIME_INSTALL" && echo "TIME_install: $TIME_INSTALL"  >> $otherdir/_statistics
+    if test -e /.build/_statistics.df ; then
+       echo -n "MAX_mb_used_on_disk: " >> $otherdir/_statistics
+       cat /.build/_statistics.df >> $otherdir/_statistics
+       echo "" >> $otherdir/_statistics
+       rm /.build/_statistics.df
+    fi
+    if test -e /.build/_statistics.memory ; then
+       echo -n "MAX_mb_used_memory: " >> $otherdir/_statistics
+       cat /.build/_statistics.memory >> $otherdir/_statistics
+       echo "" >> $otherdir/_statistics
+       rm /.build/_statistics.memory
+    fi
+    if ! test -e /sys/block; then
+       mkdir -p /sys
+       mount -n sys /sys -t sysfs
+       sys_mounted=1
+    fi
+    device="hda1"
+    test -e /dev/sda && device="sda"
+    test -e /dev/vda && device="vda"
+    test -e /dev/dasda && device="dasda" # in z/VM
+    test -e /dev/nfhd0 && device="nfhd0" # in aranym
+    if test -e /sys/block/${device}/stat ; then
+       disk=(`cat /sys/block/${device}/stat`)
+       test "0${disk[0]}" -gt 0 && echo "IO_requests_read: ${disk[0]}"  >> $otherdir/_statistics
+       test "0${disk[2]}" -gt 0 && echo "IO_sectors_read: ${disk[2]}"   >> $otherdir/_statistics
+       test "0${disk[4]}" -gt 0 && echo "IO_requests_write: ${disk[4]}" >> $otherdir/_statistics
+       test "0${disk[6]}" -gt 0 && echo "IO_sectors_write: ${disk[6]}"  >> $otherdir/_statistics
+    else
+       echo "ERROR: no root disk device found, yet another new device name?"
+       ls -l /sys/block/
+    fi
+    test -n "$sys_mounted" && umount /sys
+}
+
+# args: resultdirs
+vm_wrapup_build() {
+    test "$DO_STATISTICS" = 1 && vm_save_statistics
+    if test -n "$VM_SWAP"; then
+        echo "... saving built packages"
+        swapoff "$VM_SWAP"
+       pushd "$BUILD_ROOT$TOPDIR" >/dev/null
+       find "$@" -print0 | computeblocklists --padstart 512 --padend 512 -v --manifest - -0 > "$VM_SWAP"
+       popd >/dev/null
+    fi
+}
diff --git a/build-vm-ec2 b/build-vm-ec2
new file mode 100644 (file)
index 0000000..7bb8070
--- /dev/null
@@ -0,0 +1,211 @@
+#
+# EC2 specific functions
+#
+# (C) 2014 SUSE, Inc
+#
+
+BUILD_EC2_TYPE="t1.micro"
+
+cloud_volume_attach_ec2() {
+    local VM_SERVER="$1"
+    local VM_VOL_NAME="$2"
+    local VM_VOL_DEV="$3"
+
+    temp_file=`mktemp`
+    if ! ec2-attach-volume "$VM_VOL_NAME" -d /dev/sdz -i `ec2-instance-id` --region "$BUILD_EC2_REGION" > "$temp_file"; then
+        rm -f "$temp_file"
+        cleanup_and_exit 1
+    fi
+    # wait that it becomes available
+    while true; do
+        state=`ec2_volume_state "$VM_VOL_NAME"`
+        test "$state" = attached && break
+        sleep 1
+    done
+    # print device node
+    grep ^ATTACHMENT "$temp_file" | awk '{ print $4 }'
+    rm -f "$temp_file"
+}
+
+cloud_volume_detach_ec2() {
+    local VM_SERVER="$1"
+    local VM_VOL_NAME="$2"
+    state=`ec2_volume_state "$VM_VOL_NAME"`
+    if test "$state" != available ; then
+        ec2-detach-volume "$VM_VOL_NAME" --region "$BUILD_EC2_REGION" || return 3
+    fi
+    return 0
+}
+
+vm_verify_options_ec2() {
+    # verify settings
+    if test -z "$AWS_ACCESS_KEY" -o -z "$AWS_ACCESS_KEY" ; then
+        echo "ERROR: No amazon EC2 environment set. Set AWS_ACCESS_KEY and AWS_SECRET_KEY."
+        cleanup_and_exit 3
+    fi
+    . /etc/profile.d/ec2.sh
+    EC2_INSTANCE_ID=`ec2-instance-id`
+    BUILD_EC2_AKI=
+    BUILD_EC2_ZONE=`ec2-meta-data placement/availability-zone`
+    BUILD_EC2_REGION=${BUILD_EC2_ZONE%?}
+    case "$BUILD_EC2_ZONE" in
+        us-east-1)      BUILD_EC2_AKI=aki-88aa75e1 ;;
+        us-west-1)      BUILD_EC2_AKI=aki-f77e26b2 ;;
+        us-west-2)      BUILD_EC2_AKI=aki-fc37bacc ;;
+        eu-west-1)      BUILD_EC2_AKI=aki-71665e05 ;;
+        ap-southeast-1) BUILD_EC2_AKI=aki-fe1354ac ;;
+        ap-southeast-2) BUILD_EC2_AKI=aki-3f990e05 ;;
+        ap-northeast-1) BUILD_EC2_AKI=aki-44992845 ;;
+        sa-east-1)      BUILD_EC2_AKI=aki-c48f51d9 ;;
+        us-gov-west-1)  BUILD_EC2_AKI=aki-79a4c05a ;;
+    esac
+    if test -z "$BUILD_EC2_AKI" ; then
+        echo "Unknown Amazon EC2 Zone: $BUILD_EC2_ZONE"
+       cleanup_and_exit 1
+    fi
+    if test -z "$BUILD_EC2_AKI" ; then
+        echo "ERROR: No image refering to kernel and ramdisk is defined in BUILD_EC2_AKI env."
+        cleanup_and_exit 3
+    fi
+    if test -z "$VM_VOLUME_NAME" ; then
+        echo "ERROR: No worker root VM volume name specified."
+        cleanup_and_exit 3
+    fi
+    if test -z "$VM_VOLUME_SWAP" ; then
+        echo "ERROR: No worker swap VM volume name specified."
+        cleanup_and_exit 3
+    fi
+
+    VM_SWAPDEV=/dev/sdb1       # in the vm
+}
+
+vm_attach_root_ec2() {
+    VM_IMAGE=`cloud_volume_attach_ec2 "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"`
+    test "${VM_IMAGE:0:5}" = /dev/ || cleanup_and_exit 3
+}
+
+vm_attach_swap_ec2() {
+    VM_SWAP=`cloud_volume_attach_ec2 "$VM_SERVER" "$EC2_EXTRACT_VOLUME_swap" "$VM_SWAP"`
+    test "${VM_SWAP:0:5}" = /dev/ || cleanup_and_exit 3
+}
+
+vm_detach_root_ec2() {
+    cloud_volume_detach_ec2 "$VM_SERVER" "$VM_VOLUME_NAME"
+}
+
+vm_detach_swap_ec2() {
+    cloud_volume_detach_ec2 "$VM_SERVER" "$VM_VOLUME_SWAP"
+}
+
+vm_fixup_ec2() {
+    # No way to handle this via init= parameter here....
+    echo "#!/bin/sh"               >  "$BUILD_ROOT/sbin/init"
+    echo 'exec /.build/build "$@"' >> "$BUILD_ROOT/sbin/init"
+    chmod 0755 "$BUILD_ROOT/sbin/init"
+    # use the instance kernel, if no kernel got installed via preinstall
+    if ! test -e "$BUILD_ROOT/boot/vmlinuz"; then
+       cp /boot/vmlinuz-ec2 "$BUILD_ROOT/boot/vmlinuz"
+       cp /boot/initrd-ec2 "$BUILD_ROOT/boot/initrd"
+    fi
+    # install menu.lst for pv grub
+    if ! test -e "$BUILD_ROOT/boot/grub/menu.lst"; then
+       mkdir -p "$BUILD_ROOT/boot/grub"
+       echo "serial --unit=0 --speed=9600"                                                   >  "$BUILD_ROOT/boot/grub/menu.lst"
+       echo "terminal --dumb serial"                                                         >> "$BUILD_ROOT/boot/grub/menu.lst"
+       echo "default 0"                                                                      >> "$BUILD_ROOT/boot/grub/menu.lst"
+       echo "timeout 0"                                                                      >> "$BUILD_ROOT/boot/grub/menu.lst"
+       echo "hiddenmenu"                                                                     >> "$BUILD_ROOT/boot/grub/menu.lst"
+       echo ""                                                                               >> "$BUILD_ROOT/boot/grub/menu.lst"
+       echo "title default"                                                                  >> "$BUILD_ROOT/boot/grub/menu.lst"
+       echo "   root (hd0)"                                                                  >> "$BUILD_ROOT/boot/grub/menu.lst"
+       echo "   kernel /boot/vmlinuz root=/dev/sda1 xencons=xvc0 console=xvc0 splash=silent" >> "$BUILD_ROOT/boot/grub/menu.lst"
+       echo "   initrd /boot/initrd"                                                         >> "$BUILD_ROOT/boot/grub/menu.lst"
+    fi
+}
+
+vm_cleanup_ec2() {
+    cloud_volume_detach_ec2 "$VM_SERVER" "$VM_VOLUME_NAME"
+    cloud_volume_detach_ec2 "$VM_SERVER" "$VM_VOLUME_SWAP"
+    test -n "$EC2_EXTRACT_VOLUME_root" && cloud_volume_detach_ec2 "$VM_SERVER" "$EC2_EXTRACT_VOLUME_root"
+    test -n "$EC2_EXTRACT_VOLUME_swap" && cloud_volume_detach_ec2 "$VM_SERVER" "$EC2_EXTRACT_VOLUME_swap"
+    test -n "$EC2_SNAP_root" && ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root"
+    test -n "$EC2_SNAP_swap" && ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap"
+    test -n "$EC2_EXTRACT_VOLUME_root" && ec2-delete-volume --region "$BUILD_EC2_REGION" "$EC2_EXTRACT_VOLUME_root"
+    test -n "$EC2_EXTRACT_VOLUME_swap" && ec2-delete-volume --region "$BUILD_EC2_REGION" "$EC2_EXTRACT_VOLUME_swap"
+}
+
+vm_kill_ec2() {
+    if ec2-describe-instance-status "$VM_BUILD_INSTANCE" --region "$BUILD_EC2_REGION" >/dev/null 2>&1 ; then
+       if ec2-terminate-instances "$VM_BUILD_INSTANCE" >/dev/null 2>&1 ; then
+           echo "could not kill EC2 instance $VM_BUILD_INSTANCE"
+           cleanup_and_exit 1
+       fi
+    fi
+}
+
+vm_startup_ec2() {
+    EC2_SNAP_root=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$VM_VOLUME_NAME" | awk '{ print $2 }'`
+    if test "$EC2_SNAP_root" = "${EC2_SNAP_root#snap-}" ; then
+       echo "ERROR: Failed to create snapshot for root disk $VM_VOLUME_NAME"
+       cleanup_and_exit 3
+    fi
+    EC2_SNAP_swap=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$VM_VOLUME_SWAP" | awk '{ print $2 }'`
+    if test "$EC2_SNAP_swap" = "${EC2_SNAP_swap#snap-}" ; then
+       echo "ERROR: Failed to create snapshot for swap disk $VM_VOLUME_SWAP"
+       ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root"
+       cleanup_and_exit 3
+    fi
+    # wait for snapshots being processed
+    while true; do
+       c=`ec2-describe-snapshots --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" "$EC2_SNAP_swap" | grep completed | wc -l`
+       test "$c" = 2 && break
+    done
+    EC2_AMI=`ec2-register --region "$BUILD_EC2_REGION" -n build-$VM_VOLUME_NAME  -a x86_64 -b "/dev/sda1=$EC2_SNAP_root::false" -b "/dev/sdb1=$EC2_SNAP_swap::false" --kernel "$BUILD_EC2_AKI" | awk '{ print $2 }'`
+    if test "$EC2_AMI" == "${EC2_AMI#ami-}" ; then
+       echo "ERROR: Failed to register the AMI"
+       ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root"
+       ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap"
+       cleanup_and_exit 3
+    fi
+    INSTANCE=`ec2-run-instances --region "$BUILD_EC2_REGION" -z "$BUILD_EC2_ZONE" -t $BUILD_EC2_TYPE --kernel "$BUILD_EC2_AKI" --instance-initiated-shutdown-behavior terminate "$EC2_AMI" | grep ^INSTANCE | awk '{ print $2 }'`
+    if test "$INSTANCE" == "${INSTANCE#i-}" ; then
+       echo "ERROR: Failed to run the instance for AMI $EC2_AMI"
+       ec2-deregister --region "$BUILD_EC2_REGION" "$EC2_AMI"
+       ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root"
+       ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap"
+       cleanup_and_exit 3
+    fi
+    echo "Waiting for finishing the build. No log file until then on EC2 ...."
+    I=0
+    L=0
+    EC2_EXTRACT_VOLUME_root=
+    EC2_EXTRACT_VOLUME_swap=
+    temp_file=`mktemp`
+    while true; do
+       ec2-describe-instances --region "$BUILD_EC2_REGION" "$INSTANCE" > $temp_file
+       state=`grep ^INSTANCE "$temp_file"`
+       if test -z "$EC2_EXTRACT_VOLUME_root" ; then
+           EC2_EXTRACT_VOLUME_root=`grep ^BLOCKDEVICE $temp_file | grep /dev/sda1 | awk '{ print $3 }'`
+           EC2_EXTRACT_VOLUME_swap=`grep ^BLOCKDEVICE $temp_file | grep /dev/sdb1 | awk '{ print $3 }'`
+       fi
+       # the column of the state is at a differen position depending on the state :/
+#       test "$state" = "${state/stopped/}" || break
+       test "$state" = "${state/terminated/}" || break
+       I=$(( $I + 1 ))
+       if test $I -gt 10 ; then
+          echo -n .
+          I=0
+          L=$(( $L + 1 ))
+       fi
+       if test $L -gt 10 ; then
+          # dump entire console log as raw here
+          ec2-get-console-output --region "$BUILD_EC2_REGION" -r "$INSTANCE"
+          L=0
+       fi
+       sleep 1
+    done
+    rm -f "$temp_file"
+    echo
+    ec2-deregister --region "$BUILD_EC2_REGION" "$EC2_AMI"
+    # snapshots get deleted after extract
+}
diff --git a/build-vm-emulator b/build-vm-emulator
new file mode 100644 (file)
index 0000000..472385c
--- /dev/null
@@ -0,0 +1,70 @@
+#
+# generic emulator specific functions
+#
+# (C) 2014 SUSE, Inc
+#
+
+vm_verify_options_emulator() {
+    VM_SWAP=
+}
+
+vm_startup_emulator() {
+    pushd "$BUILD_DIR/emulator"
+    if test -z "$EMULATOR_SCRIPT" ; then
+       EMULATOR_SCRIPT=./emulator.sh
+    elif test "${EMULATOR_SCRIPT:0:1}" != / ; then
+       EMULATOR_SCRIPT="./$EMULATOR_SCRIPT"
+    fi
+    set -- "$EMULATOR_SCRIPT" "$VM_IMAGE"
+    echo "$@"
+    if ! "$@"; then
+        popd
+        echo "ERROR: The emulator returned with a failure"
+        cleanup_and_exit 3
+    fi
+    popd
+
+    # Emulators may not offer to use a second swap space.
+    # So we just mount the filesystem.
+    # WARNING: This is not safe against attacks.
+    mkdir -p $BUILD_ROOT/.build.packages
+    cd $BUILD_ROOT/.build.packages || cleanup_and_exit 1
+    mkdir -p .mount
+    mount $VM_IMAGE -o loop .mount
+    if test -e .mount/.build.packages ; then
+        cp -a .mount/.build.packages/* .
+    fi
+    exitcode=`cat .mount/.build/_exitcode`
+    umount .mount
+    rmdir .mount
+    cleanup_and_exit "$exitcode"
+}
+
+vm_kill_emulator() {
+    if ! fuser -k -TERM "$VM_IMAGE" ; then
+        echo "could not kill build in $VM_IMAGE"
+        cleanup_and_exit 1
+    fi
+}
+
+vm_fixup_emulator() {
+    # emulator may not be able to hand over kernel parameters
+    ln -sf /.build/build $BUILD_ROOT/sbin/init
+}
+
+vm_attach_root_emulator() {
+    :
+}
+vm_attach_swap_emulator() {
+    :
+} 
+vm_detach_root_emulator() {
+    :
+}
+vm_detach_swap_emulator() {
+    :
+}
+vm_cleanup_emulator() {
+    :
+}
+
diff --git a/build-vm-kvm b/build-vm-kvm
new file mode 100644 (file)
index 0000000..70024ad
--- /dev/null
@@ -0,0 +1,211 @@
+#
+# kvm/qemu specific functions
+#
+# (C) 2014 SUSE, Inc
+#
+
+kvm_bin=/usr/bin/qemu-kvm
+kvm_console=ttyS0
+
+# assume virtio support by default
+kvm_device=virtio-blk-pci
+kvm_options=
+
+kvm_check_ppc970() {
+    if ! grep -q -E '(kvm_rma_count.*kvm_hpt_count)|(kvm_hpt_count.*kvm_rma_count)' /proc/cmdline ; then 
+       echo "put kvm_rma_count=<VM number> or kvm_hpt_count=<> to your boot options"
+       cleanup_and_exit 3
+    fi
+}
+
+kvm_check_hugetlb() {
+    if ! grep -q "$HUGETLBFSPATH" /proc/mounts ; then
+       echo "hugetlbfs is not mounted to $HUGETLBFSPATH"
+       cleanup_and_exit 3
+    fi
+    local HUGETLBBLKSIZE=$(stat -f -c "%S" "$HUGETLBFSPATH")
+    HUGETLBBLKSIZE=$(( ${HUGETLBBLKSIZE:-0} / 1024 ))
+    if test "$HUGETLBBLKSIZE" -lt 1 -o ! -e  "/sys/kernel/mm/hugepages/hugepages-${HUGETLBBLKSIZE}kB" ; then
+       echo "could not determine hugetlbfs block size"
+       cleanup_and_exit 3
+    fi
+    local PAGES_FREE=$(cat /sys/kernel/mm/hugepages/hugepages-${HUGETLBBLKSIZE}kB/free_hugepages)
+    local PAGES_REQ=$(( ${VM_MEMSIZE:-64} * 1024 / $HUGETLBBLKSIZE ))
+    if test "$PAGES_FREE" -lt "$PAGES_REQ" ; then
+       echo "expected $PAGES_REQ to be available (have $PAGES_FREE)"
+       echo "please adjust nr_hugepages"
+       cleanup_and_exit 3
+    fi
+}
+
+vm_verify_options_kvm() {
+    vm_kernel=
+    vm_initrd=
+    
+    # overwrite some options for specific host architectures
+    case `uname -m` in
+       armv7l)
+           kvm_bin="/usr/bin/qemu-system-arm"
+           kvm_console=ttyAMA0
+           kvm_options="-enable-kvm -M vexpress-a15 -dtb /boot/a15-guest.dtb -cpu cortex-a15"
+           vm_kernel=/boot/zImage
+           vm_initrd=/boot/initrd
+           # prefer the guest kernel/initrd
+           test -e /boot/zImage.guest && vm_kernel=/boot/zImage.guest
+           test -e /boot/initrd.guest && vm_initrd=/boot/initrd.guest
+           kvm_device=virtio-blk-device
+           ;;
+       aarch64)
+           kvm_bin="/usr/bin/qemu-system-aarch64"
+           kvm_console=ttyAMA0
+           kvm_options="-enable-kvm -M virt -cpu host"
+           vm_kernel=/boot/Image
+           vm_initrd=/boot/initrd
+           # prefer the guest kernel/initrd
+           test -e /boot/Image.guest && vm_kernel=/boot/Image.guest
+           test -e /boot/initrd.guest && vm_initrd=/boot/initrd.guest
+           kvm_device=virtio-blk-device
+           ;;
+       ppc|ppcle|ppc64|ppc64le)
+           kvm_bin="/usr/bin/qemu-system-ppc64"
+           kvm_console=hvc0
+           kvm_options="-enable-kvm -M pseries"
+           grep -q PPC970MP /proc/cpuinfo && kvm_check_ppc970
+           vm_kernel=/boot/vmlinux
+           vm_initrd=/boot/initrd
+           if test "$BUILD_ARCH" = ppc64le -a -e /boot/vmlinuxle ; then
+               vm_kernel=/boot/vmlinuxle
+               vm_initrd=/boot/initrdle
+           fi
+           grep -q "pSeries" /proc/cpuinfo && kvm_device=scsi-hd       # no virtio on pSeries
+           grep -q "PowerNV" /proc/cpuinfo || kvm_device=scsi-hd       # no virtio on ppc != power7 yet
+           ;;
+       s390|s390x)
+           kvm_bin="/usr/bin/qemu-system-s390x"
+           kvm_options="-enable-kvm"
+           kvm_console=hvc0
+           vm_kernel=/boot/image
+           vm_initrd=/boot/initrd
+           kvm_device=virtio-blk-ccw
+           ;;
+    esac
+
+    # check if we can run kvm
+    if ! test -r /dev/kvm -a -x "$kvm_bin" ; then
+       echo "host does not support kvm"
+       echo "either the kvm kernel-module is not loaded or kvm is not installed or hardware virtualization is deactivated in the BIOS."
+       cleanup_and_exit 3
+    fi
+
+    # check hugepages
+    test -n "$HUGETLBFSPATH" -a "$VM_TYPE" = kvm && kvm_check_hugetlb
+
+    # set kernel
+    test -n "$VM_KERNEL" && vm_kernel="$VM_KERNEL"
+    test -z "$vm_kernel" && vm_kernel=/boot/vmlinuz
+
+    # set initrd
+    test -n "$VM_INITRD" && vm_initrd="$VM_INITRD"
+    if test -z "$vm_initrd" ; then
+       # find a nice default
+       if test -e "/boot/initrd-build" ; then
+           vm_initrd="/boot/initrd-build"
+       elif test -e "/boot/initrd-virtio" ; then
+           vm_initrd="/boot/initrd-virtio"
+       else
+           vm_initrd="/boot/initrd"
+           kvm_device=ide-hd
+           # use /etc/sysconfig/kernel as indication if we have virtio
+           if test -e /etc/sysconfig/kernel ; then
+               local im=$(INITRD_MODULES=; . /etc/sysconfig/kernel; echo "$INITRD_MODULES")
+               if test "$im" != "${im/virtio/}" ; then
+                   kvm_device=virtio-blk-pci
+               fi
+           fi
+       fi
+    fi
+
+    case $kvm_device in
+       virtio*)
+           qemu_rootdev=/dev/disk/by-id/virtio-0
+           VM_SWAPDEV=/dev/disk/by-id/virtio-1
+           ;;
+       *)
+           qemu_rootdev=/dev/sda
+           VM_SWAPDEV=/dev/sdb
+           ;;
+    esac
+}
+
+vm_startup_kvm() {
+    qemu_bin="$kvm_bin"
+    qemu_args=(-drive file="$VM_IMAGE",if=none,id=disk,serial=0,cache=unsafe -device "$kvm_device",drive=disk)
+    if test -n "$VM_SWAP" ; then
+       qemu_args=("${qemu_args[@]}" -drive file="$VM_SWAP",if=none,id=swap,serial=1,cache=unsafe -device "$kvm_device",drive=swap)
+    fi
+
+    if test -n "$BUILD_JOBS" -a "$icecream" = 0 -a -z "$BUILD_THREADS" ; then
+       qemu_args=("${qemu_args[@]}" "-smp" "$BUILD_JOBS")
+    elif test -n "$BUILD_JOBS" -a -n "$BUILD_THREADS" ; then
+       qemu_args=("${qemu_args[@]}" "-smp" "$BUILD_JOBS,threads=$BUILD_THREADS")
+    fi
+    if test "$VM_TYPE" = kvm ; then
+       test "$kvm_console" != ttyAMA0 && kvm_options="$kvm_options -cpu host"
+       test -n "$HUGETLBFSPATH" && kvm_options="$kvm_options -mem-path $HUGETLBFSPATH"
+    fi
+    set -- $qemu_bin -no-reboot -nographic -vga none -net none $kvm_options \
+       -kernel $vm_kernel \
+       -initrd $vm_initrd \
+       -append "root=$qemu_rootdev panic=1 quiet no-kvmclock nmi_watchdog=0 rw rd.driver.pre=binfmt_misc elevator=noop console=$kvm_console init=$vm_init_script" \
+       ${VM_MEMSIZE:+-m $VM_MEMSIZE} \
+       "${qemu_args[@]}"
+
+    if test "$PERSONALITY" != 0 ; then
+       # have to switch back to PER_LINUX to make qemu work
+       set -- linux64 "$@"
+    fi
+    export QEMU_AUDIO_DRV=none         # we do not want to have sound inside the VMs
+    echo "$@"
+    "$@"
+}
+
+vm_kill_kvm() {
+    if ! fuser -k -TERM "$VM_IMAGE" ; then
+       echo "could not kill build in $VM_IMAGE"
+       cleanup_and_exit 1
+    fi
+}
+
+vm_fixup_kvm() {
+    # check if we will use a kernel from the build root, in this case
+    # we assume the kernel does virtio
+    if test -z "$VM_KERNEL" -a -e "$BUILD_ROOT/.build.kernel.$VM_TYPE" ; then
+       # ide-hd is the non-virtio default
+       if test "$kvm_device" = ide-hd ; then
+           kvm_device=virtio-blk-pci
+           qemu_rootdev=/dev/disk/by-id/virtio-0
+           VM_SWAPDEV=/dev/disk/by-id/virtio-1
+       fi
+    fi
+}
+
+vm_attach_root_kvm() {
+    :
+}
+
+vm_attach_swap_kvm() {
+    :
+}
+
+vm_detach_root_kvm() {
+    :
+}
+
+vm_detach_swap_kvm() {
+    :
+}
+
+vm_cleanup_kvm() {
+    :
+}
+
diff --git a/build-vm-lxc b/build-vm-lxc
new file mode 100644 (file)
index 0000000..c8eeb9f
--- /dev/null
@@ -0,0 +1,59 @@
+#
+# LXC specific functions
+#
+# (C) 2014 SUSE, Inc
+#
+
+vm_verify_options_lxc() {
+    VM_IMAGE=
+    VM_SWAP=
+}
+
+vm_startup_lxc() {
+    LXCCONF="$BUILD_ROOT/.build.lxc.conf"
+    rm -f "$LXCCONF"
+    cat $BUILD_DIR/lxc.conf > "$LXCCONF"
+    cat >> "$LXCCONF" <<-EOF
+       lxc.rootfs = $BUILD_ROOT
+       EOF
+    # XXX: do this always instead of leaking the hosts' one?
+    echo "rootfs / rootfs rw 0 0" > $BUILD_ROOT/etc/mtab
+    LXCID=${BUILD_ROOT##*/}
+    lxc-destroy -n "$LXCID" >/dev/null 2>&1 || true
+    lxc-create -n "$LXCID" -f "$LXCCONF" || cleanup_and_exit 1
+    lxc-start -n "$LXCID" "$vm_init_script"
+    BUILDSTATUS="$?"
+    test "$BUILDSTATUS" != 255 || BUILDSTATUS=3
+    cleanup_and_exit "$BUILDSTATUS"
+}
+
+vm_kill_lxc() {
+    LXCID=${BUILD_ROOT##*/}
+    lxc-stop -n "$LXCID" || true
+    lxc-destroy -n "$LXCID"
+}
+
+vm_fixup_lxc() {
+    :
+}
+
+vm_attach_root_lxc() {
+    :
+}
+
+vm_attach_swap_lxc() {
+    :
+}
+
+vm_detach_root_lxc() {
+    :
+}
+
+vm_detach_swap_lxc() {
+    :
+}
+
+vm_cleanup_lxc() {
+    :
+}
+
diff --git a/build-vm-openstack b/build-vm-openstack
new file mode 100644 (file)
index 0000000..92d1d78
--- /dev/null
@@ -0,0 +1,128 @@
+#
+# Openstack specific functions
+#
+# (C) 2014 SUSE, Inc
+#
+
+cloud_volume_attach_openstack() {
+    local VM_SERVER="$1"
+    local VM_VOL_NAME="$2"
+    local VM_VOL_DEV="$3"
+
+    if ! nova volume-attach "$VM_SERVER" "$VM_VOL_NAME" "$VM_VOL_DEV"; then
+       echo "ERROR: nova attach failed. $?" >&2
+       return 3
+    fi
+    while true; do
+       state=`nova volume-show "$VM_VOL_NAME" | sed -n 's,^|[ ]*status[ ]*|[ ]*\([^ ]*\).*,\1,p'`
+       test "$state" = "in-use" && break
+        if test -z "$state" ; then
+           echo "ERROR: unable to find state of volume $VM_VOL_NAME" >&2
+            return 3
+        fi
+        if test "$state" = available ; then
+           echo "WARNING: volume $VM_VOL_NAME got not attached, retrying" >&2
+            if ! nova volume-attach "$VM_SERVER" "$VM_VOL_NAME" "$VM_VOL_DEV"; then
+               echo "ERROR: nova attach failed. $?" >&2
+                return 3
+            fi
+        fi
+        sleep 3
+    done
+    if test ! -e "$VM_VOL_DEV" ; then
+       #GROSS HACK: kernel does not care about the given device name
+#       VM_VOL_DEV="/dev/"`dmesg| sed -n 's,.*\(vd.\): unknown partition tab.*,\1,p' | tail -n 1`
+        VM_VOL_DEV=`ls -1 /dev/vd? | tail -n 1`
+    fi
+    echo "$VM_VOL_DEV"
+}
+
+cloud_volume_detach_openstack() {
+    local VM_SERVER="$1"
+    local VM_VOL_NAME="$2"
+
+    # needed at all?
+    nova volume-show "$VM_VOL_NAME" | grep -q in-use || return 0
+    # umount seems not to be enough
+    sync
+    if ! nova volume-detach "$VM_SERVER" "$VM_VOL_NAME"; then
+       echo "ERROR: nova detach of $VM_VOL_NAME failed." >&2
+        return 3
+    fi
+    while nova volume-show "$VM_VOL_NAME" | grep -q availabe; do
+       sleep 3
+    done
+    return 0
+}
+
+vm_verify_options_openstack() {
+    # verify settings
+    if test -z "$OS_AUTH_URL" ; then
+       echo "ERROR: No openstack environment set. This vm-type works only inside of an openstack VM."
+       cleanup_and_exit 3
+    fi
+    if test -z "$OBS_OPENSTACK_KERNEL_IMAGE_ID" ; then
+       echo "ERROR: No image refering to kernel and ramdisk is defined in OBS_OPENSTACK_KERNEL_IMAGE_ID env."
+       cleanup_and_exit 3
+    fi
+    if test -z "$VM_VOLUME_NAME" ; then
+       echo "ERROR: No worker root VM volume name specified."
+       cleanup_and_exit 3
+    fi
+    if test -z "$VM_VOLUME_SWAP" ; then
+       echo "ERROR: No worker swap VM volume name specified."
+       cleanup_and_exit 3
+    fi
+    if test -z "$VM_SERVER" ; then
+       echo "ERROR: No VM server nod name specified (usually this instance)."
+       cleanup_and_exit 3
+    fi
+
+    # XXX why here?
+    VM_SWAPDEV=/dev/vdb
+    qemu_rootdev=/dev/vda
+}
+
+vm_attach_root_openstack() {
+    VM_IMAGE=`cloud_volume_attach_openstack "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"`
+    test "${VM_IMAGE:0:5}" = "/dev/" || cleanup_and_exit 3
+}
+
+vm_attach_swap_openstack() {
+    VM_SWAP=`cloud_volume_attach_openstack "$VM_SERVER" "$VM_VOLUME_SWAP" "$VM_SWAP"`
+    test "${VM_SWAP:0:5}" = /dev/ || cleanup_and_exit 3
+}
+
+vm_detach_root_openstack() {
+    cloud_volume_detach_openstack "$VM_SERVER" "$VM_VOLUME_NAME"
+}
+
+vm_detach_swap_openstack() {
+    cloud_volume_detach_openstack "$VM_SERVER" "$VM_VOLUME_SWAP"
+}
+
+vm_cleanup_openstack() {
+    cloud_volume_detach_openstack "$VM_SERVER" "$VM_VOLUME_NAME"
+    cloud_volume_detach_openstack "$VM_SERVER" "$VM_VOLUME_SWAP"
+}
+
+vm_fixup_openstack() {
+    # No way to handle this via init= parameter here....
+    echo "#!/bin/sh"               >  "$BUILD_ROOT/sbin/init"
+    echo 'exec /.build/build "$@"' >> "$BUILD_ROOT/sbin/init"
+    chmod 0755 "$BUILD_ROOT/sbin/init"
+}
+
+vm_kill_openstack() {
+    if nova show "$VM_VOLUME_NAME" >/dev/null 2>&1 ; then
+       if ! nova delete "$VM_VOLUME_NAME" ; then
+           echo "could not kill openstack vm build $VM_VOLUME_NAME"
+            cleanup_and_exit 1
+       fi
+    fi
+}
+
+vm_startup_openstack() {
+    nova boot --image $OBS_OPENSTACK_KERNEL_IMAGE_ID --flavor m1.small --block_device_mapping vda=${VM_VOLUME_NAME}::$(( $VMDISK_ROOTSIZE / 1024 )):0 --block_device_mapping vdb=${VM_VOLUME_SWAP}::1:0 --poll "build-$VM_VOLUME_NAME" || cleanup_and_exit 3
+    nova console-log "build-$VM_VOLUME_NAME"
+}
diff --git a/build-vm-qemu b/build-vm-qemu
new file mode 100644 (file)
index 0000000..ba95f37
--- /dev/null
@@ -0,0 +1,44 @@
+#
+# qemu specific functions
+#
+# (C) 2014 SUSE, Inc
+#
+
+# just forward everything to kvm...
+
+vm_verify_options_qemu() {
+    vm_verify_options_kvm
+}
+
+vm_startup_qemu() {
+    vm_startup_kvm
+}
+
+vm_kill_qemu() {
+    vm_kill_kvm
+}
+
+vm_fixup_qemu() {
+    vm_setup_kvm
+}
+
+vm_attach_root_qemu() {
+    vm_attach_root_kvm
+}
+
+vm_attach_swap_qemu() {
+    vm_attach_swap_kvm
+}
+
+vm_detach_root_qemu() {
+    vm_detach_root_kvm
+}
+
+vm_detach_swap_qemu() {
+    vm_detach_swap_kvm
+}
+
+vm_cleanup_qemu() {
+    vm_cleanup_kvm
+}
+
diff --git a/build-vm-uml b/build-vm-uml
new file mode 100644 (file)
index 0000000..13c6456
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# UML specific functions
+#
+# (C) 2014 SUSE, Inc
+#
+
+uml_kernel=/boot/vmlinux-um
+uml_initrd=/boot/initrd-um
+
+vm_verify_options_uml() {
+    VM_SWAPDEV=/dev/sdb
+}
+
+vm_startup_uml() {
+    set -- $uml_kernel initrd=$uml_initrd root=ubda init="$vm_init_script" panic=1 elevator=noop quiet ubda=$VM_IMAGE ubdb=$VM_SWAP ${VM_MEMSIZE:+mem=$VM_MEMSIZE}
+    echo "$@"
+    "$@"
+}
+
+vm_kill_uml() {
+    if ! fuser -k -TERM "$VM_IMAGE"; then
+        echo "could not kill build in $VM_IMAGE"
+        cleanup_and_exit 1
+    fi
+}
+
+vm_fixup_uml() {
+    :
+}
+
+vm_attach_root_uml() {
+    :
+}
+
+vm_attach_swap_uml() {
+    :
+}
+
+vm_detach_root_uml() {
+    :
+}
+
+vm_detach_swap_uml() {
+    :
+}
+
+vm_cleanup_uml() {
+    :
+}
+
diff --git a/build-vm-xen b/build-vm-xen
new file mode 100644 (file)
index 0000000..d3c55e0
--- /dev/null
@@ -0,0 +1,116 @@
+#
+# XEN specific functions
+#
+# (C) 2014 SUSE, Inc
+#
+
+vm_verify_options_xen() {
+    vm_kernel=/boot/vmlinuz
+    vm_initrd=/boot/initrd
+    test -e /boot/vmlinuz-xen && vm_kernel=/boot/vmlinuz-xen
+    test -e /boot/initrd-xen && vm_initrd=/boot/initrd-xen
+    test -n "$VM_KERNEL" && vm_kernel="$VM_KERNEL"
+    test -n "$VM_INITRD" && vm_initrd="$VM_INITRD"
+}
+
+vm_startup_xen() {
+    XMCMD=xm
+    test ! -x /usr/sbin/xm -a -x /usr/sbin/xl && XMCMD=xl
+    XMROOT="file:$(readlink -f $VM_IMAGE)"
+    XMROOT=${XMROOT/#file:\/dev/phy:/dev}
+    XMROOT="disk=$XMROOT,hda1,w"
+    XMSWAP=
+    if test -n "$VM_SWAP" ; then
+       XMSWAP="file:$(readlink -f $VM_SWAP)"
+       XMSWAP=${XMSWAP/#file:\/dev/phy:/dev}
+       XMSWAP="disk=$XMSWAP,hda2,w"
+    fi
+    XENID="${VM_IMAGE%/root}"
+    XENID="${XENID%/tmpfs}"
+    XENID="${XENID##*/}"
+    XENID="${XENID#root_}"
+
+    if $XMCMD list "build_$XENID" >/dev/null 2>&1 ; then
+       echo "Instance already exists, something really went wrong..."
+       echo "Please report to your server admin, there might be multiple services running for same domain"
+       cleanup_and_exit 3
+    fi
+    XEN_CONF_FILE=`mktemp /var/tmp/build.xen.conf-XXXXXXXXX` || cleanup_and_exit 3
+    
+    echo "kernel = \"$vm_kernel\""                                           >  $XEN_CONF_FILE
+    echo "ramdisk = \"$vm_initrd\""                                          >> $XEN_CONF_FILE
+    echo "memory = ${VM_MEMSIZE:-64}"                                        >> $XEN_CONF_FILE
+    test -n "$BUILD_JOBS" && echo "vcpus = $BUILD_JOBS"                      >> $XEN_CONF_FILE
+    echo "root = \"/dev/hda1 ro\""                                           >> $XEN_CONF_FILE
+    echo "extra = \"init=/bin/bash console=ttyS0 panic=1 udev_timeout=360\"" >> $XEN_CONF_FILE
+    echo "on_poweroff = \"destroy\""                                         >> $XEN_CONF_FILE
+    echo "on_reboot = \"destroy\""                                           >> $XEN_CONF_FILE
+    echo "on_crash = \"destroy\""                                            >> $XEN_CONF_FILE
+    if test "$XMCMD" = xm ; then
+       set -- xm create -c $XEN_CONF_FILE name="build_$XENID" $XMROOT $XMSWAP extra="panic=1 quiet init="$vm_init_script" rd.driver.pre=binfmt_misc elevator=noop console=ttyS0"
+    else
+       XLDISK=
+       XLDISK="\"${XMROOT#disk=}\""
+       test -n "$XMSWAP" && XLDISK="$XLDISK, \"${XMSWAP#disk=}\""
+       set -- xl create -c $XEN_CONF_FILE name="\"build_$XENID\"" "disk=[ $XLDISK ]" extra=\""panic=1 quiet init="$vm_init_script" rd.driver.pre=binfmt_misc elevator=noop console=ttyS0"\"
+    fi
+    if test "$PERSONALITY" != 0 ; then
+       # have to switch back to PER_LINUX to make xm work
+       set -- linux64 "$@"
+    fi
+    echo "$@"
+    "$@" || cleanup_and_exit 3
+    rm -f "$XEN_CONF_FILE"
+}
+
+vm_kill_xen() {
+    XMCMD=xm
+    test ! -x /usr/sbin/xm -a -x /usr/sbin/xl && XMCMD=xl
+    XENID="${VM_IMAGE%/root}"
+    XENID="${XENID%/tmpfs}"
+    XENID="${XENID##*/}"
+    XENID="${XENID#root_}"
+    if $XMCMD list "build_$XENID" >/dev/null 2>&1 ; then 
+       if ! $XMCMD destroy "build_$XENID" ; then 
+           echo "could not kill xen build $XENID"
+           cleanup_and_exit 1
+       fi
+    fi
+}
+
+# XEN only
+vm_purge_xen() {
+    # this should not be needed, but sometimes a xen instance gets lost
+    XMCMD=xm
+    test ! -x /usr/sbin/xm -a -x /usr/sbin/xl && XMCMD=xl
+    XENID="${VM_IMAGE%/root}"
+    XENID="${XENID%/tmpfs}"
+    XENID="${XENID##*/}"
+    XENID="${XENID#root_}"
+    $XMCMD destroy "build_$XENID" >/dev/null 2>&1
+}
+
+vm_fixup_xen() {
+    :
+}
+
+vm_attach_root_xen() {
+    :
+}
+
+vm_attach_swap_xen() {
+    :
+}
+
+vm_detach_root_xen() {
+    :
+}
+
+vm_detach_swap_xen() {
+    :
+}
+
+vm_cleanup_xen() {
+    :
+}
+
diff --git a/build-vm-zvm b/build-vm-zvm
new file mode 100644 (file)
index 0000000..2bbabe6
--- /dev/null
@@ -0,0 +1,352 @@
+#
+# z/VM specific functions
+#
+# (C) 2014 SUSE, Inc
+#
+
+# z/VM: use default kernel image from local machine
+# lets go with the default parameters. However zvm_initrd will be a required parameter
+#zvm_kernel=/boot/image
+#zvm_initrd=/boot/initrd_worker
+zvm_param="root=/dev/disk/by-path/ccw-0.0.0150-part1 hvc_iucv=8 console=hvc0"
+zvm_mult_pass="THR4ME"
+zvm_init_script="/.build/build"
+
+#######################################################################################
+
+# this once was in zvm_functions
+
+zvm_fatal() {
+    echo "$1"
+    test -n "$ZVM_CLEANUP" && exit 1
+    cleanup_and_exit 1
+}
+
+prevent_detach() {
+    if test "$1" = "150" -o "$1" = "0150"; then
+        zvm_fatal "don't detach local root"
+    fi
+}
+
+zvm_memset() {
+    # defining the worker also resets the operating system. Be careful
+    # $1: user name
+    # $2: amount in MB
+    # Note, that this is also limited by the worker definition in the user directory
+    if test -n "$2"; then
+        if ! vmcp send $1 define storage ${2}M ; then
+            zvm_fatal "Could not redefine storage of $1 to ${2}M"
+        fi
+    fi
+}
+
+zvm_logon() {
+    # kill machine if it already runs
+    # autolog machine
+    # Needs machine name as $1
+    if test -n "$1" ; then
+        if $(vmcp q "$1" >& /dev/null) ; then
+            vmcp force $1
+            sleep 1
+        fi
+        if ! $(vmcp q "$1" >& /dev/null) ; then
+            if ! $(vmcp xautolog $1 >& /dev/null) ; then
+                zvm_fatal "Could not start machine $1. Is $1 defined in the user directory?"
+            else
+                # give the worker a moment to initialize
+                sleep 2
+                zvm_memset $1 $VM_MEMSIZE
+               sleep 2
+            fi
+        fi
+    fi
+}
+
+zvm_ipl() {
+    # IPL worker. Needs user as $1 and ipl device as $2.
+    if test -n "$1" -a -n "$2" ; then
+        if ! $(vmcp q "$1" >& /dev/null); then
+            zvm_fatal "User $1 not logged on."
+        else
+            if ! $(vmcp send $1 ipl $2); then
+                 zvm_fatal "Could not send command to $1"
+            fi
+        fi
+    else
+        zvm_fatal "Not enough arguments for ipl. Need user and device number."
+    fi
+}
+
+
+zvm_destroy() {
+    # Destroy build. Done by killing the worker machine.
+    # needs user as $1
+    if test -n "$1"; then
+        if ! $(vmcp force $1 ) ; then
+            zvm_fatal "Could not force $1"
+        fi
+    fi
+}
+
+zvm_get_local_devnr() {
+    # $1 is base address, either 150 or 250
+    # $2 is worker number
+    # there is room for up to 100 workers for this controlling guest, however in our setup I expect only up to 10 workers.
+    #echo "Debug: zvm_get_local_devnr: arg1: $1 arg2: $2"
+    if test "$2" -ge 100 ; then
+        zvm_fatal "Not more than 100 workers supported by one controlling guest."
+    fi
+    if test "$1" = "0150" -o "$1" = "150" ; then 
+        DEVNR=$((300+$2))
+    else
+        if test "$1" = "0250" -o "$1" = "250" ; then 
+            DEVNR=$((400+$2))
+        else
+            zvm_fatal "The disk devices for root and swap must be 150 and 250 respectively."
+        fi
+    fi
+    echo $DEVNR
+}
+
+zvm_volume_link_local() {
+    # attach worker disk to local system as preparation for 
+    # a) prepare worker for build
+    # b) get rpms of the swap disk after build finished
+    # disk must be detached from worker first
+    # The following arguments are needed:
+    # 1. Worker user name
+    # 2. Worker disk device number
+    # 3. Mult password for the disk
+    # 4. Worker number to generate a uniq local device number
+    if test -n "$4"; then
+        DEVNR=$(zvm_get_local_devnr $2 $4)
+        if ! vmcp link $1 $2 $DEVNR MW pass=THR4ME >& /dev/null ; then
+            zvm_fatal "Could not link disk $2 from user $1 to local device $DEVNR."
+        fi
+        dasd_configure 0.0.0$DEVNR 1 0 >& /dev/null
+       udevadm settle
+        DEVICE=$(ls /sys/bus/ccw/devices/0.0.0$DEVNR/block/)
+        if ! test -b /dev/${DEVICE}1 ; then
+            zvm_fatal "The device /sys/bus/ccw/devices/0.0.0$DEVNR has not been setup correctly."
+        fi
+        echo "${DEVICE}1"
+    else
+        zvm_fatal "Not enough arguments given to volume_link_local."
+    fi 
+}
+
+zvm_volume_detach_local() {
+    # we need
+    # 1. worker device number
+    # 2. worker number
+    DEVNR=$(zvm_get_local_devnr $1 $2)
+    prevent_detach $DEVNR
+    dasd_configure 0.0.0$DEVNR 0 0
+    if ! vmcp detach $DEVNR >& /dev/null ; then
+        zvm_fatal "Could not locally detach disk number $1 from worker $2"
+    fi
+}
+
+zvm_volume_attach() {
+    # link the local disk of the worker 
+    # $1: user name
+    # $2: disk device number
+    # send link * nr nr
+    if ! vmcp send $1 link \* $2 $2 ; then
+        zvm_fatal "Could not link remote worker disk number $2 from user $1"
+    fi 
+}
+
+zvm_volume_detach() {
+    # send machine detach nr
+    # $1: user name
+    # $2: disk
+    if ! vmcp send $1 detach $2 ; then
+        zvm_fatal "Could not detach disk $2 on worker $1"
+    fi
+}
+
+zvm_worker_init() {
+    # 1. Worker user name
+    # 2. Worker root device number
+    # 3. Worker swap device number
+    # 4. Worker number to generate a uniq local device number
+    # Check for: 
+    # - still mounted dasd
+    # - configured dasd
+    # - linked dasd
+    # - reset worker with force and autolog 
+    DEVNR_ROOT=$(zvm_get_local_devnr $2 $4) 
+    DEVNR_SWAP=$(zvm_get_local_devnr $3 $4)
+    # First, check for mounts:
+    for DEVNR in $DEVNR_ROOT $DEVNR_SWAP ; do
+        if test -d /sys/bus/ccw/devices/0.0.0$DEVNR/block ; then
+            DEV=$(ls /sys/bus/ccw/devices/0.0.0$DEVNR/block/)
+            echo "Found device of worker $1 available at $DEVNR, device is /dev/$DEV."
+            grep "/dev/$DEV" /proc/mounts >& /dev/null && umount /dev/${DEV}1
+        fi
+    done
+    # Second, check if devices are online
+    for DEVNR in $DEVNR_ROOT $DEVNR_SWAP ; do
+        lsdasd $DEVNR | grep $DEVNR && dasd_configure 0.0.0$DEVNR 0 0
+    done
+    # Third, remove stale links
+    for DEVNR in $DEVNR_ROOT $DEVNR_SWAP ; do
+        prevent_detach $DEVNR
+        if vmcp q v $DEVNR 2> /dev/null ; then
+            vmcp detach $DEVNR
+        fi
+    done
+    # Fourth, reset worker
+    zvm_logon $1
+}
+
+zvm_cp() {
+    modprobe vmcp || zvm_fatal "Cannod load vmcp module"
+    if test -n "$1" ; then
+        case "$1" in 
+            start)                shift ; zvm_logon "$@"         ;;
+            ipl)                  shift ; zvm_ipl "$@"           ;;
+            destroy)              shift ; zvm_destroy "$@"       ;;
+            volume_attach)        shift ; zvm_volume_attach "$@" ;;
+            volume_detach)        shift ; zvm_volume_detach "$@" ;;
+            volume_link_local)    shift ; zvm_volume_link_local "$@" ;;
+            volume_detach_local)  shift ; zvm_volume_detach_local "$@" ;;
+            memset)               shift ; zvm_memset "$@"        ;;
+            worker_init)          shift ; zvm_worker_init "$@"   ;;
+        esac
+    fi
+}
+
+#######################################################################################
+
+vm_verify_options_zvm() {
+    VM_IMAGE=/dev/dasda1
+    VM_SWAP=/dev/dasdb1
+
+    VM_SWAPDEV=/dev/dasdb1     # in the vm
+
+    if test -z "$VM_VOLUME_ROOT" ; then
+       if test -n "$BUILD_ROOT" -a ${#BUILD_ROOT} -le 4 ; then
+           VM_VOLUME_ROOT="$BUILD_ROOT"
+       else
+           VM_VOLUME_ROOT="0150"
+       fi
+    fi
+    # In z/VM, this is a 4 digit hex number instead of a linux device.
+    # This is the swap disk defined in user direct
+    # This number can be given with the parameter --swap NR.
+    if test -z "$VM_VOLUME_SWAP" ; then
+       if test -n "$VM_SWAP" -a ${#VM_SWAP} -le 4 ; then
+           VM_VOLUME_SWAP="$VM_SWAP"
+       else
+           VM_VOLUME_SWAP="0250"
+       fi
+    fi
+    # z/VM guest name that is already defined in z/VM
+    if test -z "$VM_WORKER" ; then
+       echo "ERROR: No z/VM worker id specified"
+       cleanup_and_exit 3
+    fi
+    if test -z "$VM_WORKER_NR" ; then
+       echo "ERROR: No z/VM worker number specified"
+       cleanup_and_exit 3
+    fi
+    # need the name for a kernel in zvm
+    if test -n "$VM_KERNEL" ; then
+       vm_kernel="$VM_KERNEL"
+    elif test -e "/boot/vmlinux.gz" ; then
+       vm_kernel="/boot/vmlinux.gz"
+    else
+       echo "ERROR: No z/VM kernel specified"
+       cleanup_and_exit 3
+    fi
+    # need the name for an initrd in zvm
+    # this normally will not be the local initrd
+    if test -n "$VM_INITRD" ; then
+       vm_initrd="$VM_INITRD"
+    else
+       echo "ERROR: No z/VM initrd specified"
+       cleanup_and_exit 3
+    fi
+    zvm_cp worker_init $VM_WORKER $VM_VOLUME_ROOT $VM_VOLUME_SWAP $VM_WORKER_NR
+    zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT
+    zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP
+}
+
+vm_startup_zvm() {
+    # link root/swap to the worker
+    zvm_cp volume_attach $VM_WORKER $VM_VOLUME_ROOT
+    zvm_cp volume_attach $VM_WORKER $VM_VOLUME_SWAP
+    zvm_cp ipl $VM_WORKER $VM_VOLUME_ROOT
+    # start IUCV Console
+    # IPL needs some time until IPL really starts...
+    sleep 2
+    # start iucv console. This blocks until build process is finished.
+    iucvconn $VM_WORKER lnxhvc0
+    # sleep some time before taking root and swap devices from worker
+    # This might be critical regarding timing (IUCV_CONSOLE down, but machine still running)
+    sleep 5
+    zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT
+    zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP
+}
+
+vm_kill_zvm() {
+    if vmcp q "$VM_WORKER" > /dev/null 2>&1 ; then
+       if ! zvm_cp destroy $VM_WORKER ; then
+           echo "could not kill zvm worker $VM_WORKER"
+           cleanup_and_exit 1
+       fi
+    fi
+}
+
+vm_fixup_zvm() {
+    # initrd is created in obsstoragesetup.
+    # If it is desired to use a project dependent kernel, use make_guestinitrd from zvm_functions.
+    # have to copy kernel/initrd and run zipl to be able to IPL
+    # have to set init_script before unmounting, thus doing it statically for now.
+    zvm_init_script="/.build/build"
+    mkdir -p $BUILD_ROOT/boot
+    cp $vm_kernel $vm_initrd $BUILD_ROOT/boot
+    mkdir -p $BUILD_ROOT/boot/zipl
+    # finally, install bootloader to the worker disk
+    zipl -t $BUILD_ROOT/boot/zipl -i ${BUILD_ROOT}${vm_kernel} -r ${BUILD_ROOT}${vm_initrd} \
+       --parameters "${zvm_param} init=$zvm_init_script rootfsopts=noatime"
+}
+
+vm_attach_root_zvm() {
+    VM_IMAGE=$(ZVM_CLEANUP=1 zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_ROOT $zvm_mult_pass $VM_WORKER_NR )
+    if test "${VM_IMAGE}" = "${VM_IMAGE#dasd}" ; then
+       echo "did not get a real device for VM_IMAGE: $VM_IMAGE"
+       cleanup_and_exit 3
+    fi
+    VM_IMAGE="/dev/$VM_IMAGE"
+}
+
+vm_attach_swap_zvm() {
+    VM_SWAP=$(ZVM_CLEANUP=1 zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_SWAP $zvm_mult_pass $VM_WORKER_NR )
+    if test "${VM_SWAP}" = "${VM_SWAP#dasd}" ; then
+       echo "did not get a real device for VM_SWAP: $VM_SWAP"
+       cleanup_and_exit 3
+    fi
+    VM_SWAP="/dev/$VM_SWAP"
+}
+
+vm_detach_root_zvm () {
+    zvm_cp volume_detach_local $VM_VOLUME_ROOT $VM_WORKER_NR
+}
+
+vm_detach_swap_zvm() {
+    zvm_cp volume_detach_local $VM_VOLUME_SWAP $VM_WORKER_NR
+}
+
+vm_cleanup_zvm() {
+    if test -n "$VM_WORKER" -a -n "$VM_WORKER_NR" -a -n "$VM_VOLUME_ROOT" -a -n "$VM_VOLUME_SWAP" ; then
+       ZVM_CLEANUP=1
+       (zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT >/dev/null 2>&1)
+       (zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP >/dev/null 2>&1)
+       (zvm_cp volume_detach_local $VM_VOLUME_ROOT $VM_WORKER_NR >/dev/null 2>&1)
+       (zvm_cp volume_detach_local $VM_VOLUME_SWAP $VM_WORKER_NR >/dev/null 2>&1)
+    fi
+}
+
diff --git a/build_kiwi.sh b/build_kiwi.sh
deleted file mode 100644 (file)
index 3f91119..0000000
+++ /dev/null
@@ -1,368 +0,0 @@
-#!/bin/bash
-run_kiwi()
-{
-    imagetype=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$SPECFILE imagetype)
-    imagename=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$SPECFILE filename)
-    imageversion=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$SPECFILE version)
-    # prepare rpms as source and createrepo on the repositories
-    ln -sf $TOPDIR/SOURCES/repos $BUILD_ROOT/repos
-    cd $BUILD_ROOT/$TOPDIR/SOURCES/repos
-    for r in */* ; do
-        test -L $r && continue
-        test -d $r || continue
-        repo="$TOPDIR/SOURCES/repos/$r/"
-        # create compatibility link for old kiwi versions
-        rc="${r//:/:/}"
-        if test "$rc" != "$r" ; then
-       rl="${rc//[^\/]}"
-       rl="${rl//?/../}"
-       mkdir -p "${rc%/*}"
-       ln -s $rl$r "${rc%/*}/${rc##*/}"
-       repo="$TOPDIR/SOURCES/repos/${rc%/*}/${rc##*/}/"
-        fi
-        if test "$imagetype" != product -a "$DO_INIT" != "false" ; then
-           echo "creating repodata for $repo"
-           if chroot $BUILD_ROOT createrepo --no-database --simple-md-filenames --help >/dev/null 2>&1 ; then
-               chroot $BUILD_ROOT createrepo --no-database --simple-md-filenames "$repo"
-           else
-               chroot $BUILD_ROOT createrepo "$repo"
-           fi
-        fi
-    done
-    # unpack root tar
-    for t in $BUILD_ROOT/$TOPDIR/SOURCES/root.tar* ; do
-       test -f $t || continue
-       mkdir -p $BUILD_ROOT/$TOPDIR/SOURCES/root
-       chroot $BUILD_ROOT tar -C $TOPDIR/SOURCES/root -xf "$TOPDIR/SOURCES/${t##*/}"
-    done
-    # fix script permissions
-    chmod a+x $BUILD_ROOT/$TOPDIR/SOURCES/*.sh 2>/dev/null
-    # unpack tar files in image directories
-    if test -d $BUILD_ROOT/$TOPDIR/SOURCES/images ; then
-       (
-       cd $BUILD_ROOT/$TOPDIR/SOURCES/images
-       for r in */* ; do
-           test -L $r && continue
-           test -d $r || continue
-           for t in $r/root.tar* ; do
-               test -f $t || continue
-               mkdir -p $r/root
-               chroot $BUILD_ROOT tar -C $TOPDIR/SOURCES/images/$r/root -xf "$TOPDIR/SOURCES/images/$r/${t##*/}"
-           done
-           # fix script permissions
-           chmod a+x $BUILD_ROOT/$TOPDIR/SOURCES/images/$r/*.sh 2>/dev/null
-           # create compatibility link for old kiwi versions
-           rc="${r//:/:/}"
-           if test "$rc" != "$r" ; then
-               rl="${rc//[^\/]}"
-               rl="${rl//?/../}"
-               mkdir -p "${rc%/*}"
-               ln -s $rl$r "${rc%/*}/${rc##*/}"
-           fi
-       done
-       )
-    fi
-    rm -f $BUILD_ROOT/$TOPDIR/SOURCES/config.xml
-    ln -s $SPECFILE $BUILD_ROOT/$TOPDIR/SOURCES/config.xml
-    if test "$imagetype" = product ; then
-       echo "running kiwi --create-instsource..."
-       # runs always as abuild user
-       mkdir -p "$BUILD_ROOT/$TOPDIR/KIWIROOT"
-       chroot "$BUILD_ROOT" chown -R abuild.abuild "$TOPDIR"
-       ver=`chroot "$BUILD_ROOT" su -c "/usr/sbin/kiwi --version | sed -n 's,.*kiwi version v\(.*\),\1,p'"`
-        if [ ${ver:0:1} == "3" ]; then
-          # old style kiwi 3 builds
-         chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT -v --logfile terminal -p $TOPDIR/SOURCES --instsource-local --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true
-          if [ ${ver:2:2} == "01" ]; then
-            ## This block is obsolete with current kiwi versions, only needed for kiwi 3.01 version
-            for i in $BUILD_ROOT/$TOPDIR/KIWIROOT/main/* ; do
-                test -d "$i" || continue
-                n="${i##*/}"
-                test "$n" = scripts && continue
-                test "$n" != "${n%0}" && continue
-                chroot $BUILD_ROOT su -c "suse-isolinux $TOPDIR/KIWIROOT/main/$n $TOPDIR/KIWI/$n.iso" - $BUILD_USER
-            done
-          fi
-        else
-          if [ ${ver:0:1} == "4" -a ${ver:2:2} -lt 90 ]; then
-            # broken kiwi version, not accepting verbose level
-           chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT -v -v --logfile terminal -p $TOPDIR/SOURCES --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true
-          else
-            # current default
-           chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT -v 2 --logfile terminal -p $TOPDIR/SOURCES --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true
-          fi
-        fi
-
-       # move created product to correct destination
-       for i in $BUILD_ROOT/$TOPDIR/KIWIROOT/main/* ; do
-           test -e "$i" || continue
-           f=${i##*/}
-           case $f in
-               *.iso) mv $i $BUILD_ROOT/$TOPDIR/KIWI/. ;;
-               *.packages) mv $i $BUILD_ROOT/$TOPDIR/OTHER/. ;;
-               scripts) ;;
-               *0) ;;
-               *) test -d $i && mv $i $BUILD_ROOT/$TOPDIR/KIWI/. ;;
-           esac
-       done
-    else
-       BUILD_SUCCEEDED=true
-       if [ -z "$RUNNING_IN_VM" ]; then
-           # NOTE: this must be done with the outer system, because it loads the dm-mod kernel modules, which needs to fit to the kernel.
-           echo "starting device mapper for kiwi..."
-           [ -x /etc/init.d/boot.device-mapper ] && /etc/init.d/boot.device-mapper start
-       fi
-       for imgtype in $imagetype ; do
-           echo "running kiwi --prepare for $imgtype..."
-           # Do not use $BUILD_USER here, since we always need root permissions
-           if chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && kiwi --prepare $TOPDIR/SOURCES --logfile terminal --root $TOPDIR/KIWIROOT-$imgtype $KIWI_PARAMETERS" - root < /dev/null ; then
-               echo "running kiwi --create for $imgtype..."
-               mkdir -p $BUILD_ROOT/$TOPDIR/KIWI-$imgtype
-               chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && kiwi --create $TOPDIR/KIWIROOT-$imgtype --logfile terminal --type $imgtype -d $TOPDIR/KIWI-$imgtype $KIWI_PARAMETERS" - root < /dev/null || cleanup_and_exit 1
-           else
-               cleanup_and_exit 1
-           fi
-       done
-
-       # create tar.gz of images, in case it makes sense
-       imagearch=`uname -m`
-       buildnum=""
-         if test -n "$RELEASE"; then
-           buildnum="-Build$RELEASE"
-       fi
-       imageout="$imagename.$imagearch-$imageversion"
-       for imgtype in $imagetype ; do
-           case "$imgtype" in
-               oem)
-                   cat > $BUILD_ROOT/kiwi_post.sh << EOF
-echo "compressing oem images... "
-cd /$TOPDIR/KIWI-oem
-# do not store compressed file _and_ uncompressed one
-[ -e "$imageout.gz" ] && rm -f "$imageout"
-if [ -e "$imageout.iso" ]; then
-       echo "take iso file and create sha256..."
-       mv "$imageout.iso" "/$TOPDIR/KIWI/$imageout$buildnum.iso"
-       pushd /$TOPDIR/KIWI
-       if [ -x /usr/bin/sha256sum ]; then
-           /usr/bin/sha256sum "$imageout$buildnum.iso" > "$imageout$buildnum.iso.sha256"
-        fi
-       popd
-fi
-if [ -e "$imageout.install.iso" ]; then
-       echo "take install.iso file and create sha256..."
-       mv "$imageout.install.iso" "/$TOPDIR/KIWI/$imageout$buildnum.install.iso"
-       pushd /$TOPDIR/KIWI
-       if [ -x /usr/bin/sha256sum ]; then
-           /usr/bin/sha256sum "$imageout$buildnum.install.iso" > "$imageout$buildnum.install.iso.sha256"
-        fi
-       popd
-fi
-if [ -e "$imageout.qcow2" ]; then
-       mv "$imageout.qcow2" "/$TOPDIR/KIWI/$imageout$buildnum.qcow2"
-       pushd /$TOPDIR/KIWI
-       if [ -x /usr/bin/sha256sum ]; then
-           echo "Create sha256 file..."
-           /usr/bin/sha256sum "$imageout$buildnum.qcow2" > "$imageout$buildnum.qcow2.sha256"
-        fi
-       popd
-fi
-if [ -e "$imageout.raw.install.raw" ]; then
-        compress_tool="bzip2"
-        compress_suffix="bz2"
-       if [ -x /usr/bin/xz ]; then
-            # take xz to get support for sparse files
-            compress_tool="xz -2"
-            compress_suffix="xz"
-        fi
-       mv "$imageout.raw.install.raw" "/$TOPDIR/KIWI/$imageout$buildnum.raw.install.raw"
-       pushd /$TOPDIR/KIWI
-       echo "\$compress_tool raw.install.raw file..."
-       \$compress_tool "$imageout$buildnum.raw.install.raw"
-       if [ -x /usr/bin/sha256sum ]; then
-           echo "Create sha256 file..."
-           /usr/bin/sha256sum "$imageout$buildnum.raw.install.raw.\${compress_suffix}" > "$imageout$buildnum.raw.install.raw.\${compress_suffix}.sha256"
-        fi
-       popd
-fi
-if [ -e "$imageout.raw" ]; then
-        compress_tool="bzip2"
-        compress_suffix="bz2"
-       if [ -x /usr/bin/xz ]; then
-            # take xz to get support for sparse files
-            compress_tool="xz -2"
-            compress_suffix="xz"
-        fi
-       mv "$imageout.raw" "/$TOPDIR/KIWI/$imageout$buildnum.raw"
-       pushd /$TOPDIR/KIWI
-       echo "\$compress_tool raw file..."
-       \$compress_tool "$imageout$buildnum.raw"
-       if [ -x /usr/bin/sha256sum ]; then
-           echo "Create sha256 file..."
-           /usr/bin/sha256sum "$imageout$buildnum.raw.\${compress_suffix}" > "$imageout$buildnum.raw.\${compress_suffix}.sha256"
-        fi
-       popd
-fi
-
-tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-raw.tar.bz2" \
-       --exclude="$imageout.iso" --exclude="$imageout.raw" --exclude="$imageout.qcow2" *
-cd /$TOPDIR/KIWI
-if [ -x /usr/bin/sha256sum ]; then
-   /usr/bin/sha256sum "$imageout$buildnum-raw.tar.bz2" > "$imageout$buildnum-raw.tar.bz2.sha256"
-fi
-EOF
-                   ;;
-               vmx)
-                   cat > $BUILD_ROOT/kiwi_post.sh << EOF
-echo "compressing vmx images... "
-cd /$TOPDIR/KIWI-vmx
-for suffix in "ovf" "qcow2" "ova"; do
-  if [ -e "$imageout.\$suffix" ]; then
-       mv "$imageout.\$suffix" "/$TOPDIR/KIWI/$imageout$buildnum.\$suffix"
-       pushd /$TOPDIR/KIWI
-       if [ -x /usr/bin/sha256sum ]; then
-           echo "Create sha256 \$suffix file..."
-           /usr/bin/sha256sum "$imageout$buildnum.\$suffix" > "$imageout$buildnum.\$suffix.sha256"
-        fi
-       popd
-  fi
-done
-# This option has a number of format parameters
-VMXFILES=""
-SHAFILES=""
-for i in "$imageout.vmx" "$imageout.vmdk" "$imageout-disk*.vmdk"; do
-       test -e \$i && VMXFILES="\$VMXFILES \$i"
-done
-# take raw files as fallback
-if [ -n "\$VMXFILES" ]; then
-       tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx.tar.bz2" \$VMXFILES
-       SHAFILES="\$SHAFILES $imageout$buildnum-vmx.tar.bz2"
-elif [ -e  "$imageout.raw" ]; then
-        compress_tool="bzip2"
-        compress_suffix="bz2"
-       if [ -x /usr/bin/xz ]; then
-            # take xz to get support for sparse files
-            compress_tool="xz -2"
-            compress_suffix="xz"
-        fi
-       mv "$imageout.raw" "/$TOPDIR/KIWI/$imageout$buildnum-vmx.raw"
-       pushd /$TOPDIR/KIWI
-       echo "\$compress_tool raw file..."
-       \$compress_tool "$imageout$buildnum-vmx.raw"
-       SHAFILES="\$SHAFILES $imageout$buildnum-vmx.raw.\${compress_suffix}"
-       popd
-fi
-if [ -e "$imageout.xenconfig" ]; then
-       tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx.tar.bz2" $imageout.xenconfig $imageout.raw initrd-*
-       SHAFILES="\$SHAFILES $imageout$buildnum-vmx.tar.bz2"
-fi
-# FIXME: do we need a single .raw file in any case ?
-
-cd /$TOPDIR/KIWI
-if [ -n "\$SHAFILES" -a -x /usr/bin/sha256sum ]; then
-       for i in \$SHAFILES; do
-               echo "Create sha256 file..."
-               /usr/bin/sha256sum "\$i" > "\$i.sha256"
-       done
-fi
-EOF
-                   ;;
-               xen)
-                   cat > $BUILD_ROOT/kiwi_post.sh << EOF
-echo "compressing xen images... "
-cd /$TOPDIR/KIWI-xen
-# do not store compressed file _and_ uncompressed one
-[ -e "$imageout.gz" ] && rm -f "$imageout"
-tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-xen.tar.bz2" \
-       `grep ^kernel $imageout.xenconfig | cut -d'"'  -f2` \
-       `grep ^ramdisk $imageout.xenconfig | cut -d'"'  -f2` \
-       initrd-* \
-       "$imageout.xenconfig" \
-       "$imageout"
-if [ -x /usr/bin/sha256sum ]; then
-   echo "Create sha256 file..."
-   cd $TOPDIR/KIWI
-   /usr/bin/sha256sum "$imageout$buildnum-xen.tar.bz2" > "$imageout$buildnum-xen.tar.bz2.sha256"
-fi
-EOF
-                   ;;
-               pxe)
-                   cat > $BUILD_ROOT/kiwi_post.sh << EOF
-echo "compressing pxe images... "
-cd /$TOPDIR/KIWI-pxe
-# do not store compressed file _and_ uncompressed one
-[ -e "$imageout.gz" ] && rm -f "$imageout"
-tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-pxe.tar.bz2" ${imageout}* initrd-*
-if [ -x /usr/bin/sha256sum ]; then
-   echo "Create sha256 file..."
-   cd $TOPDIR/KIWI
-   /usr/bin/sha256sum "$imageout$buildnum-pxe.tar.bz2" > "$imageout$buildnum-pxe.tar.bz2.sha256"
-fi
-EOF
-                   ;;
-               iso)
-                   cat > $BUILD_ROOT/kiwi_post.sh << EOF
-cd /$TOPDIR/KIWI-iso
-for i in *.iso; do
-       mv "\$i" "/$TOPDIR/KIWI/\${i%.iso}$buildnum.iso"
-done
-if [ -x /usr/bin/sha256sum ]; then
-   echo "creating sha256 sum for iso images... "
-   cd $TOPDIR/KIWI
-   for i in *.iso; do
-       /usr/bin/sha256sum "\$i" > "\$i.sha256"
-   done
-fi
-EOF
-                   ;;
-               tbz)
-                   cat > $BUILD_ROOT/kiwi_post.sh << EOF
-cd /$TOPDIR/KIWI-tbz
-for i in *.tbz; do
-        file=\$(readlink -f "\$i")
-        [ -z "\$file" ] && echo readlink failed for $i
-       mv "\$file" "/$TOPDIR/KIWI/\${i%.tbz}$buildnum.tbz"
-done
-if [ -x /usr/bin/sha256sum ]; then
-   echo "creating sha256 sum for tar balls... "
-   cd $TOPDIR/KIWI
-   for i in *.tbz; do
-       /usr/bin/sha256sum "\$i" > "\$i.sha256"
-   done
-fi
-EOF
-                   ;;
-               *)
-                   cat > $BUILD_ROOT/kiwi_post.sh << EOF
-echo "compressing unkown images... "
-cd /$TOPDIR/KIWI-$imgtype
-# do not store compressed file _and_ uncompressed one
-[ -e "$imageout.gz" ] && rm -f "$imageout"
-tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-$imgtype.tar.bz2" *
-if [ -x /usr/bin/sha256sum ]; then
-   echo "Create sha256 file..."
-   cd /$TOPDIR/KIWI
-   /usr/bin/sha256sum "$imageout$buildnum-$imgtype.tar.bz2" > "$imageout$buildnum-$imgtype.tar.bz2.sha256"
-fi
-EOF
-                   ;;
-           esac
-           cat >> $BUILD_ROOT/kiwi_post.sh << EOF
-cd /$TOPDIR/KIWI-$imgtype
-if [ -e "$imageout.packages" ]; then
-   echo "Found kiwi package list file, exporting as well..."
-   cp "$imageout.packages" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.packages"
-fi
-if [ -e "$imageout.verified" ]; then
-   echo "Found rpm verification report, exporting as well..."
-   cp "$imageout.verified" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.verified"
-fi
-EOF
-           chroot $BUILD_ROOT su -c "sh -e /kiwi_post.sh" || cleanup_and_exit 1
-           rm -f $BUILD_ROOT/kiwi_post.sh
-       done
-    fi
-    # Hook for running post kiwi build scripts like QA scripts if installed
-    if [ -x $BUILD_ROOT/usr/lib/build/kiwi_post_run ]; then
-        chroot $BUILD_ROOT su -c /usr/lib/build/kiwi_post_run || cleanup_and_exit 1
-    fi
-}
index dceb7e50231ca711ceffeec5feb17714bcfa65b2..4b947988b51098b86a8294e47dcb61930a64f634 100755 (executable)
@@ -49,6 +49,10 @@ if (@ARGV == 2 && $ARGV[0] eq '--file') {
   opendir(D, $dir) || die("$dir: $!\n");
   my @changes = grep {/\.changes$/} readdir(D);
   closedir(D);
+  # support _service: prefixes, they need to be stripped
+  $file =~ s/^_service:.*://;
+  my %changes = map {/^((?:_service:.*:)?(.*?))$/ ? ($2, $1) : ($_, $_)} @changes;
+  @changes = keys %changes;
   @changes = sort {length($a) <=> length($b) || $a cmp $b} @changes;
   exit(1) unless @changes;     # nothing to do
   if (@changes > 1) {
@@ -61,7 +65,7 @@ if (@ARGV == 2 && $ARGV[0] eq '--file') {
       last unless $file =~ s/[-.][^-.]*$//;
     }
   }
-  @ARGV = ("$dir/$changes[0]");
+  @ARGV = ("$dir/$changes{$changes[0]}");
 }
 
 sub parse_suse {
index a0e528f933d17e68a19990d69b4ae41acce318d6..4c2c0b60e03745c48e3dd6c8a238f4c22e83dc5b 100755 (executable)
@@ -1,22 +1,13 @@
 #!/bin/bash
 
-: ${CACHE_DIR:=/var/cache/build}
-
-build_host_arch()
-{
+build_host_arch() {
     : ${BUILD_HOST_ARCH:=`uname -m`}
+    BUILD_INITVM_ARCH="$BUILD_HOST_ARCH"
     # avoid multiple initvm.* helpers for i586 and i686
-    test i686 != "$BUILD_HOST_ARCH" || BUILD_HOST_ARCH=i586
+    test i686 != "$BUILD_INITVM_ARCH" || BUILD_INITVM_ARCH=i586
 }
 
-set_build_arch()
-{
-    build_host_arch
-
-    if [ -z "$BUILD_ARCH" ]; then
-       BUILD_ARCH="$BUILD_HOST_ARCH"
-    fi
-
+extend_build_arch() {
     case $BUILD_ARCH in
       armv7hl) BUILD_ARCH="armv7hl:armv7l:armv6hl:armv6l:armv5tel" ;;
       armv7l) BUILD_ARCH="armv7l:armv6l:armv5tel" ;;
@@ -37,6 +28,14 @@ set_build_arch()
       sparc) BUILD_ARCH="sparc" ;;
       x86_64) BUILD_ARCH="x86_64:i686:i586:i486:i386" ;;
     esac
+}
+
+set_build_arch() {
+    build_host_arch
+    if test -z "$BUILD_ARCH" ; then
+       BUILD_ARCH="$BUILD_HOST_ARCH"
+    fi
+    extend_build_arch
     if test "$BUILD_ARCH" != "${BUILD_ARCH#i686}" ; then
        cpuflags=`grep ^flags /proc/cpuinfo`
        cpuflags="$cpuflags "
@@ -47,36 +46,39 @@ set_build_arch()
     fi
 }
 
-check_exit()
-{
+check_exit() {
     if test -e $BUILD_ROOT/exit; then
        echo "exit ..."
        cleanup_and_exit 1
     fi
 }
 
-check_use_emulator()
-{
-    arch=":$BUILD_ARCH:"
-    if test "$arch" != "${arch/:$BUILD_HOST_ARCH:/}"; then
-        # native supported arch, no emulator
-        return 1
+check_use_emulator() {
+    INITVM_NAME=
+    # check if the extended host arch contains the build arch
+    local old_build_arch="$BUILD_ARCH"
+    local arch="${BUILD_ARCH%%:*}"
+    BUILD_ARCH="$BUILD_HOST_ARCH"
+    extend_build_arch
+    BUILD_ARCH=":$BUILD_ARCH:"
+    if test "$BUILD_ARCH" != "${BUILD_ARCH/:$arch:/}" ; then
+       # native supported arch, no emulator
+       BUILD_ARCH="$old_build_arch"
+       return 1
     fi
+    BUILD_ARCH="$old_build_arch"
 
-    # to run the qemu initialization in the XEN chroot, we need to
+    # to run the qemu initialization in the vm, we need to
     # register it with a static program or shell script
-    if test -e $BUILD_DIR/initvm.$BUILD_HOST_ARCH && \
-        test -e $BUILD_DIR/qemu-reg; then
-       chmod 0755 "$BUILD_DIR/initvm.$BUILD_HOST_ARCH"
-        if [ -z "$PREPARE_VM" ]; then
-             return 0  # chroot build, we need to run
-        fi
-        # emulator in vm already registered during startup
-    else
-        # XXX: error?
-        echo "Warning: cross compile not possible due to missing static binaries. please install build-initvm package for that purpose."
-        echo "         check that the right architecture is available for your build host, you need initvm.$BUILD_HOST_ARCH for this one."
+    INITVM_NAME="initvm.$BUILD_INITVM_ARCH"
+    if test -e "$BUILD_DIR/$INITVM_NAME" -a -e "$BUILD_DIR/qemu-reg" ; then
+       chmod 0755 "$BUILD_DIR/$INITVM_NAME"
+       return 0        # chroot build, we need to run
     fi
+    # XXX: error?
+    echo "Warning: cross compile not possible due to missing static binaries. please install build-initvm package for that purpose."
+    echo "         check that the right architecture is available for your build host, you need $INITVM_NAME for this one."
+    INITVM_NAME=
     return 1
 }
 
index f9300d6076e64a1d79ee6173b1bbac46082f36a7..80d2ca731f16d7fd0d8f39acab05d35c7134d9bb 100755 (executable)
 #
 # a block is either a number or a range (start-end)
 #
-# TODO: instead of printing zeroes for each block in a hole use
-# something like 0*num
 
 use strict;
 
-my ($opt_padstart, $opt_padend, $opt_verbose);
+my ($opt_padstart, $opt_padend, $opt_verbose, $opt_manifest, $opt_mani0);
+$opt_verbose = 0;
 
 while (@ARGV)  {
   if ($ARGV[0] eq '--padstart') {
@@ -30,71 +29,139 @@ while (@ARGV)  {
   }
   if ($ARGV[0] eq '--verbose' || $ARGV[0] eq '-v') {
     shift @ARGV;
-    $opt_verbose = 1;
+    $opt_verbose++;
+    next;
+  }
+  if ($ARGV[0] eq '-0') {
+    shift @ARGV;
+    $opt_mani0 = 1;
+    next;
+  }
+  if ($ARGV[0] eq '--manifest') {
+    shift @ARGV;
+    $opt_manifest = shift @ARGV;
     next;
   }
   last;
 }
 
-if($opt_padstart) {
-  print "\n"x$opt_padstart;
+print "\n"x$opt_padstart if $opt_padstart;
+
+if ($opt_manifest) {
+  if ($opt_manifest eq '-') {
+    open(MANIFEST, '<&STDIN') || die("STDIN dup: $!\n");
+  } else {
+    open(MANIFEST, '<', $opt_manifest) || die("$opt_manifest: $!\n");
+  }
 }
 
-for my $file (@ARGV) {
-  next unless -f $file;
-  print STDERR "$file\n" if $opt_verbose;
+while (1) {
+  my $file;
+  if (@ARGV) {
+    $file = shift @ARGV;
+  } elsif ($opt_manifest) {
+    if ($opt_mani0) {
+      local $/ = "\0";
+      $file = <MANIFEST>;
+      last unless defined $file;
+      $file =~ s/\0$//s;
+    } else {
+      $file = <MANIFEST>;
+      last unless defined $file;
+      chomp $file;
+    }
+  } else {
+    last;
+  }
   my $n = $file;
-  $n =~ s/.*\///;
+  $n =~ s/([\000-\037 %])/sprintf("%%%02X", ord($1))/ges;
+  if (-l $file) {
+    print STDERR "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//);
+    my $c = readlink($file);
+    die("$file: readlink: $!\n") unless defined $c;
+    if ("/$c/" =~ /\/\.?\//s) {
+      print STDERR "$file: bad symlink ($c) ignored\n";
+      next;
+    }
+    if ("/$c/" =~ /^(\/\.\.)+\/(.*?)$/s) {
+      my ($head, $tail) = ($1, $2);
+      if (("/$tail/" =~ /\/\.\.\//s) || (($head =~ y!/!!) > ($file =~ y!/!!))) {
+        print STDERR "$file: bad symlink ($c) ignored\n";
+        next;
+      }
+    } else {
+      if ("/$c/" =~ /\/\.\.\//s) {
+        print STDERR "$file: bad symlink ($c) ignored\n";
+        next;
+      }
+    }
+    $c =~ s/([\000-\037 %])/sprintf("%%%02X", ord($1))/ges;
+    print "l $n $c\n";
+    next;
+  } elsif (-d _) {
+    print STDERR "$file\n" if $opt_verbose && $opt_verbose > 1;
+    my @stat = stat(_);
+    print "d $n\n";
+    next;
+  } elsif (!-f _) {
+    next;
+  }
+  print STDERR "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//);
 
-  if(!open(F, '<', $file)) {
+  if (!open(F, '<', $file)) {
     print STDERR "$file: $!";
     next;
   }
 
+  my @stat = stat(F);
+  die unless @stat;
+  my $st_size = $stat[7];
+  if ($st_size == 0) {
+    print "f $n 0\n";
+    close F;
+    next;
+  }
+
   my $bsize = 'xxxx';
   ioctl(F, 2, $bsize) || ioctl(F, 536870914, $bsize) || die("FIGETBSZ: $!\n");
   $bsize = unpack("L", $bsize);
+  die("$file: empty blocksize\n") unless $bsize != 0;
 
-  my @stat = stat(F);
-  my ($st_size, $st_blocks) = ($stat[7], $stat[11], $stat[12]);
-
+  print "f $n $st_size $bsize";
   my $blocks = int(($st_size+$bsize-1)/$bsize);
-
-  print "$n $st_size $bsize ";
-
   my ($firstblock, $lastblock);
   for ($b = 0; $b < $blocks; ++$b) {
     my $block = pack('I', $b);
-    if(not defined ioctl(F, 1, $block)) {
-       if(not defined ioctl(F, 536870913, $block)) {
-           die "$file: $!";
-       }
+    if (not defined ioctl(F, 1, $block)) {
+      if (not defined ioctl(F, 536870913, $block)) {
+       die "$file: $!\n";
+      }
     }
     $block = unpack('I', $block);
-    if($b == 0) {
-      print "$block";
-      $firstblock = $block;
-    } else {
-      # blocks are non-contiguous
-      if($lastblock+1 != $block) {
-       # check if we skipped some that form a range
-       if($firstblock != $lastblock) {
-         printf "-$lastblock";
-       }
+    if (!$firstblock && defined($firstblock)) {
+      # last block was hole
+      if (!$block) {
+       $lastblock++;   # count holes, 0-2 means three hole blocks
+      } else {
+       # switch back from 'hole mode' into normal mode
+       printf "-$lastblock" if defined($firstblock) && $firstblock != $lastblock;
        print " $block";
-       $firstblock = $block;
-      }
-      # last block, check if contiguous
-      if($b+1==$blocks && $lastblock+1 == $block) {
-       print "-$block";
+       $firstblock = $lastblock = $block;
       }
+      next;
+    }
+    if (!$firstblock || $lastblock + 1 != $block) {
+      # start of a new run
+      printf "-$lastblock" if defined($firstblock) && $firstblock != $lastblock;
+      print " $block";
+      $firstblock = $block;
     }
     $lastblock = $block;
   }
+  # finish last run
+  printf "-$lastblock" if defined($firstblock) && $firstblock != $lastblock;
   close F;
   print "\n";
 }
 
-if($opt_padend) {
-  print "\n"x$opt_padend;
-}
+print "\n"x$opt_padend if $opt_padend;
index 466475e7f4bfdeec5b1415adb442f6896aa34e95..c2748fb073a72402f45c38e406e7f4438dfc0b55 100644 (file)
@@ -3,9 +3,10 @@ Repotype: arch
 Preinstall: glibc bash perl sed grep coreutils pacman pacman-mirrorlist
 Preinstall: gawk gzip filesystem curl acl gpgme libarchive
 Preinstall: openssl libssh2 zlib libassuan libgpg-error attr
-Preinstall: expat xz bzip2
+Preinstall: expat xz bzip2 readline lzo2 krb5 e2fsprogs keyutils
+Preinstall: ncurses
 
-VMinstall: util-linux binutils readline ncurses pcre libcap
+VMinstall: util-linux libutil-linux binutils pcre libcap
 
 Required: binutils gcc glibc libtool
 
@@ -14,3 +15,8 @@ Support: libtool ncurses perl gpgme libarchive openssl libssh2
 Support: libassuan libgpg-error attr expat xz pacman pacman-mirrorlist
 Support: fakeroot file sudo patch make net-tools pkg-config
 
+Prefer: zlib ttf-dejavu
+Prefer: libgl jdk7-openjdk libdrm
+
+Prefer: -nvidia-libgl -nvidia-304xx-utils
+
index 77cd7aeb68dbab929895d03f9af8f466d5d1fc1a..37981f734081fe23288b5a913719c1ca699c94eb 100644 (file)
@@ -22,6 +22,7 @@ Conflict: kiwi:systemd-mini
 Conflict: libudev1:udev-mini
 
 FileProvides: /usr/sbin/groupadd pwdutils
+FileProvides: /usr/sbin/useradd shadow
 FileProvides: /sbin/netconfig sysconfig-netconfig
 
 Preinstall: aaa_base attr bash coreutils diffutils
@@ -37,14 +38,14 @@ Runscripts: aaa_base
 Order: libopenssl0_9_8:openssl-certs
 
 Prefer: libdb-4_8-devel
-VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1 net-tools
+VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1 net-tools 
+# kernel-obs-build - bnc#865554 
 
 ExportFilter: \.x86_64\.rpm$ x86_64
 ExportFilter: \.ia64\.rpm$ ia64
 ExportFilter: \.s390x\.rpm$ s390x
 ExportFilter: \.ppc64\.rpm$ ppc64
 ExportFilter: \.ppc\.rpm$ ppc
-ExportFilter: \.ppc64le\.rpm$ ppc64le
 ExportFilter: -ia32-.*\.rpm$
 ExportFilter: -32bit-.*\.sparc64\.rpm$
 ExportFilter: -64bit-.*\.sparcv9\.rpm$
@@ -55,7 +56,7 @@ ExportFilter: ^glibc(?:-devel)?-64bit-.*\.sparcv9\.rpm$ sparcv9
 # it would be a great idea to have, but sometimes installation-images wants to build debuginfos in
 #ExportFilter: -debuginfo-.*\.rpm$
 #ExportFilter: -debugsource-.*\.rpm$
-ExportFilter: ^master-boot-code.*\.i586.rpm$ . x86_64
+#ExportFilter: ^master-boot-code.*\.i586.rpm$ . x86_64
 ExportFilter: ^acroread.*\.i586.rpm$ . x86_64
 ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64
 ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64
@@ -134,7 +135,7 @@ Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs lua-devel
 Prefer: gnu-jaf classpathx-mail avahi-compat-mDNSResponder yast2-control-center-qt
 Prefer: vim-normal myspell-american wine
 Prefer: eclipse-platform eclipse-scripts
-Prefer: yast2-theme-openSUSE
+Prefer: yast2-theme-openSUSE enlightenment-theme-upstream
 Prefer: amarok:amarok-xine
 Prefer: kdenetwork3-vnc:tightvnc
 Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat6-jsp-2_1-api tomcat6-servlet-2_5-api
@@ -237,13 +238,14 @@ Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-uti
 Prefer: libudev-mini-devel libudev-mini1 udev-debuginfo libudev1-debuginfo
 Prefer: systemd-mini systemd-mini-devel
 Prefer: systemd-mini-devel:systemd-mini
-Prefer: udev-mini
+Prefer: udev-mini libcom_err2-mini libext2fs2-mini
 Prefer: libudev1:udev
 Prefer: xmlgraphics-commons:apache-commons-io
 # the -32bit stuff provides things it shouldn't (hopefully temporary)
 Prefer: -typelib-1_0-GdkPixbuf-2_0-32bit -typelib-1_0-Pango-1_0-32bit
 Prefer: postgresql postgresql-server
-Prefer: -unzip-rcc
+Prefer: -unzip-rcc -linuxconsoletools
+
 
 # kernel bug (coolo)
 Prefer: kernel-default-devel
@@ -255,6 +257,7 @@ Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
 Prefer: -vmware-player
 Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
 Prefer: libffi%{gcc_version} libffi%{gcc_version}-devel
+Prefer: -libatomic1-gcc49 -libitm1-gcc49 -libgcj_bc1-gcc49 -libtsan0-gcc49 -libatomic1-gcc49-32bit -libitm1-gcc49-32bit
 Prefer: libgcc_s1-x86 libffi4 libgcj_bc1
 Prefer: libffi4-32bit libffi4-64bit
 Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
@@ -304,8 +307,12 @@ Prefer: -kmod-compat
 Prefer: gettext-tools-mini gettext-runtime-mini
 # choice p11-kit-nss-trust
 Prefer: mozilla-nss-certs
-# amarok dependency
+# amarok dependency resolution
 Prefer: phonon-backend-gstreamer-0_10
+# replacing mkinitrd
+Prefer: dracut
+# Not sure if wicked is ready yet
+Prefer: sysconfig-network
 
 Ignore: java-1_7_0-openjdk:mozilla-nss
 Ignore: java-1_7_0-openjdk:java-ca-certificates
@@ -389,6 +396,7 @@ Ignore: mkinitrd:pciutils
 Ignore: pciutils:pciutils-ids
 Ignore: postfix:iproute2
 Ignore: aaa_base:systemd
+Ignore: gpm:systemd
 Ignore: ConsoleKit:systemd
 Ignore: openssh:systemd
 Ignore: cronie:systemd
@@ -398,6 +406,8 @@ Ignore: systemd:dbus-1
 Ignore: systemd:pam-config
 Ignore: systemd:udev
 Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: udev-mini:this-is-only-for-build-envs
+Ignore: libudev-mini1:this-is-only-for-build-envs
 Ignore: polkit:ConsoleKit
 Ignore: logrotate:cron
 Ignore: texlive-filesystem:cron
@@ -428,6 +438,7 @@ Ignore: man:groff-full
 Ignore: git-core:rsync
 Ignore: apache2:systemd
 Ignore: icewm-lite:icewm
+Ignore: cluster-glue:sudo
 
 Ignore: libgcc:glibc-32bit
 Ignore: libgcc41:glibc-32bit
@@ -465,6 +476,7 @@ Ignore: libreoffice:libreoffice-i18n
 Ignore: libreoffice:libreoffice-icon-themes
 Ignore: mediawiki:php-session,php-gettext,php-zlib,php-mysql,mod_php_any
 Ignore: squirrelmail:mod_php_any,php-session,php-gettext,php-iconv,php-mbstring,php-openssl
+Ignore: perl-Log-Log4perl:rrdtool
 
 Ignore: simias:mono(log4net)
 Ignore: zmd:mono(log4net)
@@ -541,6 +553,7 @@ Ignore: NetworkManager:dhcp
 Ignore: sysconfig:dbus-1
 Ignore: sysconfig:procps
 Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
 Ignore: sysconfig:tunctl
 # no build dependencies
 Ignore: libksuseinstall1:yast2-packager
@@ -553,17 +566,14 @@ Ignore: NetworkManager:dhcp-client
 Ignore: autoyast2:yast2-schema
 Ignore: libgio-2_0-0:dbus-1-x11
 Ignore: weather-wallpaper:inkscape
+Ignore: libgamin-1-0:gamin-server
+Ignore: libfam0-gamin:gamin-server
 
 %ifarch %arm
 Prefer: java-1_7_0-icedtea java-1_7_0-icedtea-devel
 %else
-%ifnarch s390 s390x
 Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel
 %endif
-%ifarch s390 s390x
-Prefer: java-1_6_0-ibm java-1_6_0-ibm-devel
-%endif
-%endif
 
 Prefer: -java-1_5_0-gcj-compat-devel
 %ifarch %ix86 x86_64
@@ -612,62 +622,30 @@ Substitute: kernel-binary-packages kernel-default
 Substitute: yast2-theme-SLED
 Substitute: yast2-theme-SLE
 
-Optflags: i586 -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: x86_64 -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: ppc -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: ppc64 -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: ia64 -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: s390 -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: s390x -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: armv6l -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: armv6hl -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: armv7l -fmessage-length=0 -grecord-gcc-switches -fstack-protector
-Optflags: armv7hl -fmessage-length=0 -grecord-gcc-switches -fstack-protector
+Optflags: i586 -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches
+Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches
+Optflags: x86_64 -fmessage-length=0 -grecord-gcc-switches
+Optflags: ppc -fmessage-length=0 -grecord-gcc-switches
+Optflags: ppc64 -fmessage-length=0 -grecord-gcc-switches
+Optflags: ia64 -fmessage-length=0 -grecord-gcc-switches
+Optflags: s390 -fmessage-length=0 -grecord-gcc-switches
+Optflags: s390x -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv5el -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv5tel -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv7l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv7hl -fmessage-length=0 -grecord-gcc-switches
 Optflags: aarch64 -fmessage-length=0 -grecord-gcc-switches
 # need mcpu=ultrasparc to complete sparcv8plus to sparcv9 (adds, for example, atomic ops)
-Optflags: sparcv9 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc -fstack-protector
-Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc -fstack-protector
+Optflags: sparcv9 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
 %ifarch sparcv9
 Target: sparcv9
 %endif
-# Workaround buildservice bug (scheduler arch not matching target arch)
-%ifarch armv7l armv7hl
-Target: armv7hl-suse-linux
-%endif
-%ifarch armv6l armv6hl
-Target: armv6hl-suse-linux
-%endif
 
-Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
 
 %define suse_version 1320
 
-%ifarch aarch64 armv6l armv6hl
-%define qemu_user_space_build 1
-%endif
-
-%if "%qemu_user_space_build" == "1"
-Hostarch: x86_64
-Constraint: hostlabel QEMU_ARM
-
-Macros:
-%qemu_user_space_build 1
-%_without_mono 1
-:Macros
-
-%ifarch armv6l armv6hl
-Preinstall: qemu-linux-user
-%endif
-
-%ifarch armv7l armv7hl
-Preinstall: qemu-linux-user
-%endif
-
-ExportFilter: ^qemu-linux-user.*\.x86_64\.rpm$ . armv7l armv6l
-%endif
-
-
 Macros:
 %insserv_prereq insserv sed
 %fillup_prereq fillup coreutils grep diffutils
index a97f762997fbc5a064757f5c244d0e3e9370a111..94efdb1c96e957b5441cff95277f6c763b0d15d6 100755 (executable)
@@ -46,9 +46,9 @@ GetOptions("cachedir=s"  => \$cachedir) or exit(1);
 
 
 for my $url (@ARGV) {
-  die("Not an Archlinux repo") unless $url =~ /^(ht|f)tp:\/\/([^\/]*)\/?/;
+  die("Not an Archlinux repo") unless $url =~ /^(:?ftps?|https?):\/\/([^\/]*)\/?/;
   my $reponame = getreponame($url);
-  my $repoid = Digest::MD5::md5_hex("arch\@$url");
+  my $repoid = Digest::MD5::md5_hex($url);
   my $dir = "$cachedir/$repoid";
   $url .= '/' unless $url =~ /\/$/;
   getrepodb($url, $reponame, $dir);
index 48a6b465b87146e01977581746894fe170fc1087..fad84e5c4728c674f1e76a0a894829f06078a29b 100755 (executable)
@@ -26,6 +26,7 @@ my $opt_dump;
 my $opt_old;
 my $opt_nosrc;
 my $opt_bc;
+my $opt_zypp;
 my $cachedir = "/var/cache/build";
 
 my $old_seen = ();
@@ -205,31 +206,30 @@ sub primary_handle_package_end
   my $el = shift;
 
   if($opt_bc) {
-      printasbuildcachefile(@packages);
-      shift @packages;
+    printasbuildcachefile(@packages);
+    shift @packages;
   } elsif ($opt_old) {
-      foreach my $pkg (@packages) {
-    my $arch = $pkg->{'arch'};
-    $arch = 'src' if $pkg->{'arch'} eq 'nosrc';
-    next if ($arch eq 'src' && $opt_nosrc);
-    if(exists($old_seen->{$pkg->{'name'}}->{$arch})) {
+    foreach my $pkg (@packages) {
+      my $arch = $pkg->{'arch'};
+      $arch = 'src' if $pkg->{'arch'} eq 'nosrc';
+      next if ($arch eq 'src' && $opt_nosrc);
+      if (exists($old_seen->{$pkg->{'name'}}->{$arch})) {
        my $pv = $old_seen->{$pkg->{'name'}}->{$arch}->{'ver'};
        my $rv = $pkg->{'ver'}.'-'.$pkg->{'rel'};
        my $vv = Build::Rpm::verscmp($pv, $rv, 0);
-       if($vv < 0)
-       {
-      print $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'}."\n";
-      $old_seen->{$pkg->{'name'}}->{$arch}->{'ver'} = $pkg->{'ver'}.'-'.$pkg->{'rel'};
-      $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'} = $pkg->{'baseurl'} . $pkg->{'location'};
+       if ($vv < 0) {
+         print $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'}."\n";
+         $old_seen->{$pkg->{'name'}}->{$arch}->{'ver'} = $pkg->{'ver'}.'-'.$pkg->{'rel'};
+         $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'} = $pkg->{'baseurl'} . $pkg->{'location'};
        } else {
-      print $pkg->{'baseurl'} . $pkg->{'location'}."\n";
+         print $pkg->{'baseurl'} . $pkg->{'location'}."\n";
        }
-    } else {
+      } else {
        $old_seen->{$pkg->{'name'}}->{$arch}->{'ver'} = $pkg->{'ver'}.'-'.$pkg->{'rel'};
        $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'} = $pkg->{'baseurl'} . $pkg->{'location'};
-    }
       }
-      shift @packages;
+    }
+    shift @packages;
   }
 }
 
@@ -385,6 +385,7 @@ GetOptions (
     "nosrc"   => \$opt_nosrc,
     "dump"   => \$opt_dump,
     "old"   => \$opt_old,
+    "zypp=s"   => \$opt_zypp,
     "cachedir=s"  => \$cachedir,
     ) or exit(1);
 
@@ -400,30 +401,17 @@ my $p = new XML::Parser(
 #my $url = '/mounts/mirror/SuSE/ftp.suse.com/pub/suse/update/10.1/';
 for my $url (@ARGV) {
   my $dir;
-  if ($url =~ /^zypp:\/\/([^\/]*)\/?/) {
-    use Build::Zypp;
-    my $repo = Build::Zypp::parsecfg($1);
-    die "can't parse $1\n" unless $repo;
-    my $type = $repo->{'type'};
-    if($type eq 'rpm-md') {
-      my $name = $repo->{'name'};
-      $dir = "/var/cache/zypp/raw/$name/";
-      $baseurl = $url;
-      $baseurl .= '/' unless $baseurl =~ /\/$/;
-    } elsif ($type eq 'yast2') {
-      # XXX
-      exec ($INC[0].'/createyastdeps', $url);
-    } else {
-      die "unsupported repo type: $type\n";
-    }
-  } elsif ($url =~ /^http[s]?:\/\/([^\/]*)\/?/) {
+  if ($opt_zypp) {
+    $dir = $opt_zypp;
+    $dir .= '/' unless $dir =~ /\/$/;
+    $baseurl = $url;
+    $baseurl .= '/' unless $baseurl =~ /\/$/;
+  } elsif ($url =~ /^(?:ftps?|https?):\/\/([^\/]*)\/?/) {
     my $repoid = md5_hex($url);
     $dir = "$cachedir/$repoid/";
     $baseurl = $url;
     $baseurl .= '/' unless $baseurl =~ /\/$/;
     getmetadata($baseurl, $dir);
-  } elsif ($url =~ /^arch\@/) {
-    exec ("$INC[0]/createarchdeps", "--cachedir=$cachedir", substr($url, 5));
   } else {
     $dir = $url;
     $dir .= '/' unless $dir =~ /\/$/;
@@ -433,14 +421,15 @@ for my $url (@ARGV) {
   @primaryfiles = ();
   @cursor = ([undef, $repomdparser]);
 
-  $p->parsefile($dir . 'repodata/repomd.xml');
+  die("zypp repo $url is not up to date, please refresh first\n") unless -s "${dir}repodata/repomd.xml";
+  $p->parsefile("${dir}repodata/repomd.xml");
 
 #  print Dumper(\@primaryfiles);
 
-  foreach my $f (@primaryfiles) {
+  for my $f (@primaryfiles) {
     @cursor = ([undef, $primaryparser]);
 
-    my $u = $dir . $f->{'location'};
+    my $u = "$dir$f->{'location'}";
     if ($] > 5.007) {
        require Encode;
        utf8::downgrade($u);
@@ -451,9 +440,14 @@ for my $url (@ARGV) {
       $cached = 0 if exists($f->{'size'}) && $f->{'size'} != (-s _);
       $cached = 0 if !exists($f->{'size'}) && $u !~ /[0-9a-f]{32}-primary/;
     }
-    if ($url =~ /^http[s]?:\/\/([^\/]*)\/?/ and !$cached) {
-        if (system($INC[0].'/download', $dir . "repodata/", $baseurl . "repodata/" . basename($u))) {
-         die("download failed\n");
+    if (!$cached) {
+       die("zypp repo $url is not up to date, please refresh first\n") if $opt_zypp;
+       if ($url =~ /^(?:ftps?|https?):\/\/([^\/]*)\/?/) {
+           if (system($INC[0].'/download', $dir . "repodata/", $baseurl . "repodata/" . basename($u))) {
+             die("download failed\n");
+           }
+       } else {
+           die("inconsistent repodata in $url\n");
        }
     }
     my $fh;
index a17bd747861a0ee3be180e661b0ae072ad34c67c..43c83e7ba3dbb09f6305749a51de2eef4ac4412d 100755 (executable)
@@ -6,8 +6,12 @@ BEGIN {
 
 use Build;
 use Build::Susetags;
+use Getopt::Long;
+
 use strict;
 
+Getopt::Long::Configure("no_ignore_case");
+
 sub print_pkg($)
 {
   my $pkg = shift;
@@ -60,43 +64,30 @@ sub callback
   return 0;
 }
 
+### main
+
+my $opt_zypp;
+my $cachedir = "/var/cache/build";
+
+GetOptions (
+    "zypp=s"   => \$opt_zypp,
+    "cachedir=s"  => \$cachedir,
+    ) or exit(1);
+
 for my $url (@ARGV) {
   my $dir;
-  if ($url =~ /^zypp:\/\/([^\/]*)\/?/) {
-    use Build::Zypp;
-    my $repo = Build::Zypp::parsecfg($1);
-    die "can't parse $1\n" unless $repo;
-    die "only yast2 repos supported\n" unless $repo->{'type'} eq 'yast2';
-    my $name = $repo->{'name'};
-    $dir = "/var/cache/zypp/raw/$name/";
+  if ($opt_zypp) {
+    $dir = $opt_zypp;
   } else {
     $dir = $url;
   }
 
-# a really fucked up system
-#  if (-e $url."/yast/order") {
-#    if(open(F, '<', $url."/yast/order")) {
-#      my $found_products;
-#      while(<F>) {
-#        chomp;
-#        my ($a, $b) = split(/ /);
-#        $a =~ s/^\///;
-#        if(-e $url.$a)
-#        {
-#          push @ARGV, $url.$a;
-#          $found_products = 1;
-#          print STDERR "$url -> $url$a\n";
-#        }
-#      }
-#      close(F);
-#      next if $found_products;
-#    }
-#  }
-  # XXX: location is actually defined in content file
-  my $packages = $dir.'/suse/setup/descr/packages';
-  
+  $dir .= '/' unless $dir =~ /\/$/;
   $url .= '/' unless $url =~ /\/$/;
 
+  # XXX: use descrdir from content file
+  my $packages = $dir.'suse/setup/descr/packages';
+  
   my @order = ();
   my $pkgs = Build::Susetags::parse($packages,
     { 'Loc' => 'location', 'Prv' => 'provides', 'Req' => 'requires', 'Tim' => 'buildtime' },
diff --git a/createzyppdeps b/createzyppdeps
new file mode 100755 (executable)
index 0000000..9abf693
--- /dev/null
@@ -0,0 +1,67 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+  unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use strict;
+
+use Build::Zypp;
+use Getopt::Long;
+
+use strict;
+
+Getopt::Long::Configure("no_ignore_case");
+
+my $cachedir = "/var/cache/build";
+my $opt_listrepos;
+
+GetOptions(
+    "cachedir=s"  => \$cachedir,
+    "listrepos" => \$opt_listrepos,
+    ) or exit(1);
+
+if ($opt_listrepos) {
+  die("createzyppdeps --listrepos does not take an argument\n") if @ARGV;
+  opendir(D, "/etc/zypp/repos.d") || exit(0);
+  my @r = grep {!/^\./ && /.repo$/} readdir(D);
+  closedir D;
+  @r = sort @r;
+  for my $r (@r) {
+    open(F, '<', "/etc/zypp/repos.d/$r") || next;
+    my $reponame;
+    my $enabled;
+    while(<F>) {
+      chomp;
+      next if /^\s*#/;
+      s/\s+$//;
+      if (/^\[(.*)\]$/) {
+        print "$reponame\n" if defined($reponame) && $enabled;
+       $reponame = $1;
+       $enabled = undef;
+      } elsif (/enabled=\s*(\S+)/) {
+       $enabled = $1;
+      }
+    }
+    print "$reponame\n" if defined($reponame) && $enabled;
+    close F;
+  }
+  exit(0);
+}
+die("createzyppdeps needs exactly one argument\n") if @ARGV != 1;
+my $url = $ARGV[0];
+
+die("createzyppdeps argument must start with 'zypp://'\n") unless $url =~ /^zypp:\/\/([^\/]*)/;
+my $repo = Build::Zypp::parserepo($1);
+die("can't parse $1\n") unless $repo;
+
+my $type = $repo->{'type'};
+my $zyppcachedir = "/var/cache/zypp/raw/$repo->{'name'}";
+
+if($type eq 'rpm-md') {
+  exec ($INC[0].'/createrepomddeps', '--cachedir', $cachedir, '--zypp', $zyppcachedir, $url);
+} elsif ($type eq 'yast2') {
+  exec ($INC[0].'/createyastdeps', '--cachedir', $cachedir, '--zypp', $zyppcachedir, $url);
+} else {
+  die "unsupported repo type: $type\n";
+}
diff --git a/detect_architecture.sh b/detect_architecture.sh
deleted file mode 100644 (file)
index 6ac345e..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-source common_functions
-
-build_host_arch
-
-echo $BUILD_HOST_ARCH
-
index 9ac2bdf9a603f3705e86137c427930d804ad31ab..b0a7c1ffc3ffcce0e4d945a30596a80f8dee5d77 100755 (executable)
--- a/download
+++ b/download
@@ -24,11 +24,11 @@ my $ua = LWP::UserAgent->new(
 for my $url (@ARGV) {
   if ($url =~ /^zypp:\/\/([^\/]*)\/?/) {
     use Build::Zypp;
-    my $repo = Build::Zypp::parsecfg($1);
+    my $repo = Build::Zypp::parserepo($1);
     die "can't parse $1\n" unless $repo;
     die "missing url in repo ".$repo->{'name'}."\n" unless exists $repo->{'baseurl'};
     my $u = $repo->{'baseurl'};
-    $u .= '/' unless substr($u, -1, 1) eq '/';
+    $u .= '/' unless $u =~ /\/$/;
     $url =~ s/^zypp:\/\/[^\/]*\/*//;
     $url = URI->new($u.$url);
     if ($url->scheme eq 'dir') {
index 0051172ae69e4477b28df98ed32c8bc2894dd988..78bc238db565f37a664d6eb39a4ca1751a9fe348 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-echo "ERROR: the emulator.sh script got not changed to support your emulator!"
+echo "ERROR: the emulator.sh script needs to be changed to support your emulator!"
 exit 1
 
 
index 46ae1f27ba67fa2b7da90931d710a6c3faa2f5e5..48116d8bedcee43539f0a59120fdcb5b9425c427 100755 (executable)
@@ -8,7 +8,9 @@ use strict;
 
 use Build;
 
-my ($dist, $rpmdeps, $archs, $configdir, $useusedforbuild);
+my ($dist, $rpmdeps, $archs, $configdir, $useusedforbuild, $installonly, $noinstall);
+
+$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs';
 
 while (@ARGV)  {
   if ($ARGV[0] eq '--dist') {
@@ -56,17 +58,24 @@ while (@ARGV)  {
   }
   last;
 }
-$configdir = '.' unless defined $configdir;
+
 $archs = '' unless defined $archs;
 die("you must specfiy a depfile!\n") unless defined $rpmdeps;
 
-my @extradeps = grep {!/(^|\/)(?:PKGBUILD|_preinstallimage)$/ && !/\.(?:spec|dsc|kiwi)$/} @ARGV;
-my @specs = grep {/(^|\/)(?:PKGBUILD|_preinstallimage)$/ || /\.(?:spec|dsc|kiwi)$/} @ARGV;
-die("can only work with at most one spec\n") if @specs > 1;
-my $spec = $specs[0];
-
+# split args in recipe and pkgnames
+my $recipe;
+my @extradeps;
+for my $arg (@ARGV) {
+  my $buildtype = Build::recipe2buildtype($arg);
+  if ($buildtype) {
+    die("can only work with at most one recipe file\n") if defined $recipe;
+    $recipe = $arg;
+  } else {
+    push @extradeps, $arg;
+  }
+}
 my @archs = split(':', $archs);
-if ($spec =~ /(^|\/)PKGBUILD$/) {
+if ($recipe =~ /(^|\/)PKGBUILD$/) {
   push @archs, 'any' unless grep {$_ eq 'any'} @archs;
 } else {
   push @archs, 'noarch' unless grep {$_ eq 'noarch'} @archs;
@@ -193,8 +202,7 @@ for my $pack (keys %packs) {
 
 #######################################################################
 
-sub print_rpmlist
-{
+sub print_rpmlist {
   for (@_) {
     print "$_ $fn{$packs{$_}}\n";
     print "rpmid: $_:$ids{$packs{$_}}\n" if exists $ids{$packs{$_}};
@@ -203,12 +211,14 @@ sub print_rpmlist
   print "vminstall: @{$cf->{'vminstall'} || []}\n";
   print "runscripts: @{$cf->{'runscripts'} || []}\n";
   print "dist: $dist\n" if defined $dist;
+  print "installonly: $installonly\n" if defined $installonly;
+  print "noinstall: $noinstall\n" if defined $noinstall;
 }
 
 if ($useusedforbuild) {
-  die("Need a specfile/dscfile for --usedforbuild\n") unless defined $spec;
+  die("Need a recipe file for --usedforbuild\n") unless defined $recipe;
   local *F;
-  open(F, '<', $spec) || die("$spec: $!\n");
+  open(F, '<', $recipe) || die("$recipe: $!\n");
   my @usedforbuild;
   my @buildrequires;
   while(<F>) {
@@ -241,11 +251,12 @@ if ($useusedforbuild) {
 my ($packname, $packvers, $subpacks, @packdeps);
 $subpacks = [];
 
-if ($spec) {
-  my $d;
-  if ($spec =~ /\.kiwi$/) {
+if ($recipe) {
+  my $d = Build::parse($cf, $recipe) || {};
+  my $buildtype = Build::recipe2buildtype($recipe) || '';
+  $cf->{'type'} = $buildtype if $buildtype;
+  if ($buildtype eq 'kiwi') {
     # lets see if this is a product or image build
-    $d = Build::parse($cf, $spec) || {};
     my $type = $d->{'imagetype'} && $d->{'imagetype'}->[0] eq 'product' ? 'product' : 'image';
     my @kdeps;
     if ($type eq 'image') {
@@ -257,8 +268,6 @@ if ($spec) {
     }
     push @kdeps, grep {/^kiwi-.*:/} @{$d->{'deps'} || []};
     $d = { 'deps' => \@kdeps, 'subpacks' => [] };
-  } else {
-    $d = Build::parse($cf, $spec);
   }
   $packname = $d->{'name'};
   $packvers = $d->{'version'};
@@ -266,7 +275,7 @@ if ($spec) {
   @packdeps = @{$d->{'deps'} || []};
   if ($d->{'prereqs'}) {
     my %deps = map {$_ => 1} (@packdeps, @{$d->{'subpacks'} || []});
-    push @packdeps, grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}};
+    push @packdeps, '--directdepsend--', grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}};
   }
 }
 
@@ -282,6 +291,20 @@ if (!shift @bdeps) {
   exit(1);
 }
 
+my @sysdeps = Build::get_sysbuild($cf);
+if (@sysdeps) {
+  if (!shift @sysdeps) {
+    print STDERR "expansion error\n";
+    print STDERR "  $_\n" for @sysdeps;
+    exit(1);
+  }
+  my %sysdeps = map {$_ => 1} @sysdeps;
+  my %bdeps = map {$_ => 1} @bdeps;
+  $installonly = join(' ', grep {!$bdeps{$_}} @sysdeps);
+  $noinstall = join(' ', grep {!$sysdeps{$_}} @bdeps);
+  @bdeps = Build::unify(@sysdeps, @bdeps);
+}
+
 # make sure all preinstalls are in bdeps;
 # XXX: also add vmdeps?
 @bdeps = Build::unify(@bdeps, Build::get_preinstalls($cf));
index f46ffc14ab614899b4ab5b399416e90f506887e6..7483ab7b0bb3f11590e4543cbdc739efecd72aa5 100755 (executable)
@@ -6,6 +6,7 @@ use strict;
 my $bufsize = 4*1024*1024;
 
 my ($opt_skip, $opt_disk, $opt_input, $opt_verbose);
+$opt_verbose = 0;
 
 while (@ARGV)  {
   if ($ARGV[0] eq '--skip') {
@@ -25,7 +26,7 @@ while (@ARGV)  {
   }
   if ($ARGV[0] eq '--verbose' || $ARGV[0] eq '-v') {
     shift @ARGV;
-    $opt_verbose = 1;
+    $opt_verbose++;
     next;
   }
   last;
@@ -35,51 +36,86 @@ die "need to specify disk image\n" unless $opt_disk;
 
 open(F, '<', $opt_disk) || die "$opt_disk: $!\n";
 
-if($opt_input) {
+if ($opt_input) {
   open(S, '<', $opt_input) || die "$opt_input: $!\n";
 } else {
   open(S, '<&STDIN') || die "can't dup stdin: $!\n";
 }
 
 # skip build status
-if($opt_skip) {
-  seek(S, $opt_skip, 0) || die "$!\n";
+if ($opt_skip) {
+  seek(S, $opt_skip, 0) || die "seek: $!\n";
 }
 
-while(<S>) {
+my %done;
+while (<S>) {
   chomp;
   last unless length $_;
-  my ($file, $filesize, $blksize, @blocks) = split(/ /);
-  if($#blocks == -1 && $filesize) {
-    die "invalid input '$_'\n";
+  my ($filetype, $file, $filesize, $blksize, @blocks) = split(/ /);
+  die("invalid input '$_'\n") unless defined($file);
+  $file =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge;
+  die("bad file '$file'\n") if "/$file/" =~ /\/\.{0,2}\//s;
+  if ($file =~ /^(.*)\//s) {
+    die("file without directory: $file\n") unless $done{$1} && $done{$1} eq 'd';
   }
+  if ($filetype eq 'd') {      # dir
+    print "$file\n" if $opt_verbose && $opt_verbose > 1;
+    mkdir($file) || die("mkdir $file: $!\n");
+    $done{$file} = 'd';
+    next;
+  }
+  if ($filetype eq 'l') {      # symlink
+    my $target = $filesize;
+    die("symlink without target\n") unless defined $target;
+    $target =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge;
+    die("bad symlink: $target\n") if "/$target/" =~ /\/\.?\//s;
+    if ("/$target/" =~ /^(\/\.\.)+\/(.*?)$/s) {
+      my ($head, $tail) = ($1, $2);
+      die("bad upref in symlink: $target\n") if "/$tail/" =~ /\/\.\.\//s;
+      die("bad upref in symlink: $target\n") if ($head =~ y!/!!) > ($file =~ y!/!!);
+    } else {
+      die("bad upref in symlink: $target\n") if "/$target/" =~ /\/\.\.\//s;
+    }
+    print "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//);
+    symlink($target, $file) || die("symlink $target $file: $!\n");
+    $done{$file} = 'l';
+    next;
+  }
+  die("illegal file type: $filetype\n") unless $filetype eq 'f';
+  die "invalid input '$_'\n" if !@blocks && $filesize;
+  $done{$file} = 'f';
   $filesize = int($filesize);
+  if ($filesize == 0) {
+    print "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//);
+    open (O, '>', $file) or die "$file: $!\n";
+    close O;
+    next;
+  }
   $blksize = int($blksize);
-  die "invalid block size" unless ($blksize > 0 && $blksize <= $bufsize);
+  die "$file: invalid block size $blksize\n" unless $blksize > 0 && $blksize <= $bufsize;
   my $maxblocks = int($bufsize/$blksize);
-  $file =~ s/.*\///; # ensure basename, also stops directory traversal
-  $file =~ s/[^[:print:]]/_/g; # no binary junk in file names
-  print "$file\n" if $opt_verbose;
-  open (O, '>', $file) or die "$file: $!";
+  print "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//);
+  open (O, '>', $file) or die "$file: $!\n";
   for my $block (@blocks) {
-    my ($block, $end) = split(/-/, $block);
+    my $end;
+    ($block, $end) = split(/-/, $block);
     $block = int($block);
-
-    if($block == 0) { # a hole!
-      seek(O, $blksize, 1);
-      $filesize -= $blksize;
+    if ($block == 0) { # a hole!
+      $end = (($end || 0) + 1) * $blksize;
+      $end = $filesize if $end > $filesize;
+      seek(O, $end, 1);
+      $filesize -= $end;
       next;
     }
-
     $end = $block unless $end;
     $end = int($end);
     seek(F, $block*$blksize, 0) || die "$file: seek: $!\n";
-    while($block <= $end && $filesize) {
+    while ($block <= $end && $filesize) {
       my $size;
-      if($end == $block) {
+      if ($end == $block) {
        $size = $blksize;
        ++$block;
-      } elsif($maxblocks >= $end-$block) {
+      } elsif ($maxblocks >= $end-$block) {
        $size = ($end-$block)*$blksize;
        $block += $end-$block;
       } else {
@@ -88,14 +124,12 @@ while(<S>) {
       }
       $size = $filesize if $size > $filesize;
       my $buf;
-      if((sysread(F, $buf, $size) || 0) != $size) {
-       die "$file: read: $!\n";
-      }
+      (sysread(F, $buf, $size) || 0) == $size || die("$file: read: $!\n");
       $filesize -= $size;
-      print O $buf;
+      (syswrite(O, $buf) || 0) == length($buf) || die("$file: write error\n");
     }
   }
-  close O;
+  close(O) || die("$file: close error: $!\n");
   # sanity check
   die "$file: invalid file size ($filesize byes left)\n" if $filesize != 0;
 }
diff --git a/getchangetarget b/getchangetarget
deleted file mode 100755 (executable)
index c9e51a1..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/perl -w
-
-BEGIN {
-  unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
-}
-
-use strict;
-
-use Build;
-
-my ($dist, $archs, $configdir);
-
-while (@ARGV)  {
-  if ($ARGV[0] eq '--dist') {
-    shift @ARGV;
-    $dist = shift @ARGV;
-    next;
-  }
-  if ($ARGV[0] eq '--archpath') {
-    shift @ARGV;
-    $archs = shift @ARGV;
-    next;
-  }
-  if ($ARGV[0] eq '--configdir') {
-    shift @ARGV;
-    $configdir = shift @ARGV;
-    next;
-  }
-  last;
-}
-
-die("Usage: getchangetarget --dist <dist> --archpath <archpath> [--configdir <configdir>]\n") if @ARGV;
-
-my $cf = Build::read_config_dist($dist, $archs, $configdir);
-print "$cf->{'target'}\n" if $cf->{'target'};
diff --git a/getmacros b/getmacros
deleted file mode 100755 (executable)
index d15af57..0000000
--- a/getmacros
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/perl -w
-
-BEGIN {
-  unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
-}
-
-use Build;
-use strict;
-
-my ($dist, $configdir, $archs);
-
-while (@ARGV)  {
-  if ($ARGV[0] eq '--dist') {
-    shift @ARGV;
-    $dist = shift @ARGV;
-    next;
-  }
-  if ($ARGV[0] eq '--archpath') {
-    shift @ARGV;
-    $archs = shift @ARGV;
-    next;
-  }
-  if ($ARGV[0] eq '--configdir') {
-    shift @ARGV;
-    $configdir = shift @ARGV;
-    next;
-  }
-  last;
-}
-die("Usage: getmacros --dist <dist> [--configdir <configdir>]\n") if @ARGV;
-my $cf = Build::read_config_dist($dist, $archs, $configdir);
-print $cf->{'rawmacros'} if exists $cf->{'rawmacros'};
-exit(0);
diff --git a/getoptflags b/getoptflags
deleted file mode 100755 (executable)
index 8031bf9..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/usr/bin/perl -w
-
-BEGIN {
-  unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
-}
-
-use strict;
-
-use Build;
-
-my ($dist, $archs, $configdir, $debug);
-
-while (@ARGV)  {
-  if ($ARGV[0] eq '--dist') {
-    shift @ARGV;
-    $dist = shift @ARGV;
-    next;
-  }
-  if ($ARGV[0] eq '--archpath') {
-    shift @ARGV;
-    $archs = shift @ARGV;
-    next;
-  }
-  if ($ARGV[0] eq '--configdir') {
-    shift @ARGV;
-    $configdir = shift @ARGV;
-    next;
-  }
-  if ($ARGV[0] eq '--debug') {
-    shift @ARGV;
-    $debug = 1;
-    next;
-  }
-  last;
-}
-
-die("Usage: getoptflags --dist <dist> --archpath <archpath> [--configdir <configdir>]\n") if @ARGV;
-
-my $cf = Build::read_config_dist($dist, $archs, $configdir);
-exit 0 unless $cf->{'optflags'};
-my $all = $cf->{'optflags'}->{'*'};
-$all = defined($all) && $all ne '' ? " $all" : '';
-$all .= " -g" if $debug;
-for (sort keys %{$cf->{'optflags'}}) {
-  next if $_ eq '*';
-  print "optflags: $_ $cf->{'optflags'}->{$_}$all\n";
-}
diff --git a/gettype b/gettype
deleted file mode 100755 (executable)
index 1ceb746..0000000
--- a/gettype
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/perl -w
-
-BEGIN {
-  unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
-}
-
-use strict;
-
-use Build;
-
-my ($dist, $archs, $configdir, $debug);
-
-while (@ARGV)  {
-  if ($ARGV[0] eq '--dist') {
-    shift @ARGV;
-    $dist = shift @ARGV;
-    next;
-  }
-  if ($ARGV[0] eq '--archpath') {
-    shift @ARGV;
-    $archs = shift @ARGV;
-    next;
-  }
-  if ($ARGV[0] eq '--configdir') {
-    shift @ARGV;
-    $configdir = shift @ARGV;
-    next;
-  }
-  last;
-}
-
-die("Usage: gettype --dist <dist> --archpath <archpath> [--configdir <configdir>]\n") if @ARGV;
-
-my $cf = Build::read_config_dist($dist, $archs, $configdir);
-exit 0 unless $cf->{'binarytype'};
-print "$cf->{'binarytype'}\n";
index ff0bdddfa9116fb5257be92911ad7d43a702e601..9fec7aa13415466bdf949cc54eede171036cf624 100755 (executable)
 # needed globals variables
 #
 export SRC
-export YAST_IS_RUNNING="instsys"
-export DEBIAN_FRONTEND=noninteractive
-export DEBIAN_PRIORITY=critical
 export BUILD_DIR=${BUILD_DIR:-/usr/lib/build}
+
+export YAST_IS_RUNNING=instsys
+
+# slurp in package binary support
+. "$BUILD_DIR/build-pkg"
+
 # need to restore build root owner for non-root builds
 browner=0
 definesnstuff=()
@@ -24,22 +27,18 @@ repos=()
 
 . $BUILD_DIR/common_functions || exit 1
 
-# should RPMs be installed with --force ?
-USE_FORCE=false
-
 BUILD_IS_RUNNING=$BUILD_ROOT/not-ready
 TMPFILE=$BUILD_ROOT/tmpfile
-#buildhost removed so that id can be generated from repo files
-#RPMIDFMT="%{NAME}-%{VERSION}-%{RELEASE} %{BUILDHOST}-%{BUILDTIME}\n"
-RPMIDFMT="%{NAME}-%{VERSION}-%{RELEASE} %{BUILDTIME}\n"
 
+# should RPMs be installed with --force ?
+USE_FORCE=false
 PREPARE_VM=
-USE_SYSTEM_QEMU=
 USEUSEDFORBUILD=
 LIST_STATE=
 RPMLIST=
 CLEAN_BUILD=
 CREATE_BUILD_BINARIES=
+CACHE_DIR=/var/cache/build
 
 while test -n "$1" ; do
     case "$1" in
@@ -47,10 +46,6 @@ while test -n "$1" ; do
            shift
            PREPARE_VM=true
            ;;
-       --use-system-qemu)
-           shift
-           USE_SYSTEM_QEMU=true
-           ;;
        --create-build-binaries)
            shift
            CREATE_BUILD_BINARIES=true
@@ -75,12 +70,12 @@ while test -n "$1" ; do
            ;;
        --repository|--repo)
            repos[${#repos[@]}]="$2";
-           shift 2;
+           shift 2
            ;;
        --clean)
            CLEAN_BUILD="$1"
            shift
-       ;;
+           ;;
        --cachedir)
            CACHE_DIR="$2"
            shift 2
@@ -100,8 +95,7 @@ PKGS=("$@")
 # needed functions
 #
 
-cleanup_and_exit()
-{
+cleanup_and_exit() {
     trap EXIT
     test "$BUILD_ROOT" = / -a -n "$browner" && chown "$browner" "$BUILD_ROOT"
     # umount so init_buildsystem can be used standalone
@@ -113,31 +107,33 @@ cleanup_and_exit()
     exit ${1:-0}
 }
 
-clean_build_root()
-{
-       test -n "$BUILD_ROOT" && {
-           umount -n "$BUILD_ROOT/proc/sys/fs/binfmt_misc" 2> /dev/null || true
-           umount -n "$BUILD_ROOT/proc" 2> /dev/null || true
-           umount -n "$BUILD_ROOT/dev/pts" 2> /dev/null || true
-           umount -n "$BUILD_ROOT/mnt" 2> /dev/null || true
-           rm -rf -- "$BUILD_ROOT"/*
-           rm -rf -- "$BUILD_ROOT/.build"
-           rm -rf -- "$BUILD_ROOT/.root"
-           rm -rf -- "$BUILD_ROOT/.init_b_cache"
-           rm -rf -- "$BUILD_ROOT/.preinstall_image/*"
-           rm -rf -- "$BUILD_ROOT/.preinstallimage"*
-           mkdir -p "$BUILD_ROOT/proc"
-           mkdir -p "$BUILD_ROOT/dev/pts"
-           if [ "$UID" = '0' ]; then
-                   mount -n -tproc none "$BUILD_ROOT/proc"
-                   mount -n -tdevpts -omode=0620,gid=5 none "$BUILD_ROOT/dev/pts"
-           fi
-       }
+clean_build_root() {
+    if test -n "$BUILD_ROOT" ; then
+       umount -n "$BUILD_ROOT/proc/sys/fs/binfmt_misc" 2> /dev/null || true
+       umount -n "$BUILD_ROOT/proc" 2> /dev/null || true
+       umount -n "$BUILD_ROOT/dev/pts" 2> /dev/null || true
+       umount -n "$BUILD_ROOT/dev/shm" 2> /dev/null || true
+       umount -n "$BUILD_ROOT/mnt" 2> /dev/null || true
+       rm -rf -- "$BUILD_ROOT"/* 2> /dev/null || true
+       chattr -a -A -i -R -- "$BUILD_ROOT" 2> /dev/null || true
+       rm -rf -- "$BUILD_ROOT"/*
+       rm -rf -- "$BUILD_ROOT/.build"
+       rm -rf -- "$BUILD_ROOT"/.build.kernel.*
+       rm -rf -- "$BUILD_ROOT"/.build.initrd.*
+       rm -rf -- "$BUILD_ROOT/.root"
+       rm -rf -- "$BUILD_ROOT/.init_b_cache"
+       rm -rf -- "$BUILD_ROOT"/.preinstall_image/*
+       rm -rf -- "$BUILD_ROOT"/.preinstallimage*
+       mkdir -p "$BUILD_ROOT/proc"
+       mkdir -p "$BUILD_ROOT/dev/pts"
+       if test "$UID" = 0 ; then
+           mount -n -tproc none "$BUILD_ROOT/proc"
+           mount -n -tdevpts -omode=0620,gid=5 none "$BUILD_ROOT/dev/pts"
+       fi
+    fi
 }
 
-
-unsafe_preinstall_check()
-{
+unsafe_preinstall_check() {
     # cpio isn't safe so we require bsdtar for VMs. chroot is
     # unsafe anyways so it's ok for that.
     if test -n "$PREPARE_VM" ; then
@@ -147,22 +143,16 @@ unsafe_preinstall_check()
     fi
 }
 
-preinstall_image_filter()
-{
+preinstall_image_filter() {
     for PKG in "$@" ; do
        test -e "$BUILD_ROOT/.preinstall_image/$PKG" && continue
        echo $PKG
     done
 }
 
-preinstall_image()
-{
+preinstall_image() {
     check_exit
-    if test -n "$2" ; then
-       echo "unpacking preinstall image $2"
-    else
-       echo "unpacking preinstall image"
-    fi
+    echo "unpacking preinstall image${2:+ $2}"
     cd $BUILD_ROOT || cleanup_and_exit 1
     if test -x /usr/bin/bsdtar ; then
        TAR="/usr/bin/bsdtar -P --chroot --numeric-owner -x"
@@ -179,10 +169,10 @@ preinstall_image()
     rm -f "$BUILD_ROOT/.preinstallimage.unpack"
 }
 
-preinstall()
-{
+preinstall() {
+    local PKG="$1"
     check_exit
-    echo "preinstalling $1..."
+    echo "preinstalling $PKG..."
     cd $BUILD_ROOT || cleanup_and_exit 1
     if test -x /usr/bin/bsdtar ; then
        CPIO="/usr/bin/bsdtar -P --chroot -o --numeric-owner -x -f-"
@@ -192,118 +182,18 @@ preinstall()
        CPIO="cpio --extract --unconditional --preserve-modification-time --make-directories --no-absolute-filenames --quiet"
        TAR="tar -x"
     fi
-    if test -e "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" ; then
-       PAYLOADDECOMPRESS=cat
-       case `rpm -qp --nodigest --nosignature --qf "%{PAYLOADCOMPRESSOR}\n" "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm"` in
-           lzma) rpm --showrc | egrep 'PayloadIsLzma|_lzma' > /dev/null || PAYLOADDECOMPRESS="lzma -d" ;;
-           xz) rpm --showrc | egrep 'PayloadIsXz|_xz' > /dev/null || PAYLOADDECOMPRESS="xz -d" ;;
-       esac
-       if test "$PAYLOADDECOMPRESS" = "lzma -d" ; then
-           if ! lzma </dev/null >/dev/null 2>&1 ; then
-               test -f "$BUILD_DIR/lzmadec.sh" && PAYLOADDECOMPRESS="bash $BUILD_DIR/lzmadec.sh"
-           fi
-       fi
-       if test "$PAYLOADDECOMPRESS" = "xz -d" ; then
-           if ! xz </dev/null >/dev/null 2>&1 ; then
-               test -f "$BUILD_DIR/xzdec.sh" && PAYLOADDECOMPRESS="bash $BUILD_DIR/xzdec.sh"
-           fi
-       fi
-       if test "$PAYLOADDECOMPRESS" = cat ; then
-           rpm2cpio "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" | $CPIO
-       else
-           rpm2cpio "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" | $PAYLOADDECOMPRESS | $CPIO
-       fi
-       if test -e ".init_b_cache/scripts/$1.run" ; then
-           rpm -qp --nodigest --nosignature --qf "%{PREIN}" "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" > ".init_b_cache/scripts/$1.pre"
-           rpm -qp --nodigest --nosignature --qf "%{POSTIN}" "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" > ".init_b_cache/scripts/$1.post"
-           echo -n '(none)' > .init_b_cache/scripts/.none
-           cmp -s ".init_b_cache/scripts/$1.pre" .init_b_cache/scripts/.none && rm -f ".init_b_cache/scripts/$1.pre"
-           cmp -s ".init_b_cache/scripts/$1.post" .init_b_cache/scripts/.none && rm -f ".init_b_cache/scripts/$1.post"
-           rm -f .init_b_cache/scripts/.none
-       fi
-    elif test -e "$BUILD_ROOT/.init_b_cache/rpms/$1.deb" ; then
-       ar x "$BUILD_ROOT/.init_b_cache/rpms/$1.deb" control.tar.gz data.tar.gz
-       mkdir -p .init_b_cache/scripts/control
-       $TAR -C .init_b_cache/scripts/control -z -f control.tar.gz
-       $TAR -z -f data.tar.gz
-       if test -e ".init_b_cache/scripts/$1.run" ; then
-           test -e .init_b_cache/scripts/control/preinst && mv .init_b_cache/scripts/control/preinst ".init_b_cache/scripts/$1.pre"
-           test -e .init_b_cache/scripts/control/postinst && mv .init_b_cache/scripts/control/postinst ".init_b_cache/scripts/$1.post"
-       fi
-       rm -rf .init_b_cache/scripts/control control.tar.gz data.tar.gz
-    elif test -e "$BUILD_ROOT/.init_b_cache/rpms/$1.arch" ; then
-       $TAR -f "$BUILD_ROOT/.init_b_cache/rpms/$1.arch"
-       if test -f .INSTALL ; then
-           cat .INSTALL > ".init_b_cache/scripts/$1.post"
-           echo 'type post_install >/dev/null 2>&1 && post_install' >> ".init_b_cache/scripts/$1.post"
-       fi
-       rm -f .PKGINFO .INSTALL
-    else
-       echo "warning: package $1 does not exist"
-    fi
+    pkg_preinstall
 }
 
-run_pkg_scripts()
-{
+run_pkg_scripts() {
     chroot $BUILD_ROOT /sbin/ldconfig 2>/dev/null
     for PKG in $PACKAGES_TO_RUNSCRIPTS ; do
-       if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" ; then
-           echo "running $PKG preinstall script"
-           if test -e "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" ; then
-               chroot $BUILD_ROOT sh ".init_b_cache/scripts/$PKG.pre" 0
-           else
-               chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.pre" install < /dev/null
-           fi
-           rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre"
-       fi
-       if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" ; then
-           echo "running $PKG postinstall script"
-           if test -e "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" ; then
-               chroot $BUILD_ROOT sh ".init_b_cache/scripts/$PKG.post" 1
-           else
-               chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.post" configure '' < /dev/null
-           fi
-           rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post"
-       fi
+       pkg_runscripts
        check_exit
     done
 }
 
-init_db()
-{
-    if test $PSUF = rpm ; then
-       echo initializing rpm db...
-        if ! test -e $BUILD_ROOT/usr/lib/rpm/cpuinfo.yaml; then
-            # rpm v5 does not have initdb
-            # rpmdb --initdb is recommended and exists since SL9
-            if [ -x $BUILD_ROOT/usr/bin/rpmdb ]; then
-             chroot $BUILD_ROOT /usr/bin/rpmdb --initdb || cleanup_and_exit 1
-            else
-             chroot $BUILD_ROOT rpm --initdb || cleanup_and_exit 1
-            fi
-        fi
-       # hack: add nofsync to db config to speed up install
-       mkdir -p $BUILD_ROOT/root
-       DBI_OTHER=`chroot $BUILD_ROOT rpm --eval '%{?__dbi_other}'`
-       echo "%__dbi_other $DBI_OTHER nofsync" > $BUILD_ROOT/.rpmmacros
-       echo "%__dbi_other $DBI_OTHER nofsync" > $BUILD_ROOT/root/.rpmmacros
-    elif test $PSUF = deb ; then
-       # force dpkg into database to make epoch test work
-       if ! test "$BUILD_ROOT/.init_b_cache/rpms/dpkg.deb" -ef "$BUILD_ROOT/.init_b_cache/dpkg.deb" ; then
-           rm -f $BUILD_ROOT/.init_b_cache/dpkg.deb
-           cp $BUILD_ROOT/.init_b_cache/rpms/dpkg.deb $BUILD_ROOT/.init_b_cache/dpkg.deb || cleanup_and_exit 1
-       fi
-       chroot $BUILD_ROOT dpkg -i --force all .init_b_cache/dpkg.deb >/dev/null 2>&1
-    elif test $PSUF = arch ; then
-       mkdir -p $BUILD_ROOT/var/lib/pacman/sync
-       touch $BUILD_ROOT/var/lib/pacman/sync/core.db
-       touch $BUILD_ROOT/var/lib/pacman/sync/extra.db
-       touch $BUILD_ROOT/var/lib/pacman/sync/community.db
-    fi
-}
-
-reorder()
-{
+reorder() {
     test -z "$*" && return
     rm -f $BUILD_ROOT/.init_b_cache/order.manifest
     for PKG in "$@" ; do
@@ -313,12 +203,11 @@ reorder()
     rm -f $BUILD_ROOT/.init_b_cache/order.manifest
 }
 
-create_devs()
-{
+create_devs() {
     local com file mode arg
 
     mkdir -m 755 -p $BUILD_ROOT/dev/pts
-    test -f $BUILD_ROOT/dev/shm && rm -f $BUILD_ROOT/dev/shm
+    test -d $BUILD_ROOT/dev/shm || rm -f $BUILD_ROOT/dev/shm
     mkdir -m 755 -p $BUILD_ROOT/dev/shm
     while read com file mode arg ; do
        rm -f $BUILD_ROOT/dev/$file
@@ -348,16 +237,14 @@ DEVLIST
 
 # check whether the repo list contains a plain "zypp://". Add all
 # enabled zypp repos in this case
-maybe_add_all_zypp_repos()
-{
+expand_plain_zypp_repo() {
     local i j
     r=()
     for i in "${repos[@]}"; do
-       if [ "$i" = "zypp://" ]; then
-           while read j; do
-               j="${j#/etc/zypp/repos.d/}"
-               r=("${r[@]}" "zypp://${j%.repo}")
-           done < <(grep -l enabled=1 /etc/zypp/repos.d/*.repo)
+       if test "$i" = "zypp://" ; then
+           for j in $($BUILD_DIR/createzyppdeps --listrepos) ; do
+               r=("${r[@]}" "zypp://$j")
+           done
        else
            r=("${r[@]}" "$i")
        fi
@@ -365,25 +252,24 @@ maybe_add_all_zypp_repos()
     repos=("${r[@]}")
 }
 
-validate_cache_file()
-{
-    local findonly=''
-    maybe_add_all_zypp_repos
+create_cache_file() {
+    local findonly=
+    expand_plain_zypp_repo
     if ! test -f $CACHE_FILE || ! test -f $CACHE_FILE.id || \
        test "${repos[*]} ${BUILD_RPMS//:/ /}" != "$(cat $CACHE_FILE.id 2>/dev/null)"; then
        rm -f $CACHE_FILE.id
     else
        for SRC in "${repos[@]}" ${BUILD_RPMS//:/ /}; do
            test -n "$SRC" || SRC=.
-           if [ "${SRC#zypp://}" != "$SRC" ]; then
-               SRC="/var/cache/zypp/raw" # XXX can't use name here as we'd need to parse the file
+           if test "${SRC#zypp://}" != "$SRC" ; then
+               SRC="/var/cache/zypp/raw/${SRC#zypp://}"
            fi
            if test "$SRC" -nt $CACHE_FILE; then
                rm -f $CACHE_FILE.id
                break
            fi
            # always rebuild if we have remote repositories and --clean is given
-           if test -n "$CLEAN_BUILD" -a "$SRC" != "${SRC#*://}" ; then
+           if test -n "$CLEAN_BUILD" -a "$SRC" != "${SRC#*://}" -a "${SRC#zypp://}" = "$SRC" ; then
                rm -f $CACHE_FILE.id
                break
            fi
@@ -391,26 +277,45 @@ validate_cache_file()
     fi
     if ! test -f $CACHE_FILE.id ; then
        test -z "$LIST_STATE" && echo initializing $CACHE_FILE ...
+       BINTYPE=
+       if test -n "$BUILD_DIST" ; then
+           BINTYPE=`queryconfig binarytype --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"`
+           test "$BINTYPE" = UNDEFINED && BINTYPE=
+       fi
+       if test -z "$BINTYPE" ; then
+           # check the first init_buildsystem arg, maybe it is a recipe
+           case ${PKGS[0]} in
+               *.spec)
+                   BINTYPE=rpm ;;
+               *.dsc)
+                   BINTYPE=deb ;;
+               */PKGBUILD|PKGBUILD)
+                   BINTYPE=arch ;;
+           esac
+       fi
        for SRC in "${repos[@]}" -- ${BUILD_RPMS//:/ /}; do
            if test "$SRC" = '--' ; then
                findonly=1
                continue
            fi
            test -z "$SRC" && SRC=`pwd`
-           if [ "${SRC#zypp://}" != "$SRC" ]; then
-               set -- $BUILD_DIR/createrepomddeps "$SRC"
-           elif [ "${SRC#http://}" != "$SRC" -o "${SRC#https://}" != "$SRC" -o "${SRC#ftp://}" != "$SRC" -o "${SRC#ftps://}" != "$SRC" ]; then
+           if test "${SRC#http://}" != "$SRC" -o "${SRC#https://}" != "$SRC" -o "${SRC#ftp://}" != "$SRC" -o "${SRC#ftps://}" != "$SRC" ; then
+               # remote repo, cache binary packages
                mkdir -p "$(getcachedir "$SRC")"
-               set -- $BUILD_DIR/createrepomddeps --cachedir="$CACHE_DIR" "$SRC"
-           elif [ "${SRC#arch@http://}" != "$SRC" -o "${SRC#arch@https://}" != "$SRC" -o "${SRC#arch@ftp://}" != "$SRC" -o "${SRC#arch@ftps://}" != "$SRC" ]; then
-               mkdir -p "$(getcachedir "$SRC")"
-               set -- $BUILD_DIR/createrepomddeps --cachedir="$CACHE_DIR" "$SRC"
-           elif [ ! -e "$SRC" ]; then
+               if test "$BINTYPE" = arch ; then
+                   set -- $BUILD_DIR/createarchdeps --cachedir="$CACHE_DIR" "$SRC"
+               else
+                   set -- $BUILD_DIR/createrepomddeps --cachedir="$CACHE_DIR" "$SRC"
+               fi
+           elif test "${SRC#zypp://}" != "$SRC" ; then
+               # special zypp repo
+               set -- $BUILD_DIR/createzyppdeps --cachedir="$CACHE_DIR" "$SRC"
+           elif test ! -e "$SRC" ; then
                echo "*** $SRC does not exist" >&2
                cleanup_and_exit 1
-           elif [ -z "$findonly" -a \( -e "$SRC"/suse/setup/descr/packages -o -e "$SRC"/suse/setup/descr/packages.gz \) ]; then
+           elif test -z "$findonly" -a \( -e "$SRC"/suse/setup/descr/packages -o -e "$SRC"/suse/setup/descr/packages.gz \) ; then
                set -- $BUILD_DIR/createyastdeps "$SRC"
-           elif [ -z "$findonly" -a -e "$SRC"/repodata/repomd.xml ]; then
+           elif test -z "$findonly" -a -e "$SRC"/repodata/repomd.xml ; then
                set -- $BUILD_DIR/createrepomddeps "$SRC"
            else
                set -- $BUILD_DIR/createrpmdeps "$SRC"
@@ -425,22 +330,16 @@ validate_cache_file()
     fi
 }
 
-fail_exit()
-{
-  cleanup_and_exit 1
+fail_exit() {
+    cleanup_and_exit 1
 }
 
 # modifies $SRC
-downloadpkg()
-{
+downloadpkg() {
     local url="$1"
     local cachedir
 
-    if [ "${url:0:7}" == "zypp://" ] ; then
-       cachedir="/var/cache/zypp/packages/"
-       SRC="$cachedir${url#zypp://}"
-       mkdir -p "${SRC%/*}" || cleanup_and_exit 1
-    elif [ "${url:0:7}" == "http://" -o "${url:0:8}" == "https://" -o "${url:0:6}" == "ftp://" -o "${url:0:7}" == "ftps://" ] ; then
+    if test "${url:0:7}" == "zypp://" -o "${url:0:7}" == "http://" -o "${url:0:8}" == "https://" -o "${url:0:6}" == "ftp://" -o "${url:0:7}" == "ftps://" ; then
        cachedir="$(getcachedir "$url")"
        local name="$(basename "$url")"
        name=${name/%.pkg.tar.?z/.arch}
@@ -455,7 +354,7 @@ downloadpkg()
     echo "downloading $url ... ";
     $BUILD_DIR/download "$destdir" "$url" || cleanup_and_exit 1
     local destfile="$destdir/${url##*/}"
-    if [ ! -e "$destfile" ]; then
+    if test ! -e "$destfile" ; then
        echo "expected $destfile after download but it's missing" >&2
        cleanup_and_exit 1
     fi
@@ -472,19 +371,10 @@ downloadpkg()
     mv "$destfile" "$SRC" || cleanup_and_exit 1
 }
 
-getcachedir()
-{
+getcachedir() {
     local url=$1
-    case $url in
-      zypp://*)
-       url=${url#zypp:/}
-       echo "/var/cache/zypp/packages/${url%/*}"
-       return 0;
-       ;;
-      *.pkg.tar.?z) url="arch@$url" ;;
-    esac
     for repo in "${repos[@]}" ; do
-       if [ "${url:0:${#repo}}" == "$repo" -o "${url:0:${#repo}}" == "$repo" ] ; then
+       if test "${url:0:${#repo}}" == "$repo" ; then
            read repoid dummy < <(echo -n "$repo" | md5sum)
            echo "$CACHE_DIR/$repoid"
            break
@@ -492,33 +382,36 @@ getcachedir()
     done
 }
 
-get_pkg_filename()
-{
-    local url="$1"
-    local name=$(basename $url)
-    local cachedir=$(getcachedir $url)
-    local destfile="$cachedir/$name"
-    echo $destfile
+can_reuse_cached_package() {
+    local cachepkgid pkgid
+    test -s "$1" || return 1
+    # XXX verify for non-rpm types as well
+    if test -s "$BUILD_ROOT/.init_b_cache/rpms/$PKG.id" -a "${1%.rpm}" != "$1" ; then
+       pkgid=`rpm -qp --qf "$RPMIDFMT" $RPMCHECKOPTS_HOST "$1"`
+       read cachepkgid < $BUILD_ROOT/.init_b_cache/rpms/$PKG.id
+       test "$cachepkgid" = "$pkgid" || return 1
+    fi
+    return 0
 }
 
 set_build_arch
 
 trap fail_exit EXIT
 
-if [ "$BUILD_ROOT" = / ]; then
+if test "$BUILD_ROOT" = / ; then
     browner="$(stat -c %u /)"
 fi
 
-if [ -n "$CLEAN_BUILD" ]; then
+if test -n "$CLEAN_BUILD" ; then
     clean_build_root
 fi
 
 #
 # now test if there was an incomplete run
 #
-if test -e $BUILD_IS_RUNNING ; then
-    echo It seems that there was an incomplete setup of $BUILD_ROOT.
-    echo To be sure, we will build it again completely...
+if test -e "$BUILD_IS_RUNNING" ; then
+    echo "It seems that there was an incomplete setup of $BUILD_ROOT."
+    echo "To be sure, we will build it again completely..."
     umount -n $BUILD_ROOT/proc/sys/fs/binfmt_misc 2> /dev/null || true
     umount -n $BUILD_ROOT/proc 2> /dev/null
     umount -n $BUILD_ROOT/dev/pts 2> /dev/null
@@ -533,9 +426,12 @@ if test -e $BUILD_IS_RUNNING ; then
     echo -n "[y/N/c] "
     read ANSWER
     case "$ANSWER" in
-       c|C) rm -f $BUILD_IS_RUNNING ;;
-       y|Y) clean_build_root ;;
-       *) cleanup_and_exit 1 ;;
+       c|C)
+           rm -f $BUILD_IS_RUNNING ;;
+       y|Y)
+           clean_build_root ;;
+       *)
+           cleanup_and_exit 1 ;;
     esac
 fi
 
@@ -549,13 +445,14 @@ touch $BUILD_IS_RUNNING
 if test -n "$PREPARE_VM" ; then
     rm -f $BUILD_ROOT/.build/init_buildsystem.data
 fi
+
 if test -e $BUILD_ROOT/.build/init_buildsystem.data ; then
     # vm continuation
     . $BUILD_ROOT/.build/init_buildsystem.data
     if ! test -e $BUILD_ROOT/.init_b_cache/preinstall_finished ; then
        # finish preinstall
        run_pkg_scripts
-       init_db
+       pkg_initdb
        touch $BUILD_ROOT/.init_b_cache/preinstall_finished
     fi
 else
@@ -570,7 +467,7 @@ else
        # create rpmdeps file
        #
        CACHE_FILE=$BUILD_ROOT/.srcfiles.cache
-       validate_cache_file
+       create_cache_file
 
        #
        # select and expand packages
@@ -599,28 +496,30 @@ else
     fi
 
     #
-    # register the QEMU emulator
+    # register the QEMU emulator if needed
+    # (we do not need this for the prepare step, as we do not run scripts in this case)
     #
-    if check_use_emulator; then
-           echo "registering binfmt handlers for VM"
-
-           if [ -x "$BUILD_DIR/initvm.`uname -m`" -a -e "$BUILD_DIR/qemu-reg" ]; then
-               $BUILD_DIR/initvm.`uname -m`
-           else
-               echo "Warning: could not register binfmt handlers. Neither build-initvm nor /usr/sbin/qemu-binfmt-conf.sh exist"
-           fi
-
+    if test -z "$PREPARE_VM" ; then
+       if check_use_emulator ; then
+           echo "registering binfmt handlers for cross build"
+           "$BUILD_DIR/$INITVM_NAME"
            echo 0 > /proc/sys/vm/mmap_min_addr
            read mmap_min_addr < /proc/sys/vm/mmap_min_addr
-           if [ "$mmap_min_addr" != 0 ]; then
-               echo "Warning: mmap_min_addr is != 0. If programs fail at mmap this could be the reason"
+           if test "$mmap_min_addr" != 0 ; then
+               echo "Warning: mmap_min_addr is != 0. If programs fail at mmap this could be the reason."
            fi
+       fi
     fi
 
+    #
+    # extract the data from the (generated) rpm list
+    #
     PACKAGES_TO_INSTALL=
     PACKAGES_TO_PREINSTALL=
     PACKAGES_TO_RUNSCRIPTS=
     PACKAGES_TO_VMINSTALL=
+    PACKAGES_TO_INSTALLONLY=
+    PACKAGES_TO_NOINSTALL=
     PREINSTALL_IMAGE=
     PREINSTALL_IMAGE_SOURCE=
     RUNSCRIPTS_SEEN=
@@ -637,6 +536,14 @@ else
            PACKAGES_TO_VMINSTALL=$SRC
            continue
        fi
+       if test "$PKG" = "installonly:" ; then
+           PACKAGES_TO_INSTALLONLY=$SRC
+           continue
+       fi
+       if test "$PKG" = "noinstall:" ; then
+           PACKAGES_TO_NOINSTALL=$SRC
+           continue
+       fi
        if test "$PKG" = "preinstallimage:" ; then
            PREINSTALL_IMAGE=${SRC##*/}
            ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/${SRC##*/}"
@@ -669,7 +576,7 @@ else
            continue
        fi
        PACKAGES_TO_INSTALL="$PACKAGES_TO_INSTALL $PKG"
-       if [ "${SRC#/}" = "$SRC" ]; then
+       if test "${SRC#/}" = "$SRC" ; then
            case "$SRC" in
                zypp://* | http://* | https://* | ftp://* | ftps://*)
                    echo "$PKG $SRC" >>$BUILD_ROOT/.init_b_cache/rpmlist.download
@@ -685,32 +592,52 @@ else
        ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}"
     done < $RPMLIST
 
+    PACKAGES_TO_ALL="$PACKAGES_TO_INSTALL"
+    PACKAGES_TO_AVAILABLE="$PACKAGES_TO_INSTALL"
+
+    # subtract noinstall packages from PACKAGES_TO_INSTALL
+    if test -n "$PACKAGES_TO_NOINSTALL" ; then
+        settest=" $PACKAGES_TO_NOINSTALL "
+       PACKAGES_TO_INSTALL=
+       for PKG in $PACKAGES_TO_ALL ; do
+           test "$settest" = "${settest/ $PKG /}" && PACKAGES_TO_INSTALL="$PACKAGES_TO_INSTALL $PKG"
+       done
+    fi
+    # subtract installonly packages from PACKAGES_TO_AVAILABLE
+    if test -n "$PACKAGES_TO_INSTALLONLY" ; then
+        settest=" $PACKAGES_TO_INSTALLONLY "
+       PACKAGES_TO_AVAILABLE=
+       for PKG in $PACKAGES_TO_ALL ; do
+           test "$settest" = "${settest/ $PKG /}" && PACKAGES_TO_AVAILABLE="$PACKAGES_TO_AVAILABLE $PKG"
+       done
+    fi
+
     # check if we really can use cached versions for packages on the download list
     if test -s $BUILD_ROOT/.init_b_cache/rpmlist.download ; then
        rm -f $BUILD_ROOT/.init_b_cache/rpmlist.download2
+       rpm_set_checkopts
         while read PKG SRC ; do
            cachepkg="${SRC##*/}"
            cachepkg="${cachepkg/%.pkg.tar.?z/.arch}"
-           cachedir="$(getcachedir "$SRC")"
-           if test -s "$cachedir/$cachepkg" ; then
-               if test -s "$BUILD_ROOT/.init_b_cache/rpms/$PKG.id" -a "${SRC%.rpm}" != "$SRC" ; then
-                   PKGID=`rpm -qp --qf "$RPMIDFMT" $RPMCHECKOPTS_HOST "$cachedir/$cachepkg"`
-                   read cachepkgid < $BUILD_ROOT/.init_b_cache/rpms/$PKG.id
-                   if test "$cachepkgid" = "$PKGID" ; then
-                       SRC="$cachedir/$cachepkg"
-                   else
-                       rm -f "$cachedir/$cachepkg"
-                   fi
-               else
-                   $SRC="$cachedir/$cachepkg"
+           if test "$SRC" != "$SRC#zypp://" ; then
+               # for zypp packages also look in the zypp cache
+               cachedir="/var/cache/zypp/packages/${SRC#zypp://}"
+               cachedir="${cachedir%/*}"
+               if can_reuse_cached_package "$cachedir/$cachepkg" ; then
+                   SRCSUF=${SRC/%.pkg.tar.?z/.arch}
+                   ln -s "$cachedir/$cachepkg" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}"
+                   continue
                fi
            fi
-           if test "${SRC#/}" = "$SRC" ; then
-               echo "$PKG $SRC" >>$BUILD_ROOT/.init_b_cache/rpmlist.download2
-           else
+           cachedir="$(getcachedir "$SRC")"
+           if can_reuse_cached_package "$cachedir/$cachepkg" ; then
                SRCSUF=${SRC/%.pkg.tar.?z/.arch}
-               ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}"
+               ln -s "$cachedir/$cachepkg" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}"
+               continue
            fi
+           # not found in cache or cache has different package
+           rm -f "$cachedir/$cachepkg"
+           echo "$PKG $SRC" >>$BUILD_ROOT/.init_b_cache/rpmlist.download2
        done < $BUILD_ROOT/.init_b_cache/rpmlist.download
        rm -f $BUILD_ROOT/.init_b_cache/rpmlist.download
        test -s $BUILD_ROOT/.init_b_cache/rpmlist.download2 && mv $BUILD_ROOT/.init_b_cache/rpmlist.download2 $BUILD_ROOT/.init_b_cache/rpmlist.download
@@ -728,7 +655,7 @@ else
            ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}"
         done < $BUILD_ROOT/.init_b_cache/rpmlist.download
         rm -f $BUILD_ROOT/.init_b_cache/rpmlist.download
-        printf "\n"
+        echo
     fi
 
     # compatibility...
@@ -736,19 +663,8 @@ else
 
     echo "$GUESSED_DIST" > $BUILD_ROOT/.guessed_dist
     test -n "$BUILD_DIST" || BUILD_DIST="$GUESSED_DIST"
-    PSUF=`gettype --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"`
-    case "$PSUF" in
-       UNKNOWN|'')
-           # auto detect from packages
-           if test -n "$PREINSTALL_IMAGE" ; then
-               echo "cannot autodetect build type when using a preinstall image" >&2
-               cleanup_and_exit 1
-           fi
-           PSUF=rpm
-           test -e $BUILD_ROOT/.init_b_cache/rpms/dpkg.deb && PSUF=deb
-           test -e $BUILD_ROOT/.init_b_cache/rpms/pacman.arch && PSUF=arch
-           ;;
-    esac
+
+    pkg_set_type
 
     if test -n "$PREINSTALL_IMAGE" ; then
        for PKG in $PACKAGES_FROM_PREINSTALLIMAGE ; do
@@ -760,24 +676,12 @@ else
 fi
 
 #
-# now test if there is already a build dir.
+# test if we need to preinstall
 #
-if test ! -f $BUILD_ROOT/var/lib/rpm/packages.rpm -a ! -f $BUILD_ROOT/var/lib/rpm/Packages -a ! -e $BUILD_ROOT/.build/init_buildsystem.data ; then
-    mkdir -p $BUILD_ROOT/var/lib/rpm || cleanup_and_exit 1
-    mkdir -p $BUILD_ROOT/usr/src/packages/SOURCES || cleanup_and_exit 1
+if test ! -e $BUILD_ROOT/installed-pkg -a ! -e $BUILD_ROOT/.build/init_buildsystem.data ; then
     mkdir -p $BUILD_ROOT/etc || cleanup_and_exit 1
     mkdir -p $BUILD_ROOT/proc || cleanup_and_exit 1
     test -f $BUILD_ROOT/etc/HOSTNAME || hostname -f > $BUILD_ROOT/etc/HOSTNAME
-    if test $PSUF = deb ; then
-       mkdir -p $BUILD_ROOT/var/lib/dpkg
-       mkdir -p $BUILD_ROOT/var/log
-       mkdir -p $BUILD_ROOT/etc/default
-       :> $BUILD_ROOT/var/lib/dpkg/status
-       :> $BUILD_ROOT/var/lib/dpkg/available
-       :> $BUILD_ROOT/var/log/dpkg.log
-       :> $BUILD_ROOT/etc/ld.so.conf
-       :> $BUILD_ROOT/etc/default/rcS
-    fi
     for PKG in $PACKAGES_TO_RUNSCRIPTS ; do
        : > $BUILD_ROOT/.init_b_cache/scripts/$PKG.run
     done
@@ -795,7 +699,7 @@ if test ! -f $BUILD_ROOT/var/lib/rpm/packages.rpm -a ! -f $BUILD_ROOT/var/lib/rp
        progress_step PACKAGES_TO_PREINSTALL_FILTERED
        preinstall ${PKG##*/}
     done
-    printf "\n"
+    echo
     if test -n "$PREPARE_VM" ; then
         PACKAGES_TO_VMINSTALL_FILTERED=`reorder $PACKAGES_TO_VMINSTALL_FILTERED`
        progress_setup PACKAGES_TO_VMINSTALL_FILTERED
@@ -806,21 +710,24 @@ if test ! -f $BUILD_ROOT/var/lib/rpm/packages.rpm -a ! -f $BUILD_ROOT/var/lib/rp
     fi
     # for reorder
     check_exit
-    if [ -w /root ]; then
-           test -c $BUILD_ROOT/dev/null || create_devs
+    if test -w /root ; then
+       test -c $BUILD_ROOT/dev/null || create_devs
     fi
     test -e $BUILD_ROOT/etc/fstab || touch $BUILD_ROOT/etc/fstab
     test ! -e $BUILD_ROOT/etc/ld.so.conf -a -e $BUILD_ROOT/etc/ld.so.conf.in && cp $BUILD_ROOT/etc/ld.so.conf.in $BUILD_ROOT/etc/ld.so.conf
     if test -z "$PREPARE_VM" ; then
        run_pkg_scripts
-       init_db
+       pkg_initdb
        touch $BUILD_ROOT/.init_b_cache/preinstall_finished
     fi
+    # mark as preinstalled no longer needed
+    rm -rf "$BUILD_ROOT/installed-pkg"
+    mkdir -p "$BUILD_ROOT/installed-pkg"
 fi
 
 if test -n "$PREPARE_VM" ; then
     echo "copying packages..."
-    for PKG in $PACKAGES_TO_INSTALL ; do
+    for PKG in $PACKAGES_TO_ALL ; do
        rm -f $BUILD_ROOT/.init_b_cache/$PKG.$PSUF
        cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF $BUILD_ROOT/.init_b_cache/$PKG.$PSUF || cleanup_and_exit 1
        ln -s -f ../$PKG.$PSUF $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF
@@ -836,11 +743,13 @@ if test -n "$PREPARE_VM" ; then
     echo "PACKAGES_TO_RUNSCRIPTS='${PACKAGES_TO_RUNSCRIPTS//"'"/$Q}'" >> $BUILD_ROOT/.build/init_buildsystem.data
     # needed for continuation in xen/kvm with rpm-x86
     echo "PACKAGES_TO_PREINSTALL='${PACKAGES_TO_PREINSTALL//"'"/$Q}'" >> $BUILD_ROOT/.build/init_buildsystem.data
+    echo "PACKAGES_TO_AVAILABLE='${PACKAGES_TO_AVAILABLE//"'"/$Q}'" >> $BUILD_ROOT/.build/init_buildsystem.data
     echo "PSUF='$PSUF'" >> $BUILD_ROOT/.build/init_buildsystem.data
     rm -f $BUILD_IS_RUNNING
     cleanup_and_exit 0
 fi
 
+
 mkdir -p $BUILD_ROOT/proc
 mkdir -p $BUILD_ROOT/dev/pts
 mount -n -tproc none $BUILD_ROOT/proc 2>/dev/null || true
@@ -853,7 +762,7 @@ rm -rf "$BUILD_ROOT/.build.binaries"
 if test -n "$CREATE_BUILD_BINARIES" ; then
     echo "creating .build.binaries directory..."
     mkdir -p "$BUILD_ROOT/.build.binaries"
-    for PKG in $PACKAGES_TO_INSTALL ; do
+    for PKG in $PACKAGES_TO_AVAILABLE ; do
        test -L "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" || continue
        LPKG=`readlink -f "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF"`
        ln "$LPKG" "$BUILD_ROOT/.build.binaries/$PKG.$PSUF" 2>/dev/null
@@ -867,13 +776,7 @@ fi
 # get list and ids of already installed rpms
 #
 mkdir -p $BUILD_ROOT/.init_b_cache/alreadyinstalled
-if test -f $BUILD_ROOT/var/lib/rpm/packages.rpm -o -f $BUILD_ROOT/var/lib/rpm/Packages ; then
-    chroot $BUILD_ROOT rpm -qa --qf "%{NAME} $RPMIDFMT" | (
-       while read pp ii; do
-           echo "$ii" > "$BUILD_ROOT/.init_b_cache/alreadyinstalled/$pp"
-       done
-    )
-fi
+pkg_get_installed
 
 #
 # reorder packages (already done in vm continuation)
@@ -885,24 +788,6 @@ if ! test -e $BUILD_ROOT/.build/init_buildsystem.data ; then
     echo 'done'
 fi
 
-rpm_e()
-{
-    chroot $BUILD_ROOT rpm --nodeps -e $PKG 2>&1 | \
-    while read line; do
-       case "$line" in
-
-           r*failed:\ No\ such\ file\ or\ directory) ;;
-           error:\ failed\ to\ stat\ *:\ No\ such\ file\ or\ directory) ;;
-           error:\ *scriptlet\ failed*)
-               echo "$line"
-               echo "re-try deleting $PKG using --noscripts"
-               chroot $BUILD_ROOT rpm --nodeps --noscripts -e $PKG || true
-           ;;
-           *) echo "$line" ;;
-       esac
-    done
-}
-
 #
 # delete all packages we don't want
 #
@@ -919,7 +804,7 @@ for PKG in $BUILD_ROOT/.init_b_cache/todelete/* ; do
     PKG=${PKG##*/}
     test "$PKG" = "*" && continue
     echo "deleting $PKG"
-    rpm_e "$PKG"
+    pkg_erase
     check_exit
 done
 rm -rf "$BUILD_ROOT/.init_b_cache/todelete"
@@ -933,70 +818,14 @@ done
 rm -rf "$BUILD_ROOT/installed-pkg"
 mkdir -p "$BUILD_ROOT/installed-pkg"
 
-RPMCHECKOPTS=
-RPMCHECKOPTS_HOST=
-# on Fedora 10 rpmbuild is in a separate package so we need something else to
-# detect rpm4
-test -x $BUILD_ROOT/usr/bin/rpmquery && RPMCHECKOPTS="--nodigest --nosignature"
-test -x /usr/bin/rpmquery && RPMCHECKOPTS_HOST="--nodigest --nosignature"
-
 test -x $BUILD_ROOT/sbin/ldconfig && chroot $BUILD_ROOT /sbin/ldconfig 2>&1
 
-typeset -ri suse_version=$(chroot $BUILD_ROOT rpm --eval '%{?suse_version}' 2>/dev/null)
-typeset -i num cumulate=-1
-typeset -a CUMULATED_LIST=()
-typeset -a CUMULATED_PIDS=()
-typeset -a CUMULATED_HMD5=()
-
-DO_CUMULATE=
-if ((suse_version > 1220)) ; then
-    DO_CUMULATE=true
-fi
-
 MAIN_LIST="$PACKAGES_TO_INSTALL"
-test -n "$DO_CUMULATE" && MAIN_LIST="$MAIN_LIST CUMULATED"
 progress_setup MAIN_LIST
-for PKG in $MAIN_LIST; do
+for PKG in $MAIN_LIST ; do
     test -f $BUILD_ROOT/installed-pkg/$PKG && continue
     progress_step MAIN_LIST
 
-    case $PKG in
-    CUMULATED)
-       #
-       # Use the features of rpm which are reordering the list of packages to
-       # satisfy dependencies and the final execution of the %posttrans scriplets
-       #
-       echo "now installing cumulated packages"
-       ((cumulate < 0)) && continue
-       exec 4>$BUILD_ROOT/.init_b_cache/manifest
-       for ((num=0; num<=cumulate; num++)) ; do
-           echo ${CUMULATED_LIST[$num]} 1>&4
-           PKG=${CUMULATED_LIST[$num]##*/}
-           test "$BUILD_ROOT/.init_b_cache/rpms/$PKG" -ef "$BUILD_ROOT/${CUMULATED_LIST[$num]}" && continue
-           rm -f $BUILD_ROOT/${CUMULATED_LIST[$num]}
-           cp $BUILD_ROOT/.init_b_cache/rpms/$PKG $BUILD_ROOT/${CUMULATED_LIST[$num]} || cleanup_and_exit 1
-       done
-       exec 4>&-
-       chroot $BUILD_ROOT rpm --ignorearch --nodeps -Uh --oldpackage --ignoresize --verbose $RPMCHECKOPTS \
-               $ADDITIONAL_PARAMS .init_b_cache/manifest 2>&1 || touch $BUILD_ROOT/exit 
-       for ((num=0; num<=cumulate; num++)) ; do
-           rm -f $BUILD_ROOT/${CUMULATED_LIST[$num]}
-       done
-       rm -f .init_b_cache/manifest
-       check_exit
-       for ((num=0; num<=cumulate; num++)) ; do
-           PKG=${CUMULATED_LIST[$num]##*/}
-           echo "${CUMULATED_PIDS[$num]}" > $BUILD_ROOT/installed-pkg/${PKG%.rpm}
-           test -n "${CUMULATED_HMD5[$num]}" || continue
-           echo "${CUMULATED_HMD5[$num]} ${CUMULATED_PIDS[$num]}" > $BUILD_ROOT/.preinstall_image/${PKG%.rpm}
-       done
-       CUMULATED_LIST=()
-       CUMULATED_PIDS=()
-       CUMULATED_HMD5=()
-       let cumulate=-1
-       continue
-       ;;
-    esac
     if test -e "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" -a ! -s "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" ; then
        # preinstallimage package, make sure it's in the image
        if ! test -e $BUILD_ROOT/.preinstall_image/$PKG ; then
@@ -1008,6 +837,7 @@ for PKG in $MAIN_LIST; do
        echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG
        continue
     fi
+
     PKG_HDRMD5=
     if test -d $BUILD_ROOT/.preinstall_image ; then
        if ! test -e $BUILD_ROOT/.preinstall_image/$PKG ; then
@@ -1015,58 +845,11 @@ for PKG in $MAIN_LIST; do
            test -n "$PKG_HDRMD5" || cleanup_and_exit 1
        fi
     fi
-    test -L $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF || continue
 
-    if test $PSUF = deb ; then
-       # debian world, install deb files
-       if ! test "$BUILD_ROOT/.init_b_cache/rpms/$PKG.deb" -ef "$BUILD_ROOT/.init_b_cache/$PKG.deb" ; then
-           rm -f $BUILD_ROOT/.init_b_cache/$PKG.deb
-           cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.deb $BUILD_ROOT/.init_b_cache/$PKG.deb || cleanup_and_exit 1
-       fi
-       PKGID=`readlink $BUILD_ROOT/.init_b_cache/rpms/$PKG.deb`
-       PKGID="${PKGID##*/}"
-       PKGID="${PKGID%.deb} debian"
-       echo "installing ${PKGID%% *}"
-       ( chroot $BUILD_ROOT dpkg --install --force all .init_b_cache/$PKG.deb 2>&1 || touch $BUILD_ROOT/exit ) | \
-           perl -ne '$|=1;/^(Configuration file|Installing new config file|Selecting previously deselected|\(Reading database|Unpacking |Setting up|Creating config file|Preparing to replace dpkg)/||/^$/||print'
-       check_exit
-       echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG
-       test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG
-        # ugly workaround for upstart system. some packages (procps) try
-        # to start a service in their configure phase. As we don't have
-        # a running upstart, we just link the start binary to /bin/true
-       if test -e "$BUILD_ROOT/sbin/start"; then
-           if test "$BUILD_ROOT/sbin/start" -ef "$BUILD_ROOT/sbin/initctl" ; then
-               echo "linking /sbin/start to /bin/true"
-               mv "$BUILD_ROOT/sbin/start" "$BUILD_ROOT/sbin/start.disabled"
-               ln -s "/bin/true" "$BUILD_ROOT/sbin/start"
-           fi
-       fi
-       # another workaround, see bug bnc#733699
-       rm -f "$BUILD_ROOT/var/run/init.upgraded"
-       continue
-    fi
-
-    if test $PSUF = arch ; then
-       if ! test "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" -ef "$BUILD_ROOT/.init_b_cache/$PKG.$PSUF" ; then 
-           rm -f $BUILD_ROOT/.init_b_cache/$PKG.$PSUF
-           cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF $BUILD_ROOT/.init_b_cache/$PKG.$PSUF || cleanup_and_exit 1
-       fi
-       PKGID=`readlink $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF`
-       PKGID="${PKGID##*/}"
-       PKGID="${PKGID/%.pkg.tar.?z/.arch}"
-       PKGID="${PKGID%.arch} arch"
-       echo "installing ${PKGID%% *}"
-       # -d -d disables deps checking
-       ( chroot $BUILD_ROOT pacman -U --force -d -d --noconfirm .init_b_cache/$PKG.$PSUF 2>&1 || touch $BUILD_ROOT/exit ) | \
-           perl -ne '$|=1;/^(warning: could not get filesystem information for |loading packages|looking for inter-conflicts|Targets |Total Installed Size: |Net Upgrade Size: |Proceed with installation|checking package integrity|loading package files|checking available disk space|installing |upgrading |warning:.*is up to date -- reinstalling|Optional dependencies for|    )/||/^$/||print'
-       check_exit
-       echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG
-       test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG
-       continue
-    fi
+    test -L $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF || continue
 
-    if test -f $BUILD_ROOT/.init_b_cache/rpms/$PKG.id -a -f $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG ; then
+    # XXX?
+    if test "$VERIFY_BUILD_SYSTEM" != true -a -f $BUILD_ROOT/.init_b_cache/rpms/$PKG.id -a -f $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG ; then
        read PKGID < $BUILD_ROOT/.init_b_cache/rpms/$PKG.id
        read OLDPKGID < $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG
        if test "$PKGID" = "$OLDPKGID" ; then
@@ -1077,83 +860,47 @@ for PKG in $MAIN_LIST; do
        fi
     fi
 
-    PKGID=`rpm -qp --qf "$RPMIDFMT" $RPMCHECKOPTS_HOST $BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm`
+    pkg_set_packageid
 
     if test -f $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG ; then
        read OLDPKGID < $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG
        if test "$PKGID" != "$OLDPKGID" ; then
-           echo deleting unwanted ${OLDPKGID%% *}
-           rpm_e "$PKG"
-       elif test "$VERIFY_BUILD_SYSTEM" = true ; then
-           chroot $BUILD_ROOT rpm --verify $PKG 2>&1 | tee $TMPFILE
-           if grep ^missing $TMPFILE > /dev/null ; then
-               echo deleting incomplete ${PKGID%% *}
-               rpm_e "$PKG"
-           else
+           echo "deleting unwanted ${OLDPKGID%% *}"
+           pkg_erase
+       else
+           if test "$VERIFY_BUILD_SYSTEM" != true || pkg_verify_installed ; then
                #echo "keeping ${PKGID%% *}"
                echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG
                test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG
                continue
            fi
-       else
-           #echo "keeping ${PKGID%% *}"
-           echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG
-           test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG
-           continue
+           echo "deleting incomplete ${OLDPKGID%% *}"
+           pkg_erase
        fi
        if test -e "$BUILD_ROOT/.init_b_cache/preinstalls/$PKG" ; then
            preinstall "$PKG"
-           # call for rpm-4.x and not rpm-devel
-           test -z "${PKG##rpm-[0-9]*}" && chroot $BUILD_ROOT rpm --rebuilddb
-           # also exec for exchanged rpm !  naming is rpm-x86-<target>-<ver>
-           test -z "${PKG##rpm-x86-*[0-9]*}" && chroot $BUILD_ROOT rpm --rebuilddb
        fi
     fi
-    export ADDITIONAL_PARAMS=
-    if test "$USE_FORCE" = true ; then
-       export ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS --force"
-    fi
-    # FIXME: work around for cross-build installs, we must not overwrite the running rpm
-    if test "$PKG" = rpm ; then
-       for i in $BUILD_ROOT/.init_b_cache/preinstalls/rpm-x86-* ; do
-           test -e "$i" && ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS --justdb"
-       done
-    fi
-    if test -n "$DO_CUMULATE" -a "$ADDITIONAL_PARAMS" = "${ADDITIONAL_PARAMS%--justdb}"; then
+    
+    if pkg_cumulate ; then
        echo "cumulate ${PKGID%% *}"
-       let cumulate++
-       CUMULATED_LIST[$cumulate]=".init_b_cache/$PKG.rpm"
-       CUMULATED_PIDS[$cumulate]="$PKGID"
-       CUMULATED_HMD5[$cumulate]="$PKG_HDRMD5"
        continue
     fi
+    
     echo "installing ${PKGID%% *}"
-    if ! test "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" -ef "$BUILD_ROOT/.init_b_cache/$PKG.rpm" ; then
-       rm -f $BUILD_ROOT/.init_b_cache/$PKG.rpm
-       cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm $BUILD_ROOT/.init_b_cache/$PKG.rpm || cleanup_and_exit 1
+    if ! test "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" -ef "$BUILD_ROOT/.init_b_cache/$PKG.$PSUF" ; then
+       rm -f $BUILD_ROOT/.init_b_cache/$PKG.$PSUF
+       cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF $BUILD_ROOT/.init_b_cache/$PKG.$PSUF || cleanup_and_exit 1
     fi
-    ( chroot $BUILD_ROOT rpm --ignorearch --nodeps -U --oldpackage --ignoresize $RPMCHECKOPTS \
-               $ADDITIONAL_PARAMS .init_b_cache/$PKG.rpm 2>&1 || \
-         touch $BUILD_ROOT/exit ) | \
-             grep -v "^warning:.*saved as.*rpmorig$"
-    # delete link so package is only installed once
-    rm -f $BUILD_ROOT/.init_b_cache/$PKG.rpm
-    check_exit
+    pkg_install
+    rm -f $BUILD_ROOT/.init_b_cache/$PKG.$PSUF
+
     echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG
     test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG
 
 done
 
-if test $PSUF = deb ; then
-    echo "configuring all installed packages..."
-    # configure all packages after complete installation, not for each package like rpm does
-    # We need to run this twice, because of cyclic dependencies as it does not succeed on most
-    # debian based distros in the first attempt.
-    if ! chroot $BUILD_ROOT dpkg --configure --pending  2>&1; then
-       echo "first configure attempt failed, trying again..."
-       chroot $BUILD_ROOT dpkg --configure --pending  2>&1 || touch $BUILD_ROOT/exit
-    fi
-fi
+pkg_finalize
 
 # devices can vanish if devs got uninstalled
 test -c $BUILD_ROOT/dev/null || create_devs
@@ -1167,74 +914,23 @@ rm -f $BUILD_ROOT/etc/mtab
 cp /proc/mounts $BUILD_ROOT/etc/mtab
 chmod 644 $BUILD_ROOT/etc/mtab
 
-#
-# to be sure, path is set correctly, we have to source /etc/profile before
-# starting rpm.
-#
-# XXX
-#rm -f $BUILD_ROOT/bin/rpm.sh
-#cp $BUILD_LIBDIR/lib/rpm.sh $BUILD_ROOT/bin/rpm.sh
-#chmod 755 $BUILD_ROOT/bin/rpm.sh
-#test -f $BUILD_ROOT/bin/rpm -a ! -L $BUILD_ROOT/bin/rpm && \
-#    mv $BUILD_ROOT/bin/rpm $BUILD_ROOT/bin/rpm.bin
-#rm -f $BUILD_ROOT/bin/rpm
-#ln -s rpm.sh $BUILD_ROOT/bin/rpm
-
-#
-# some packages use uname -r to decide which kernel is used to build for.
-# this does not work in autobuild always.  Here is a wrapper script, that
-# gets Version from kernel sources.
-#
-# XXX
-#rm -f $BUILD_ROOT/bin/uname.sh
-#cp -v $BUILD_LIBDIR/lib/uname.sh $BUILD_ROOT/bin/uname.sh
-#chmod 755 $BUILD_ROOT/bin/uname.sh
-#test -f $BUILD_ROOT/bin/uname -a ! -L $BUILD_ROOT/bin/uname && \
-#    mv $BUILD_ROOT/bin/uname $BUILD_ROOT/bin/uname.bin
-#rm -f $BUILD_ROOT/bin/uname
-#ln -s uname.sh $BUILD_ROOT/bin/uname
-
-#
-# some distributions have a /etc/rpmrc or /etc/rpm/macros and some not.
-# make sure, that it is setup correctly.
-#
-# XXX
-#rm -f $BUILD_ROOT/etc/rpmrc
-#if test -e $BUILD_LIBDIR/lib/rpmrc.$BUILD_BASENAME ; then
-#    cp -v $BUILD_LIBDIR/lib/rpmrc.$BUILD_BASENAME $BUILD_ROOT/etc/rpmrc
-#elif test -e $BUILD_LIBDIR/lib/rpmrc ; then
-#    cp -v $BUILD_LIBDIR/lib/rpmrc $BUILD_ROOT/etc/rpmrc
-#fi
-
-# XXX
-#rm -f $BUILD_ROOT/etc/rpm/macros $BUILD_ROOT/etc/rpm/suse_macros
-#mkdir -p $BUILD_ROOT/etc/rpm
-#if test -e $BUILD_LIBDIR/lib/macros.$BUILD_BASENAME ; then
-#    cp -v $BUILD_LIBDIR/lib/macros.$BUILD_BASENAME $BUILD_ROOT/etc/rpm/macros
-#    cp -v $BUILD_LIBDIR/lib/macros.$BUILD_BASENAME $BUILD_ROOT/etc/rpm/suse_macros
-#elif test -e $BUILD_LIBDIR/lib/macros ; then
-#    cp -v $BUILD_LIBDIR/lib/macros $BUILD_ROOT/etc/rpm/macros
-#    cp -v $BUILD_LIBDIR/lib/macros $BUILD_ROOT/etc/rpm/suse_macros
-#fi
-
 #
 # make sure, that our nis is not present in the chroot system
 #
 test -e $BUILD_ROOT/etc/nsswitch.conf && {
-    echo removing nis flags from $BUILD_ROOT/etc/nsswitch.conf...
-    cat $BUILD_ROOT/etc/nsswitch.conf | sed -e"s:nis::g" > \
-       $BUILD_ROOT/etc/nsswitch.conf.tmp
+    echo "removing nis flags from $BUILD_ROOT/etc/nsswitch.conf..."
+    cat $BUILD_ROOT/etc/nsswitch.conf | sed -e"s:nis::g" > $BUILD_ROOT/etc/nsswitch.conf.tmp
     mv $BUILD_ROOT/etc/nsswitch.conf.tmp $BUILD_ROOT/etc/nsswitch.conf
 }
 
 #
-# creating some default directories
+# create some default directories and files
+#
 for DIR in /usr/share/doc/packages \
           /usr/X11R6/include/X11/pixmaps \
           /usr/X11R6/include/X11/bitmaps ; do
     mkdir -p $BUILD_ROOT/$DIR
 done
-
 for FILE in /var/run/utmp /var/log/wtmp /etc/fstab ; do
     mkdir -p $BUILD_ROOT/${FILE%/*}
     touch $BUILD_ROOT/$FILE
@@ -1245,24 +941,26 @@ if test -x $BUILD_ROOT/sbin/ldconfig ; then
        CHROOT_RETURN="`chroot $BUILD_ROOT /sbin/ldconfig 2>&1`"
        case "$CHROOT_RETURN" in
            *warning:*)
-             chroot $BUILD_ROOT /sbin/ldconfig
-             echo
-             echo chroot $BUILD_ROOT /sbin/ldconfig
-             echo
-             echo "$CHROOT_RETURN"
-             echo
-             echo "Problem with ldconfig.  It's better to reinit the build system..."
-             echo
-             cleanup_and_exit 1
-           ;;
+               chroot $BUILD_ROOT /sbin/ldconfig
+               echo
+               echo chroot $BUILD_ROOT /sbin/ldconfig
+               echo
+               echo "$CHROOT_RETURN"
+               echo
+               echo "Problem with ldconfig.  It's better to reinit the build system..."
+               echo
+               cleanup_and_exit 1
+               ;;
        esac
 fi
-if test -x $BUILD_ROOT/usr/sbin/Check && ! grep -q "/usr/sbin/Check is obsolete" $BUILD_ROOT/usr/sbin/Check; then
-  chroot $BUILD_ROOT /usr/sbin/Check
+
+if test -x $BUILD_ROOT/usr/sbin/Check && ! grep -q "/usr/sbin/Check is obsolete" $BUILD_ROOT/usr/sbin/Check ; then
+    chroot $BUILD_ROOT /usr/sbin/Check
 fi
 
 mkdir -p $BUILD_ROOT/var/adm/packages
 touch $BUILD_ROOT/var/adm/packages
+
 if test -x $BUILD_ROOT/sbin/SuSEconfig ; then
     if grep norestarts $BUILD_ROOT/sbin/SuSEconfig > /dev/null ; then
        chroot $BUILD_ROOT /sbin/SuSEconfig --norestarts --force
@@ -1282,7 +980,7 @@ done
 
 if test -e $BUILD_ROOT/usr/share/zoneinfo/UTC ; then
     for PROG in /usr/sbin/zic /usr/bin/zic /bin/zic /sbin/zic ; do
-        test -x $BUILD_ROOT/$PROG  && chroot $BUILD_ROOT $PROG -l UTC
+        test -x $BUILD_ROOT/$PROG  && chroot $BUILD_ROOT bash -c "$PROG -l $(readlink -f /usr/share/zoneinfo/UTC)"
     done
 fi
 
@@ -1296,26 +994,17 @@ if ! grep -F "127.0.0.1 $HOST" $BUILD_ROOT/etc/hosts > /dev/null ; then
     mv $BUILD_ROOT/etc/hosts.new $BUILD_ROOT/etc/hosts
 fi
 
+# XXX: still needed?
 if test -x $BUILD_ROOT/bin/rpm -a ! -f $BUILD_ROOT/var/lib/rpm/packages.rpm -a ! -f $BUILD_ROOT/var/lib/rpm/Packages ; then
-    echo "initializing rpm db..."
-    if [ -x $BUILD_ROOT/usr/bin/rpmdb ]; then
-      chroot $BUILD_ROOT /usr/bin/rpmdb --initdb || cleanup_and_exit 1
-    else
-      chroot $BUILD_ROOT rpm --initdb || cleanup_and_exit 1
-    fi
-    # create provides index
-    chroot $BUILD_ROOT rpm -q --whatprovides rpm >/dev/null 2>&1
+    pkg_initdb_rpm
+    chroot $BUILD_ROOT rpm -q --whatprovides rpm >/dev/null 2>&1       # create provides index
 fi
 
-# create modules.dep in kvm/xen
-# This can not work, until we use the native repository kernel
-#if [ $BUILD_ROOT = "/" -a -x /sbin/depmod ]; then
-#  /sbin/depmod -a
-#fi
-
 rm -f $BUILD_ROOT/.rpmmacros $BUILD_ROOT/root/.rpmmacros
 rm -rf "$BUILD_ROOT/.init_b_cache"
 rm -f $BUILD_IS_RUNNING
 rm -f $TMPFILE
 
 cleanup_and_exit 0
+
+# vim: set tabstop=8 softtabstop=4 shiftwidth=4 noexpandtab:
diff --git a/initscript_qemu_vm b/initscript_qemu_vm
deleted file mode 100755 (executable)
index be8d8b5..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash-static
-
-# from /usr/sbin/qemu-binfmt-conf.sh
-if [ ! -f /proc/sys ]; then
-  mount-static -n proc -t proc /proc
-fi
-if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then
-  mount-static -n binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
-fi
-# register arm, ppc, mips
-
-echo   ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:'             > /proc/sys/fs/binfmt_misc/register
-echo   ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb:'         > /proc/sys/fs/binfmt_misc/register
-
-echo   ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc:'             > /proc/sys/fs/binfmt_misc/register
-
-echo   ':mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips:'           > /proc/sys/fs/binfmt_misc/register
-echo   ':mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel:'       > /proc/sys/fs/binfmt_misc/register
-#echo   ':mipsn32:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mipsn32:'     > /proc/sys/fs/binfmt_misc/register
-#echo   ':mipsn32el:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsn32el:' > /proc/sys/fs/binfmt_misc/register
-#echo   ':mips64:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips64:'       > /proc/sys/fs/binfmt_misc/register
-#echo   ':mips64el:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mips64el:'   > /proc/sys/fs/binfmt_misc/register
-
-echo    ':sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4:' > /proc/sys/fs/binfmt_misc/register
-echo    ':sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb:' > /proc/sys/fs/binfmt_misc/register
-
-#exec /.build/build 
-/bin/bash-static /.build/build
index bed0cc4bb18631f65faa0e934708365e2d54d07b..55686ea514f0d96f7910e9f296cbfec60df39d98 100644 (file)
--- a/initvm.c
+++ b/initvm.c
@@ -20,6 +20,7 @@
  *
  * AUTHOR
  *     James Perkins <james.perkins@linuxfoundation.org>
+ *     Adrian Schroeter <adrian@suse.de>
  */
 
 #include <sys/mount.h>
@@ -177,7 +178,7 @@ enum okfail binfmt_register(char *datafile, char *regfile)
 
                if (buf[0] != ':')      /* non-data input line */
                {
-                       goto skip;
+                       continue;
                }
 
                /* copy buf and tokenize :-seperated fields into f[] */
@@ -200,22 +201,41 @@ enum okfail binfmt_register(char *datafile, char *regfile)
                {
                        fprintf(stderr, "%s: line %d: extra fields, ignoring."
                                " Content: %s", datafile, line, buf);
-                       goto skip;
+                       continue;
                }
 
                if (n < n_fields)
                {
                        fprintf(stderr, "%s: line %d: missing fields, ignoring."
                                " Content: %s", datafile, line, buf);
-                       goto skip;
+                       continue;
                }
 
+               int ret;
+                /* Is an interpreter for this arch already registered? */
+               snprintf(path, sizeof(path), SYSFS_BINFMT_MISC "/%s", f[name]);
+               ret=access(path, X_OK);
+                       fprintf(stderr, 
+                               "interpreter for '%s' is %d\n",
+                               f[name], ret);
+               if (ret == 0) {
+#ifdef DEBUG
+                       fprintf(stderr, 
+                               "interpreter for '%s' already registered, ignoring\n",
+                               f[name]);
+#endif /* DEBUG */
+                       continue;
+               }
 
-               if (access(f[interpreter], X_OK) != 0) {
+                /* Does the interpreter exists? */
+               ret=access(f[interpreter], X_OK);
+               if (ret != 0) {
+#ifdef DEBUG
                        fprintf(stderr, 
                                "%s: line %d: interpreter '%s' not found,"
-                               " ignoring\n", datafile, line, f[interpreter]);
-                       goto skip;
+                               " ignoring, return %d\n", datafile, line, f[interpreter], ret);
+#endif /* DEBUG */
+                       continue;
                }
 
                if (!write_file_string(regfile, buf)) {
@@ -238,9 +258,6 @@ enum okfail binfmt_register(char *datafile, char *regfile)
 
                DBG(fprintf(stderr, "dumping: %s\n", path));
                DBG(dump_file(path));
-
-skip:
-               ;
        }
 
 
@@ -327,7 +344,7 @@ int main(int argc, char* argv[], char* env[])
                        exit(1);
                }
                execve(BUILD, args, env);
-               perror("execve");
+               perror("execve of "BUILD);
                exit(1);
        }
 
diff --git a/livebuild_pre_run.template b/livebuild_pre_run.template
new file mode 100755 (executable)
index 0000000..d88dad6
--- /dev/null
@@ -0,0 +1,49 @@
+#!/bin/bash
+#
+# This is a template for a livebuild_pre_run script. These scripts are
+# executed by build_livebuild.sh in the chroot environment.
+#
+
+fix_debootstrap()
+{
+    # debootstrap in Debian 7.0 does not like dash
+
+    if [ -x /usr/sbin/debootstrap ] ; then
+       sed -i 's|^#!/bin/sh|#!/bin/bash|' /usr/sbin/debootstrap
+    fi
+}
+
+fix_lb_bootstrap_archive-keys()
+{
+    if [ -e /usr/lib/live/build/bootstrap_archive-keys ] ; then
+       sed -i '/apt-get update/{ s/^/#/ }' \
+           /usr/lib/live/build/bootstrap_archive-keys
+    fi
+}
+
+#
+# main
+#
+
+: ${TOPDIR:=/usr/src/packages}
+
+# Distribution and live-build specific hooks
+fix_debootstrap
+fix_lb_bootstrap_archive-keys
+
+# Expand configuration based on defaults
+cd $TOPDIR/LIVEBUILD_ROOT && lb config || exit 1
+
+# Replace all occurances of LB_MIRROR with local repository
+sed -i "s|^\(LB_MIRROR_[^=]\+=\).*|\1\"file:$TOPDIR/SOURCES/repos/\"|" \
+    $TOPDIR/LIVEBUILD_ROOT/config/bootstrap
+sed -i "s|^\(LB_PARENT_MIRROR_[^=]\+=\).*|\1\"file:$TOPDIR/SOURCES/repos/\"|" \
+    $TOPDIR/LIVEBUILD_ROOT/config/bootstrap
+
+# Prevent debootstrap from cleaning our cache
+sed -i 's|^\(LB_CACHE_PACKAGES=\).*|\1"false"|' \
+    $TOPDIR/LIVEBUILD_ROOT/config/common
+
+# Disable GPG checking
+sed -i 's|^\(LB_APT_SECURE=\).*|\1"false"|' \
+    $TOPDIR/LIVEBUILD_ROOT/config/common
index 1446ff0f16da5ad5626220dd5f6c3affaf7789bb..c7ce4fadac1da839a0736f09d99c191575bec3d0 100755 (executable)
@@ -529,8 +529,8 @@ sub handle_rpms {
   $arch = $res{'ARCH'}->[0];
   my @targets = get_targets($arch, $config);
   if (!@targets) {
-    print "no targets for arch $arch, nothing to do\n";
-    exit(0);
+    print "no targets for arch $arch, skipping $rname\n";
+    next;
   }
   for my $target (@targets) {
 
@@ -637,6 +637,7 @@ sub handle_rpms {
        delete $alldirs{"$prefix$fn"};
       }
     }
+    delete $alldirs{$_} for keys %symlinks;
     $ad = $prefix;
     delete $alldirs{$ad};
     delete $alldirs{$ad} while $ad =~ s/\/[^\/]+$//;
@@ -965,8 +966,8 @@ sub handle_debs {
     # line and get a list of target_arch-es
     my @targets = get_targets($arch, $config);
     if (!@targets) {
-      print "no targets for arch $arch, nothing to do\n";
-      return; # there may be more debs to handle
+      print "no targets for arch $arch, skipping $d_name\n";
+      next; # there may be more debs to handle
     }
 
     for my $target (@targets) {
diff --git a/order b/order
index 6682fd6d74b21a92357bf981807c6dbaa9f6c601..2236b465670a7e5f63c24147b0f8733d17e7beb4 100755 (executable)
--- a/order
+++ b/order
@@ -9,6 +9,7 @@ use strict;
 
 my ($dist, $archs, $configdir, $manifest);
 
+$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs';
 
 while (@ARGV)  {
   if ($ARGV[0] eq '--dist') {
index fe1eca51d25ca77aa1ab05ba66e19f986d6155b7..e18a7cd6d1b91576c6160c3462e0b355e83af42e 100644 (file)
--- a/qemu-reg
+++ b/qemu-reg
@@ -4,10 +4,11 @@
 
 # NOTE: this requires a qemu with the binfmt misc handler binary
 
-:aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-arm64-binfmt:P
+:aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-aarch64-binfmt:P
+:aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-arm64-binfmt:P
 :arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-binfmt:P
 :armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb-binfmt:P
-:ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc-binfmt:P
+:ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc-binfmt:P
 :mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips-binfmt:P
 :mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel-binfmt:P
 #:mipsn32:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mipsn32-binfmt:P
@@ -15,6 +16,6 @@
 #:mips64:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips64-binfmt:P
 #:mips64el:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mips64el-binfmt:P
 
-:sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4-binfmt:P
-:sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb-binfmt:P
+:sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4-binfmt:P
+:sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb-binfmt:P
 
diff --git a/queryconfig b/queryconfig
new file mode 100755 (executable)
index 0000000..f4d383c
--- /dev/null
@@ -0,0 +1,64 @@
+#!/usr/bin/perl -w
+
+BEGIN {
+  unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use strict;
+
+use Build;
+
+my ($dist, $archs, $configdir, $debug, $type, $argument);
+
+$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs';
+
+while (@ARGV)  {
+  if ($ARGV[0] eq '--dist') {
+    shift @ARGV;
+    $dist = shift @ARGV;
+    next;
+  } elsif ($ARGV[0] eq '--archpath') {
+    shift @ARGV;
+    $archs = shift @ARGV;
+    next;
+  } elsif ($ARGV[0] eq '--configdir') {
+    shift @ARGV;
+    $configdir = shift @ARGV;
+    next;
+  } elsif (defined($type)) {
+    $argument = shift @ARGV; 
+  } else {
+    $type = shift @ARGV;
+  }
+}
+
+die("Please specify what to query\n") unless defined $type;
+
+my $cf = Build::read_config_dist($dist, $archs, $configdir);
+die("Unable to read config\n") unless $cf;
+
+if ($type eq 'buildflags') {
+  die("Specify which buildflag to query\n") unless $argument;
+  my $result = $cf->{"buildflags:$argument"};
+  print "$result\n" if defined $result;
+} elsif ($type eq 'target' || $type eq 'type' || $type eq 'binarytype' || $type eq 'buildengine' || $type eq 'rawmacros') {
+  print "$cf->{$type}\n" if $cf->{$type};
+} elsif ($type eq 'optflags') {
+  exit(0) unless $cf->{'optflags'};
+  my $all = $cf->{'optflags'}->{'*'};
+  $all = defined($all) && $all ne '' ? " $all" : '';
+  $all .= " -g" if $argument && $argument eq 'debug';
+  for (sort keys %{$cf->{'optflags'}}) {
+    next if $_ eq '*';
+    print "optflags: $_ $cf->{'optflags'}->{$_}$all\n";
+  }
+} elsif ($type eq 'substitute') {
+  die("Specify which substitute to query\n") unless $argument;
+  my @res =  @{$cf->{'substitute'}->{$argument} || []};
+  print join(' ', @res)."\n" if @res;
+} else {
+  die("unsupported query type: $type\n");
+}
+
+exit(0);
+
index efea76ac96cc45ded91886bebca34724bd7bf4be..54e540c1b73b26af3d3605961527a8d77fd1cc11 100755 (executable)
@@ -19,6 +19,8 @@ sub expand {
 
 my ($dist, $buildroot, $rpmdeps, $archs, $configdir, $release, $changelog);
 
+$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs';
+
 while (@ARGV)  {
   if ($ARGV[0] eq '--root') {
     shift @ARGV;
diff --git a/t/bad.livebuild b/t/bad.livebuild
new file mode 100644 (file)
index 0000000..ae2cae0
Binary files /dev/null and b/t/bad.livebuild differ
diff --git a/t/directory.livebuild b/t/directory.livebuild
new file mode 100644 (file)
index 0000000..318d128
Binary files /dev/null and b/t/directory.livebuild differ
diff --git a/t/live-build b/t/live-build
new file mode 100755 (executable)
index 0000000..b0c9699
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w -I ..
+
+use strict;
+use Test::More tests => 5;
+use Build::LiveBuild;
+
+use Data::Dumper;
+use Digest::MD5 qw(md5_hex);
+
+my $VAR = '
+
+
+a
+
+b
+#comment
+
+! whatever
+';
+
+is(Build::LiveBuild::filter($VAR), 'a
+b
+');
+
+
+my $DEB_ARCHIVE = '
+# comment
+deb obs://openSUSE.org:Debian:7.0/standard wheezy main contrib
+deb-src obs://openSUSE.org:Debian:7.0/standard wheezy main contrib
+
+';
+my $DEB_ARCHIVE_RESULT = "\$VAR1 = 'openSUSE.org:Debian:7.0/standard';
+";
+
+is(Dumper(Build::LiveBuild::parse_archive($DEB_ARCHIVE)), $DEB_ARCHIVE_RESULT);
+
+my $config = {};
+$Data::Dumper::Sortkeys = 1;
+is(md5_hex(Dumper(Build::LiveBuild::parse( $config, 'standard.livebuild'))),
+   '9cfb69e8f0581293f207342edacd19e7');
+
+#print Dumper(Build::LiveBuild::parse( $config, 'standard.livebuild'));
+
+is(md5_hex(Dumper(Build::LiveBuild::parse( $config, 'directory.livebuild'))),
+   'bc803d2b4a375d9a02b3242117f6c93a');
+
+#print Dumper(Build::LiveBuild::parse( $config, 'directory.livebuild'));
+
+is(md5_hex(Dumper(Build::LiveBuild::parse( $config, 'bad.livebuild'))),
+   '1e596160978007d1014e9c5e38574700');
+
+#print Dumper(Build::LiveBuild::parse( $config, 'bad.livebuild'));
diff --git a/t/standard.livebuild b/t/standard.livebuild
new file mode 100644 (file)
index 0000000..bd96fda
Binary files /dev/null and b/t/standard.livebuild differ
index 6c42210e66de1bbc8a347e86445d58a38d493561..45c0da23308db77a5dfb1fcce486f1670193e76f 100644 (file)
@@ -22,6 +22,8 @@ if [ -e ${0%/*}/config.local ]; then
        . ${0%/*}/config.local
 fi
 
+: ${BUILD_DIR:=/usr/lib/build}
+
 #if [ ! -e "$build_vm_img" ]; then
 #      sudo dd if=/dev/zero of="$build_vm_img" bs=512 count=0 seek=$((build_vm_image_size*2*1024))
 #fi
@@ -89,8 +91,10 @@ run_build()
                        build_args+=("$i")
                fi
        done
-       set -- $linux32 sudo env \
-               /usr/bin/build \
+        SU_WRAPPER=""
+        [ -x /usr/bin/sudo ] && SU_WRAPPER="sudo env"
+       set -- $linux32 $SU_WRAPPER \
+               $BUILD_DIR/build \
                --root "${build_root}" \
                "${repos[@]}" \
                "${build_args[@]}"
diff --git a/test/testbuild.sh b/test/testbuild.sh
new file mode 100755 (executable)
index 0000000..b81c929
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/bash
+#
+# This is the generic test case for the current distribution, it
+# is to be called from the spec file while building a build.rpm
+
+. ${0%/*}/common
+REPO="$1"
+shift
+
+if [ -z "$REPO" ]; then
+  echo "No local path to binary packages is given as argument"
+  exit 1
+fi
+
+[ "$ARCH" == "i386" ] && arch32bit
+
+repo "$REPO"
+
+run_build "$@"
diff --git a/vc b/vc
index e9d8f55087805f9d79249aa1f9ba316837c0dc39..bf573437c828443bbf0b0186f28a1693d317e5c7 100755 (executable)
--- a/vc
+++ b/vc
@@ -125,7 +125,7 @@ set +e
                echo
        fi
        if [ -n "$message" ]; then
-               echo "- $message"
+               echo -e "- $message"
                echo
        elif [ -n "$content" ]; then
                cat "$content"
@@ -133,24 +133,6 @@ set +e
        elif [ ! $just_edit ]; then
                echo "- "
                echo
-               if [ -d .osc -a -n "$(which osc 2>/dev/null)" ]; then
-                       OSC_STATUS="$(cd "$pkgpath" &> /dev/null; osc st)"
-                       ADDED="$(sed -n 's/^A[[:blank:]]\+\([^[:blank:]].*\.\(patch\|diff\)\)$/  * \1/p' <<< "$OSC_STATUS")"
-                       DELETED="$(sed -n 's/^D[[:blank:]]\+\([^[:blank:]].*\.\(patch\|diff\)\)$/  * \1/p' <<< "$OSC_STATUS")"
-                       MODIFIED="$(sed -n 's/^M[[:blank:]]\+\([^[:blank:]].*\.\(patch\|diff\)\)$/  * \1/p' <<< "$OSC_STATUS")"
-                       if [ -n "$ADDED" ]; then
-                           echo "- added patches:"
-                           echo "$ADDED"
-                       fi
-                       if [ -n "$DELETED" ]; then
-                           echo "- removed patches:"
-                           echo "$DELETED"
-                       fi
-                       if [ -n "$MODIFIED" ]; then
-                           echo "- modified patches:"
-                           echo "$MODIFIED"
-                       fi
-               fi
        fi
        cat $changelog
 } >> "$tmpfile"
@@ -166,5 +148,7 @@ if [ -z "$message" ]; then
        fi
 fi
 mode=`stat -c "%a" "$changelog"`
+user=`stat -c "%U:%G" "$changelog"`
 mv "$tmpfile" "$changelog"
 chmod $mode "$changelog"
+chown $user "$changelog"
diff --git a/zvm_functions b/zvm_functions
deleted file mode 100644 (file)
index a914694..0000000
+++ /dev/null
@@ -1,223 +0,0 @@
-#!/bin/bash
-
-zvm_cleanup_and_exit()
-{
-    if test -n "$1"; then
-        echo "$1"
-        umount ${BUILD_ROOT}/proc
-        umount ${BUILD_ROOT}/dev/pts
-        cleanup_and_exit 1
-    else
-        exit 0
-        cleanup_and_exit 1
-    fi
-}
-
-prevent_detach()
-{
-    if test "$1" = "150" -o "$1" = "0150"; then
-        echo "don't detach local root"
-        zvm_cleanup_and_exit 1
-    fi
-}
-
-zvm_memset()
-{
-    # defining the worker also resets the operating system. Be careful
-    # $1: user name
-    # $2: amount in MB
-    # Note, that this is also limited by the worker definition in the user directory
-    if test -n "$2"; then
-        if ! vmcp send $1 define storage ${2}M ; then
-            zvm_cleanup_and_exit "Could not redefine storage of $1 to ${2}M"
-        fi
-    fi
-}
-
-zvm_logon()
-{
-    # kill machine if it already runs
-    # autolog machine
-    # Needs machine name as $1
-    if test -n "$1"; then
-        if $(vmcp q "$1" >& /dev/null); then
-            vmcp force $1
-            sleep 1
-        fi
-        if ! $(vmcp q "$1" >& /dev/null); then
-            if ! $(vmcp xautolog $1 >& /dev/null); then
-                zvm_cleanup_and_exit "Could not start machine $1. Is $1 defined in the user directory?"
-            else
-                # give the worker a moment to initialize
-                sleep 2
-                zvm_memset $1 $MEMSIZE
-               sleep 2
-            fi
-        fi
-    fi
-}
-
-zvm_ipl()
-{
-    # IPL worker. Needs user as $1 and ipl device as $2.
-    if test -n "$1" -a -n "$2"; then
-        if ! $(vmcp q "$1" >& /dev/null); then
-            zvm_cleanup_and_exit "User $1 not logged on."
-        else
-            if ! $(vmcp send $1 ipl $2); then
-                 zvm_cleanup_and_exit "Could not send command to $1"
-            fi
-        fi
-    else
-        zvm_cleanup_and_exit "Not enough arguments for ipl. Need user and device number."
-    fi
-}
-
-
-zvm_destroy()
-{
-    # Destroy build. Done by killing the worker machine.
-    # needs user as $1
-    if test -n "$1"; then
-        if ! $(vmcp force $1 ); then
-            zvm_cleanup_and_exit "Could not force $1"
-        fi
-    fi
-}
-
-zvm_get_local_devnr()
-{
-    # $1 is base address, either 150 or 250
-    # $2 is worker number
-    # there is room for up to 100 workers for this controlling guest, however in our setup I expect only up to 10 workers.
-    #echo "Debug: zvm_get_local_devnr: arg1: $1 arg2: $2"
-    if test $2 -ge 100 ; then
-        zvm_cleanup_and_exit "Not more than 100 workers supported by one controlling guest."
-    fi
-    if test "$1" = "0150" -o "$1" = "150" ; then 
-        DEVNR=$((300+$2))
-    else
-        if test "$1" = "0250" -o "$1" = "250" ; then 
-            DEVNR=$((400+$2))
-        else
-            zvm_cleanup_and_exit "The disk devices for root and swap must be 150 and 250 respectively."
-        fi
-    fi
-    echo $DEVNR
-}
-
-zvm_volume_link_local()
-{
-    # attach worker disk to local system as preparation for 
-    # a) prepare worker for build
-    # b) get rpms of the swap disk after build finished
-    # disk must be detached from worker first
-    # The following arguments are needed:
-    # 1. Worker user name
-    # 2. Worker disk device number
-    # 3. Mult password for the disk
-    # 4. Worker number to generate a uniq local device number
-    if test -n "$4"; then
-        DEVNR=$(zvm_get_local_devnr $2 $4)
-        if ! vmcp link $1 $2 $DEVNR MW pass=THR4ME >& /dev/null ; then
-            zvm_cleanup_and_exit "Could not link disk $2 from user $1 to local device $DEVNR."
-        fi
-        dasd_configure 0.0.0$DEVNR 1 0 >& /dev/null
-       udevadm settle
-        DEVICE=$(ls /sys/bus/ccw/devices/0.0.0$DEVNR/block/)
-        if ! test -b /dev/${DEVICE}1 ; then
-            zvm_cleanup_and_exit "The device /sys/bus/ccw/devices/0.0.0$DEVNR has not been setup correctly."
-        fi
-        echo "${DEVICE}1"
-    else
-        zvm_cleanup_and_exit "Not enough arguments given to volume_link_local."
-    fi 
-}
-
-zvm_volume_detach_local()
-{
-    # we need
-    # 1. worker device number
-    # 2. worker number
-    DEVNR=$(zvm_get_local_devnr $1 $2)
-    prevent_detach $DEVNR
-    dasd_configure 0.0.0$DEVNR 0 0
-    if ! vmcp detach $DEVNR >& /dev/null ; then
-        zvm_cleanup_and_exit "Could not locally detach disk number $1 from worker $2"
-    fi
-}
-
-zvm_volume_attach()
-{
-    # link the local disk of the worker 
-    # $1: user name
-    # $2: disk device number
-    # send link * nr nr
-    if ! vmcp send $1 link \* $2 $2 ; then
-        zvm_cleanup_and_exit "Could not link remote worker disk number $2 from user $1"
-    fi 
-}
-
-zvm_volume_detach()
-{
-    # send machine detach nr
-    # $1: user name
-    # $2: disk
-    if ! vmcp send $1 detach $2 ; then
-        zvm_cleanup_and_exit "Could not detach disk $2 on worker $1"
-    fi
-}
-
-zvm_worker_init()
-{
-    # 1. Worker user name
-    # 2. Worker root device number
-    # 3. Worker swap device number
-    # 4. Worker number to generate a uniq local device number
-    # Check for: 
-    # - still mounted dasd
-    # - configured dasd
-    # - linked dasd
-    # - reset worker with force and autolog 
-    DEVNR_ROOT=$(zvm_get_local_devnr $2 $4) 
-    DEVNR_SWAP=$(zvm_get_local_devnr $3 $4)
-    # First, check for mounts:
-    for DEVNR in $DEVNR_ROOT $DEVNR_SWAP; do
-        if [ -d /sys/bus/ccw/devices/0.0.0$DEVNR/block ]; then
-            DEV=$(ls /sys/bus/ccw/devices/0.0.0$DEVNR/block/)
-            echo "Found device of worker $1 available at $DEVNR, device is /dev/$DEV."
-            grep "/dev/$DEV" /proc/mounts >& /dev/null && umount /dev/${DEV}1
-        fi
-    done
-    # Second, check if devices are online
-    for DEVNR in $DEVNR_ROOT $DEVNR_SWAP; do
-        lsdasd $DEVNR | grep $DEVNR && dasd_configure 0.0.0$DEVNR 0 0
-    done
-    # Third, remove stale links
-    for DEVNR in $DEVNR_ROOT $DEVNR_SWAP; do
-        prevent_detach $DEVNR
-        if vmcp q v $DEVNR 2> /dev/null; then
-            vmcp detach $DEVNR
-        fi
-    done
-    # Fourth, reset worker
-    zvm_logon $1
-}
-
-zvm_cp()
-{
-    modprobe vmcp || zvm_cleanup_and_exit "Cannod load vmcp module"
-    if test -n $1 ; then
-        case "$1" in 
-            start)                shift ; zvm_logon $*          ;;
-            ipl)                  shift ; zvm_ipl $*            ;;
-            destroy)              shift ; zvm_destroy $*        ;;
-            volume_attach)        shift ; zvm_volume_attach $*  ;;
-            volume_detach)        shift ; zvm_volume_detach $*  ;;
-            volume_link_local)    shift ; zvm_volume_link_local $*   ;;
-            volume_detach_local)  shift ; zvm_volume_detach_local $* ;;
-            memset)               shift ; zvm_memset $*         ;;
-            worker_init)          shift ; zvm_worker_init $*    ;;
-        esac
-    fi
-}