summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Lee (李健秋) <ajqlee@debian.org>2018-09-19 08:58:42 +0200
committerAndrew Lee (李健秋) <ajqlee@debian.org>2018-09-19 08:58:42 +0200
commit64b447c72956f11e88ad360446c19008c3138d63 (patch)
treed11c974d6336a1cb59551fdc6435ff327edea512
Import obs-build_20180831.orig.tar.gz
[dgit import orig obs-build_20180831.orig.tar.gz]
-rw-r--r--Build.pm1832
-rw-r--r--Build/Appimage.pm65
-rw-r--r--Build/Arch.pm331
-rw-r--r--Build/Archrepo.pm105
-rw-r--r--Build/Collax.pm64
-rw-r--r--Build/Deb.pm481
-rw-r--r--Build/Debrepo.pm130
-rw-r--r--Build/Docker.pm258
-rw-r--r--Build/Fissile.pm49
-rw-r--r--Build/Kiwi.pm558
-rw-r--r--Build/LiveBuild.pm103
-rw-r--r--Build/Mdkrepo.pm121
-rw-r--r--Build/Repo.pm67
-rw-r--r--Build/Rpm.pm1301
-rw-r--r--Build/Rpmmd.pm221
-rw-r--r--Build/SimpleXML.pm165
-rw-r--r--Build/Snapcraft.pm84
-rw-r--r--Build/Susetags.pm139
-rw-r--r--Build/Zypp.pm94
-rw-r--r--COPYING340
-rw-r--r--HOWTO.add_another_format99
-rw-r--r--Makefile123
-rw-r--r--README11
-rw-r--r--baselibs_configs/baselibs_global-deb.conf39
-rw-r--r--baselibs_configs/baselibs_global-sle11.conf45
-rw-r--r--baselibs_configs/baselibs_global-sle12.conf45
-rw-r--r--baselibs_configs/baselibs_global-sle15.conf46
-rw-r--r--baselibs_configs/baselibs_global.conf46
-rwxr-xr-xbuild1522
-rw-r--r--build-pkg90
-rw-r--r--build-pkg-arch76
-rw-r--r--build-pkg-deb162
-rw-r--r--build-pkg-rpm203
-rw-r--r--build-recipe199
-rw-r--r--build-recipe-appimage128
-rw-r--r--build-recipe-arch63
-rw-r--r--build-recipe-collax62
-rw-r--r--build-recipe-debbuild56
-rw-r--r--build-recipe-debootstrap111
-rw-r--r--build-recipe-docker179
-rw-r--r--build-recipe-dsc140
-rw-r--r--build-recipe-fissile143
-rw-r--r--build-recipe-kiwi738
-rw-r--r--build-recipe-livebuild280
-rw-r--r--build-recipe-mock104
-rw-r--r--build-recipe-podman51
-rw-r--r--build-recipe-preinstallimage84
-rw-r--r--build-recipe-simpleimage112
-rw-r--r--build-recipe-snapcraft130
-rw-r--r--build-recipe-spec256
-rw-r--r--build-validate-params103
-rw-r--r--build-vm1051
-rw-r--r--build-vm-docker84
-rw-r--r--build-vm-ec2246
-rw-r--r--build-vm-emulator97
-rw-r--r--build-vm-kvm348
-rw-r--r--build-vm-lxc201
-rw-r--r--build-vm-openstack282
-rw-r--r--build-vm-pvm197
-rw-r--r--build-vm-qemu69
-rw-r--r--build-vm-uml74
-rw-r--r--build-vm-xen143
-rw-r--r--build-vm-zvm380
-rw-r--r--build.1233
-rw-r--r--build.conf.example27
-rwxr-xr-xchangelog2spec281
-rwxr-xr-xcommon_functions141
-rwxr-xr-xcomputeblocklists330
-rw-r--r--configs/arch.conf25
-rw-r--r--configs/collax.conf7
-rw-r--r--configs/debian-jessie.conf39
-rw-r--r--configs/debian-unstable.conf41
-rw-r--r--configs/debian.conf183
-rw-r--r--configs/sl10.0.conf202
-rw-r--r--configs/sl10.1.conf196
-rw-r--r--configs/sl10.2.conf208
-rw-r--r--configs/sl10.3.conf316
-rw-r--r--configs/sl11.0.conf377
-rw-r--r--configs/sl11.1.conf407
-rw-r--r--configs/sl11.2.conf452
-rw-r--r--configs/sl11.3.conf489
-rw-r--r--configs/sl11.4.conf598
-rw-r--r--configs/sl12.1.conf636
-rw-r--r--configs/sl12.2.conf608
-rw-r--r--configs/sl12.3.conf638
-rw-r--r--configs/sl13.1.conf695
-rw-r--r--configs/sl13.2.conf674
-rw-r--r--configs/sl13.3.conf784
-rw-r--r--configs/sl15.0.conf854
-rw-r--r--configs/sl15.5.conf784
-rw-r--r--configs/sl42.1.conf796
-rw-r--r--configs/sl42.2.conf855
-rw-r--r--configs/sl42.3.conf855
-rw-r--r--configs/sl8.1.conf196
-rw-r--r--configs/sl8.2.conf199
-rw-r--r--configs/sl9.0.conf200
-rw-r--r--configs/sl9.1.conf203
-rw-r--r--configs/sl9.2.conf198
-rw-r--r--configs/sl9.3.conf198
l---------configs/sle12.0.conf1
l---------configs/sle12.1.conf1
l---------configs/sle12.2.conf1
l---------configs/sle12.3.conf1
l---------configs/sle12.4.conf1
-rw-r--r--configs/sle15.0.conf836
-rw-r--r--configs/sles10.conf200
l---------configs/sles11.conf1
-rw-r--r--configs/sles11sp2.conf486
-rw-r--r--configs/sles12.conf667
-rw-r--r--configs/sles15.conf860
-rw-r--r--configs/sles8.conf196
-rw-r--r--configs/sles9.conf203
-rw-r--r--configs/spectool.conf4
-rw-r--r--configs/ubuntu.conf233
-rw-r--r--configs/ul1.conf196
-rwxr-xr-xcreatearchdeps58
-rwxr-xr-xcreatedebdeps99
-rwxr-xr-xcreatedirdeps99
-rwxr-xr-xcreatemdkdeps50
-rwxr-xr-xcreaterepomddeps154
-rwxr-xr-xcreateyastdeps73
-rwxr-xr-xcreatezyppdeps64
-rwxr-xr-xdebtransform493
-rwxr-xr-xdebtransformbz231
-rwxr-xr-xdebtransformxz6
-rwxr-xr-xdebtransformzip34
-rw-r--r--dist/PKGBUILD17
-rw-r--r--dist/build.changes1584
-rw-r--r--dist/build.dsc9
-rw-r--r--dist/build.spec253
-rw-r--r--dist/debian.changelog201
-rw-r--r--dist/debian.compat1
-rw-r--r--dist/debian.control18
-rw-r--r--dist/debian.copyright21
-rw-r--r--dist/debian.docs1
-rw-r--r--dist/debian.links2
-rw-r--r--dist/debian.rules65
-rwxr-xr-xdownload77
-rwxr-xr-xdummyhttpserver191
-rwxr-xr-xemulator/emulator.sh46
-rwxr-xr-xexpanddeps472
-rwxr-xr-xextractbuild150
-rwxr-xr-xgetbinaryid77
-rwxr-xr-xgetbuildids79
-rw-r--r--help8
-rwxr-xr-xinit_buildsystem1099
-rw-r--r--initvm.c399
-rwxr-xr-xkillchroot108
-rwxr-xr-xlistinstalled59
-rwxr-xr-xlivebuild_pre_run.template69
-rw-r--r--lxc.conf20
-rwxr-xr-xmkbaselibs1187
-rwxr-xr-xmkdrpms159
-rwxr-xr-xobs-docker-support226
-rw-r--r--obs_example/Dockerfile19
-rw-r--r--obs_example/fissile_example_spec.yml11
-rwxr-xr-xobs_example/obs_pkg_mgr70
-rw-r--r--openstack-console62
-rwxr-xr-xorder101
-rw-r--r--qemu-reg33
-rwxr-xr-xqueryconfig101
-rwxr-xr-xrunservices113
-rwxr-xr-xsigndummy65
-rwxr-xr-xspec2changelog94
-rwxr-xr-xspec_add_patch177
-rwxr-xr-xspectool426
-rwxr-xr-xstartdockerd173
-rwxr-xr-xsubstitutedeps352
-rw-r--r--t/bad.livebuildbin0 -> 40960 bytes
-rw-r--r--t/changelog2spec.t33
-rw-r--r--t/conflicts.t78
-rw-r--r--t/determinism.t22
-rw-r--r--t/directory.livebuildbin0 -> 30720 bytes
-rwxr-xr-xt/dist39
-rwxr-xr-xt/live-build72
-rw-r--r--t/obsoletes.t53
-rw-r--r--t/ordep.t35
-rw-r--r--t/recommends.t32
-rw-r--r--t/requires.t95
-rw-r--r--t/richdeps.t198
-rw-r--r--t/standard.livebuildbin0 -> 30720 bytes
-rw-r--r--t/testlib.pm26
-rwxr-xr-xtelnet_login_wrapper8
-rw-r--r--test-debtransform/1-out/grandorgue_0.3.0.6.1026.diff.gzbin0 -> 756 bytes
-rw-r--r--test-debtransform/1-out/grandorgue_0.3.0.6.1026.dsc12
-rw-r--r--test-debtransform/1-out/grandorgue_0.3.0.6.1026.orig.tar.gzbin0 -> 655 bytes
-rw-r--r--test-debtransform/1/debian.changelog24
-rw-r--r--test-debtransform/1/debian.empty0
-rw-r--r--test-debtransform/1/debian.obs-version1
-rw-r--r--test-debtransform/1/debian.tar.gzbin0 -> 522 bytes
-rw-r--r--test-debtransform/1/debian1.tar.gzbin0 -> 598 bytes
-rw-r--r--test-debtransform/1/go.tar.gzbin0 -> 655 bytes
-rw-r--r--test-debtransform/1/grandorgue.dsc11
-rw-r--r--test-debtransform/2-out/grandorgue_0.3.0.6.1026.diff.gzbin0 -> 756 bytes
-rw-r--r--test-debtransform/2-out/grandorgue_0.3.0.6.1026.dsc12
-rw-r--r--test-debtransform/2-out/grandorgue_0.3.0.6.1026.orig.tar.gzbin0 -> 655 bytes
-rw-r--r--test-debtransform/2/debian.changelog24
-rw-r--r--test-debtransform/2/debian.empty0
-rw-r--r--test-debtransform/2/debian.obs-version1
-rw-r--r--test-debtransform/2/debian.tar.gzbin0 -> 522 bytes
-rw-r--r--test-debtransform/2/debian1.tar.gzbin0 -> 598 bytes
-rw-r--r--test-debtransform/2/go.tar.bz2bin0 -> 707 bytes
-rw-r--r--test-debtransform/2/grandorgue.dsc11
-rwxr-xr-xtest-debtransform/run.sh32
-rw-r--r--test/Fedora_11.conf305
-rw-r--r--test/Fedora_12.conf311
-rw-r--r--test/baselibs.conf1
-rw-r--r--test/common109
-rw-r--r--test/config8
-rw-r--r--test/libdummy1.spec28
-rwxr-xr-xtest/testbuild.11.0-i3869
-rwxr-xr-xtest/testbuild.11.0-x86_647
-rwxr-xr-xtest/testbuild.11.1-i3869
-rwxr-xr-xtest/testbuild.11.2-i3869
-rwxr-xr-xtest/testbuild.8.1-i3869
-rwxr-xr-xtest/testbuild.Fedora11-i3869
-rwxr-xr-xtest/testbuild.Fedora11-x86_647
-rwxr-xr-xtest/testbuild.Fedora12-i3869
-rwxr-xr-xtest/testbuild.Fedora12-x86_647
-rwxr-xr-xtest/testbuild.sh19
-rwxr-xr-xtest/testbuild.sles10-i38610
-rwxr-xr-xtest/testbuild.sles10-x86_648
-rwxr-xr-xtest/testbuild.sles9-i38610
-rwxr-xr-xunrpm59
-rw-r--r--unrpm.117
-rwxr-xr-xvc168
-rw-r--r--vc.125
227 files changed, 44466 insertions, 0 deletions
diff --git a/Build.pm b/Build.pm
new file mode 100644
index 0000000..14ff8fd
--- /dev/null
+++ b/Build.pm
@@ -0,0 +1,1832 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build;
+
+use strict;
+use Digest::MD5;
+use Build::Rpm;
+use POSIX qw(strftime);
+#use Data::Dumper;
+
+our $expand_dbg;
+
+our $do_rpm;
+our $do_deb;
+our $do_kiwi;
+our $do_arch;
+our $do_collax;
+our $do_livebuild;
+our $do_snapcraft;
+our $do_appimage;
+our $do_docker;
+our $do_fissile;
+
+sub import {
+ for (@_) {
+ $do_rpm = 1 if $_ eq ':rpm';
+ $do_deb = 1 if $_ eq ':deb';
+ $do_kiwi = 1 if $_ eq ':kiwi';
+ $do_arch = 1 if $_ eq ':arch';
+ $do_collax = 1 if $_ eq ':collax';
+ $do_livebuild = 1 if $_ eq ':livebuild';
+ $do_snapcraft = 1 if $_ eq ':snapcraft';
+ $do_appimage = 1 if $_ eq ':appimage';
+ $do_docker = 1 if $_ eq ':docker';
+ $do_fissile = 1 if $_ eq ':fissile';
+ }
+ $do_rpm = $do_deb = $do_kiwi = $do_arch = $do_collax = $do_livebuild = $do_snapcraft = $do_appimage = $do_docker = $do_fissile = 1 if !$do_rpm && !$do_deb && !$do_kiwi && !$do_arch && !$do_collax && !$do_livebuild && !$do_snapcraft && !$do_appimage && !$do_docker && !$do_fissile;
+
+ if ($do_deb) {
+ require Build::Deb;
+ }
+ if ($do_kiwi) {
+ require Build::Kiwi;
+ }
+ if ($do_arch) {
+ require Build::Arch;
+ }
+ if ($do_collax) {
+ require Build::Collax;
+ }
+ if ($do_livebuild) {
+ require Build::LiveBuild;
+ }
+ if ($do_snapcraft) {
+ require Build::Snapcraft;
+ }
+ if ($do_appimage) {
+ require Build::Appimage;
+ }
+ if ($do_docker) {
+ require Build::Docker;
+ }
+ if ($do_fissile) {
+ require Build::Fissile;
+ }
+}
+
+package Build::Features;
+our $preinstallimage = 1; # on sale now
+package Build;
+
+# this is synced with rpm 4.13.0. The additional architectures of arm behind the spaces are
+# from MeeGo project. They don't exist elsewhere, but don't conflict either luckily
+my $std_macros = q{
+%define nil
+%define ix86 i386 i486 i586 i686 pentium3 pentium4 athlon geode
+%define arm armv3l armv4b armv4l armv4tl armv5b armv5l armv5teb armv5tel armv5tejl armv6l armv6hl armv7l armv7hl armv7hnl armv5el armv5eb armv6el armv6eb armv7el armv7eb armv7nhl armv8el
+%define arml armv3l armv4l armv5l armv5tel armv6l armv6hl armv7l armv7hl armv7hnl
+%define armb armv4b armv5b armv5teb
+%define mips32 mips mipsel mipsr6 mipsr6el
+%define mips64 mips64 mips64el mips64r6 mips64r6el
+%define mipseb mips mipsr6 mips64 mips64r6
+%define mipsel mipsel mipsr6el mips64el mips64r6el
+%define mips %{mips32} %{mips64}
+%define sparc sparc sparcv8 sparcv9 sparcv9v sparc64 sparc64v
+%define alpha alpha alphaev56 alphaev6 alphaev67
+%define power64 ppc64 ppc64p7 ppc64le
+};
+my $extra_macros = '';
+
+sub unify {
+ my %h = map {$_ => 1} @_;
+ return grep(delete($h{$_}), @_);
+}
+
+sub define($)
+{
+ my $def = shift;
+ $extra_macros .= '%define '.$def."\n";
+}
+
+sub init_helper_hashes {
+ my ($config) = @_;
+
+ $config->{'preferh'} = { map {$_ => 1} @{$config->{'prefer'}} };
+
+ my %ignore;
+ for (@{$config->{'ignore'}}) {
+ if (!/:/) {
+ $ignore{$_} = 1;
+ next;
+ }
+ my @s = split(/[,:]/, $_);
+ my $s = shift @s;
+ $ignore{"$s:$_"} = 1 for @s;
+ }
+ $config->{'ignoreh'} = \%ignore;
+
+ my %conflicts;
+ for (@{$config->{'conflict'}}) {
+ my @s = split(/[,:]/, $_);
+ my $s = shift @s;
+ push @{$conflicts{$s}}, @s;
+ push @{$conflicts{$_}}, $s for @s;
+ }
+ for (keys %conflicts) {
+ $conflicts{$_} = [ unify(@{$conflicts{$_}}) ]
+ }
+ $config->{'conflicth'} = \%conflicts;
+}
+
+# 'canonicalize' dist string as found in rpm dist tags
+sub dist_canon($$) {
+ my ($rpmdist, $arch) = @_;
+ $rpmdist = lc($rpmdist);
+ $rpmdist =~ s/-/_/g;
+ $rpmdist =~ s/opensuse/suse linux/;
+ my $rpmdista;
+ if ($rpmdist =~ /\(/) {
+ $rpmdista = $rpmdist;
+ $rpmdista =~ s/.*\(//;
+ $rpmdista =~ s/\).*//;
+ } else {
+ $rpmdista = $arch;
+ }
+ $rpmdista =~ s/i[456]86/i386/;
+ $rpmdist = '' unless $rpmdista =~ /^(i386|x86_64|ia64|ppc|ppc64|ppc64le|s390|s390x)$/;
+ my $dist = 'default';
+ if ($rpmdist =~ /unitedlinux 1\.0.*/) {
+ $dist = "ul1-$rpmdista";
+ } elsif ($rpmdist =~ /suse sles_(\d+)/) {
+ $dist = "sles$1-$rpmdista";
+ } elsif ($rpmdist =~ /suse linux enterprise (\d+)/) {
+ $dist = "sles$1-$rpmdista";
+ } elsif ($rpmdist =~ /suse linux (\d+)\.(\d+)\.[4-9]\d/) {
+ # alpha version
+ $dist = "$1.".($2 + 1)."-$rpmdista";
+ } elsif ($rpmdist =~ /suse linux (?:leap )?(\d+\.\d+)/) {
+ $dist = "$1-$rpmdista";
+ }
+ return $dist;
+}
+
+sub read_config_dist {
+ my ($dist, $archpath, $configdir) = @_;
+
+ my $arch = $archpath;
+ $arch = 'noarch' unless defined $arch;
+ $arch =~ s/:.*//;
+ $arch = 'noarch' if $arch eq '';
+ die("Please specify a distribution!\n") unless defined $dist;
+ if ($dist !~ /\//) {
+ my $saved = $dist;
+ $configdir = '.' unless defined $configdir;
+ $dist =~ s/-.*//;
+ $dist = "sl$dist" if $dist =~ /^\d/;
+ $dist = "$configdir/$dist.conf";
+ if (! -e $dist) {
+ $dist =~ s/-.*//;
+ $dist = "sl$dist" if $dist =~ /^\d/;
+ $dist = "$configdir/$dist.conf";
+ }
+ if (! -e $dist) {
+ warn "$saved.conf not found, using default.conf\n" unless $saved eq 'default';
+ $dist = "$configdir/default.conf";
+ }
+ }
+ die("$dist: $!\n") unless -e $dist;
+ my $cf = read_config($arch, $dist);
+ die("$dist: parse error\n") unless $cf;
+ return $cf;
+}
+
+sub read_config {
+ my ($arch, $cfile) = @_;
+ my @macros = split("\n", $std_macros.$extra_macros);
+ push @macros, "%define _target_cpu $arch";
+ push @macros, "%define _target_os linux";
+ my $config = {'macros' => \@macros, 'arch' => $arch};
+ my @config;
+ if (ref($cfile)) {
+ @config = @$cfile;
+ } elsif (defined($cfile)) {
+ local *CONF;
+ return undef unless open(CONF, '<', $cfile);
+ @config = <CONF>;
+ close CONF;
+ chomp @config;
+ }
+ # create verbatim macro blobs
+ my @newconfig;
+ while (@config) {
+ push @newconfig, shift @config;
+ next unless $newconfig[-1] =~ /^\s*macros:\s*$/si;
+ $newconfig[-1] = "macros:\n";
+ while (@config) {
+ my $l = shift @config;
+ last if $l =~ /^\s*:macros\s*$/si;
+ $newconfig[-1] .= "$l\n";
+ }
+ }
+ my @spec;
+ $config->{'save_expanded'} = 1;
+ Build::Rpm::parse($config, \@newconfig, \@spec);
+ delete $config->{'save_expanded'};
+ $config->{'preinstall'} = [];
+ $config->{'vminstall'} = [];
+ $config->{'cbpreinstall'} = [];
+ $config->{'cbinstall'} = [];
+ $config->{'runscripts'} = [];
+ $config->{'required'} = [];
+ $config->{'support'} = [];
+ $config->{'keep'} = [];
+ $config->{'prefer'} = [];
+ $config->{'ignore'} = [];
+ $config->{'conflict'} = [];
+ $config->{'substitute'} = {};
+ $config->{'substitute_vers'} = {};
+ $config->{'optflags'} = {};
+ $config->{'order'} = {};
+ $config->{'exportfilter'} = {};
+ $config->{'publishfilter'} = [];
+ $config->{'rawmacros'} = '';
+ $config->{'release'} = '<CI_CNT>.<B_CNT>';
+ $config->{'repotype'} = [];
+ $config->{'patterntype'} = [];
+ $config->{'fileprovides'} = {};
+ $config->{'constraint'} = [];
+ $config->{'expandflags'} = [];
+ $config->{'buildflags'} = [];
+ $config->{'singleexport'} = '';
+ for my $l (@spec) {
+ $l = $l->[1] if ref $l;
+ next unless defined $l;
+ my @l = split(' ', $l);
+ next unless @l;
+ my $ll = shift @l;
+ my $l0 = lc($ll);
+ if ($l0 eq 'macros:') {
+ $l =~ s/.*?\n//s;
+ if ($l =~ /^!\n/s) {
+ $config->{'rawmacros'} = substr($l, 2);
+ } else {
+ $config->{'rawmacros'} .= $l;
+ }
+ 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:' || $l0 eq 'buildflags:') {
+ my $t = substr($l0, 0, -1);
+ for my $l (@l) {
+ if ($l eq '!*') {
+ $config->{$t} = [];
+ } elsif ($l =~ /^!/) {
+ $config->{$t} = [ grep {"!$_" ne $l} @{$config->{$t}} ];
+ } else {
+ push @{$config->{$t}}, $l;
+ }
+ }
+ } elsif ($l0 eq 'substitute:') {
+ next unless @l;
+ $ll = shift @l;
+ if ($ll eq '!*') {
+ $config->{'substitute'} = {};
+ } elsif ($ll =~ /^!(.*)$/) {
+ delete $config->{'substitute'}->{$1};
+ } else {
+ $config->{'substitute'}->{$ll} = [ @l ];
+ }
+ } elsif ($l0 eq 'fileprovides:') {
+ next unless @l;
+ $ll = shift @l;
+ if ($ll eq '!*') {
+ $config->{'fileprovides'} = {};
+ } elsif ($ll =~ /^!(.*)$/) {
+ delete $config->{'fileprovides'}->{$1};
+ } else {
+ $config->{'fileprovides'}->{$ll} = [ @l ];
+ }
+ } elsif ($l0 eq 'exportfilter:') {
+ next unless @l;
+ $ll = shift @l;
+ $config->{'exportfilter'}->{$ll} = [ @l ];
+ } elsif ($l0 eq 'publishfilter:') {
+ $config->{'publishfilter'} = [ @l ];
+ } elsif ($l0 eq 'optflags:') {
+ next unless @l;
+ $ll = shift @l;
+ $config->{'optflags'}->{$ll} = join(' ', @l);
+ } elsif ($l0 eq 'order:') {
+ for my $l (@l) {
+ if ($l eq '!*') {
+ $config->{'order'} = {};
+ } elsif ($l =~ /^!(.*)$/) {
+ delete $config->{'order'}->{$1};
+ } else {
+ $config->{'order'}->{$l} = 1;
+ }
+ }
+ } elsif ($l0 eq 'repotype:') { # type of generated repository data
+ $config->{'repotype'} = [ @l ];
+ } elsif ($l0 eq 'type:') { # kind of recipe system (spec,dsc,arch,kiwi,...)
+ $config->{'type'} = $l[0];
+ } 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
+ $config->{'patterntype'} = [ @l ];
+ } elsif ($l0 eq 'release:') {
+ $config->{'release'} = $l[0];
+ } elsif ($l0 eq 'cicntstart:') {
+ $config->{'cicntstart'} = $l[0];
+ } elsif ($l0 eq 'releaseprg:') {
+ $config->{'releaseprg'} = $l[0];
+ } elsif ($l0 eq 'releasesuffix:') {
+ $config->{'releasesuffix'} = join(' ', @l);
+ } elsif ($l0 eq 'changetarget:' || $l0 eq 'target:') {
+ $config->{'target'} = join(' ', @l);
+ push @macros, "%define _target_cpu ".(split('-', $config->{'target'}))[0] if $config->{'target'};
+ } elsif ($l0 eq 'hostarch:') {
+ $config->{'hostarch'} = join(' ', @l);
+ } elsif ($l0 eq 'constraint:') {
+ my $l = join(' ', @l);
+ if ($l eq '!*') {
+ $config->{'constraint'} = [];
+ } else {
+ push @{$config->{'constraint'}}, $l;
+ }
+ } elsif ($l0 eq 'singleexport:') {
+ $config->{'singleexport'} = $l[0]; # avoid to export multiple package container in maintenance_release projects
+ } elsif ($l0 !~ /^[#%]/) {
+ warn("unknown keyword in config: $l0\n");
+ }
+ }
+ for my $l (qw{preinstall vminstall required support keep runscripts repotype patterntype}) {
+ $config->{$l} = [ unify(@{$config->{$l}}) ];
+ }
+ for my $l (keys %{$config->{'substitute'}}) {
+ $config->{'substitute_vers'}->{$l} = [ map {/^(.*?)(=)?$/g} unify(@{$config->{'substitute'}->{$l}}) ];
+ $config->{'substitute'}->{$l} = [ unify(@{$config->{'substitute'}->{$l}}) ];
+ s/=$// for @{$config->{'substitute'}->{$l}};
+ }
+ init_helper_hashes($config);
+ if (!$config->{'type'}) {
+ # Fallback to old guessing method if no type (spec, dsc or kiwi) is defined
+ if (grep {$_ eq 'rpm'} @{$config->{'preinstall'} || []}) {
+ $config->{'type'} = 'spec';
+ } elsif (grep {$_ eq 'debianutils'} @{$config->{'preinstall'} || []}) {
+ $config->{'type'} = 'dsc';
+ } elsif (grep {$_ eq 'pacman'} @{$config->{'preinstall'} || []}) {
+ $config->{'type'} = 'arch';
+ }
+ $config->{'type'} ||= 'UNDEFINED';
+ }
+ if (!$config->{'binarytype'}) {
+ $config->{'binarytype'} = 'rpm' if $config->{'type'} eq 'spec';
+ $config->{'binarytype'} = 'deb' if $config->{'type'} eq 'dsc' || $config->{'type'} eq 'collax' || $config->{'type'} eq 'livebuild';
+ $config->{'binarytype'} = 'arch' if $config->{'type'} eq 'arch';
+ if (grep {$_ eq $config->{'type'}} qw{snapcraft appimage docker fissile kiwi}){
+ if (grep {$_ eq 'rpm'} @{$config->{'preinstall'} || []}) {
+ $config->{'binarytype'} = 'rpm';
+ } elsif (grep {$_ eq 'debianutils'} @{$config->{'preinstall'} || []}) {
+ $config->{'binarytype'} = 'deb';
+ } elsif (grep {$_ eq 'pacman'} @{$config->{'preinstall'} || []}) {
+ $config->{'binarytype'} = 'arch';
+ }
+ }
+ $config->{'binarytype'} ||= 'UNDEFINED';
+ }
+ # add rawmacros to our macro list
+ if ($config->{'rawmacros'} ne '') {
+ for my $rm (split("\n", $config->{'rawmacros'})) {
+ if (@macros && $macros[-1] =~ /\\$/) {
+ if ($rm =~ /\\$/) {
+ push @macros, '...\\';
+ } else {
+ push @macros, '...';
+ }
+ } elsif ($rm !~ /^%/) {
+ push @macros, $rm;
+ } else {
+ push @macros, "%define ".substr($rm, 1);
+ }
+ }
+ }
+ for (@{$config->{'expandflags'} || []}) {
+ if (/^([^:]+):(.*)$/s) {
+ $config->{"expandflags:$1"} = $2;
+ } else {
+ $config->{"expandflags:$_"} = 1;
+ }
+ }
+ for (@{$config->{'buildflags'} || []}) {
+ if (/^([^:]+):(.*)$/s) {
+ $config->{"buildflags:$1"} = $2;
+ } else {
+ $config->{"buildflags:$_"} = 1;
+ }
+ }
+ return $config;
+}
+
+sub do_subst {
+ my ($config, @deps) = @_;
+ my @res;
+ my %done;
+ my $subst = $config->{'substitute'};
+ while (@deps) {
+ my $d = shift @deps;
+ next if $done{$d};
+ my $ds = $d;
+ $ds =~ s/\s*[<=>].*$//s;
+ if ($subst->{$ds}) {
+ unshift @deps, @{$subst->{$ds}};
+ push @res, $d if grep {$_ eq $ds} @{$subst->{$ds}};
+ } else {
+ push @res, $d;
+ }
+ $done{$d} = 1;
+ }
+ return @res;
+}
+
+sub do_subst_vers {
+ my ($config, @deps) = @_;
+ my @res;
+ my %done;
+ my $subst = $config->{'substitute_vers'};
+ while (@deps) {
+ my ($d, $dv) = splice(@deps, 0, 2);
+ next if $done{$d};
+ if ($subst->{$d}) {
+ unshift @deps, map {defined($_) && $_ eq '=' ? $dv : $_} @{$subst->{$d}};
+ push @res, $d, $dv if grep {defined($_) && $_ eq $d} @{$subst->{$d}};
+ } else {
+ push @res, $d, $dv;
+ }
+ $done{$d} = 1;
+ }
+ return @res;
+}
+
+my %subst_defaults = (
+ # defaults live-build package dependencies base on 4.0~a26 gathered with:
+ # grep Check_package -r /usr/lib/live/build
+ 'build-packages:livebuild' => [
+ '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',
+ ],
+ 'system-packages:livebuild' => [
+ 'apt-utils', 'cpio', 'dpkg-dev', 'live-build', 'lsb-release', 'tar',
+ ],
+ 'system-packages:mock' => [
+ 'mock', 'createrepo',
+ ],
+ 'system-packages:debootstrap' => [
+ 'debootstrap', 'lsb-release',
+ ],
+ 'system-packages:kiwi-image' => [
+ 'kiwi', 'createrepo', 'tar',
+ ],
+ 'system-packages:kiwi-product' => [
+ 'kiwi',
+ ],
+ 'system-packages:docker' => [
+ 'docker',
+ ],
+ 'system-packages:podman' => [
+ 'podman', 'buildah'
+ ],
+ 'system-packages:fissile' => [
+ 'docker', # TODO: Add fissile here as soon as it is packaged
+ ],
+ 'system-packages:deltarpm' => [
+ 'deltarpm',
+ ],
+);
+
+# expand the preinstalls/vminstalls
+sub expandpreinstalls {
+ my ($config) = @_;
+ return if !$config->{'expandflags:preinstallexpand'} || $config->{'preinstallisexpanded'};
+ my (@pre, @vm);
+ if (@{$config->{'preinstall'} || []}) {
+ @pre = expand($config, @{$config->{'preinstall'} || []});
+ return "preinstalls: $pre[0]" unless shift @pre;
+ @pre = sort(@pre);
+ }
+ if (@{$config->{'vminstall'} || []}) {
+ my %pre = map {$_ => 1} @pre;
+ my %vmx = map {+"-$_" => 1} @{$config->{'vminstall'} || []};
+ my @pren = grep {/^-/ && !$vmx{$_}} @{$config->{'preinstall'} || []};
+ @vm = expand($config, @pre, @pren, @{$config->{'vminstall'} || []});
+ return "vminstalls: $vm[0]" unless shift @vm;
+ @vm = sort(grep {!$pre{$_}} @vm);
+ }
+ $config->{'preinstall'} = \@pre;
+ $config->{'vminstall'} = \@vm;
+ #print STDERR "pre: @pre\n";
+ #print STDERR "vm: @vm\n";
+ $config->{'preinstallisexpanded'} = 1;
+ return '';
+}
+
+# Delivers all packages which get used for building
+sub get_build {
+ my ($config, $subpacks, @deps) = @_;
+
+ if ($config->{'expandflags:preinstallexpand'} && !$config->{'preinstallisexpanded'}) {
+ my $err = expandpreinstalls($config);
+ return (undef, $err) if $err;
+ }
+ my $buildtype = $config->{'type'} || '';
+ if (grep {$_ eq $buildtype} qw{livebuild docker kiwi fissile}) {
+ push @deps, @{$config->{'substitute'}->{"build-packages:$buildtype"}
+ || $subst_defaults{"build-packages:$buildtype"} || []};
+ }
+ 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 || []}) {
+ 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;
+ }
+ @deps = grep {!$ndeps{$_}} @deps;
+ push @deps, @{$config->{'preinstall'}};
+ push @deps, @extra;
+ @deps = grep {!$ndeps{"-$_"}} @deps;
+ @deps = do_subst($config, @deps);
+ @deps = grep {!$ndeps{"-$_"}} @deps;
+ 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, $extradeps) = @_;
+ my $engine = $config->{'buildengine'} || '';
+ $buildtype ||= $config->{'type'} || '';
+ my @sysdeps;
+ if ($engine eq 'mock' && $buildtype eq 'spec') {
+ @sysdeps = @{$config->{'substitute'}->{'system-packages:mock'} || []};
+ @sysdeps = @{$subst_defaults{'system-packages:mock'} || []} unless @sysdeps;
+ } elsif ($engine eq 'debootstrap' && $buildtype eq 'dsc') {
+ @sysdeps = @{$config->{'substitute'}->{'system-packages:debootstrap'} || []};
+ @sysdeps = @{$subst_defaults{'system-packages:debootstrap'} || []} unless @sysdeps;
+ } elsif ($buildtype eq 'livebuild') {
+ # packages used for build environment setup (build-recipe-livebuild deps)
+ @sysdeps = @{$config->{'substitute'}->{'system-packages:livebuild'} || []};
+ @sysdeps = @{$subst_defaults{'system-packages:livebuild'} || []} unless @sysdeps;
+ } elsif ($buildtype eq 'kiwi-image') {
+ @sysdeps = @{$config->{'substitute'}->{'system-packages:kiwi-image'} || []};
+ @sysdeps = @{$config->{'substitute'}->{'kiwi-setup:image'} || []} unless @sysdeps;
+ @sysdeps = @{$subst_defaults{'system-packages:kiwi-image'} || []} unless @sysdeps;
+ } elsif ($buildtype eq 'kiwi-product') {
+ @sysdeps = @{$config->{'substitute'}->{'system-packages:kiwi-product'} || []};
+ @sysdeps = @{$config->{'substitute'}->{'kiwi-setup:product'} || []} unless @sysdeps;
+ @sysdeps = @{$subst_defaults{'system-packages:kiwi-product'} || []} unless @sysdeps;
+ } elsif ($engine eq 'podman' && $buildtype eq 'docker') {
+ @sysdeps = @{$config->{'substitute'}->{'system-packages:podman'} || []} unless @sysdeps;
+ @sysdeps = @{$subst_defaults{'system-packages:podman'} || []} unless @sysdeps;
+ } elsif ($buildtype eq 'docker') {
+ @sysdeps = @{$config->{'substitute'}->{'system-packages:docker'} || []} unless @sysdeps;
+ @sysdeps = @{$subst_defaults{'system-packages:docker'} || []} unless @sysdeps;
+ } elsif ($buildtype eq 'fissile') {
+ @sysdeps = @{$config->{'substitute'}->{'system-packages:fissile'} || []} unless @sysdeps;
+ @sysdeps = @{$subst_defaults{'system-packages:fissile'} || []} unless @sysdeps;
+ } elsif ($buildtype eq 'deltarpm') {
+ @sysdeps = @{$config->{'substitute'}->{'system-packages:deltarpm'} || []};
+ @sysdeps = @{$subst_defaults{'system-packages:deltarpm'} || []} unless @sysdeps;
+ }
+ return () unless @sysdeps; # no extra build environment used
+ push @sysdeps, @$extradeps if $extradeps;
+ if ($config->{'expandflags:preinstallexpand'} && !$config->{'preinstallisexpanded'}) {
+ my $err = expandpreinstalls($config);
+ return (undef, $err) if $err;
+ }
+ my @ndeps = grep {/^-/} @sysdeps;
+ my %ndeps = map {$_ => 1} @ndeps;
+ @sysdeps = grep {!$ndeps{$_}} @sysdeps;
+ push @sysdeps, @{$config->{'preinstall'}}, @{$config->{'required'}};
+ push @sysdeps, @{$config->{'support'}} if $buildtype eq 'kiwi-image' || $buildtype eq 'kiwi-product'; # compat to old versions
+ @sysdeps = do_subst($config, @sysdeps);
+ @sysdeps = grep {!$ndeps{$_}} @sysdeps;
+ my $configtmp = $config;
+ @sysdeps = expand($configtmp, @sysdeps, @ndeps);
+ 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) = @_;
+ if ($config->{'expandflags:preinstallexpand'} && !$config->{'preinstallisexpanded'}) {
+ my $err = expandpreinstalls($config);
+ return (undef, $err) if $err;
+ }
+ my @ndeps = grep {/^-/} @deps;
+ my @extra = @{$config->{'required'}};
+ if (@{$config->{'keep'} || []}) {
+ my %keep = map {$_ => 1} (@deps, @{$config->{'keep'} || []}, @{$config->{'preinstall'}});
+ for (@{$subpacks || []}) {
+ push @ndeps, "-$_" unless $keep{$_};
+ }
+ } else {
+ # new "empty keep" mode, filter subpacks from required
+ my %subpacks = map {$_ => 1} @{$subpacks || []};
+ @extra = grep {!$subpacks{$_}} @extra;
+ }
+ my %ndeps = map {$_ => 1} @ndeps;
+ @deps = grep {!$ndeps{$_}} @deps;
+ push @deps, @extra;
+ @deps = grep {!$ndeps{"-$_"}} @deps;
+ @deps = do_subst($config, @deps);
+ @deps = grep {!$ndeps{"-$_"}} @deps;
+ my %bdeps = map {$_ => 1} (@{$config->{'preinstall'}}, @{$config->{'support'}});
+ delete $bdeps{$_} for @deps;
+ @deps = expand($config, @deps, @ndeps);
+ if (@deps && $deps[0]) {
+ my $r = shift @deps;
+ @deps = grep {!$bdeps{$_}} @deps;
+ unshift @deps, $r;
+ }
+ return @deps;
+}
+
+sub get_preinstalls {
+ my ($config) = @_;
+ if ($config->{'expandflags:preinstallexpand'} && !$config->{'preinstallisexpanded'}) {
+ my $err = expandpreinstalls($config);
+ return ('expandpreinstalls_error') if $err;
+ }
+ return @{$config->{'preinstall'}};
+}
+
+sub get_vminstalls {
+ my ($config) = @_;
+ if ($config->{'expandflags:preinstallexpand'} && !$config->{'preinstallisexpanded'}) {
+ my $err = expandpreinstalls($config);
+ return ('expandpreinstalls_error') if $err;
+ }
+ return @{$config->{'vminstall'}};
+}
+
+sub get_runscripts {
+ my ($config) = @_;
+ return @{$config->{'runscripts'}};
+}
+
+### just for API compability
+sub get_cbpreinstalls { return (); }
+sub get_cbinstalls { return (); }
+
+###########################################################################
+
+sub readdeps {
+ my ($config, $pkginfo, @depfiles) = @_;
+
+ local *F;
+ my %requires;
+ my %provides;
+ my %pkgconflicts;
+ my %pkgobsoletes;
+ my %recommends;
+ my %supplements;
+ my $dofileprovides = %{$config->{'fileprovides'} || {}};
+ for my $depfile (@depfiles) {
+ if (ref($depfile) eq 'HASH') {
+ for my $rr (keys %$depfile) {
+ $provides{$rr} = $depfile->{$rr}->{'provides'};
+ $requires{$rr} = $depfile->{$rr}->{'requires'};
+ $pkgconflicts{$rr} = $depfile->{$rr}->{'conflicts'};
+ $pkgobsoletes{$rr} = $depfile->{$rr}->{'obsoletes'};
+ $recommends{$rr} = $depfile->{$rr}->{'recommends'};
+ $supplements{$rr} = $depfile->{$rr}->{'supplements'};
+ }
+ next;
+ }
+ # XXX: we don't support different architectures per file
+ if (ref($depfile)) {
+ *F = $depfile;
+ } else {
+ open(F, '<', $depfile) || die("$depfile: $!\n");
+ }
+ while(<F>) {
+ my @s = split(' ', $_);
+ my $s = shift @s;
+ if ($pkginfo && ($s =~ /^I:(.*)\.(.*)-\d+\/\d+\/\d+:$/)) {
+ my $pkgid = $1;
+ my $arch = $2;
+ my $evr = $s[0];
+ $pkginfo->{$pkgid}->{'arch'} = $1 if $s[1] && $s[1] =~ s/-(.*)$//;
+ $pkginfo->{$pkgid}->{'buildtime'} = $s[1] if $s[1];
+ if ($evr =~ s/^\Q$pkgid-//) {
+ $pkginfo->{$pkgid}->{'epoch'} = $1 if $evr =~ s/^(\d+)://;
+ $pkginfo->{$pkgid}->{'release'} = $1 if $evr =~ s/-([^-]*)$//;
+ $pkginfo->{$pkgid}->{'version'} = $evr;
+ }
+ next;
+ }
+ my @ss;
+ while (@s) {
+ if (!$dofileprovides && $s[0] =~ /^\//) {
+ shift @s;
+ next;
+ }
+ if ($s[0] =~ /^rpmlib\(/) {
+ splice(@s, 0, 3);
+ next;
+ }
+ if ($s[0] =~ /^\(/) {
+ push @ss, Build::Rpm::shiftrich(\@s);
+ next;
+ }
+ push @ss, shift @s;
+ while (@s && $s[0] =~ /^[\(<=>|]/) {
+ $ss[-1] .= " $s[0] $s[1]";
+ $ss[-1] =~ s/ \((.*)\)/ $1/;
+ $ss[-1] =~ s/(<|>){2}/$1/;
+ splice(@s, 0, 2);
+ }
+ }
+ my %ss;
+ @ss = grep {!$ss{$_}++} @ss;
+ if ($s =~ /^(P|R|C|O|r|s):(.*)\.(.*)-\d+\/\d+\/\d+:$/) {
+ my $pkgid = $2;
+ my $arch = $3;
+ if ($1 eq "P") {
+ $provides{$pkgid} = \@ss;
+ if ($pkginfo) {
+ $pkginfo->{$pkgid}->{'name'} = $pkgid;
+ $pkginfo->{$pkgid}->{'arch'} = $arch;
+ $pkginfo->{$pkgid}->{'provides'} = \@ss;
+ }
+ }
+ if ($1 eq "R") {
+ $requires{$pkgid} = \@ss;
+ $pkginfo->{$pkgid}->{'requires'} = \@ss if $pkginfo;
+ next;
+ }
+ if ($1 eq "C") {
+ $pkgconflicts{$pkgid} = \@ss;
+ $pkginfo->{$pkgid}->{'conflicts'} = \@ss if $pkginfo;
+ next;
+ }
+ if ($1 eq "O") {
+ $pkgobsoletes{$pkgid} = \@ss;
+ $pkginfo->{$pkgid}->{'obsoletes'} = \@ss if $pkginfo;
+ next;
+ }
+ if ($1 eq "r") {
+ $recommends{$pkgid} = \@ss;
+ $pkginfo->{$pkgid}->{'recommends'} = \@ss if $pkginfo;
+ next;
+ }
+ if ($1 eq "s") {
+ $supplements{$pkgid} = \@ss;
+ $pkginfo->{$pkgid}->{'supplements'} = \@ss if $pkginfo;
+ next;
+ }
+ }
+ }
+ close F unless ref($depfile);
+ }
+ if ($pkginfo) {
+ # extract evr from self provides if there is no 'I' line
+ for my $pkg (values %$pkginfo) {
+ next if defined $pkg->{'version'};
+ my $n = $pkg->{'name'};
+ next unless defined $n;
+ my @sp = grep {/^\Q$n\E\s*=\s*/} @{$pkg->{'provides'} || []};
+ next unless @sp;
+ my $evr = $sp[-1];
+ $evr =~ s/^\Q$n\E\s*=\s*//;
+ $pkg->{'epoch'} = $1 if $evr =~ s/^(\d+)://;
+ $pkg->{'release'} = $1 if $evr =~ s/-([^-]*)$//;
+ $pkg->{'version'} = $evr;
+ }
+ }
+ $config->{'providesh'} = \%provides;
+ $config->{'requiresh'} = \%requires;
+ $config->{'pkgconflictsh'} = \%pkgconflicts;
+ $config->{'pkgobsoletesh'} = \%pkgobsoletes;
+ $config->{'recommendsh'} = \%recommends;
+ $config->{'supplementsh'} = \%supplements;
+ makewhatprovidesh($config);
+}
+
+sub getbuildid {
+ my ($q) = @_;
+ my $evr = $q->{'version'};
+ $evr = "$q->{'epoch'}:$evr" if $q->{'epoch'};
+ $evr .= "-$q->{'release'}" if defined $q->{'release'};;
+ my $buildtime = $q->{'buildtime'} || 0;
+ $evr .= " $buildtime";
+ $evr .= "-$q->{'arch'}" if defined $q->{'arch'};
+ return "$q->{'name'}-$evr";
+}
+
+sub writedeps {
+ my ($fh, $pkg, $url) = @_;
+ $url = '' unless defined $url;
+ return unless defined($pkg->{'name'}) && defined($pkg->{'arch'});
+ return if $pkg->{'arch'} eq 'src' || $pkg->{'arch'} eq 'nosrc';
+ my $id = $pkg->{'id'};
+ $id = ($pkg->{'buildtime'} || 0)."/".($pkg->{'filetime'} || 0)."/0" unless $id;
+ $id = "$pkg->{'name'}.$pkg->{'arch'}-$id: ";
+ print $fh "F:$id$url$pkg->{'location'}\n";
+ print $fh "P:$id".join(' ', @{$pkg->{'provides'} || []})."\n";
+ print $fh "R:$id".join(' ', @{$pkg->{'requires'}})."\n" if $pkg->{'requires'};
+ print $fh "C:$id".join(' ', @{$pkg->{'conflicts'}})."\n" if $pkg->{'conflicts'};
+ print $fh "O:$id".join(' ', @{$pkg->{'obsoletes'}})."\n" if $pkg->{'obsoletes'};
+ print $fh "r:$id".join(' ', @{$pkg->{'recommends'}})."\n" if $pkg->{'recommends'};
+ print $fh "s:$id".join(' ', @{$pkg->{'supplements'}})."\n" if $pkg->{'supplements'};
+ print $fh "I:$id".getbuildid($pkg)."\n";
+}
+
+sub makewhatprovidesh {
+ my ($config) = @_;
+
+ my %whatprovides;
+ my $provides = $config->{'providesh'};
+
+ for my $p (keys %$provides) {
+ my @pp = @{$provides->{$p}};
+ s/[ <=>].*// for @pp;
+ push @{$whatprovides{$_}}, $p for unify(@pp);
+ }
+ for my $p (keys %{$config->{'fileprovides'}}) {
+ my @pp = grep {@{$provides->{$_} || []}} @{$config->{'fileprovides'}->{$p}};
+ @{$whatprovides{$p}} = unify(@{$whatprovides{$p} || []}, @pp) if @pp;
+ }
+ $config->{'whatprovidesh'} = \%whatprovides;
+}
+
+sub setdeps {
+ my ($config, $provides, $whatprovides, $requires) = @_;
+ $config->{'providesh'} = $provides;
+ $config->{'whatprovidesh'} = $whatprovides;
+ $config->{'requiresh'} = $requires;
+}
+
+sub forgetdeps {
+ my ($config) = @_;
+ delete $config->{'providesh'};
+ delete $config->{'whatprovidesh'};
+ delete $config->{'requiresh'};
+ delete $config->{'pkgconflictsh'};
+ delete $config->{'pkgobsoletesh'};
+ delete $config->{'recommendsh'};
+ delete $config->{'supplementsh'};
+}
+
+my %addproviders_fm = (
+ '>' => 1,
+ '=' => 2,
+ '==' => 2,
+ '>=' => 3,
+ '<' => 4,
+ '<=' => 6,
+);
+
+sub addproviders {
+ my ($config, $r) = @_;
+
+ my @p;
+ my $whatprovides = $config->{'whatprovidesh'};
+ $whatprovides->{$r} = \@p;
+ my $binarytype = $config->{'binarytype'};
+ if ($r =~ /\|/) {
+ for my $or (split(/\s*\|\s*/, $r)) {
+ push @p, @{$whatprovides->{$or} || addproviders($config, $or)};
+ }
+ @p = unify(@p) if @p > 1;
+ return \@p;
+ }
+ if ($r !~ /^(.*?)\s*([<=>]{1,2})\s*(.*?)$/) {
+ @p = @{$whatprovides->{$r} || addproviders($config, $r)} if $binarytype eq 'deb' && $r =~ s/:any$//;
+ return \@p;
+ }
+ my $rn = $1;
+ my $rv = $3;
+ my $rf = $addproviders_fm{$2};
+ return \@p unless $rf;
+ $rn =~ s/:any$// if $binarytype eq 'deb';
+ my $provides = $config->{'providesh'};
+ my @rp = @{$whatprovides->{$rn} || []};
+ for my $rp (@rp) {
+ for my $pp (@{$provides->{$rp} || []}) {
+ if ($pp eq $rn) {
+ # debian: unversioned provides do not match
+ next if $binarytype eq 'deb';
+ push @p, $rp;
+ last;
+ }
+ next unless $pp =~ /^\Q$rn\E\s*([<=>]{1,2})\s*(.*?)$/;
+ my $pv = $2;
+ my $pf = $addproviders_fm{$1};
+ next unless $pf;
+ if ($pf & $rf & 5) {
+ push @p, $rp;
+ last;
+ }
+ if ($pv eq $rv) {
+ next unless $pf & $rf & 2;
+ push @p, $rp;
+ last;
+ }
+ my $rr = $rf == 2 ? $pf : ($rf ^ 5);
+ $rr &= 5 unless $pf & 2;
+ # verscmp for spec and kiwi types
+ my $vv;
+ if ($binarytype eq 'deb') {
+ $vv = Build::Deb::verscmp($pv, $rv, 1);
+ } else {
+ $vv = Build::Rpm::verscmp($pv, $rv, 1);
+ }
+ if ($rr & (1 << ($vv + 1))) {
+ push @p, $rp;
+ last;
+ }
+ }
+ }
+ @p = unify(@p) if @p > 1;
+ return \@p;
+}
+
+# XXX: should also check the package EVR
+sub nevrmatch {
+ my ($config, $r, @p) = @_;
+ my $rn = $r;
+ $rn =~ s/\s*([<=>]{1,2}).*$//;
+ return grep {$_ eq $rn} @p;
+}
+
+# check if package $q has a conflict against an installed package.
+# if yes, add message to @$eq and return true
+sub checkconflicts {
+ my ($config, $ins, $q, $eq, @r) = @_;
+ my $whatprovides = $config->{'whatprovidesh'};
+ my $ret = 0;
+ for my $r (@r) {
+ if ($r =~ /^\(.*\)$/) {
+ # note the []: we ignore errors here. they will be reported if the package is chosen.
+ my $n = normalizerich($config, $q, $r, 1, []);
+ $ret = 1 if check_conddeps_notinst($q, $n, $eq, $ins);
+ next;
+ }
+ my @eq = grep {$ins->{$_}} @{$whatprovides->{$r} || addproviders($config, $r)};
+ next unless @eq;
+ push @$eq, map {"(provider $q conflicts with $_)"} @eq;
+ $ret = 1;
+ }
+ return $ret;
+}
+
+sub checkobsoletes {
+ my ($config, $ins, $q, $eq, @r) = @_;
+ my $whatprovides = $config->{'whatprovidesh'};
+ my $ret = 0;
+ for my $r (@r) {
+ my @eq = grep {$ins->{$_}} nevrmatch($config, $r, @{$whatprovides->{$r} || addproviders($config, $r)});
+ next unless @eq;
+ push @$eq, map {"(provider $q obsoletes $_)"} @eq;
+ $ret = 1;
+ }
+ return $ret;
+}
+
+sub todo2recommended {
+ my ($config, $recommended, $todo) = @_;
+ my $whatprovides = $config->{'whatprovidesh'};
+ my $pkgrecommends = $config->{'recommendsh'} || {};
+ for my $p (splice @$todo) {
+ for my $r (@{$pkgrecommends->{$p} || []}) {
+ $recommended->{$_} = 1 for @{$whatprovides->{$r} || addproviders($config, $r)}
+ }
+ }
+}
+
+sub cplx_mix {
+ my ($q1, $q2, $todnf) = @_;
+ my @q;
+ for my $qq1 (@$q1) {
+ for my $qq2 (@$q2) {
+ my @qq = unify(sort(@$qq1, @$qq2));
+ my %qq = map {$_ => 1} @qq;
+ push @q, \@qq unless grep {$qq{"-$_"}} @qq;
+ }
+ }
+ return $todnf ? 0 : 1 unless @q;
+ return (-1, @q);
+}
+
+sub cplx_inv {
+ my ($f, @q) = @_;
+ return 1 - $f if $f == 0 || $f == 1;
+ my @iq;
+ for my $q (@q) {
+ $q = [ map {"-$_"} @$q ];
+ s/^--// for @$q;
+ }
+ return (-1, @q);
+}
+
+sub normalize_cplx_rec {
+ my ($c, $r, $todnf) = @_;
+ if ($r->[0] == 0) {
+ my $ri = (split(/[ <=>]/, $r->[1], 2))[0];
+ my ($config, $p, $ignore, $xignore) = @$c;
+ if (!$todnf) {
+ return 1 if $ignore->{$ri} || $xignore->{$ri};
+ return 1 if defined($p) && ($ignore->{"$p:$ri"} || $xignore->{"$p:$ri"});
+ }
+ my $whatprovides = $config->{'whatprovidesh'};
+ my @q = @{$whatprovides->{$r->[1]} || addproviders($config, $r->[1])};
+ return 0 unless @q;
+ if ($todnf) {
+ return (-1, map { [ $_ ] } @q);
+ } else {
+ return (-1, [ @q ]);
+ }
+ }
+ if ($r->[0] == 3 && @$r == 4) {
+ # complex if/else case: A IF (B ELSE C) -> (A OR ~B) AND (C OR B)
+ my ($n1, @q1) = normalize_cplx_rec($c, [3, $r->[1], $r->[2]], $todnf);
+ my ($n2, @q2) = normalize_cplx_rec($c, [2, $r->[2], $r->[3]], $todnf);
+ return 0 if $n1 == 0 || $n2 == 0;
+ return ($n2, @q2) if $n1 == 1;
+ return ($n1, @q1) if $n2 == 1;
+ if (!$todnf) {
+ return (-1, @q1, @q2);
+ } else {
+ return cplx_mix(\@q1, \@q2, $todnf);
+ }
+ }
+ if ($r->[0] == 4 && @$r == 4) {
+ # complex unless/else case: A UNLESS (B ELSE C) -> (A AND ~B) OR (C AND B)
+ my ($n1, @q1) = normalize_cplx_rec($c, [4, $r->[1], $r->[2]], $todnf);
+ my ($n2, @q2) = normalize_cplx_rec($c, [1, $r->[2], $r->[3]], $todnf);
+ return 1 if $n1 == 1 || $n2 == 1;
+ return ($n2, @q2) if $n1 == 0;
+ return ($n1, @q1) if $n2 == 0;
+ if ($todnf) {
+ return (-1, @q1, @q2);
+ } else {
+ return cplx_mix(\@q1, \@q2, $todnf);
+ }
+ }
+ if ($r->[0] == 1 || $r->[0] == 4) {
+ # and / unless
+ my $todnf2 = $r->[0] == 4 ? !$todnf : $todnf;
+ my ($n1, @q1) = normalize_cplx_rec($c, $r->[1], $todnf);
+ my ($n2, @q2) = normalize_cplx_rec($c, $r->[2], $todnf);
+ ($n2, @q2) = cplx_inv($n2, @q2) if $r->[0] == 4;
+ return 0 if $n1 == 0 || $n2 == 0;
+ return ($n2, @q2) if $n1 == 1;
+ return ($n1, @q1) if $n2 == 1;
+ if (!$todnf) {
+ return (-1, @q1, @q2);
+ } else {
+ return cplx_mix(\@q1, \@q2, $todnf);
+ }
+ }
+ if ($r->[0] == 2 || $r->[0] == 3) {
+ # or / if
+ my $todnf2 = $r->[0] == 3 ? !$todnf : $todnf;
+ my ($n1, @q1) = normalize_cplx_rec($c, $r->[1], $todnf);
+ my ($n2, @q2) = normalize_cplx_rec($c, $r->[2], $todnf2);
+ ($n2, @q2) = cplx_inv($n2, @q2) if $r->[0] == 3;
+ return 1 if $n1 == 1 || $n2 == 1;
+ return ($n2, @q2) if $n1 == 0;
+ return ($n1, @q1) if $n2 == 0;
+ if ($todnf) {
+ return (-1, @q1, @q2);
+ } else {
+ return cplx_mix(\@q1, \@q2, $todnf);
+ }
+ }
+ if ($r->[0] == 6 || $r->[0] == 7) {
+ # with / without
+ my ($n1, @q1) = normalize_cplx_rec($c, $r->[1], 0);
+ my ($n2, @q2) = normalize_cplx_rec($c, $r->[2], 0);
+ if ($n2 == 0 && $r->[0] == 7) {
+ @q2 = ( [] );
+ $n2 = -1;
+ }
+ return 0 if $n1 != -1 || $n2 != -1;
+ return 0 if @q1 != 1 || @q2 != 1;
+ @q1 = @{$q1[0]};
+ @q2 = @{$q2[0]};
+ return 0 if grep {/^-/} @q1;
+ return 0 if grep {/^-/} @q2;
+ my %q2 = map {$_ => 1} @q2;
+ my @q;
+ if ($r->[0] == 6) {
+ @q = grep {$q2{$_}} @q1;
+ } else {
+ @q = grep {!$q2{$_}} @q1;
+ }
+ return 0 unless @q;
+ if ($todnf) {
+ return (-1, map { [ $_ ] } @q);
+ } else {
+ return (-1, [ @q ]);
+ }
+ }
+ return 0;
+}
+
+sub normalizerich {
+ my ($config, $p, $dep, $deptype, $error, $ignore, $xignore) = @_;
+ my $r = Build::Rpm::parse_rich_dep($dep);
+ if (!$r) {
+ if (defined($p)) {
+ push @$error, "cannot parse dependency $dep from $p";
+ } else {
+ push @$error, "cannot parse dependency $dep";
+ }
+ return [];
+ }
+ my $c = [$config, $p, $ignore || {}, $xignore || {}];
+ my ($n, @q);
+ if ($deptype == 0) {
+ ($n, @q) = normalize_cplx_rec($c, $r);
+ return () if $n == 1;
+ if (!$n) {
+ if (defined($p)) {
+ push @$error, "nothing provides $dep needed by $p";
+ } else {
+ push @$error, "nothing provides $dep";
+ }
+ return [];
+ }
+ } else {
+ ($n, @q) = normalize_cplx_rec($c, $r, 1);
+ ($n, @q) = cplx_inv($n, @q);
+ if (!$n) {
+ if (defined($p)) {
+ push @$error, "$p conflicts with always true $dep";
+ } else {
+ push @$error, "conflict with always true $dep";
+ }
+ }
+ }
+ for my $q (@q) {
+ my @neg = @$q;
+ @neg = grep {s/^-//} @neg;
+ @neg = grep {$_ ne $p} @neg if defined $p;
+ @$q = grep {!/^-/} @$q;
+ $q = [$dep, $deptype, \@neg, @$q];
+ }
+ return \@q;
+}
+
+# handle a normalized rich dependency from install of package p
+# todo_cond is undef if we are re-checking the cond queue
+sub check_conddeps_inst {
+ my ($p, $n, $error, $installed, $aconflicts, $todo, $todo_cond) = @_;
+ for my $c (@$n) {
+ my ($r, $rtype, $cond, @q) = @$c;
+ next unless defined $cond; # already handled?
+ next if grep {$installed->{$_}} @q; # already fulfilled
+ my @cx = grep {!$installed->{$_}} @$cond; # open conditions
+ if (!@cx) {
+ $c->[2] = undef; # mark as handled to avoid dups
+ if (@q) {
+ push @$todo, $c, $p;
+ } elsif (@$cond) {
+ if (defined($p)) {
+ push @$error, map {"$p conflicts with $_"} sort(@$cond);
+ } else {
+ push @$error, map {"conflicts with $_"} sort(@$cond);
+ }
+ }
+ } else {
+ if (!@q && @cx == 1) {
+ if (defined($p)) {
+ $aconflicts->{$cx[0]} = "is in conflict with $p";
+ } else {
+ $aconflicts->{$cx[0]} = "is in conflict";
+ }
+ } elsif ($todo_cond) {
+ push @{$todo_cond->{$_}}, [ $c, $p ] for @cx;
+ }
+ }
+ }
+}
+
+# handle a normalized rich dependency from a not-yet installed package
+# (we just check conflicts)
+sub check_conddeps_notinst {
+ my ($p, $n, $eq, $installed) = @_;
+ my $ret = 0;
+ for my $c (@$n) {
+ my ($r, $rtype, $cond, @q) = @$c;
+ next if @q || !@$cond || grep {!$installed->{$_}} @$cond;
+ push @$eq, map {"(provider $p conflicts with $_)"} sort(@$cond);
+ $ret = 1;
+ }
+ return $ret;
+}
+
+sub expand {
+ my ($config, @p) = @_;
+
+ my $conflicts = $config->{'conflicth'};
+ my $pkgconflicts = $config->{'pkgconflictsh'} || {};
+ my $pkgobsoletes = $config->{'pkgobsoletesh'} || {};
+ my $prefer = $config->{'preferh'};
+ my $ignore = $config->{'ignoreh'};
+ my $ignoreconflicts = $config->{'expandflags:ignoreconflicts'};
+ my $ignoreignore;
+ my $userecommendsforchoices = 1;
+
+ my $whatprovides = $config->{'whatprovidesh'};
+ my $requires = $config->{'requiresh'};
+
+ my $xignore = { map {substr($_, 1) => 1} grep {/^-/} @p };
+ $ignore = {} if $xignore->{'-ignoreignore--'};
+ if ($ignoreignore) {
+ $xignore = {};
+ $ignore = {};
+ }
+ my @directdepsend;
+ if ($xignore->{'-directdepsend--'}) {
+ delete $xignore->{'-directdepsend--'};
+ @directdepsend = @p;
+ for my $p (splice @p) {
+ last if $p eq '--directdepsend--';
+ push @p, $p;
+ }
+ @directdepsend = grep {!/^-/} splice(@directdepsend, @p + 1);
+ }
+
+ my %p; # expanded packages
+ my @todo; # dependencies to install
+ my @todo_inst; # packages we decided to install
+ my %todo_cond;
+ my %recommended; # recommended by installed packages
+ my @rec_todo; # installed todo
+ my @error;
+ my %aconflicts; # packages we are conflicting with
+
+ # handle direct conflicts
+ for (grep {/^!/} @p) {
+ my $r = /^!!/ ? substr($_, 2) : substr($_, 1);
+ if ($r =~ /^\(.*\)$/) {
+ my $n = normalizerich($config, undef, $r, 1, \@error);
+ my %naconflicts;
+ check_conddeps_inst(undef, $n, \@error, \%p, \%naconflicts, \@todo, \%todo_cond);
+ push @{$aconflicts{$_}}, $naconflicts{$_} for keys %naconflicts;
+ next;
+ }
+ my @q = @{$whatprovides->{$r} || addproviders($config, $r)};
+ @q = nevrmatch($config, $r, @q) if /^!!/;
+ push @{$aconflicts{$_}}, "is in conflict" for @q;
+ }
+ @p = grep {!/^[-!]/} @p;
+
+ # add direct dependency packages. this is different from below,
+ # because we add packages even if the dep is already provided and
+ # we break ambiguities if the name is an exact match.
+ for my $r (splice @p) {
+ if ($r =~ /^\(.*\)$/) {
+ push @p, $r; # rich deps are never direct
+ next;
+ }
+ my @q = @{$whatprovides->{$r} || addproviders($config, $r)};
+ my $pn = $r;
+ $pn =~ s/ .*//;
+ @q = grep {$_ eq $pn} @q;
+ if (@q != 1) {
+ push @p, $r;
+ next;
+ }
+ my $p = $q[0];
+ print "added $p because of $r (direct dep)\n" if $expand_dbg;
+ push @todo_inst, $p;
+ }
+
+ for my $r (@p, @directdepsend) {
+ if ($r =~ /^\(.*\)$/) {
+ # rich dep. normalize, put on todo.
+ my $n = normalizerich($config, undef, $r, 0, \@error);
+ my %naconflicts;
+ check_conddeps_inst(undef, $n, \@error, \%p, \%naconflicts, \@todo, \%todo_cond);
+ push @{$aconflicts{$_}}, $naconflicts{$_} for keys %naconflicts;
+ } else {
+ push @todo, $r, undef;
+ }
+ }
+
+ for my $p (@todo_inst) {
+ push @error, map {"$p $_"} @{$aconflicts{$p}} if $aconflicts{$p};
+ }
+ return (undef, @error) if @error;
+
+ while (@todo || @todo_inst) {
+ # install a set of chosen packages
+ # ($aconficts must not be set for any of them)
+ if (@todo_inst) {
+ @todo_inst = unify(@todo_inst) if @todo_inst > 1;
+
+ # check aconflicts (just in case)
+ for my $p (@todo_inst) {
+ push @error, map {"$p $_"} @{$aconflicts{$p}} if $aconflicts{$p};
+ }
+ return (undef, @error) if @error;
+
+ # check against old cond dependencies. we do this step by step so we don't get dups.
+ for my $p (@todo_inst) {
+ $p{$p} = 1;
+ if ($todo_cond{$p}) {
+ for my $c (@{delete $todo_cond{$p}}) {
+ my %naconflicts;
+ check_conddeps_inst($c->[1], [ $c->[0] ], \@error, \%p, \%naconflicts, \@todo);
+ push @{$aconflicts{$_}}, $naconflicts{$_} for keys %naconflicts;
+ }
+ }
+ delete $aconflicts{$p}; # no longer needed
+ }
+ return undef, @error if @error;
+
+ # now check our own dependencies
+ for my $p (@todo_inst) {
+ my %naconflicts;
+ my %naobsoletes;
+ $naconflicts{$_} = "is in conflict with $p" for @{$conflicts->{$p} || []};
+ for my $r (@{$requires->{$p} || []}) {
+ if ($r =~ /^\(.*\)$/) {
+ my $n = normalizerich($config, $p, $r, 0, \@error, $ignore, $xignore);
+ check_conddeps_inst($p, $n, \@error, \%p, \%naconflicts, \@todo, \%todo_cond);
+ next;
+ }
+ my $ri = (split(/[ <=>]/, $r, 2))[0];
+ next if $ignore->{"$p:$ri"} || $xignore->{"$p:$ri"};
+ next if $ignore->{$ri} || $xignore->{$ri};
+ push @todo, ($r, $p);
+ }
+ if (!$ignoreconflicts) {
+ for my $r (@{$pkgconflicts->{$p}}) {
+ if ($r =~ /^\(.*\)$/) {
+ my $n = normalizerich($config, $p, $r, 1, \@error);
+ check_conddeps_inst($p, $n, \@error, \%p, \%naconflicts, \@todo, \%todo_cond);
+ next;
+ }
+ $naconflicts{$_} = "is in conflict with $p" for @{$whatprovides->{$r} || addproviders($config, $r)};
+ }
+ for my $r (@{$pkgobsoletes->{$p}}) {
+ $naobsoletes{$_} = "is obsoleted by $p" for nevrmatch($config, $r, @{$whatprovides->{$r} || addproviders($config, $r)});
+ }
+ }
+ if (%naconflicts) {
+ push @error, map {"$p conflicts with $_"} grep {$_ ne $p && $p{$_}} sort keys %naconflicts;
+ push @{$aconflicts{$_}}, $naconflicts{$_} for keys %naconflicts;
+ }
+ if (%naobsoletes) {
+ push @error, map {"$p obsoletes $_"} grep {$_ ne $p && $p{$_}} sort keys %naobsoletes;
+ push @{$aconflicts{$_}}, $naobsoletes{$_} for keys %naobsoletes;
+ }
+ push @rec_todo, $p if $userecommendsforchoices;
+ }
+ return undef, @error if @error;
+ @todo_inst = ();
+ }
+
+ for my $pass (0, 1, 2, 3, 4, 5) {
+ my @todo_next;
+ while (@todo) {
+ my ($r, $p) = splice(@todo, 0, 2);
+ my $rtodo = $r;
+ my @q;
+ if (ref($r)) {
+ ($r, undef, undef, @q) = @$r;
+ } else {
+ @q = @{$whatprovides->{$r} || addproviders($config, $r)};
+ }
+ next if grep {$p{$_}} @q;
+ my $pp = defined($p) ? "$p:" : '';
+ my $pn = defined($p) ? " needed by $p" : '';
+ if (defined($p) && !$ignoreignore) {
+ next if grep {$ignore->{$_} || $xignore->{$_}} @q;
+ next if grep {$ignore->{"$pp$_"} || $xignore->{"$pp$_"}} @q;
+ }
+
+ if (!@q) {
+ next if $r =~ /^\// && defined($p);
+ push @error, "nothing provides $r$pn";
+ next;
+ }
+
+ if (@q > 1 && $pass == 0) {
+ push @todo_next, $rtodo, $p;
+ next;
+ }
+
+ # pass 0: only one provider
+ # pass 1: conflict pruning
+ my $nq = @q;
+ my @eq;
+ for my $q (@q) {
+ push @eq, map {"(provider $q $_)"} @{$aconflicts{$q}} if $aconflicts{$q};
+ }
+ @q = grep {!$aconflicts{$_}} @q;
+ if (!$ignoreconflicts) {
+ for my $q (splice @q) {
+ push @q, $q unless @{$pkgconflicts->{$q} || []} && checkconflicts($config, \%p, $q, \@eq, @{$pkgconflicts->{$q}});
+ }
+ for my $q (splice @q) {
+ push @q, $q unless @{$pkgobsoletes->{$q} || []} && checkobsoletes($config, \%p, $q, \@eq, @{$pkgobsoletes->{$q}});
+ }
+ }
+
+ if (!@q) {
+ push @error, "conflict for providers of $r$pn", sort(@eq);
+ next;
+ }
+ if (@q == 1) {
+ push @todo_inst, $q[0];
+ print "added $q[0] because of $pp$r\n" if $expand_dbg;
+ next;
+ }
+
+ # pass 2: prune neg prefers and simple pos prefers
+ if ($pass < 2) {
+ print "undecided about $pp$r: @q\n" if $expand_dbg;
+ push @todo_next, $rtodo, $p;
+ next;
+ }
+ if (@q > 1) {
+ my @pq = grep {!$prefer->{"-$_"} && !$prefer->{"-$pp$_"}} @q;
+ @q = @pq if @pq;
+ @pq = grep {$prefer->{$_} || $prefer->{"$pp$_"}} @q;
+ @q = @pq if @pq == 1;
+ }
+ if (@q == 1) {
+ push @todo_inst, $q[0];
+ print "added $q[0] because of $pp$r\n" if $expand_dbg;
+ next;
+ }
+
+ # pass 3: prune pos prefers and debian choice deps
+ if ($pass < 3) {
+ push @todo_next, $rtodo, $p;
+ next;
+ }
+ if (@q > 1) {
+ my @pq = grep {$prefer->{$_} || $prefer->{"$pp$_"}} @q;
+ if (@pq > 1) {
+ my %pq = map {$_ => 1} @pq;
+ @q = (grep {$pq{$_}} @{$config->{'prefer'}})[0];
+ } elsif (@pq == 1) {
+ @q = @pq;
+ }
+ }
+ if (@q > 1 && $r =~ /\|/) {
+ # choice op, implicit prefer of first match...
+ my %pq = map {$_ => 1} @q;
+ for my $rr (split(/\s*\|\s*/, $r)) {
+ next unless $whatprovides->{$rr};
+ my @pq = grep {$pq{$_}} @{$whatprovides->{$rr}};
+ next unless @pq;
+ @q = @pq;
+ last;
+ }
+ }
+ if (@q == 1) {
+ push @todo_inst, $q[0];
+ print "added $q[0] because of $pp$r\n" if $expand_dbg;
+ next;
+ }
+
+ # pass 4: prune recommends
+ if ($pass < 4) {
+ push @todo_next, $rtodo, $p;
+ next;
+ }
+ todo2recommended($config, \%recommended, \@rec_todo) if @rec_todo;
+ my @pq = grep {$recommended{$_}} @q;
+ print "recommended [@pq] among [@q]\n" if $expand_dbg;
+ @q = @pq if @pq;
+ if (@q == 1) {
+ push @todo_inst, $q[0];
+ print "added $q[0] because of $pp$r\n" if $expand_dbg;
+ next;
+ }
+
+ # pass 5: record error
+ if ($pass < 5) {
+ push @todo_next, $rtodo, $p;
+ next;
+ }
+ @q = sort(@q);
+ if (defined($p)) {
+ push @error, "have choice for $r needed by $p: @q";
+ } else {
+ push @error, "have choice for $r: @q";
+ }
+ }
+ @todo = @todo_next;
+ last if @todo_inst;
+ }
+ return undef, @error if @error;
+ }
+
+ return 1, (sort keys %p);
+}
+
+sub order {
+ my ($config, @p) = @_;
+
+ my $requires = $config->{'requiresh'};
+ my $recommends = $config->{'recommendsh'};
+ my $whatprovides = $config->{'whatprovidesh'};
+ my %deps;
+ my %rdeps;
+ my %needed;
+ my %p = map {$_ => 1} @p;
+ for my $p (@p) {
+ my @r;
+ for my $r (@{$requires->{$p} || []}) {
+ my @q = @{$whatprovides->{$r} || addproviders($config, $r)};
+ push @r, grep {$_ ne $p && $p{$_}} @q;
+ }
+ if (%{$config->{'order'} || {}}) {
+ push @r, grep {$_ ne $p && $config->{'order'}->{"$_:$p"}} @p;
+ }
+ @r = unify(@r);
+ $deps{$p} = \@r;
+ $needed{$p} = @r;
+ push @{$rdeps{$_}}, $p for @r;
+ }
+ @p = sort {$needed{$a} <=> $needed{$b} || $a cmp $b} @p;
+ my @good;
+ my @res;
+ # the big sort loop
+ while (@p) {
+ @good = grep {$needed{$_} == 0} @p;
+ if (@good) {
+ @p = grep {$needed{$_}} @p;
+ push @res, @good;
+ for my $p (@good) {
+ $needed{$_}-- for @{$rdeps{$p}};
+ }
+ next;
+ }
+ # uh oh, cycle alert. find and remove all cycles.
+ my %notdone = map {$_ => 1} @p;
+ $notdone{$_} = 0 for @res; # already did those
+ my @todo = @p;
+ while (@todo) {
+ my $v = shift @todo;
+ if (ref($v)) {
+ $notdone{$$v} = 0; # finished this one
+ next;
+ }
+ my $s = $notdone{$v};
+ next unless $s;
+ my @e = grep {$notdone{$_}} @{$deps{$v}};
+ if (!@e) {
+ $notdone{$v} = 0; # all deps done, mark as finished
+ next;
+ }
+ if ($s == 1) {
+ $notdone{$v} = 2; # now under investigation
+ unshift @todo, @e, \$v;
+ next;
+ }
+ # reached visited package, found a cycle!
+ my @cyc = ();
+ my $cycv = $v;
+ # go back till $v is reached again
+ while(1) {
+ die unless @todo;
+ $v = shift @todo;
+ next unless ref($v);
+ $v = $$v;
+ $notdone{$v} = 1 if $notdone{$v} == 2;
+ unshift @cyc, $v;
+ last if $v eq $cycv;
+ }
+ unshift @todo, $cycv;
+ print STDERR "cycle: ".join(' -> ', @cyc)."\n";
+ my $breakv;
+ my @breakv = (@cyc, $cyc[0]);
+ while (@breakv > 1) {
+ last if $config->{'order'}->{"$breakv[0]:$breakv[1]"};
+ shift @breakv;
+ }
+ if (@breakv > 1) {
+ $breakv = $breakv[0];
+ } else {
+ $breakv = (sort {$needed{$a} <=> $needed{$b} || $a cmp $b} @cyc)[-1];
+ }
+ push @cyc, $cyc[0]; # make it loop
+ shift @cyc while $cyc[0] ne $breakv;
+ $v = $cyc[1];
+ print STDERR " breaking dependency $breakv -> $v\n";
+ $deps{$breakv} = [ grep {$_ ne $v} @{$deps{$breakv}} ];
+ $rdeps{$v} = [ grep {$_ ne $breakv} @{$rdeps{$v}} ];
+ $needed{$breakv}--;
+ }
+ }
+ return @res;
+}
+
+sub add_all_providers {
+ my ($config, @p) = @_;
+ my $whatprovides = $config->{'whatprovidesh'};
+ my $requires = $config->{'requiresh'};
+ my $recommends = $config->{'recommendsh'};
+ my %a;
+ for my $p (@p) {
+ for my $r (@{$requires->{$p} || [$p]}) {
+ my $rn = (split(' ', $r, 2))[0];
+ $a{$_} = 1 for @{$whatprovides->{$rn} || []};
+ }
+ }
+ push @p, keys %a;
+ return unify(@p);
+}
+
+###########################################################################
+
+sub recipe2buildtype {
+ my ($recipe) = @_;
+ return undef unless defined $recipe;
+ return $1 if $recipe =~ /\.(spec|dsc|kiwi|livebuild)$/;
+ $recipe =~ s/.*\///;
+ $recipe =~ s/^_service:.*://;
+ return 'arch' if $recipe eq 'PKGBUILD';
+ return 'collax' if $recipe eq 'build.collax';
+ return 'snapcraft' if $recipe eq 'snapcraft.yaml';
+ return 'appimage' if $recipe eq 'appimage.yml';
+ return 'docker' if $recipe eq 'Dockerfile';
+ return 'fissile' if $recipe eq 'fissile.yml';
+ return 'preinstallimage' if $recipe eq '_preinstallimage';
+ return 'simpleimage' if $recipe eq 'simpleimage';
+ return undef;
+}
+
+sub show {
+ my ($conffile, $fn, $field, $arch) = @ARGV;
+ my $cf = read_config($arch, $conffile);
+ die unless $cf;
+ my $d = Build::parse($cf, $fn);
+ die("$d->{'error'}\n") if $d->{'error'};
+ $d->{'sources'} = [ map {ref($d->{$_}) ? @{$d->{$_}} : $d->{$_}} grep {/^source/} sort keys %$d ];
+ $d->{'patches'} = [ map {ref($d->{$_}) ? @{$d->{$_}} : $d->{$_}} grep {/^patch/} sort keys %$d ];
+ my $x = $d->{$field};
+ $x = [ $x ] unless ref $x;
+ print "$_\n" for @$x;
+}
+
+sub parse_preinstallimage {
+ return undef unless $do_rpm;
+ my $d = Build::Rpm::parse(@_);
+ $d->{'name'} ||= 'preinstallimage';
+ return $d;
+}
+
+sub parse_simpleimage {
+ return undef unless $do_rpm;
+ my $d = Build::Rpm::parse(@_);
+ $d->{'name'} ||= 'simpleimage';
+ if (!defined($d->{'version'})) {
+ my @s = stat($_[1]);
+ $d->{'version'} = strftime "%Y.%m.%d-%H.%M.%S", gmtime($s[9] || time);
+ }
+ return $d;
+}
+
+sub parse {
+ my ($cf, $fn, @args) = @_;
+ return Build::Rpm::parse($cf, $fn, @args) if $do_rpm && $fn =~ /\.spec$/;
+ 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::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 parse_simpleimage($cf, $fn, @args) if $fnx eq 'simpleimage';
+ return Build::Snapcraft::parse($cf, $fn, @args) if $do_snapcraft && $fnx eq 'snapcraft.yaml';
+ return Build::Appimage::parse($cf, $fn, @args) if $do_appimage && $fnx eq 'appimage.yml';
+ return Build::Docker::parse($cf, $fn, @args) if $do_docker && $fnx eq 'Dockerfile';
+ return Build::Fissile::parse($cf, $fn, @args) if $do_fissile && $fnx eq 'fissile.yml';
+ return Build::Arch::parse($cf, $fn, @args) if $do_arch && $fnx eq 'PKGBUILD';
+ return Build::Collax::parse($cf, $fn, @args) if $do_collax && $fnx eq 'build.collax';
+ 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::Snapcraft::parse($cf, $fn, @args) if $do_snapcraft && $buildtype eq 'snapcraft';
+ return Build::Appimage::parse($cf, $fn, @args) if $do_appimage && $buildtype eq 'appimage';
+ return Build::Docker::parse($cf, $fn, @args) if $do_docker && $buildtype eq 'docker';
+ return Build::Fissile::parse($cf, $fn, @args) if $do_fissile && $buildtype eq 'fissile';
+ return parse_simpleimage($cf, $fn, @args) if $buildtype eq 'simpleimage';
+ return Build::Arch::parse($cf, $fn, @args) if $do_arch && $buildtype eq 'arch';
+ return Build::Collax::parse($cf, $fn, @args) if $do_collax && $buildtype eq 'collax';
+ return parse_preinstallimage($cf, $fn, @args) if $buildtype eq 'preinstallimage';
+ return undef;
+}
+
+sub query {
+ my ($binname, %opts) = @_;
+ my $handle = $binname;
+ if (ref($binname) eq 'ARRAY') {
+ $handle = $binname->[1];
+ $binname = $binname->[0];
+ }
+ return Build::Rpm::query($handle, %opts) if $do_rpm && $binname =~ /\.d?rpm$/;
+ return Build::Deb::query($handle, %opts) if $do_deb && $binname =~ /\.deb$/;
+ return Build::Kiwi::queryiso($handle, %opts) if $do_kiwi && $binname =~ /\.iso$/;
+ return Build::Arch::query($handle, %opts) if $do_arch && $binname =~ /\.pkg\.tar(?:\.gz|\.xz)?$/;
+ return Build::Arch::query($handle, %opts) if $do_arch && $binname =~ /\.arch$/;
+ return undef;
+}
+
+sub showquery {
+ my ($fn, $field) = @ARGV;
+ my %opts;
+ $opts{'evra'} = 1 if grep {$_ eq $field} qw{epoch version release arch buildid};
+ $opts{'weakdeps'} = 1 if grep {$_ eq $field} qw{suggests enhances recommends supplements};
+ $opts{'conflicts'} = 1 if grep {$_ eq $field} qw{conflicts obsoletes};
+ $opts{'description'} = 1 if grep {$_ eq $field} qw{summary description};
+ $opts{'filelist'} = 1 if $field eq 'filelist';
+ $opts{'buildtime'} = 1 if grep {$_ eq $field} qw{buildtime buildid};
+ my $d = Build::query($fn, %opts);
+ die("cannot query $fn\n") unless $d;
+ $d->{'buildid'} = getbuildid($d);
+ my $x = $d->{$field};
+ $x = [] unless defined $x;
+ $x = [ $x ] unless ref $x;
+ print "$_\n" for @$x;
+}
+
+sub queryhdrmd5 {
+ my ($binname) = @_;
+ return Build::Rpm::queryhdrmd5(@_) if $do_rpm && $binname =~ /\.d?rpm$/;
+ return Build::Deb::queryhdrmd5(@_) if $do_deb && $binname =~ /\.deb$/;
+ return Build::Kiwi::queryhdrmd5(@_) if $do_kiwi && $binname =~ /\.iso$/;
+ return Build::Kiwi::queryhdrmd5(@_) if $do_kiwi && $binname =~ /\.raw$/;
+ return Build::Kiwi::queryhdrmd5(@_) if $do_kiwi && $binname =~ /\.raw.install$/;
+ return Build::Arch::queryhdrmd5(@_) if $do_arch && $binname =~ /\.pkg\.tar(?:\.gz|\.xz)?$/;
+ return Build::Arch::queryhdrmd5(@_) if $do_arch && $binname =~ /\.arch$/;
+ return undef;
+}
+
+sub queryinstalled {
+ my ($binarytype, @args) = @_;
+ return Build::Rpm::queryinstalled(@args) if $binarytype eq 'rpm';
+ return Build::Deb::queryinstalled(@args) if $binarytype eq 'deb';
+ return Build::Arch::queryinstalled(@args) if $binarytype eq 'arch';
+ return undef;
+}
+
+1;
diff --git a/Build/Appimage.pm b/Build/Appimage.pm
new file mode 100644
index 0000000..df38a8f
--- /dev/null
+++ b/Build/Appimage.pm
@@ -0,0 +1,65 @@
+################################################################
+#
+# Copyright (c) 2017 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Appimage;
+
+use strict;
+use Build::Deb;
+use Build::Rpm;
+
+eval { require YAML::XS; };
+*YAML::XS::LoadFile = sub {die("YAML::XS is not available\n")} unless defined &YAML::XS::LoadFile;
+
+sub parse {
+ my ($cf, $fn) = @_;
+
+ my $yml;
+ eval { $yml = YAML::XS::LoadFile($fn); };
+ return {'error' => "Failed to parse yml file"} unless $yml;
+
+ my $ret = {};
+ $ret->{'name'} = $yml->{'app'};
+ $ret->{'version'} = $yml->{'version'} || "0";
+
+ my @packdeps;
+ if ($yml->{'ingredients'}) {
+ for my $pkg (@{$yml->{'ingredients'}->{'packages'} || {}}) {
+ push @packdeps, $pkg;
+ }
+ }
+ if ($yml->{'build'} && $yml->{'build'}->{'packages'}) {
+ for my $pkg (@{$yml->{'build'}->{'packages'}}) {
+ push @packdeps, $pkg;
+ }
+ }
+ $ret->{'deps'} = \@packdeps;
+
+ my @sources;
+ if ($yml->{'build'} && $yml->{'build'}->{'files'}) {
+ for my $source (@{$yml->{'build'}->{'files'}}) {
+ push @sources, $source;
+ }
+ }
+ $ret->{'sources'} = \@sources;
+
+ return $ret;
+}
+
+1;
diff --git a/Build/Arch.pm b/Build/Arch.pm
new file mode 100644
index 0000000..c99d2a6
--- /dev/null
+++ b/Build/Arch.pm
@@ -0,0 +1,331 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Arch;
+
+use strict;
+use Digest::MD5;
+
+eval { require Archive::Tar; };
+*Archive::Tar::new = sub {die("Archive::Tar is not available\n")} unless defined &Archive::Tar::new;
+
+
+# Archlinux support, based on the GSoC work of Nikolay Rysev <mad.f3ka@gmail.com>
+
+# parse a PKGBUILD file
+
+sub quote {
+ my ($str, $q, $vars) = @_;
+ if ($q ne "'" && $str =~ /\$/) {
+ $str =~ s/\$([a-zA-Z0-9_]+|\{([^\}]+)\})/join(' ', @{$vars->{$2 || $1} || []})/ge;
+ }
+ $str =~ s/([ \t\"\'\$])/sprintf("%%%02X", ord($1))/ge;
+ return $str;
+}
+
+sub unquotesplit {
+ my ($str, $vars) = @_;
+ $str =~ s/%/%25/g;
+ $str =~ s/^[ \t]+//;
+ while ($str =~ /([\"\'])/) {
+ my $q = $1;
+ last unless $str =~ s/$q(.*?)$q/quote($1, $q, $vars)/e;
+ }
+ if ($str =~ /\$/) {
+ $str =~ s/\$([a-zA-Z0-9_]+|\{([^\}]+)\})/join(' ', @{$vars->{$2 || $1} || []})/ge;
+ }
+ my @args = split(/[ \t]+/, $str);
+ for (@args) {
+ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge
+ }
+ return @args;
+}
+
+sub parse {
+ my ($config, $pkgbuild) = @_;
+ my $ret;
+ local *PKG;
+ if (!open(PKG, '<', $pkgbuild)) {
+ $ret->{'error'} = "$pkgbuild: $!";
+ return $ret;
+ }
+ my %vars;
+ my @ifs;
+ while (<PKG>) {
+ chomp;
+ next if /^\s*$/;
+ next if /^\s*#/;
+ s/^\s+//;
+ if (/^(el)?if\s+(?:(?:test|\[)\s+(-n|-z)\s+)?(.*?)\s*\]?\s*;\s*then\s*$/) {
+ if ($1) {
+ $ifs[-1] += 1;
+ next if $ifs[-1] != 1;
+ pop @ifs;
+ }
+ my $flag = $2 || '-n';
+ my $t = join('', unquotesplit($3, \%vars));
+ $t = $t eq '' ? 'true' : '' if $flag eq '-z';
+ push @ifs, $t ne '' ? 1 : 0;
+ next;
+ }
+ if (@ifs) {
+ if (/^fi\s*$/) {
+ pop @ifs;
+ next;
+ } elsif (/^else\s*$/) {
+ $ifs[-1] += 1;
+ next;
+ }
+ next if grep {$_ != 1} @ifs;
+ }
+ last unless /^([a-zA-Z0-9_]*)(\+?)=(\(?)(.*?)$/;
+ my $var = $1;
+ my $app = $2;
+ my $val = $4;
+ if ($3) {
+ while ($val !~ s/\)\s*(?:#.*)?$//s) {
+ my $nextline = <PKG>;
+ last unless defined $nextline;
+ chomp $nextline;
+ $val .= ' ' . $nextline;
+ }
+ }
+ if ($app) {
+ push @{$vars{$var}}, unquotesplit($val, \%vars);
+ } else {
+ $vars{$var} = [ unquotesplit($val, \%vars) ];
+ }
+ }
+ close PKG;
+ $ret->{'name'} = $vars{'pkgname'}->[0] if $vars{'pkgname'};
+ $ret->{'version'} = $vars{'pkgver'}->[0] if $vars{'pkgver'};
+ $ret->{'deps'} = [];
+ push @{$ret->{'deps'}}, @{$vars{$_} || []} for qw{makedepends checkdepends depends};
+ # get arch from macros
+ my $arch;
+ for (@{$config->{'macros'} || []}) {
+ $arch = $1 if /^%define _target_cpu (\S+)/;
+ }
+ # map to arch linux name and add arch dependent
+ $arch = 'i686' if $arch =~ /^i[345]86$/;
+ push @{$ret->{'deps'}}, @{$vars{"${_}_$arch"} || []} for qw{makedepends checkdepends depends};
+ # Maintain architecture-specific sources for officially supported architectures
+ for my $asuf ('', '_i686', '_x86_64') {
+ $ret->{"source$asuf"} = $vars{"source$asuf"} if $vars{"source$asuf"};
+ }
+ return $ret;
+}
+
+sub islzma {
+ my ($fn) = @_;
+ local *F;
+ return 0 unless open(F, '<', $fn);
+ my $h;
+ return 0 unless read(F, $h, 5) == 5;
+ close F;
+ return $h eq "\3757zXZ";
+}
+
+sub lzmadec {
+ my ($fn) = @_;
+ my $nh;
+ my $pid = open($nh, '-|');
+ return undef unless defined $pid;
+ if (!$pid) {
+ $SIG{'PIPE'} = 'DEFAULT';
+ exec('xzdec', '-dc', $fn);
+ die("xzdec: $!\n");
+ }
+ return $nh;
+}
+
+sub queryvars {
+ my ($handle) = @_;
+
+ if (ref($handle)) {
+ die("arch pkg query not implemented for file handles\n");
+ }
+ if ($handle =~ /\.xz$/ || islzma($handle)) {
+ $handle = lzmadec($handle);
+ }
+ my $tar = Archive::Tar->new;
+ my @read = $tar->read($handle, 1, {'filter' => '^\.PKGINFO$', 'limit' => 1});
+ die("$handle: not an arch package file\n") unless @read == 1;
+ my $pkginfo = $read[0]->get_content;
+ die("$handle: not an arch package file\n") unless $pkginfo;
+ my %vars;
+ $vars{'_pkginfo'} = $pkginfo;
+ for my $l (split('\n', $pkginfo)) {
+ next unless $l =~ /^(.*?) = (.*)$/;
+ push @{$vars{$1}}, $2;
+ }
+ return \%vars;
+}
+
+sub queryfiles {
+ my ($handle) = @_;
+ if (ref($handle)) {
+ die("arch pkg query not implemented for file handles\n");
+ }
+ if ($handle =~ /\.xz$/ || islzma($handle)) {
+ $handle = lzmadec($handle);
+ }
+ my @files;
+ my $tar = Archive::Tar->new;
+ # we use filter_cb here so that Archive::Tar skips the file contents
+ $tar->read($handle, 1, {'filter_cb' => sub {
+ my ($entry) = @_;
+ push @files, $entry->name unless $entry->is_longlink || (@files && $files[-1] eq $entry->name);
+ return 0;
+ }});
+ shift @files if @files && $files[0] eq '.PKGINFO';
+ return \@files;
+}
+
+sub query {
+ my ($handle, %opts) = @_;
+ my $vars = queryvars($handle);
+ my $ret = {};
+ $ret->{'name'} = $vars->{'pkgname'}->[0] if $vars->{'pkgname'};
+ $ret->{'hdrmd5'} = Digest::MD5::md5_hex($vars->{'_pkginfo'});
+ $ret->{'provides'} = $vars->{'provides'} || [];
+ $ret->{'requires'} = $vars->{'depend'} || [];
+ if ($vars->{'pkgname'} && $opts{'addselfprovides'}) {
+ my $selfprovides = $vars->{'pkgname'}->[0];
+ $selfprovides .= "=$vars->{'pkgver'}->[0]" if $vars->{'pkgver'};
+ push @{$ret->{'provides'}}, $selfprovides unless @{$ret->{'provides'} || []} && $ret->{'provides'}->[-1] eq $selfprovides;
+ }
+ if ($opts{'evra'}) {
+ if ($vars->{'pkgver'}) {
+ my $evr = $vars->{'pkgver'}->[0];
+ if ($evr =~ /^([0-9]+):(.*)$/) {
+ $ret->{'epoch'} = $1;
+ $evr = $2;
+ }
+ $ret->{'version'} = $evr;
+ if ($evr =~ /^(.*)-(.*?)$/) {
+ $ret->{'version'} = $1;
+ $ret->{'release'} = $2;
+ }
+ }
+ $ret->{'arch'} = $vars->{'arch'}->[0] if $vars->{'arch'};
+ }
+ if ($opts{'description'}) {
+ $ret->{'description'} = $vars->{'pkgdesc'}->[0] if $vars->{'pkgdesc'};
+ }
+ if ($opts{'conflicts'}) {
+ $ret->{'conflicts'} = $vars->{'conflict'} if $vars->{'conflict'};
+ $ret->{'obsoletes'} = $vars->{'replaces'} if $vars->{'replaces'};
+ }
+ if ($opts{'weakdeps'}) {
+ my @suggests = @{$vars->{'optdepend'} || []};
+ s/:.*// for @suggests;
+ $ret->{'suggests'} = \@suggests if @suggests;
+ }
+ # 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;
+}
+
+sub queryhdrmd5 {
+ my ($handle) = @_;
+ if (ref($handle)) {
+ die("arch pkg query not implemented for file handles\n");
+ }
+ if ($handle =~ /\.xz$/ || islzma($handle)) {
+ $handle = lzmadec($handle);
+ }
+ my $tar = Archive::Tar->new;
+ my @read = $tar->read($handle, 1, {'filter' => '^\.PKGINFO$', 'limit' => 1});
+ die("$handle: not an arch package file\n") unless @read == 1;
+ my $pkginfo = $read[0]->get_content;
+ die("$handle: not an arch package file\n") unless $pkginfo;
+ return Digest::MD5::md5_hex($pkginfo);
+}
+
+sub parserepodata {
+ my ($d, $data) = @_;
+ $d ||= {};
+ $data =~ s/^\n+//s;
+ my @parts = split(/\n\n+/s, $data);
+ for my $part (@parts) {
+ my @p = split("\n", $part);
+ my $p = shift @p;
+ if ($p eq '%NAME%') {
+ $d->{'name'} = $p[0];
+ } elsif ($p eq '%VERSION%') {
+ $d->{'version'} = $p[0];
+ } elsif ($p eq '%ARCH%') {
+ $d->{'arch'} = $p[0];
+ } elsif ($p eq '%BUILDDATE%') {
+ $d->{'buildtime'} = $p[0];
+ } elsif ($p eq '%FILENAME%') {
+ $d->{'filename'} = $p[0];
+ } elsif ($p eq '%PROVIDES%') {
+ push @{$d->{'provides'}}, @p;
+ } elsif ($p eq '%DEPENDS%') {
+ push @{$d->{'requires'}}, @p;
+ } elsif ($p eq '%OPTDEPENDS%') {
+ push @{$d->{'suggests'}}, @p;
+ } elsif ($p eq '%CONFLICTS%') {
+ push @{$d->{'conflicts'}}, @p;
+ } elsif ($p eq '%REPLACES%') {
+ push @{$d->{'obsoletes'}}, @p;
+ } elsif ($p eq '%MD5SUM%') {
+ $d->{'checksum_md5'} = $p[0];
+ } elsif ($p eq '%SHA256SUM%') {
+ $d->{'checksum_sha256'} = $p[0];
+ }
+ }
+ return $d;
+}
+
+sub queryinstalled {
+ my ($root, %opts) = @_;
+
+ $root = '' if !defined($root) || $root eq '/';
+ local *D;
+ local *F;
+ opendir(D, "$root/var/lib/pacman/local") || return [];
+ my @pn = sort(grep {!/^\./} readdir(D));
+ closedir(D);
+ my @pkgs;
+ for my $pn (@pn) {
+ next unless open(F, '<', "$root/var/lib/pacman/local/$pn/desc");
+ my $data = '';
+ 1 while sysread(F, $data, 8192, length($data));
+ close F;
+ my $d = parserepodata(undef, $data);
+ next unless defined $d->{'name'};
+ my $q = {};
+ for (qw{name arch buildtime version}) {
+ $q->{$_} = $d->{$_} if defined $d->{$_};
+ }
+ $q->{'epoch'} = $1 if $q->{'version'} =~ s/^(\d+)://s;
+ $q->{'release'} = $1 if $q->{'version'} =~ s/-([^-]*)$//s;
+ push @pkgs, $q;
+ }
+ return \@pkgs;
+}
+
+
+1;
diff --git a/Build/Archrepo.pm b/Build/Archrepo.pm
new file mode 100644
index 0000000..7d54e79
--- /dev/null
+++ b/Build/Archrepo.pm
@@ -0,0 +1,105 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Archrepo;
+
+use strict;
+use Build::Arch;
+
+eval { require Archive::Tar; };
+if (!defined &Archive::Tar::iter) {
+ *Archive::Tar::iter = sub {
+ my ($class, $filename) = @_;
+ die("Archive::Tar is not available\n") unless defined &Archive::Tar::new;
+ Archive::Tar->new();
+ my $handle = $class->_get_handle($filename, 1, 'rb') or return undef;
+ my @data;
+ return sub {
+ return shift(@data) if !$handle || @data;
+ my $files = $class->_read_tar($handle, { limit => 1 });
+ @data = @$files if (ref($files) || '') eq 'ARRAY';
+ undef $handle unless @data;
+ return shift @data;
+ };
+ };
+}
+
+sub addpkg {
+ my ($res, $data, $options) = @_;
+ return unless defined $data->{'version'};
+ if ($options->{'addselfprovides'}) {
+ my $selfprovides = $data->{'name'};
+ $selfprovides .= "=$data->{'version'}" if defined $data->{'version'};
+ push @{$data->{'provides'}}, $selfprovides unless @{$data->{'provides'} || []} && $data->{'provides'}->[-1] eq $selfprovides;
+ }
+ if ($options->{'normalizedeps'}) {
+ # our normalized dependencies have spaces around the op
+ for my $dep (qw {provides requires conflicts obsoletes suggests}) {
+ next unless $data->{$dep};
+ s/ ?([<=>]+) ?/ $1 / for @{$data->{$dep}};
+ }
+ }
+ if (defined($data->{'version'})) {
+ # split version into evr
+ $data->{'epoch'} = $1 if $data->{'version'} =~ s/^(\d+)://s;
+ $data->{'release'} = $1 if $data->{'version'} =~ s/-([^-]*)$//s;
+ }
+ $data->{'location'} = delete($data->{'filename'}) if exists $data->{'filename'};
+ if ($options->{'withchecksum'}) {
+ for (qw {md5 sha1 sha256}) {
+ my $c = delete($data->{"checksum_$_"});
+ $data->{'checksum'} = "$_:$c" if $c;
+ }
+ } else {
+ delete $data->{"checksum_$_"} for qw {md5 sha1 sha256};
+ }
+ if (ref($res) eq 'CODE') {
+ $res->($data);
+ } else {
+ push @$res, $data;
+ }
+}
+
+sub parse {
+ my ($in, $res, %options) = @_;
+ $res ||= [];
+ die("Build::Archrepo::parse needs a filename\n") if ref($in);
+ die("$in: $!\n") unless -e $in;
+ my $repodb = Archive::Tar->iter($in, 1);
+ die("$in is not a tar archive\n") unless $repodb;
+ my $e;
+ my $lastfn = '';
+ my $d;
+ while ($e = $repodb->()) {
+ next unless $e->type() == Archive::Tar::Constant::FILE();
+ my $fn = $e->name();
+ next unless $fn =~ s/\/(?:depends|desc|files)$//s;
+ if ($lastfn ne $fn) {
+ addpkg($res, $d, \%options) if $d->{'name'};
+ $d = {};
+ $lastfn = $fn;
+ }
+ Build::Arch::parserepodata($d, $e->get_content());
+ }
+ addpkg($res, $d, \%options) if $d->{'name'};
+ return $res;
+}
+
+1;
diff --git a/Build/Collax.pm b/Build/Collax.pm
new file mode 100644
index 0000000..2fc332c
--- /dev/null
+++ b/Build/Collax.pm
@@ -0,0 +1,64 @@
+#
+# Copyright 2015 Zarafa B.V. and its licensors
+#
+# This program 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 or (at your option) any later version.
+#
+# This program 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.
+#
+package Build::Collax;
+
+use strict;
+
+sub parse {
+ my($buildconf, $fn) = @_;
+ my @bscript;
+
+ if (ref($fn) eq "ARRAY") {
+ @bscript = @$fn;
+ $fn = undef;
+ } elsif (ref($fn) ne "") {
+ die "Unhandled ref type in collax";
+ } else {
+ local *FH;
+ if (!open(FH, "<", $fn)) {
+ return {"error" => "$fn: $!"};
+ }
+ @bscript = <FH>;
+ chomp(@bscript);
+ close(FH);
+ }
+
+ my $ret = {"deps" => []};
+ for (my $i = 0; $i <= $#bscript; ++$i) {
+ next unless $bscript[$i] =~ m{^\w+=};
+ my $key = lc(substr($&, 0, -1));
+ my $value = $';
+ if ($value =~ m{^([\'\"])}) {
+ $value = substr($value, 1);
+ while ($value !~ m{[\'\"]}) {
+ my @cut = splice(@bscript, $i + 1, 1);
+ $value .= $cut[0];
+ }
+ $value =~ s{[\'\"]}{}s;
+ $value =~ s{\n}{ }gs;
+ }
+ if ($key eq "package") {
+ $ret->{"name"} = $value;
+ } elsif ($key eq "version") {
+ $ret->{$key} = $value;
+ } elsif ($key eq "builddepends" || $key eq "extradepends") {
+ $value =~ s{^\s+}{}gs;
+ $value =~ s{\s+$}{}gs;
+ $value =~ s{,}{ }gs;
+ push(@{$ret->{"deps"}}, split(/\s+/, $value));
+ }
+ }
+ return $ret;
+}
+
+1;
diff --git a/Build/Deb.pm b/Build/Deb.pm
new file mode 100644
index 0000000..16b81e5
--- /dev/null
+++ b/Build/Deb.pm
@@ -0,0 +1,481 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Deb;
+
+use strict;
+use Digest::MD5;
+
+my $have_zlib;
+eval {
+ require Compress::Zlib;
+ $have_zlib = 1;
+};
+
+my %obs2debian = (
+ "i486" => "i386",
+ "i586" => "i386",
+ "i686" => "i386",
+ "ppc" => "powerpc",
+ "ppc64le" => "ppc64el",
+ "x86_64" => "amd64",
+ "armv4l" => "armel",
+ "armv5l" => "armel",
+ "armv6l" => "armel",
+ "armv7el" => "armel",
+ "armv7l" => "armhf",
+ "armv7hl" => "armhf",
+ "aarch64" => "arm64",
+);
+
+sub basearch {
+ my ($arch) = @_;
+ return 'all' if !defined($arch) || $arch eq 'noarch';
+ return $obs2debian{$arch} || $arch;
+}
+
+sub obsarch {
+ my ($arch) = @_;
+ return grep {$obs2debian{$_} eq $arch} sort keys %obs2debian;
+}
+
+sub parse {
+ my ($bconf, $fn) = @_;
+ my $ret;
+ my @control;
+
+ # get arch and os from macros
+ my ($arch, $os);
+ for (@{$bconf->{'macros'} || []}) {
+ $arch = $1 if /^%define _target_cpu (\S+)/;
+ $os = $1 if /^%define _target_os (\S+)/;
+ }
+ # map to debian names
+ $os = 'linux' if !defined($os);
+ $arch = basearch($arch);
+
+ if (ref($fn) eq 'ARRAY') {
+ @control = @$fn;
+ } else {
+ local *F;
+ if (!open(F, '<', $fn)) {
+ $ret->{'error'} = "$fn: $!";
+ return $ret;
+ }
+ @control = <F>;
+ close F;
+ chomp @control;
+ }
+ splice(@control, 0, 3) if @control > 3 && $control[0] =~ /^-----BEGIN/;
+ my $name;
+ my $version;
+ my @deps;
+ my @exclarch;
+ while (@control) {
+ my $c = shift @control;
+ last if $c eq ''; # new paragraph
+ my ($tag, $data) = split(':', $c, 2);
+ next unless defined $data;
+ $tag = uc($tag);
+ while (@control && $control[0] =~ /^\s/) {
+ $data .= "\n".substr(shift @control, 1);
+ }
+ $data =~ s/^\s+//s;
+ $data =~ s/\s+$//s;
+ if ($tag eq 'VERSION') {
+ $version = $data;
+ $version =~ s/-[^-]+$//;
+ } elsif ($tag eq 'ARCHITECTURE') {
+ my @archs = split('\s+', $data);
+ map { s/\Q$os\E-//; s/any-// } @archs;
+ next if grep { $_ eq "any" || $_ eq "all" } @archs;
+ @exclarch = map { obsarch($_) } @archs;
+ # unify
+ my %exclarch = map {$_ => 1} @exclarch;
+ @exclarch = sort keys %exclarch;
+ } elsif ($tag eq 'SOURCE') {
+ $name = $data;
+ } elsif ($tag eq 'BUILD-DEPENDS' || $tag eq 'BUILD-CONFLICTS' || $tag eq 'BUILD-IGNORE' ||
+ $tag eq 'BUILD-DEPENDS-INDEP' || $tag eq 'BUILD-DEPENDS-ARCH' || $tag eq 'BUILD-CONFLICTS-ARCH' ) {
+ my @d = split(/\s*,\s*/, $data);
+ for my $d (@d) {
+ my @alts = split('\s*\|\s*', $d);
+ my @needed;
+ for my $c (@alts) {
+ if ($c =~ /\s+<[^>]+>$/) {
+ my @build_profiles; # Empty for now
+ my $bad = 1;
+ while ($c =~ s/\s+<([^>]+)>$//) {
+ next if (!$bad);
+ my $list_valid = 1;
+ for my $term (split(/\s+/, $1)) {
+ my $isneg = ($term =~ s/^\!//);
+ my $profile_match = grep(/^$term$/, @build_profiles);
+ if (( $profile_match && $isneg) ||
+ (!$profile_match && !$isneg)) {
+ $list_valid = 0;
+ last;
+ }
+ }
+ $bad = 0 if ($list_valid);
+ }
+ next if ($bad);
+ }
+ if ($c =~ /^(.*?)\s*\[(.*)\]$/) {
+ $c = $1;
+ my $isneg = 0;
+ my $bad;
+ for my $q (split('[\s,]', $2)) {
+ $isneg = 1 if $q =~ s/^\!//;
+ $bad = 1 if !defined($bad) && !$isneg;
+ if ($isneg) {
+ if ($q eq $arch || $q eq 'any' || $q eq "$os-$arch" || $q eq "$os-any" || $q eq "any-$arch") {
+ $bad = 1;
+ last;
+ }
+ } elsif ($q eq $arch || $q eq 'any' || $q eq "$os-$arch" || $q eq "$os-any" || $q eq "any-$arch") {
+ $bad = 0;
+ }
+ }
+ next if ($bad);
+ }
+ $c =~ s/^([^:\s]*):(any|native)(.*)$/$1$3/;
+ push @needed, $c;
+ }
+ next unless @needed;
+ $d = join(' | ', @needed);
+ $d =~ s/ \(([^\)]*)\)/ $1/g;
+ $d =~ s/>>/>/g;
+ $d =~ s/<</</g;
+ if ($tag eq 'BUILD-DEPENDS' || $tag eq 'BUILD-DEPENDS-INDEP' || $tag eq 'BUILD-DEPENDS-ARCH') {
+ push @deps, $d;
+ } else {
+ push @deps, "-$d";
+ }
+ }
+ }
+ }
+ $ret->{'name'} = $name;
+ $ret->{'version'} = $version;
+ $ret->{'deps'} = \@deps;
+ $ret->{'exclarch'} = \@exclarch if @exclarch;
+ return $ret;
+}
+
+sub uncompress {
+ my ($data, $tool) = @_;
+ return $data if $tool eq 'cat';
+ return Compress::Zlib::memGunzip($data) if $have_zlib && $tool eq 'gunzip';
+ local (*TMP, *TMP2);
+ open(TMP, "+>", undef) or die("could not open tmpfile\n");
+ syswrite TMP, $data;
+ my $pid = open(TMP2, "-|");
+ die("fork: $!\n") unless defined $pid;
+ if (!$pid) {
+ open(STDIN, "<&TMP");
+ seek(STDIN, 0, 0); # these two lines are a workaround for a perl bug mixing up FD
+ sysseek(STDIN, 0, 0);
+ exec($tool);
+ die("$tool: $!\n");
+ }
+ close(TMP);
+ $data = '';
+ 1 while sysread(TMP2, $data, 1024, length($data)) > 0;
+ if (!close(TMP2)) {
+ warn("$tool error: $?\n");
+ return undef;
+ }
+ return $data;
+}
+
+sub control2res {
+ my ($control) = @_;
+ my %res;
+ my @control = split("\n", $control);
+ while (@control) {
+ my $c = shift @control;
+ last if $c eq ''; # new paragraph
+ my ($tag, $data) = split(':', $c, 2);
+ next unless defined $data;
+ $tag = uc($tag);
+ while (@control && $control[0] =~ /^\s/) {
+ $data .= "\n".substr(shift @control, 1);
+ }
+ $data =~ s/^\s+//s;
+ $data =~ s/\s+$//s;
+ $res{$tag} = $data;
+ }
+ return %res;
+}
+
+sub debq {
+ my ($fn) = @_;
+
+ local *DEBF;
+ if (ref($fn) eq 'GLOB') {
+ *DEBF = *$fn;
+ } elsif (!open(DEBF, '<', $fn)) {
+ warn("$fn: $!\n");
+ return ();
+ }
+ my $data = '';
+ sysread(DEBF, $data, 4096);
+ if (length($data) < 8+60) {
+ warn("$fn: not a debian package - header too short\n");
+ close DEBF unless ref $fn;
+ return ();
+ }
+ if (substr($data, 0, 8+16) ne "!<arch>\ndebian-binary " &&
+ substr($data, 0, 8+16) ne "!<arch>\ndebian-binary/ ") {
+ close DEBF unless ref $fn;
+ return ();
+ }
+ my $len = substr($data, 8+48, 10);
+ $len += $len & 1;
+ if (length($data) < 8+60+$len+60) {
+ my $r = 8+60+$len+60 - length($data);
+ $r -= length($data);
+ if ((sysread(DEBF, $data, $r < 4096 ? 4096 : $r, length($data)) || 0) < $r) {
+ warn("$fn: unexpected EOF\n");
+ close DEBF unless ref $fn;
+ return ();
+ }
+ }
+ $data = substr($data, 8 + 60 + $len);
+ my $controlname = substr($data, 0, 16);
+ my $decompressor;
+ if ($controlname eq 'control.tar.gz ' || $controlname eq 'control.tar.gz/ ') {
+ $decompressor = 'gunzip';
+ } elsif ($controlname eq 'control.tar.xz ' || $controlname eq 'control.tar.xz/ ') {
+ $decompressor = 'unxz';
+ } elsif ($controlname eq 'control.tar ' || $controlname eq 'control.tar/ ') {
+ $decompressor = 'cat';
+ } else {
+ warn("$fn: control.tar is not second ar entry\n");
+ close DEBF unless ref $fn;
+ return ();
+ }
+ $len = substr($data, 48, 10);
+ if (length($data) < 60+$len) {
+ my $r = 60+$len - length($data);
+ if ((sysread(DEBF, $data, $r, length($data)) || 0) < $r) {
+ warn("$fn: unexpected EOF\n");
+ close DEBF unless ref $fn;
+ return ();
+ }
+ }
+ close DEBF unless ref($fn);
+ $data = substr($data, 60, $len);
+ my $controlmd5 = Digest::MD5::md5_hex($data); # our header signature
+ $data = uncompress($data, $decompressor);
+ if (!$data) {
+ warn("$fn: corrupt control.tar file\n");
+ return ();
+ }
+ my $control;
+ while (length($data) >= 512) {
+ my $n = substr($data, 0, 100);
+ $n =~ s/\0.*//s;
+ my $len = oct('00'.substr($data, 124,12));
+ my $blen = ($len + 1023) & ~511;
+ if (length($data) < $blen) {
+ warn("$fn: corrupt control.tar file\n");
+ return ();
+ }
+ if ($n eq './control' || $n eq "control") {
+ $control = substr($data, 512, $len);
+ last;
+ }
+ $data = substr($data, $blen);
+ }
+ my %res = control2res($control);
+ $res{'CONTROL_MD5'} = $controlmd5;
+ return %res;
+}
+
+sub query {
+ my ($handle, %opts) = @_;
+
+ my %res = debq($handle);
+ return undef unless %res;
+ my $name = $res{'PACKAGE'};
+ my $src = $name;
+ if ($res{'SOURCE'}) {
+ $src = $res{'SOURCE'};
+ $src =~ s/\s.*$//;
+ }
+ my @provides = split(',\s*', $res{'PROVIDES'} || '');
+ if ($opts{'addselfprovides'}) {
+ push @provides, "$name (= $res{'VERSION'})";
+ }
+ my @depends = split(',\s*', $res{'DEPENDS'} || '');
+ push @depends, split(',\s*', $res{'PRE-DEPENDS'} || '');
+ my $data = {
+ name => $name,
+ hdrmd5 => $res{'CONTROL_MD5'},
+ provides => \@provides,
+ requires => \@depends,
+ };
+ if ($opts{'conflicts'}) {
+ my @conflicts = split(',\s*', $res{'CONFLICTS'} || '');
+ push @conflicts, split(',\s*', $res{'BREAKS'} || '');
+ $data->{'conflicts'} = \@conflicts if @conflicts;
+ }
+ if ($opts{'weakdeps'}) {
+ for my $dep ('SUGGESTS', 'RECOMMENDS', 'ENHANCES') {
+ $data->{lc($dep)} = [ split(',\s*', $res{$dep} || '') ] if defined $res{$dep};
+ }
+ }
+ $data->{'source'} = $src if $src ne '';
+ if ($opts{'evra'}) {
+ $res{'VERSION'} =~ /^(?:(\d+):)?(.*?)(?:-([^-]*))?$/s;
+ $data->{'epoch'} = $1 if defined $1;
+ $data->{'version'} = $2;
+ $data->{'release'} = $3 if defined $3;
+ $data->{'arch'} = $res{'ARCHITECTURE'};
+ }
+ if ($opts{'description'}) {
+ $data->{'description'} = $res{'DESCRIPTION'};
+ }
+ if ($opts{'normalizedeps'}) {
+ for my $dep (qw{provides requires conflicts suggests enhances recommends}) {
+ next unless $data->{$dep};
+ for (@{$data->{$dep}}) {
+ s/ \(([^\)]*)\)/ $1/g;
+ s/<</</g;
+ s/>>/>/g;
+ }
+ }
+ }
+ return $data;
+}
+
+sub queryhdrmd5 {
+ my ($bin) = @_;
+
+ local *F;
+ open(F, '<', $bin) || die("$bin: $!\n");
+ my $data = '';
+ sysread(F, $data, 4096);
+ if (length($data) < 8+60) {
+ warn("$bin: not a debian package - header too short\n");
+ close F;
+ return undef;
+ }
+ if (substr($data, 0, 8+16) ne "!<arch>\ndebian-binary " &&
+ substr($data, 0, 8+16) ne "!<arch>\ndebian-binary/ ") {
+ warn("$bin: not a debian package - no \"debian-binary\" entry\n");
+ close F;
+ return undef;
+ }
+ my $len = substr($data, 8+48, 10);
+ $len += $len & 1;
+ if (length($data) < 8+60+$len+60) {
+ my $r = 8+60+$len+60 - length($data);
+ $r -= length($data);
+ if ((sysread(F, $data, $r < 4096 ? 4096 : $r, length($data)) || 0) < $r) {
+ warn("$bin: unexpected EOF\n");
+ close F;
+ return undef;
+ }
+ }
+ $data = substr($data, 8 + 60 + $len);
+ my $controlname = substr($data, 0, 16);
+ if ($controlname ne 'control.tar.gz ' && $controlname ne 'control.tar.gz/ ' &&
+ $controlname ne 'control.tar.xz ' && $controlname ne 'control.tar.xz/ ' &&
+ $controlname ne 'control.tar ' && $controlname ne 'control.tar/ ') {
+ warn("$bin: control.tar is not second ar entry\n");
+ close F;
+ return undef;
+ }
+ $len = substr($data, 48, 10);
+ if (length($data) < 60+$len) {
+ my $r = 60+$len - length($data);
+ if ((sysread(F, $data, $r, length($data)) || 0) < $r) {
+ warn("$bin: unexpected EOF\n");
+ close F;
+ return undef;
+ }
+ }
+ close F;
+ $data = substr($data, 60, $len);
+ return Digest::MD5::md5_hex($data);
+}
+
+sub verscmp_part {
+ my ($s1, $s2) = @_;
+ return 0 if $s1 eq $s2;
+ $s1 =~ s/([0-9]+)/substr("00000000000000000000000000000000$1", -32, 32)/ge;
+ $s2 =~ s/([0-9]+)/substr("00000000000000000000000000000000$1", -32, 32)/ge;
+ $s1 .= "\0";
+ $s2 .= "\0";
+ $s1 =~ tr[\176\000-\037\060-\071\101-\132\141-\172\040-\057\072-\100\133-\140\173-\175][\000-\176];
+ $s2 =~ tr[\176\000-\037\060-\071\101-\132\141-\172\040-\057\072-\100\133-\140\173-\175][\000-\176];
+ return $s1 cmp $s2;
+}
+
+sub verscmp {
+ my ($s1, $s2) = @_;
+ my ($e1, $v1, $r1) = $s1 =~ /^(?:(\d+):)?(.*?)(?:-([^-]*))?$/s;
+ $e1 = 0 unless defined $e1;
+ my ($e2, $v2, $r2) = $s2 =~ /^(?:(\d+):)?(.*?)(?:-([^-]*))?$/s;
+ $e2 = 0 unless defined $e2;
+ if ($e1 ne $e2) {
+ my $r = verscmp_part($e1, $e2);
+ return $r if $r;
+ }
+ my $r = verscmp_part($v1, $v2);
+ return $r if $r;
+ $r1 = '' unless defined $r1;
+ $r2 = '' unless defined $r2;
+ return verscmp_part($r1, $r2);
+}
+
+sub queryinstalled {
+ my ($root, %opts) = @_;
+
+ $root = '' if !defined($root) || $root eq '/';
+ my @pkgs;
+ local *F;
+ if (open(F, '<', "$root/var/lib/dpkg/status")) {
+ my $ctrl = '';
+ while(<F>) {
+ if ($_ eq "\n") {
+ my %res = control2res($ctrl);
+ if (defined($res{'PACKAGE'})) {
+ my $data = {'name' => $res{'PACKAGE'}};
+ $res{'VERSION'} =~ /^(?:(\d+):)?(.*?)(?:-([^-]*))?$/s;
+ $data->{'epoch'} = $1 if defined $1;
+ $data->{'version'} = $2;
+ $data->{'release'} = $3 if defined $3;
+ $data->{'arch'} = $res{'ARCHITECTURE'};
+ push @pkgs, $data;
+ }
+ $ctrl = '';
+ next;
+ }
+ $ctrl .= $_;
+ }
+ close F;
+ }
+ return \@pkgs;
+}
+
+1;
diff --git a/Build/Debrepo.pm b/Build/Debrepo.pm
new file mode 100644
index 0000000..328fd79
--- /dev/null
+++ b/Build/Debrepo.pm
@@ -0,0 +1,130 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Debrepo;
+
+use strict;
+
+sub addpkg {
+ my ($res, $data, $options) = @_;
+ return unless defined $data->{'version'};
+ my $selfprovides;
+ $selfprovides = "= $data->{'version'}" if $options->{'addselfprovides'};
+ # split version into evr
+ $data->{'epoch'} = $1 if $data->{'version'} =~ s/^(\d+)://s;
+ $data->{'release'} = $1 if $data->{'version'} =~ s/-([^-]*)$//s;
+ for my $d (qw{provides requires conflicts recommends suggests enhances breaks prerequires}) {
+ next unless $data->{$d};
+ if ($options->{'normalizedeps'}) {
+ $data->{$d} =~ s/\(([^\)]*)\)/$1/g;
+ $data->{$d} =~ s/<</</g;
+ $data->{$d} =~ s/>>/>/g;
+ }
+ $data->{$d} = [ split(/\s*,\s*/, $data->{$d}) ];
+ }
+ push @{$data->{'requires'}}, @{$data->{'prerequires'}} if $data->{'prerequires'};
+ delete $data->{'prerequires'};
+ push @{$data->{'conflicts'}}, @{$data->{'breaks'}} if $data->{'breaks'};
+ delete $data->{'breaks'};
+ if (defined($selfprovides)) {
+ $selfprovides = "($selfprovides)" unless $options->{'normalizedeps'};
+ $selfprovides = "$data->{'name'} $selfprovides";
+ push @{$data->{'provides'}}, $selfprovides unless @{$data->{'provides'} || []} && $data->{'provides'}->[-1] eq $selfprovides;
+ }
+ if ($options->{'withchecksum'}) {
+ for (qw {md5 sha1 sha256}) {
+ my $c = delete($data->{"checksum_$_"});
+ $data->{'checksum'} = "$_:$c" if $c;
+ }
+ }
+ if (ref($res) eq 'CODE') {
+ $res->($data);
+ } else {
+ push @$res, $data;
+ }
+}
+
+my %tmap = (
+ 'package' => 'name',
+ 'version' => 'version',
+ 'architecture' => 'arch',
+ 'provides' => 'provides',
+ 'depends' => 'requires',
+ 'pre-depends' => 'prerequires',
+ 'conflicts' => 'conflicts',
+ 'breaks' => 'breaks',
+ 'recommends' => 'recommends',
+ 'suggests' => 'suggests',
+ 'enhances' => 'enhances',
+ 'filename' => 'location',
+ 'source' => 'source',
+);
+
+my %tmap_checksums = (
+ 'md5sum' => 'checksum_md5',
+ 'sha1' => 'checksum_sha1',
+ 'sha256' => 'checksum_sha256',
+);
+
+sub parse {
+ my ($in, $res, %options) = @_;
+ $res ||= [];
+ my $fd;
+ if (ref($in)) {
+ $fd = $in;
+ } else {
+ if ($in =~ /\.gz$/) {
+ open($fd, '-|', "gzip", "-dc", $in) || die("$in: $!\n");
+ } else {
+ open($fd, '<', $in) || die("$in: $!\n");
+ }
+ }
+ my $pkg = {};
+ my $tag;
+ my %ltmap = %tmap;
+ %ltmap = (%ltmap, %tmap_checksums) if $options{'withchecksum'};
+ while (<$fd>) {
+ chomp;
+ if ($_ eq '') {
+ addpkg($res, $pkg, \%options) if %$pkg;
+ $pkg = {};
+ next;
+ }
+ if (/^\s/) {
+ next unless $tag;
+ $pkg->{$tag} .= "\n".substr($_, 1);
+ next;
+ }
+ my $data;
+ ($tag, $data) = split(':', $_, 2);
+ next unless defined $data;
+ $tag = $tmap{lc($tag)};
+ next unless $tag;
+ $data =~ s/^\s*//;
+ $pkg->{$tag} = $data;
+ }
+ addpkg($res, $pkg, \%options) if %$pkg;
+ if (!ref($in)) {
+ close($fd) || die("close $in: $!\n");
+ }
+ return $res;
+}
+
+1;
diff --git a/Build/Docker.pm b/Build/Docker.pm
new file mode 100644
index 0000000..7a9cc4f
--- /dev/null
+++ b/Build/Docker.pm
@@ -0,0 +1,258 @@
+################################################################
+#
+# Copyright (c) 2017 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Docker;
+
+use Build::SimpleXML;
+
+use strict;
+
+sub slurp {
+ my ($fn) = @_;
+ local *F;
+ return undef unless open(F, '<', $fn);
+ local $/ = undef; # Perl slurp mode
+ my $content = <F>;
+ close F;
+ return $content;
+}
+
+sub quote {
+ my ($str, $q, $vars) = @_;
+ if ($q ne "'" && $str =~ /\$/) {
+ $str =~ s/\$([a-zA-Z0-9_]+|\{([^\}]+)\})/join(' ', @{$vars->{$2 || $1} || []})/ge;
+ }
+ $str =~ s/([ \t\"\'\$\(\)])/sprintf("%%%02X", ord($1))/ge;
+ return $str;
+}
+
+sub addrepo {
+ my ($ret, $url) = @_;
+
+ unshift @{$ret->{'repo_urls'}}, $url;
+ if ($Build::Kiwi::urlmapper) {
+ my $prp = $Build::Kiwi::urlmapper->($url);
+ if (!$prp) {
+ $ret->{'error'} = "cannot map '$url' to obs";
+ return undef;
+ }
+ my ($projid, $repoid) = split('/', $prp, 2);
+ unshift @{$ret->{'path'}}, {'project' => $projid, 'repository' => $repoid};
+ return;
+ } else {
+ # this is just for testing purposes...
+ $url =~ s/^\/+$//;
+ $url =~ s/:\//:/g;
+ my @url = split('/', $url);
+ unshift @{$ret->{'path'}}, {'project' => $url[-2], 'repository' => $url[-1]} if @url >= 2;
+ }
+ return 1;
+}
+
+sub cmd_zypper {
+ my ($ret, @args) = @_;
+ # skip global options
+ shift @args while @args && $args[0] =~ /^-/;
+ return unless @args;
+ if ($args[0] eq 'in' || $args[0] eq 'install') {
+ shift @args;
+ while (@args && $args[0] =~ /^-/) {
+ shift @args if $args[0] =~ /^--(?:from|repo|type)$/ || $args[0] =~ /^-[tr]$/;
+ shift @args;
+ }
+ my @deps = grep {/^[a-zA-Z_0-9]/} @args;
+ s/^([^<=>]+)([<=>]+)/$1 $2 / for @deps;
+ push @{$ret->{'deps'}}, @deps;
+ } elsif ($args[0] eq 'ar' || $args[0] eq 'addrepo') {
+ shift @args;
+ while (@args && $args[0] =~ /^-/) {
+ shift @args if $args[0] =~ /^--(?:repo|type)$/ || $args[0] =~ /^-[rt]$/;
+ shift @args;
+ }
+ if (@args) {
+ my $path = $args[0];
+ $path =~ s/\/[^\/]*\.repo$//;
+ addrepo($ret, $path);
+ }
+ }
+}
+
+sub cmd_obs_pkg_mgr {
+ my ($ret, @args) = @_;
+ return unless @args;
+ if ($args[0] eq 'add_repo') {
+ shift @args;
+ addrepo($ret, $args[0]) if @args;
+ } elsif ($args[0] eq 'install') {
+ shift @args;
+ push @{$ret->{'deps'}}, @args;
+ }
+}
+
+sub cmd_dnf {
+ my ($ret, @args) = @_;
+ # skip global options
+ shift @args while @args && $args[0] =~ /^-/;
+ return unless @args;
+ if ($args[0] eq 'in' || $args[0] eq 'install') {
+ shift @args;
+ while (@args && $args[0] =~ /^-/) {
+ shift @args;
+ }
+ push @{$ret->{'deps'}}, grep {/^[a-zA-Z_0-9]/} @args;
+ }
+}
+
+sub cmd_apt_get {
+ my ($ret, @args) = @_;
+ shift @args while @args && $args[0] =~ /^-/;
+ return unless @args;
+ if ($args[0] eq 'install') {
+ shift @args;
+ push @{$ret->{'deps'}}, grep {/^[a-zA-Z_0-9]/} @args;
+ }
+}
+
+sub parse {
+ my ($cf, $fn) = @_;
+
+ my $basecontainer;
+ my $dockerfile_data = slurp($fn);
+ return { 'error' => 'could not open Dockerfile' } unless defined $dockerfile_data;
+
+ my @lines = split(/\r?\n/, $dockerfile_data);
+ my $ret = {
+ 'name' => 'docker',
+ 'deps' => [],
+ 'path' => [],
+ 'repo_urls' => [],
+ };
+
+ while (@lines) {
+ my $line = shift @lines;
+ $line =~ s/^\s+//;
+ if ($line =~ /^#/) {
+ if ($line =~ /^#!BuildTag:\s*(.*?)$/) {
+ my @tags = split(' ', $1);
+ push @{$ret->{'containertags'}}, @tags if @tags;
+ }
+ next;
+ }
+ # add continuation lines
+ while (@lines && $line =~ s/\\[ \t]*$//) {
+ shift @lines while @lines && $lines[0] =~ /^\s*#/;
+ $line .= shift(@lines) if @lines;
+ }
+ $line =~ s/^\s+//;
+ $line =~ s/\s+$//;
+ next unless $line;
+ my ($cmd, @args);
+ ($cmd, $line) = split(' ', $line, 2);
+ $cmd = uc($cmd);
+ my $vars = {};
+ # split line into args
+ $line =~ s/%/%25/g;
+ $line =~ s/\\(.)/sprintf("%%%02X", ord($1))/ge;
+ while ($line =~ /([\"\'])/) {
+ my $q = $1;
+ last unless $line =~ s/$q(.*?)$q/quote($1, $q, $vars)/e;
+ }
+ if ($line =~ /\$/) {
+ $line =~ s/\$([a-zA-Z0-9_]+|\{([^\}]+)\})/join(' ', @{$vars->{$2 || $1} || []})/ge;
+ }
+ @args = split(/[ \t]+/, $line);
+ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge for @args;
+ if ($cmd eq 'FROM') {
+ if (@args && !$basecontainer) {
+ $basecontainer = $args[0];
+ $basecontainer .= ':latest' unless $basecontainer =~ /:[^:\/]+$/;
+ }
+ } elsif ($cmd eq 'RUN') {
+ $line =~ s/#.*//; # get rid of comments
+ for my $l (split(/(?:\||\|\||\&|\&\&|;|\)|\()/, $line)) {
+ $l =~ s/^\s+//;
+ $l =~ s/\s+$//;
+ @args = split(/[ \t]+/, $l);
+ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge for @args;
+ next unless @args;
+ my $rcmd = shift @args;
+ if ($rcmd eq 'zypper') {
+ cmd_zypper($ret, @args);
+ } elsif ($rcmd eq 'yum' || $rcmd eq 'dnf') {
+ cmd_dnf($ret, @args);
+ } elsif ($rcmd eq 'apt-get') {
+ cmd_apt_get($ret, @args);
+ } elsif ($rcmd eq 'obs_pkg_mgr') {
+ cmd_obs_pkg_mgr($ret, @args);
+ }
+ }
+ }
+ }
+ push @{$ret->{'deps'}}, "container:$basecontainer" if $basecontainer;
+ return $ret;
+}
+
+sub showcontainerinfo {
+ my $disturl;
+ (undef, $disturl) = splice(@ARGV, 0, 2) if @ARGV > 2 && $ARGV[0] eq '--disturl';
+ my ($fn, $image, $taglist, $annotationfile) = @ARGV;
+ local $Build::Kiwi::urlmapper = sub { return $_[0] };
+ my $d = {};
+ $d = parse({}, $fn) if $fn;
+ die("$d->{'error'}\n") if $d->{'error'};
+ $image =~ s/.*\/// if defined $image;
+ my @tags = split(' ', $taglist);
+ for (@tags) {
+ $_ .= ':latest' unless /:[^:\/]+$/;
+ }
+ @tags = map {"\"$_\""} @tags;
+ my @repos = map {"{ \"url\": \"$_\" }"} @{$d->{'repo_urls'} || []};
+ if ($annotationfile) {
+ my $annotation = slurp($annotationfile);
+ $annotation = Build::SimpleXML::parse($annotation) if $annotation;
+ $annotation = $annotation && ref($annotation) eq 'HASH' ? $annotation->{'annotation'} : undef;
+ $annotation = $annotation && ref($annotation) eq 'ARRAY' ? $annotation->[0] : undef;
+ my $annorepos = $annotation && ref($annotation) eq 'HASH' ? $annotation->{'repo'} : undef;
+ $annorepos = undef unless $annorepos && ref($annorepos) eq 'ARRAY';
+ for my $annorepo (@{$annorepos || []}) {
+ next unless $annorepo && ref($annorepo) eq 'HASH' && $annorepo->{'url'};
+ push @repos, "{ \"url\": \"$annorepo->{'url'}\" }";
+ }
+ }
+ my $buildtime = time();
+ print "{\n";
+ print " \"tags\": [ ".join(', ', @tags)." ]";
+ print ",\n \"repos\": [ ".join(', ', @repos)." ]" if @repos;
+ print ",\n \"file\": \"$image\"" if defined $image;
+ print ",\n \"disturl\": \"$disturl\"" if defined $disturl;
+ print ",\n \"buildtime\": $buildtime";
+ print "\n}\n";
+}
+
+sub showtags {
+ my ($fn) = @ARGV;
+ local $Build::Kiwi::urlmapper = sub { return $_[0] };
+ my $d = {};
+ $d = parse({}, $fn) if $fn;
+ die("$d->{'error'}\n") if $d->{'error'};
+ print "$_\n" for @{$d->{'containertags'} || []};
+}
+
+1;
diff --git a/Build/Fissile.pm b/Build/Fissile.pm
new file mode 100644
index 0000000..07a336a
--- /dev/null
+++ b/Build/Fissile.pm
@@ -0,0 +1,49 @@
+################################################################
+#
+# Copyright (c) 2017 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Fissile;
+
+use strict;
+
+eval { require YAML::XS; };
+*YAML::XS::LoadFile = sub {die("YAML::XS is not available\n")} unless defined &YAML::XS::LoadFile;
+
+sub parse {
+ my ($cf, $fn) = @_;
+
+ my $yml;
+ eval { $yml = YAML::XS::LoadFile($fn); };
+ return {'error' => "Failed to parse yml file"} unless $yml;
+
+ my $ret = {};
+ $ret->{'name'} = $yml->{'Name'} || 'fissile';
+ $ret->{'version'} = $yml->{'Version'} if $yml->{'Version'};
+
+ my @deps;
+ for (@{$yml->{'DockerImageDeps'} || []}) {
+ # This generates something like: "container:fissile-dev:201707081450"
+ push @deps, "container:$_";
+ }
+ $ret->{'deps'} = \@deps;
+
+ return $ret;
+}
+
+1;
diff --git a/Build/Kiwi.pm b/Build/Kiwi.pm
new file mode 100644
index 0000000..f2e958e
--- /dev/null
+++ b/Build/Kiwi.pm
@@ -0,0 +1,558 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Kiwi;
+
+use strict;
+use Build::SimpleXML;
+
+our $bootcallback;
+our $urlmapper;
+our $repoextras = 0; # priority, flags, ...
+
+sub unify {
+ my %h = map {$_ => 1} @_;
+ return grep(delete($h{$_}), @_);
+}
+
+sub expandFallBackArchs {
+ my ($fallbackArchXML, @archs) = @_;
+ my %fallbacks;
+ for (@{$fallbackArchXML->{'arch'} || []}) {
+ $fallbacks{$_->{'id'}} = $_->{'fallback'} if $_->{id} && $_->{'fallback'};
+ }
+ my @out;
+ while (@archs) {
+ push @out, shift @archs;
+ push @archs, delete $fallbacks{$out[-1]} if $fallbacks{$out[-1]};
+ }
+ return unify(@out);
+}
+
+# sles10 perl does not have the version.pm
+# implement own hack
+sub versionstring {
+ my ($str) = @_;
+ my $result = 0;
+ $result = $result * 100 + $_ for split (/\./, $str, 2);
+ return $result;
+}
+
+my $schemaversion56 = versionstring('5.6');
+
+sub kiwiparse_product {
+ my ($kiwi, $xml, $arch, $buildflavor) = @_;
+
+ my $ret = {};
+ my @repos;
+ my %repoprio; # XXX: unused
+ my @packages;
+ my @requiredarch;
+ my @badarch;
+ my $obsexclusivearch;
+ my $obsexcludearch;
+ $obsexclusivearch = $1 if $xml =~ /^\s*<!--\s+OBS-ExclusiveArch:\s+(.*)\s+-->\s*$/im;
+ $obsexcludearch = $1 if $xml =~ /^\s*<!--\s+OBS-ExcludeArch:\s+(.*)\s+-->\s*$/im;
+
+ $ret->{'name'} = $kiwi->{'name'} if $kiwi->{'name'};
+ $ret->{'filename'} = $kiwi->{'name'} if $kiwi->{'name'};
+ my $description = (($kiwi->{'description'} || [])->[0]) || {};
+ if (!$ret->{'name'} && $description->{'specification'}) {
+ $ret->{'name'} = $description->{'specification'}->[0]->{'_content'};
+ }
+
+ # parse the preferences section
+ my $preferences = $kiwi->{'preferences'} || [];
+ die("products must have exactly one preferences element\n") unless @$preferences == 1;
+ # take default version setting
+ if ($preferences->[0]->{'version'}) {
+ $ret->{'version'} = $preferences->[0]->{'version'}->[0]->{'_content'};
+ }
+ die("products must have exactly one type element in the preferences\n") unless @{$preferences->[0]->{'type'} || []} == 1;
+ my $preftype = $preferences->[0]->{'type'}->[0];
+ if (defined $preftype->{'image'}) {
+ # for kiwi 4.1 and 5.x
+ die("products must use type 'product'\n") unless $preftype->{'image'} eq 'product';
+ } else {
+ # for kiwi 3.8 and before
+ die("products must use type 'product'\n") unless $preftype->{'_content'} eq 'product';
+ }
+ push @packages, "kiwi-filesystem:$preftype->{'filesystem'}" if $preftype->{'filesystem'};
+ die("boot type not supported in products\n") if defined $preftype->{'boot'};
+
+ my $instsource = ($kiwi->{'instsource'} || [])->[0];
+ die("products must have an instsource element\n") unless $instsource;
+
+ # get repositories
+ for my $repository (sort {$a->{priority} <=> $b->{priority}} @{$instsource->{'instrepo'} || []}) {
+ my $kiwisource = ($repository->{'source'} || [])->[0];
+ if ($kiwisource->{'path'} eq 'obsrepositories:/') {
+ # special case, OBS will expand it.
+ push @repos, '_obsrepositories';
+ next;
+ }
+ if ($kiwisource->{'path'} =~ /^obs:\/\/\/?([^\/]+)\/([^\/]+)\/?$/) {
+ push @repos, "$1/$2";
+ } else {
+ my $prp;
+ $prp = $urlmapper->($kiwisource->{'path'}) if $urlmapper;
+ die("instsource repo url not using obs:/ scheme: $kiwisource->{'path'}\n") unless $prp;
+ push @repos, $prp;
+ }
+ }
+
+ $ret->{'sourcemedium'} = -1;
+ $ret->{'debugmedium'} = -1;
+ 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'} || []}) {
+ $ret->{'sourcemedium'} = $po->{'_content'} if $po->{'name'} eq 'SOURCEMEDIUM';
+ $ret->{'debugmedium'} = $po->{'_content'} if $po->{'name'} eq 'DEBUGMEDIUM';
+ }
+ }
+ if ($instsource->{'architectures'}) {
+ my $architectures = $instsource->{'architectures'}->[0] || {};
+ for my $ra (@{$architectures->{'requiredarch'} || []}) {
+ push @requiredarch, $ra->{'ref'} if defined $ra->{'ref'};
+ }
+ }
+
+ # Find packages and possible additional required architectures
+ my @additionalarchs;
+ my @pkgs;
+ push @pkgs, @{$instsource->{'metadata'}->[0]->{'repopackage'} || []} if $instsource->{'metadata'};
+ push @pkgs, @{$instsource->{'repopackages'}->[0]->{'repopackage'} || []} if $instsource->{'repopackages'};
+ @pkgs = unify(@pkgs);
+ for my $package (@pkgs) {
+ # filter packages, which are not targeted for the wanted plattform
+ if ($package->{'arch'}) {
+ my $valid;
+ for my $ma (@requiredarch) {
+ for my $pa (split(',', $package->{'arch'})) {
+ $valid = 1 if $ma eq $pa;
+ }
+ }
+ next unless $valid;
+ }
+
+ # not nice, but optimizes our build dependencies
+ # FIXME: design a real blacklist option in kiwi
+ if ($package->{'onlyarch'} && $package->{'onlyarch'} eq 'skipit') {
+ push @packages, "-$package->{'name'}";
+ next;
+ }
+ push @packages, "-$package->{'replaces'}" if $package->{'replaces'};
+
+ # we need this package
+ push @packages, $package->{'name'};
+
+ # find the maximal superset of possible required architectures
+ push @additionalarchs, split(',', $package->{'addarch'}) if $package->{'addarch'};
+ push @additionalarchs, split(',', $package->{'onlyarch'}) if $package->{'onlyarch'};
+ }
+ @requiredarch = unify(@requiredarch, @additionalarchs);
+
+ #### FIXME: kiwi files have no informations where to get -32bit packages from
+ push @requiredarch, "i586" if grep {/^ia64/} @requiredarch;
+ push @requiredarch, "i586" if grep {/^x86_64/} @requiredarch;
+ push @requiredarch, "ppc" if grep {/^ppc64/} @requiredarch;
+ push @requiredarch, "s390" if grep {/^s390x/} @requiredarch;
+
+ @requiredarch = expandFallBackArchs($instsource->{'architectures'}->[0], @requiredarch);
+
+ push @packages, "kiwi-packagemanager:instsource";
+
+ push @requiredarch, split(' ', $obsexclusivearch) if $obsexclusivearch;
+ push @badarch , split(' ', $obsexcludearch) if $obsexcludearch;
+
+ $ret->{'exclarch'} = [ unify(@requiredarch) ] if @requiredarch;
+ $ret->{'badarch'} = [ unify(@badarch) ] if @badarch;
+ $ret->{'deps'} = [ unify(@packages) ];
+ $ret->{'path'} = [ unify(@repos) ];
+ $ret->{'imagetype'} = [ 'product' ];
+ for (@{$ret->{'path'} || []}) {
+ my @s = split('/', $_, 2);
+ $_ = {'project' => $s[0], 'repository' => $s[1]};
+ $_->{'priority'} = $repoprio{"$s[0]/$s[1]"} if $repoextras && defined $repoprio{"$s[0]/$s[1]"};
+ }
+ return $ret;
+}
+
+sub kiwiparse {
+ my ($xml, $arch, $buildflavor, $count) = @_;
+ $count ||= 0;
+ die("kiwi config inclusion depth limit reached\n") if $count++ > 10;
+
+ my $kiwi = Build::SimpleXML::parse($xml);
+ die("not a kiwi config\n") unless $kiwi && $kiwi->{'image'};
+ $kiwi = $kiwi->{'image'}->[0];
+
+ # check if this is a product, we currently test for the 'instsource' element
+ return kiwiparse_product($kiwi, $xml, $arch, $buildflavor) if $kiwi->{'instsource'};
+
+ my $ret = {};
+ my @types;
+ my @repos;
+ my @imagerepos;
+ my @bootrepos;
+ my @containerrepos;
+ my @packages;
+ my @extrasources;
+ my $obsexclusivearch;
+ my $obsexcludearch;
+ my $obsprofiles;
+ $obsexclusivearch = $1 if $xml =~ /^\s*<!--\s+OBS-ExclusiveArch:\s+(.*)\s+-->\s*$/im;
+ $obsexcludearch = $1 if $xml =~ /^\s*<!--\s+OBS-ExcludeArch:\s+(.*)\s+-->\s*$/im;
+ $obsprofiles = $1 if $xml =~ /^\s*<!--\s+OBS-Profiles:\s+(.*)\s+-->\s*$/im;
+ if ($obsprofiles) {
+ $obsprofiles = [ grep {defined($_)} map {$_ eq '@BUILD_FLAVOR@' ? $buildflavor : $_} split(' ', $obsprofiles) ];
+ }
+ my $schemaversion = $kiwi->{'schemaversion'} ? versionstring($kiwi->{'schemaversion'}) : 0;
+ $ret->{'name'} = $kiwi->{'name'} if $kiwi->{'name'};
+ $ret->{'filename'} = $kiwi->{'name'} if $kiwi->{'name'};
+ my $description = (($kiwi->{'description'} || [])->[0]) || {};
+ if (!$ret->{'name'} && $description->{'specification'}) {
+ $ret->{'name'} = $description->{'specification'}->[0]->{'_content'};
+ }
+
+ # usedprofiles also include direct wanted profile targets and indirect required profiles
+ my %usedprofiles;
+ # obsprofiles arch filtering
+ if ($obsprofiles && $arch && $kiwi->{'profiles'} && $kiwi->{'profiles'}->[0]->{'profile'}) {
+ my %obsprofiles = map {$_ => 1} @$obsprofiles;
+ for my $prof (@{$kiwi->{'profiles'}[0]->{'profile'}}) {
+ next unless $prof->{'name'} && exists $obsprofiles{$prof->{'name'}};
+ my $valid;
+ if ($prof->{'arch'}) {
+ my $ma = $arch;
+ $ma =~ s/i[456]86/i386/;
+ for my $pa (split(",", $prof->{'arch'})) {
+ $pa =~ s/i[456]86/i386/;
+ $valid = 1 if $ma eq $pa;
+ }
+ } else {
+ $valid = 1;
+ }
+ if ($valid) {
+ $obsprofiles{$prof->{'name'}} = 2;
+ } elsif ($obsprofiles{$prof->{'name'}} == 1) {
+ $obsprofiles{$prof->{'name'}} = 0;
+ }
+ }
+ $obsprofiles = [ grep {$obsprofiles{$_}} @$obsprofiles ];
+ for my $prof (@{$kiwi->{'profiles'}[0]->{'profile'}}) {
+ next unless $obsprofiles{$prof->{'name'}};
+ $usedprofiles{$prof->{'name'}} = 1;
+ for my $req (@{$prof->{'requires'}}) {
+ $usedprofiles{$req->{'profile'}} = 1;
+ }
+ }
+ }
+
+ # take default version setting
+ my $preferences = ($kiwi->{'preferences'} || []);
+ if ($preferences->[0]->{'version'}) {
+ $ret->{'version'} = $preferences->[0]->{'version'}->[0]->{'_content'};
+ }
+ my $containerconfig;
+ for my $pref (@{$preferences || []}) {
+ if ($obsprofiles && $pref->{'profiles'}) {
+ next unless grep {$usedprofiles{$_}} split(",", $pref->{'profiles'});
+ }
+ for my $type (@{$pref->{'type'} || []}) {
+ next unless @{$pref->{'type'}} == 1 || !$type->{'optional'};
+ if (defined $type->{'image'}) {
+ # for kiwi 4.1 and 5.x
+ push @types, $type->{'image'};
+ push @packages, "kiwi-image:$type->{'image'}" if $schemaversion >= $schemaversion56;
+ } else {
+ # for kiwi 3.8 and before
+ push @types, $type->{'_content'};
+ }
+ # save containerconfig so that we can retrievethe tag
+ $containerconfig = $type->{'containerconfig'}->[0] if $type->{'containerconfig'};
+
+ # add derived container dependency
+ if ($type->{'derived_from'}) {
+ my $derived = $type->{'derived_from'};
+ my ($name, $prp);
+ if ($derived =~ /^obs:\/{1,3}([^\/]+)\/([^\/]+)\/(.*?)(?:#([^\#\/]+))?$/) {
+ $name = defined($4) ? "$3:$4" : "$3:latest";
+ $prp = "$1/$2";
+ } elsif ($derived =~ /^obsrepositories:\/{1,3}([^\/].*?)(?:#([^\#\/]+))?$/) {
+ $name = defined($2) ? "$1:$2" : "$1:latest";
+ } elsif ($derived =~ /^file:/) {
+ next; # just ignore and hope
+ } elsif ($derived =~ /^(.*)\/([^\/]+?)(?:#([^\#\/]+))?$/) {
+ my $url = $1;
+ $name = defined($3) ? "$2:$3" : "$2:latest";
+ $prp = $urlmapper->($url) if $urlmapper;
+ # try again with one element moved from url to name
+ if (!$prp && $derived =~ /^(.*)\/([^\/]+\/[^\/]+?)(?:#([^\#\/]+))?$/) {
+ $url = $1;
+ $name = defined($3) ? "$2:$3" : "$2:latest";
+ $prp = $urlmapper->($url) if $urlmapper;
+ }
+ undef $name unless $prp;
+ }
+ die("derived_from url not using obs:/ scheme: $derived\n") unless defined $name;
+ push @packages, "container:$name";
+ push @containerrepos, $prp if $prp;
+ }
+
+ push @packages, "kiwi-filesystem:$type->{'filesystem'}" if $type->{'filesystem'};
+ if (defined $type->{'boot'}) {
+ if ($type->{'boot'} =~ /^obs:\/\/\/?([^\/]+)\/([^\/]+)\/?$/) {
+ next unless $bootcallback;
+ my ($bootxml, $xsrc) = $bootcallback->($1, $2);
+ next unless $bootxml;
+ push @extrasources, $xsrc if $xsrc;
+ my $bret = kiwiparse($bootxml, $arch, $buildflavor, $count);
+ push @bootrepos, map {"$_->{'project'}/$_->{'repository'}"} @{$bret->{'path'} || []};
+ push @packages, @{$bret->{'deps'} || []};
+ push @extrasources, @{$bret->{'extrasource'} || []};
+ } else {
+ die("bad boot reference: $type->{'boot'}\n") unless $type->{'boot'} =~ /^([^\/]+)\/([^\/]+)$/;
+ push @packages, "kiwi-boot:$1";
+ }
+ }
+ }
+ }
+
+ die("image contains 'product' type\n") if grep {$_ eq 'product'} @types;
+
+ my $packman = $preferences->[0]->{'packagemanager'}->[0]->{'_content'} || '';
+
+ # calculate priority for sorting
+ for (@{$kiwi->{'repository'} || []}) {
+ $_->{'sortprio'} = 0;
+ if (defined($_->{'priority'})) {
+ $_->{'sortprio'} = $packman eq 'smart' ? $_->{'priority'} : 99 - $_->{'priority'};
+ }
+ }
+
+ my @repositories = sort {$b->{'sortprio'} <=> $a->{'sortprio'}} @{$kiwi->{'repository'} || []};
+
+ my %repoprio;
+ for my $repository (@repositories) {
+ my $kiwisource = ($repository->{'source'} || [])->[0];
+ next unless $kiwisource; # huh?
+ next if $kiwisource->{'path'} eq '/var/lib/empty'; # grr
+ if ($repository->{'imageonly'} || $repository->{'imageinclude'}) {
+ # this repo will be configured in the image. Save so that we can write it into the containerinfo
+ my $imagerepo = { 'url' => $kiwisource->{'path'} };
+ $imagerepo->{'priority'} = $repository->{'sortprio'} if defined $repository->{'priority'};
+ push @imagerepos, $imagerepo;
+ }
+ next if $repository->{'imageonly'};
+ if ($kiwisource->{'path'} eq 'obsrepositories:/') {
+ push @repos, '_obsrepositories/';
+ next;
+ }
+ my $prp;
+ if ($kiwisource->{'path'} =~ /^obs:\/{1,3}([^\/]+)\/([^\/]+)\/?$/) {
+ $prp = "$1/$2";
+ } else {
+ $prp = $urlmapper->($kiwisource->{'path'}) if $urlmapper;
+ die("repo url not using obs:/ scheme: $kiwisource->{'path'}\n") unless $prp;
+ }
+ push @repos, $prp;
+ $repoprio{$prp} = $repository->{'sortprio'} if defined $repository->{'priority'};
+ }
+
+ # Find packages for the image
+ my @pkgs;
+ my $patterntype;
+ for my $packages (@{$kiwi->{'packages'}}) {
+ next if $packages->{'type'} && $packages->{'type'} ne 'image' && $packages->{'type'} ne 'bootstrap';
+ # we could skip the sections also when no profile is used,
+ # but don't to stay backward compatible
+ if ($obsprofiles && $packages->{'profiles'}) {
+ my @section_profiles = split(",", $packages->{'profiles'});
+
+ next unless grep {$usedprofiles{$_}} @section_profiles;
+ }
+
+ $patterntype ||= $packages->{'patternType'};
+ push @pkgs, @{$packages->{'package'}} if $packages->{'package'};
+ for my $pattern (@{$kiwi->{'namedCollection'} || []}) {
+ push @pkgs, { %$pattern, 'name' => "pattern()=$pattern->{'name'}" } if $pattern->{'name'};
+ }
+ for my $product (@{$kiwi->{'product'} || []}) {
+ push @pkgs, { %$product, 'name' => "product()=$product->{'name'}" } if $product->{'name'};
+ }
+ for my $pattern (@{$kiwi->{'opensusePatterns'} || []}) {
+ push @pkgs, { %$pattern, 'name' => "pattern()=$pattern->{'name'}" } if $pattern->{'name'};
+ }
+ for my $product (@{$kiwi->{'opensuseProduct'} || []}) {
+ push @pkgs, { %$product, 'name' => "product()=$product->{'name'}" } if $product->{'name'};
+ }
+ }
+ $patterntype ||= 'onlyRequired';
+ @pkgs = unify(@pkgs);
+ for my $package (@pkgs) {
+ # filter packages which are not targeted for the wanted plattform
+ if ($package->{'arch'}) {
+ my $valid;
+ my $ma = $arch;
+ $ma =~ s/i[456]86/i386/;
+ for my $pa (split(",", $package->{'arch'})) {
+ $pa =~ s/i[456]86/i386/;
+ $valid = 1 if $ma eq $pa;
+ }
+ next unless $valid;
+ }
+ # handle replaces as buildignore
+ push @packages, "-$package->{'replaces'}" if $package->{'replaces'};
+
+ # we need this package
+ push @packages, $package->{'name'};
+ }
+ push @packages, "kiwi-packagemanager:$packman";
+ push @packages, "--dorecommends--", "--dosupplements--" if $patterntype && $patterntype eq 'plusRecommended';
+
+ $ret->{'exclarch'} = [ unify(split(' ', $obsexclusivearch)) ] if $obsexclusivearch;
+ $ret->{'badarch'} = [ unify(split(' ', $obsexcludearch)) ] if $obsexcludearch;
+ $ret->{'deps'} = [ unify(@packages) ];
+ $ret->{'path'} = [ unify(@repos, @bootrepos) ];
+ $ret->{'containerpath'} = [ unify(@containerrepos) ] if @containerrepos;
+ $ret->{'imagetype'} = [ unify(@types) ];
+ $ret->{'extrasource'} = \@extrasources if @extrasources;
+ for (@{$ret->{'path'} || []}) {
+ my @s = split('/', $_, 2);
+ $_ = {'project' => $s[0], 'repository' => $s[1]};
+ $_->{'priority'} = $repoprio{"$s[0]/$s[1]"} if $repoextras && defined $repoprio{"$s[0]/$s[1]"};
+ }
+ for (@{$ret->{'containerpath'} || []}) {
+ my @s = split('/', $_, 2);
+ $_ = {'project' => $s[0], 'repository' => $s[1]};
+ }
+ $ret->{'imagerepos'} = \@imagerepos if @imagerepos;
+ if ($containerconfig) {
+ my $containername = $containerconfig->{'name'};
+ my $containertags = $containerconfig->{'tag'};
+ $containertags = [ $containertags ] if defined($containertags) && !ref($containertags);
+ if ($containertags && defined($containername)) {
+ for (@$containertags) {
+ $_ = "$containername:$_" unless /:/;
+ }
+ }
+ $containertags = undef if $containertags && !@$containertags;
+ $containertags = [ "$containername:latest" ] if defined($containername) && !$containertags;
+ $ret->{'container_tags'} = $containertags if $containertags;
+ }
+ if ($obsprofiles) {
+ if (@$obsprofiles) {
+ $ret->{'profiles'} = [ unify(@$obsprofiles) ];
+ } else {
+ $ret->{'exclarch'} = []; # all profiles excluded
+ }
+ }
+ return $ret;
+}
+
+sub parse {
+ my ($cf, $fn) = @_;
+
+ local *F;
+ open(F, '<', $fn) || die("$fn: $!\n");
+ my $xml = '';
+ 1 while sysread(F, $xml, 4096, length($xml)) > 0;
+ close F;
+ $cf ||= {};
+ my $d;
+ eval { $d = kiwiparse($xml, ($cf->{'arch'} || ''), $cf->{'buildflavor'}, 0) };
+ if ($@) {
+ my $err = $@;
+ chomp $err;
+ return {'error' => $err};
+ }
+ return $d;
+}
+
+sub show {
+ my ($fn, $field, $arch, $buildflavor) = @ARGV;
+ local $urlmapper = sub { return $_[0] };
+ my $cf = {'arch' => $arch};
+ $cf->{'buildflavor'} = $buildflavor if defined $buildflavor;
+ my $d = parse($cf, $fn);
+ die("$d->{'error'}\n") if $d->{'error'};
+ if ($field eq 'profiles' && $d->{'exclarch'} && !@{$d->{'exclarch'}}) {
+ print "__excluded\n";
+ return;
+ }
+ my $x = $d->{$field};
+ $x = [ $x ] unless ref $x;
+ print "@$x\n";
+}
+
+sub showcontainerinfo {
+ my ($disturl, $arch, $buildflavor);
+ (undef, $disturl) = splice(@ARGV, 0, 2) if @ARGV > 2 && $ARGV[0] eq '--disturl';
+ (undef, $arch) = splice(@ARGV, 0, 2) if @ARGV > 2 && $ARGV[0] eq '--arch';
+ (undef, $buildflavor) = splice(@ARGV, 0, 2) if @ARGV > 2 && $ARGV[0] eq '--buildflavor';
+ my ($fn, $image) = @ARGV;
+ local $urlmapper = sub { return $_[0] };
+ my $cf = {};
+ $cf->{'arch'} = $arch if defined $arch;
+ $cf->{'buildflavor'} = $buildflavor if defined $buildflavor;
+ my $d = parse($cf, $fn);
+ die("$d->{'error'}\n") if $d->{'error'};
+ $image =~ s/.*\/// if defined $image;
+ my $release;
+ $release = $1 if $image =~ /.*-Build(\d+\.\d+).*/;
+ my @tags = map {"\"$_\""} @{$d->{'container_tags'} || []};
+ my @repos;
+ for my $repo (@{$d->{'imagerepos'} || []}) {
+ if (defined $repo->{'priority'}) {
+ push @repos, "{ \"url\": \"$repo->{'url'}\", \"priority\": $repo->{'priority'} }";
+ } else {
+ push @repos, "{ \"url\": \"$repo->{'url'}\" }";
+ }
+ }
+ my $buildtime = time();
+ print "{\n";
+ print " \"name\": \"$d->{'name'}\"";
+ print ",\n \"version\": \"$d->{'version'}\"" if defined $d->{'version'};
+ print ",\n \"release\": \"$release\"" if defined $release;
+ print ",\n \"tags\": [ ".join(', ', @tags)." ]" if @tags;
+ print ",\n \"repos\": [ ".join(', ', @repos)." ]" if @repos;
+ print ",\n \"file\": \"$image\"" if defined $image;
+ print ",\n \"disturl\": \"$disturl\"" if defined $disturl;
+ print ",\n \"buildtime\": $buildtime";
+ print "\n}\n";
+}
+
+# not implemented yet.
+sub queryiso {
+ my ($handle, %opts) = @_;
+ return {};
+}
+
+sub queryhdrmd5 {
+ my ($bin) = @_;
+ die("Build::Kiwi::queryhdrmd5 unimplemented.\n");
+}
+
+1;
diff --git a/Build/LiveBuild.pm b/Build/LiveBuild.pm
new file mode 100644
index 0000000..1fddd0d
--- /dev/null
+++ b/Build/LiveBuild.pm
@@ -0,0 +1,103 @@
+################################################################
+#
+# Copyright (c) 2014 Brocade Communications Systems, Inc.
+# Author: Jan Blunck <jblunck@infradead.org>
+#
+# This file is part of build.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#################################################################
+
+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;
diff --git a/Build/Mdkrepo.pm b/Build/Mdkrepo.pm
new file mode 100644
index 0000000..a478a8a
--- /dev/null
+++ b/Build/Mdkrepo.pm
@@ -0,0 +1,121 @@
+################################################################
+#
+# Copyright (c) 2015 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Mdkrepo;
+
+use strict;
+#use Data::Dumper;
+
+sub addpkg {
+ my ($res, $data, $options) = @_;
+ if ($options->{'addselfprovides'} && defined($data->{'name'}) && defined($data->{'version'})) {
+ if (($data->{'arch'} || '') ne 'src' && ($data->{'arch'} || '') ne 'nosrc') {
+ my $evr = $data->{'version'};
+ $evr = "$data->{'epoch'}:$evr" if $data->{'epoch'};
+ $evr = "$evr-$data->{'release'}" if defined $data->{'release'};
+ my $s = "$data->{'name'} = $evr";
+ push @{$data->{'provides'}}, $s unless grep {$_ eq $s} @{$data->{'provides'} || []};
+ }
+ }
+ if (ref($res) eq 'CODE') {
+ $res->($data);
+ } else {
+ push @$res, $data;
+ }
+
+}
+
+sub parsedeps {
+ my ($d) = @_;
+ my @d = split('@', $d);
+ for (@d) {
+ s/\[\*\]//s;
+ s/\[(.*)\]$/ $1/s;
+ s/ == / = /;
+ }
+ return \@d;
+}
+
+sub parse {
+ my ($in, $res, %options) = @_;
+ $res ||= [];
+ my $fd;
+ if (ref($in)) {
+ $fd = $in;
+ } else {
+ if ($in =~ /\.[gc]z$/) {
+ # we need to probe, as mageia uses xz for compression
+ open($fd, '<', $in) || die("$in: $!\n");
+ my $probe;
+ sysread($fd, $probe, 5);
+ close($fd);
+ if ($probe && $probe eq "\xFD7zXZ") {
+ open($fd, '-|', "xzdec", "-dc", $in) || die("$in: $!\n");
+ } else {
+ open($fd, '-|', "gzip", "-dc", $in) || die("$in: $!\n");
+ }
+ } else {
+ open($fd, '<', $in) || die("$in: $!\n");
+ }
+ }
+ my $s = {};
+ while (<$fd>) {
+ chomp;
+ if (/^\@summary\@/) {
+ $s->{'summary'} = substr($_, 9);
+ } elsif (/^\@provides\@/) {
+ $s->{'provides'} = parsedeps(substr($_, 10));
+ } elsif (/^\@requires\@/) {
+ $s->{'requires'} = parsedeps(substr($_, 10));
+ } elsif (/^\@suggests\@/) {
+ $s->{'suggests'} = parsedeps(substr($_, 10));
+ } elsif (/^\@recommends\@/) {
+ $s->{'recommends'} = parsedeps(substr($_, 12));
+ } elsif (/^\@obsoletes\@/) {
+ $s->{'obsoletes'} = parsedeps(substr($_, 11));
+ } elsif (/^\@conflicts\@/) {
+ $s->{'conflicts'} = parsedeps(substr($_, 11));
+ } elsif (/^\@info\@/) {
+ $s ||= {};
+ my @s = split('@', substr($_, 6));
+ $s->{'location'} = "$s[0].rpm";
+ my $arch;
+ if ($s[0] =~ /\.([^\.]+)$/) {
+ $arch = $1;
+ $s[0] =~ s/\.[^\.]+$//;
+ }
+ $s->{'epoch'} = $s[1] if $s[1];
+ $s[0] =~ s/-\Q$s[4]\E[^-]*$//s if defined($s[4]) && $s[4] ne ''; # strip disttag
+ $s[0] .= ":$s[5]" if defined($s[5]) && $s[5] ne ''; # add distepoch
+ $s->{'arch'} = $arch || 'noarch';
+ if ($s[0] =~ /^(.*)-([^-]+)-([^-]+)$/s) {
+ ($s->{'name'}, $s->{'version'}, $s->{'release'}) = ($1, $2, $3);
+ # fake source entry for now...
+ $s->{'source'} = $s->{'name'} if $s->{'arch'} ne 'src' && $s->{'arch'} ne 'nosrc';
+ addpkg($res, $s, \%options);
+ }
+ $s = {};
+ }
+ }
+ return $res;
+}
+
+1;
+
diff --git a/Build/Repo.pm b/Build/Repo.pm
new file mode 100644
index 0000000..002f4ab
--- /dev/null
+++ b/Build/Repo.pm
@@ -0,0 +1,67 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Repo;
+
+use strict;
+
+our $do_rpmmd;
+our $do_deb;
+our $do_arch;
+our $do_susetags;
+our $do_mdk;
+
+sub import {
+ for (@_) {
+ $do_rpmmd = 1 if $_ eq ':rpmmd';
+ $do_deb = 1 if $_ eq ':deb';
+ $do_arch = 1 if $_ eq ':arch';
+ $do_susetags = 1 if $_ eq ':susetags';
+ $do_mdk = 1 if $_ eq ':mdk';
+ }
+ $do_rpmmd = $do_deb = $do_arch = $do_susetags = $do_mdk = 1 unless $do_rpmmd || $do_deb || $do_arch || $do_susetags || $do_mdk;
+ if ($do_rpmmd) {
+ require Build::Rpmmd;
+ }
+ if ($do_susetags) {
+ require Build::Susetags;
+ }
+ if ($do_deb) {
+ require Build::Debrepo;
+ }
+ if ($do_arch) {
+ require Build::Archrepo;
+ }
+ if ($do_mdk) {
+ require Build::Mdkrepo;
+ }
+}
+
+sub parse {
+ my ($type, @args) = @_;
+ return Build::Rpmmd::parse(@args) if $do_rpmmd && $type eq 'rpmmd';
+ return Build::Susetags::parse(@args) if $do_susetags && $type eq 'susetags';
+ return Build::Debrepo::parse(@args) if $do_deb && $type eq 'deb';
+ return Build::Archrepo::parse(@args) if $do_arch && $type eq 'arch';
+ return Build::Mdkrepo::parse(@args) if $do_arch && $type eq 'mdk';
+ die("parse repo: unknown type '$type'\n");
+}
+
+1;
diff --git a/Build/Rpm.pm b/Build/Rpm.pm
new file mode 100644
index 0000000..8f2c7f4
--- /dev/null
+++ b/Build/Rpm.pm
@@ -0,0 +1,1301 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Rpm;
+
+our $unfilteredprereqs = 0;
+our $conflictdeps = 0;
+
+use strict;
+
+use Digest::MD5;
+
+sub expr {
+ my $expr = shift;
+ my $lev = shift;
+
+ $lev ||= 0;
+ my ($v, $v2);
+ $expr =~ s/^\s+//;
+ my $t = substr($expr, 0, 1);
+ if ($t eq '(') {
+ ($v, $expr) = expr(substr($expr, 1), 0);
+ return undef unless defined $v;
+ return undef unless $expr =~ s/^\)//;
+ } elsif ($t eq '!') {
+ ($v, $expr) = expr(substr($expr, 1), 5);
+ return undef unless defined $v;
+ $v = 0 if $v && $v eq '\"\"';
+ $v =~ s/^0+/0/ if $v;
+ $v = !$v;
+ } elsif ($t eq '-') {
+ ($v, $expr) = expr(substr($expr, 1), 5);
+ return undef unless defined $v;
+ $v = -$v;
+ } elsif ($expr =~ /^([0-9]+)(.*?)$/) {
+ $v = $1;
+ $expr = $2;
+ } elsif ($expr =~ /^([a-zA-Z_0-9]+)(.*)$/) {
+ $v = "\"$1\"";
+ $expr = $2;
+ } elsif ($expr =~ /^(\".*?\")(.*)$/) {
+ $v = $1;
+ $expr = $2;
+ } else {
+ return;
+ }
+ return ($v, $expr) if $lev >= 5;
+ while (1) {
+ $expr =~ s/^\s+//;
+ if ($expr =~ /^&&/) {
+ return ($v, $expr) if $lev > 1;
+ ($v2, $expr) = expr(substr($expr, 2), 1);
+ return undef unless defined $v2;
+ $v = 0 if $v && $v eq '\"\"';
+ $v =~ s/^0+/0/;
+ $v2 = 0 if $v2 && $v2 eq '\"\"';
+ $v2 =~ s/^0+/0/;
+ $v &&= $v2;
+ } elsif ($expr =~ /^\|\|/) {
+ return ($v, $expr) if $lev > 1;
+ ($v2, $expr) = expr(substr($expr, 2), 1);
+ return undef unless defined $v2;
+ $v = 0 if $v && $v eq '\"\"';
+ $v =~ s/^0+/0/;
+ $v2 = 0 if $v2 && $v2 eq '\"\"';
+ $v2 =~ s/^0+/0/;
+ $v ||= $v2;
+ } elsif ($expr =~ /^>=/) {
+ return ($v, $expr) if $lev > 2;
+ ($v2, $expr) = expr(substr($expr, 2), 2);
+ return undef unless defined $v2;
+ $v = (($v =~ /^\"/) ? $v ge $v2 : $v >= $v2) ? 1 : 0;
+ } elsif ($expr =~ /^>/) {
+ return ($v, $expr) if $lev > 2;
+ ($v2, $expr) = expr(substr($expr, 1), 2);
+ return undef unless defined $v2;
+ $v = (($v =~ /^\"/) ? $v gt $v2 : $v > $v2) ? 1 : 0;
+ } elsif ($expr =~ /^<=/) {
+ return ($v, $expr) if $lev > 2;
+ ($v2, $expr) = expr(substr($expr, 2), 2);
+ return undef unless defined $v2;
+ $v = (($v =~ /^\"/) ? $v le $v2 : $v <= $v2) ? 1 : 0;
+ } elsif ($expr =~ /^</) {
+ return ($v, $expr) if $lev > 2;
+ ($v2, $expr) = expr(substr($expr, 1), 2);
+ return undef unless defined $v2;
+ $v = (($v =~ /^\"/) ? $v lt $v2 : $v < $v2) ? 1 : 0;
+ } elsif ($expr =~ /^==/) {
+ return ($v, $expr) if $lev > 2;
+ ($v2, $expr) = expr(substr($expr, 2), 2);
+ return undef unless defined $v2;
+ $v = (($v =~ /^\"/) ? $v eq $v2 : $v == $v2) ? 1 : 0;
+ } elsif ($expr =~ /^!=/) {
+ return ($v, $expr) if $lev > 2;
+ ($v2, $expr) = expr(substr($expr, 2), 2);
+ return undef unless defined $v2;
+ $v = (($v =~ /^\"/) ? $v ne $v2 : $v != $v2) ? 1 : 0;
+ } elsif ($expr =~ /^\+/) {
+ return ($v, $expr) if $lev > 3;
+ ($v2, $expr) = expr(substr($expr, 1), 3);
+ return undef unless defined $v2;
+ $v += $v2;
+ } elsif ($expr =~ /^-/) {
+ return ($v, $expr) if $lev > 3;
+ ($v2, $expr) = expr(substr($expr, 1), 3);
+ return undef unless defined $v2;
+ $v -= $v2;
+ } elsif ($expr =~ /^\*/) {
+ ($v2, $expr) = expr(substr($expr, 1), 4);
+ return undef unless defined $v2;
+ $v *= $v2;
+ } elsif ($expr =~ /^\//) {
+ ($v2, $expr) = expr(substr($expr, 1), 4);
+ return undef unless defined $v2 && 0 + $v2;
+ $v /= $v2;
+ } elsif ($expr =~ /^([=&|])/) {
+ warn("syntax error while parsing $1$1\n");
+ return ($v, $expr);
+ } else {
+ return ($v, $expr);
+ }
+ }
+}
+
+sub adaptmacros {
+ my ($macros, $optold, $optnew) = @_;
+ for (keys %$optold) {
+ delete $macros->{$_};
+ }
+ for (keys %$optnew) {
+ $macros->{$_} = $optnew->{$_};
+ }
+ return $optnew;
+}
+
+sub grabargs {
+ my ($macname, $getopt, @args) = @_;
+ my %m;
+ $m{'0'} = $macname;
+ $m{'**'} = join(' ', @args);
+ my %go;
+ %go = ($getopt =~ /(.)(:*)/sg) if defined $getopt;
+ while (@args && $args[0] =~ s/^-//) {
+ my $o = shift @args;
+ last if $o eq '-';
+ while ($o =~ /^(.)(.*)$/) {
+ if ($go{$1}) {
+ my $arg = $2;
+ $arg = shift(@args) if @args && $arg eq '';
+ $m{"-$1"} = "-$1 $arg";
+ $m{"-$1*"} = $arg;
+ last;
+ }
+ $m{"-$1"} = "-$1";
+ $o = $2;
+ }
+ }
+ $m{'#'} = scalar(@args);
+ my $i = 1;
+ for (@args) {
+ $m{$i} = $_;
+ $i++;
+ }
+ $m{'*'} = join(' ', @args);
+ return \%m;
+}
+
+# xspec may be passed as array ref to return the parsed spec files
+# an entry in the returned array can be
+# - a string: verbatim line from the original file
+# - a two element array ref:
+# - [0] original line
+# - [1] undef: line unused due to %if
+# - [1] scalar: line after macro expansion. Only set if it's a build deps
+# line and build deps got modified or 'save_expanded' is set in
+# config
+sub parse {
+ my ($config, $specfile, $xspec) = @_;
+
+ my $packname;
+ my $exclarch;
+ my $badarch;
+ my @subpacks;
+ my @packdeps;
+ my @prereqs;
+ my $hasnfb;
+ my $nfbline;
+ my %macros;
+ my %macros_args;
+ my $ret = {};
+ my $ifdeps;
+
+ my $specdata;
+ local *SPEC;
+ if (ref($specfile) eq 'GLOB') {
+ *SPEC = *$specfile;
+ } elsif (ref($specfile) eq 'ARRAY') {
+ $specdata = [ @$specfile ];
+ } elsif (!open(SPEC, '<', $specfile)) {
+ warn("$specfile: $!\n");
+ $ret->{'error'} = "open $specfile: $!";
+ return $ret;
+ }
+ my @macros = @{$config->{'macros'} || []};
+ my $skip = 0;
+ my $main_preamble = 1;
+ my $preamble = 1;
+ my $inspec = 0;
+ my $hasif = 0;
+ my $lineno = 0;
+ my $obspackage = defined($config->{'obspackage'}) ? $config->{'obspackage'} : '@OBS_PACKAGE@';
+ my $buildflavor = defined($config->{'buildflavor'}) ? $config->{'buildflavor'} : '';
+ while (1) {
+ my $line;
+ if (@macros) {
+ $line = shift @macros;
+ $hasif = 0 unless @macros;
+ } elsif ($specdata) {
+ $inspec = 1;
+ last unless @$specdata;
+ $line = shift @$specdata;
+ ++$lineno;
+ if (ref $line) {
+ $line = $line->[0]; # verbatim line
+ push @$xspec, $line if $xspec;
+ $xspec->[-1] = [ $line, undef ] if $xspec && $skip;
+ next;
+ }
+ } else {
+ $inspec = 1;
+ $line = <SPEC>;
+ last unless defined $line;
+ chomp $line;
+ ++$lineno;
+ }
+ push @$xspec, $line if $inspec && $xspec;
+ if ($line =~ /^#\s*neededforbuild\s*(\S.*)$/) {
+ if (defined $hasnfb) {
+ $xspec->[-1] = [ $xspec->[-1], undef ] if $inspec && $xspec;
+ next;
+ }
+ $hasnfb = $1;
+ $nfbline = \$xspec->[-1] if $inspec && $xspec;
+ next;
+ }
+ if ($line =~ /^\s*#/) {
+ next unless $line =~ /^#!Build(?:Ignore|Conflicts)\s*:/i;
+ }
+ my $expandedline = '';
+ if (!$skip && ($line =~ /%/)) {
+ my $tries = 0;
+ my @expandstack;
+ my $optmacros = {};
+ # newer perls: \{((?:(?>[^{}]+)|(?2))*)\}
+reexpand:
+ while ($line =~ /^(.*?)%(\{([^\}]+)\}|[\?\!]*[0-9a-zA-Z_]+|%|\*\*?|#|\()(.*?)$/) {
+ if ($tries++ > 1000) {
+ print STDERR "Warning: spec file parser ",($lineno?" line $lineno":''),": macro too deeply nested\n" if $config->{'warnings'};
+ $line = 'MACRO';
+ last;
+ }
+ $expandedline .= $1;
+ $line = $4;
+ my $macname = defined($3) ? $3 : $2;
+ my $macorig = $2;
+ my $macdata;
+ my $macalt;
+ if (defined($3)) {
+ if ($macname =~ /{/) { # {
+ while (($macname =~ y/{/{/) > ($macname =~ y/}/}/)) {
+ last unless $line =~ /^([^}]*)}(.*)$/;
+ $macname .= "}$1";
+ $macorig .= "$1}";
+ $line = $2;
+ }
+ }
+ $macdata = '';
+ if ($macname =~ /^([^\s:]+)([\s:])(.*)$/) {
+ $macname = $1;
+ if ($2 eq ':') {
+ $macalt = $3;
+ } else {
+ $macdata = $3;
+ }
+ }
+ }
+ my $mactest = 0;
+ if ($macname =~ /^\!\?/ || $macname =~ /^\?\!/) {
+ $mactest = -1;
+ } elsif ($macname =~ /^\?/) {
+ $mactest = 1;
+ }
+ $macname =~ s/^[\!\?]+//;
+ if ($macname eq '%') {
+ $expandedline .= '%';
+ next;
+ } elsif ($macname eq '(') {
+ print STDERR "Warning: spec file parser",($lineno?" line $lineno":''),": can't expand %(...)\n" if $config->{'warnings'};
+ $line = 'MACRO';
+ last;
+ } elsif ($macname eq 'define' || $macname eq 'global') {
+ if ($line =~ /^\s*([0-9a-zA-Z_]+)(?:\(([^\)]*)\))?\s*(.*?)$/) {
+ my $macname = $1;
+ my $macargs = $2;
+ my $macbody = $3;
+ if (defined $macargs) {
+ $macros_args{$macname} = $macargs;
+ } else {
+ delete $macros_args{$macname};
+ }
+ $macros{$macname} = $macbody;
+ }
+ $line = '';
+ last;
+ } elsif ($macname eq 'defined' || $macname eq 'with' || $macname eq 'undefined' || $macname eq 'without' || $macname eq 'bcond_with' || $macname eq 'bcond_without') {
+ my @args;
+ if ($macorig =~ /^\{(.*)\}$/) {
+ @args = split(' ', $1);
+ shift @args;
+ } else {
+ @args = split(' ', $line);
+ $line = '';
+ }
+ next unless @args;
+ if ($macname eq 'bcond_with') {
+ $macros{"with_$args[0]"} = 1 if exists $macros{"_with_$args[0]"};
+ next;
+ }
+ if ($macname eq 'bcond_without') {
+ $macros{"with_$args[0]"} = 1 unless exists $macros{"_without_$args[0]"};
+ next;
+ }
+ $args[0] = "with_$args[0]" if $macname eq 'with' || $macname eq 'without';
+ $line = ((exists($macros{$args[0]}) ? 1 : 0) ^ ($macname eq 'undefined' || $macname eq 'without' ? 1 : 0)).$line;
+ } elsif ($macname eq 'expand') {
+ $macalt = $macros{$macname} unless defined $macalt;
+ $macalt = '' if $mactest == -1;
+ push @expandstack, ($expandedline, $line, undef);
+ $line = $macalt;
+ $expandedline = '';
+ } elsif (exists($macros{$macname})) {
+ if (!defined($macros{$macname})) {
+ print STDERR "Warning: spec file parser",($lineno?" line $lineno":''),": can't expand '$macname'\n" if $config->{'warnings'};
+ $line = 'MACRO';
+ last;
+ }
+ if (defined($macros_args{$macname})) {
+ # macro with args!
+ if (!defined($macdata)) {
+ $line =~ /^\s*([^\n]*).*$/;
+ $macdata = $1;
+ $line = '';
+ }
+ push @expandstack, ($expandedline, $line, $optmacros);
+ $optmacros = adaptmacros(\%macros, $optmacros, grabargs($macname, $macros_args{$macname}, split(' ', $macdata)));
+ $line = $macros{$macname};
+ $expandedline = '';
+ next;
+ }
+ $macalt = $macros{$macname} unless defined $macalt;
+ $macalt = '' if $mactest == -1;
+ if ($macalt =~ /%/) {
+ push @expandstack, ('', $line, 1) if $line ne '';
+ $line = $macalt;
+ } else {
+ $expandedline .= $macalt;
+ }
+ } elsif ($mactest) {
+ $macalt = '' if !defined($macalt) || $mactest == 1;
+ if ($macalt =~ /%/) {
+ push @expandstack, ('', $line, 1) if $line ne '';
+ $line = $macalt;
+ } else {
+ $expandedline .= $macalt;
+ }
+ } else {
+ $expandedline .= "%$macorig" unless $macname =~ /^-/;
+ }
+ }
+ $line = $expandedline . $line;
+ if (@expandstack) {
+ my $m = pop(@expandstack);
+ if ($m) {
+ $optmacros = adaptmacros(\%macros, $optmacros, $m) if ref $m;
+ $expandstack[-2] .= $line;
+ $line = pop(@expandstack);
+ $expandedline = pop(@expandstack);
+ } else {
+ my $todo = pop(@expandstack);
+ $expandedline = pop(@expandstack);
+ push @expandstack, ('', $todo, 1) if $todo ne '';
+ }
+ goto reexpand;
+ }
+ }
+ if ($line =~ /^\s*%else\b/) {
+ $skip = 1 - $skip if $skip < 2;
+ next;
+ }
+ if ($line =~ /^\s*%endif\b/) {
+ $skip-- if $skip;
+ next;
+ }
+ $skip++ if $skip && $line =~ /^\s*%if/;
+
+ if ($skip) {
+ $xspec->[-1] = [ $xspec->[-1], undef ] if $xspec;
+ $ifdeps = 1 if $line =~ /^(BuildRequires|BuildPrereq|BuildConflicts|\#\!BuildIgnore|\#\!BuildConflicts)\s*:\s*(\S.*)$/i;
+ next;
+ }
+
+ if ($line =~ /\@/) {
+ $line =~ s/\@BUILD_FLAVOR\@/$buildflavor/g;
+ $line =~ s/\@OBS_PACKAGE\@/$obspackage/g;
+ }
+
+ if ($line =~ /^\s*%ifarch(.*)$/) {
+ my $arch = $macros{'_target_cpu'} || 'unknown';
+ my @archs = grep {$_ eq $arch} split(/\s+/, $1);
+ $skip = 1 if !@archs;
+ $hasif = 1;
+ next;
+ }
+ if ($line =~ /^\s*%ifnarch(.*)$/) {
+ my $arch = $macros{'_target_cpu'} || 'unknown';
+ my @archs = grep {$_ eq $arch} split(/\s+/, $1);
+ $skip = 1 if @archs;
+ $hasif = 1;
+ next;
+ }
+ if ($line =~ /^\s*%ifos(.*)$/) {
+ my $os = $macros{'_target_os'} || 'unknown';
+ my @oss = grep {$_ eq $os} split(/\s+/, $1);
+ $skip = 1 if !@oss;
+ $hasif = 1;
+ next;
+ }
+ if ($line =~ /^\s*%ifnos(.*)$/) {
+ my $os = $macros{'_target_os'} || 'unknown';
+ my @oss = grep {$_ eq $os} split(/\s+/, $1);
+ $skip = 1 if @oss;
+ $hasif = 1;
+ next;
+ }
+ if ($line =~ /^\s*%if(.*)$/) {
+ my ($v, $r) = expr($1);
+ $v = 0 if $v && $v eq '\"\"';
+ $v =~ s/^0+/0/ if $v;
+ $skip = 1 unless $v;
+ $hasif = 1;
+ next;
+ }
+ if ($main_preamble) {
+ if ($line =~ /^(Name|Version|Disttag|Release)\s*:\s*(\S+)/i) {
+ $ret->{lc $1} = $2;
+ $macros{lc $1} = $2;
+ } elsif ($line =~ /^ExclusiveArch\s*:\s*(.*)/i) {
+ $exclarch ||= [];
+ push @$exclarch, split(' ', $1);
+ } elsif ($line =~ /^ExcludeArch\s*:\s*(.*)/i) {
+ $badarch ||= [];
+ push @$badarch, split(' ', $1);
+ }
+ }
+ if (@subpacks && $preamble && exists($ret->{'version'}) && $line =~ /^Version\s*:\s*(\S+)/i) {
+ $ret->{'multiversion'} = 1 if $ret->{'version'} ne $1;
+ }
+ if ($line =~ /^(?:Requires\(pre\)|Requires\(post\)|PreReq)\s*:\s*(\S.*)$/i) {
+ my $deps = $1;
+ my @deps = $deps =~ /([^\s\[,]+)(\s+[<=>]+\s+[^\s\[,]+)?(\s+\[[^\]]+\])?[\s,]*/g;
+ while (@deps) {
+ my ($pack, $vers, $qual) = splice(@deps, 0, 3);
+ if (!$unfilteredprereqs && $pack =~ /^\//) {
+ $ifdeps = 1;
+ next unless $config->{'fileprovides'}->{$pack};
+ }
+ push @prereqs, $pack unless grep {$_ eq $pack} @prereqs;
+ }
+ next;
+ }
+ if ($preamble && ($line =~ /^(BuildRequires|BuildPrereq|BuildConflicts|\#\!BuildIgnore|\#\!BuildConflicts)\s*:\s*(\S.*)$/i)) {
+ my $what = $1;
+ my $deps = $2;
+ $ifdeps = 1 if $hasif;
+ # XXX: weird syntax addition. can append arch or project to dependency
+ # BuildRequire: foo > 17 [i586,x86_64]
+ # BuildRequire: foo [home:bar]
+ # BuildRequire: foo [!home:bar]
+ my @deps;
+ if (" $deps" =~ /[\s,]\(/) {
+ # we need to be careful, there could be a rich dep
+ my $d = $deps;
+ while ($d ne '') {
+ if ($d =~ /^\(/) {
+ my @s = split(' ', $d);
+ push @deps, shiftrich(\@s), undef, undef;
+ $d = join(' ', @s);
+ } else {
+ last unless $d =~ s/([^\s\[,]+)(\s+[<=>]+\s+[^\s\[,]+)?(\s+\[[^\]]+\])?[\s,]*//;
+ push @deps, $1, $2, $3;
+ }
+ }
+ } else {
+ @deps = $deps =~ /([^\s\[,]+)(\s+[<=>]+\s+[^\s\[,]+)?(\s+\[[^\]]+\])?[\s,]*/g;
+ }
+ my $replace = 0;
+ my @ndeps = ();
+ while (@deps) {
+ my ($pack, $vers, $qual) = splice(@deps, 0, 3);
+ if (defined($qual)) {
+ $replace = 1;
+ my $arch = $macros{'_target_cpu'} || '';
+ my $proj = $macros{'_target_project'} || '';
+ $qual =~ s/^\s*\[//;
+ $qual =~ s/\]$//;
+ my $isneg = 0;
+ my $bad;
+ for my $q (split('[\s,]', $qual)) {
+ $isneg = 1 if $q =~ s/^\!//;
+ $bad = 1 if !defined($bad) && !$isneg;
+ if ($isneg) {
+ if ($q eq $arch || $q eq $proj) {
+ $bad = 1;
+ last;
+ }
+ } elsif ($q eq $arch || $q eq $proj) {
+ $bad = 0;
+ }
+ }
+ next if $bad;
+ }
+ $vers = '' unless defined $vers;
+ $vers =~ s/=(>|<)/$1=/;
+ push @ndeps, "$pack$vers";
+ }
+
+ $replace = 1 if grep {/^-/} @ndeps;
+ if (lc($what) ne 'buildrequires' && lc($what) ne 'buildprereq') {
+ if ($conflictdeps && $what =~ /conflict/i) {
+ push @packdeps, map {"!$_"} @ndeps;
+ next;
+ }
+ push @packdeps, map {"-$_"} @ndeps;
+ next;
+ }
+ if (defined($hasnfb)) {
+ if ((grep {$_ eq 'glibc' || $_ eq 'rpm' || $_ eq 'gcc' || $_ eq 'bash'} @ndeps) > 2) {
+ # ignore old generated BuildRequire lines.
+ $xspec->[-1] = [ $xspec->[-1], undef ] if $xspec;
+ next;
+ }
+ }
+ push @packdeps, @ndeps;
+ next unless $xspec && $inspec;
+ if ($replace) {
+ my @cndeps = grep {!/^-/} @ndeps;
+ if (@cndeps) {
+ $xspec->[-1] = [ $xspec->[-1], "$what: ".join(' ', @cndeps) ];
+ } else {
+ $xspec->[-1] = [ $xspec->[-1], ''];
+ }
+ }
+ next;
+ } elsif ($preamble && $line =~ /^(Source\d*|Patch\d*|Url|Icon)\s*:\s*(\S+)/i) {
+ my ($tag, $val) = (lc($1), $2);
+ $macros{$tag} = $val if $tag eq 'url';
+ # associate url and icon tags with the corresponding subpackage
+ $tag .= scalar @subpacks if ($tag eq 'url' || $tag eq 'icon') && @subpacks;
+ if ($tag =~ /icon/) {
+ # there can be a gif and xpm icon
+ push @{$ret->{$tag}}, $val;
+ } else {
+ $ret->{$tag} = $val;
+ }
+ if ($tag =~ /^(source|patch)(\d+)?$/) {
+ my $num = defined($2) ? $2 : ($1 eq 'source' ? 0 : -1);
+ $macros{uc($1) . "URL$num"} = $val if $num >= 0;
+ }
+ } elsif (!$preamble && ($line =~ /^(Source\d*|Patch\d*|Url|Icon|BuildRequires|BuildPrereq|BuildConflicts|\#\!BuildIgnore)\s*:\s*(\S.*)$/i)) {
+ print STDERR "Warning: spec file parser ".($lineno ? " line $lineno" : '').": Ignoring $1 used beyond the preamble.\n" if $config->{'warnings'};
+ }
+
+ if ($line =~ /^\s*%package\s+(-n\s+)?(\S+)/) {
+ if ($1) {
+ push @subpacks, $2;
+ } else {
+ push @subpacks, $ret->{'name'}.'-'.$2 if defined $ret->{'name'};
+ }
+ $preamble = 1;
+ $main_preamble = 0;
+ }
+
+ if ($line =~ /^\s*%(prep|build|install|check|clean|preun|postun|pretrans|posttrans|pre|post|files|changelog|description|triggerpostun|triggerun|triggerin|trigger|verifyscript)/) {
+ $main_preamble = 0;
+ $preamble = 0;
+ }
+
+ # do this always?
+ if ($xspec && @$xspec && $config->{'save_expanded'}) {
+ $xspec->[-1] = [ $xspec->[-1], $line ];
+ }
+ }
+ close SPEC unless ref $specfile;
+ if (defined($hasnfb)) {
+ if (!@packdeps) {
+ @packdeps = split(' ', $hasnfb);
+ } elsif ($nfbline) {
+ $$nfbline = [$$nfbline, undef ];
+ }
+ }
+ unshift @subpacks, $ret->{'name'} if defined $ret->{'name'};
+ $ret->{'subpacks'} = \@subpacks;
+ $ret->{'exclarch'} = $exclarch if defined $exclarch;
+ $ret->{'badarch'} = $badarch if defined $badarch;
+ $ret->{'deps'} = \@packdeps;
+ $ret->{'prereqs'} = \@prereqs if @prereqs;
+ $ret->{'configdependent'} = 1 if $ifdeps;
+ return $ret;
+}
+
+###########################################################################
+
+my %rpmstag = (
+ "SIGTAG_SIZE" => 1000, # Header+Payload size in bytes. */
+ "SIGTAG_PGP" => 1002, # RSA signature over Header+Payload
+ "SIGTAG_MD5" => 1004, # MD5 hash over Header+Payload
+ "SIGTAG_GPG" => 1005, # DSA signature over Header+Payload
+ "NAME" => 1000,
+ "VERSION" => 1001,
+ "RELEASE" => 1002,
+ "EPOCH" => 1003,
+ "SUMMARY" => 1004,
+ "DESCRIPTION" => 1005,
+ "BUILDTIME" => 1006,
+ "ARCH" => 1022,
+ "OLDFILENAMES" => 1027,
+ "SOURCERPM" => 1044,
+ "PROVIDENAME" => 1047,
+ "REQUIREFLAGS" => 1048,
+ "REQUIRENAME" => 1049,
+ "REQUIREVERSION" => 1050,
+ "NOSOURCE" => 1051,
+ "NOPATCH" => 1052,
+ "SOURCEPACKAGE" => 1106,
+ "PROVIDEFLAGS" => 1112,
+ "PROVIDEVERSION" => 1113,
+ "DIRINDEXES" => 1116,
+ "BASENAMES" => 1117,
+ "DIRNAMES" => 1118,
+ "DISTURL" => 1123,
+ "CONFLICTFLAGS" => 1053,
+ "CONFLICTNAME" => 1054,
+ "CONFLICTVERSION" => 1055,
+ "OBSOLETENAME" => 1090,
+ "OBSOLETEFLAGS" => 1114,
+ "OBSOLETEVERSION" => 1115,
+ "OLDSUGGESTSNAME" => 1156,
+ "OLDSUGGESTSVERSION" => 1157,
+ "OLDSUGGESTSFLAGS" => 1158,
+ "OLDENHANCESNAME" => 1159,
+ "OLDENHANCESVERSION" => 1160,
+ "OLDENHANCESFLAGS" => 1161,
+ "RECOMMENDNAME" => 5046,
+ "RECOMMENDVERSION" => 5047,
+ "RECOMMENDFLAGS" => 5048,
+ "SUGGESTNAME" => 5049,
+ "SUGGESTVERSION" => 5050,
+ "SUGGESTFLAGS" => 5051,
+ "SUPPLEMENTNAME" => 5052,
+ "SUPPLEMENTVERSION" => 5053,
+ "SUPPLEMENTFLAGS" => 5054,
+ "ENHANCENAME" => 5055,
+ "ENHANCEVERSION" => 5056,
+ "ENHANCEFLAGS" => 5057,
+);
+
+sub rpmq {
+ my ($rpm, @stags) = @_;
+
+ my @sigtags = grep {/^SIGTAG_/} @stags;
+ @stags = grep {!/^SIGTAG_/} @stags;
+ my $dosigs = @sigtags && !@stags;
+ @stags = @sigtags if $dosigs;
+
+ my $need_filenames = grep { $_ eq 'FILENAMES' } @stags;
+ push @stags, 'BASENAMES', 'DIRNAMES', 'DIRINDEXES', 'OLDFILENAMES' if $need_filenames;
+ @stags = grep { $_ ne 'FILENAMES' } @stags if $need_filenames;
+
+ my %stags = map {0 + ($rpmstag{$_} || $_) => $_} @stags;
+
+ my ($magic, $sigtype, $headmagic, $cnt, $cntdata, $lead, $head, $index, $data, $tag, $type, $offset, $count);
+
+ local *RPM;
+ my $forcebinary;
+ if (ref($rpm) eq 'ARRAY') {
+ ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $rpm->[0]);
+ if ($headmagic != 0x8eade801) {
+ warn("Bad rpm\n");
+ return ();
+ }
+ if (length($rpm->[0]) < 16 + $cnt * 16 + $cntdata) {
+ warn("Bad rpm\n");
+ return ();
+ }
+ $index = substr($rpm->[0], 16, $cnt * 16);
+ $data = substr($rpm->[0], 16 + $cnt * 16, $cntdata);
+ } else {
+ if (ref($rpm) eq 'GLOB') {
+ *RPM = *$rpm;
+ } elsif (!open(RPM, '<', $rpm)) {
+ warn("$rpm: $!\n");
+ return ();
+ }
+ if (read(RPM, $lead, 96) != 96) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ ($magic, $sigtype) = unpack('N@78n', $lead);
+ if ($magic != 0xedabeedb || $sigtype != 5) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ $forcebinary = 1 if unpack('@6n', $lead) != 1;
+ if (read(RPM, $head, 16) != 16) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $head);
+ if ($headmagic != 0x8eade801) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ if (read(RPM, $index, $cnt * 16) != $cnt * 16) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ $cntdata = ($cntdata + 7) & ~7;
+ if (read(RPM, $data, $cntdata) != $cntdata) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ }
+
+ my %res = ();
+ if (@sigtags && !$dosigs) {
+ %res = &rpmq(["$head$index$data"], @sigtags);
+ }
+ if (ref($rpm) eq 'ARRAY' && !$dosigs && @$rpm > 1) {
+ my %res2 = &rpmq([ $rpm->[1] ], @stags);
+ %res = (%res, %res2);
+ return %res;
+ }
+ if (ref($rpm) ne 'ARRAY' && !$dosigs) {
+ if (read(RPM, $head, 16) != 16) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $head);
+ if ($headmagic != 0x8eade801) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ if (read(RPM, $index, $cnt * 16) != $cnt * 16) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ if (read(RPM, $data, $cntdata) != $cntdata) {
+ warn("Bad rpm $rpm\n");
+ close RPM unless ref($rpm);
+ return ();
+ }
+ }
+ close RPM unless ref($rpm);
+
+# return %res unless @stags;
+
+ while($cnt-- > 0) {
+ ($tag, $type, $offset, $count, $index) = unpack('N4a*', $index);
+ $tag = 0+$tag;
+ if ($stags{$tag} || !@stags) {
+ eval {
+ my $otag = $stags{$tag} || $tag;
+ if ($type == 0) {
+ $res{$otag} = [ '' ];
+ } elsif ($type == 1) {
+ $res{$otag} = [ unpack("\@${offset}c$count", $data) ];
+ } elsif ($type == 2) {
+ $res{$otag} = [ unpack("\@${offset}c$count", $data) ];
+ } elsif ($type == 3) {
+ $res{$otag} = [ unpack("\@${offset}n$count", $data) ];
+ } elsif ($type == 4) {
+ $res{$otag} = [ unpack("\@${offset}N$count", $data) ];
+ } elsif ($type == 5) {
+ $res{$otag} = [ undef ];
+ } elsif ($type == 6) {
+ $res{$otag} = [ unpack("\@${offset}Z*", $data) ];
+ } elsif ($type == 7) {
+ $res{$otag} = [ unpack("\@${offset}a$count", $data) ];
+ } elsif ($type == 8 || $type == 9) {
+ my $d = unpack("\@${offset}a*", $data);
+ my @res = split("\0", $d, $count + 1);
+ $res{$otag} = [ splice @res, 0, $count ];
+ } else {
+ $res{$otag} = [ undef ];
+ }
+ };
+ if ($@) {
+ warn("Bad rpm $rpm: $@\n");
+ return ();
+ }
+ }
+ }
+ if ($forcebinary && $stags{1044} && !$res{$stags{1044}} && !($stags{1106} && $res{$stags{1106}})) {
+ $res{$stags{1044}} = [ '(none)' ]; # like rpm does...
+ }
+
+ if ($need_filenames) {
+ if ($res{'OLDFILENAMES'}) {
+ $res{'FILENAMES'} = [ @{$res{'OLDFILENAMES'}} ];
+ } else {
+ my $i = 0;
+ $res{'FILENAMES'} = [ map {"$res{'DIRNAMES'}->[$res{'DIRINDEXES'}->[$i++]]$_"} @{$res{'BASENAMES'}} ];
+ }
+ }
+
+ return %res;
+}
+
+sub add_flagsvers {
+ my ($res, $name, $flags, $vers) = @_;
+
+ return unless $res && $res->{$name};
+ my @flags = @{$res->{$flags} || []};
+ my @vers = @{$res->{$vers} || []};
+ for (@{$res->{$name}}) {
+ if (@flags && ($flags[0] & 0xe) && @vers) {
+ $_ .= ' ';
+ $_ .= '<' if $flags[0] & 2;
+ $_ .= '>' if $flags[0] & 4;
+ $_ .= '=' if $flags[0] & 8;
+ $_ .= " $vers[0]";
+ }
+ shift @flags;
+ shift @vers;
+ }
+}
+
+sub filteroldweak {
+ my ($res, $name, $flags, $data, $strong, $weak) = @_;
+
+ return unless $res && $res->{$name};
+ my @flags = @{$res->{$flags} || []};
+ my @strong;
+ my @weak;
+ for (@{$res->{$name}}) {
+ if (@flags && ($flags[0] & 0x8000000)) {
+ push @strong, $_;
+ } else {
+ push @weak, $_;
+ }
+ shift @flags;
+ }
+ $data->{$strong} = \@strong if @strong;
+ $data->{$weak} = \@weak if @weak;
+}
+
+sub verscmp_part {
+ my ($s1, $s2) = @_;
+ if (!defined($s1)) {
+ return defined($s2) ? -1 : 0;
+ }
+ return 1 if !defined $s2;
+ return 0 if $s1 eq $s2;
+ while (1) {
+ $s1 =~ s/^[^a-zA-Z0-9~]+//;
+ $s2 =~ s/^[^a-zA-Z0-9~]+//;
+ if ($s1 =~ s/^~//) {
+ next if $s2 =~ s/^~//;
+ return -1;
+ }
+ return 1 if $s2 =~ /^~/;
+ if ($s1 eq '') {
+ return $s2 eq '' ? 0 : -1;
+ }
+ return 1 if $s2 eq '';
+ my ($x1, $x2, $r);
+ if ($s1 =~ /^([0-9]+)(.*?)$/) {
+ $x1 = $1;
+ $s1 = $2;
+ $s2 =~ /^([0-9]*)(.*?)$/;
+ $x2 = $1;
+ $s2 = $2;
+ return 1 if $x2 eq '';
+ $x1 =~ s/^0+//;
+ $x2 =~ s/^0+//;
+ $r = length($x1) - length($x2) || $x1 cmp $x2;
+ } elsif ($s1 ne '' && $s2 ne '') {
+ $s1 =~ /^([a-zA-Z]*)(.*?)$/;
+ $x1 = $1;
+ $s1 = $2;
+ $s2 =~ /^([a-zA-Z]*)(.*?)$/;
+ $x2 = $1;
+ $s2 = $2;
+ return -1 if $x1 eq '' || $x2 eq '';
+ $r = $x1 cmp $x2;
+ }
+ return $r > 0 ? 1 : -1 if $r;
+ }
+}
+
+sub verscmp {
+ my ($s1, $s2, $dtest) = @_;
+
+ return 0 if $s1 eq $s2;
+ my ($e1, $v1, $r1) = $s1 =~ /^(?:(\d+):)?(.*?)(?:-([^-]*))?$/s;
+ $e1 = 0 unless defined $e1;
+ my ($e2, $v2, $r2) = $s2 =~ /^(?:(\d+):)?(.*?)(?:-([^-]*))?$/s;
+ $e2 = 0 unless defined $e2;
+ if ($e1 ne $e2) {
+ my $r = verscmp_part($e1, $e2);
+ return $r if $r;
+ }
+ return 0 if $dtest && ($v1 eq '' || $v2 eq '');
+ if ($v1 ne $v2) {
+ my $r = verscmp_part($v1, $v2);
+ return $r if $r;
+ }
+ $r1 = '' unless defined $r1;
+ $r2 = '' unless defined $r2;
+ return 0 if $dtest && ($r1 eq '' || $r2 eq '');
+ if ($r1 ne $r2) {
+ return verscmp_part($r1, $r2);
+ }
+ return 0;
+}
+
+sub query {
+ my ($handle, %opts) = @_;
+
+ my @tags = qw{NAME SOURCERPM NOSOURCE NOPATCH SIGTAG_MD5 PROVIDENAME PROVIDEFLAGS PROVIDEVERSION REQUIRENAME REQUIREFLAGS REQUIREVERSION SOURCEPACKAGE};
+ 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'};
+ push @tags, qw{CONFLICTNAME CONFLICTVERSION CONFLICTFLAGS OBSOLETENAME OBSOLETEVERSION OBSOLETEFLAGS} if $opts{'conflicts'};
+ push @tags, qw{RECOMMENDNAME RECOMMENDVERSION RECOMMENDFLAGS SUGGESTNAME SUGGESTVERSION SUGGESTFLAGS SUPPLEMENTNAME SUPPLEMENTVERSION SUPPLEMENTFLAGS ENHANCENAME ENHANCEVERSION ENHANCEFLAGS OLDSUGGESTSNAME OLDSUGGESTSVERSION OLDSUGGESTSFLAGS OLDENHANCESNAME OLDENHANCESVERSION OLDENHANCESFLAGS} if $opts{'weakdeps'};
+
+ my %res = rpmq($handle, @tags);
+ return undef unless %res;
+ my $src = $res{'SOURCERPM'}->[0];
+ $src = '' unless defined $src;
+ $src =~ s/-[^-]*-[^-]*\.[^\.]*\.rpm//;
+ add_flagsvers(\%res, 'PROVIDENAME', 'PROVIDEFLAGS', 'PROVIDEVERSION');
+ add_flagsvers(\%res, 'REQUIRENAME', 'REQUIREFLAGS', 'REQUIREVERSION');
+ my $data = {
+ name => $res{'NAME'}->[0],
+ hdrmd5 => unpack('H32', $res{'SIGTAG_MD5'}->[0]),
+ };
+ if ($opts{'alldeps'}) {
+ $data->{'provides'} = [ @{$res{'PROVIDENAME'} || []} ];
+ $data->{'requires'} = [ @{$res{'REQUIRENAME'} || []} ];
+ } else {
+ $data->{'provides'} = [ grep {!/^rpmlib\(/ && !/^\//} @{$res{'PROVIDENAME'} || []} ];
+ $data->{'requires'} = [ grep {!/^rpmlib\(/ && !/^\//} @{$res{'REQUIRENAME'} || []} ];
+ }
+ if ($opts{'conflicts'}) {
+ add_flagsvers(\%res, 'CONFLICTNAME', 'CONFLICTFLAGS', 'CONFLICTVERSION');
+ add_flagsvers(\%res, 'OBSOLETENAME', 'OBSOLETEFLAGS', 'OBSOLETEVERSION');
+ $data->{'conflicts'} = [ @{$res{'CONFLICTNAME'}} ] if $res{'CONFLICTNAME'};
+ $data->{'obsoletes'} = [ @{$res{'OBSOLETENAME'}} ] if $res{'OBSOLETENAME'};
+ }
+ if ($opts{'weakdeps'}) {
+ for (qw{RECOMMEND SUGGEST SUPPLEMENT ENHANCE}) {
+ next unless $res{"${_}NAME"};
+ add_flagsvers(\%res, "${_}NAME", "${_}FLAGS", "${_}VERSION");
+ $data->{lc($_)."s"} = [ @{$res{"${_}NAME"}} ];
+ }
+ if ($res{'OLDSUGGESTSNAME'}) {
+ add_flagsvers(\%res, 'OLDSUGGESTSNAME', 'OLDSUGGESTSFLAGS', 'OLDSUGGESTSVERSION');
+ filteroldweak(\%res, 'OLDSUGGESTSNAME', 'OLDSUGGESTSFLAGS', $data, 'recommends', 'suggests');
+ }
+ if ($res{'OLDENHANCESNAME'}) {
+ add_flagsvers(\%res, 'OLDENHANCESNAME', 'OLDENHANCESFLAGS', 'OLDENHANCESVERSION');
+ filteroldweak(\%res, 'OLDENHANCESNAME', 'OLDENHANCESFLAGS', $data, 'supplements', 'enhances');
+ }
+ }
+
+ # rpm3 compatibility: retrofit missing self provides
+ if ($src ne '') {
+ my $haveselfprovides;
+ if (@{$data->{'provides'}}) {
+ if ($data->{'provides'}->[-1] =~ /^\Q$res{'NAME'}->[0]\E =/) {
+ $haveselfprovides = 1;
+ } elsif (@{$data->{'provides'}} > 1 && $data->{'provides'}->[-2] =~ /^\Q$res{'NAME'}->[0]\E =/) {
+ $haveselfprovides = 1;
+ }
+ }
+ if (!$haveselfprovides) {
+ my $evr = "$res{'VERSION'}->[0]-$res{'RELEASE'}->[0]";
+ $evr = "$res{'EPOCH'}->[0]:$evr" if $res{'EPOCH'} && $res{'EPOCH'}->[0];
+ push @{$data->{'provides'}}, "$res{'NAME'}->[0] = $evr";
+ }
+ }
+
+ $data->{'source'} = $src eq '(none)' ? $data->{'name'} : $src if $src ne '';
+ if ($opts{'evra'}) {
+ my $arch = $res{'ARCH'}->[0];
+ $arch = $res{'NOSOURCE'} || $res{'NOPATCH'} ? 'nosrc' : 'src' unless $src ne '';
+ $data->{'version'} = $res{'VERSION'}->[0];
+ $data->{'release'} = $res{'RELEASE'}->[0];
+ $data->{'arch'} = $arch;
+ $data->{'epoch'} = $res{'EPOCH'}->[0] if exists $res{'EPOCH'};
+ }
+ if ($opts{'filelist'}) {
+ $data->{'filelist'} = $res{'FILENAMES'};
+ }
+ if ($opts{'description'}) {
+ $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;
+}
+
+sub queryhdrmd5 {
+ my ($bin, $leadsigp) = @_;
+
+ local *F;
+ open(F, '<', $bin) || die("$bin: $!\n");
+ my $buf = '';
+ my $l;
+ while (length($buf) < 96 + 16) {
+ $l = sysread(F, $buf, 4096, length($buf));
+ if (!$l) {
+ warn("$bin: read error\n");
+ close(F);
+ return undef;
+ }
+ }
+ my ($magic, $sigtype) = unpack('N@78n', $buf);
+ if ($magic != 0xedabeedb || $sigtype != 5) {
+ warn("$bin: not a rpm (bad magic of header type)\n");
+ close(F);
+ return undef;
+ }
+ my ($headmagic, $cnt, $cntdata) = unpack('@96N@104NN', $buf);
+ if ($headmagic != 0x8eade801) {
+ warn("$bin: not a rpm (bad sig header magic)\n");
+ close(F);
+ return undef;
+ }
+ my $hlen = 96 + 16 + $cnt * 16 + $cntdata;
+ $hlen = ($hlen + 7) & ~7;
+ while (length($buf) < $hlen) {
+ $l = sysread(F, $buf, 4096, length($buf));
+ if (!$l) {
+ warn("$bin: read error\n");
+ close(F);
+ return undef;
+ }
+ }
+ close F;
+ $$leadsigp = Digest::MD5::md5_hex(substr($buf, 0, $hlen)) if $leadsigp;
+ my $idxarea = substr($buf, 96 + 16, $cnt * 16);
+ if ($idxarea !~ /\A(?:.{16})*\000\000\003\354\000\000\000\007(....)\000\000\000\020/s) {
+ warn("$bin: no md5 signature header\n");
+ return undef;
+ }
+ my $md5off = unpack('N', $1);
+ if ($md5off >= $cntdata) {
+ warn("$bin: bad md5 offset\n");
+ return undef;
+ }
+ $md5off += 96 + 16 + $cnt * 16;
+ return unpack("\@${md5off}H32", $buf);
+}
+
+sub queryinstalled {
+ my ($root, %opts) = @_;
+
+ $root = '' if !defined($root) || $root eq '/';
+ local *F;
+ my $dochroot = $root ne '' && !$opts{'nochroot'} && !$< && (-x "$root/usr/bin/rpm" || -x "$root/bin/rpm") ? 1 : 0;
+ my $pid = open(F, '-|');
+ die("fork: $!\n") unless defined $pid;
+ if (!$pid) {
+ if ($dochroot && chroot($root)) {
+ chdir('/') || die("chdir: $!\n");
+ $root = '';
+ }
+ my @args;
+ unshift @args, '--nodigest', '--nosignature' if -e "$root/usr/bin/rpmquery ";
+ unshift @args, '--dbpath', "$root/var/lib/rpm" if $root ne '';
+ push @args, '--qf', '%{NAME}/%{ARCH}/%|EPOCH?{%{EPOCH}}:{0}|/%{VERSION}/%{RELEASE}/%{BUILDTIME}\n';
+ if (-x "$root/usr/bin/rpm") {
+ exec("$root/usr/bin/rpm", '-qa', @args);
+ die("$root/usr/bin/rpm: $!\n");
+ }
+ if (-x "$root/bin/rpm") {
+ exec("$root/bin/rpm", '-qa', @args);
+ die("$root/bin/rpm: $!\n");
+ }
+ die("rpm: command not found\n");
+ }
+ my @pkgs;
+ while (<F>) {
+ chomp;
+ my @s = split('/', $_);
+ next unless @s >= 5;
+ my $q = {'name' => $s[0], 'arch' => $s[1], 'version' => $s[3], 'release' => $s[4]};
+ $q->{'epoch'} = $s[2] if $s[2];
+ $q->{'buildtime'} = $s[5] if $s[5];
+ push @pkgs, $q;
+ }
+ if (!close(F)) {
+ return queryinstalled($root, %opts, 'nochroot' => 1) if !@pkgs && $dochroot;
+ die("rpm: exit status $?\n");
+ }
+ return \@pkgs;
+}
+
+# return (lead, sighdr, hdr [, hdrmd5]) of a rpm
+sub getrpmheaders {
+ my ($path, $withhdrmd5) = @_;
+
+ my $hdrmd5;
+ local *F;
+ open(F, '<', $path) || die("$path: $!\n");
+ my $buf = '';
+ my $l;
+ while (length($buf) < 96 + 16) {
+ $l = sysread(F, $buf, 4096, length($buf));
+ die("$path: read error\n") unless $l;
+ }
+ die("$path: not a rpm\n") unless unpack('N', $buf) == 0xedabeedb && unpack('@78n', $buf) == 5;
+ my ($headmagic, $cnt, $cntdata) = unpack('@96N@104NN', $buf);
+ die("$path: not a rpm (bad sig header)\n") unless $headmagic == 0x8eade801 && $cnt < 16384 && $cntdata < 1048576;
+ my $hlen = 96 + 16 + $cnt * 16 + $cntdata;
+ $hlen = ($hlen + 7) & ~7;
+ while (length($buf) < $hlen + 16) {
+ $l = sysread(F, $buf, 4096, length($buf));
+ die("$path: read error\n") unless $l;
+ }
+ if ($withhdrmd5) {
+ my $idxarea = substr($buf, 96 + 16, $cnt * 16);
+ die("$path: no md5 signature header\n") unless $idxarea =~ /\A(?:.{16})*\000\000\003\354\000\000\000\007(....)\000\000\000\020/s;
+ my $md5off = unpack('N', $1);
+ die("$path: bad md5 offset\n") unless $md5off;
+ $md5off += 96 + 16 + $cnt * 16;
+ $hdrmd5 = unpack("\@${md5off}H32", $buf);
+ }
+ ($headmagic, $cnt, $cntdata) = unpack('N@8NN', substr($buf, $hlen));
+ die("$path: not a rpm (bad header)\n") unless $headmagic == 0x8eade801 && $cnt < 1048576 && $cntdata < 33554432;
+ my $hlen2 = $hlen + 16 + $cnt * 16 + $cntdata;
+ while (length($buf) < $hlen2) {
+ $l = sysread(F, $buf, 4096, length($buf));
+ die("$path: read error\n") unless $l;
+ }
+ close F;
+ return (substr($buf, 0, 96), substr($buf, 96, $hlen - 96), substr($buf, $hlen, $hlen2 - $hlen), $hdrmd5);
+}
+
+sub getnevr_rich {
+ my ($d) = @_;
+ my $n = '';
+ my $bl = 0;
+ while ($d =~ /^([^ ,\(\)]*)/) {
+ $n .= $1;
+ $d = substr($d, length($1));
+ last unless $d =~ /^([\(\)])/;
+ $bl += $1 eq '(' ? 1 : -1;
+ last if $bl < 0;
+ $n .= $1;
+ $d = substr($d, 1);
+ }
+ return $n;
+}
+
+my %richops = (
+ 'and' => 1,
+ 'or' => 2,
+ 'if' => 3,
+ 'unless' => 4,
+ 'else' => 5,
+ 'with' => 6,
+ 'without' => 7,
+);
+
+sub parse_rich_rec {
+ my ($dep, $chainop) = @_;
+ my $d = $dep;
+ $chainop ||= 0;
+ return ($d, undef) unless $d =~ s/^\(\s*//;
+ my ($r, $r2);
+ if ($d =~ /^\(/) {
+ ($d, $r) = parse_rich_rec($d);
+ return ($d, undef) unless $r;
+ } else {
+ return ($d, undef) if $d =~ /^\)/;
+ my $n = getnevr_rich($d);
+ $d = substr($d, length($n));
+ $d =~ s/^ +//;
+ if ($d =~ /^([<=>]+)/) {
+ $n .= " $1 ";
+ $d =~ s/^[<=>]+ +//;
+ my $evr = getnevr_rich($d);
+ $d = substr($d, length($evr));
+ $n .= $evr;
+ }
+ $r = [0, $n];
+ }
+ $d =~ s/^\s+//;
+ return ($d, undef) unless $d ne '';
+ return ($d, $r) if $d =~ s/^\)//;
+ return ($d, undef) unless $d =~ s/([a-z]+)\s+//;
+ my $op = $richops {$1};
+ return ($d, undef) unless $op;
+ return ($d, undef) if $op == 5 && $chainop != 3 && $chainop != 4;
+ $chainop = 0 if $op == 5;
+ return ($d, undef) if $chainop && (($chainop != 1 && $chainop != 2 && $chainop != 6) || $op != $chainop);
+ ($d, $r2) = parse_rich_rec("($d", $op);
+ return ($d, undef) unless $r2;
+ if (($op == 3 || $op == 4) && $r2->[0] == 5) {
+ $r = [$op, $r, $r2->[1], $r2->[2]];
+ } else {
+ $r = [$op, $r, $r2];
+ }
+ return ($d, $r);
+}
+
+sub parse_rich_dep {
+ my ($dep) = @_;
+ my ($d, $r) = parse_rich_rec($dep);
+ return undef if !$r || $d ne '';
+ return $r;
+}
+
+my @testcaseops = ('', '&', '|', '<IF>', '<UNLESS>', '<ELSE>', '+', '-');
+
+sub testcaseformat_rec {
+ my ($r, $addparens) = @_;
+ my $op = $r->[0];
+ return $r->[1] unless $op;
+ my $top = $testcaseops[$op];
+ my $r1 = testcaseformat_rec($r->[1], 1);
+ if (($op == 3 || $op == 4) && @$r == 4) {
+ $r1 = "$r1 $top " . testcaseformat_rec($r->[2], 1);
+ $top = '<ELSE>';
+ }
+ my $addparens2 = 1;
+ $addparens2 = 0 if $r->[2]->[0] == $op && ($op == 1 || $op == 2 || $op == 6);
+ my $r2 = testcaseformat_rec($r->[-1], $addparens2);
+ return $addparens ? "($r1 $top $r2)" : "$r1 $top $r2";
+}
+
+sub testcaseformat {
+ my ($dep) = @_;
+ my $r = parse_rich_dep($dep);
+ return $dep unless $r;
+ return testcaseformat_rec($r);
+}
+
+sub shiftrich {
+ my ($s) = @_;
+ # FIXME: do this right!
+ my $dep = shift @$s;
+ while (@$s && ($dep =~ y/\(/\(/) > ($dep =~ y/\)/\)/)) {
+ $dep .= ' ' . shift(@$s);
+ }
+ return $dep;
+}
+
+1;
diff --git a/Build/Rpmmd.pm b/Build/Rpmmd.pm
new file mode 100644
index 0000000..563b7ec
--- /dev/null
+++ b/Build/Rpmmd.pm
@@ -0,0 +1,221 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Rpmmd;
+
+use strict;
+
+use Build::Rpm;
+
+use XML::Parser;
+
+sub generic_parse {
+ my ($how, $in, $res, %options) = @_;
+ $res ||= [];
+ my @cursor = ([undef, $how, undef, $res, undef, \%options]);
+ my $p = new XML::Parser(Handlers => {
+ Start => sub {
+ my ($p, $el) = @_;
+ my $h = $cursor[-1]->[1];
+ return unless exists $h->{$el};
+ $h = $h->{$el};
+ push @cursor, [$el, $h];
+ $cursor[-1]->[2] = '' if $h->{'_text'};
+ $h->{'_start'}->($h, \@cursor, @_) if exists $h->{'_start'};
+ },
+ End => sub {
+ my ($p, $el) = @_;
+ if ($cursor[-1]->[0] eq $el) {
+ my $h = $cursor[-1]->[1];
+ $h->{'_end'}->($h, \@cursor, @_) if exists $h->{'_end'};
+ pop @cursor;
+ }
+ },
+ Char => sub {
+ my ($p, $text) = @_;
+ $cursor[-1]->[2] .= $text if defined $cursor[-1]->[2];
+ },
+ }, ErrorContext => 2);
+ if (ref($in)) {
+ $p->parse($in);
+ } else {
+ $p->parsefile($in);
+ }
+ return $res;
+}
+
+sub generic_store_text {
+ my ($h, $c, $p, $el) = @_;
+ my $data = $c->[0]->[4];
+ $data->{$h->{'_tag'}} = $c->[-1]->[2] if defined $c->[-1]->[2];
+}
+
+sub generic_store_attr {
+ my ($h, $c, $p, $el, %attr) = @_;
+ my $data = $c->[0]->[4];
+ $data->{$h->{'_tag'}} = $attr{$h->{'_attr'}} if defined $attr{$h->{'_attr'}};
+}
+
+sub generic_new_data {
+ my ($h, $c, $p, $el, %attr) = @_;
+ $c->[0]->[4] = {};
+ generic_store_attr(@_) if $h->{'_attr'};
+}
+
+sub generic_add_result {
+ my ($h, $c, $p, $el) = @_;
+ my $data = $c->[0]->[4];
+ return unless $data;
+ my $res = $c->[0]->[3];
+ if (ref($res) eq 'CODE') {
+ $res->($data);
+ } else {
+ push @$res, $data;
+ }
+ undef $c->[0]->[4];
+}
+
+my $repomdparser = {
+ repomd => {
+ data => {
+ _start => \&generic_new_data,
+ _attr => 'type',
+ _tag => 'type',
+ _end => \&generic_add_result,
+ location => { _start => \&generic_store_attr, _attr => 'href', _tag => 'location'},
+ checksum => { _start => \&generic_store_attr, _attr => 'type', _tag => 'checksum', _text => 1, _end => \&primary_handle_checksum },
+ size => { _text => 1, _end => \&generic_store_text, _tag => 'size'},
+ },
+ },
+};
+
+my $primaryparser = {
+ metadata => {
+ 'package' => {
+ _start => \&generic_new_data,
+ _attr => 'type',
+ _tag => 'type',
+ _end => \&primary_add_result,
+ name => { _text => 1, _end => \&generic_store_text, _tag => 'name' },
+ arch => { _text => 1, _end => \&generic_store_text, _tag => 'arch' },
+ version => { _start => \&primary_handle_version },
+ checksum => { _start => \&generic_store_attr, _attr => 'type', _tag => 'checksum', _text => 1, _end => \&primary_handle_checksum },
+ 'time' => { _start => \&primary_handle_time },
+ format => {
+ 'rpm:provides' => { 'rpm:entry' => { _start => \&primary_handle_dep , _tag => 'provides' }, },
+ 'rpm:requires' => { 'rpm:entry' => { _start => \&primary_handle_dep , _tag => 'requires' }, },
+ 'rpm:conflicts' => { 'rpm:entry' => { _start => \&primary_handle_dep , _tag => 'conflicts' }, },
+ 'rpm:recommends' => { 'rpm:entry' => { _start => \&primary_handle_dep , _tag => 'recommends' }, },
+ 'rpm:suggests' => { 'rpm:entry' => { _start => \&primary_handle_dep , _tag => 'suggests' }, },
+ 'rpm:supplements' => { 'rpm:entry' => { _start => \&primary_handle_dep , _tag => 'supplements' }, },
+ 'rpm:enhances' => { 'rpm:entry' => { _start => \&primary_handle_dep , _tag => 'enhances' }, },
+ 'rpm:obsoletes' => { 'rpm:entry' => { _start => \&primary_handle_dep , _tag => 'obsoletes' }, },
+ 'rpm:buildhost' => { _text => 1, _end => \&generic_store_text, _tag => 'buildhost' },
+ 'rpm:sourcerpm' => { _text => 1, _end => \&primary_handle_sourcerpm , _tag => 'source' },
+### currently commented out, as we ignore file provides in expanddeps
+# file => { _text => 1, _end => \&primary_handle_file_end, _tag => 'provides' },
+ },
+ location => { _start => \&generic_store_attr, _attr => 'href', _tag => 'location'},
+ },
+ },
+};
+
+sub primary_handle_sourcerpm {
+ my ($h, $c, $p, $el, %attr) = @_;
+ my $data = $c->[0]->[4];
+ return unless defined $c->[-1]->[2];
+ $c->[-1]->[2] =~ s/-[^-]*-[^-]*\.[^\.]*\.rpm$//;
+ $data->{$h->{'_tag'}} = $c->[-1]->[2];
+}
+
+sub primary_handle_version {
+ my ($h, $c, $p, $el, %attr) = @_;
+ my $data = $c->[0]->[4];
+ $data->{'epoch'} = $attr{'epoch'} if $attr{'epoch'};
+ $data->{'version'} = $attr{'ver'};
+ $data->{'release'} = $attr{'rel'};
+}
+
+sub primary_handle_time {
+ my ($h, $c, $p, $el, %attr) = @_;
+ my $data = $c->[0]->[4];
+ $data->{'filetime'} = $attr{'file'} if $attr{'file'};
+ $data->{'buildtime'} = $attr{'build'} if $attr{'build'};
+}
+
+sub primary_handle_checksum {
+ my ($h, $c, $p, $el) = @_;
+ my $data = $c->[0]->[4];
+ my $type = lc(delete($data->{$h->{'_tag'}}) || '');
+ $type = 'sha1' if $type eq 'sha';
+ if ($type eq 'md5' || $type eq 'sha1' || $type eq 'sha256' || $type eq 'sha512') {
+ $data->{$h->{'_tag'}} = "$type:$c->[-1]->[2]" if defined $c->[-1]->[2];
+ }
+}
+
+sub primary_handle_file_end {
+ my ($h, $c, $p, $el) = @_;
+ primary_handle_dep($h, $c, $p, $el, 'name', $c->[-1]->[2]);
+}
+
+my %flagmap = ( EQ => '=', LE => '<=', GE => '>=', GT => '>', LT => '<', NE => '!=' );
+
+sub primary_handle_dep {
+ my ($h, $c, $p, $el, %attr) = @_;
+ my $dep = $attr{'name'};
+ return if $dep =~ /^rpmlib\(/;
+ if(exists $attr{'flags'}) {
+ my $evr = $attr{'ver'};
+ return unless defined($evr) && exists($flagmap{$attr{'flags'}});
+ $evr = "$attr{'epoch'}:$evr" if $attr{'epoch'};
+ $evr .= "-$attr{'rel'}" if defined $attr{'rel'};
+ $dep .= " $flagmap{$attr{'flags'}} $evr";
+ }
+ $dep = Build::Rpm::testcaseformat($dep) if ($dep =~ /^\(/) && ($c->[0]->[5] || {})->{'testcaseformat'};
+ my $data = $c->[0]->[4];
+ push @{$data->{$h->{'_tag'}}}, $dep;
+}
+
+sub primary_add_result {
+ my ($h, $c, $p, $el) = @_;
+ my $options = $c->[0]->[5] || {};
+ my $data = $c->[0]->[4];
+ if ($options->{'addselfprovides'} && defined($data->{'name'}) && defined($data->{'version'})) {
+ if (($data->{'arch'} || '') ne 'src' && ($data->{'arch'} || '') ne 'nosrc') {
+ my $evr = $data->{'version'};
+ $evr = "$data->{'epoch'}:$evr" if $data->{'epoch'};
+ $evr = "$evr-$data->{'release'}" if defined $data->{'release'};
+ my $s = "$data->{'name'} = $evr";
+ push @{$data->{'provides'}}, $s unless grep {$_ eq $s} @{$data->{'provides'} || []};
+ }
+ }
+ delete $data->{'checksum'} unless $options->{'withchecksum'};
+ return generic_add_result(@_);
+}
+
+sub parse_repomd {
+ return generic_parse($repomdparser, @_);
+}
+
+sub parse {
+ return generic_parse($primaryparser, @_);
+}
+
+1;
diff --git a/Build/SimpleXML.pm b/Build/SimpleXML.pm
new file mode 100644
index 0000000..5df859b
--- /dev/null
+++ b/Build/SimpleXML.pm
@@ -0,0 +1,165 @@
+################################################################
+#
+# Copyright (c) 1995-2016 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::SimpleXML;
+
+use strict;
+
+# very simple xml parser, just good enough to parse kiwi and _service files...
+# can't use standard XML parsers, unfortunatelly, as the build script
+# must not rely on external libraries
+#
+sub parse {
+ my ($xml, %opts) = @_;
+
+ my $record = $opts{'record'};
+ my $order = $opts{'order'};
+ my @nodestack;
+ my $node = {};
+ my $c = '';
+ my $xmllen = length($xml);
+ $xml =~ s/^\s*\<\?.*?\?\>//s;
+ while ($xml =~ /^(.*?)\</s) {
+ if ($1 ne '') {
+ $c .= $1;
+ $xml = substr($xml, length($1));
+ }
+ if (substr($xml, 0, 4) eq '<!--') {
+ die("bad xml, missing end of comment\n") unless $xml =~ s/.*?-->//s;
+ next;
+ }
+ my $elstart = length($xml);
+ die("bad xml\n") unless $xml =~ /(.*?\>)/s;
+ my $tag = $1;
+ $xml = substr($xml, length($tag));
+ my $mode = 0;
+ if ($tag =~ s/^\<\///s) {
+ chop $tag;
+ $mode = 1; # end
+ } elsif ($tag =~ s/\/\>$//s) {
+ $mode = 2; # start & end
+ $tag = substr($tag, 1);
+ } else {
+ $tag = substr($tag, 1);
+ chop $tag;
+ }
+ my @tag = split(/(=(?:\"[^\"]*\"|\'[^\']*\'|[^\"\s]*))?\s+/, "$tag ");
+ $tag = shift @tag;
+ shift @tag;
+ push @tag, undef if @tag & 1;
+ my %atts = @tag;
+ for (values %atts) {
+ next unless defined $_;
+ s/^=\"([^\"]*)\"$/=$1/s or s/^=\'([^\']*)\'$/=$1/s;
+ s/^=//s;
+ s/&lt;/</g;
+ s/&gt;/>/g;
+ s/&amp;/&/g;
+ s/&apos;/\'/g;
+ s/&quot;/\"/g;
+ }
+ if ($mode == 0 || $mode == 2) {
+ my $n = {};
+ if ($record) {
+ $n->{'_start'} = $xmllen - $elstart;
+ $n->{'_end'} = $xmllen - length($xml) if $mode == 2;
+ }
+ if ($order) {
+ push @{$node->{'_order'}}, $tag;
+ push @{$n->{'_order'}}, (splice(@tag, 0, 2))[0] while @tag;
+ }
+ push @{$node->{$tag}}, $n;
+ $n->{$_} = $atts{$_} for sort keys %atts;
+ if ($mode == 0) {
+ push @nodestack, [ $tag, $node, $c ];
+ $c = '';
+ $node = $n;
+ }
+ } else {
+ die("element '$tag' closes without open\n") unless @nodestack;
+ die("element '$tag' closes, but I expected '$nodestack[-1]->[0]'\n") unless $nodestack[-1]->[0] eq $tag;
+ $c =~ s/^\s*//s;
+ $c =~ s/\s*$//s;
+ $node->{'_content'} = $c if $c ne '';
+ $node->{'_end'} = $xmllen - length($xml) if $record;
+ $node = $nodestack[-1]->[1];
+ $c = $nodestack[-1]->[2];
+ pop @nodestack;
+ }
+ }
+ $c .= $xml;
+ $c =~ s/^\s*//s;
+ $c =~ s/\s*$//s;
+ $node->{'_content'} = $c if $c ne '';
+ return $node;
+}
+
+sub unparse_keys {
+ my ($d) = @_;
+ my @k = grep {$_ ne '_start' && $_ ne '_end' && $_ ne '_order' && $_ ne '_content'} sort keys %$d;
+ return @k unless $d->{'_order'};
+ my %k = map {$_ => 1} @k;
+ my @ko;
+ for (@{$d->{'_order'}}) {
+ push @ko, $_ if delete $k{$_};
+ }
+ return (@ko, grep {$k{$_}} @k);
+}
+
+sub unparse_escape {
+ my ($d) = @_;
+ $d =~ s/&/&amp;/sg;
+ $d =~ s/</&lt;/sg;
+ $d =~ s/>/&gt;/sg;
+ $d =~ s/"/&quot;/sg;
+ return $d;
+}
+
+sub unparse {
+ my ($d, %opts) = @_;
+
+ my $r = '';
+ my $indent = $opts{'ugly'} ? '' : $opts{'indent'} || '';
+ my $nl = $opts{'ugly'} ? '' : "\n";
+ my @k = unparse_keys($d);
+ my @e = grep {ref($d->{$_}) ne ''} @k;
+ for my $e (@e) {
+ my $en = unparse_escape($e);
+ my $de = $d->{$e};
+ $de = [ $de ] unless ref($de) eq 'ARRAY';
+ for my $se (@$de) {
+ my @sk = unparse_keys($se);
+ my @sa = grep {ref($se->{$_}) eq ''} @sk;
+ my @se = grep {ref($se->{$_}) ne ''} @sk;
+ $r .= "$indent<$en";
+ for my $sa (@sa) {
+ $r .= " ".unparse_escape($sa);
+ $r .= '="'.unparse_escape($se->{$sa}).'"' if defined $se->{$sa};
+ }
+ $r .= ">";
+ $r .= unparse_escape($se->{'_content'}) if defined $se->{'_content'};
+ $r .= $nl . unparse($se, %opts, 'indent' => " $indent") . "$indent" if @se;
+ $r .= "</$en>$nl";
+ }
+ }
+ return $r;
+}
+
+1;
diff --git a/Build/Snapcraft.pm b/Build/Snapcraft.pm
new file mode 100644
index 0000000..6c5ae4d
--- /dev/null
+++ b/Build/Snapcraft.pm
@@ -0,0 +1,84 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Snapcraft;
+
+use strict;
+use Build::Deb;
+
+eval { require YAML::XS; };
+*YAML::XS::LoadFile = sub {die("YAML::XS is not available\n")} unless defined &YAML::XS::LoadFile;
+
+sub parse {
+ my ($cf, $fn) = @_;
+
+ my $yaml;
+ eval {$yaml = YAML::XS::LoadFile($fn);};
+ return {'error' => "Failed to parse yaml file"} unless $yaml;
+
+ my $ret = {};
+ $ret->{'name'} = $yaml->{'name'};
+ $ret->{'version'} = $yaml->{'version'};
+ $ret->{'epoch'} = $yaml->{'epoch'} if $yaml->{'epoch'};
+
+ # how should we report the built apps?
+ my @packdeps;
+ for my $p (@{$yaml->{'stage-packages'} || []}) {
+ push @packdeps, $p;
+ }
+ for my $p (@{$yaml->{'build-packages'} || []}) {
+ push @packdeps, $p;
+ }
+ for my $p (@{$yaml->{'after'} || []}) {
+ push @packdeps, "snapcraft-part:$p";
+ }
+
+ for my $key (sort keys(%{$yaml->{'parts'} || {}})) {
+ my $part = $yaml->{'parts'}->{$key};
+ push @packdeps, "snapcraft-plugin:$part->{plugin}" if defined $part->{plugin};
+ for my $p (@{$part->{'stage-packages'} || []}) {
+ push @packdeps, $p;
+ }
+ for my $p (@{$part->{'build-packages'} || []}) {
+ push @packdeps, $p;
+ }
+ for my $p (@{$part->{'after'} || []}) {
+ next if $yaml->{'parts'}->{$p};
+ push @packdeps, "build-snapcraft-part-$p";
+ }
+ }
+
+ my %exclarchs;
+ for my $arch (@{$yaml->{architectures} || []}) {
+ my @obsarchs = Build::Deb::obsarch($arch);
+ push @obsarchs, $arch unless @obsarchs;
+ $exclarchs{$_} = 1 for @obsarchs;
+ }
+
+ $ret->{'exclarch'} = [ sort keys %exclarchs ] if %exclarchs;
+# $ret->{'badarch'} = $badarch if defined $badarch;
+ $ret->{'deps'} = \@packdeps;
+# $ret->{'prereqs'} = \@prereqs if @prereqs;
+# $ret->{'configdependent'} = 1 if $ifdeps;
+
+ return $ret;
+}
+
+1;
diff --git a/Build/Susetags.pm b/Build/Susetags.pm
new file mode 100644
index 0000000..086d29e
--- /dev/null
+++ b/Build/Susetags.pm
@@ -0,0 +1,139 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Susetags;
+
+use strict;
+
+use Build::Rpm;
+
+# compatibility to old OBS code
+sub parse_obs_compat {
+ my ($file, undef, undef, @arches) = @_;
+ $file = "$file.gz" if ! -e $file && -e "$file.gz";
+ my $pkgs = {};
+ parse($file, sub {
+ my ($data) = @_;
+ my $medium = delete($data->{'medium'});
+ my $loc = delete($data->{'location'});
+ if (defined($medium) && defined($loc)) {
+ $loc =~ s/^\Q$data->{'arch'}\E\///;
+ $data->{'path'} = "$medium $loc";
+ }
+ return unless !@arches || grep { /$data->{'arch'}/ } @arches;
+ $pkgs->{"$data->{'name'}-$data->{'version'}-$data->{'release'}-$data->{'arch'}"} = $data;
+ }, 'addselfprovides' => 1);
+ return $pkgs;
+}
+
+my %tmap = (
+ 'Pkg' => '',
+ 'Loc' => 'location',
+ 'Src' => 'source',
+ 'Prv' => 'provides',
+ 'Req' => 'requires',
+ 'Con' => 'conflicts',
+ 'Obs' => 'obsoletes',
+ 'Rec' => 'recommends',
+ 'Sug' => 'suggests',
+ 'Sup' => 'supplements',
+ 'Enh' => 'enhances',
+ 'Tim' => 'buildtime',
+ 'Cks' => 'checksum',
+);
+
+sub addpkg {
+ my ($res, $data, $options) = @_;
+ # fixup location and source
+ if (exists($data->{'location'})) {
+ my ($medium, $dir, $loc) = split(' ', $data->{'location'}, 3);
+ $data->{'medium'} = $medium;
+ $data->{'location'} = defined($loc) ? "$dir/$loc" : "$data->{'arch'}/$dir";
+ }
+ $data->{'source'} =~ s/\s.*// if exists $data->{'source'};
+ if ($options->{'addselfprovides'} && defined($data->{'name'}) && defined($data->{'version'})) {
+ if (($data->{'arch'} || '') ne 'src' && ($data->{'arch'} || '') ne 'nosrc') {
+ my $evr = $data->{'version'};
+ $evr = "$data->{'epoch'}:$evr" if $data->{'epoch'};
+ $evr = "$evr-$data->{'release'}" if defined $data->{'release'};
+ my $s = "$data->{'name'} = $evr";
+ push @{$data->{'provides'}}, $s unless grep {$_ eq $s} @{$data->{'provides'} || []};
+ }
+ }
+ if ($options->{'withchecksum'} && $data->{'checksum'}) {
+ my ($ctype, $csum) = split(' ', delete($data->{'checksum'}));
+ $ctype = lc($ctype || '');
+ $data->{'checksum'} = "$ctype:$csum" if $csum && ($ctype eq 'md5' || $ctype eq 'sha1' || $ctype eq 'sha256' || $ctype eq 'sha512');
+ }
+ if (ref($res) eq 'CODE') {
+ $res->($data);
+ } else {
+ push @$res, $data;
+ }
+}
+
+sub parse {
+ return parse_obs_compat(@_) if @_ > 2 && !defined $_[2];
+ my ($in, $res, %options) = @_;
+ $res ||= [];
+ my $fd;
+ if (ref($in)) {
+ $fd = $in;
+ } else {
+ if ($in =~ /\.gz$/) {
+ open($fd, '-|', "gzip", "-dc", $in) || die("$in: $!\n");
+ } else {
+ open($fd, '<', $in) || die("$in: $!\n");
+ }
+ }
+ my $cur;
+ my @tmap = sort keys %tmap;
+ @tmap = grep {$_ ne 'Cks'} @tmap unless $options{'withchecksum'};
+ my $r = join('|', @tmap);
+ $r = qr/^([\+=])($r):\s*(.*)/;
+ while (<$fd>) {
+ chomp;
+ next unless /$r/;
+ my ($multi, $tag, $data) = ($1, $2, $3);
+ if ($multi eq '+') {
+ while (<$fd>) {
+ chomp;
+ last if /^-\Q$tag\E/;
+ next if $tag eq 'Req' && /^rpmlib\(/;
+ $_ = Build::Rpm::testcaseformat($_) if /^\(/ && $options{'testcaseformat'};
+ push @{$cur->{$tmap{$tag}}}, $_;
+ }
+ } elsif ($tag eq 'Pkg') {
+ addpkg($res, $cur, \%options) if $cur;
+ $cur = {};
+ ($cur->{'name'}, $cur->{'version'}, $cur->{'release'}, $cur->{'arch'}) = split(' ', $data);
+ $cur->{'epoch'} = $1 if $cur->{'version'} =~ s/^(\d+)://;
+ } else {
+ $cur->{$tmap{$tag}} = $data;
+ }
+ }
+ addpkg($res, $cur, \%options) if $cur;
+ if (!ref($in)) {
+ close($fd) || die("close $in: $!\n");
+ }
+ return $res;
+}
+
+1;
diff --git a/Build/Zypp.pm b/Build/Zypp.pm
new file mode 100644
index 0000000..8ec554b
--- /dev/null
+++ b/Build/Zypp.pm
@@ -0,0 +1,94 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+package Build::Zypp;
+
+use strict;
+
+our $root = '';
+
+sub parsecfg {
+ my ($repocfg, $reponame, $allrepos) = @_;
+
+ local *REPO;
+ open(REPO, '<', "$root/etc/zypp/repos.d/$repocfg") or return undef;
+ my $name;
+ my $repo = {};
+ while (<REPO>) {
+ chomp;
+ next if /^\s*#/;
+ s/\s+$//;
+ if (/^\[(.+)\]/) {
+ if ($allrepos && defined($name)) {
+ $repo->{'description'} = $repo->{'name'} if defined $repo->{'name'};
+ $repo->{'name'} = $name;
+ push @$allrepos, $repo;
+ undef $name;
+ $repo = {};
+ }
+ last if defined $name;
+ $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 defined $name;
+ $repo->{'description'} = $repo->{'name'} if defined $repo->{'name'};
+ $repo->{'name'} = $name;
+ push @$allrepos, $repo if $allrepos;
+ return $repo;
+}
+
+sub repofiles {
+ local *D;
+ return () unless opendir(D, "/etc/zypp/repos.d");
+ my @r = grep {!/^\./ && /.repo$/} readdir(D);
+ closedir D;
+ return sort(@r);
+}
+
+sub parseallrepos {
+ my @r;
+ for my $r (repofiles()) {
+ parsecfg($r, undef, \@r);
+ }
+ return @r;
+}
+
+sub parserepo($) {
+ my ($reponame) = @_;
+ # first try matching .repo file
+ if (-e "$root/etc/zypp/repos.d/$reponame.repo") {
+ my $repo = parsecfg("$reponame.repo", $reponame);
+ return $repo if $repo;
+ }
+ # then try all repo files
+ for my $r (repofiles()) {
+ my $repo = parsecfg($r, $reponame);
+ return $repo if $repo;
+ }
+ die("could not find repo '$reponame'\n");
+}
+
+1;
+
+# vim: sw=2
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..c6b1bb9
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program 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.
+
+ This program 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 this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/HOWTO.add_another_format b/HOWTO.add_another_format
new file mode 100644
index 0000000..5222553
--- /dev/null
+++ b/HOWTO.add_another_format
@@ -0,0 +1,99 @@
+
+How to add another build format
+===============================
+
+To support yet another package format to be used with standalone build
+script and Open Build Service you need to follow these steps:
+
+Let's call the new format "XYZ" here.
+
+General notes about the implementations. There are two areas:
+
+SAFE implementations:
+ Some code runs outside of protected environments like KVM. Therefore
+this code must be implemented with security in mind. Special crafted
+build descriptions or binary files must not be able to exploit this code.
+What makes it even more interessting is that this code can also run
+on all kind of old or obscure systems. So any external dependency should
+be avoided as well.
+This means in short:
+ - code must be as simple as possible.
+ - code must not allow to execute random commands or to access random files.
+ - avoid external dependencies. When you look for a simple XML parser
+ check the kiwi support for this.
+ - code must stay compatible for all versions
+
+Build code running inside of environment.
+ - using any tool is fine here. However, the tool must be installed
+ somehow into the build system. In best case via some dependency.
+ - Incompatible changes can be implemented inside of these packages
+ pulled into the build environment.
+ - external network access is not possible here.
+
+
+1) Implement the parse() function into Build/XYZ.pm
+
+ parse() extracts the build dependecies from the build specification.
+ For RPM this would be the <package>.spec file for example.
+
+ Must be a SAFE implementation.
+
+2) Add a query() function to Build/XYZ.pm
+
+ query() extracts information from built packages. In the rpm world
+ these are the .rpm files.
+ query returns a hash containing:
+ name, epoch, version, release, arch, description,
+ provides, requires, hdrmd5
+
+ hdrmd5 is some unique identifier of the package built, it might be
+ just a md5 over the entire file.
+
+ Must be a SAFE implementation.
+
+3) Add a queryhdrmd5() function
+
+ this functions is a specialized version of query(), it just returns
+ the hdrmd5
+
+ Must be a SAFE implementation.
+
+4) Add a verscmp() function
+
+ verscmp() compares two package version strings. For rpms, a version has
+ the form [epoch:]version-release
+
+ Must be a SAFE implementation.
+
+5) Implement build-pkg-xyz functions
+
+ Those functions are used to setup the build environment. I.e. they
+ need to install/unpack the packages
+
+ Must be a SAFE implementation for the pre-installation part. Afterwards
+ it is fine to use any tool to install the packages (like rpm itself).
+
+6) Implement build-recipe-xyz functions
+
+ This functions are called to create the build result
+
+7) For standalone build support (actually not needed for OBS integration, but
+ it makes development easier) we need a "createxyzdeps" helper script.
+ For xyz://<...> repos it needs to download the repository metadata
+ and convert it to build's representation. See createyastdeps and createrepomddeps.
+
+
+Special notes for non-OSS systems
+=================================
+
+Systems like MS-Windows, MacOSX or SunOS could be support as well. However, these
+systems can not be installed by packages from scratch. So using preinstallimages
+would be mandatory here. Support for that exists in general already inside of
+the code.
+
+Special notes for image formats
+===============================
+
+Image formats can usually skip 2) 3) and 4) from the items above. At least as long
+as they do not want to build new images based on former created ones.
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..3d0c608
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,123 @@
+VERSION=0.1
+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 -c '. common_functions ; build_host_arch; echo $$BUILD_INITVM_ARCH')
+
+ifeq ($(SCM),svn)
+SVNVER=_SVN$(shell LANG=C svnversion .)
+endif
+
+prefix=/usr
+bindir=$(prefix)/bin
+datadir=$(prefix)/share
+libdir=$(prefix)/lib
+pkglibdir=$(libdir)/$(BUILD)
+mandir=$(datadir)/man
+man1dir=$(mandir)/man1
+sysconfdir=/etc
+DESTDIR=
+
+all:
+
+.PHONY: test
+
+test:
+ PERL5LIB=. prove -v
+
+install:
+ install -m755 -d \
+ $(DESTDIR)$(pkglibdir)/configs \
+ $(DESTDIR)$(pkglibdir)/baselibs_configs \
+ $(DESTDIR)$(pkglibdir)/Build \
+ $(DESTDIR)$(pkglibdir)/emulator \
+ $(DESTDIR)$(bindir) \
+ $(DESTDIR)$(man1dir)
+ install -m755 \
+ build \
+ vc \
+ createdirdeps \
+ order \
+ expanddeps \
+ computeblocklists \
+ extractbuild \
+ getbinaryid \
+ getbuildids \
+ killchroot \
+ queryconfig \
+ common_functions \
+ init_buildsystem \
+ substitutedeps \
+ debtransform \
+ debtransformbz2 \
+ debtransformxz \
+ debtransformzip \
+ mkbaselibs \
+ mkdrpms \
+ listinstalled \
+ createzyppdeps \
+ createarchdeps \
+ createdebdeps \
+ createrepomddeps \
+ createyastdeps \
+ changelog2spec \
+ spec2changelog \
+ download \
+ runservices \
+ spec_add_patch \
+ spectool \
+ signdummy \
+ unrpm \
+ telnet_login_wrapper \
+ build-validate-params \
+ openstack-console \
+ startdockerd \
+ dummyhttpserver \
+ obs-docker-support \
+ $(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 lxc.conf $(DESTDIR)$(pkglibdir)
+ install -m644 configs/* $(DESTDIR)$(pkglibdir)/configs
+ install -m644 baselibs_configs/* $(DESTDIR)$(pkglibdir)/baselibs_configs
+ install -m644 build.1 $(DESTDIR)$(man1dir)
+ install -m644 vc.1 $(DESTDIR)$(man1dir)
+ install -m644 unrpm.1 $(DESTDIR)$(man1dir)
+ ln -sf $(pkglibdir)/build $(DESTDIR)$(bindir)/build
+ ln -sf $(pkglibdir)/vc $(DESTDIR)$(bindir)/buildvc
+ ln -sf $(pkglibdir)/unrpm $(DESTDIR)$(bindir)/unrpm
+ ln -s baselibs_configs/baselibs_global.conf $(DESTDIR)$(pkglibdir)/baselibs_global.conf
+ ln -s baselibs_configs/baselibs_global-deb.conf $(DESTDIR)$(pkglibdir)/baselibs_global-deb.conf
+
+# Allow initvm to be packaged seperately from the rest of build. This
+# is useful because it is distributed as a static binary package (e.g.
+# build-initvm-static) whereas the build scripts package is noarch.
+
+initvm: initvm.c
+ $(CC) -o $@.$(INITVM_ARCH) -static $(CFLAGS) initvm.c
+
+initvm-all: initvm
+
+initvm-build: initvm
+
+initvm-install: initvm
+ install -m755 -d $(DESTDIR)$(pkglibdir)
+ install -m755 initvm.$(INITVM_ARCH) $(DESTDIR)$(pkglibdir)/initvm.$(INITVM_ARCH)
+
+
+dist:
+ifeq ($(SCM),svn)
+ rm -rf $(BUILD)-$(VERSION)$(SVNVER)
+ svn export . $(BUILD)-$(VERSION)$(SVNVER)
+ tar --force-local -cjf $(BUILD)-$(VERSION)$(SVNVER).tar.bz2 $(BUILD)-$(VERSION)$(SVNVER)
+ rm -rf $(BUILD)-$(VERSION)$(SVNVER)
+else
+ifeq ($(SCM),git)
+ git archive --prefix=$(BUILD)-$(VERSION)_git$(DATE)/ HEAD| bzip2 > $(BUILD)-$(VERSION)_git$(DATE).tar.bz2
+endif
+endif
diff --git a/README b/README
new file mode 100644
index 0000000..b328e72
--- /dev/null
+++ b/README
@@ -0,0 +1,11 @@
+
+This is a tool to build binary packages in a safe and reproducible
+way. The default is to build in a chroot sandbox, but it also
+supports building in a virtual machine for better security.
+
+The build tool can work with multiple package and recipe formats.
+The currently supported package formats are deb, rpm, and arch.
+The supported recipe formats are spec, dsc, kiwi, and PKGBUILD.
+
+See the man page for more information.
+
diff --git a/baselibs_configs/baselibs_global-deb.conf b/baselibs_configs/baselibs_global-deb.conf
new file mode 100644
index 0000000..bbed7d0
--- /dev/null
+++ b/baselibs_configs/baselibs_global-deb.conf
@@ -0,0 +1,39 @@
+arch i586 targets x86_64:32bit ia64:x86
+arch i686 targets x86_64:32bit ia64:x86
+arch s390 targets s390x:32bit
+arch ppc targets ppc64:32bit
+arch ppc64 targets ppc:64bit
+
+configdir /usr/lib/baselibs-<targettype>/bin
+
+targettype x86 prefix /emul/ia32-linux
+
+targettype x86 extension -x86
+targettype 32bit extension 32
+targettype 64bit extension 64
+
+targetname <name>-<targettype>
+
++.*/lib(64)?/.*\.(so\..*|so|o|a|la)$
+
+targettype 64bit -^(/usr)?/lib/lib
+targettype 32bit -/lib64/
+targettype x86 -/lib64/
+
+config +.*bin.*-config$
+config -/kde-config$
+
+targettype x86 requires "ia32el"
+targettype x86 prereq "glibc-x86"
+
+package /.(?<!-devel)$/
+post #!/bin/sh
+#post "/sbin/ldconfig"
+
+package /(.*)-devel$/
+targettype x86 block!
+requires "<name> = <version>"
+#requires "<match1>-<targettype> = <version>"
+
+package /(.*)-debuginfo$/
++/usr/lib(64)?/debug/.*/lib(64)?/.*\.(so\..*|so|o|a|la)\.debug$
diff --git a/baselibs_configs/baselibs_global-sle11.conf b/baselibs_configs/baselibs_global-sle11.conf
new file mode 100644
index 0000000..96191bf
--- /dev/null
+++ b/baselibs_configs/baselibs_global-sle11.conf
@@ -0,0 +1,45 @@
+arch i586 targets x86_64:32bit ia64:x86
+arch i686 targets x86_64:32bit ia64:x86
+arch s390 targets s390x:32bit
+arch ppc targets ppc64:32bit
+arch ppc64 targets ppc:64bit
+arch sparc targets sparc64:32bit
+arch sparcv8 targets sparc64:32bit
+arch sparcv9 targets sparc64:32bit
+arch sparcv9v targets sparc64v:32bit
+arch sparc64 targets sparcv9:64bit
+arch sparc64v targets sparcv9v:64bit
+
+configdir /usr/lib/baselibs-<targettype>/bin
+
+targettype x86 prefix /emul/ia32-linux
+
+targettype x86 extension -x86
+targettype 32bit extension 32
+targettype 64bit extension 64
+
+targetname <name>-<targettype>
+
++.*/lib(64)?/.*\.(so.*|o|a|la)$
+
+targettype 64bit -^(/usr)?/lib/lib
+targettype 32bit -/lib64/
+targettype x86 -/lib64/
+
+config +.*bin.*-config$
+config -/kde-config$
+
+targettype x86 requires "ia32el"
+targettype x86 prereq "glibc-x86"
+
+package /.(?<!-devel)$/
+post "/sbin/ldconfig"
+
+package /(.*)-devel$/
+targettype x86 block!
+requires "<name> = <version>"
+requires "<match1>-<targettype> = <version>"
+
+package /(.*)-debuginfo$/
++/usr/lib(64)?/debug/.*/lib(64)?/.*\.(so.*|o|a|la)\.debug$
++/usr/lib(64)?/debug/.build-id/.*
diff --git a/baselibs_configs/baselibs_global-sle12.conf b/baselibs_configs/baselibs_global-sle12.conf
new file mode 100644
index 0000000..3bc500a
--- /dev/null
+++ b/baselibs_configs/baselibs_global-sle12.conf
@@ -0,0 +1,45 @@
+arch i586 targets x86_64:32bit
+arch i686 targets x86_64:32bit
+arch s390 targets s390x:32bit
+arch ppc targets ppc64:32bit
+arch ppc64 targets ppc:64bit
+arch sparc targets sparc64:32bit
+arch sparcv8 targets sparc64:32bit
+arch sparcv9 targets sparc64:32bit
+arch sparcv9v targets sparc64v:32bit
+arch sparc64 targets sparcv9:64bit
+arch sparc64v targets sparcv9v:64bit
+arch aarch64 targets aarch64_ilp32:64bit
+arch aarch64_ilp32 targets aarch64:32bit
+
+configdir /usr/lib/baselibs-<targettype>/bin
+
+targettype x86 prefix /emul/ia32-linux
+
+targettype x86 extension -x86
+targettype 32bit extension 32
+targettype 64bit extension 64
+
+targetname <name>-<targettype>
+
++.*/lib(64|ilp32)?/.*\.(so\..*|so|o|a|la)$
+
+targettype 64bit -^(/usr)?/lib(ilp32)?/lib
+targettype 32bit -/lib64/
+targettype x86 -/lib64/
+
+config +.*bin.*-config$
+config -/kde-config$
+
+targettype x86 requires "ia32el"
+targettype x86 prereq "glibc-x86"
+
+package /(.*-devel)$/
+requires "<match1> = <version>"
+
+package /.(?<!-devel)$/
+post "/sbin/ldconfig"
+
+package /(.*)-debuginfo$/
++/usr/lib(64|ilp32)?/debug/.*/lib(64|ilp32)?/.*\.(so\..*|so|o|a|la)\.debug$
++/usr/lib(64|ilp32)?/debug/.build-id/.*
diff --git a/baselibs_configs/baselibs_global-sle15.conf b/baselibs_configs/baselibs_global-sle15.conf
new file mode 100644
index 0000000..028fb61
--- /dev/null
+++ b/baselibs_configs/baselibs_global-sle15.conf
@@ -0,0 +1,46 @@
+arch i586 targets x86_64:32bit
+arch i686 targets x86_64:32bit
+arch s390 targets s390x:32bit
+arch ppc targets ppc64:32bit
+arch ppc64 targets ppc:64bit
+arch sparc targets sparc64:32bit
+arch sparcv8 targets sparc64:32bit
+arch sparcv9 targets sparc64:32bit
+arch sparcv9v targets sparc64v:32bit
+arch sparc64 targets sparcv9:64bit
+arch sparc64v targets sparcv9v:64bit
+arch aarch64 targets aarch64_ilp32:64bit
+arch aarch64_ilp32 targets aarch64:32bit
+
+configdir /usr/lib/baselibs-<targettype>/bin
+
+targettype x86 prefix /emul/ia32-linux
+
+targettype x86 extension -x86
+targettype 32bit extension 32
+targettype 64bit extension 64
+
+targetname <name>-<targettype>
+
++.*/lib(64|ilp32)?/.*\.(so\..*|so|o|a|la)$
+
+targettype 64bit -^(/usr)?/lib(ilp32)?/lib
+targettype 32bit -/lib64/
+targettype x86 -/lib64/
+
+config +.*bin.*-config$
+config -/kde-config$
+
+targettype x86 requires "ia32el"
+targettype x86 prereq "glibc-x86"
+
+package /(.*-devel)$/
+requires "<match1> = <version>"
+
+package /.(?<!-devel)$/
+post "/sbin/ldconfig"
+
+package /(.*)-debuginfo$/
+targetname <match1>-<targettype>-debuginfo
++/usr/lib(64|ilp32)?/debug/.*/lib(64|ilp32)?/.*\.(so\..*|so|o|a|la)\.debug$
++/usr/lib(64|ilp32)?/debug/.build-id/.*
diff --git a/baselibs_configs/baselibs_global.conf b/baselibs_configs/baselibs_global.conf
new file mode 100644
index 0000000..028fb61
--- /dev/null
+++ b/baselibs_configs/baselibs_global.conf
@@ -0,0 +1,46 @@
+arch i586 targets x86_64:32bit
+arch i686 targets x86_64:32bit
+arch s390 targets s390x:32bit
+arch ppc targets ppc64:32bit
+arch ppc64 targets ppc:64bit
+arch sparc targets sparc64:32bit
+arch sparcv8 targets sparc64:32bit
+arch sparcv9 targets sparc64:32bit
+arch sparcv9v targets sparc64v:32bit
+arch sparc64 targets sparcv9:64bit
+arch sparc64v targets sparcv9v:64bit
+arch aarch64 targets aarch64_ilp32:64bit
+arch aarch64_ilp32 targets aarch64:32bit
+
+configdir /usr/lib/baselibs-<targettype>/bin
+
+targettype x86 prefix /emul/ia32-linux
+
+targettype x86 extension -x86
+targettype 32bit extension 32
+targettype 64bit extension 64
+
+targetname <name>-<targettype>
+
++.*/lib(64|ilp32)?/.*\.(so\..*|so|o|a|la)$
+
+targettype 64bit -^(/usr)?/lib(ilp32)?/lib
+targettype 32bit -/lib64/
+targettype x86 -/lib64/
+
+config +.*bin.*-config$
+config -/kde-config$
+
+targettype x86 requires "ia32el"
+targettype x86 prereq "glibc-x86"
+
+package /(.*-devel)$/
+requires "<match1> = <version>"
+
+package /.(?<!-devel)$/
+post "/sbin/ldconfig"
+
+package /(.*)-debuginfo$/
+targetname <match1>-<targettype>-debuginfo
++/usr/lib(64|ilp32)?/debug/.*/lib(64|ilp32)?/.*\.(so\..*|so|o|a|la)\.debug$
++/usr/lib(64|ilp32)?/debug/.build-id/.*
diff --git a/build b/build
new file mode 100755
index 0000000..bb4973a
--- /dev/null
+++ b/build
@@ -0,0 +1,1522 @@
+#!/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 recipe file.
+#
+# BUILD_ROOT here the packages will be built
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+# some VMs do not allow to specify the init process...
+if test "$0" = /sbin/init ; then
+ exec /.build/build "$@"
+fi
+
+BUILD_CONF=/etc/build.conf
+
+# ignore BUILD_DIR if we have a config
+test -e "$BUILD_CONF" && BUILD_DIR=/usr/lib/build
+
+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"
+
+export BUILD_ARCH BUILD_HOST_ARCH BUILD_ROOT BUILD_RPMS BUILD_DIR BUILD_DEBUG
+export BUILD_DIST
+
+icecream=0
+definesnstuff=()
+repos=()
+old_packages=()
+
+# 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"
+
+# slurp in validation support
+. "$BUILD_DIR/build-validate-params"
+
+# need to restore build root owner for non-root builds
+browner=
+
+# Default uid:gid for the build user
+ABUILD_UID=399
+ABUILD_GID=399
+
+BUILD_OPTIONS_PARSED=
+DO_INIT=true
+DO_INIT_TOPDIR=true
+DO_LINT=
+DO_CHECKS=true
+CLEAN_BUILD=
+RECIPEFILES=()
+SRCDIR=
+BUILD_JOBS=
+BUILD_THREADS=
+ABUILD_TARGET=
+CREATE_BASELIBS=
+USEUSEDFORBUILD=
+LIST_STATE=
+
+RUNNING_IN_VM=
+RPMLIST=
+RELEASE=
+REASON=
+NOROOTFORBUILD=
+LOGFILE=
+KILL=
+DO_WIPE=
+SEND_SYSRQ=
+CHANGELOG=
+BUILD_DEBUG=
+INCARNATION=
+DISTURL=
+LINKSOURCES=
+OVERLAY=
+RSYNCSRC=
+RSYNCDEST=
+RSYNCDONE=
+SIGNDUMMY=
+DO_STATISTICS=
+RUN_SHELL=
+CCACHE=
+DLNOSIGNATURE=
+BUILD_FLAVOR=
+OBS_PACKAGE=
+CACHE_DIR=/var/cache/build
+
+RECIPE_BUILD_START_TIME=
+
+# This is for insserv
+export YAST_IS_RUNNING=instsys
+
+unset LANGUAGE
+unset LANG
+export LC_ALL=POSIX
+umask 022
+
+echo_help () {
+ cat << EOT
+
+Some comments for build
+-----------------------
+
+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.
+
+If you want to set the directory were the chroot system will be setup
+(at the moment it uses $BUILD_ROOT),
+simply set the the environment variable BUILD_ROOT.
+
+Example:
+
+ export BUILD_ROOT=/var/tmp/mybuildroot
+
+
+Normally build builds the complete package including src.rpm (rpmbuild -ba).
+If you want let build only make the binary package, simply set
+
+ export BUILD_RPM_BUILD_STAGE=-bb
+
+(or -bc, -bp, -bi, ... see "Maximum RPM" for more details [*]).
+
+When the build command succeeds, the rpm files can be found under
+$BUILD_ROOT/usr/src/packages/RPMS/
+
+
+Known Parameters:
+
+ --help You already got it :)
+
+ --kill Instead of starting a build kill the one currently
+ running.
+
+ --shell Instead of starting a build start a root shell in
+ the build root.
+
+ --sysrq $ Sends a single specifed char as sysrq to the running
+ kernel of the build.
+
+ --clean Delete old build root before initializing it
+
+ --wipe Completely removes build environment and exits.
+
+ --no-init Skip initialization of build root and start with build
+ immediately.
+
+ --no-checks Do not run checks (postbuild and %check)
+
+ --logfile logfile
+ Capture build output to logfile. Defaults to
+ .build.log in the build root for non-VM builds.
+
+ --repo PATH_OR_URL
+ Use package repository at PATH_OR_URL. Supported formats
+ are rpm-md, yast2, debian, and arch linux.
+ Alternatively zypp://NAME specifies the zypp
+ repository NAME. The repo must be refreshed with zypp
+ so package meta data is available locally. With emtpy
+ NAME all enabled repositories are used.
+
+ --rpms path1:path2:...
+ Specify path where to find the RPMs for the build system
+
+ --arch arch1:arch2:...
+ Specify what architectures to select from the RPMs
+
+ --verify Run verify when initializing the build root
+
+ --extra-packs pack
+ -X pack
+ Also install package 'pack'
+
+ --root rootdir
+ Use 'rootdir' to setup chroot environment
+
+ --cachedir cachedir
+ Use 'cachedir' to cache remote repo's packages. The
+ default cache dir is /var/cache/build, every repo
+ given by --repo corresponds to a subdir named
+ as md5sum of its repo url, for example:
+ /var/cache/build/3e8ea9b47808629414a0cebc33ea285e
+
+ --oldpackages oldpackagesdir
+ Define a directory with a former build
+
+ --baselibs Create -32bit/-64bit/-x86 rpms for other architectures
+
+ --list-state
+ List rpms that would be used to create a fresh build root.
+ Does not create the build root or perform a build.
+
+ --dist dist
+ Distribution to use
+
+ --with X
+ Enable feature X for build
+
+ --without X
+ Disable feature X for build
+
+ --define 'X Y'
+ Define macro X with value Y
+
+ --release release
+ Override Release in spec file
+
+ --stage -bSTAGE
+ Set stage for rpmbuild. Defaults to -ba.
+
+ --target platform
+ Set target platform for rpmbuild
+
+ --jobs N Use N parallel processes during build.
+ Sets %jobs and %_smp_mflags macros and
+ defines the number of CPUs to use for
+ VMs.
+
+ --threads N sets number of threads for VM
+
+ --ccache
+ Use ccache to speed up rebuilds
+
+ --icecream N
+ Use N parallel build jobs with icecream
+
+ --overlay OVERLAY
+ Copy overlay filesystem to buildroot after installing
+ all RPMs. This must be a valid directory.
+
+ --rsync-src RSYNCSRC
+ Copy overlay folder (RSYNCSRC) to a folder (RSYNCDEST)
+ inside the buildroot using rsync.
+ It will "%define RSYNCDONE 1" for handling %setup in your
+ specfile. E.g.:
+ %prep
+ %if 0%{?RSYNCDONE}
+ %setup -n aaa_base -T -D -b 5 -b 7
+ %else
+ %setup -n aaa_base -b 5 -b 7
+ %endif
+
+ --rsync-dest RSYNCDEST
+ Copy overlay folder (RSYNCSRC) to a folder (RSYNCDEST)
+ inside the buildroot using rsync.
+
+ --uid uid:gid
+ Specify the uid and gid to use for the abuild user.
+ This is useful if you are hacking in the buildroot.
+ This must be set to the same value if the buildroot is re-used.
+
+ --statistics
+ monitor used resources during build inside VM
+
+ --kvm
+ Use KVM to secure build process. Your hardware needs to support
+ virtualization
+
+ --xen
+ Use XEN to secure build process, you to run in a XEN Dom0 environment.
+
+ --lxc
+ Use Linux Containers to isolate the process. This may not be 100% safe.
+
+ --openstack
+ Cloud build
+
+ --ec2
+ Cloud build
+
+ --emulator
+ Use any generic emulator to isolate the build process. You need to write
+ an emulator/emulator.sh script and put it next to the build script sources.
+
+ --emulator-script SCRIPT
+ specify another emulator instead of emulator.sh
+
+ --vm-type TYPE
+ Use virtual machine instead of chroot
+ TYPE is one of xen|kvm|uml|qemu|lxc|zvm|openstack|ec2|docker|pvm
+
+ --vm-worker GUEST
+ GUEST is a z/VM build worker controlled by the controlling
+ z/VM build machine.
+
+ --vm-worker-nr N
+ Each worker in z/VM needs a uniq number. This is needed to
+ calculate uniq device addresses for root and swap device.
+
+ --vm-region NAME
+ EC2 only: defines amazon control server
+
+ --vm-server NAME
+ openstack only: defines control server name
+
+ --vm-disk FILE
+ Use FILE as disk for virtual machine.
+ Defaults to \$BUILD_ROOT.img if unset
+
+ --vm-swap FILE
+ Use FILE as swap space for virtual machine. The swap space is
+ also used for retrieving packages from the VM so its size must
+ be sufficiently large
+
+ --vm-disk-size SIZEINMB
+ --vm-swap-size SIZEINMB
+ --vm-disk-filesystem TYPE
+ Defaults for automatic setup of VM root/swap files.
+ May get overruled by build config vmfstype build flag.
+
+ --vm-memory SIZEINMB
+ Set amount of RAM for VMs
+
+ --vm-hugetlbfs HUGETLBFSPATH
+ Use hugetlb for memory management, path to mounted hugetlbfs.
+
+ --vm-kernel FILE
+ --vm-initrd FILE
+ Kernel and initrd to use for VM (kvm and qemu only)
+
+ --vm-user USERNAME
+ User name to run qemu/kvm process
+
+ --vm-telnet PORT
+ Is forwarding PORT to a telnet session inside of the VM.
+ Specify also needed extra packages via -x parameter, usually:
+ --vm-telnet 1234 -x telnet-server -x net-tools
+ And connect from the host via
+ telnet 1234
+ NOTE: The telnet server gets started after all packages got installed.
+
+ --vm-net OPTION
+ --vm-netdev OPTION
+ --vm-device OPTION
+ KVM only: Attach kvm option
+ Available options are -net, -netdev, -device
+ (This options in kvm can not guarantee reproducible builds)
+ --debug
+ Enable creation of a debuginfo package
+
+Remember to have fun!
+
+[*] Maximum RPM: http://www.rpm.org/max-rpm/
+EOT
+}
+
+usage () {
+ cleanup_and_exit 1 "Usage: `basename $0` [--no-init|--clean|--rpms path|--verify|--help] [dir-to-build|recipe-to-build]"
+}
+
+#
+# cleanup_and_exit
+# return values: 0 -> success, new packages built
+# 1 -> error, build failed
+# 2 -> successfull build, but no changes to former built packages
+# 3 -> something wrong with build host
+#
+cleanup_and_exit () {
+ trap EXIT
+ test -z "$1" && set 0
+ if test -n "$2" ; then
+ if test "$1" -ne 0 ; then
+ echo "$2" >&2
+ else
+ echo "$2"
+ fi
+ fi
+ if test -z "$BUILD_OPTIONS_PARSED" ; then
+ # if we haven't parsed the options yet we do
+ # not know the correct build root. just exit.
+ exit $1
+ fi
+ rm -f $BUILD_ROOT/exit
+
+ # add build time statistics
+ recipe_build_time_statistics
+
+ # check for disk full
+ if test "$1" -eq 1 -a -x /bin/df ; then
+ echo
+ echo "$HOST failed \"build $RECIPEFILE\" at `date --utc`."
+ echo
+ # okay, it failed, but maybe because disk space?
+ if df $BUILD_ROOT 2>/dev/null | grep -q "100%"; then
+ df $BUILD_ROOT 2>/dev/null
+ echo
+ echo "$HOST ran out of disk space. Please try again."
+ echo
+ set 3
+ fi
+ fi
+
+ # run recipe cleanup code
+ if test -z "$VM_TYPE" -o -n "$RUNNING_IN_VM" ; then
+ test -n "$BUILDTYPE" && recipe_cleanup
+ fi
+
+ # shutdown
+ if test -n "$RUNNING_IN_VM" ; then
+ echo "$1" > /.build/_exitcode
+ test -n "$browner" && chown "$browner" $BUILD_ROOT
+ vm_shutdown "$1"
+ else
+ 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/sys 2>/dev/null || true
+ test -n "$VM_ROOT" -a "$VM_ROOT" != 1 && umount $BUILD_ROOT 2>/dev/null || true
+ test -n "$VM_TYPE" && vm_cleanup
+ fi
+ exit $1
+}
+
+fail_exit() {
+ cleanup_and_exit 1
+}
+
+shellquote() {
+ for arg ; do
+ arg=${arg/\\/\\\\}
+ arg=${arg/\$/\\\$}
+ arg=${arg/\"/\\\"}
+ arg=${arg/\`/\\\`}
+ echo -n " \"$arg\""
+ done
+}
+
+# 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
+}
+
+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][+][+]|clang|clang[+][+])([-]?[234][.]?[0-9])*$'); do
+ rm -f $BUILD_ROOT/var/lib/build/ccache/bin/$i
+ test -e $BUILD_ROOT/usr/bin/$i || continue
+ echo '#! /bin/sh' > $BUILD_ROOT/var/lib/build/ccache/bin/$i
+ echo "test -e /usr/bin/$i || exit 1" >> $BUILD_ROOT/var/lib/build/ccache/bin/$i
+ echo 'export PATH=/usr/lib/icecc/bin:/opt/icecream/bin:/usr/bin:$PATH' >> $BUILD_ROOT/var/lib/build/ccache/bin/$i
+ echo "ccache $i \"\$@\"" >> $BUILD_ROOT/var/lib/build/ccache/bin/$i
+ chmod 755 $BUILD_ROOT/var/lib/build/ccache/bin/$i
+ echo "Installed ccache wrapper as $BUILD_ROOT/var/lib/build/ccache/bin/$i"
+ done
+ fi
+ 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
+ else
+ rm -f "$BUILD_ROOT"/var/lib/build/ccache/bin/{gcc,g++,cc,c++,clang,clang++}
+ fi
+}
+
+setupicecream() {
+ local icecreamdir=/var/run/icecream
+ if test "$(readlink "$BUILD_ROOT/var/run")" = /run ; then
+ icecreamdir=/run/icecream
+ fi
+ if test "$icecream" -eq 0 ; then
+ rm -rf "$BUILD_ROOT$icecreamdir"
+ rm -f "$BUILD_ROOT/etc/profile.d/build_icecream.sh"
+ return 0
+ fi
+
+ if ! chroot "$BUILD_ROOT" rpm -q icecream >/dev/null 2>/dev/null; then
+ echo "*** icecream package not installed ***"
+ return 1
+ fi
+
+ echo "using icecream with $icecream jobs"
+
+ 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
+ fi
+
+ local icecc_vers=(`shopt -s nullglob; echo $BUILD_ROOT$icecreamdir/*.tar.{bz2,gz}`)
+ icecc_vers=${icecc_vers//$BUILD_ROOT/}
+
+ # XXX use changelog like autobuild does instead?
+ # only run create-env if compiler or glibc changed
+ 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"
+ then
+ rm -rf "$BUILD_ROOT$icecreamdir"
+ mkdir -p "$BUILD_ROOT$icecreamdir"
+ 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"
+ return 1
+ fi
+ echo "creating new env in '$icecreamdir'"
+ chroot $BUILD_ROOT bash -c "cd $icecreamdir; $createenv" || cleanup_and_exit 1
+ icecc_vers=(`shopt -s nullglob; echo $BUILD_ROOT/$icecreamdir/*.tar.{bz2,gz}`)
+ icecc_vers=${icecc_vers//$BUILD_ROOT/}
+ echo "created icecream environment $icecc_vers"
+ else
+ echo "reusing existing icecream environment $icecc_vers"
+ fi
+ if test -n "$icecc_vers" ; then
+ echo "export ICECC_VERSION=$icecc_vers" >> "$BUILD_ROOT"/etc/profile.d/build_icecream.sh
+ fi
+}
+
+setmemorylimit() {
+ if test -n "$VM_ROOT" -o -n "$RUNNING_IN_VM" ; then
+ return
+ fi
+ local mem
+ local limit
+ while read mem; do
+ case "$mem" in
+ MemTotal:*)
+ set -- $mem
+ eval "limit=\$(($2/3*2))"
+ ;;
+ SwapTotal:*)
+ set -- $mem
+ eval "limit=\$(($2/3*2+$limit))"
+ ;;
+ esac
+ done < <(cat /proc/meminfo) # cat for proc stuff
+
+ ulimit -v $limit
+ echo "Memory limit set to ${limit}KB"
+}
+
+create_baselibs() {
+ local pkgs=()
+ local line
+
+ BASELIBS_CFG=
+
+ if test "$BUILDTYPE" == arch || test "$BUILDTYPE" = collax ; then
+ return
+ fi
+ if test "$BUILDTYPE" == dsc ; then
+ pkgs=($DEBS)
+ else # spec and kiwi
+ if test -e $BUILD_ROOT$TOPDIR/SOURCES/baselibs.conf ; then
+ BASELIBS_CFG="-c $TOPDIR/SOURCES/baselibs.conf"
+ fi
+ if test -e $BUILD_ROOT/usr/lib/build/baselibs_global.conf; then
+ BASELIBS_GLOBAL="-c /usr/lib/build/baselibs_global.conf"
+ fi
+ pkgs=($RPMS)
+ fi
+
+ # don't use -R as extracted sources, build root etc might be below $TOPDIR
+ chown "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"/* "$BUILD_ROOT$TOPDIR"/RPMS/* || true
+
+ local mkbaselibs="/usr/lib/build/mkbaselibs"
+ local whichone=''
+ # $BUILD_DIR is set to /.build when using a vm. So we need to
+ # hardcode /usr/lib/build instead of $BUILD_DIR to prefer
+ # mkbaselibs from the distro.
+ if test -f $BUILD_ROOT$mkbaselibs; then
+ if test -z "$BASELIBS_CFG" -a -e $BUILD_ROOT/usr/lib/build/baselibs.conf ; then
+ BASELIBS_CFG="-c /usr/lib/build/baselibs.conf"
+ fi
+ else
+ if test "$CREATE_BASELIBS" = 'internal'; then
+ echo "Warning: mkbaselibs missing in build root, skipping baselibs"
+ return
+ fi
+ # use external version
+ whichone=" (external)"
+ mkbaselibs="/.mkbaselibs/mkbaselibs"
+ rm -rf "$BUILD_ROOT/.mkbaselibs"
+ mkdir -p "$BUILD_ROOT/.mkbaselibs"
+ cp -f $BUILD_DIR/mkbaselibs $BUILD_ROOT/.mkbaselibs/
+ if test "$BUILDTYPE" == "dsc" ; then
+ cp -f $BUILD_DIR/baselibs_global-deb.conf $BUILD_ROOT/.mkbaselibs/baselibs_g.conf
+ cp -f $BUILD_ROOT$TOPDIR/SOURCES/baselibs-deb.conf $BUILD_ROOT/.mkbaselibs/baselibs-deb.conf
+ BASELIBS_CFG="-c /.mkbaselibs/baselibs-deb.conf"
+ else
+ cp -f $BUILD_DIR/baselibs_global.conf $BUILD_ROOT/.mkbaselibs/baselibs_g.conf
+ if test -z "$BASELIBS_CFG" -a -e $BUILD_DIR/baselibs.conf; then
+ cp -f $BUILD_DIR/baselibs.conf $BUILD_ROOT/.mkbaselibs/baselibs.conf
+ BASELIBS_CFG="-c /.mkbaselibs/baselibs.conf"
+ fi
+ fi
+ if test -e $BUILD_ROOT/.mkbaselibs/baselibs_g.conf; then
+ BASELIBS_GLOBAL="-c /.mkbaselibs/baselibs_g.conf"
+ fi
+ fi
+ echo "... creating baselibs$whichone"
+ while read line
+ do
+ chroot $BUILD_ROOT su -c "$mkbaselibs $BASELIBS_GLOBAL $BASELIBS_CFG $line" - $BUILD_USER || cleanup_and_exit 1
+ done < <(IFS=$'\n'; echo "${pkgs[*]#$BUILD_ROOT}" | xargs -n 1024)
+ rm -rf "$BUILD_ROOT/.mkbaselibs"
+}
+
+copy_oldpackages() {
+ local i=0
+ local d
+ local dest
+ 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 test -d "$d" -a "$d" != "$dest" ; then
+ rm -rf "$dest"
+ mkdir -p "$dest"
+ cp -L $d/* "$dest"
+ : $((++i))
+ fi
+ done
+}
+
+mkdir_build_root() {
+ # strip trailing slash
+ test "$BUILD_ROOT" != / && BUILD_ROOT="${BUILD_ROOT%/}"
+ if test -d "$BUILD_ROOT" ; then
+ # check if it is owned by root
+ if test -z "$RUNNING_IN_VM" -a \! -O "$BUILD_ROOT" -a "`stat -c %u $BUILD_ROOT`" -ne 0 ; then
+ cleanup_and_exit 1 "BUILD_ROOT=$BUILD_ROOT must be owned by root. Exit..."
+ fi
+ else
+ test "$BUILD_ROOT" != "${BUILD_ROOT%/*}" && mkdir -p "${BUILD_ROOT%/*}"
+ if ! mkdir $BUILD_ROOT ; then
+ cleanup_and_exit 1 "can not create BUILD_ROOT=$BUILD_ROOT. Exit..."
+ fi
+ fi
+
+ if test ! -w "$BUILD_ROOT" ; then
+ cleanup_and_exit 3 "Error: BUILD_ROOT=$BUILD_ROOT not writeable, try --clean."
+ fi
+
+ rm -rf "$BUILD_ROOT/.build.packages"
+ 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
+}
+
+copy_overlay() {
+ 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
+}
+
+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
+}
+
+wipe_build_environment() {
+ if test -n "$VM_TYPE" ; then
+ vm_img_wipe
+ else
+ echo "Wiping build root: '$BUILD_ROOT'"
+
+ # unmount all mounts still in the build root path
+ for m in $(cat /proc/mounts | grep "$BUILD_ROOT" | awk '{ print $2 }'); do
+ if ! umount -n "$m" 2>/dev/null ; then
+ echo "Failed to umount "$m", cannot wipe buildroot"
+ exit 1
+ fi
+ done
+ rm -rf "$BUILD_ROOT"
+ fi
+}
+
+sysrq_running_build() {
+ test -z "$SRCDIR" || usage
+ if test -n "$VM_TYPE" ; then
+ vm_sysrq "$1"
+ else
+ cleanup_and_exit 1 "can not send a sysrq to chroot builds"
+ fi
+}
+
+kill_running_build() {
+ test -z "$SRCDIR" || usage
+ (set -C; > "$BUILD_ROOT/exit" 2>/dev/null || true)
+ if test -n "$VM_TYPE" ; then
+ # mark job as failed so that we don't extract packages
+ vm_set_buildstatus 1
+ vm_kill
+ else
+ if ! $BUILD_DIR/killchroot -s 9 $BUILD_ROOT ; then
+ cleanup_and_exit 1 "could not kill build in $BUILD_ROOT"
+ fi
+ fi
+}
+
+#### main ####
+
+trap fail_exit EXIT
+
+shopt -s nullglob
+
+export PATH=$BUILD_DIR:/sbin:/usr/sbin:/bin:/usr/bin:$PATH
+
+if vm_detect_2nd_stage ; then
+ set "/.build-srcdir/$RECIPEFILE"
+ export PATH=/.build:$PATH
+fi
+
+. $BUILD_DIR/common_functions || exit 1
+
+export HOST
+
+needarg() {
+ if test -z "$ARG" ; then
+ cleanup_and_exit 1 "$PARAM needs an agrument"
+ fi
+}
+
+validate_init "$BUILD_CONF"
+
+while test -n "$1"; do
+ 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
+ ;;
+ -noinit|-no-init)
+ test "$DO_INIT" = false && DO_INIT_TOPDIR=false
+ DO_INIT=false
+ ;;
+ -nochecks|-no-checks)
+ DO_CHECKS=false
+ ;;
+ -clean)
+ CLEAN_BUILD='--clean'
+ ;;
+ -wipe)
+ DO_WIPE=true
+ ;;
+ -kill)
+ KILL=true
+ ;;
+ -rpms)
+ needarg
+ BUILD_RPMS="$ARG"
+ shift
+ ;;
+ -arch)
+ needarg
+ BUILD_ARCH="$ARG"
+ shift
+ ;;
+ -hostarch|-host-arch)
+ needarg
+ BUILD_HOST_ARCH="$ARG"
+ shift
+ ;;
+ -verify)
+ export VERIFY_BUILD_SYSTEM=true
+ ;;
+ -target)
+ needarg
+ ABUILD_TARGET="$ARG"
+ shift
+ ;;
+ -jobs)
+ needarg
+ BUILD_JOBS="$ARG"
+ shift
+ ;;
+ -threads)
+ needarg
+ BUILD_THREADS="$ARG"
+ shift
+ ;;
+ -extrapacks|-extra-packs|-X)
+ needarg
+ BUILD_EXTRA_PACKS="$BUILD_EXTRA_PACKS $ARG"
+ shift
+ ;;
+ -lint)
+ # OBSOLETE: just keeping it for compability
+ DO_LINT=true
+ ;;
+ -baselibs)
+ CREATE_BASELIBS=true
+ ;;
+ -baselibs-internal)
+ CREATE_BASELIBS=internal
+ ;;
+ -root)
+ needarg
+ BUILD_ROOT="$ARG"
+ shift
+ ;;
+ -cachedir)
+ needarg
+ CACHE_DIR="$ARG"
+ shift
+ ;;
+ -oldpackages)
+ needarg
+ old_packages=("${old_packages[@]}" "$ARG")
+ shift
+ ;;
+ -dist)
+ needarg
+ BUILD_DIST="$ARG"
+ shift
+ ;;
+ -release)
+ needarg
+ RELEASE="$ARG"
+ shift
+ ;;
+ -logfile)
+ needarg
+ LOGFILE="$ARG"
+ shift
+ ;;
+ -reason)
+ needarg
+ REASON="$ARG"
+ shift
+ ;;
+ -norootforbuild)
+ NOROOTFORBUILD=true
+ ;;
+ -useusedforbuild)
+ USEUSEDFORBUILD="--useusedforbuild"
+ ;;
+ -configdir)
+ needarg
+ CONFIG_DIR="$ARG"
+ shift
+ ;;
+ -list*state)
+ LIST_STATE=true
+ ;;
+ -define|-with|-without)
+ needarg
+ PARAM="-${PARAM/#--/-}"
+ definesnstuff[${#definesnstuff[@]}]="$PARAM"
+ definesnstuff[${#definesnstuff[@]}]="$ARG"
+ shift
+ ;;
+ -repository|-repo)
+ needarg
+ repos[${#repos[@]}]="--repository"
+ repos[${#repos[@]}]="$ARG"
+ shift
+ ;;
+ -icecream)
+ needarg
+ icecream="$ARG"
+ test "$icecream" -gt 0 && BUILD_JOBS="$ARG"
+ shift
+ ;;
+ -ccache)
+ CCACHE=true
+ ;;
+ -statistics)
+ DO_STATISTICS=1
+ ;;
+ -debug)
+ BUILD_DEBUG=1
+ ;;
+ -incarnation)
+ needarg
+ INCARNATION=$ARG
+ shift
+ ;;
+ -disturl)
+ needarg
+ DISTURL=$ARG
+ shift
+ ;;
+ -linksources)
+ LINKSOURCES=true
+ ;;
+ -changelog)
+ CHANGELOG=true
+ ;;
+ -overlay)
+ needarg
+ OVERLAY=$ARG
+ shift
+ ;;
+ -rsync-src)
+ needarg
+ RSYNCSRC=$ARG
+ shift
+ ;;
+ -rsync-dest)
+ needarg
+ RSYNCDEST=$ARG
+ shift
+ ;;
+ -uid)
+ needarg
+ if test -n "${ARG//[0-9:]/}" ; then
+ cleanup_and_exit 1 "--uid argument must be uid:gid"
+ fi
+ ABUILD_UID=${ARG%:*}
+ ABUILD_GID=${ARG#*:}
+ shift
+ ;;
+ -rpmlist)
+ needarg
+ RPMLIST="--rpmlist $ARG"
+ BUILD_RPMS=
+ shift
+ ;;
+ -sysrq)
+ needarg
+ SEND_SYSRQ="${ARG:0:1}"
+ shift
+ ;;
+ -shell)
+ RUN_SHELL=1
+ shift
+ ;;
+ -signdummy)
+ SIGNDUMMY=1
+ ;;
+ -nosignature)
+ DLNOSIGNATURE="--nosignature"
+ ;;
+ -obsmultibuild|-obs-multibuild|-buildflavor|-build-flavor)
+ needarg
+ BUILD_FLAVOR=$ARG
+ shift
+ ;;
+ -obspackage|-obs-package)
+ needarg
+ OBS_PACKAGE=$ARG
+ shift
+ ;;
+ ---noarg)
+ cleanup_and_exit 1 "$ARG does not take an argument"
+ ;;
+ -*)
+ if vm_parse_options "$@" ; then
+ set -- "${nextargs[@]}"
+ elif recipe_parse_options "$@" ; then
+ set -- "${nextargs[@]}"
+ else
+ cleanup_and_exit 1 "Unknown option '$PARAM'. Exit."
+ fi
+ ;;
+ *)
+ RECIPEFILES[${#RECIPEFILES[@]}]="$PARAM"
+ # skip validation
+ PARAM=
+ ;;
+ esac
+ if test -n "$PARAM" ; then
+ validate_param "$PARAM" "$ARG"
+ fi
+done
+
+# validate params coming from the environment
+test -n "$BUILD_ARCH" && validate_param "--arch" "$BUILD_ARCH" BUILD_ARCH
+test -n "$BUILD_HOST_ARCH" && validate_param "--hostarch" "$BUILD_HOST_ARCH" BUILD_HOST_ARCH
+test -n "$BUILD_RPMS" && validate_param "--rpms" "$BUILD_RPMS" BUILD_RPMS
+test -n "$BUILD_EXTRA_PACKS" && validate_param "--extrapacks" "$BUILD_EXTRA_PACKS" BUILD_EXTRA_PACKS
+test -n "$BUILD_DIST" && validate_param "--dist" "$BUILD_DIST" BUILD_DIST
+test -n "$VERIFY_BUILD_SYSTEM" && validate_param "--verify" "$VERIFY_BUILD_SYSTEM" VERIFY_BUILD_SYSTEM
+test -n "$BUILD_RPM_BUILD_STAGE" && validate_param "--stage" "$BUILD_RPM_BUILD_STAGE" BUILD_RPM_BUILD_STAGE
+test "$BUILD_ROOT" != /var/tmp/build-root && validate_param "--root" "$BUILD_ROOT" BUILD_ROOT
+test "$CONFIG_DIR" != "$BUILD_DIR/configs" && validate_param "--configdir" "$CONFIG_DIR" CONFIG_DIR
+
+# validate the buildroot
+validate_buildroot "$BUILD_ROOT"
+
+# done option parsing
+BUILD_OPTIONS_PARSED=true
+
+
+if test -n "$VM_TYPE" -a -z "$RUNNING_IN_VM" ; then
+ vm_verify_options
+ vm_set_defaults
+fi
+
+initbuildsysstuff=()
+if test -n "$BUILD_FLAVOR" ; then
+ initbuildsysstuff[${#initbuildsysstuff[@]}]="--buildflavor"
+ initbuildsysstuff[${#initbuildsysstuff[@]}]="$BUILD_FLAVOR"
+fi
+if test -n "$OBS_PACKAGE" ; then
+ initbuildsysstuff[${#initbuildsysstuff[@]}]="--obspackage"
+ initbuildsysstuff[${#initbuildsysstuff[@]}]="$OBS_PACKAGE"
+fi
+
+if test -n "$DO_WIPE" ; then
+ wipe_build_environment
+ cleanup_and_exit
+fi
+
+if test -n "$KILL" ; then
+ kill_running_build
+ cleanup_and_exit
+fi
+
+if test -n "$SEND_SYSRQ" ; then
+ sysrq_running_build "$SEND_SYSRQ"
+ cleanup_and_exit
+fi
+
+if test -n "$CLEAN_BUILD" ; then
+ DO_INIT=true
+ DO_INIT_TOPDIR=true
+fi
+
+if test -z "$RPMLIST" -a -z "$RUNNING_IN_VM" ; then
+ if test -z "$repos" -a -z "$BUILD_RPMS" ; then
+ repos=(--repository 'zypp://')
+ fi
+else
+ repos=()
+fi
+
+set_build_arch
+
+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
+ 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 "${initbuildsysstuff[@]}" "${definesnstuff[@]}" "${repos[@]}" $DLNOSIGNATURE $USEUSEDFORBUILD $RECIPEFILE $BUILD_EXTRA_PACKS
+ ERR=$?
+ rm -rf "$BUILD_ROOT"
+ cleanup_and_exit $ERR
+fi
+
+# do vm setup if needed
+if test -z "$RUNNING_IN_VM" -a -n "$VM_TYPE" -a -n "$VM_ROOT" ; then
+ vm_setup
+fi
+
+mkdir_build_root
+
+if test "$BUILD_ROOT" = / ; then
+ browner="$(stat -c %u /)"
+fi
+
+rm -f $BUILD_ROOT/exit
+
+if test -z "$VM_ROOT" -a -z "$LOGFILE" ; then
+ if test -z "$RUNNING_IN_VM"; then
+ LOGFILE="$BUILD_ROOT/.build.log"
+ else
+ # lxc and docker are special cases: vm shares logfile with host
+ case "$VM_TYPE" in
+ lxc|docker)
+ ;;
+ *)
+ LOGFILE="$BUILD_ROOT/.build.log"
+ ;;
+ esac
+ fi
+fi
+
+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 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_ROOT" ; then
+ # external run of virtualization build
+ exec 1> >(exec -a 'build logging' perl -e 'open(F,">>",$ARGV[0])||die("$ARGV[0]: $!\n");$|=1;select(F);$|=1;while(<STDIN>){my $p=sprintf("[%5ds] ", time()-'$STARTTIME');print STDOUT $p.$_;s/^\r//s;s/\r\n/\n/gs;print F $p.$_}' $LOGFILE) 2>&1
+ else
+ # plain chroot
+ exec 1> >(exec -a 'build logging' perl -e 'open(F,">>",$ARGV[0])||die("$ARGV[0]: $!\n");$|=1;select(F);$|=1;while(<STDIN>){my $p=sprintf("[%5ds] ", time()-'$STARTTIME');print STDOUT $p.$_;print F $p.$_}' $LOGFILE) 2>&1
+ fi
+fi
+
+setmemorylimit
+
+#
+# say hello
+#
+test -z "$HOST" && HOST=`hostname`
+
+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
+ test -n "$VM_TYPE" && echo "Doing $VM_TYPE build${VM_ROOT:+ in $VM_ROOT}"
+ echo
+fi
+
+test "$BUILD_ARCH" = all && BUILD_ARCH=
+BUILD_USER_ABUILD_USED=
+
+for RECIPEFILE in "${RECIPEFILES[@]}" ; do
+
+ SRCDIR="${RECIPEFILE%/*}"
+ RECIPEFILE="${RECIPEFILE##*/}"
+
+ recipe_set_buildtype
+
+ if test -z "$RUNNING_IN_VM" ; then
+ echo
+ echo "$HOST started \"build $RECIPEFILE\" at `date --utc`."
+ echo
+ test -n "$REASON" && echo "$REASON"
+ echo
+ TIME_START_TIME=`date +%s` # for statistics
+ fi
+
+ #
+ # first setup building directory...
+ #
+ cd "$SRCDIR"
+ if ! test -s "$RECIPEFILE" ; then
+ cleanup_and_exit 1 "$RECIPEFILE is empty. This should not happen..."
+ fi
+ MYSRCDIR="$SRCDIR"
+
+ # special hack to build from a .src.rpm (modifies MYSRCDIR)
+ test "$RECIPEFILE" != "${RECIPEFILE%.src.rpm}" && recipe_unpack_srcrpm
+
+ echo "processing recipe $MYSRCDIR/$RECIPEFILE ..."
+
+ ADDITIONAL_PACKS=
+ test -z "$BUILD_EXTRA_PACKS" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS $BUILD_EXTRA_PACKS"
+ test -z "$CREATE_BASELIBS" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS build"
+ 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"
+
+ # we need to do this before the vm is started
+ if test -n "$CHANGELOG" -a -z "$RUNNING_IN_VM" ; then
+ recipe_create_changelog "$MYSRCDIR/$RECIPEFILE"
+ fi
+
+ if test -n "$VM_TYPE" -a -z "$RUNNING_IN_VM" ; then
+ vm_first_stage
+ cleanup_and_exit
+ fi
+
+ if test "$DO_INIT" = true ; then
+ start_time=`date +%s`
+ #
+ # create legacy .buildenv file
+ #
+ test -z "$INCARNATION" && INCARNATION=0
+ echo "BUILD_INCARNATION=$INCARNATION" > $BUILD_ROOT/.buildenv
+ Q="'\''"
+ test -n "$DISTURL" && echo "BUILD_DISTURL='${DISTURL//"'"/$Q}'" >> $BUILD_ROOT/.buildenv
+ test "$BUILDTYPE" = preinstallimage && mkdir -p $BUILD_ROOT/.preinstall_image
+ CREATE_BUILD_BINARIES=
+ if recipe_needs_build_binaries "$MYSRCDIR/$RECIPEFILE" ; then
+ CREATE_BUILD_BINARIES=--create-build-binaries
+ fi
+ set -- init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" "${initbuildsysstuff[@]}" "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $DLNOSIGNATURE $USEUSEDFORBUILD $CREATE_BUILD_BINARIES $RPMLIST "$MYSRCDIR/$RECIPEFILE" $ADDITIONAL_PACKS
+ echo "$* ..."
+ start_time=`date +%s`
+ "$@" || cleanup_and_exit 1
+ check_exit
+ TIME_INSTALL=$(( `date +%s` - $start_time ))
+ unset start_time
+ # arbitrary limit of 10MB
+ if test $((`stat -f -c "%a*%S/1024/1024" $BUILD_ROOT`)) -lt 10; then
+ # ensure that old stat is not failing (RHEL4)
+ if df $BUILD_ROOT 2>/dev/null | grep -q "100%"; then
+ df -h $BUILD_ROOT
+ cleanup_and_exit 1 "build does not work on a completely full filesystem"
+ fi
+ fi
+ copy_oldpackages
+ fi
+
+ # mount stuff (/dev/shm needed for POSIX semaphores)
+ if test -n "$BUILD_ROOT" -a "$BUILD_ROOT" != / ; then
+ test -d $BUILD_ROOT/dev/shm || rm -f $BUILD_ROOT/dev/shm
+ mkdir -p $BUILD_ROOT/proc
+ mkdir -p $BUILD_ROOT/sys
+ mkdir -p $BUILD_ROOT/dev/pts
+ mkdir -p $BUILD_ROOT/dev/shm
+ mount -n -tproc none $BUILD_ROOT/proc
+ mount -n -tdevpts -omode=0620,gid=5 none $BUILD_ROOT/dev/pts
+ mount -n -ttmpfs none $BUILD_ROOT/dev/shm
+ fi
+
+ # hack to process preinstallimages early
+ if test "$BUILDTYPE" = preinstallimage ; then
+ recipe_build
+ continue
+ fi
+
+ if test -z "$BUILD_DIST" -a -e "$BUILD_ROOT/.guessed_dist" ; then
+ read BUILD_DIST < $BUILD_ROOT/.guessed_dist
+ fi
+
+ #
+ # install dummy sign program if needed
+ #
+ test -f $BUILD_ROOT/usr/bin/sign_installed && mv $BUILD_ROOT/usr/bin/sign_installed $BUILD_ROOT/usr/bin/sign
+ if test -n "$SIGNDUMMY" ; then
+ test -f $BUILD_ROOT/usr/bin/sign && mv $BUILD_ROOT/usr/bin/sign $BUILD_ROOT/usr/bin/sign_installed
+ cp $BUILD_DIR/signdummy $BUILD_ROOT/usr/bin/sign
+ chmod 755 $BUILD_ROOT/usr/bin/sign
+ fi
+
+ #
+ # check if we want to build with the abuild user
+ #
+ BUILD_USER=abuild
+ if test -x $BUILD_ROOT/bin/rpm ; then
+ SUSE_VERSION=`chroot $BUILD_ROOT /bin/rpm --eval '%{?suse_version}' 2>/dev/null`
+ test -n "$SUSE_VERSION" -a "${SUSE_VERSION:-0}" -le 1020 && BUILD_USER=root
+ fi
+ if test "$BUILD_USER" = abuild ; then
+ egrep '^#[[:blank:]]*needsrootforbuild[[:blank:]]*$' >/dev/null <$RECIPEFILE && BUILD_USER=root
+ else
+ egrep '^#[[:blank:]]*norootforbuild[[:blank:]]*$' >/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 $RECIPEFILE imagetype)
+ test "$imagetype" = product || BUILD_USER=root
+ fi
+ # same with docker and fissile builds
+ if test "$BUILDTYPE" = docker -o "$BUILDTYPE" = fissile -o "$BUILDTYPE" = podman ; then
+ 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
+ echo 'abuild:*:::::::' >>$BUILD_ROOT/etc/shadow # This is needed on Mandriva 2009
+ echo 'abuild:*::' >>$BUILD_ROOT/etc/gshadow # This is needed on Ubuntu
+ echo "abuild:x:${ABUILD_GID}:" >>$BUILD_ROOT/etc/group
+ mkdir -p $BUILD_ROOT/home/abuild
+ chown "$ABUILD_UID:$ABUILD_GID" $BUILD_ROOT/home/abuild
+ else
+ if ! egrep "^abuild:x?:${ABUILD_UID}:${ABUILD_GID}" >/dev/null <$BUILD_ROOT/etc/passwd ; then
+ echo "abuild user present in the buildroot ($BUILD_ROOT) but uid:gid does not match"
+ echo "buildroot currently using:"
+ egrep "^abuild:" <$BUILD_ROOT/etc/passwd
+ echo "build script attempting to use:"
+ echo "abuild::${ABUILD_UID}:${ABUILD_GID}:..."
+ echo "build aborting"
+ cleanup_and_exit 1
+ fi
+ fi
+ if test -f $BUILD_ROOT/etc/shadow ; then
+ sed -i -e "s@^root::@root:*:@" $BUILD_ROOT/etc/shadow
+ fi
+ if test -f $BUILD_ROOT/etc/gshadow ; then
+ sed -i -e "s@^root::@root:*:@" $BUILD_ROOT/etc/gshadow
+ fi
+ BUILD_USER_ABUILD_USED=true
+ else
+ # building as root
+ ABUILD_UID=0
+ ABUILD_GID=0
+ if egrep '^abuild:' >/dev/null <$BUILD_ROOT/etc/passwd ; then
+ rm -rf "$BUILD_ROOT/home/abuild"
+ 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
+ sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/shadow
+ fi
+ if test -f $BUILD_ROOT/etc/gshadow ; then
+ sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/gshadow
+ fi
+ fi
+ fi
+
+ if test -n "$RUNNING_IN_VM" ; then
+ vm_setup_network
+ fi
+
+ setupicecream
+ setupccache
+
+ # fill build directories with sources. Also sets TOPDIR
+ recipe_setup
+
+ # strip prefix from autogenerated files of source services.
+ # sorted by line length to let the latest run service win
+ perl -e 'print "$_\n" for sort { length($a) <=> length($b) } @ARGV' $BUILD_ROOT$TOPDIR/SOURCES/_service\:* | while read i ; 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
+
+ cd $BUILD_ROOT$TOPDIR/SOURCES || cleanup_and_exit 1
+ for i in *.obscpio ; do
+ test -e "$i" || continue
+ echo "Unpacking $i ..."
+ echo "#!/bin/sh -e" > $BUILD_ROOT/.unpack.command
+ shellquote cd "$TOPDIR/SOURCES" >> $BUILD_ROOT/.unpack.command
+ echo >> $BUILD_ROOT/.unpack.command
+ echo -n 'cpio --extract --owner="'$BUILD_USER'" --unconditional --preserve-modification-time --make-directories <' >> $BUILD_ROOT/.unpack.command
+ shellquote "$i" >> $BUILD_ROOT/.unpack.command
+ echo >> $BUILD_ROOT/.unpack.command
+ shellquote rm -f "$i" >> $BUILD_ROOT/.unpack.command
+ echo >> $BUILD_ROOT/.unpack.command
+ chmod 0755 $BUILD_ROOT/.unpack.command
+ chroot $BUILD_ROOT su -c /.unpack.command - $BUILD_USER
+ rm -f $BUILD_ROOT/.unpack.command
+ done
+
+ if test -e _service; then
+ echo "Running build time source services..."
+ $BUILD_DIR/runservices --buildroot "$BUILD_ROOT" || cleanup_and_exit 1
+ fi
+
+ # get rid of old src dir, it is no longer needed and just wastes space
+ test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir && rm -rf "$MYSRCDIR"
+
+ # patch recipes
+ recipe_prepare
+
+ # hmmm
+ chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
+
+ echo -----------------------------------------------------------------
+ if test "$BUILD_USER" = root ; then
+ echo ----- building $RECIPEFILE
+ else
+ echo ----- building $RECIPEFILE "(user $BUILD_USER)"
+ fi
+ echo -----------------------------------------------------------------
+ echo -----------------------------------------------------------------
+ BUILD_SUCCEEDED=false
+
+ if test -n "$OVERLAY" ; then
+ copy_overlay
+ fi
+
+ if test -n "$RSYNCSRC" ; then
+ run_rsync
+ fi
+
+ RECIPE_BUILD_START_TIME=`date +%s`
+ recipe_build
+ test "$BUILD_SUCCEEDED" = true || cleanup_and_exit 1
+
+ recipe_build_time_statistics
+ recipe_cleanup
+
+ test -d "$SRCDIR" && cd "$SRCDIR"
+
+ # unmount stuff
+ if test -n "$BUILD_ROOT" -a "$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/sys 2>/dev/null || true
+ fi
+done
+
+if test -n "$RUNNING_IN_VM" ; then
+ vm_exit_statistics
+fi
+
+# mount /proc again for the post processing steps
+if test -n "$BUILD_ROOT" -a "$BUILD_ROOT" != / ; then
+ mount -n -tproc none $BUILD_ROOT/proc
+fi
+
+RPMS=`find $BUILD_ROOT/$TOPDIR/RPMS -type f -name "*.rpm" 2>/dev/null || true`
+DEBS=`find $BUILD_ROOT/$TOPDIR/DEBS -type f "(" -name "*.deb" -o -name "*.ddeb" -o -name "*.udeb" ")" 2>/dev/null || true`
+
+if test -n "$RPMS" -a -n "$BUILD_USER_ABUILD_USED" ; then
+ recipe_check_file_owners
+fi
+
+if test -n "$RPMS" -a -d "$BUILD_ROOT/usr/lib/build/checks" ; then
+ export DO_RPM_REMOVE=true
+ # workaround for broken 13.1 check scripts which umount /proc
+ if test -n "$RUNNING_IN_VM" -a "$BUILD_ROOT" = / ; then
+ umount -n $BUILD_ROOT/proc/sys/fs/binfmt_misc 2>/dev/null
+ fi
+ # 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
+ for CHECKSCRIPT in $BUILD_ROOT/usr/lib/build/checks/* ; do
+ echo "... running ${CHECKSCRIPT##*/}"
+ $CHECKSCRIPT || cleanup_and_exit 1
+ done
+ # workaround for broken 13.1 check scripts which umount /proc
+ test -e "$BUILD_ROOT/proc/self" || mount -n -tproc none $BUILD_ROOT/proc
+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 ; then
+ recipe_run_rpmlint
+fi
+
+if test \( -n "$RPMS" -o -n "$DEBS" \) -a -n "$CREATE_BASELIBS"; then
+ create_baselibs
+fi
+
+exitcode=0
+
+# 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/.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
+ vm_wrapup_build $(recipe_resultdirs) OTHER
+fi
+
+echo
+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
index 0000000..fce1de2
--- /dev/null
+++ b/build-pkg
@@ -0,0 +1,90 @@
+#
+# binary package specific functions for the build script
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+for i in rpm deb arch ; do
+ . "$BUILD_DIR/build-pkg-$i"
+done
+
+pkg_initdb() {
+ pkg_initdb_$PSUF "$@"
+}
+
+pkg_prepare() {
+ pkg_prepare_$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
+ cleanup_and_exit 1 "cannot autodetect build type when using a preinstall image"
+ 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
+ cleanup_and_exit 1 "could not autodetect package type"
+ 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
+ ;;
+ *)
+ cleanup_and_exit 1 "unknown package type '$PSUF'"
+ ;;
+ esac
+}
diff --git a/build-pkg-arch b/build-pkg-arch
new file mode 100644
index 0000000..5fcd9ac
--- /dev/null
+++ b/build-pkg-arch
@@ -0,0 +1,76 @@
+#
+# Arch specific functions.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+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_prepare_arch() {
+ :
+}
+
+pkg_erase_arch() {
+ ( cd $BUILD_ROOT && chroot $BUILD_ROOT pacman -R -n -d -d --noconfirm $PKG 2>&1 || touch $BUILD_ROOT/exit ) | \
+ perl -ne '$|=1;/^(Total Removed Size: |Packages \(\d+\):|:: Do you want to remove these packages|deleting |removing | )/||/^$/||print'
+}
+
+pkg_verify_installed_arch() {
+ return 1
+}
+
+pkg_cumulate_arch() {
+ return 1
+}
+
+pkg_install_arch() {
+ # Pacman can't handle chroot
+ # https://bbs.archlinux.org/viewtopic.php?id=129661
+ (cd $BUILD_ROOT/etc && sed -i "s/^CheckSpace/#CheckSpace/g" pacman.conf)
+ # -d -d disables deps checking
+ ( cd $BUILD_ROOT && chroot $BUILD_ROOT pacman -U --overwrite '*' -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|looking for conflicting packages|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|:: Processing package changes|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
index 0000000..c5959c0
--- /dev/null
+++ b/build-pkg-deb
@@ -0,0 +1,162 @@
+#
+# Debian dpkg specific functions.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+#
+# A wrapper around chroot to set the environment correctly for dpkg and
+# pre/postinst scripts.
+#
+deb_chroot ()
+{
+ #
+ # to workaround some version of fileutils that doesn't do a 'chdir /'
+ # when doing a 'chroot /' call lets subshell and change dir manually
+ #
+ (
+ cd $1 &&
+ DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical \
+ DEBCONF_NONINTERACTIVE_SEEN=true \
+ LC_ALL=C LANGUAGE=C LANG=C \
+ chroot $*
+ )
+}
+
+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
+}
+
+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
+ deb_chroot $BUILD_ROOT dpkg --install --force-unsafe-io --force-depends .init_b_cache/dpkg.deb >/dev/null 2>&1
+}
+
+pkg_prepare_deb() {
+ :
+}
+
+pkg_install_deb() {
+ ( deb_chroot $BUILD_ROOT dpkg --install --force-unsafe-io --force-depends .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|Preparing to unpack )/||/^$/||print'
+ # 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() {
+ deb_chroot $BUILD_ROOT dpkg --purge --force-depends $PKG 2>&1 | {
+ local retry
+ while read line; do
+ case "$line" in
+ subprocess\ installed\ *script\ returned\ error\ exit\ status*)
+ chroot $BUILD_ROOT rm -f /var/lib/dpkg/info/$PKG.{pre,post}rm
+ retry=1
+ ;;
+ *) echo "$line" ;;
+ esac
+ done
+ if test -n "$retry"; then
+ echo "re-try deleting $PKG without post/pre remove scripts"
+ deb_chroot $BUILD_ROOT dpkg --purge --force-depends $PKG 2>&1 || touch $BUILD_ROOT/exit
+ fi
+ } | perl -ne '$|=1;/^(\(Reading database|Removing |Purging configuration files for )/||/^$/||print'
+}
+
+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 ! deb_chroot $BUILD_ROOT dpkg --configure --pending 2>&1; then
+ echo "first configure attempt failed, trying again..."
+ deb_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
+ if test -f "control.tar.gz" ; then
+ $TAR -C .init_b_cache/scripts/control -z -f control.tar.gz
+ elif test -f "control.tar.xz" ; then
+ $TAR -C .init_b_cache/scripts/control -J -f control.tar.xz
+ fi
+ 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.{g,x}z 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"
+ deb_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"
+ deb_chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.post" configure '' \
+ < /dev/null
+ rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post"
+ fi
+}
+
+# Local Variables:
+# mode: Shell-script
+# End:
diff --git a/build-pkg-rpm b/build-pkg-rpm
new file mode 100644
index 0000000..fc6a421
--- /dev/null
+++ b/build-pkg-rpm
@@ -0,0 +1,203 @@
+#
+# RPM specific functions.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+
+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_prepare_rpm() {
+ 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=
+ # 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"
+}
+
+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_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
+ ( cd $BUILD_ROOT && 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
+ ( cd $BUILD_ROOT && 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"
+ (cd $BUILD_ROOT && 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"
+ (cd $BUILD_ROOT && 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
index 0000000..fe95026
--- /dev/null
+++ b/build-recipe
@@ -0,0 +1,199 @@
+#
+# recipe specific functions for the build script
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+
+BUILDTYPE=
+KIWI_PARAMETERS=
+
+for i in spec dsc kiwi arch collax preinstallimage simpleimage mock livebuild snapcraft debootstrap debbuild appimage docker podman fissile; 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_cleanup () {
+ recipe_cleanup_$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 ;;
+ snapcraft.yaml) BUILDTYPE=snapcraft ;;
+ appimage.yml) BUILDTYPE=appimage ;;
+ Dockerfile) BUILDTYPE=docker ;;
+ fissile.yml) BUILDTYPE=fissile ;;
+ build.collax) BUILDTYPE=collax ;;
+ _preinstallimage) BUILDTYPE=preinstallimage ;;
+ simpleimage) BUILDTYPE=simpleimage ;;
+ *.livebuild) BUILDTYPE=livebuild ;;
+ esac
+ if test -z "$BUILDTYPE" ; then
+ cleanup_and_exit 1 "I don't know how to build $RECIPEFILE"
+ 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
+ # tweak buildtype according to engine
+ if test "$BUILDENGINE" = mock -a "$BUILDTYPE" = spec ; then
+ BUILDTYPE=mock
+ fi
+ if test "$BUILDENGINE" = debootstrap -a "$BUILDTYPE" = dsc ; then
+ BUILDTYPE=debootstrap
+ fi
+ if test "$BUILDENGINE" = debbuild -a "$BUILDTYPE" = spec ; then
+ BUILDTYPE=debbuild
+ fi
+ if test "$BUILDENGINE" = podman -a "$BUILDTYPE" = docker ; then
+ BUILDTYPE=podman
+ fi
+}
+
+# expands all directories into files
+expand_recipe_directories() {
+ local f t ff found types
+ 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
+ if test -z "$types" ; then
+ if test -n "$BUILD_DIST" ; then
+ case $(queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" type) in
+ dsc) types=".dsc" ;;
+ kiwi) types=".kiwi" ;;
+ arch) types="PKGBUILD" ;;
+ collax) types="build.collax" ;;
+ livebuild) types=".livebuild" ;;
+ snapcraft) types="snapcraft.yaml" ;;
+ esac
+ fi
+ types="$types .spec .dsc PKGBUILD build.collax .kiwi .src.rpm .nosrc.rpm simpleimage snapcraft.yaml"
+ fi
+ for t in $types ; 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
+ cleanup_and_exit 1 "no recipe files found in $@. exit..."
+ fi
+}
+
+# generate a .build-changelog file from a .changes file
+recipe_create_changelog() {
+ rm -f $BUILD_ROOT/.build-changelog
+ case $1 in
+ *.dsc) CFFORMAT=debian ;;
+ *) CFFORMAT=rpm ;;
+ esac
+ # add --emailonly option for sles builds
+ if test "$CFFORMAT" = rpm ; then
+ case `queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" eval '%{?is_opensuse}/%{?!fullname_in_changelog:%{?suse_version}}'` in
+ *[1-9]*/*) ;;
+ */*[1-9]*) CFFORMAT="$CFFORMAT --emailonly" ;;
+ esac
+ fi
+ echo "running changelog2spec --target $CFFORMAT --file $1"
+ if ! $BUILD_DIR/changelog2spec --target $CFFORMAT --file "$1" > $BUILD_ROOT/.build-changelog ; then
+ rm -f $BUILD_ROOT/.build-changelog
+ fi
+}
+
+recipe_needs_build_binaries() {
+ test "$BUILDTYPE" = mock && return 0
+ test "$BUILDTYPE" = debootstrap && return 0
+ test "$BUILDTYPE" = livebuild && return 0
+ test "$BUILDTYPE" = snapcraft && return 0
+ test "$BUILDTYPE" = appimage && return 0
+ test "$BUILDTYPE" = docker && return 0
+ test "$BUILDTYPE" = fissile && return 0
+ test "$BUILDTYPE" = podman && return 0
+ egrep '^#[[:blank:]]*needsbinariesforbuild[[:blank:]]*$' >/dev/null <"$1" && return 0
+ return 1
+}
+
+recipe_build_time_statistics() {
+ if test "$DO_STATISTICS" = 1 -a -n "$RECIPE_BUILD_START_TIME" -a -n "$TOPDIR" ; then
+ mkdir -p "$TOPDIR/OTHER"
+ echo "TIME_main_build: $(( `date +%s` - $RECIPE_BUILD_START_TIME))" >> "$TOPDIR/OTHER/_statistics"
+ RECIPE_BUILD_START_TIME=
+ fi
+}
diff --git a/build-recipe-appimage b/build-recipe-appimage
new file mode 100644
index 0000000..19938a0
--- /dev/null
+++ b/build-recipe-appimage
@@ -0,0 +1,128 @@
+#################################################################
+#
+# AppImage specific functions.
+#
+# Author: Adrian Schroeter <adrian@suse.de>
+#
+################################################################
+#
+# Copyright (c) 2017 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+recipe_setup_appimage() {
+ TOPDIR=/usr/src/packages
+ test "$DO_INIT_TOPDIR" = false || rm -rf "$BUILD_ROOT$TOPDIR"
+ for i in OTHER SOURCES APPIMAGE_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
+
+ rawcfgmacros=.rpmmacros
+ test "$BUILDTYPE" = debbuild && rawcfgmacros=.debmacros
+ queryconfig rawmacros --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" > $BUILD_ROOT/root/$rawcfgmacros
+}
+
+recipe_prepare_appimage() {
+ :
+}
+
+# Variables:
+# $BUILD_ROOT is the chroot
+# $TOPDIR/SOURCES includes the appimages sources
+# $TOPDIR/$APPIMAGE_ROOT where appimage will be called
+# $RECIPEFILE the name of the appimage.yml config file
+
+recipe_build_appimage() {
+ local ARCH DEB
+ if [ -x "$BUILD_ROOT/bin/rpm" ]; then
+ ARCH=$(chroot $BUILD_ROOT su -c "rpm --eval '%{_target_cpu}'")
+ else
+ ARCH=$(chroot $BUILD_ROOT su -c "dpkg-architecture -qDEB_BUILD_ARCH")
+ DEB=1
+ fi
+ local DIST="OBS"
+
+ test -z "${ARCH}" -o -z "${DIST}" && cleanup_and_exit 1
+
+ test -d $BUILD_ROOT/.build.binaries || cleanup_and_exit 1 "missing $BUILD_ROOT/.build.binaries"
+
+ if test "$DO_INIT" = true; then
+ if test -n "$DEB" -a ! -d "$BUILD_ROOT/.build.binaries/dists" ; then
+ echo "creating debian repository metadata..."
+ createrepo_debian $BUILD_ROOT/.build.binaries ${ARCH} ${DIST}
+ # setup /etc/apt/sources.list
+ mkdir -p "$BUILD_ROOT/etc/apt"
+ echo "deb [trusted=yes] file:/.build.binaries OBS main" >> "$BUILD_ROOT/etc/apt/sources.list"
+ fi
+ if test -z "$DEB" -a ! -d "$BUILD_ROOT/.build.binaries/repodata" ; then
+ echo "creating repository metadata..."
+ if [ -x "$BUILD_ROOT/usr/bin/createrepo_c" ]; then
+ chroot "$BUILD_ROOT" /usr/bin/createrepo_c /.build.binaries
+ elif [ -x "$BUILD_ROOT/usr/bin/createrepo" ]; then
+ chroot "$BUILD_ROOT" /usr/bin/createrepo /.build.binaries
+ else
+ cleanup_and_exit 1 "No createrepo found in build root"
+ fi
+ fi
+ fi
+
+ release_option=""
+ if test -n "$RELEASE" ; then
+ release_option="--release $RELEASE"
+ fi
+
+ chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && ARCH=$ARCH /usr/lib/appimagetool/pkg2appimage $release_option" - root \
+ || cleanup_and_exit 1
+
+ # extract build result basenames
+ local build_results=""
+ for i in $BUILD_ROOT/$TOPDIR/OTHER/* ; do
+ test -f "$i" || continue
+ case "${i##*/}" in
+ *.AppImage|*.AppImage.digest|*.AppImage.zsync)
+ build_results="${build_results}\n${i%%.snap}"
+ ;;
+ *)
+ ;;
+ esac
+ done
+
+ # Fail the build if no build results are found
+ if [ -z "${build_results}" ] ; then
+ cleanup_and_exit 1 "No live-build result found"
+ fi
+
+ BUILD_SUCCEEDED=true
+}
+
+recipe_resultdirs_appimage() {
+ :
+}
+
+recipe_cleanup_appimage() {
+ :
+}
+
+# Local Variables:
+# mode: Shell-script
+# End:
diff --git a/build-recipe-arch b/build-recipe-arch
new file mode 100644
index 0000000..e3362af
--- /dev/null
+++ b/build-recipe-arch
@@ -0,0 +1,63 @@
+#
+# Arch specific functions.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+recipe_setup_arch() {
+ TOPDIR=/usr/src/packages
+ test "$DO_INIT_TOPDIR" = false || 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..."
+ if ! _arch_recipe_makepkg -so "2>&1" ">/dev/null" ; then
+ cleanup_and_exit 1 "failed to prepare sources"
+ fi
+}
+
+recipe_build_arch() {
+ _arch_recipe_makepkg -ef < /dev/null && BUILD_SUCCEEDED=true
+}
+
+recipe_resultdirs_arch() {
+ echo ARCHPKGS
+}
+
+recipe_cleanup_arch() {
+ :
+}
+
+_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-collax b/build-recipe-collax
new file mode 100644
index 0000000..723034c
--- /dev/null
+++ b/build-recipe-collax
@@ -0,0 +1,62 @@
+#
+# Copyright 2015 Zarafa B.V. and its licensors
+#
+# This program 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 or (at your option) any later version.
+#
+# This program 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.
+#
+
+recipe_setup_collax() {
+ TOPDIR="/usr/src/packages"
+ test "$DO_INIT_TOPDIR" != false && rm -Rf "$BUILD_ROOT/$TOPDIR"
+ mkdir -p "$BUILD_ROOT/$TOPDIR"/{SOURCES,SOURCES.DEB,DEBS,OTHER}
+ cp -p "$MYSRCDIR"/* "$BUILD_ROOT/$TOPDIR/SOURCES/"
+ chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT/$TOPDIR"
+}
+
+recipe_prepare_collax() {
+ DEB_SOURCEDIR="$TOPDIR/SOURCES"
+ DEB_DSCFILE="$RECIPEFILE"
+ chmod -v +x "$BUILD_ROOT/$DEB_SOURCEDIR/build.collax"
+ ln -fsv build.collax "$BUILD_ROOT/$DEB_SOURCEDIR/build"
+}
+
+collax_build() {
+ local buildroot="$1"
+
+ if test -n "$RUN_SHELL"; then
+ chroot "$buildroot" su -
+ ret=$?
+ else
+ chroot "$buildroot" su - $BUILD_USER -c \
+ "cd $TOPDIR/SOURCES && ./build"
+ ret=$?
+ fi
+ if test "$ret" = 0; then
+ BUILD_SUCCEEDED=true
+ fi
+}
+
+collax_move_build_result() {
+ for f in "$BUILD_ROOT/$DEB_SOURCEDIR"/*.{deb,changes}; do
+ test -f "$f" && mv -v "$f" "$BUILD_ROOT/$TOPDIR/DEBS/"
+ done
+}
+
+recipe_build_collax() {
+ collax_build "$BUILD_ROOT"
+ collax_move_build_result
+}
+
+recipe_resultdirs_collax() {
+ echo DEBS
+}
+
+recipe_cleanup_collax() {
+ :
+}
diff --git a/build-recipe-debbuild b/build-recipe-debbuild
new file mode 100644
index 0000000..47308ab
--- /dev/null
+++ b/build-recipe-debbuild
@@ -0,0 +1,56 @@
+#
+# debbuild specific functions.
+#
+################################################################
+#
+# Copyright (c) 2015 SUSE Linux GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+recipe_setup_debbuild() {
+ TOPDIR=`chroot $BUILD_ROOT su -c "debbuild --eval '%_topdir'" - $BUILD_USER`
+ if test -z "$TOPDIR"; then
+ cleanup_and_exit 1 "Error: TOPDIR empty"
+ fi
+ test "$DO_INIT_TOPDIR" = false || 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"
+ mkdir -p "$BUILD_ROOT$TOPDIR/SDEBS"
+ mkdir -p "$BUILD_ROOT$TOPDIR/BUILD"
+ test -e "$BUILD_ROOT$TOPDIR/SPECS" || ln -s SOURCES "$BUILD_ROOT$TOPDIR/SPECS"
+ chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR"
+ cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/
+}
+
+recipe_prepare_debbuild() {
+ recipe_prepare_spec "$@"
+}
+
+recipe_build_debbuild() {
+ recipe_build_spec "$@"
+}
+
+recipe_resultdirs_debbuild() {
+ echo DEBS SDEBS
+}
+
+recipe_cleanup_debbuild() {
+ :
+}
+
diff --git a/build-recipe-debootstrap b/build-recipe-debootstrap
new file mode 100644
index 0000000..1151fda
--- /dev/null
+++ b/build-recipe-debootstrap
@@ -0,0 +1,111 @@
+#
+# debootstrap specific functions.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+recipe_setup_debootstrap() {
+ recipe_setup_dsc "$@"
+}
+
+recipe_prepare_debootstrap() {
+ recipe_prepare_dsc "$@"
+}
+
+recipe_build_debootstrap() {
+ local arch=$(chroot $BUILD_ROOT su -c "dpkg-architecture -qDEB_BUILD_ARCH")
+ local dist=$(chroot $BUILD_ROOT su -c "lsb_release --codename --short")
+ local myroot=debootstraproot
+ 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 for debootstrap..."
+ createrepo_debian $BUILD_ROOT/.build.binaries ${arch} ${dist}
+ fi
+ FULL_PKG_LIST=
+ for PKG in $BUILD_ROOT/.build.binaries/*.deb ; do
+ PKG="${PKG##*/}"
+ FULL_PKG_LIST="$FULL_PKG_LIST,${PKG%.deb}"
+ done
+ FULL_PKG_LIST="${FULL_PKG_LIST#,}"
+ rm -rf "$BUILD_ROOT/$myroot"
+ mkdir -p "$BUILD_ROOT/$myroot/etc/dpkg/dpkg.cfg.d"
+ echo force-unsafe-io > "$BUILD_ROOT/$myroot/etc/dpkg/dpkg.cfg.d/force-unsafe-io"
+
+ set -- chroot $BUILD_ROOT debootstrap --keep-debootstrap-dir --no-check-gpg --variant=buildd --arch="${arch}" --include="$FULL_PKG_LIST" "$dist" "$myroot" file:///.build.binaries
+ echo "running debootstrap..."
+ if ! "$@" || ! chroot $BUILD_ROOT dpkg --configure -a; then
+ cat $BUILD_ROOT/$myroot/debootstrap/debootstrap.log
+ cleanup_and_exit 1 "Failed to setup debootstrap chroot"
+ fi
+
+ # adapt passwd
+ if test $BUILD_USER = abuild ; then
+ echo "abuild:x:${ABUILD_UID}:${ABUILD_GID}:Autobuild:/home/abuild:/bin/bash" >>$BUILD_ROOT/$myroot/etc/passwd
+ echo 'abuild:*:::::::' >>$BUILD_ROOT/$myroot/etc/shadow
+ echo 'abuild:*::' >>$BUILD_ROOT/$myroot/etc/gshadow
+ echo "abuild:x:${ABUILD_GID}:" >>$BUILD_ROOT/$myroot/etc/group
+ mkdir -p $BUILD_ROOT/$myroot/home/abuild
+ chown "$ABUILD_UID:$ABUILD_GID" $BUILD_ROOT/$myroot/home/abuild
+ fi
+
+ if ! test -e $BUILD_ROOT/$myroot/etc/hosts ; then
+ cp $BUILD_ROOT/etc/hosts $BUILD_ROOT/$myroot/etc/hosts
+ fi
+
+ # Mount special filesystem in the debootstrap build root
+ mount -n -tproc none $BUILD_ROOT/$myroot/proc
+ mount -n -tsysfs -o ro none $BUILD_ROOT/$myroot/sys
+ mount -n -tdevpts -omode=0620,ptmxmode=0666,gid=5,newinstance, none $BUILD_ROOT/$myroot/dev/pts
+ mkdir -p $BUILD_ROOT/$myroot/dev/shm
+ mount -n -ttmpfs none $BUILD_ROOT/$myroot/dev/shm
+
+ chroot $BUILD_ROOT/$myroot apt-cache gencaches
+
+ if ! test -e $BUILD_ROOT/$myroot/etc/hosts ; then
+ cp $BUILD_ROOT/etc/hosts $BUILD_ROOT/$myroot/etc/hosts
+ fi
+
+ # move topdir over
+ mv "$BUILD_ROOT/$TOPDIR" "$BUILD_ROOT/$myroot/${TOPDIR%/*}"
+
+ # do the build
+ dsc_build "$BUILD_ROOT/$myroot"
+
+ umount -n $BUILD_ROOT/$myroot/proc/sys/fs/binfmt_misc 2>/dev/null || true
+ umount -n $BUILD_ROOT/$myroot/proc
+ umount -n $BUILD_ROOT/$myroot/sys
+ umount -n $BUILD_ROOT/$myroot/dev/pts
+ umount -n $BUILD_ROOT/$myroot/dev/shm
+
+ # move topdir back
+ mv "$BUILD_ROOT/$myroot/$TOPDIR" "$BUILD_ROOT/${TOPDIR%/*}"
+
+ # move result
+ dsc_move_build_result
+}
+
+recipe_resultdirs_debootstrap() {
+ echo DEBS
+}
+
+recipe_cleanup_debootstrap() {
+ :
+}
+
diff --git a/build-recipe-docker b/build-recipe-docker
new file mode 100644
index 0000000..114fe5a
--- /dev/null
+++ b/build-recipe-docker
@@ -0,0 +1,179 @@
+#################################################################
+#
+# Docker specific functions.
+#
+################################################################
+#
+# Copyright (c) 2017 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+DOCKERD_STARTED=
+
+recipe_setup_docker() {
+ TOPDIR="/usr/src/packages"
+ test "$DO_INIT_TOPDIR" != false && rm -Rf "$BUILD_ROOT/$TOPDIR"
+ mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES"
+ 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
+ cleanup_and_exit 1 "source copy failed"
+ fi
+ fi
+}
+
+recipe_prepare_docker() {
+ :
+}
+
+# Variables:
+# $BUILD_ROOT is the chroot
+# $TOPDIR/SOURCES includes the docker sources
+# $TOPDIR/$DOCKERIMAGE_ROOT where docker will be called
+# $RECIPEFILE the name of the Dockerfile
+
+recipe_build_docker() {
+ touch $BUILD_ROOT/etc/resolv.conf
+
+ base_image_path=$(find containers -regextype egrep -regex ".*\.(tgz|tar|tar\.xz|tar\.gz)$" -print -quit)
+ test -f "$base_image_path" || cleanup_and_exit 1 "base image not found"
+
+ if test "$BUILDENGINE" = "podman"; then
+ DOCKER_TOOL="podman"
+ if ! $BUILD_DIR/startdockerd --root "$BUILD_ROOT" --webserver-only "$TOPDIR/SOURCES/repos" ; then
+ cleanup_and_exit 1
+ fi
+ else
+ DOCKER_TOOL="docker"
+ if ! $BUILD_DIR/startdockerd --root "$BUILD_ROOT" --webserver "$TOPDIR/SOURCES/repos" ; then
+ cleanup_and_exit 1
+ fi
+ DOCKERD_STARTED=true
+ fi
+
+ cp $BUILD_DIR/obs-docker-support "$BUILD_ROOT/$TOPDIR/SOURCES/.obs-docker-support"
+ chmod 755 "$BUILD_ROOT/$TOPDIR/SOURCES/.obs-docker-support"
+
+ echo "Loading base image"
+ if test -L "$base_image_path" ; then
+ # copy into build root
+ cp -L "$base_image_path" "$base_image_path.lnk"
+ mv "$base_image_path.lnk" "$base_image_path"
+ fi
+
+ # Inspect the content of the image to decide if this is a layered image
+ # or a filesystem one. We need to know if we will "docker load" it or
+ # "docker import" it.
+ if tar -tf $base_image_path | grep "^manifest.json" -q; then
+ echo "Layered image found"
+ chroot $BUILD_ROOT $DOCKER_TOOL load --input $TOPDIR/SOURCES/$base_image_path
+ else
+ echo "Filesystem image found"
+ desired_tag=$(grep "^\s*FROM" "$RECIPEFILE" | cut -d" " -f2)
+ chroot $BUILD_ROOT $DOCKER_TOOL import $TOPDIR/SOURCES/$base_image_path "$desired_tag"
+ fi
+
+ # Prepare the package repository
+ if test -x $BUILD_ROOT/usr/bin/createrepo ; then
+ chroot $BUILD_ROOT createrepo "$TOPDIR/SOURCES/repos" >/dev/null
+ fi
+ if test -x $BUILD_ROOT/usr/bin/dpkg-scanpackages ; then
+ chroot $BUILD_ROOT bash -c "cd $TOPDIR/SOURCES/repos && dpkg-scanpackages -m . | gzip > Packages.gz"
+ fi
+
+ # Find tags
+ FIRSTTAG=
+ ALLTAGS=
+ for t in $(perl -I$BUILD_DIR -MBuild::Docker -e Build::Docker::showtags "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE") ; do
+ test -n "$FIRSTTAG" || FIRSTTAG="$t"
+ ALLTAGS="$ALLTAGS $t"
+ done
+ if test -z "$FIRSTTAG" -a -f TAG ; then
+ for t in $(egrep -v '^#' TAG) ; do
+ test -n "$FIRSTTAG" || FIRSTTAG="$t"
+ ALLTAGS="$ALLTAGS $t"
+ done
+ fi
+ if test -z "$FIRSTTAG" ; then
+ cleanup_and_exit 1 "please specify a tag for the container"
+ fi
+ ALLTAGS="${ALLTAGS# }"
+
+ tagargs=()
+ for t in $ALLTAGS; do
+ tagargs[${#tagargs[@]}]='-t'
+ tagargs[${#tagargs[@]}]="$t"
+ done
+
+ # patch in obs-docker-support helper
+ sed -i '/^[ ]*[fF][rR][oO][mM]/a COPY .obs-docker-support /usr/local/sbin/obs-docker-support\nRUN obs-docker-support --install' "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE"
+ echo >> $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE
+ if test -n "$(sed -ne '/^[ ]*[uU][sS][eE][rR][ ]/p' "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE")" ; then
+ sed -i '1,/^[ ]*[uU][sS][eE][rR][ ]/{
+/^[ ]*[uU][sS][eE][rR][ ]/i RUN obs-docker-support --uninstall
+}' "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE"
+ else
+ echo 'RUN obs-docker-support --uninstall' >> "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE"
+ fi
+ test -n "$DISTURL" && echo "LABEL org.openbuildservice.disturl=$DISTURL" >> "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE"
+
+ # now do the build
+ echo "Building image $ALLTAGS"
+ if ! chroot $BUILD_ROOT $DOCKER_TOOL build --network=host "${tagargs[@]}" -f "$TOPDIR/SOURCES/$RECIPEFILE" $TOPDIR/SOURCES/ ; then
+ cleanup_and_exit 1 "Docker build command failed"
+ fi
+
+ # Save the resulting image to a tarball. Use tag for generating the file name.
+ echo "Saving image $FIRSTTAG"
+ mkdir -p $BUILD_ROOT$TOPDIR/DOCKER
+ FILENAME="$FIRSTTAG"
+ FILENAME="${FILENAME//[\/:]/-}"
+ if ! chroot $BUILD_ROOT $DOCKER_TOOL save --output "$TOPDIR/DOCKER/$FILENAME.tar" "$FIRSTTAG" ; then
+ cleanup_and_exit 1 "Docker save command failed"
+ fi
+
+ # Create containerinfo
+ disturlarg=()
+ test -n "$DISTURL" && disturlarg=("--disturl" "$DISTURL")
+ perl -I$BUILD_DIR -MBuild::Docker -e Build::Docker::showcontainerinfo -- "${disturlarg[@]}" "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE" "$FILENAME.tar" "$ALLTAGS" containers/annotation> "$BUILD_ROOT$TOPDIR/DOCKER/$FILENAME.containerinfo"
+
+ # We're done. Clean up.
+ recipe_cleanup_docker
+ BUILD_SUCCEEDED=true
+}
+
+recipe_resultdirs_docker() {
+ echo DOCKER
+}
+
+recipe_cleanup_docker() {
+ if test -n "$DOCKERD_STARTED" ; then
+ test -n "$TOPDIR" && rm -f "$BUILD_ROOT/$TOPDIR/SOURCES/.obs-docker-support"
+ DOCKERD_STARTED=
+ $BUILD_DIR/startdockerd --root "$BUILD_ROOT" --kill
+ fi
+}
+
+# Local Variables:
+# mode: Shell-script
+# End:
diff --git a/build-recipe-dsc b/build-recipe-dsc
new file mode 100644
index 0000000..79cfc66
--- /dev/null
+++ b/build-recipe-dsc
@@ -0,0 +1,140 @@
+#
+# dsc specific functions.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+recipe_setup_dsc() {
+ TOPDIR=/usr/src/packages
+ test "$DO_INIT_TOPDIR" = false || 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
+ # remove rpm macros (everything after "%")
+ # they are not evaluated by the Debian build process
+ DEB_RELEASE=`sed 's/%.*$//' <<< $RELEASE`
+ OBS_DCH_RELEASE=""
+
+ if test -n "$DEB_TRANSFORM" ; then
+ CHANGELOGARGS=
+ test -n "$CHANGELOG" -a -f "$BUILD_ROOT/.build-changelog" && CHANGELOGARGS="--changelog $BUILD_ROOT/.build-changelog"
+ echo "Found files matching debian.*, running debian transformer..."
+ if [ "$RELEASE" ]; then
+ echo "release: ($RELEASE), release (DEB) ($DEB_RELEASE)"
+ RELEASEARGS="--release $DEB_RELEASE"
+ fi
+ if ! debtransform $CHANGELOGARGS $RELEASEARGS $BUILD_ROOT$TOPDIR/SOURCES $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE $BUILD_ROOT$TOPDIR/SOURCES.DEB ; then
+ cleanup_and_exit 1 "debian transforming failed."
+ 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
+
+ # Alternative to debtransform: apply OBS release number if tag OBS-DCH-RELEASE is set.
+ if test -z "$DEB_TRANSFORM" && grep -Eq '^OBS-DCH-RELEASE: 1' $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE; then
+ OBS_DCH_RELEASE="+$DEB_RELEASE"
+ chroot $BUILD_ROOT su -c /bin/sh <<EOF
+cd $TOPDIR/BUILD
+[ ! -f debian/changelog ] && exit 0
+# avoid devscripts dependency and mimic dch
+PACKAGE=\$(dpkg-parsechangelog 2> /dev/null | grep -E '^Source:' | awk '{ print \$NF }')
+VERSION=\$(dpkg-parsechangelog 2> /dev/null | grep -E '^Version:' | awk '{ print \$NF }')
+sed -i "s/\${PACKAGE} (\${VERSION})/\${PACKAGE} (\${VERSION}$OBS_DCH_RELEASE)/" debian/changelog
+EOF
+ fi
+
+}
+
+dsc_build() {
+ local buildroot=$1
+
+ DSC_BUILD_OPTIONS=
+ if test -n "$BUILD_JOBS" ; then
+ DSC_BUILD_OPTIONS="parallel=${BUILD_JOBS}"
+ fi
+ # 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
+ DSC_BUILD_CMD="$(queryconfig --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" substitute dsc:build_cmd)"
+ test -z "$DSC_BUILD_CMD" && DSC_BUILD_CMD="dpkg-buildpackage -us -uc"
+ if test -e $buildroot/$TOPDIR/SOURCES/build.script ; then
+ echo "Sourcing build.script to build - it should normally run 'dpkg-buildpackage -us -uc'"
+ DSC_BUILD_CMD="source $TOPDIR/SOURCES/build.script"
+ chmod +x $buildroot/$TOPDIR/SOURCES/build.script
+ fi
+
+ if test -n "$RUN_SHELL"; then
+ chroot $buildroot su -
+ else
+ chroot $buildroot su -c "export DEB_BUILD_OPTIONS=${DSC_BUILD_OPTIONS} ; cd $TOPDIR/BUILD && $DSC_BUILD_CMD" - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true
+ if test "$BUILD_SUCCEEDED" = true -a "$DO_CHECKS" != "false" && ( chroot $buildroot su -c "which lintian > /dev/null" - $BUILD_USER < /dev/null ); then
+ DEB_CHANGESFILE=${DEB_DSCFILE%.dsc}$OBS_DCH_RELEASE"_"$(chroot $buildroot su -c 'dpkg-architecture -qDEB_BUILD_ARCH')".changes"
+ chroot $buildroot su -c "cd $TOPDIR && echo Running lintian && (set -x && lintian -i $TOPDIR/$DEB_CHANGESFILE)" - $BUILD_USER < /dev/null || BUILD_SUCCEEDED=false
+ fi
+ fi
+}
+
+dsc_move_build_result() {
+ for DEB in $BUILD_ROOT/$TOPDIR/*.{deb,changes} ; 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_build_dsc() {
+ dsc_build "$BUILD_ROOT"
+ dsc_move_build_result
+}
+
+recipe_resultdirs_dsc() {
+ echo DEBS
+}
+
+recipe_cleanup_dsc() {
+ :
+}
diff --git a/build-recipe-fissile b/build-recipe-fissile
new file mode 100644
index 0000000..162fd4a
--- /dev/null
+++ b/build-recipe-fissile
@@ -0,0 +1,143 @@
+#################################################################
+#
+# Fissile specific functions.
+#
+# Author: Tim Hardeck (thardeck@suse.de), Dimitris Karakasilis (dkarakasilis@suse.com)
+#
+################################################################
+#
+# Copyright (c) 2017 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+DOCKERD_STARTED=
+
+recipe_setup_fissile() {
+ TOPDIR="/usr/src/packages"
+ mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES"
+ cp -R * $BUILD_ROOT$TOPDIR/SOURCES/
+}
+
+recipe_prepare_fissile() {
+ :
+}
+
+# Variables:
+# $BUILD_ROOT is the chroot
+# $TOPDIR/SOURCES includes the fissile sources
+# $TOPDIR/$DOCKERIMAGE_ROOT where docker will be called
+# $RECIPEFILE equals fissile.yml
+
+recipe_build_fissile() {
+ touch $BUILD_ROOT/etc/resolv.conf
+
+ docker_image_path=$(find containers -regextype egrep -regex ".*\.(tgz|tar|tar\.xz|tar\.gz)$" -print -quit)
+ test -f "$docker_image_path" || cleanup_and_exit 1 "docker image not found"
+
+ if ! $BUILD_DIR/startdockerd --root "$BUILD_ROOT"; then
+ cleanup_and_exit 1
+ fi
+ DOCKERD_STARTED=true
+
+ echo "Loading docker image"
+ if test -L "$docker_image_path" ; then
+ # copy into build root
+ cp -L "$docker_image_path" "$docker_image_path.lnk"
+ mv "$docker_image_path.lnk" "$docker_image_path"
+ fi
+
+ # Inspect the content of the image to decide if this is a layered image
+ # or a filesystem one. We need to know if we will "docker load" it or
+ # "docker import" it.
+ if tar -tf $docker_image_path | grep "^manifest.json" -q; then
+ echo "Layered image found"
+ chroot $BUILD_ROOT docker load --input $TOPDIR/SOURCES/$docker_image_path
+ else
+ # We allow more than one docker image dependencies so we can't map
+ # the tarballs to image names (in fissile.yml). Let it break if the
+ # images are not layered but consider some solution based on the tarball
+ # names (TODO)
+ cleanup_and_exit 1 "Docker images are not layered. No way to map to image name/tags."
+ fi
+
+ cd $BUILD_ROOT/$TOPDIR/SOURCES
+ # Extract the release directory.
+ if [ -f release.tar.xz ]; then
+ tar -xf release.tar.xz
+ else
+ cleanup_and_exit 1 "Couldn't find the release source tarball. Check your _service file if you use one."
+ fi
+
+ # Move cached bosh tarballs to the directory where fissile will look
+ export FISSILE_CACHE_DIR=/root/.bosh/cache/
+ mkdir -p $BUILD_ROOT$FISSILE_CACHE_DIR
+ find . -maxdepth 1 -regextype posix-egrep -regex '.{40,}' -exec cp -t $BUILD_ROOT$FISSILE_CACHE_DIR {} +
+
+ cd release
+ # Extract cached release ymls to their locations.
+ if [ -f ../yml-cache.tar.gz ]; then
+ tar -xf ../yml-cache.tar.gz
+ fi
+
+ # TODO: Remove this hackery when we use a later runc package (that already provides this symlink)
+ ln -fs /usr/sbin/runc $BUILD_ROOT/usr/bin/docker-runc
+
+ echo "Building packages with fissile"
+ if ! chroot $BUILD_ROOT /bin/bash -c "cd $TOPDIR/SOURCES/release && . .envrc && fissile build packages --docker-network-mode host"; then
+ cleanup_and_exit 1 "fissile build packages failed"
+ fi
+
+ echo "Building images with fissile"
+ if ! chroot $BUILD_ROOT /bin/bash -c "cd $TOPDIR/SOURCES/release && . .envrc && fissile build images"; then
+ cleanup_and_exit 1 "fissile build images failed"
+ fi
+
+ # Save the resulting images to tarballs.
+ mkdir -p $BUILD_ROOT$TOPDIR/FISSILE
+ non_built_images=$(perl -MYAML::XS -e "print join('|', @{YAML::XS::LoadFile('$BUILD_ROOT$TOPDIR/SOURCES/fissile.yml')->{'DockerImageDeps'}})")
+
+ for image in $(chroot $BUILD_ROOT docker images --format "{{.Repository}}:{{.Tag}}" | grep -v $non_built_images); do
+ echo "Saving image $image"
+ filename=$(echo $image | sed 's/\//_/g')
+ if ! chroot $BUILD_ROOT docker save --output "$TOPDIR/FISSILE/$filename.tar" "$image" ; then
+ cleanup_and_exit 1 "Docker save command failed"
+ fi
+ # Create containerinfo
+ disturlarg=()
+ test -n "$DISTURL" && disturlarg=("--disturl" "$DISTURL")
+ perl -I$BUILD_DIR -MBuild::Docker -e Build::Docker::showcontainerinfo -- "${disturlarg[@]}" '' "$filename.tar" "$image" containers/annotation> "$BUILD_ROOT$TOPDIR/FISSILE/$filename.containerinfo"
+ done
+
+ recipe_cleanup_fissile
+
+ BUILD_SUCCEEDED=true
+}
+
+recipe_resultdirs_fissile() {
+ echo FISSILE
+}
+
+recipe_cleanup_fissile() {
+ if test -n "$DOCKERD_STARTED" ; then
+ DOCKERD_STARTED=
+ $BUILD_DIR/startdockerd --root "$BUILD_ROOT" --kill
+ fi
+}
+
+# Local Variables:
+# mode: Shell-script
+# End:
diff --git a/build-recipe-kiwi b/build-recipe-kiwi
new file mode 100644
index 0000000..f3f5812
--- /dev/null
+++ b/build-recipe-kiwi
@@ -0,0 +1,738 @@
+#
+# KIWI specific functions. Handle with care.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+
+############################################################
+
+# post scriptlet generation functions for legacy bundling
+#
+# used for kiwi versions below 5.06.106 that do not support
+# a bundling method
+#
+
+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
+}
+
+legacy_image_bundle() {
+ # 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_setup_kiwi() {
+ TOPDIR=/usr/src/packages
+ test "$DO_INIT_TOPDIR" = false || 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/KIWI"
+ # compat, older build versions did not clean TOPDIR ...
+ mkdir -p "$BUILD_ROOT$TOPDIR/BUILD"
+ mkdir -p "$BUILD_ROOT$TOPDIR/RPMS"
+ mkdir -p "$BUILD_ROOT$TOPDIR/SRPMS"
+
+ 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
+ cleanup_and_exit 1 "source copy failed"
+ fi
+ fi
+
+ # extract macros from configuration
+ # some post scripts might call rpm-build and rely on the macros
+ queryconfig rawmacros --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" > $BUILD_ROOT/root/.rpmmacros
+}
+
+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
+}
+
+perform_product_bundle() {
+ pushd $BUILD_ROOT/$TOPDIR/KIWIROOT/main
+ for i in * ; do
+ test -e "$i" || continue
+ case $i in
+ *.iso) if [ -x /usr/bin/sha256sum ]; then
+ /usr/bin/sha256sum "$i" > "$i.sha256"
+ mv "$i.sha256" $BUILD_ROOT/$TOPDIR/KIWI/.
+ fi
+ 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
+ popd
+}
+
+build_kiwi_product() {
+ echo "running product builder..."
+ # 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"
+ if test -x "$BUILD_ROOT/usr/bin/product-builder"; then
+ # current implementation of product generation
+ chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/bin/product-builder --root $TOPDIR/KIWIROOT $VERBOSE_OPTION --logfile terminal --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true
+ else
+ # before openSUSE Leap 43 and SLE 13
+ 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
+ fi
+
+ # move created product to destination
+ # NOTE: older kiwi versions exit also in error case with 0
+ if test "$BUILD_SUCCEEDED" = true ; then
+ perform_product_bundle
+ fi
+}
+
+perform_image_build() {
+ local imgtype=$1
+ local profile=$2
+
+ # When people test mixed build with legacy and new kiwi version
+ # the zypper cache was used in different ways. Therefore this
+ # needs a cleanup before the build starts
+ if test -d "$BUILD_ROOT/var/cache/kiwi/zypper" ; then
+ echo "cleaning up zypper image build cache"
+ rm -rf $BUILD_ROOT/var/cache/kiwi/zypper
+ fi
+
+ # Do not use $BUILD_USER here, since we always need root permissions
+
+ if test "$kiwi_legacy" = true ; then
+ # old kiwi, do a prepare and a create call
+ local prepare_call
+ echo "running kiwi prepare for $imgtype${profile:+, profile $profile}..."
+ prepare_call="cd $TOPDIR/SOURCES && rm -rf $TOPDIR/KIWIROOT-$imgtype"
+ prepare_call="$prepare_call && $kiwi_path --logfile terminal"
+ prepare_call="$prepare_call --prepare $TOPDIR/SOURCES"
+ prepare_call="$prepare_call --root $TOPDIR/KIWIROOT-$imgtype"
+ test -n "$profile" && prepare_call="$prepare_call --add-profile $profile"
+ prepare_call="$prepare_call $KIWI_PARAMETERS"
+ echo "$prepare_call"
+ chroot $BUILD_ROOT su -c "$prepare_call" - root </dev/null || cleanup_and_exit 1
+ mkdir -p $BUILD_ROOT/$TOPDIR/KIWI-$imgtype
+ echo "running kiwi create for $imgtype${profile:+, profile $profile}..."
+ local create_call
+ create_call="cd $TOPDIR/SOURCES"
+ create_call="$create_call && $kiwi_path --logfile terminal"
+ create_call="$create_call --create $TOPDIR/KIWIROOT-$imgtype"
+ create_call="$create_call --type $imgtype"
+ create_call="$create_call -d $TOPDIR/KIWI-$imgtype"
+ test -n "$profile" && create_call="$create_call --add-profile $profile"
+ create_call="$create_call $KIWI_PARAMETERS"
+ echo "$create_call"
+ chroot $BUILD_ROOT su -c "$create_call" - root < /dev/null || cleanup_and_exit 1
+ else
+ # new kiwi, do a "system build" call
+ mkdir -p $BUILD_ROOT/$TOPDIR/KIWI-$imgtype
+ local build_call
+ echo "running kiwi system build for $imgtype${profile:+, profile $profile}..."
+ build_call="cd $TOPDIR/SOURCES && rm -rf $TOPDIR/KIWI-$imgtype"
+ build_call="$build_call && LANG=en_US.UTF-8 $kiwi_path --debug $KIWI_MAIN_PARAMETERS"
+ test -n "$profile" && build_call="$build_call --profile $profile"
+ build_call="$build_call system build --description $TOPDIR/SOURCES --target-dir $TOPDIR/KIWI-$imgtype"
+ build_call="$build_call $KIWI_BUILD_PARAMETERS"
+ echo "$build_call"
+ chroot $BUILD_ROOT su -c "$build_call" - root < /dev/null || cleanup_and_exit 1
+ # ceate compat link
+ ln -sf "KIWI-$imgtype/build/image-root" "$BUILD_ROOT/$TOPDIR/KIWIROOT-$imgtype"
+ fi
+}
+
+perform_image_bundle() {
+ local imgtype=$1
+ local profile=$2
+ local bundle_call
+
+ local bundle_id="Build$RELEASE"
+ test -n "$profile" && bundle_id="${profile}-$bundle_id"
+
+ rm -rf "/$TOPDIR/KIWI.bundle"
+ if test "$kiwi_legacy" = true ; then
+ bundle_call="$kiwi_path --bundle-build $TOPDIR/KIWI-$imgtype"
+ bundle_call="$bundle_call -d /$TOPDIR/KIWI.bundle/"
+ bundle_call="$bundle_call --bundle-id $bundle_id"
+ else
+ bundle_call="LANG=en_US.UTF-8 $kiwi_path result bundle --target-dir $TOPDIR/KIWI-$imgtype"
+ bundle_call="$bundle_call --id $bundle_id"
+ bundle_call="$bundle_call --bundle-dir /$TOPDIR/KIWI.bundle/"
+ bundle_call="$bundle_call $KIWI_BUNDLE_PARAMETERS"
+ fi
+ echo "$bundle_call"
+ if chroot $BUILD_ROOT su -c "$bundle_call" - root < /dev/null; then
+ mv "$BUILD_ROOT/$TOPDIR/KIWI.bundle/"* "$BUILD_ROOT/$TOPDIR/KIWI/" || cleanup_and_exit 1
+ rmdir "$BUILD_ROOT/$TOPDIR/KIWI.bundle"
+ return 0 # success
+ fi
+ # need another way to bundle
+ return 1
+}
+
+# translate kiwi8 parameters to kiwi9
+kiwi_translate_parameters() {
+ local i lasti
+ local add_repo_url=() add_repo_type=() add_repo_alias=() add_repo_priority=()
+ local set_repo_url set_repo_type set_repo_alias set_repo_priority
+
+ # return values
+ KIWI_MAIN_PARAMETERS=
+ KIWI_BUILD_PARAMETERS=
+ KIWI_BUNDLE_PARAMETERS=
+ for i in $KIWI_PARAMETERS ; do
+ if test -n "$lasti" ; then
+ i="$lasti=$i"
+ lasti=
+ fi
+ case "$i" in
+ --add-profile|-t|--type|-l|--logfile|-d|--dest-dir|--root|--add-repo|--add-repoalias|--add-repoprio|--add-repopriority|--add-repotype|--set-repo|--set-repoalias|--set-repoprio|--set-repopriority|--set-repotype)
+ lasti="$i"
+ ;;
+ esac
+ test -n "$lasti" && continue
+ case "$i" in
+ --version|--debug) KIWI_MAIN_PARAMETERS="$KIWI_MAIN_PARAMETERS $i" ;;
+ --add-profile=*) KIWI_MAIN_PARAMETERS="$KIWI_MAIN_PARAMETERS --profile ${i#*=}" ;;
+ -t=|--type=*) KIWI_MAIN_PARAMETERS="$KIWI_MAIN_PARAMETERS --type ${i#*=}" ;;
+ -l=|--logfile=*) KIWI_MAIN_PARAMETERS="$KIWI_MAIN_PARAMETERS --logfile ${i#*=}" ;;
+ -d=*|--dest-dir=*) KIWI_BUILD_PARAMETERS="$KIWI_BUILD_PARAMETERS --target-dir ${i#*=}" ;;
+ --root=*) echo "WARNING: ignored unsupported kiwi option $i" ;; # unsupported for system build...
+ --ignore-repos) KIWI_BUILD_PARAMETERS="$KIWI_BUILD_PARAMETERS --ignore-repos-used-for-build" ;;
+ --recycle-root) KIWI_BUILD_PARAMETERS="$KIWI_BUILD_PARAMETERS --allow-existing-root" ;;
+ --add-repo=*) add_repo_url[${#add_repo_url[@]}]="${i#*=}" ;;
+ --add-repotype=*) add_repo_type[${#add_repo_type[@]}]="${i#*=}" ;;
+ --add-repoalias=*) add_repo_alias[${#add_repo_alias[@]}]="${i#*=}" ;;
+ --add-repopriority=*|--add-repoprio=*) add_repo_priority[${#add_repo_priority[@]}]="${i#*=}" ;;
+ --set-repo=*) set_repo_url="${i#*=}" ;;
+ --set-repotype=*) set_repo_type="${i#*=}" ;;
+ --set-repoalias=*) set_repo_alias="${i#*=}" ;;
+ --set-repopriority=*|--set-repoprio=*) set_repo_priority="${i#*=}" ;;
+ --main:*) KIWI_MAIN_PARAMETERS="$KIWI_MAIN_PARAMETERS --${i#--main:}" ;;
+ --bundle:*) KIWI_BUNDLE_PARAMETERS="$KIWI_BUNDLE_PARAMETERS --${i#--bundle:}" ;;
+ --set-container-derived-from=dir://./containers/*.tar)
+ # old kiwi 9 versions cannot handle uncompressed containers
+ if test -f "$BUILD_ROOT/$TOPDIR/SOURCES/containers/${i#*containers/}" ; then
+ gzip -f -1 < "$BUILD_ROOT/$TOPDIR/SOURCES/containers/${i#*containers/}" > "$BUILD_ROOT/$TOPDIR/SOURCES/containers/${i#*containers/}.gz" || cleanup_and_exit 1 "container compression"
+ i="$i.gz"
+ fi
+ KIWI_BUILD_PARAMETERS="$KIWI_BUILD_PARAMETERS $i"
+ ;;
+ # everything else just gues through to kiwi build
+ *) KIWI_BUILD_PARAMETERS="$KIWI_BUILD_PARAMETERS $i" ;;
+ esac
+ done
+ # now add the repo options
+ lasti=0
+ for i in "${add_repo_url[@]}" ; do
+ local repo_prio="${add_repo_priority[$lasti]}"
+ test -z "$repo_prio" && repo_prio=99
+ KIWI_BUILD_PARAMETERS="$KIWI_BUILD_PARAMETERS --add-repo $i,${add_repo_type[$lasti]},${add_repo_alias[$lasti]},$repo_prio"
+ let lasti++
+ done
+ if test -n "$set_repo_url" ; then
+ test -z "$set_repo_priority" && set_repo_priority=99
+ KIWI_BUILD_PARAMETERS="$KIWI_BUILD_PARAMETERS --set-repo $set_repo_url,$set_repo_type,$set_repo_alias,$set_repo_priority"
+ fi
+}
+
+kiwi_query_recipe() {
+ perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE" "$1" "${BUILD_ARCH%%:*}" "$BUILD_FLAVOR"
+}
+
+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
+ local kiwi_profile
+ kiwi_profile=$(kiwi_query_recipe profiles)
+ if test -z "$kiwi_profile"; then
+ kiwi_profile=$(queryconfig \
+ --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" \
+ --archpath "$BUILD_ARCH" buildflags kiwiprofile
+ )
+ fi
+ if test -z "$kiwi_profile"; then
+ kiwi_profile=__not__set
+ fi
+ if test "$kiwi_profile" = __excluded ; then
+ cleanup_and_exit 1 "none of the selected profiles can be built on this architecture"
+ fi
+
+ local kiwi_path=/usr/bin/kiwi kiwi_legacy=false
+ if ! test -L "$BUILD_ROOT/usr/bin/kiwi" ; then
+ kiwi_path=/usr/sbin/kiwi
+ kiwi_legacy=true
+ fi
+
+ if test "$kiwi_legacy" != true ; then
+ kiwi_translate_parameters
+ fi
+
+ local run_bundle=true
+ for imgtype in $imagetype ; do
+ for prof in ${kiwi_profile//,/ } ; do
+ test "$prof" = __not__set && prof=
+ perform_image_build $imgtype $prof
+ if perform_image_bundle $imgtype $prof ; then
+ # bundling successful, skip legacy bundler
+ run_bundle=
+ fi
+ done
+ done
+ BUILD_SUCCEEDED=true
+
+ if test -n "$run_bundle"; then
+ # results are not bundled yet
+ legacy_image_bundle
+ fi
+}
+
+postprocess_kiwi_containers() {
+ local r
+
+ # uncompress containers, the compression is useless and just slows down further processing
+ for r in $BUILD_ROOT/$TOPDIR/KIWI/*.tar.xz ; do
+ test -e "$r" || continue
+ r="${r%.xz}"
+ xzdec <"$r.xz" >"$r" || cleanup_and_exit 1 "xzdec failed"
+ if test -e "$r.xz.sha256" ; then
+ # also generate sha256sum
+ (cd "$BUILD_ROOT/$TOPDIR/KIWI" && sha256sum "${r##*/}") > "$r.sha256"
+ fi
+ rm -f "$r.xz" "$r.xz.sha256"
+ done
+
+ # create container info
+ local disturlarg=()
+ test -n "$DISTURL" && disturlarg=("--disturl" "$DISTURL")
+ for r in $BUILD_ROOT/$TOPDIR/KIWI/*.tar ; do
+ test -e "$r" && perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::showcontainerinfo -- "${disturlarg[@]}" --arch "${BUILD_ARCH%%:*}" --buildflavor "$BUILD_FLAVOR" $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE "$r" > "${r%.tar}.containerinfo"
+ test -s "${r%.tar}.containerinfo" || rm -f "${r%.tar}.containerinfo"
+ done
+}
+
+recipe_build_kiwi() {
+ imagetype=$(kiwi_query_recipe imagetype)
+ imagename=$(kiwi_query_recipe filename)
+ imageversion=$(kiwi_query_recipe version)
+ drop_repo=$(kiwi_query_recipe drop_repository)
+
+ if test -z "$imagetype" ; then
+ cleanup_and_exit 1 "no imagetype set for this architecture/profile"
+ fi
+
+ # prepare rpms as source and createrepo on the repositories
+ ln -sf $TOPDIR/SOURCES/repos $BUILD_ROOT/repos
+ test -d $BUILD_ROOT/$TOPDIR/SOURCES/containers && ln -sf $TOPDIR/SOURCES/containers $BUILD_ROOT/containers
+ 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
+ if ! chroot $BUILD_ROOT su -c /usr/lib/build/kiwi_post_run ; then
+ cleanup_and_exit 1 "/usr/lib/build/kiwi_post_run script failed!"
+ fi
+ fi
+
+ # postprocess docker images (but not for legacy kiwi)
+ if test -L "$BUILD_ROOT/usr/bin/kiwi" ; then
+ for imgtype in $imagetype ; do
+ if test "$imgtype" = docker ; then
+ postprocess_kiwi_containers
+ break
+ fi
+ done
+ fi
+}
+
+recipe_resultdirs_kiwi() {
+ echo KIWI
+}
+
+recipe_cleanup_kiwi() {
+ :
+}
diff --git a/build-recipe-livebuild b/build-recipe-livebuild
new file mode 100644
index 0000000..db5192d
--- /dev/null
+++ b/build-recipe-livebuild
@@ -0,0 +1,280 @@
+#################################################################
+#
+# Debian live-build specific functions.
+#
+# Copyright (c) 2014,2015 Brocade Communications Systems, Inc.
+# Author: Jan Blunck <jblunck@infradead.org>
+#
+# This file is part of build.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+#################################################################
+
+recipe_setup_livebuild() {
+ TOPDIR=/usr/src/packages
+ test "$DO_INIT_TOPDIR" = false || 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}
+
+ # 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
+
+ # Only add symlinks after running dpkg-scanpackages to avoid
+ # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=809219, which is at
+ # least present in the Ubuntu xenial version of dpkg
+ # Suite is symlinked to Codename
+ ln -s ${DIST} dists/stable
+
+ # 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
+
+ # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=845651
+ # For our use case it makes sense to always return the testing codename,
+ # as creating a dependency on live-build-desc-sid would not make sense. In
+ # the example cited in the above bug, the metadata for sid would be incorrect
+ # anyway, and we would want the ones for potato.
+ if test "${DIST}" = "n/a" ; then
+ DIST=$(chroot $BUILD_ROOT su -c "sed 's/\(.*\)\/.*/\1/' /etc/debian_version")
+ fi
+
+ 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"
+ LIVE_IMAGE_NAME="${RECIPEFILE%.livebuild}"
+ 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/*.chroot)
+ if [ ${#files[@]} -gt 0 ]; then
+ cleanup_and_exit 1 "E: No configuration in config/archives/*.chroot allowed"
+ fi
+
+ # 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 \
+ "export RECIPEFILE=${RECIPEFILE}; /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 \
+ "export RECIPEFILE=${RECIPEFILE}; /.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
+
+ # extract build result basenames
+ local build_results=""
+ for i in $BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/* ; do
+ test -f "$i" || continue
+ case "${i##*/}" in
+ *.hybrid.iso)
+ build_results="${build_results}\n${i%%.hybrid.iso}"
+ ;;
+ *.iso)
+ build_results="${build_results}\n${i%%.iso}"
+ ;;
+ *ONIE.bin)
+ build_results="${build_results}\n${i%%ONIE.bin}"
+ ;;
+ *.img)
+ build_results="${build_results}\n${i%%.img}"
+ ;;
+ *.netboot.tar*)
+ build_results="${build_results}\n${i%%.netboot.tar*}"
+ ;;
+ *.tar*)
+ build_results="${build_results}\n${i%%.tar*}"
+ ;;
+ *)
+ ;;
+ esac
+ done
+
+ # Fail the build if no build results are found
+ if [ -z "${build_results}" ] ; then
+ cleanup_and_exit 1 "No live-build result found"
+ fi
+
+ # move created products (and their metadata files) to destination and
+ # create sha256 hashsums
+ local buildnum="${RELEASE:+-Build${RELEASE}}"
+ for prefix in $(echo -e ${build_results} | sort | uniq) ; do
+ for f in ${prefix}.* ; do
+ mv ${f} \
+ $BUILD_ROOT/$TOPDIR/OTHER/${prefix##*/}${buildnum}${f#${prefix}}
+ # change directory to avoid having full path in hashsum file
+ pushd $BUILD_ROOT/$TOPDIR/OTHER >/dev/null
+ /usr/bin/sha256sum "${prefix##*/}${buildnum}${f#${prefix}}" > \
+ "${prefix##*/}${buildnum}${f#${prefix}}".sha256
+ popd >/dev/null
+ BUILD_SUCCEEDED=true
+ done
+ done
+
+ # copy recipe source tarball so that it can be published
+ cp "$BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE" \
+ "$BUILD_ROOT/$TOPDIR/OTHER/${RECIPEFILE%.livebuild}${buildnum}".livebuild.tar
+}
+
+recipe_resultdirs_livebuild() {
+ # our results are already in OTHER
+ :
+}
+
+recipe_cleanup_livebuild() {
+ :
+}
+
+# Local Variables:
+# mode: Shell-script
+# End:
diff --git a/build-recipe-mock b/build-recipe-mock
new file mode 100644
index 0000000..f0b94b8
--- /dev/null
+++ b/build-recipe-mock
@@ -0,0 +1,104 @@
+#
+# mock specific functions.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+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
+}
+
+recipe_cleanup_mock() {
+ echo RPMS SRPMS
+}
+
diff --git a/build-recipe-podman b/build-recipe-podman
new file mode 100644
index 0000000..1f26670
--- /dev/null
+++ b/build-recipe-podman
@@ -0,0 +1,51 @@
+#
+# podman specific functions, wrapper around build_recipe_docker
+#
+################################################################
+#
+# Copyright (c) 2015 SUSE Linux GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+recipe_setup_podman() {
+ recipe_setup_docker "$@"
+}
+
+recipe_prepare_podman() {
+ recipe_prepare_docker "$@"
+}
+
+recipe_build_podman() {
+ # podman refuses : in directories
+ find containers -type d -a -name '*:*' | while read i; do
+ mv "$i" "${i//:/_}"
+ done
+ # and filenames
+ find containers -type f -a -name '*:*' | while read i; do
+ mv "$i" "${i//:/_}"
+ done
+ recipe_build_docker "$@"
+}
+
+recipe_resultdirs_podman() {
+ recipe_resultdirs_docker "$@"
+}
+
+recipe_cleanup_podman() {
+ recipe_cleanup_docker "$@"
+}
+
diff --git a/build-recipe-preinstallimage b/build-recipe-preinstallimage
new file mode 100644
index 0000000..a8b078a
--- /dev/null
+++ b/build-recipe-preinstallimage
@@ -0,0 +1,84 @@
+#
+# preinstall specific functions.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+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.hostarch.*) ;; # 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() {
+ :
+}
+
+recipe_cleanup_preinstallimage() {
+ :
+}
+
diff --git a/build-recipe-simpleimage b/build-recipe-simpleimage
new file mode 100644
index 0000000..39003c7
--- /dev/null
+++ b/build-recipe-simpleimage
@@ -0,0 +1,112 @@
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+recipe_setup_simpleimage() {
+ 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_simpleimage() {
+ BUILD_USER="root"
+}
+
+recipe_build_simpleimage() {
+ TOPDIR=/usr/src/packages
+
+ echo "creating simple image..."
+ cd $BUILD_ROOT || cleanup_and_exit 1
+ export SRCDIR="$TOPDIR/SOURCES"
+
+ NAME="`sed -n 's|Name:[[:blank:]]*||p' $BUILD_ROOT$TOPDIR/SOURCES/simpleimage`"
+ [ -n "$NAME" ] || NAME="simpleimage"
+ VERSION="`sed -n 's|Version:[[:blank:]]*||p' $BUILD_ROOT$TOPDIR/SOURCES/simpleimage`"
+ [ -n "$VERSION" ] || VERSION="`date -u +%y.%m.%d-%H.%M.%S`"
+
+ SHELL="/bin/sh"
+ [ -x $BUILD_ROOT/bin/bash ] && SHELL="/bin/bash"
+ if [ "`grep '^%build$' $BUILD_ROOT$TOPDIR/SOURCES/simpleimage`" ]; then
+ echo "Running integration script..."
+ sed -n '/%build/,$ p' $BUILD_ROOT$TOPDIR/SOURCES/simpleimage | tail -n +2 | chroot $BUILD_ROOT $SHELL -x || cleanup_and_exit 1
+ echo "Integration script finished."
+ fi
+
+ echo "Compresing the final image, this can take a while..."
+ echo
+ 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 ;;
+ .simpleimage*) continue ;;
+ .srcfiles*) continue ;;
+ .pkgs) continue ;;
+ .rpm-cache) continue ;;
+ .tmp) continue ;;
+ installed-pkg) continue ;;
+ proc|sys) continue ;;
+ esac
+ TOPDIRS="$TOPDIRS $DIR"
+ done
+ rm -rf "$BUILD_ROOT$TOPDIR"
+ mkdir -p .tmp/{proc,sys}
+ if ! $TAR -cvzf .simpleimage.tar.gz --one-file-system $TOPDIRS -C .tmp proc sys; then
+ cleanup_and_exit 1
+ fi
+ if [ -x "`which mksquashfs 2> /dev/null`" ]; then
+ echo
+ echo "Tarball done, creating squashfs image as well"
+ echo
+ mksquashfs $TOPDIRS .tmp/proc .tmp/sys .simpleimage.squashfs -info -keep-as-directory -no-progress || cleanup_and_exit 1
+ fi
+ echo "simple image created."
+
+ DEST="$BUILD_ROOT$TOPDIR/OTHER"
+ mkdir -p "$DEST"
+ mv $BUILD_ROOT/.simpleimage.tar.gz $DEST/$NAME-${VERSION}_${BUILD_ARCH%%:*}.tar.gz
+ if [ -r .simpleimage.squashfs ]; then
+ mv $BUILD_ROOT/.simpleimage.squashfs $DEST/$NAME-${VERSION}_${BUILD_ARCH%%:*}.squashfs
+ fi
+ rm -f $BUILD_ROOT/.build.packages
+ ln -s ${TOPDIR#/} $BUILD_ROOT/.build.packages
+ test -d "$SRCDIR" && cd "$SRCDIR"
+ cleanup_and_exit
+}
+
+recipe_resultdirs_simpleimage() {
+ :
+}
+
+recipe_cleanup_simpleimage() {
+ :
+}
+
diff --git a/build-recipe-snapcraft b/build-recipe-snapcraft
new file mode 100644
index 0000000..1cebeb8
--- /dev/null
+++ b/build-recipe-snapcraft
@@ -0,0 +1,130 @@
+#################################################################
+#
+# snapcraft specific functions.
+#
+# Author: Adrian Schroeter <adrian@suse.de>
+#
+################################################################
+#
+# Copyright (c) 2016 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+recipe_setup_snapcraft() {
+ TOPDIR=/usr/src/packages
+ test "$DO_INIT_TOPDIR" = false || rm -rf "$BUILD_ROOT$TOPDIR"
+ for i in OTHER SOURCES SNAPCRAFT_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_snapcraft() {
+ :
+}
+
+collect_prebuild_parts() {
+
+ mkdir -p $BUILD_ROOT/root/.local/share/snapcraft/
+ rm -f $BUILD_ROOT/root/.local/share/snapcraft/parts.yaml
+ for part in $BUILD_ROOT/.build.snap_parts/*; do
+ if [ -e "$part" ]; then
+ cat "$part/part.yaml" >> \
+ $BUILD_ROOT/root/.local/share/snapcraft/parts.yaml
+ fi
+ done
+}
+
+# This script expects that the $BUILD_ROOT is a Debian installation with
+# snapcraft already installed!
+#
+# Variables:
+# $BUILD_ROOT the Debian chroot
+# $TOPDIR/SOURCES includes the snapcraft sources
+# $TOPDIR/$SNAPCRAFT_ROOT where snapcraft will be called
+# $RECIPEFILE the name of the snapcraft.yaml config file
+
+recipe_build_snapcraft() {
+ local ARCH=$(chroot $BUILD_ROOT su -c "dpkg-architecture -qDEB_BUILD_ARCH")
+ local DIST="OBS"
+ local SNAPCRAFT_ROOT="SNAPCRAFT_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}
+ # setup /etc/apt/sources.list
+ mkdir -p "$BUILD_ROOT/etc/apt"
+ echo "deb [trusted=yes] file:/.build.binaries OBS main" >> "$BUILD_ROOT/etc/apt/sources.list"
+ fi
+
+ collect_prebuild_parts
+
+ chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && snapcraft pull" - root \
+ || cleanup_and_exit 1
+ chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && snapcraft build" - root \
+ || cleanup_and_exit 1
+ chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && snapcraft snap" - root \
+ || cleanup_and_exit 1
+
+ # extract build result basenames
+ local build_results=""
+ for i in $BUILD_ROOT/$TOPDIR/SOURCES/* ; do
+ test -f "$i" || continue
+ case "${i##*/}" in
+ *.snap)
+ build_results="${build_results}\n${i%%.snap}"
+ ;;
+ *)
+ ;;
+ esac
+ done
+
+ # Fail the build if no build results are found
+ if [ -z "${build_results}" ] ; then
+ cleanup_and_exit 1 "No live-build result found"
+ fi
+
+ # move created products (and their metadata files) to destination
+ local buildnum="${RELEASE:+-Build${RELEASE}}"
+ for prefix in $(echo -e ${build_results} | sort | uniq) ; do
+ for f in ${prefix}.* ; do
+ mv ${f} \
+ $BUILD_ROOT/$TOPDIR/OTHER/${prefix##*/}${buildnum}${f#${prefix}}
+ BUILD_SUCCEEDED=true
+ done
+ done
+}
+
+recipe_resultdirs_snapcraft() {
+ :
+}
+
+recipe_cleanup_snapcraft() {
+ :
+}
+
+# Local Variables:
+# mode: Shell-script
+# End:
diff --git a/build-recipe-spec b/build-recipe-spec
new file mode 100644
index 0000000..ff74e8f
--- /dev/null
+++ b/build-recipe-spec
@@ -0,0 +1,256 @@
+#
+# spec specific functions.
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+recipe_setup_spec() {
+ TOPDIR=`chroot $BUILD_ROOT su -c "rpm --eval '%_topdir'" - $BUILD_USER`
+ if test -z "$TOPDIR"; then
+ cleanup_and_exit 1 "Error: TOPDIR empty"
+ fi
+ test "$DO_INIT_TOPDIR" = false || 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() {
+ # fixup specfile
+ args=()
+ if test -n "$RELEASE" ; then
+ args[${#args[@]}]="--release"
+ args[${#args[@]}]="$RELEASE"
+ fi
+ if test -n "$BUILD_FLAVOR" ; then
+ args[${#args[@]}]="--buildflavor"
+ args[${#args[@]}]="$BUILD_FLAVOR"
+ fi
+ if test -n "$OBS_PACKAGE" ; then
+ args[${#args[@]}]="--obspackage"
+ args[${#args[@]}]="$OBS_PACKAGE"
+ fi
+ if test -n "$CHANGELOG" -a -f "$BUILD_ROOT/.build-changelog" ; then
+ args[${#args[@]}]="--changelog"
+ args[${#args[@]}]="$BUILD_ROOT/.build-changelog"
+ fi
+
+ substitutedeps "${args[@]}" --root "$BUILD_ROOT" --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" "$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
+ rawcfgmacros=.rpmmacros
+ test "$BUILDTYPE" = debbuild && rawcfgmacros=.debmacros
+ queryconfig rawmacros --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" > $BUILD_ROOT/root/$rawcfgmacros
+ if test -n "$BUILD_DEBUG" && test "$BUILDTYPE" != debbuild ; 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/$rawcfgmacros
+ fi
+
+ if test -n "$BUILD_JOBS" ; then
+ cat >> $BUILD_ROOT/root/$rawcfgmacros <<-EOF
+ %jobs $BUILD_JOBS
+ %_smp_mflags -j$BUILD_JOBS
+ EOF
+ fi
+ test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/$rawcfgmacros $BUILD_ROOT/home/abuild/$rawcfgmacros
+
+ # 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
+ test "$BUILDTYPE" = debbuild && rpmbuild=debbuild
+
+ # XXX: move _srcdefattr to macro file?
+ rpmbopts=("$BUILD_RPM_BUILD_STAGE" "--define" "_srcdefattr (-,root,root)")
+ if test "$DO_CHECKS" != true ; then
+ if chroot "$BUILD_ROOT" "$rpmbuild" --nocheck --help >/dev/null 2>&1; then
+ rpmbopts[${#rpmbopts[@]}]="--nocheck"
+ else
+ echo "warning: --nocheck is not supported by this $rpmbuild version"
+ fi
+ 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
+
+ buildrootoverride=$(queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" buildflags rpm-buildroot-override)
+ if test -n "$buildrootoverride" ; then
+ rpmbopts[${#rpmbopts[@]}]='--buildroot'
+ rpmbopts[${#rpmbopts[@]}]="$buildrootoverride"
+ 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_cleanup_spec() {
+ :
+}
+
+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 || {
+ cleanup_and_exit 1 "could not unpack $RECIPEFILE."
+ }
+ 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
+ cleanup_and_exit 1 "please fix your filelist (e.g. add defattr)"
+ 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
+ chroot $BUILD_ROOT su -s /opt/testing/bin/rpmlint "$BUILD_USER" -- \
+ --info ${LINT_RPM_FILE_LIST[*]#$BUILD_ROOT} \
+ ${SRPM_FILE_LIST[*]#$BUILD_ROOT} > >(tee "$BUILD_ROOT$rpmlint_logfile") 2>&1 || ret=1
+ echo
+ 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"
+ 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
+ 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-validate-params b/build-validate-params
new file mode 100644
index 0000000..27027bb
--- /dev/null
+++ b/build-validate-params
@@ -0,0 +1,103 @@
+#
+# parameter validation functions
+#
+################################################################
+#
+# Copyright (c) 2016 SUSE LLC
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+validate_param=()
+validate_buildroot=()
+
+validate_init() {
+ local cf="$1"
+ if ! test -f "$cf" ; then
+ return
+ fi
+ local _key _flag _arg
+ while read _key _flag _arg; do
+ case $_key in
+ \#* | '')
+ continue ;;
+ ALLOW_PARAM:)
+ validate_param[${#validate_param[@]}]="${_flag#--} $_arg"
+ ;;
+ ALLOW_BUILD_ROOT:)
+ validate_buildroot[${#validate_buildroot[@]}]="$_flag"
+ ;;
+ *)
+ cleanup_and_exit 1 "unknown directive in $cf: $_key"
+ ;;
+ esac
+ done < "$cf"
+}
+
+validate_param() {
+ local param="$1"
+ local arg="$2"
+ local envvar="$3"
+
+ if test ${#validate_param[@]} -eq 0 ; then
+ return
+ fi
+ param=${param#-}
+ param=${param#-}
+ local t ok=
+ for t in "${validate_param[@]}" ; do
+ local targ="${t#$param }"
+ if test "$t" != "$targ" ; then
+ if test -z "$targ" -o "$targ" == "$arg" ; then
+ ok=true
+ break
+ fi
+ fi
+ done
+ if test -z "$ok" ; then
+ if test -n "$envvar" ; then
+ cleanup_and_exit 1 "build: environment variable $envvar=$arg not allowed"
+ else
+ cleanup_and_exit 1 "build: parameter --$param $arg not allowed"
+ fi
+ fi
+}
+
+validate_buildroot() {
+ local br="$1"
+
+ if test ${#validate_buildroot[@]} -eq 0 ; then
+ return
+ fi
+ local user=${SUDO_USER:-$USER}
+ local t ok= error="Build root $br not allowed for user $user"
+ for t in "${validate_buildroot[@]}" ; do
+ t=${t//\%user/$user}
+ t=$(readlink -m "$t")
+ if [[ "$br" == $t ]] ; then
+ local tp=$(readlink -m "${t%/*}")
+ if test -d "$tp" ; then
+ ok=true
+ break
+ fi
+ error="Directory $tp does not exist"
+ fi
+ done
+ if test -z "$ok" ; then
+ cleanup_and_exit 1 "$error"
+ fi
+}
+
diff --git a/build-vm b/build-vm
new file mode 100644
index 0000000..a82605c
--- /dev/null
+++ b/build-vm
@@ -0,0 +1,1051 @@
+#
+# VM specific functions for the build script
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+# 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'
+# ignore not backward compatible ext fs options like metadata_csum
+# Only protecting nonroot from root inside guest -> but anyone can be root inside guest
+# so disabling spectre/meltdown mitigations doesn't hurt security and gains performance
+vm_linux_kernel_parameter="ext4.allow_unsupported=1 kpti=off pti=off spectre_v2=off"
+
+# guest visible devices
+VM_ROOTDEV=/dev/hda1
+VM_SWAPDEV=/dev/hda2
+
+VM_TYPE=
+VM_ROOT=
+VM_SWAP=
+VM_ROOT_TYPE=
+VM_SWAP_TYPE=
+VM_KERNEL=
+VM_INITRD=
+VM_WORKER=
+VM_SERVER=
+VM_MEMSIZE=
+VM_NETOPT=()
+VM_NETDEVOPT=()
+VM_DEVICEOPT=()
+VM_TELNET=
+VM_CONSOLE_INPUT=
+VM_USER=
+VMDISK_ROOTSIZE=4096
+VMDISK_SWAPSIZE=1024
+VMDISK_FILESYSTEM=
+VMDISK_MOUNT_OPTIONS=__default
+VMDISK_CLEAN=
+VM_HOSTNAME=
+
+# zvm specific?
+VM_WORKER_NO=
+
+# kvm specific?
+HUGETLBFSPATH=
+VM_CUSTOMOPT=
+
+# emulator specific?
+EMULATOR_SCRIPT=
+
+# openstack specific
+VM_OPENSTACK_FLAVOR=
+
+for i in ec2 emulator kvm lxc openstack qemu uml xen zvm docker pvm; do
+ . "$BUILD_DIR/build-vm-$i"
+done
+
+VM_WATCHDOG=
+VM_WATCHDOG_PID=
+
+# the following functions just call the corresponding vm versions
+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_sysrq() {
+ vm_sysrq_$VM_TYPE "$@"
+}
+
+vm_kill() {
+ vm_kill_$VM_TYPE "$@"
+}
+
+vm_cleanup() {
+ kill_watchdog
+ vm_cleanup_$VM_TYPE "$@"
+}
+
+vm_parse_options() {
+ case ${PARAM/#--/-} in
+ -vm-emulator-script|-emulator-script)
+ needarg
+ EMULATOR_SCRIPT="$ARG"
+ shift
+ ;;
+ -xen|-kvm|-uml|-qemu|-emulator)
+ VM_TYPE=${PARAM##*-}
+ test -z "$VM_ROOT" && VM_ROOT=1
+ if test -n "$ARG" ; then
+ VM_ROOT="$ARG"
+ shift
+ fi
+ ;;
+ -zvm|-lxc)
+ VM_TYPE=${PARAM##*-}
+ shift
+ ;;
+ -vm-type)
+ needarg
+ VM_TYPE="$ARG"
+ case "$VM_TYPE" in
+ lxc|docker) ;;
+ ec2|xen|kvm|uml|qemu|emulator|openstack|zvm|pvm)
+ test -z "$VM_ROOT" && VM_ROOT=1
+ ;;
+ none|chroot) VM_TYPE= ;;
+ *)
+ cleanup_and_exit 1 "VM '$VM_TYPE' is not supported"
+ ;;
+ esac
+ shift
+ ;;
+ -vm-worker)
+ needarg
+ VM_WORKER="$ARG"
+ shift
+ ;;
+ -vm-worker-nr|-vm-worker-no)
+ needarg
+ VM_WORKER_NO="$ARG"
+ shift
+ ;;
+ -vm-server|-vm-region)
+ needarg
+ VM_SERVER="$ARG"
+ shift
+ ;;
+ -vm-disk)
+ needarg
+ VM_ROOT="$ARG"
+ shift
+ ;;
+ -vm-swap|-xenswap|-swap)
+ needarg
+ VM_SWAP="$ARG"
+ shift
+ ;;
+ -vm-memory|-xenmemory|-memory)
+ needarg
+ VM_MEMSIZE="$ARG"
+ shift
+ ;;
+ -vm-kernel)
+ needarg
+ VM_KERNEL="$ARG"
+ shift
+ ;;
+ -vm-initrd)
+ needarg
+ VM_INITRD="$ARG"
+ shift
+ ;;
+ -vm-disk-size|-vmdisk-rootsize)
+ needarg
+ VMDISK_ROOTSIZE="$ARG"
+ shift
+ ;;
+ -vm-swap-size|-vmdisk-swapsize)
+ needarg
+ VMDISK_SWAPSIZE="$ARG"
+ shift
+ ;;
+ -vm-disk-filesystem|-vmdisk-filesystem)
+ needarg
+ VMDISK_FILESYSTEM="$ARG"
+ shift
+ ;;
+ -vm-disk-mount-options|-vmdisk-mount-options)
+ needarg
+ VMDISK_MOUNT_OPTIONS="$ARG"
+ # silly code for compat with old bs_worker versions...
+ if test "$1" != "----noarg=$PARAM" -a "$ARG" != "${ARG#\"}" -a "$ARG" != "${ARG%\"}" ; then
+ VMDISK_MOUNT_OPTIONS="${VMDISK_MOUNT_OPTIONS#\"}"
+ VMDISK_MOUNT_OPTIONS="${VMDISK_MOUNT_OPTIONS%\"}"
+ fi
+ shift
+ ;;
+ -vm-disk-clean|-vmdisk-clean)
+ # delete old root/swap to get rid of the old blocks
+ VMDISK_CLEAN=true
+ ;;
+ -vm-hugetlbfs|-hugetlbfs)
+ needarg
+ HUGETLBFSPATH="$ARG"
+ shift
+ ;;
+ -vm-watchdog)
+ VM_WATCHDOG=true
+ ;;
+ -vm-user)
+ needarg
+ VM_USER="$ARG"
+ shift
+ ;;
+ -vm-enable-console)
+ VM_CONSOLE_INPUT=true
+ ;;
+ -vm-telnet)
+ needarg
+ VM_TELNET="$ARG"
+ shift
+ ;;
+ -vm-net)
+ needarg
+ VM_NETOPT=("${VM_NETOPT[@]}" "$ARG")
+ shift
+ ;;
+ -vm-netdev)
+ needarg
+ VM_NETDEVOPT=("${VM_NETDEVOPT[@]}" "$ARG")
+ shift
+ ;;
+ -vm-device)
+ needarg
+ VM_DEVICEOPT=("${VM_DEVICEOPT[@]}" "$ARG")
+ shift
+ ;;
+ -vm-custom-opt)
+ needarg
+ VM_CUSTOMOPT="$ARG"
+ shift
+ ;;
+ -openstack-flavor)
+ needarg
+ VM_OPENSTACK_FLAVOR="$ARG"
+ shift
+ ;;
+ -*)
+ return 1
+ ;;
+ esac
+ nextargs=("$@")
+ return 0
+}
+
+vm_set_buildstatus() {
+ if test -n "$VM_ROOT" -a -n "$VM_SWAP" -a "$VM_SWAP_TYPE" != unattached -a -e "$VM_SWAP" ; then
+ echo -n "BUILDSTATUS$1" >"$VM_SWAP"
+ fi
+}
+
+#
+# shutdown the system from inside the VM
+#
+vm_shutdown() {
+ test -n "$VM_WATCHDOG" && echo "### VM INTERACTION 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 -o "$VM_TYPE" = docker && 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"
+
+ if test -e "${img}" ; then
+ local origsize=$(cat "${img}.size" 2> /dev/null)
+ if test -z "$origsize" -o "$origsize" != "$size" ; then
+ echo "Resizing $img (${size}M)"
+ fi
+ else
+ echo "Creating $img (${size}M)"
+ rm -f "${img}.size"
+ fi
+
+ mkdir -p "${img%/*}" || cleanup_and_exit 3
+ # truncate file to the desired size
+ dd if=/dev/zero of="$img" bs=1M count=0 seek="$size" || cleanup_and_exit 3
+ echo "$size" > "${img}.size"
+ # allocate blocks
+ if type -p fallocate > /dev/null ; then
+ fallocate -p -l "${size}M" "$img" 2> /dev/null
+ errout=$( fallocate -l "${size}M" "$img" 2>&1 )
+ if test $? != 0; then
+ echo $errout
+ if test "${errout/Operation not supported/}" = "$errout"; then
+ # Do not fail on not support file systems, eg ext2 or ext3
+ cleanup_and_exit 3
+ fi
+ fi
+ fi
+}
+
+vm_img_wipe() {
+ vm_wipe_$VM_TYPE "$@"
+
+ if test -n "$VM_ROOT" -a "$VM_ROOT_TYPE" = file ; then
+ rm -f "$VM_ROOT"
+ fi
+ if test -n "$VM_SWAP" -a "$VM_SWAP_TYPE" = file ; then
+ rm -f "$VM_SWAP"
+ 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}\""
+ local labelopt=
+ test "$VM_ROOTDEV" != "${VM_ROOTDEV#LABEL=}" && labelopt="-L ${VM_ROOTDEV#LABEL=}"
+
+ if test -z "$mkfs"; then
+ cleanup_and_exit 3 "filesystem \"$fs\" is not supported"
+ fi
+
+ echo "Creating $fs filesystem on $img"
+ export MKE2FS_SYNC=0
+ if ! $mkfs $labelopt $mkfs_exta_options "$img" ; then
+ if test -z "$mkfs_exta_options" ; then
+ cleanup_and_exit 3
+ else
+ echo "Filesystem creation failed, trying again without extra options..."
+ $mkfs $labelopt "$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
+ BUILD_OPTIONS_PARSED=
+ while sleep 5 ; do
+ WATCH=$(grep -a "### VM INTERACTION" "$LOGFILE" | tr '\0' a | tail -n 1)
+ case $WATCH in
+ *VM\ INTERACTION\ START*) test -n "$WATCHDOG_START" || WATCHDOG_START=`date +%s` ;;
+ *VM\ INTERACTION\ 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 ###"
+ vm_kill
+ 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|riscv*) PERSONALITY_SYSCALL=136 ;;
+ *) cleanup_and_exit 1 "Unknown architecture personality: '$archname'" ;;
+ esac
+}
+
+# used before calling kvm or xen
+linux64() {
+ perl -e 'syscall('$PERSONALITY_SYSCALL', 0); exec(@ARGV) || die("$ARGV[0]: $!\n")' "$@"
+}
+
+vm_start_statistics() {
+ if test "$DO_STATISTICS" = 1 ; then
+ rm -f /.build/_statistics.exit
+ ( background_monitor_process & )
+ fi
+}
+
+vm_exit_statistics() {
+ if test "$DO_STATISTICS" = 1 ; then
+ rm -f /.build/_statistics.exit
+ fi
+}
+
+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
+ BUILD_OPTIONS_PARSED=true
+ 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 "### VM INTERACTION END ###"
+ echo "2nd stage started in virtual machine"
+ # fedora packages sometimes do not have the needed links
+ ldconfig
+ BUILD_ROOT=/
+ BUILD_DIR=/.build
+ echo "machine type: `uname -m`"
+ echo "Linux version: `uname -rv`"
+ echo "Increasing log level from now on..."
+ echo 4 > /proc/sysrq-trigger
+ 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 -a "$VM_TYPE" != docker ; 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
+ # Docker already has sysfs mounted ro elsewhere,
+ # need to remount rw explicitly.
+ mount -o remount,rw 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
+ test -d /dev/shm || rm -f /dev/shm
+ mkdir -p /dev/pts
+ mkdir -p /dev/shm
+ mount -n -tdevpts -omode=0620,gid=5 none /dev/pts
+ mount -n -ttmpfs none /dev/shm
+
+ if test -n "$VM_SWAP" ; then
+ if test "$VM_SWAP" != "${VM_SWAP#LABEL=}" ; then
+ i=$(blkid -l -o device -t "$VM_SWAP")
+ if test "$i" = "${i#/}" ; then
+ cleanup_and_exit 1 "could not find swap device with $VM_SWAP"
+ fi
+ echo "resolved swap device $VM_SWAP to $i"
+ VM_SWAP=$i
+ fi
+ 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="$VM_HOSTNAME"
+
+ # repair dracut damage, see bsc#922676
+ test -L /var/run -a ! -e /var/run && rm -f /var/run
+ test -L /var/lock -a ! -e /var/lock && rm -f /var/lock
+
+ # start a process monitoring max filesystem usage during build
+ vm_start_statistics
+
+ 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
+
+ # Enable Core dump generation
+ mkdir -p "$BUILD_ROOT/.build/cores"
+ echo "/.build/cores/%p" > /proc/sys/kernel/core_pattern
+
+ return 0
+}
+
+vm_set_filesystem_type() {
+ vmfstype=""
+ if test -n "$BUILD_DIST" ; then
+ # testing for build specific filesystem, which are more important then worker defaults
+ vmfstype=`queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" buildflags vmfstype`
+ fi
+ test -n "$vmfstype" && VMDISK_FILESYSTEM="$vmfstype"
+ # use either commandline specified fs or ext3 as fallback
+ test -n "$VMDISK_FILESYSTEM" || VMDISK_FILESYSTEM=ext3
+}
+
+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
+}
+
+vm_set_defaults() {
+ # setup root/swap defaults and type, called after option verification
+ if test "$VM_ROOT" = 1 ; then
+ VM_ROOT="$BUILD_ROOT.img"
+ if test -z "$VM_SWAP" -a "$VM_TYPE" != emulator ; then
+ VM_SWAP="$BUILD_ROOT.swap"
+ fi
+ fi
+ if test -n "$VM_ROOT" -a -z "$VM_ROOT_TYPE" ; then
+ VM_ROOT_TYPE=file
+ test -b "$VM_ROOT" && VM_ROOT_TYPE=device
+ fi
+ if test -n "$VM_SWAP" -a -z "$VM_SWAP_TYPE" ; then
+ VM_SWAP_TYPE=file
+ test -b "$VM_SWAP" && VM_SWAP_TYPE=device
+ fi
+}
+
+#
+# create file system and swap space, mount file system to $BUILD_ROOT
+#
+vm_setup() {
+ vm_set_filesystem_type
+ vm_set_mount_options
+ echo "VM_ROOT: $VM_ROOT, VM_SWAP: $VM_SWAP"
+
+ vm_attach_root
+ # 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_ROOT" -a "$VM_ROOT_TYPE" = file -a -f "$VM_ROOT" ; then
+ echo "Deleting old $VM_ROOT"
+ rm -f "$VM_ROOT"
+ fi
+ if test -n "$VM_SWAP" -a "$VM_SWAP_TYPE" = file -a -f "$VM_SWAP" ; then
+ echo "Deleting old $VM_SWAP"
+ rm -f "$VM_SWAP"
+ fi
+ fi
+ if test "$VM_ROOT_TYPE" = file ; then
+ if test -n "$CLEAN_BUILD" ; then
+ vm_img_create "$VM_ROOT" "$VMDISK_ROOTSIZE"
+ else
+ local origrootsize
+ test -e "$VM_ROOT" -a -e "${VM_ROOT}.size" && origrootsize=$(cat "${VM_ROOT}.size" 2>/dev/null)
+ if test -z "$origrootsize" -o "$origrootsize" != "$VMDISK_ROOTSIZE" ; then
+ # the size has changed, re-create file system
+ vm_img_create "$VM_ROOT" "$VMDISK_ROOTSIZE"
+ vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_ROOT" || cleanup_and_exit 3
+ fi
+ fi
+ fi
+ if test -n "$VM_SWAP" -a "$VM_SWAP_TYPE" = file ; then
+ vm_img_create "$VM_SWAP" "$VMDISK_SWAPSIZE"
+ fi
+ if test ! -e "$VM_ROOT" ; then
+ cleanup_and_exit 3 "you need to create $VM_ROOT first"
+ fi
+ if test -n "$CLEAN_BUILD" ; then
+ vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_ROOT" || cleanup_and_exit 3
+ fi
+ # now mount root/swap
+ mkdir_build_root
+ if test -w /root ; then
+ if test -b $VM_ROOT ; then
+ # mount device directly
+ mount $VMDISK_MOUNT_OPTIONS $VM_ROOT $BUILD_ROOT || cleanup_and_exit 3
+ else
+ mount ${VMDISK_MOUNT_OPTIONS},loop $VM_ROOT $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_ROOT $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
+ if test "$VM_SWAPDEV" != "${VM_SWAPDEV#LABEL=}"; then
+ # call mkswap to set a label
+ mkswap -L "${VM_SWAPDEV#LABEL=}" "$VM_SWAP"
+ fi
+ vm_detach_swap
+ # mkswap happens inside of the vm
+ fi
+}
+
+vm_update_hostarch() {
+ local kernel="$vm_kernel"
+ local hostarchfile
+ local newhostarch
+ if test -z "$VM_KERNEL" -a -e "$BUILD_ROOT/.build.kernel.$VM_TYPE" ; then
+ kernel="$BUILD_ROOT/.build.kernel.$VM_TYPE"
+ hostarchfile="$BUILD_ROOT/.build.hostarch.$VM_TYPE"
+ elif test -n "$kernel" -a -e "$kernel" -a -e "$kernel.hostarch" ; then
+ hostarchfile="$kernel.hostarch"
+ fi
+ if test -n "$hostarchfile" -a -e "$hostarchfile"; then
+ newhostarch=`cat "$hostarchfile"`
+ elif test -n "$kernel" -a -e "$kernel" ; then
+ case `objdump -f "$kernel" | sed -ne 's/.*file format //p'` in
+ elf64-powerpcle) newhostarch=ppc64le ;;
+ elf64-powerpc) newhostarch=ppc64 ;;
+ esac
+ fi
+ if test -n "$newhostarch" -a "$newhostarch" != "$BUILD_HOST_ARCH" ; then
+ echo "setting hostarch to $newhostarch"
+ BUILD_HOST_ARCH="$newhostarch"
+ # update BUILD_INITVM_ARCH
+ build_host_arch
+ 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 "${initbuildsysstuff[@]}" "${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 -o "$BUILDTYPE" = docker -o "$BUILDTYPE" = fissile -o "$BUILDTYPE" = podman ; 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
+
+ # update the hostarch
+ if test -n "$VM_ROOT" ; then
+ vm_update_hostarch
+ fi
+
+ # 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 "DO_INIT_TOPDIR='${DO_INIT_TOPDIR//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+ echo "KIWI_PARAMETERS='${KIWI_PARAMETERS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+ echo "VM_TELNET='${VM_TELNET//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data
+ echo "VM_CONSOLE_INPUT='${VM_CONSOLE_INPUT//"'"/$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[567]}" && PERSONALITY=8 ;; # workaround, to be removed
+ esac
+ test "$VM_TYPE" = lxc -o "$VM_TYPE" = docker && PERSONALITY=0
+ echo "PERSONALITY='$PERSONALITY'" >> $BUILD_ROOT/.build/build.data
+ echo "VM_HOSTNAME='$HOST'" >> $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
+ echo "BUILD_FLAVOR='$BUILD_FLAVOR'" >> $BUILD_ROOT/.build/build.data
+ echo "OBS_PACKAGE='$OBS_PACKAGE'" >> $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_ROOT" ; 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
+
+ echo "booting $VM_TYPE..."
+
+ # start watchdog if requested
+ if test -n "$VM_WATCHDOG" ; then
+ start_watchdog
+ echo "### VM INTERACTION START ###"
+ fi
+
+ vm_startup
+
+ # kill watchdog again
+ if test -n "$VM_WATCHDOG" ; then
+ echo "### VM INTERACTION 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 | tr '\0' a)
+ 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_ROOT" --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/xvda && device="xvda" # in newer XEN setups
+ 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" || cleanup_and_exit 1
+ popd >/dev/null
+ fi
+}
+
+vm_setup_network() {
+ 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 "$VM_TELNET"; then
+ VM_TELNET_DEVICE=$( cd /sys/class/net/; echo * )
+ VM_TELNET_DEVICE=${VM_TELNET_DEVICE#lo }
+ VM_TELNET_DEVICE=${VM_TELNET_DEVICE%% *}
+ if test -z "$VM_TELNET_DEVICE" ; then
+ cleanup_and_exit 1 "ERROR: no network device found for telnet server"
+ fi
+ if test -x /sbin/ip ; then
+ ip addr add 10.0.2.15/8 dev ${VM_TELNET_DEVICE}
+ ip addr add ::1/24 dev ${VM_TELNET_DEVICE}
+ ip link set ${VM_TELNET_DEVICE} up
+ elif test -x /sbin/ifconfig ; then
+ ifconfig ${VM_TELNET_DEVICE} 10.0.2.15 up
+ ifconfig ${VM_TELNET_DEVICE} add ::1/24
+ else
+ cleanup_and_exit 1 "ERROR: neither /sbin/ifconfig nor /sbin/ip is installed, please specify correct package via -x option"
+ fi
+ fi
+ if test -n "$VM_HOSTNAME" ; then
+ hostname "$VM_HOSTNAME"
+ fi
+ if test -n "$VM_TELNET"; then
+ echo WARNING: telnet option used, setting up telnet server ${VM_TELNET_DEVICE}
+ if test -x /usr/sbin/in.telnetd; then
+ ( /usr/sbin/in.telnetd -L /.build/telnet_login_wrapper -debug 23 & )
+ else
+ cleanup_and_exit 1 "ERROR: /usr/sbin/in.telnetd is not installed, please specify correct package via -x option"
+ fi
+ fi
+}
diff --git a/build-vm-docker b/build-vm-docker
new file mode 100644
index 0000000..32d9d85
--- /dev/null
+++ b/build-vm-docker
@@ -0,0 +1,84 @@
+#
+# Docker specific functions
+#
+################################################################
+#
+# Copyright (c) 2015 Oleg Girko
+# Copyright (c) 2015 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+vm_verify_options_docker() {
+ VM_ROOT=
+ VM_SWAP=
+}
+
+vm_startup_docker() {
+ local name="obsbuild.${BUILD_ROOT##*/}"
+ docker rm "$name" >/dev/null 2>&1 || true
+ docker run \
+ --rm --name "$name" --cap-add=sys_admin --cap-add=MKNOD --net=none \
+ --mount "type=bind,source=$BUILD_ROOT,destination=/mnt" busybox /bin/chroot /mnt "$vm_init_script"
+ BUILDSTATUS="$?"
+ test "$BUILDSTATUS" != 255 || BUILDSTATUS=3
+ cleanup_and_exit "$BUILDSTATUS"
+}
+
+vm_kill_docker() {
+ local name="obsbuild.${BUILD_ROOT##*/}"
+ docker stop -t 2 "$name" || true
+}
+
+vm_fixup_docker() {
+ # loop devices are needed for kiwi builds at least
+ max_loop=`cat /sys/module/loop/parameters/max_loop`
+ if [ "$max_loop" = "0" ]; then
+ max_loop=16
+ fi
+ for num in `seq 0 $max_loop`; do
+ test -b /dev/loop$num || mknod -m660 /dev/loop$num b 7 $num
+ done
+}
+
+vm_attach_root_docker() {
+ :
+}
+
+vm_attach_swap_docker() {
+ :
+}
+
+vm_detach_root_docker() {
+ :
+}
+
+vm_detach_swap_docker() {
+ :
+}
+
+vm_cleanup_docker() {
+ :
+}
+
+vm_sysrq_docker() {
+ :
+}
+
+vm_wipe_docker() {
+ local name="obsbuild.${BUILD_ROOT##*/}"
+ docker rm "$name" >/dev/null 2>&1 || true
+}
diff --git a/build-vm-ec2 b/build-vm-ec2
new file mode 100644
index 0000000..8572f35
--- /dev/null
+++ b/build-vm-ec2
@@ -0,0 +1,246 @@
+#
+# EC2 specific functions
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+EC2_BUILD_TYPE="t1.micro"
+EC2_INSTANCE_ID=
+EC2_VOLUME_ROOT=
+EC2_VOLUME_SWAP=
+
+cloud_volume_attach_ec2() {
+ local VM_SERVER="$1"
+ local VM_VOL_NAME="$2"
+
+ 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_wipe_ec2() {
+ # not yet implemented
+ :
+}
+
+vm_verify_options_ec2() {
+ EC2_VOLUME_ROOT="$VM_ROOT"
+ EC2_VOLUME_SWAP="$VM_SWAP"
+ VM_ROOT_TYPE=unattached
+ VM_SWAP_TYPE=unattached
+
+ if test -n "$KILL" -o -n "$DO_WIPE" ; then
+ return
+ fi
+
+ # verify settings
+ if test -z "$AWS_ACCESS_KEY" -o -z "$AWS_ACCESS_KEY" ; then
+ cleanup_and_exit 3 "ERROR: No amazon EC2 environment set. Set AWS_ACCESS_KEY and AWS_SECRET_KEY."
+ 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
+ cleanup_and_exit 1 "Unknown Amazon EC2 Zone: $BUILD_EC2_ZONE"
+ fi
+ if test -z "$BUILD_EC2_AKI" ; then
+ cleanup_and_exit 3 "ERROR: No image refering to kernel and ramdisk is defined in BUILD_EC2_AKI env."
+ fi
+ if test -z "$VM_ROOT" ; then
+ cleanup_and_exit 3 "ERROR: No worker root VM volume name specified."
+ fi
+ if test -z "$VM_SWAP" ; then
+ cleanup_and_exit 3 "ERROR: No worker swap VM volume name specified."
+ fi
+
+ VM_SWAPDEV=/dev/sdb1 # in the vm
+}
+
+vm_attach_root_ec2() {
+ VM_ROOT=`cloud_volume_attach_ec2 "$VM_SERVER" "$EC2_VOLUME_ROOT"
+ test "${VM_ROOT:0:5}" = /dev/ || cleanup_and_exit 3
+ VM_ROOT_TYPE=device
+}
+
+vm_attach_swap_ec2() {
+ VM_SWAP=`cloud_volume_attach_ec2 "$VM_SERVER" "$EC2_VOLUME_SWAP"
+ test "${VM_SWAP:0:5}" = /dev/ || cleanup_and_exit 3
+ VM_SWAP_TYPE=device
+}
+
+vm_detach_root_ec2() {
+ test "$VM_ROOT_TYPE" = device && cloud_volume_detach_ec2 "$VM_SERVER" "$EC2_VOLUME_ROOT"
+ VM_ROOT_TYPE=unattached
+}
+
+vm_detach_swap_ec2() {
+ test "$VM_SWAP_TYPE" = device && cloud_volume_detach_ec2 "$VM_SERVER" "$EC2_VOLUME_SWAP"
+ VM_SWAP_TYPE=unattached
+}
+
+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 $vm_linux_kernel_parameter" >> "$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" "$EC2_VOLUME_ROOT"
+ cloud_volume_detach_ec2 "$VM_SERVER" "$EC2_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_sysrq_ec2() {
+ :
+}
+
+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
+ cleanup_and_exit 1 "could not kill EC2 instance $VM_BUILD_INSTANCE"
+ fi
+ fi
+}
+
+vm_startup_ec2() {
+ EC2_SNAP_root=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$EC2_VOLUME_ROOT" | awk '{ print $2 }'`
+ if test "$EC2_SNAP_root" = "${EC2_SNAP_root#snap-}" ; then
+ cleanup_and_exit 3 "ERROR: Failed to create snapshot for root disk $EC2_VOLUME_ROOT"
+ fi
+ EC2_SNAP_swap=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$EC2_VOLUME_SWAP" | awk '{ print $2 }'`
+ if test "$EC2_SNAP_swap" = "${EC2_SNAP_swap#snap-}" ; then
+ echo "ERROR: Failed to create snapshot for swap disk $EC2_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-$EC2_VOLUME_ROOT -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 $EC2_BUILD_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"
+ # switch to extract volumnes
+ EC2_VOLUME_ROOT=$EC2_EXTRACT_VOLUME_root
+ EC2_VOLUME_SWAP=$EC2_EXTRACT_VOLUME_swap
+ # snapshots get deleted after extract
+}
diff --git a/build-vm-emulator b/build-vm-emulator
new file mode 100644
index 0000000..2518d6b
--- /dev/null
+++ b/build-vm-emulator
@@ -0,0 +1,97 @@
+#
+# generic emulator specific functions
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+vm_verify_options_emulator() {
+ if test -f "$BUILD_DIR/emulator/verify-options.sh"; then
+ . "$BUILD_DIR/emulator/verify-options.sh"
+ else
+ VM_SWAP=
+ fi
+}
+
+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_ROOT" "$VM_SWAP"
+ echo "$@"
+ if ! "$@"; then
+ popd
+ cleanup_and_exit 3 "ERROR: The emulator returned with a failure"
+ fi
+ popd
+
+ test -n "$VM_SWAP" && return
+
+ # 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_ROOT -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_ROOT" ; then
+ cleanup_and_exit 1 "could not kill build in $VM_ROOT"
+ 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() {
+ :
+}
+vm_sysrq_emulator() {
+ :
+}
+vm_wipe_emulator() {
+ :
+}
+
diff --git a/build-vm-kvm b/build-vm-kvm
new file mode 100644
index 0000000..b2ac489
--- /dev/null
+++ b/build-vm-kvm
@@ -0,0 +1,348 @@
+#
+# kvm/qemu specific functions
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+kvm_bin=/usr/bin/qemu-kvm
+test ! -x $kvm_bin -a -x /usr/bin/kvm && kvm_bin=/usr/bin/kvm
+kvm_console=ttyS0
+
+# assume virtio support by default
+kvm_device=virtio-blk-pci
+kvm_serial_device=
+kvm_rng_device=virtio-rng-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
+ cleanup_and_exit 3 "put kvm_rma_count=<VM number> or kvm_hpt_count=<> to your boot options"
+ fi
+}
+
+kvm_check_hugetlb() {
+ if ! grep -q "$HUGETLBFSPATH" /proc/mounts ; then
+ cleanup_and_exit 3 "hugetlbfs is not mounted to $HUGETLBFSPATH"
+ 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
+ cleanup_and_exit 3 "could not determine hugetlbfs block size"
+ 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() {
+ if test -n "$KILL" -o -n "$DO_WIPE" ; then
+ return
+ fi
+
+ vm_kernel=
+ vm_initrd=
+
+ # newer Ubuntu versions have only kvm executable
+ if test -x "/usr/bin/kvm" -a ! -x "$kvm_bin"; then
+ kvm_bin="/usr/bin/kvm"
+ fi
+
+ # 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 virt -cpu host"
+ 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
+ kvm_rng_device=virtio-rng-device
+ ;;
+ armv8l|aarch64)
+ kvm_bin="/usr/bin/qemu-system-aarch64"
+ kvm_console=ttyAMA0
+ vm_kernel=/boot/Image
+ vm_initrd=/boot/initrd
+ if test "${BUILD_ARCH#aarch}" != "$BUILD_ARCH" -o "${BUILD_ARCH#armv8}" != "$BUILD_ARCH"; then
+ kvm_options="-enable-kvm -cpu host"
+ test -e /boot/Image.guest && vm_kernel=/boot/Image.guest
+ test -e /boot/initrd.guest && vm_initrd=/boot/initrd.guest
+ else
+ # Running an armv7 kernel on aarch64
+ kvm_options="-enable-kvm -cpu host,aarch64=off"
+ # prefer the guest kernel/initrd
+ test -e /boot/Image.guest32 && vm_kernel=/boot/Image.guest32
+ test -e /boot/initrd.guest32 && vm_initrd=/boot/initrd.guest32
+ fi
+ # This option only exists with QEMU 2.5 or newer
+ if $kvm_bin -machine 'virt,?' 2>&1 | grep -q gic-version ; then
+ # We want to use the host gic version in order to make use
+ # of all available features (e.g. more than 8 CPUs) and avoid
+ # the emulation overhead of vGICv2 on a GICv3 host.
+ kvm_options="$kvm_options -M virt,gic-version=host"
+ else
+ kvm_options="$kvm_options -M virt"
+ fi
+ kvm_device=virtio-blk-device
+ kvm_rng_device=virtio-rng-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
+ if test -e /boot/vmlinuxbe -a -e /boot/initrdbe ; then
+ if test "$BUILD_ARCH" = ppc -o "$BUILD_ARCH" = ppc64 ; then
+ vm_kernel=/boot/vmlinuxbe
+ vm_initrd=/boot/initrdbe
+ fi
+ 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
+ kvm_serial_device=virtio-serial-ccw
+ kvm_rng_device=virtio-rng-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*)
+ VM_ROOTDEV=/dev/disk/by-id/virtio-0
+ VM_SWAPDEV=/dev/disk/by-id/virtio-1
+ ;;
+ *)
+ VM_ROOTDEV=/dev/sda
+ VM_SWAPDEV=/dev/sdb
+ ;;
+ esac
+
+ if test -n "$VM_NETOPT" -o -n "$VM_NETDEVOPT" ; then
+ if test -n "$VM_NETOPT" ; then
+ for item in "${VM_NETOPT[@]}" ; do
+ kvm_options="$kvm_options -net $item"
+ done
+ fi
+ if test -n "$VM_NETDEVOPT" ; then
+ for item in "${VM_NETDEVOPT[@]}" ; do
+ kvm_options="$kvm_options -netdev $item"
+ done
+ fi
+ fi
+
+ if test -n "$VM_DEVICEOPT" ; then
+ for item in "${VM_DEVICEOPT[@]}" ; do
+ kvm_options="$kvm_options -device $item"
+ done
+ fi
+
+ if test -n "$kvm_rng_device" ; then
+ if test -c /dev/hwrng &&
+ test -f /sys/class/misc/hw_random/rng_current &&
+ test "$(cat /sys/class/misc/hw_random/rng_current)" != none; then
+ rng_dev="/dev/hwrng"
+ else
+ rng_dev="/dev/random"
+ fi
+ kvm_options="$kvm_options -object rng-random,filename=$rng_dev,id=rng0 -device $kvm_rng_device,rng=rng0"
+ fi
+}
+
+vm_startup_kvm() {
+ qemu_bin="$kvm_bin"
+ qemu_args=(-drive file="$VM_ROOT",format=raw,if=none,id=disk,serial=0,cache=unsafe -device "$kvm_device",drive=disk)
+ if [ -n "$VM_USER" ] ; then
+ getent passwd "$VM_USER" > /dev/null || cleanup_and_exit 3 "cannot find KVM user '$VM_USER'"
+ else
+ # use qemu user by default if available
+ getent passwd qemu >/dev/null && VM_USER=qemu
+ fi
+ [ -n "$VM_USER" ] && kvm_options="$kvm_options -runas $VM_USER"
+ if test -n "$VM_SWAP" ; then
+ qemu_args=("${qemu_args[@]}" -drive file="$VM_SWAP",format=raw,if=none,id=swap,serial=1,cache=unsafe -device "$kvm_device",drive=swap)
+ fi
+ # the serial console device needs to be compiled into the target kernel
+ # which is why we can not use virtio-serial on other platforms
+ if test -n "$kvm_serial_device" ; then
+ if test -n "$VM_CONSOLE_INPUT" ; then
+ qemu_args=("${qemu_args[@]}" -device "$kvm_serial_device" -device virtconsole,chardev=virtiocon0 -chardev stdio,mux=on,id=virtiocon0 -mon chardev=virtiocon0)
+ else
+ qemu_args=("${qemu_args[@]}" -device "$kvm_serial_device" -device virtconsole,chardev=virtiocon0 -chardev stdio,id=virtiocon0)
+ fi
+ elif test -n "$VM_CONSOLE_INPUT" ; then
+ qemu_args=("${qemu_args[@]}" -serial mon:stdio)
+ else
+ if ! test -e "${VM_ROOT}.qemu/monitor"; then
+ mkdir -p "${VM_ROOT}.qemu"
+ mkfifo "${VM_ROOT}.qemu/monitor"
+ chown "$VM_USER" "${VM_ROOT}.qemu"
+ fi
+ qemu_args=("${qemu_args[@]}" -serial stdio -chardev socket,id=monitor,server,nowait,path="${VM_ROOT}.qemu/monitor" -mon chardev=monitor,mode=readline)
+ 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-prealloc -mem-path $HUGETLBFSPATH"
+ fi
+ qemu_append="root=$VM_ROOTDEV"
+ if test -n "$VMDISK_FILESYSTEM" ; then
+ qemu_append="$qemu_append rootfstype=$VMDISK_FILESYSTEM"
+ fi
+ if test -n "$VMDISK_MOUNT_OPTIONS" ; then
+ qemu_append="$qemu_append rootflags=${VMDISK_MOUNT_OPTIONS#-o }"
+ fi
+ qemu_append="$qemu_append $vm_linux_kernel_parameter"
+ qemu_append="$qemu_append panic=1 quiet no-kvmclock elevator=noop"
+ qemu_append="$qemu_append nmi_watchdog=0 rw rd.driver.pre=binfmt_misc"
+ qemu_append="$qemu_append console=$kvm_console init=$vm_init_script"
+ if test -z "$VM_NETOPT" -a -z "$VM_NETDEVOPT"; then
+ kvm_options="$kvm_options -net none"
+ fi
+ if test -n "$VM_TELNET"; then
+ kvm_options="$kvm_options -netdev user,id=telnet,hostfwd=tcp:127.0.0.1:$VM_TELNET-:23 -device e1000,netdev=telnet"
+ fi
+ if test -n "$VM_CUSTOMOPT"; then
+ kvm_options="$kvm_options $VM_CUSTOMOPT"
+ fi
+ set -- $qemu_bin -nodefaults -no-reboot -nographic -vga none $kvm_options \
+ -kernel $vm_kernel \
+ -initrd $vm_initrd \
+ -append "$qemu_append" \
+ ${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 "$@"
+ "$@"
+ qemu_ret=$?
+ test "$qemu_ret" = "137" && cleanup_and_exit 3 "qemu got SIGKILL"
+}
+
+vm_kill_kvm() {
+ if ! fuser -k -TERM "$VM_ROOT" ; then
+ echo "could not kill build in $VM_ROOT, kvm instance is dead already"
+ 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
+ VM_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() {
+ :
+}
+
+vm_sysrq_kvm() {
+ perl -e 'use Socket; socket(SOCK, PF_UNIX, SOCK_STREAM, 0) || die("socket: $!\n");
+ connect(SOCK, sockaddr_un("'"$VM_ROOT.qemu/monitor"'")) || die("connect: $!\n");
+ print SOCK "sendkey alt-print-'$1'\n";'
+}
+
+vm_wipe_kvm() {
+ :
+}
diff --git a/build-vm-lxc b/build-vm-lxc
new file mode 100644
index 0000000..b96863d
--- /dev/null
+++ b/build-vm-lxc
@@ -0,0 +1,201 @@
+#
+# LXC specific functions
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+lxc_get_id() {
+ LXCID="obsbuild:${BUILD_ROOT##*/}"
+ if which lxc-config >/dev/null 2>&1; then
+ LXC_TYPE=standalone
+ elif which virsh >/dev/null 2>&1; then
+ LXC_TYPE=libvirt
+ else
+ LXC_TYPE=unknown
+ fi
+}
+
+vm_verify_options_lxc() {
+ VM_ROOT=
+ VM_SWAP=
+}
+
+lxcsh() {
+ virsh -c lxc:/// "$@"
+}
+
+vm_startup_lxc() {
+ lxc_get_id
+ LXCCONF="$BUILD_ROOT/.build.lxc.conf"
+ rm -f "$LXCCONF"
+ vm_startup_lxc_$LXC_TYPE
+ BUILDSTATUS="$?"
+ test "$BUILDSTATUS" != 255 || BUILDSTATUS=3
+ cleanup_and_exit "$BUILDSTATUS"
+}
+
+vm_startup_lxc_standalone() {
+ LXCDIR="`lxc-config lxc.lxcpath`/$LXCID"
+ LXCROOTFS="$LXCDIR/rootfs"
+ LXCHOOK="$LXCDIR/pre-mount.hook"
+ cat $BUILD_DIR/lxc.conf > "$LXCCONF"
+ cat >> "$LXCCONF" <<-EOF
+ lxc.rootfs = $LXCROOTFS
+ lxc.hook.pre-mount = $LXCHOOK
+ EOF
+ # XXX: do this always instead of leaking the hosts' one?
+ echo "rootfs / rootfs rw 0 0" > $BUILD_ROOT/etc/mtab
+ lxc-destroy -n "$LXCID" >/dev/null 2>&1 || true
+ mkdir -p "$LXCROOTFS"
+ cat > "$LXCHOOK" <<-EOF
+ #!/bin/sh
+ mount --bind "$BUILD_ROOT" "$LXCROOTFS"
+ EOF
+ chmod a+x "$LXCHOOK"
+ case "$(lxc-create --version)" in
+ 1.0.8|1.1.*|2.*)
+ lxc-create -n "$LXCID" -f "$LXCCONF" -t none || cleanup_and_exit 1
+ lxc-start -n "$LXCID" -F "$vm_init_script"
+ ;;
+ 1.0.*)
+ lxc-create -n "$LXCID" -f "$LXCCONF" || cleanup_and_exit 1
+ lxc-start -n "$LXCID" "$vm_init_script"
+ ;;
+ esac
+}
+
+vm_startup_lxc_libvirt() {
+ local lxc_arch
+ # x86 i686 x86_64 amd64
+ case $BUILD_ARCH in
+ i586:*) lxc_arch=i686 ;;
+ x86_64:*) lxc_arch=x86_64 ;;
+ *) lxc_arch=${BUILD_ARCH/:*} ;;
+ esac
+
+ lxcsh destroy "$LXCID" >/dev/null 2>&1 || true
+ cat <<-EOF > "$LXCCONF"
+ <domain type='lxc'>
+ <name>$LXCID</name>
+ <memory unit='MiB'>${VM_MEMSIZE:-512}</memory>
+ <os>
+ <type arch='$lxc_arch'>exe</type>
+ <init>$vm_init_script</init>
+ </os>
+ <vcpu>1</vcpu>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/lib64/libvirt/libvirt_lxc</emulator>
+ <filesystem type='mount'>
+ <source dir='$BUILD_ROOT'/>
+ <target dir='/'/>
+ </filesystem>
+ <!-- SLES11 and OpenSUSE 13.1 fails if cannot change /sys owner -->
+ <!-- BTW, ro mode can be overlapped with mount -o remount,rw -->
+ <filesystem type='mount'>
+ <source dir='/sys'/>
+ <target dir='/sys'/>
+ </filesystem>
+ <console type='pty'/>
+ </devices>
+ <features>
+ <privnet/>
+ <!-- SLES11 fails if cannot create nodes (mknode) -->
+ <capabilities policy='default'>
+ <mknod state='on'/>
+ </capabilities>
+ </features>
+ </domain>
+ EOF
+ # XXX: do this always instead of leaking the hosts' one?
+ echo "rootfs / rootfs rw 0 0" > $BUILD_ROOT/etc/mtab
+ # could LOGFILE be used instead?
+ lxcsh create --console $LXCCONF | sed -ure 's/\x0d//g;:redo /.\x08/{s/.\x08//; b redo}'
+ exitcode="${PIPESTATUS[0]}"
+ if [ "$exitcode" -gt 0 ]; then
+ return $exitcode # libvirt errors
+ fi
+ if ! [ -r "$BUILD_ROOT/.build/_exitcode" ]; then
+ echo "'$BUILD_ROOT/.build/_exitcode' not found"
+ return 3
+ fi
+ exitcode=$(cat $BUILD_ROOT/.build/_exitcode)
+ return "$exitcode"
+}
+
+vm_kill_lxc() {
+ lxc_get_id
+ vm_kill_lxc_$LXC_TYPE
+}
+
+vm_kill_lxc_standalone() {
+ lxc-stop -n "$LXCID" || true
+}
+
+vm_kill_lxc_libvirt() {
+ lxcsh destroy "$LXCID" || true
+}
+
+vm_fixup_lxc() {
+ :
+}
+
+vm_attach_root_lxc() {
+ :
+}
+
+vm_attach_swap_lxc() {
+ :
+}
+
+vm_detach_root_lxc() {
+ :
+}
+
+vm_detach_swap_lxc() {
+ :
+}
+
+vm_sysrq_lxc() {
+ :
+}
+
+vm_wipe_lxc() {
+ :
+}
+
+vm_cleanup_lxc() {
+ if test $$ -ne 1 && test $$ -ne 2 ; then
+ lxc_get_id
+ vm_cleanup_lxc_$LXC_TYPE
+ fi
+}
+
+vm_cleanup_lxc_standalone() {
+ lxc-destroy -n "$LXCID"
+}
+
+vm_cleanup_lxc_libvirt() {
+ lxcsh destroy "$LXCID" >/dev/null 2>&1 || true
+}
+
diff --git a/build-vm-openstack b/build-vm-openstack
new file mode 100644
index 0000000..4bdb92f
--- /dev/null
+++ b/build-vm-openstack
@@ -0,0 +1,282 @@
+#!/bin/bash
+#
+# Openstack specific functions
+#
+################################################################
+#
+# Copyright (c) 2017 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+
+OPENSTACK_BUILD_ID=
+
+OPENSTACK_VOLUME_GRUB=
+OPENSTACK_VOLUME_ROOT=
+OPENSTACK_VOLUME_SWAP=
+OPENSTACK_ROOT_ATTACH_INFO=
+OPENSTACK_SWAP_ATTACH_INFO=
+
+openstack_get_field() {
+ echo -n "$1"|perl -n -e "\$_ =~ /^\|\s+$2\s+\|\s+(\S*)\s+\|\$/ && print \$1"
+}
+
+openstack_get_disk_state() {
+ local OUT=$($CINDERCLIENT show "$1")
+ openstack_get_field "$OUT" status
+}
+
+openstack_cinder_volume2id() {
+ local OUT=$($CINDERCLIENT show "$1")
+ openstack_get_field "$OUT" id
+}
+
+# sets OPENSTACK_ATTACH_INFO
+cloud_volume_attach_openstack() {
+ local VM_SERVER="$1"
+ local VM_VOL_NAME="$2"
+ local VM_VOL_ID=$(openstack_cinder_volume2id $VM_VOL_NAME)
+
+ # Example output of "nova volume-attach
+ # +----------+--------------------------------------+
+ # | Property | Value |
+ # +----------+--------------------------------------+
+ # | device | /dev/vdb |
+ # | id | 793e9a04-7068-4cf1-86e7-26509f709b54 |
+ # | serverId | 175e470c-5869-4425-988a-6b334a2fa655 |
+ # | volumeId | 793e9a04-7068-4cf1-86e7-26509f709b54 |
+ # +----------+--------------------------------------+
+ local OUT=$($NOVACLIENT volume-attach "$VM_SERVER" "$VM_VOL_ID")
+ test $? -gt 0 && cleanup_and_exit 3 "ERROR: nova volume-attach failed. $?"
+
+ local device_path=`openstack_get_field "$OUT" device`
+ local serverId=`openstack_get_field "$OUT" serverId`
+ while true ; do
+ local state=`openstack_get_disk_state "$VM_VOL_NAME"`
+ test "$state" = "in-use" && break
+ test -z "$state" && cleanup_and_exit 3 "ERROR: unable to find state of volume $VM_VOL_NAME"
+ if test "$state" = available ; then
+ echo "WARNING: volume $VM_VOL_NAME got not attached, retrying" >&2
+ OUT=`$NOVACLIENT volume-attach "$VM_SERVER" "$VM_VOL_ID"`
+ test $? -gt 0 && cleanup_and_exit 3 "ERROR: nova attach failed. $?"
+ device_path=`openstack_get_field "$OUT" device`
+ fi
+ sleep 3
+ done
+ test "${device_path:0:5}" = "/dev/" || cleanup_and_exit 3 "device path not starting with /dev/: $device_path"
+
+ if ! test -e "$device_path" ; then
+ echo "waiting for $device_path to appear"
+ for i in 1 2 3 4 5 6 7 8 9 10 ; do
+ sleep 1
+ test -e "$device_path" && break
+ done
+ test -b "$device_path" || cleanup_and_exit 3 "$device_path did not appear"
+ fi
+
+ # return attach info. Example:
+ # 793e9a04-7068-4cf1-86e7-26509f709b54:175e470c-5869-4425-988a-6b334a2fa655:/dev/vdb
+ OPENSTACK_ATTACH_INFO="$VM_VOL_ID:$serverId:$device_path"
+}
+
+cloud_volume_detach_openstack() {
+ local VM_SERVER=${1:37:36}
+ local VM_VOL_ID=${1:0:36}
+
+ test -z "$VM_SERVER" -o -z "$VM_VOL_ID" && cleanup_and_exit 1 "cloud_volume_detach_openstack: bad attach info"
+
+ # needed at all?
+ $NOVACLIENT volume-detach "$VM_SERVER" "$VM_VOL_ID"
+
+ state=`openstack_get_disk_state $VM_VOL_ID`
+ while test "$state" = detaching ; do
+ sleep 1
+ state=`openstack_get_disk_state $VM_VOL_ID`
+ done
+
+ if test "$state" = "available" ; then
+ return 0
+ fi
+
+ if ! $NOVACLIENT volume-detach "$VM_SERVER" "$VM_VOL_ID" ; then
+ cleanup_and_exit 3 "ERROR: nova detach of $VM_VOL_ID failed."
+ fi
+ while test "$state" != "available" ; do
+ state=`openstack_get_disk_state $VM_VOL_ID`
+ sleep 3
+ done
+}
+
+vm_verify_options_openstack() {
+ OPENSTACK_VOLUME_ROOT="$VM_ROOT"
+ OPENSTACK_VOLUME_SWAP="$VM_SWAP"
+ VM_ROOT_TYPE=unattached
+ VM_SWAP_TYPE=unattached
+
+ # Checking for required tools (nova and cinder)
+ NOVACLIENT=`type -p nova`
+ if test -z "$NOVACLIENT" ; then
+ cleanup_and_exit 3 "ERROR: nova not installed. Please install nova and try again"
+ fi
+
+ CINDERCLIENT=`type -p cinder`
+ if test -z "$CINDERCLIENT" ; then
+ cleanup_and_exit 3 "ERROR: nova not installed. Please install cinder and try again"
+ fi
+
+ if test -n "$KILL" -o -n "$DO_WIPE" ; then
+ return
+ fi
+
+ # verify options
+ if test -z "$OS_AUTH_URL" ; then
+ cleanup_and_exit 3 "ERROR: No openstack environment set. This vm-type works only inside of an openstack VM."
+ fi
+ if test -z "$VM_KERNEL" ; then
+ cleanup_and_exit 3 "ERROR: No worker boot VM volume name specified."
+ fi
+ if test -z "$VM_ROOT" ; then
+ cleanup_and_exit 3 "ERROR: No worker root VM volume name specified."
+ fi
+ if test -z "$VM_SWAP" ; then
+ cleanup_and_exit 3 "ERROR: No worker swap VM volume name specified."
+ fi
+ if test -z "$VM_SERVER" ; then
+ cleanup_and_exit 3 "ERROR: No VM server node name specified (usually this instance)."
+ fi
+ if test -z "$VM_WORKER" ; then
+ cleanup_and_exit 3 "ERROR: No VM worker node name specified (the instance to be created)."
+ fi
+
+ if test -z "$VM_OPENSTACK_FLAVOR" ; then
+ cleanup_and_exit 3 "ERROR: No VM openstack flavor set (--openstack-flavor <FLAVOR-NAME|FLAVOR-ID>)."
+ fi
+
+ # set default values
+ VM_ROOTDEV="LABEL=obsrootfs"
+ VM_SWAPDEV="LABEL=obsswapfs"
+
+ # hack: mis-use kernel parameter
+ OPENSTACK_VOLUME_GRUB="$VM_KERNEL"
+ VM_KERNEL=
+}
+
+vm_attach_root_openstack() {
+ test -n "$OPENSTACK_ROOT_ATTACH_INFO" && cleanup_and_exit 1 "root is already attached"
+ local OPENSTACK_ATTACH_INFO
+ cloud_volume_attach_openstack "$VM_SERVER" "$OPENSTACK_VOLUME_ROOT"
+ OPENSTACK_ROOT_ATTACH_INFO=$OPENSTACK_ATTACH_INFO
+ VM_ROOT=${OPENSTACK_ATTACH_INFO:74}
+ VM_ROOT_TYPE=device
+}
+
+vm_attach_swap_openstack() {
+ test -n "$OPENSTACK_SWAP_ATTACH_INFO" && cleanup_and_exit 1 "root is already attached"
+ local OPENSTACK_ATTACH_INFO
+ cloud_volume_attach_openstack "$VM_SERVER" "$OPENSTACK_VOLUME_SWAP"
+ OPENSTACK_SWAP_ATTACH_INFO=$OPENSTACK_ATTACH_INFO
+ VM_SWAP=${OPENSTACK_ATTACH_INFO:74}
+ VM_SWAP_TYPE=device
+}
+
+vm_detach_root_openstack() {
+ test -z "$OPENSTACK_ROOT_ATTACH_INFO" && cleanup_and_exit 1 "root is not attached"
+ local OPENSTACK_ATTACH_INFO=$OPENSTACK_ROOT_ATTACH_INFO
+ OPENSTACK_ROOT_ATTACH_INFO=
+ cloud_volume_detach_openstack "$OPENSTACK_ATTACH_INFO" || cleanup_and_exit 3
+ VM_ROOT=$OPENSTACK_VOLUME_ROOT
+ VM_ROOT_TYPE=unattached
+}
+
+vm_detach_swap_openstack() {
+ test -z "$OPENSTACK_SWAP_ATTACH_INFO" && cleanup_and_exit 1 "swap is not attached"
+ local OPENSTACK_ATTACH_INFO=$OPENSTACK_SWAP_ATTACH_INFO
+ OPENSTACK_SWAP_ATTACH_INFO=
+ cloud_volume_detach_openstack "$OPENSTACK_ATTACH_INFO" || cleanup_and_exit 3
+ VM_SWAP=$OPENSTACK_VOLUME_SWAP
+ VM_SWAP_TYPE=unattached
+}
+
+vm_cleanup_openstack() {
+ test -n "$OPENSTACK_ROOT_ATTACH_INFO" && vm_detach_root_openstack
+ test -n "$OPENSTACK_SWAP_ATTACH_INFO" && vm_detach_swap_openstack
+}
+
+vm_fixup_openstack() {
+ # No way to handle this via init= parameter here....
+ echo "#!/bin/sh" > "$BUILD_ROOT/sbin/init"
+ echo 'echo "exec /.build/build \"$@\""' >> "$BUILD_ROOT/sbin/init"
+ echo 'exec /.build/build "$@"' >> "$BUILD_ROOT/sbin/init"
+ echo 'echo "Waiting for input"' >> "$BUILD_ROOT/sbin/init"
+ echo 'read' >> "$BUILD_ROOT/sbin/init"
+ chmod 0755 "$BUILD_ROOT/sbin/init"
+}
+
+vm_sysrq_openstack() {
+ :
+}
+
+vm_wipe_openstack() {
+ if test -n "$VM_WORKER" ; then
+ $NOVACLIENT delete $VM_WORKER
+ fi
+}
+
+vm_kill_openstack() {
+ if $NOVACLIENT show "$VM_WORKER" >/dev/null 2>&1 ; then
+ if ! $NOVACLIENT delete "$VM_WORKER" ; then
+ cleanup_and_exit 1 "could not kill openstack vm build $VM_WORKER"
+ fi
+ fi
+}
+
+openstack_wait_for_delete_instance() {
+ while test -n "$($NOVACLIENT list|grep $VM_WORKER)" ; do
+ sleep 1
+ done
+}
+
+vm_startup_openstack() {
+ local VM_VOL_ROOT_ID=`openstack_cinder_volume2id ${VM_ROOT}`
+ local VM_VOL_SWAP_ID=`openstack_cinder_volume2id ${VM_SWAP}`
+ local VM_VOL_BOOT_ID=`openstack_cinder_volume2id ${OPENSTACK_VOLUME_GRUB}`
+
+ local OUTPUT=`\
+ $NOVACLIENT boot \
+ --flavor $VM_OPENSTACK_FLAVOR \
+ --block-device source=volume,dest=volume,bootindex=0,id=${VM_VOL_BOOT_ID}\
+ --block-device source=volume,dest=volume,bootindex=1,id=${VM_VOL_ROOT_ID}\
+ --block-device source=volume,dest=volume,bootindex=2,id=${VM_VOL_SWAP_ID}\
+ --poll "$VM_WORKER" || cleanup_and_exit 3\
+ `
+ OPENSTACK_BUILD_ID=`openstack_get_field "$OUTPUT" id`
+
+ for try in 1 2 3 4 5 ; do
+ WS_URL=`$NOVACLIENT get-serial-console $VM_WORKER|grep serial |perl -p -e 's#.*(ws://.*) \|#$1#'`
+ test -n "$WS_URL" && break
+ sleep 1
+ done
+
+ if ! $BUILD_DIR/openstack-console "${WS_URL}" ; then
+ $NOVACLIENT delete $OPENSTACK_BUILD_ID
+ cleanup_and_exit 3
+ else
+ $NOVACLIENT delete $OPENSTACK_BUILD_ID
+ openstack_wait_for_delete_instance
+ fi
+}
+
diff --git a/build-vm-pvm b/build-vm-pvm
new file mode 100644
index 0000000..5cf0858
--- /dev/null
+++ b/build-vm-pvm
@@ -0,0 +1,197 @@
+#PowerVM build functions
+
+pvm_setup_bootloader(){
+ disk=$1
+ parted -s $disk mklabel msdos
+ parted -s $disk mkpart primary ext2 0 $bootloader_size
+ parted -s $disk set 1 boot on
+ parted -s $disk set 1 prep on
+ parted -s $disk mkpart primary ext3 8M 100%
+ bl_target=${disk}1
+}
+
+pvm_getdiskname(){
+ lv=$1
+ if [ -z "$SKIP" ];then
+ args=$(pvmctl scsi list -f ' ' -d VirtualDisk.udid ClientAdapter.loc_code --where VirtualDisk.name=$lv)
+ eval $args
+ host=$(ls-vscsi | grep $loc_code| awk -F " " '{print $1}')
+ udid=$(echo $udid | cut -c 3-)
+ devid="/dev/disk/by-id/scsi-SAIX_VDASD_$udid"
+ until test -L $devid;do
+ sleep 1;
+ echo "- - -" > /sys/class/scsi_host/$host/scan
+ done
+ dev=$(readlink -f $devid)
+ fi
+ case $lv in
+ *root) test -z "$SKIP" && pvm_setup_bootloader "$dev"
+ VM_ROOT="${dev}2";;
+ *swap) VM_SWAP="${dev}";;
+ esac
+}
+
+pvm_execute(){
+ cmd=$@
+ pvmctl $cmd
+}
+
+pvm_is_created() {
+ dev=$1
+ $(pvmctl lv list -d LogicalVolume.name | grep -q $dev) && SKIP=1
+}
+
+pvm_createdev() {
+ name=$1
+ size=$2
+ target=$3
+ size_gb=`expr $size / 1024`
+ test -z $3 && target=$master_lpar
+ pvm_is_created $name
+ if [ -z "$SKIP" ];then
+ pvm_execute lv create --name $name --size $size_gb
+ target=$master_lpar
+ fi
+ pvm_execute scsi create --vg name=rootvg --type lv --lpar name=$target --stor-id $name
+ test -z "$SKIP" && pvm_getdiskname $name
+}
+
+pvm_lpar_is_running(){
+ state=$(pvmctl lpar list -d LogicalPartition.state --where LogicalPartition.name=$lpname |awk -F "=" '{print $2}')
+ CONSOLEPID=`pgrep -f "cat $hvcdev"`
+ if [ "$state" = "running" ];then
+ return 0
+ else
+ test -n $CONSOLEPID && kill -TERM $CONSOLEPID
+ return 1
+ fi
+}
+
+pvm_watch_build(){
+ while pvm_lpar_is_running $lpname;do
+ sleep 10
+ done
+}
+
+pvm_detachdev(){
+ lv=$1
+ lpar=$2
+ pvm_execute scsi delete --lpar name=$lpar --type lv --stor-id $lv
+}
+
+pvm_deletelv(){
+ viosvrcmd --id 1 -c "rmbdsp -bd $1"
+}
+
+pvm_nametoid(){
+ local id
+ name=$1
+ lparid=$(pvmctl lpar list -d LogicalPartition.id -i name=$name | awk -F "=" '{print $2}')
+}
+
+
+pvm_openconsole(){
+ id=$1
+ pvmutil -o create_vterm_dev --id $id
+ hvcsadmin -console $id
+ hvcdev=$(hvcsadmin -console $id|awk '{print $4}')
+}
+
+pvm_closeconsole(){
+ hvcdev=$(hvcsadmin -console $id|awk '{print $4}')
+ hvcsadmin -close $hvcdev
+ pvmutil -o delete_vterm_dev --id $1
+}
+
+vm_kill_pvm() {
+ pvm_execute lpar power-off --hard -i name="$VM_NAME"
+}
+
+vm_startup_pvm(){
+ cpus=$BUILD_JOBS
+ cores=`echo 0.05 \* $cpus| bc -l`
+ pvm_execute lpar create --name $lpname --mem $VM_MEMSIZE --proc-unit $cores --proc $cpus --proc-type shared --sharing-mode uncapped --type $lpartype
+ pvm_nametoid $lpname
+ vm_attach_root_pvm $lpname
+ vm_attach_swap_pvm $lpname
+ pvm_openconsole $lparid
+ pvm_execute lpar power-on -i name=$lpname
+ pvm_watch_build &
+ PID=$!
+ cat $hvcdev
+ vm_detach_root_pvm $lpname
+ vm_detach_swap_pvm $lpname
+}
+
+vm_verify_options_pvm(){
+ test -z "$VM_WORKER_NO" && VM_WORKER_NO=1
+ lpname="worker-$VM_WORKER_NO"
+ lpartype="AIX/Linux"
+ bootloader_size="8M"
+ rootlv="$lpname"-root
+ swaplv="$lpname"-swap
+ master_lpar=$(cat /proc/device-tree/ibm,partition-name)
+}
+
+vm_attach_root_pvm(){
+ target=$1
+ pvm_createdev $rootlv $VMDISK_ROOTSIZE $target
+}
+
+vm_attach_swap_pvm(){
+ pvm_createdev $swaplv $VMDISK_SWAPSIZE $target
+}
+
+vm_detach_swap_pvm(){
+ lpar=$1
+ test -z $lpar && lpar=$master_lpar
+ pvm_detachdev $swaplv $lpar
+}
+
+vm_detach_root_pvm(){
+ lpar=$1
+ test -z $lpar && lpar=$master_lpar
+ pvm_detachdev $rootlv $lpar
+}
+
+vm_cleanup_pvm(){
+ pvm_nametoid $lpname
+ pvm_closeconsole $lparid
+ vm_detach_root_pvm $lpname
+ vm_detach_root_pvm
+ vm_detach_swap_pvm $lpname
+ vm_detach_swap_pvm
+ pvm_execute lpar delete -i name=$lpname
+ pvm_deletelv $rootlv
+ pvm_deletelv $swaplv
+}
+
+vm_sysrq_pvm(){
+ :
+}
+
+vm_wipe_pvm(){
+ :
+}
+
+vm_fixup_pvm(){
+ VM_SWAPDEV=/dev/sdb
+ GRUBDIR=`mktemp -d /tmp/grubinstall.XXXX`
+ modules="ext2 part_msdos linux disk elf"
+ grubcfg="$GRUBDIR/grub.cfg"
+ grubimg="$GRUBDIR/grub.img"
+ cat <<'EOF' >> $GRUBDIR/grub.cfg
+insmod ext2
+insmod part_msdos
+insmod linux
+insmod disk
+insmod elf
+set root='ieee1275//vdevice/v-scsi@30000002/disk@8100000000000000,msdos2'
+linux /.build.kernel.kvm init=/.build/build console=hvc0 root=/dev/sda2 rw elevator=noop $vm_linux_kernel_parameter
+initrd /.build.initrd.kvm
+boot
+EOF
+ grub2-mkimage -O powerpc-ieee1275 -o $grubimg -c $grubcfg $modules
+ dd if=$grubimg of=$bl_target
+ rm -rf $GRUBDIR
+}
diff --git a/build-vm-qemu b/build-vm-qemu
new file mode 100644
index 0000000..3fe7a0b
--- /dev/null
+++ b/build-vm-qemu
@@ -0,0 +1,69 @@
+#
+# qemu specific functions
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+# 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
+}
+
+vm_sysrq_qemu() {
+ :
+}
+
+vm_wipe_qemu() {
+ :
+}
+
diff --git a/build-vm-uml b/build-vm-uml
new file mode 100644
index 0000000..9e85062
--- /dev/null
+++ b/build-vm-uml
@@ -0,0 +1,74 @@
+#
+# UML specific functions
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+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_ROOT ubdb=$VM_SWAP ${VM_MEMSIZE:+mem=$VM_MEMSIZE}
+ echo "$@"
+ "$@"
+}
+
+vm_kill_uml() {
+ if ! fuser -k -TERM "$VM_ROOT"; then
+ cleanup_and_exit 1 "could not kill build in $VM_ROOT"
+ fi
+}
+
+vm_fixup_uml() {
+ :
+}
+
+vm_attach_root_uml() {
+ :
+}
+
+vm_attach_swap_uml() {
+ :
+}
+
+vm_detach_root_uml() {
+ :
+}
+
+vm_detach_swap_uml() {
+ :
+}
+
+vm_cleanup_uml() {
+ :
+}
+
+vm_sysrq_uml() {
+ :
+}
+
+vm_wipe_uml() {
+ :
+}
+
diff --git a/build-vm-xen b/build-vm-xen
new file mode 100644
index 0000000..d29dbaa
--- /dev/null
+++ b/build-vm-xen
@@ -0,0 +1,143 @@
+#
+# XEN specific functions
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+xen_set_xenid_xmcmd() {
+ XENID="${VM_ROOT%/root}"
+ XENID="${XENID%/tmpfs}"
+ XENID="${XENID##*/}"
+ XENID="${XENID#root_}"
+ XMCMD=xm
+ test ! -x /usr/sbin/xm -a -x /usr/sbin/xl && XMCMD=xl
+}
+
+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"
+ if test ! -x /usr/sbin/xm -a -x /usr/sbin/xl ; then
+ VM_ROOTDEV=/dev/xvda
+ VM_SWAPDEV=/dev/xvdb
+ VM_CONSOLE=hvc0
+ else
+ VM_ROOTDEV=/dev/hda1
+ VM_SWAPDEV=/dev/hda2
+ VM_CONSOLE=ttyS0
+ fi
+}
+
+vm_startup_xen() {
+ xen_set_xenid_xmcmd
+ XMROOT="file:$(readlink -f $VM_ROOT)"
+ XMROOT=${XMROOT/#file:\/dev/phy:/dev}
+ XMROOT="disk=$XMROOT,${VM_ROOTDEV#/dev/},w"
+ XMSWAP=
+ if test -n "$VM_SWAP" ; then
+ XMSWAP="file:$(readlink -f $VM_SWAP)"
+ XMSWAP=${XMSWAP/#file:\/dev/phy:/dev}
+ XMSWAP="disk=$XMSWAP,${VM_SWAPDEV#/dev/},w"
+ fi
+
+ 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 = \"$VM_ROOTDEV ro\"" >> $XEN_CONF_FILE
+ echo "extra = \"init=/bin/bash console=$VM_CONSOLE 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=$VM_CONSOLE"
+ 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 $vm_linux_kernel_parameter elevator=noop console=$VM_CONSOLE"\"
+ 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() {
+ xen_set_xenid_xmcmd
+ if $XMCMD list "build_$XENID" >/dev/null 2>&1 ; then
+ if ! $XMCMD destroy "build_$XENID" ; then
+ cleanup_and_exit 1 "could not kill xen build $XENID"
+ fi
+ fi
+}
+
+# XEN only
+vm_purge_xen() {
+ # this should not be needed, but sometimes a xen instance gets lost
+ xen_set_xenid_xmcmd
+ $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() {
+ :
+}
+
+vm_sysrq_xen() {
+ :
+}
+
+vm_wipe_xen() {
+ :
+}
+
diff --git a/build-vm-zvm b/build-vm-zvm
new file mode 100644
index 0000000..6c537c7
--- /dev/null
+++ b/build-vm-zvm
@@ -0,0 +1,380 @@
+#
+# z/VM specific functions
+#
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+# 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 $vm_linux_kernel_parameter"
+zvm_mult_pass="THR4ME"
+zvm_init_script="/.build/build"
+
+ZVM_CLEANUP=
+ZVM_VOLUME_ROOT=
+ZVM_VOLUME_SWAP=
+
+#######################################################################################
+
+# this once was in zvm_functions
+
+zvm_fatal() {
+ echo "$1"
+ test -n "$ZVM_CLEANUP" && exit 1
+ cleanup_and_exit 1
+}
+
+zvm_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)
+ zvm_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
+ zvm_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_SWAPDEV=/dev/dasdb1 # in the vm
+
+ if test -z "$VM_ROOT" ; then
+ if test -n "$BUILD_ROOT" -a ${#BUILD_ROOT} -le 4 ; then
+ VM_ROOT="$BUILD_ROOT"
+ else
+ VM_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_SWAP" ; then
+ VM_SWAP="0250"
+ fi
+
+ ZVM_VOLUME_ROOT="$VM_ROOT"
+ ZVM_VOLUME_SWAP="$VM_SWAP"
+ VM_ROOT_TYPE=unattached
+ VM_SWAP_TYPE=unattached
+
+ if test -n "$KILL" -o -n "$DO_WIPE" ; then
+ return
+ fi
+
+ # z/VM guest name that is already defined in z/VM
+ if test -z "$VM_WORKER" ; then
+ cleanup_and_exit 3 "ERROR: No z/VM worker id specified"
+ fi
+ if test -z "$VM_WORKER_NO" ; then
+ cleanup_and_exit 3 "ERROR: No z/VM worker number specified"
+ 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
+ cleanup_and_exit 3 "ERROR: No z/VM kernel specified"
+ 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
+ cleanup_and_exit 3 "ERROR: No z/VM initrd specified"
+ fi
+ zvm_cp worker_init $VM_WORKER $ZVM_VOLUME_ROOT $ZVM_VOLUME_SWAP $VM_WORKER_NO
+ zvm_cp volume_detach $VM_WORKER $ZVM_VOLUME_ROOT
+ zvm_cp volume_detach $VM_WORKER $ZVM_VOLUME_SWAP
+}
+
+vm_startup_zvm() {
+ # link root/swap to the worker
+ zvm_cp volume_attach $VM_WORKER $ZVM_VOLUME_ROOT
+ zvm_cp volume_attach $VM_WORKER $ZVM_VOLUME_SWAP
+ zvm_cp ipl $VM_WORKER $ZVM_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 $ZVM_VOLUME_ROOT
+ zvm_cp volume_detach $VM_WORKER $ZVM_VOLUME_SWAP
+}
+
+vm_kill_zvm() {
+ if vmcp q "$VM_WORKER" > /dev/null 2>&1 ; then
+ if ! zvm_cp destroy $VM_WORKER ; then
+ cleanup_and_exit 1 "could not kill zvm worker $VM_WORKER"
+ 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_ROOT=$(ZVM_CLEANUP=1 zvm_cp volume_link_local $VM_WORKER $ZVM_VOLUME_ROOT $zvm_mult_pass $VM_WORKER_NO )
+ if test "${VM_ROOT}" = "${VM_ROOT#dasd}" ; then
+ cleanup_and_exit 3 "did not get a real device for VM_ROOT: $VM_ROOT"
+ fi
+ VM_ROOT="/dev/$VM_ROOT"
+ VM_ROOT_TYPE=device
+}
+
+vm_attach_swap_zvm() {
+ VM_SWAP=$(ZVM_CLEANUP=1 zvm_cp volume_link_local $VM_WORKER $ZVM_VOLUME_SWAP $zvm_mult_pass $VM_WORKER_NO )
+ if test "${VM_SWAP}" = "${VM_SWAP#dasd}" ; then
+ cleanup_and_exit 3 "did not get a real device for VM_SWAP: $VM_SWAP"
+ fi
+ VM_SWAP="/dev/$VM_SWAP"
+ VM_SWAP_TYPE=device
+}
+
+vm_detach_root_zvm () {
+ zvm_cp volume_detach_local $ZVM_VOLUME_ROOT $VM_WORKER_NO
+ VM_ROOT_TYPE=unattached
+}
+
+vm_detach_swap_zvm() {
+ zvm_cp volume_detach_local $ZVM_VOLUME_SWAP $VM_WORKER_NO
+ VM_SWAP_TYPE=unattached
+}
+
+vm_cleanup_zvm() {
+ if test -n "$VM_WORKER" -a -n "$VM_WORKER_NO" -a -n "$ZVM_VOLUME_ROOT" -a -n "$ZVM_VOLUME_SWAP" ; then
+ ZVM_CLEANUP=1
+ (zvm_cp volume_detach $VM_WORKER $ZVM_VOLUME_ROOT >/dev/null 2>&1)
+ (zvm_cp volume_detach $VM_WORKER $ZVM_VOLUME_SWAP >/dev/null 2>&1)
+ (zvm_cp volume_detach_local $ZVM_VOLUME_ROOT $VM_WORKER_NO >/dev/null 2>&1)
+ (zvm_cp volume_detach_local $ZVM_VOLUME_SWAP $VM_WORKER_NO >/dev/null 2>&1)
+ fi
+}
+
+vm_sysrq_zvm() {
+ :
+}
+
+vm_wipe_zvm() {
+ :
+}
diff --git a/build.1 b/build.1
new file mode 100644
index 0000000..8c721db
--- /dev/null
+++ b/build.1
@@ -0,0 +1,233 @@
+.de TQ \"follow a TP item with several TQ items to define several
+. \"entities with one shared description.
+.br
+.ns
+.TP \\$1
+..
+.TH build 1 "(c) 1997-2008 SuSE Linux AG Nuernberg, Germany"
+.SH NAME
+build \- build SuSE Linux RPMs in a chroot environment
+.SH SYNOPSIS
+.B build
+.RB [ --clean | --no-init]
+.RB [ --repo
+.IR dir_or_url ]
+.RB [ --repo ...]
+.RB [ --root
+.IR buildroot ]
+.RB [ recipefile ]
+.br
+.B build
+.B --help
+.br
+.B build
+.B --verify
+.SH DESCRIPTION
+\fBbuild\fR is a tool to build binary packages in a safe and reproducible
+way.
+The default is to build in a chroot sandbox, but \fBbuild\fP also supports
+building in a virtual machine for better security.
+.P
+If a recipe file is specified on the command line,
+.B build
+will use this file and all other files in the directory for building
+the package. If no recipe argument is provided, build will search the
+current directory for a file.
+.P
+The
+.B build
+tool understands the following recipe file types:
+.TP
+.B spec
+A specfile used to generate rpms.
+.TP
+.B src.rpm
+A source rpm, which will be unpacked for the build.
+.TP
+.B kiwi
+A kiwi config file used to generate a kiwi image.
+.TP
+.B dsc
+A dsc file used to generate Debian binary packages.
+.TP
+.B PKGBUILD
+A file used to generate Arch Linux binary packages.
+.TP
+.B build.collax
+A shell script used to generate a Collax binary package.
+.P
+.SH OPTIONS
+.TP
+.B --clean
+Remove the build system and reinitialize it from scratch.
+.TP
+.B --no-init
+Skip the build system initialization and start with build immediately.
+.TP
+.BI "\-\-repo " dir_or_url
+Either a directory containing binary packages (optionally with repository
+metadata), or a url pointing to some remote repository. Multiple
+\fB--repo\fP options can be used so create a specific repository
+layering. Note that packages are searched in the specified repository
+order, i.e. the first repository containing a package with a specific
+name wins regardless of the version.
+As a special form, 'zypp://reponame' can be used to specify
+a system repository. 'zypp://' selects all enabled system
+repositories. This is also the default if BUILD_RPMS is not
+set and no \fB--rpms\fP or \fB--repo\fP option is used.
+.TP
+.BI "\-\-dist " distribution
+Set the distribution. If this option is not given, build tries to
+guess the distribution by looking at the available packages.
+The specified distribution can either be a string
+like "11.2" or "sles9", "debian7", or the pathname of the build
+configuration to use.
+.TP
+.BI "\-\-root " buildroot
+Specifies where the build system is set up. Overrides the
+BUILD_ROOT enviroment variable.
+.TP
+.B --help
+Print a short help text.
+.TP
+.B --norootforbuild
+Force building with user \fRabuild\fP. Otherwise, \fBbuild\fP searches
+the recipe file for a "needsrootforbuild" hint to decide what user
+to use.
+.TP
+.B --list-state
+list packages that would be used to create a fresh build root.
+Does not create the build root or perform a build.
+.TP
+.BI "\-\-rpms " path1 : path2 : path3\fR...\fP
+Where build can find the packages needed to create the
+build system. This option overrides the BUILD_RPMS environment
+variable. This option is deprecated, use \fB--repo\fP instead.
+.TP
+.BI "\-\-arch " arch1 : arch2 : arch3\fR...\fP
+What architectures to select from the RPMs.
+.B build
+automatically sets this to a sensible value for your host if you
+do not specify this option so you should almost never need it.
+
+.SH RPM BUILD SPECIFIC OPTIONS
+.TP
+.B --useusedforbuild
+Tell build not to do dependency expansion, but to extract the
+list of packages to install from "# usedforbuild" lines or, if none
+are found, from all "BuildRequires" lines. This option is useful
+if you want to re-build a package from a srcrpm with exactly the
+same packages used for the srcrpm build.
+.TP
+.B --stage
+Pass a stage option to rpmbuild. The default is \fB-ba\fP.
+.TP
+.B --target
+Call rpmbuild with a target option. This can be used for cross building.
+.TP
+.B --verify
+Verify the files in an existing build system.
+
+.SH VIRTUAL MACHINE SPECIFIC OPTIONS
+.TP
+.B "--xen --kvm --uml --qemu --emulator --zvm --lxc"
+Sets a specific vm type.
+.TP
+.BI "--vm-type " type
+As above.
+.TP
+.BI "--vm-disk " file
+Specifies the location of the disk image to use. If this option is not
+given, \fIbuildroot\fP\fB.img\fP is used (e.g. /var/tmp/build-root.img).
+.TP
+.BI "--vm-disk-size " size_in_mb
+Specify the size of the disk image to create.
+.TP
+.BI "--vm-disk-filesystem " type
+Sets the filesystem type to use when creating the disk image. The default
+is to use the ext3 filesystem.
+.TP
+.BI "--vm-swap " file
+Specifies the location of the swap file to use. If this option is not
+given, \fIbuildroot\fP\fB.swap\fP is used (e.g. /var/tmp/build-root.swap).
+.TP
+.BI "--vm-swap-size " size_in_mb
+Specify the size of the swap file to create.
+.TP
+.BI "--vm-memory " size_in_mb
+Sets the desired memory size of the virtual machine.
+.TP
+.BI "--vm-kernel " kernel_file
+Set a specific kernel to boot in the virtual machine.
+.TP
+.BI "--vm-initrd " initrd_file
+Set a specific kernel to boot in the virtual machine.
+.TP
+.B --vm-disk-clean
+Force the recreation of the disk image.
+.TP
+.B "--vm-telnet" PORT
+Is forwarding PORT to a telnet session inside of the VM.
+Specify also needed extra packages via -x parameter, usually:
+.I --vm-telnet 1234 -x telnet-server -x net-tools
+ And connect from the host via:
+.I telnet localhost 1234
+ NOTE: The telnet server gets started after all packages got installed.
+
+
+.SH RECIPE FILE OPTIONS
+The
+.B build
+command interprets some special control comments in the recipe file:
+.TP
+.B # norootforbuild
+.TQ
+.B # needsrootforbuild
+.B build
+uses either user
+.I root
+or user
+.I abuild
+in the build system to do the build. For non-SUSE distros as well as
+since SUSE 10.2, the default build user is
+.I abuild.
+For 10.2 and before, the default build user is
+.I root.
+These two flags in the spec file allow to deviate from the defaults
+and force-set the build user to
+.I abuild
+and
+.I root
+.RI "(for " "#\ norootforbuild" " and " "#\ needsrootforbuild" " respectively."
+.TP
+.B # needsbinariesforbuild
+provide the binary rpms that have been used to set up the build root
+in
+.I /.build.binaries
+within the build root.
+.SH ENVIRONMENT
+.TP
+.B BUILD_ROOT
+The directory where build should install the chrooted build system.
+"/var/tmp/build-root" is used by default. See the \fB--root\fP option.
+.TP
+.B BUILD_RPMS
+This can be used instead of the \fB--rpms\fP option. Deprecated.
+.TP
+.B BUILD_RPM_BUILD_STAGE
+The rpm build stage (-ba, -bb, ...). This is just passed through to
+rpm, check the rpm manpage for a complete list and descriptions.
+"-ba" is the default. You should probably use the \fB--stage\fP
+option instead.
+
+.SH SEE ALSO
+.BR rpm (8), dpkg (8), pacman (8), kiwi (8)
+.TP
+.BR "Maximum RPM":
+.I http://www.rpm.org/max-rpm/
+.TP
+.BR "cross distribution packaging":
+.I http://en.opensuse.org/openSUSE:Build_Service_cross_distribution_howto
+.TP
+.BR "openSUSE packaging standards and guidelines":
+.I http://en.opensuse.org/Portal:Packaging
diff --git a/build.conf.example b/build.conf.example
new file mode 100644
index 0000000..6f85a6d
--- /dev/null
+++ b/build.conf.example
@@ -0,0 +1,27 @@
+# Example configuration for buildroot and parameter whitelisting.
+# Can be used to make multi-user environments more secure. Everything is
+# allowed by default if no whitelist is defined.
+#
+# List of whitelisted build roots.
+# %user will be replaced with $SUDO_USER (or $USER when running without sudo)
+#
+# ALLOW_BUILD_ROOT: /var/tmp/%user/build-root
+# ALLOW_BUILD_ROOT: /var/tmp/build-root
+
+# List of whitelisted parameters. Allowed parameters
+# must be listed in double dash format.
+#
+# ALLOW_PARAM: --arch
+# ALLOW_PARAM: --changelog
+# ALLOW_PARAM: --clean
+# ALLOW_PARAM: --dist
+# ALLOW_PARAM: --jobs
+# ALLOW_PARAM: --noinit
+# ALLOW_PARAM: --norootforbuild
+# ALLOW_PARAM: --root
+# ALLOW_PARAM: --rpmlist
+#
+# Specific parameter arguments can be whitelisted (other arguments
+# are not allowed in that case):
+#
+# ALLOW_PARAM: --jobs 1
diff --git a/changelog2spec b/changelog2spec
new file mode 100755
index 0000000..d4c8f3c
--- /dev/null
+++ b/changelog2spec
@@ -0,0 +1,281 @@
+#!/usr/bin/perl -w
+
+#
+# Convert a SUSE or Debian changelog file to rpm format
+#
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use Date::Parse;
+use Time::Zone;
+
+use strict;
+
+my @wday = qw{Sun Mon Tue Wed Thu Fri Sat};
+my @mon = qw{Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec};
+
+my $ok;
+my $zone;
+my $test;
+my $fulltimestamps;
+my $emailonly;
+my $printtype;
+my $input = '';
+my $target = 'rpm';
+
+while (@ARGV) {
+ if ($ARGV[0] eq '--selftest') {
+ shift;
+ print map_changes(@ARGV);
+ exit 0;
+ }
+ if ($ARGV[0] eq '--test') {
+ $test = 1;
+ shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--type') {
+ $printtype = 1;
+ shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--fulltimestamps') {
+ $fulltimestamps = 1;
+ shift @ARGV;
+ next;
+ }
+ if (@ARGV > 1 && $ARGV[0] eq '--target') {
+ shift @ARGV;
+ $target = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--emailonly') {
+ $emailonly = 1;
+ shift @ARGV;
+ next;
+ }
+ last;
+}
+
+if (@ARGV == 2 && $ARGV[0] eq '--file') {
+ die("bad --file arg\n") unless $ARGV[1] =~ /^(.*)\/([^\/]+)$/;
+ my ($dir, $file) = ($1, $2);
+ $file =~ s/\.(?:spec|dsc)$//;
+ opendir(D, $dir) || die("$dir: $!\n");
+ my @changes = grep {/\.changes$/} readdir(D);
+ closedir(D);
+ my $changesfile=map_changes($file, @changes);
+ exit(1) unless $changesfile;
+ @ARGV = ("$dir/$changesfile");
+}
+
+sub map_changes
+{
+ my ($file, @changes) = @_;
+ @changes = sort {length($a) <=> length($b) || $a cmp $b} @changes;
+ # support _service: prefixes, they need to be stripped
+ $file =~ s/^_service:.*://;
+ my %changes = map {/^((?:_service:.*:)?(.*?))$/ ? ($2, $1) : ($_, $_)} @changes;
+ @changes = keys %changes;
+ return undef unless @changes; # nothing to do
+ @changes = sort {length($a) <=> length($b) || $a cmp $b} @changes;
+ if (@changes > 1) {
+ while ($file ne '') {
+ my @c = grep {/\Q${file}.changes\E/} @changes;
+ if (@c) {
+ @changes = @c;
+ last;
+ }
+ last unless $file =~ s/[-.][^-.]*$//;
+ }
+ }
+ return $changes{$changes[0]};
+}
+
+sub parse_suse {
+ $_ = $_[0];
+
+ my $dline;
+ die("bad changelog heading\n") unless /^(?:\* )?([A-Za-z]+\s+[A-Za-z]+\s+[0-9][^-]*?[0-9][0-9][0-9][0-9])(.*\@.*$)/;
+ my $dt = $1;
+ my $who = $2;
+ $dt = lc($dt);
+ $who =~ s/^\s+//;
+ $who =~ s/^-\s*//;
+ $who = $1 if $emailonly && $who =~ /\<(.*)\>/;
+ $dt =~ /([0-9][0-9][0-9][0-9])/;
+ $dline = $_;
+ my $year = $1;
+ if (!defined($zone) && $dt =~ /\s([a-z]{3,4})(dst)?\s[0-9]{4}/) {
+ my $dst = $2;
+ $zone = tz_offset($1);
+ $zone += 3600 if defined($zone) && $dst;
+ }
+ my $tdt = str2time($dt);
+ $dt =~ /([0-9]+)/;
+ my $day = $1;
+ if (!$tdt) {
+ if ($dt =~ /([a-z]{3})\s+([a-z]{3})/) {
+ $tdt = str2time("$1 $2 $day $year");
+ }
+ }
+ if (!$tdt) {
+ if ($dt =~ /([a-z]{3})/) {
+ $tdt = str2time("$1 $day $year");
+ }
+ }
+ if (!$tdt) {
+ $tdt = str2time("$year-1-1");
+ }
+ $tdt += 12 * 3600 unless $dt =~ /\d:\d/; # 12:00 if not specified
+ $tdt += ($zone || 0);
+ my $ok = 1;
+ my $change = '';
+ while(<>) {
+ chomp;
+ last if /^(?:\* )?([A-Za-z]+\s+[A-Za-z]+\s+[0-9][^-]*?[0-9][0-9][0-9][0-9])(.*\@.*$)/;
+ next if (/^--------------/);
+ next if (/^========================/);
+ s/\s+$//;
+ next if $_ eq '';
+ s/^\s*-/-/ if $ok == 1; # obsolete?
+ s/^\s*\*\s*/ * /;
+ if (!/^-/) {
+ s/^\s+-\s*/ - /;
+ s/^\s*/ / unless s/^ \s*/ /;
+ }
+ $change .= "$_\n";
+ $ok = 2;
+ }
+ return ($_, $tdt, $dline, $who, $change);
+}
+
+sub parse_debian {
+ $_ = $_[0];
+
+ die("bad line: $_\n") unless /^(\w[-+0-9a-z.]*) \(([^\(\) \t]+)\)((\s+[-+0-9a-z.]+)+)\;.*$/;
+ my $package = $1;
+ my $version = $2;
+ my $distribution = $3;
+ my $who;
+ my $date;
+ my $changes = "- version $version\n";
+ while(<>) {
+ chomp;
+ s/\s+$//;
+ next if $_ eq '';
+ if (/^ --/) {
+ die("bad maintainer line\n") unless /^ \-\- (.* <.*>) (.*)$/;
+ $who = $1;
+ $date = $2;
+ last;
+ }
+ die("bad change details line: $_\n") unless s/^ //;
+ s/^\*/-/;
+ s/\s*\(closes:\s*(?:bug)?\#?\s?\d+(?:,\s*(?:bug)?\#?\s?\d+)*\)//i;
+ s/\s+$//;
+ next if $_ eq '';
+ $changes .= "$_\n";
+ }
+ die("no maintainer line in last entry\n") unless defined $date;
+ if (!defined($zone) && ($date =~ /([-+])(\d\d)(\d\d)$/)) {
+ $zone = 60 * ($3 + 60 * $2);
+ $zone = -$zone if $1 eq '-';
+ }
+ my $tdt = str2time($date);
+ return ('', $tdt, $_, $who, $changes);
+}
+
+my $format;
+while (<>) {
+ chomp;
+ next if /^\s*$/;
+ next if (/^--------------/);
+ next if (/^========================/);
+ if (/^(?:\* )?([A-Za-z]+\s+[A-Za-z]+\s+[0-9][^-]*?[0-9][0-9][0-9][0-9])(.*\@.*$)/) {
+ # suse : * Fri Jun 07 2013 First Last <first.last@example.com>
+ # tizen: * Fri Jun 07 2013 First Last <first.last@example.com> tagname@commitid
+ $format = 'suse';
+ } elsif (/^(\w[-+0-9a-z.]*) \(([^\(\) \t]+)\)((\s+[-+0-9a-z.]+)+)\;.*$/) {
+ $format = 'debian';
+ } else {
+ die("unknown changelog format\n");
+ }
+ last;
+}
+exit(0) unless $format;
+
+if ($printtype) {
+ print "$format\n";
+ exit(0);
+}
+
+if ($target eq $format) {
+ print "$_\n";
+ while (<>) {
+ print $_;
+ }
+ exit(0);
+}
+
+die("don't know how to convert changelog to format '$target'\n") if $target ne 'rpm';
+
+my ($lastt, $t, $dline, $who, $changes);
+while(defined($_)) {
+ if (/^\s*$/) {
+ $_ = <>;
+ last unless $_;
+ chomp;
+ next;
+ }
+ if ($format eq 'suse') {
+ ($_, $t, $dline, $who, $changes) = parse_suse($_);
+ } elsif ($format eq 'debian') {
+ ($_, $t, $dline, $who, $changes) = parse_debian($_);
+ }
+ if (defined($lastt) && $lastt < $t) {
+ die("changes file not incremental: $dline\n") if $test;
+ warn("changes file not incremental: $dline\n");
+ }
+ $lastt = $t;
+ my @gm = gmtime($t);
+ # silly rpm can't hande dates < 1997, so we fold everything to
+ # Thu Jan 02 1997
+ @gm = (0, 0, 0, 2, 0, 97, 4) if $gm[5] < 97 || ($gm[5] == 97 && $gm[4] == 0 && $gm[3] <= 1);
+ $gm[6] = $wday[$gm[6]];
+ $gm[5] += 1900;
+ $gm[4] = $mon[$gm[4]];
+ if($fulltimestamps) {
+ printf("* %s %s %2d %02d:%02d:%02d UTC %4d %s\n", @gm[6,4,3,2,1,0,5], $who);
+ } else {
+ printf("* %s %s %2d %4d %s\n", @gm[6,4,3,5], $who);
+ }
+ $changes =~ s/%/%%/g;
+ $changes =~ s/^(\s*)%%(\S*)/$1\[%%$2\]/;
+ $changes =~ s/^(\s*)(\#\d*)/$1\[$2\]/mg;
+ $changes =~ s/^\*/ */mg;
+ print $changes;
+}
+exit(0);
diff --git a/common_functions b/common_functions
new file mode 100755
index 0000000..45f970b
--- /dev/null
+++ b/common_functions
@@ -0,0 +1,141 @@
+#!/bin/bash
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+build_host_arch() {
+ : ${BUILD_HOST_ARCH:=`uname -m`}
+ # the linux kernel only knows armv7l, armv7hl is a userland definition
+ test armv7l == "$BUILD_HOST_ARCH" && BUILD_HOST_ARCH=armv7hl
+
+ BUILD_INITVM_ARCH="$BUILD_HOST_ARCH"
+ # avoid multiple initvm.* helpers for i586 and i686
+ test i686 != "$BUILD_INITVM_ARCH" || BUILD_INITVM_ARCH=i586
+}
+
+extend_build_arch() {
+ case $BUILD_ARCH in
+ aarch64) BUILD_ARCH="aarch64:aarch64_ilp32:armv8l" ;;
+ aarch64_ilp32) BUILD_ARCH="aarch64_ilp32:aarch64:armv8l" ;;
+ armv8l) BUILD_ARCH="armv8l" ;; # armv8l is aarch64 in 32bit mode. not a superset of armv7
+ armv7hl) BUILD_ARCH="armv7hl:armv7l:armv6hl:armv6l:armv5tel" ;;
+ armv7l) BUILD_ARCH="armv7l:armv6l:armv5tel" ;;
+ armv6hl) BUILD_ARCH="armv6hl:armv6l:armv5tel" ;;
+ armv6l) BUILD_ARCH="armv6l:armv5tel" ;;
+ armv5tel) BUILD_ARCH="armv5tel" ;;
+ m68k) BUILD_ARCH="m68k" ;;
+ mips64) BUILD_ARCH="mips64:mips" ;;
+ mips) BUILD_ARCH="mips" ;;
+ i686) BUILD_ARCH="i686:i586:i486:i386" ;;
+ i586) BUILD_ARCH="i586:i486:i386" ;;
+ i486) BUILD_ARCH="i486:i386" ;;
+ i386) BUILD_ARCH="i386" ;;
+ ia64) BUILD_ARCH="ia64" ;;
+ parisc64) BUILD_ARCH="hppa64:hppa" ;;
+ parisc) BUILD_ARCH="hppa" ;;
+ ppc) BUILD_ARCH="ppc" ;;
+ ppc64) BUILD_ARCH="ppc64:ppc" ;;
+ ppc64le) BUILD_ARCH="ppc64le" ;;
+ riscv64) BUILD_ARCH="riscv64" ;;
+ s390x) BUILD_ARCH="s390x:s390" ;;
+ s390) BUILD_ARCH="s390" ;;
+ sparc64v) BUILD_ARCH="sparc64v:sparc64:sparcv9v:sparcv9:sparcv8:sparc" ;;
+ sparc64) BUILD_ARCH="sparc64:sparcv9:sparcv8:sparc" ;;
+ sparcv9v) BUILD_ARCH="sparcv9v:sparcv9:sparcv8:sparc" ;;
+ sparcv9) BUILD_ARCH="sparcv9:sparcv8:sparc" ;;
+ sparcv8) BUILD_ARCH="sparcv8:sparc" ;;
+ 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 "
+ if test "$cpuflags" = "${cpuflags/ cx8 /}" -o "$cpuflags" = "${cpuflags/ cmov /}"; then
+ echo "Your cpu doesn't support i686 rpms. Exit."
+ cleanup_and_exit 1
+ fi
+ fi
+}
+
+check_exit() {
+ if test -e $BUILD_ROOT/exit; then
+ echo "exit ..."
+ cleanup_and_exit 1
+ fi
+}
+
+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 vm, we need to
+ # register it with a static program or shell script
+ 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
+}
+
+# usage:
+# progress_setup LIST
+# for I in $LIST; do
+# progress_step LIST
+# action $I
+# done
+
+# $1 name of a textual list
+progress_setup() {
+ eval "$1__ARRAY__=(\$$1)"
+ eval "$1__INDEX__=1"
+ eval "$1__LENGTH__=\${#$1__ARRAY__[@]}"
+}
+
+# $1 name of a textual list
+# $2 optional, printf format for 2 numeric arguments (current, total)
+progress_step() {
+ local IDX=$1__INDEX__
+ local LEN=$1__LENGTH__
+ printf "${2-[%d/%d] }" $(($IDX++)) ${!LEN}
+}
diff --git a/computeblocklists b/computeblocklists
new file mode 100755
index 0000000..ca99c3d
--- /dev/null
+++ b/computeblocklists
@@ -0,0 +1,330 @@
+#!/usr/bin/perl -w
+# compute the blocks used by a file
+# usage:
+# computeblocklists [options] <files...>
+# options:
+# --padstart NUM, --padend NUM, --verbose
+#
+# output:
+# <file base name> <size> <blocksize> <block numbers...>
+#
+# a block is either a number or a range (start-end)
+#
+
+################################################################
+#
+# Copyright (c) 1995-2018 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+use strict;
+
+# the ioctls we use
+my $FIBMAP = 1;
+my $FIGETBSZ = 2;
+my $FIEMAP = 0xc020660b; # _IOWR('f', 11, struct fiemap)
+
+# powerpc, mips, sparc, and alpha have 3 direction bits
+# and represent _IOC_NONE as 1 instead of 0.
+sub alt_ioctl($) {
+ my ($ioctl_nr) = @_;
+ my $size = ($ioctl_nr >> 16) & 0x3fff;
+ my $dir = ($ioctl_nr >> 30);
+ my $base = $ioctl_nr & 0x1fffffff;
+ die "invalid size $size" if ($size > (1 << 13));
+ return $base | ($dir + 1) << 29;
+}
+
+#
+# Use FIBMAP to gather block lists, block-by-block
+# This is the older, slower way to iterate over file extents but
+# will generally work on older kernels. The block number also
+# must fit into an integer limiting the size of the file system.
+#
+sub fibmap_blocklist($$$) {
+ my ($fd, $filesize, $bsize) = @_;
+
+ my $exts = '';
+ my $blocks = int(($filesize + $bsize - 1) / $bsize);
+ die("file is too big for fibmap\n") if $blocks * $bsize < $filesize;
+ my ($firstblock, $lastblock);
+ for (my $cnt = 0; $cnt < $blocks; ++$cnt) {
+ my $block = pack('I', $cnt);
+ if (not defined ioctl($fd, $FIBMAP, $block)) {
+ if (not defined ioctl($fd, alt_ioctl($FIBMAP), $block)) {
+ die("fibmap ioctl: $!\n");
+ }
+ }
+ $block = unpack('I', $block);
+ if (defined($firstblock) && $block == ($firstblock ? $lastblock + 1 : 0)) {
+ $lastblock++; # continue run
+ next;
+ }
+ # finish old run
+ $exts .= "-$lastblock" if defined($firstblock) && $firstblock != $lastblock;
+ # start new run
+ $exts .= " $block";
+ $firstblock = $lastblock = $block;
+ }
+ # finish last run
+ $exts .= "-$lastblock" if defined($firstblock) && $firstblock != $lastblock;
+ return $exts;
+}
+
+#
+# Use the FIEMAP ioctl to gather block lists, defined extent at a time
+# This is the newer way to gather extent information. We iterate the file
+# up to 50 extents at a time, each describing a contiguous, non-hole, range.
+#
+# see /usr/include/linux/fiemap.h for definitions of the flags used below
+#
+my $q_emu = 0; # 0=no emu, 1=little endian, 2=big endian
+
+sub pack_Q {
+ my ($v) = @_;
+ return pack('Q', $v) unless $q_emu;
+ my $v1 = int($v / 4294967296);
+ my $v2 = int($v - 4294967296 * $v1);
+ ($v1, $v2) = ($v2, $v1) if $q_emu == 1;
+ return pack('LL', $v1, $v2);
+}
+
+sub unpack_Q {
+ return unpack('Q', $_[0]) unless $q_emu;
+ my ($v1, $v2) = unpack('LL', $_[0]);
+ ($v1, $v2) = ($v2, $v1) if $q_emu == 1;
+ my $v = $v1 * 4294967296 + $v2;
+ die("unpack_Q: number too big\n") if int($v - 4294967296 * $v1) != $v2;
+ return $v;
+}
+
+# Convert a size into a block number and an offset.
+sub bytes_in_blocks($$) {
+ my ($bytes, $bsize) = @_;
+ my $blk = int($bytes / ($bsize * 65536)) * 65536; # work with 32bit int
+ $blk += int(($bytes - $blk * $bsize) / $bsize);
+ return ($blk, $bytes - $blk * $bsize);
+}
+
+# Create an extent descriptor
+sub createext($$$;$) {
+ my ($start, $end, $bsize, $islast) = @_;
+ die if $start > $end;
+ my ($startblk, $startoff) = bytes_in_blocks($start, $bsize);
+ my ($endblk, $endoff) = bytes_in_blocks($end, $bsize);
+ $endoff = $bsize - 1 if $islast;
+ my $ext = " $startblk";
+ $ext .= ":$startoff" if $startoff != 0;
+ if ($startblk != $endblk || $endoff != $bsize - 1) {
+ $ext .= "-$endblk";
+ $ext .= ":$endoff" if $endoff != $bsize - 1;
+ }
+ return $ext;
+}
+
+sub fiemap_blocklist($$$) {
+ my ($file, $filesize, $bsize) = @_;
+
+ # check if pack/unpack supports the Q template
+ $q_emu = 0;
+ eval { die if unpack('Q', pack('Q', 1)) != 1 };
+ if ($@) {
+ # nope, fallback to encode/decode helpers
+ $q_emu = unpack('C', pack('L', 1)) ? 1 : 2;
+ }
+
+ my $exts = '';
+ my $offset = 0;
+ while ($offset < $filesize) {
+ my $flags_in = 0x00000001; # FIEMAP_FLAG_SYNC
+ my $x = pack("a8a8IIIx4.", pack_Q($offset), pack_Q($filesize), $flags_in, 0, 50, 4096);
+
+ if (not defined ioctl($file, $FIEMAP, $x)) {
+ if (not defined ioctl($file, alt_ioctl($FIEMAP), $x)) {
+ die("fiemap ioctl: $!\n");
+ }
+ }
+
+ my ($flags, $count, @extents) = unpack('x16IIx8(a8a8a8a8a8IIII)[50]', $x);
+ last if $count == 0; # rest is a hole
+
+ for (my $i = 0; $i < $count; $i++) {
+ $extents[$_] = unpack_Q($extents[$_]) for 0, 1, 2;
+ my ($logical, $physical, $length, $resv1, $resv2, $flags) = splice(@extents, 0, 9);
+ die("logical offset outside of file?\n") if $logical < 0 || $logical >= $filesize;
+ die("going back in file?\n") if $offset > $logical;
+ die("extent with bad size?\n") if $length <= 0;
+ # add a hole entry if needed
+ $exts .= createext(0, $logical - $offset - 1, $bsize) if $offset < $logical;
+ my $islast = $logical + $length >= $filesize ? 1 : 0;
+ # Not a hole but for these purposes we should treat it as one
+ if ($flags & 0x00000800) { # UNWRITTEN
+ $exts .= createext(0, $length - 1, $bsize, $islast);
+ } elsif ($flags & 0x00000008) { # ENCODED
+ die("extent mapped but is encoded\n");
+ # UNKNOWN|DELALLOC|DATA_ENCRYPTED|NOT_ALIGNED|DATA_INLINE|DATA_TAIL
+ } elsif ($flags & 0x00000786) {
+ die("extent cannot be block-mapped\n");
+ } else {
+ $exts .= createext($physical, $physical + $length - 1, $bsize, $islast);
+ }
+ $offset = $logical + $length;
+ }
+ }
+ $exts .= createext(0, $filesize - $offset - 1, $bsize, 1) if $offset < $filesize;
+ return $exts;
+}
+
+my ($opt_padstart, $opt_padend, $opt_verbose, $opt_manifest, $opt_mani0, $opt_fibmap);
+$opt_verbose = 0;
+
+while (@ARGV) {
+ if ($ARGV[0] eq '--padstart') {
+ shift @ARGV;
+ $opt_padstart = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--padend') {
+ shift @ARGV;
+ $opt_padend = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--verbose' || $ARGV[0] eq '-v') {
+ shift @ARGV;
+ $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;
+ }
+ if ($ARGV[0] eq '--fibmap') {
+ shift @ARGV;
+ $opt_fibmap = 1;
+ next;
+ }
+ last;
+}
+
+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");
+ }
+}
+
+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/([\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 || $file =~ /^KIWI\/[^\/]*$/);
+ print "d $n\n";
+ next;
+ } elsif (! -f _) {
+ print STDERR "$file: unsupported file type, ignored\n";
+ next;
+ }
+ print STDERR "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//);
+
+ my $fd = undef;
+ if (!open($fd, '<', $file)) {
+ print STDERR "$file: $!\n";
+ next;
+ }
+
+ my @stat = stat($fd);
+ die unless @stat;
+ my $filesize = $stat[7];
+ if ($filesize == 0) {
+ print "f $n 0\n";
+ close($fd);
+ next;
+ }
+
+ my $bsize = pack('I', 0);
+ if (not defined ioctl($fd, $FIGETBSZ, $bsize)) {
+ if (not defined ioctl($fd, alt_ioctl($FIGETBSZ), $bsize)) {
+ die("$file: FIGETBSZ failed: $!\n");
+ }
+ }
+ $bsize = unpack('I', $bsize);
+ die("$file: illegal blocksize $bsize\n") unless $bsize > 0;
+
+ my $exts;
+ if (!$opt_fibmap) {
+ eval { $exts = fiemap_blocklist($fd, $filesize, $bsize) };
+ warn($@) if $@;
+ }
+ if (!defined($exts)) {
+ eval { $exts = fibmap_blocklist($fd, $filesize, $bsize) };
+ warn($@) if $@;
+ }
+ die "$file: could not get extent list\n" unless defined $exts;
+ print "f $n $filesize $bsize$exts\n";
+ close($fd);
+}
+
+print "\n"x$opt_padend if $opt_padend;
diff --git a/configs/arch.conf b/configs/arch.conf
new file mode 100644
index 0000000..900dbca
--- /dev/null
+++ b/configs/arch.conf
@@ -0,0 +1,25 @@
+Repotype: arch
+
+Preinstall: glibc bash perl sed grep coreutils pacman pacman-mirrorlist
+Preinstall: gawk gzip filesystem curl libidn acl gpgme libarchive
+Preinstall: openssl libssh2 zlib libassuan libgpg-error attr
+Preinstall: expat xz bzip2 readline lzo krb5 e2fsprogs keyutils
+Preinstall: ncurses lz4 libpsl icu gcc-libs libnghttp2 libidn2 libunistring
+
+VMinstall: util-linux libutil-linux binutils pcre libcap
+
+Required: binutils gcc glibc libtool
+
+Support: acl autoconf automake zlib bzip2 filesystem curl
+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 pkgconf inetutils
+Support: bison flex gettext which
+
+Prefer: zlib ttf-dejavu
+Prefer: libgl jdk7-openjdk libdrm
+
+Prefer: -nvidia-libgl -nvidia-304xx-utils
+Prefer: mesa-libgl
+Prefer: curl:ca-certificates
+
diff --git a/configs/collax.conf b/configs/collax.conf
new file mode 100644
index 0000000..4323f31
--- /dev/null
+++ b/configs/collax.conf
@@ -0,0 +1,7 @@
+Type: collax
+Repotype: debian
+
+Preinstall: acl akutils attr base-files bash bzip2 coreutils diffutils file
+Preinstall: findutils gawk grep gzip heirloom less lbzip2 libc6 libcap libdb
+Preinstall: libgcc1 libgdbmg1 libpam0 libstdc++-v3 m4 ncurses5 patch perl5.8
+Preinstall: pigz sed shadow tar texinfo unzip vim zlib1g
diff --git a/configs/debian-jessie.conf b/configs/debian-jessie.conf
new file mode 100644
index 0000000..62846d7
--- /dev/null
+++ b/configs/debian-jessie.conf
@@ -0,0 +1,39 @@
+Repotype: debian
+type: dsc
+buildengine: debootstrap
+
+Order: base-passwd:base-files
+Order: init-system-helpers:util-linux
+
+Preinstall: dash bash sed grep coreutils debianutils
+Preinstall: libc6 libncurses5 libacl1 libattr1 libpcre3
+Preinstall: diffutils tar dpkg libc-bin
+Preinstall: gzip base-files base-passwd
+Preinstall: libselinux1 libsepol1
+Preinstall: libgcc1 util-linux debconf tzdata findutils libdbus-1-3
+Preinstall: liblzma5 xz-utils libstdc++6 passwd
+Preinstall: login zlib1g libbz2-1.0 libtinfo5 libsigsegv2
+Preinstall: dash insserv libmpfr4 libgmp10 libdebconfclient0
+Preinstall: perl-base perl mawk init-system-helpers
+
+Required: build-essential apt mount fakeroot dpkg-dev ncurses-base hostname
+Required: libtool
+
+# Work around packge looking up variations of localhost .e.g glibc tries to look up localhost.
+Support: libnss-myhostname
+
+
+
+Prefer: cvs libesd0 libfam0 libfam-dev expect
+Prefer: mawk locales default-jdk
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend
+Prefer: sysv-rc make
+Prefer: libjack-jackd2-dev libsndio-dev
+Prefer: pkg-config
+Prefer: texlive-htmlxml
+Prefer: libjpeg-dev
+
diff --git a/configs/debian-unstable.conf b/configs/debian-unstable.conf
new file mode 100644
index 0000000..8e058cd
--- /dev/null
+++ b/configs/debian-unstable.conf
@@ -0,0 +1,41 @@
+Repotype: debian
+type: dsc
+buildengine: debootstrap
+
+Order: base-passwd:base-files
+
+Preinstall: dash bash sed grep coreutils debianutils
+Preinstall: libc6 libncurses5 libacl1 libattr1 libpcre3
+Preinstall: diffutils tar dpkg libc-bin
+Preinstall: gzip base-files base-passwd
+Preinstall: libselinux1 libsepol1
+Preinstall: libgcc1 util-linux debconf tzdata findutils libdbus-1-3
+Preinstall: liblzma5 xz-utils libstdc++6 passwd
+Preinstall: login zlib1g libbz2-1.0 libtinfo5 libsigsegv2
+Preinstall: dash insserv libmpfr4 libgmp10 libdebconfclient0
+Preinstall: perl-base perl libperl-dev mawk init-system-helpers
+
+Required: build-essential apt mount fakeroot dpkg-dev ncurses-base hostname
+Required: libtool
+
+# Work around packge looking up variations of localhost .e.g glibc tries to look up localhost.
+Support: libnss-myhostname
+
+Prefer: mawk
+Prefer: cvs libesd0 libfam0 libfam-dev expect
+Prefer: locales default-jdk
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend
+Prefer: sysv-rc make
+Prefer: libjack-jackd2-dev libsndio-dev
+Prefer: pkg-config
+Prefer: texlive-htmlxml
+
+Prefer: golang-github-miekg-dns-dev
+Prefer: golang-gopkg-yaml.v2-dev
+Prefer: golang-github-spf13-cobra-dev
+Prefer: golang-github-burntsushi-toml-dev
+
diff --git a/configs/debian.conf b/configs/debian.conf
new file mode 100644
index 0000000..a89534a
--- /dev/null
+++ b/configs/debian.conf
@@ -0,0 +1,183 @@
+Repotype: debian
+
+Preinstall: bash perl-base sed grep coreutils debianutils
+Preinstall: libc6 libncurses5 libacl1 libattr1
+Preinstall: libreadline4 tar gawk dpkg
+Preinstall: sysv-rc gzip base-files
+
+Runscripts: base-files initscripts
+
+VMinstall: util-linux binutils libblkid1 libuuid1 libdevmapper1.02 mount
+
+Required: autoconf automake binutils bzip2 gcc gettext libc6
+Required: libtool libncurses5 perl zlib1g dpkg
+
+Support: build-essential fakeroot
+Support: bison cpio cracklib2 cvs login
+Support: file findutils flex diff
+Support: groff-base gzip info less
+Support: make man module-init-tools
+Support: net-tools util-linux
+Support: patch procps psmisc rcs strace
+Support: texinfo unzip vim ncurses-base sysvinit
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gzip libada libstdc++ libunwind
+Keep: libunwind-devel libzio make mktemp pam-devel pam-modules
+Keep: patch perl rcs timezone
+Keep: linux-libc-dev
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: sysvinit:initscripts
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+Substitute: utempter
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel
+%else
+ %ifnarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel
+ %else
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+Substitute: glibc-devel-32bit
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-um kernel-xen kernel-kdump
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen kernel-kdump
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-kdump kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%enidf
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%enidf
diff --git a/configs/sl10.0.conf b/configs/sl10.0.conf
new file mode 100644
index 0000000..e9de0b1
--- /dev/null
+++ b/configs/sl10.0.conf
@@ -0,0 +1,202 @@
+Repotype: rpm-md suse
+
+Preinstall: aaa_base acl attr bash bzip2 coreutils db devs diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc libnscd libselinux libxcrypt m4 ncurses pam
+Preinstall: permissions popt pwdutils readline rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 db gcc gdbm gettext glibc
+Required: libtool ncurses perl rpm zlib
+
+Support: bind-libs bind-utils bison cpio cpp cracklib cvs cyrus-sasl
+Support: e2fsprogs file findutils flex gawk gdbm-devel gettext-devel
+Support: glibc-devel glibc-locale gpm groff gzip info klogd less
+Support: libcom_err libstdc++ libzio make man mktemp module-init-tools
+Support: ncurses-devel net-tools netcfg openldap2-client openssl
+Support: pam-modules patch procinfo procps psmisc rcs strace sysvinit
+Support: tcpd texinfo timezone unzip util-linux vim zlib-devel
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada libstdc++ libunwind
+Keep: libunwind-devel libzio make mktemp pam-devel pam-modules
+Keep: patch perl rcs timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel jpackage-utils update-alternatives
+%else
+ %ifarch ppc
+Substitute: java2-devel-packages IBMJava2-JRE IBMJava2-SDK jpackage-utils update-alternatives
+ %endif
+ %ifarch s390 ia64
+Substitute: java2-devel-packages java-1_4_2-ibm-devel jpackage-utils update-alternatives
+ %endif
+ %ifarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit jpackage-utils update-alternatives
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%suse_version 1000
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl10.1.conf b/configs/sl10.1.conf
new file mode 100644
index 0000000..654ea3e
--- /dev/null
+++ b/configs/sl10.1.conf
@@ -0,0 +1,196 @@
+Preinstall: aaa_base acl attr bash bzip2 coreutils db diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc libnscd libxcrypt m4 ncurses pam
+Preinstall: permissions popt pwdutils readline rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 db gcc gdbm gettext glibc
+Required: libtool ncurses perl rpm zlib
+
+Support: bind-libs bind-utils bison cpio cpp cracklib cvs cyrus-sasl
+Support: e2fsprogs file findutils flex gawk gdbm-devel gettext-devel
+Support: glibc-devel glibc-locale gpm groff gzip info klogd less
+Support: libcom_err libstdc++ libzio make man mktemp module-init-tools
+Support: ncurses-devel net-tools netcfg openldap2-client openssl
+Support: pam-modules patch procinfo procps psmisc rcs strace sysvinit
+Support: tcpd texinfo timezone unzip util-linux vim zlib-devel
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada libstdc++ libunwind
+Keep: libunwind-devel libzio make mktemp pam-devel pam-modules
+Keep: patch perl rcs timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel update-alternatives
+%else
+ %ifnarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel update-alternatives
+ %else
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit update-alternatives
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-um kernel-xen kernel-kdump
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen kernel-kdump
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-kdump kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%suse_version 1010
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl10.2.conf b/configs/sl10.2.conf
new file mode 100644
index 0000000..fdf5ec6
--- /dev/null
+++ b/configs/sl10.2.conf
@@ -0,0 +1,208 @@
+Preinstall: aaa_base acl attr bash bzip2 coreutils db diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc41 libnscd libxcrypt m4 ncurses pam
+Preinstall: permissions popt pwdutils readline rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl libvolume_id
+
+Required: autoconf automake binutils bzip2 db gcc gcc41
+Required: gdbm gettext glibc libtool ncurses perl rpm zlib
+
+Support: audit-libs bind-libs
+Support: bind-utils bison cpio cpp cpp41 cracklib cvs cyrus-sasl
+Support: e2fsprogs file findutils flex gawk gdbm-devel gettext-devel
+Support: glibc-devel glibc-locale gpm groff gzip info klogd less
+Support: libcom_err libltdl libmudflap41 libstdc++41 libzio
+Support: linux-kernel-headers make man mktemp module-init-tools
+Support: ncurses-devel net-tools netcfg openldap2-client openssl
+Support: pam-modules patch procinfo procps psmisc rcs strace sysvinit
+Support: tcpd texinfo timezone unzip util-linux vim zlib-devel
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada libstdc++ libunwind
+Keep: libunwind-devel libzio make mktemp pam-devel pam-modules
+Keep: patch perl rcs timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun java-1_4_2-sun-jdbc gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript-library gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder-lib
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit libcdio-mini faac-min
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office -java-1_5_0-ibm -java-1_5_0-ibm-jdbc
+Prefer: -java-1_4_2-gcj-compat -NX
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: mkinitrd:pciutils
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel update-alternatives
+%else
+ %ifnarch s390 ppc
+Substitute: java2-devel-packages java-1_4_2-ibm-devel update-alternatives
+ %endif
+ %ifarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit update-alternatives
+ %endif
+ %ifarch ia64
+Substitute: java2-devel-packages java-1_5_0-bea-devel update-alternatives
+ %endif
+%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-um kernel-xen kernel-kdump
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen kernel-kdump
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-kdump kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kernel-source kernel-syms
+%suse_version 1020
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl10.3.conf b/configs/sl10.3.conf
new file mode 100644
index 0000000..03b71c0
--- /dev/null
+++ b/configs/sl10.3.conf
@@ -0,0 +1,316 @@
+%define gcc_version 42
+
+Preinstall: aaa_base acl attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libbz2-1 libgcc%{gcc_version} libxcrypt m4 ncurses pam
+Preinstall: permissions popt libreadline5 rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl-base libdb-4_5 libvolume_id
+
+Required: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+Required: gettext glibc libtool ncurses perl rpm zlib
+
+Support: audit-libs cpio cpp cpp%{gcc_version} cracklib cvs
+Support: file findutils gawk gdbm gettext-devel
+Support: glibc-devel glibc-locale groff gzip info less
+Support: libbz2-devel libdb-4_5
+Support: libltdl-3 libmudflap%{gcc_version} libstdc++%{gcc_version}
+Support: libvolume_id libxcrypt libzio
+Support: linux-kernel-headers make man mktemp netcfg
+Support: net-tools pam-modules patch perl-base sysvinit
+Support: texinfo timezone util-linux
+%ifarch ia64
+Support: libunwind libunwind-devel
+%endif
+
+Keep: audit-libs binutils bzip2 cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada
+Keep: libunwind libunwind-devel libzio make mktemp pam-devel pam-modules
+Keep: patch perl-base perl rcs timezone
+Keep: cpp%{gcc_version} gcc%{gcc_version} gcc%{gcc_version}-ada libstdc++%{gcc_version}
+Keep: cpp41 gcc41 gcc41-ada libstdc++41
+
+Prefer: libreadline5
+Prefer: libdb_java-4_5 libltdl-3 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: java-1_5_0-sun java-1_5_0-sun-jdbc java-1_5_0-sun-devel java-1_5_0-bea-devel
+Prefer: gnome-panel desktop-data-SuSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript-library
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default
+Prefer: libstdc++%{gcc_version} libgcc%{gcc_version} libmudflap%{gcc_version}
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: saxon:java-1_4_2-cacao gjdoc:antlr
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm-devel
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs
+Prefer: gnu-jaf gnu-javamail avahi-compat-mDNSResponder yast2-control-center-qt
+Prefer: vim-normal myspell-american wine
+Prefer: eclipse-platform eclipse-scripts
+Prefer: yast2-theme-openSUSE
+
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+%if ! 0%{?opensuse_bs}
+Prefer: -crossover-office -java-1_5_0-ibm -java-1_5_0-ibm-jdbc
+Prefer: -java-1_4_2-gcj-compat -java-1_4_2-gcj-compat-devel
+%endif
+Prefer: -java-1_4_2-cacao -java-1_4_2-cacao-devel -java-1_4_2-ibm -java-1_4_2-ibm-devel
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: -libgcc41 -libgcc41-32bit -libgcc41-64bit
+Prefer: -libffi41
+Prefer: -libgcc43 -libgcc43-32bit -libgcc43-64bit
+Prefer: -libffi43 -libgomp43
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini
+Prefer: -libcdio-mini -faac-mini
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release,udev
+Ignore: gettext-devel:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+Ignore: OpenOffice_org:OpenOffice_org-i18n
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+
+%if 0%{?opensuse_bs}
+Substitute: java2-devel-packages gcc-java java-1_4_2-gcj-compat-devel
+%else
+ %ifnarch s390 s390x ppc ppc64 ia64
+Substitute: java2-devel-packages java-1_5_0-sun-devel unzip update-alternatives
+ %else
+ %ifarch s390 s390x ppc ppc64
+Substitute: java2-devel-packages java-1_5_0-ibm-devel unzip update-alternatives
+ %endif
+ %ifarch ia64
+Substitute: java2-devel-packages java-1_5_0-bea-devel unzip update-alternatives
+ %endif
+ %endif
+%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen kernel-xenpae
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-kdump kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+%ifarch ppc64
+Substitute: mono-devel mono-devel mono-biarchcompat
+Substitute: mono-basic mono-basic mono-biarchcompat
+Substitute: mono-tools mono-tools mono-biarchcompat
+%endif
+
+
+Optflags: i586 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+Optflags: i686 -march=i686 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+Optflags: x86_64 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+Optflags: ppc -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+Optflags: ppc64 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+
+Optflags: * -O2
+
+%define suse_version 1030
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kernel-source kernel-syms
+%suse_version 1030
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl11.0.conf b/configs/sl11.0.conf
new file mode 100644
index 0000000..3b1a048
--- /dev/null
+++ b/configs/sl11.0.conf
@@ -0,0 +1,377 @@
+%define gcc_version 43
+
+Preinstall: aaa_base acl attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libbz2-1 libgcc%{gcc_version} libxcrypt m4 libncurses5 pam
+Preinstall: permissions popt libreadline5 rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl-base libdb-4_5 libvolume_id
+
+Required: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+Required: gettext-runtime glibc libtool perl rpm zlib libmpfr1 gmp
+Required: libncurses5
+
+Support: audit-libs cpio cpp cpp%{gcc_version} cracklib cvs
+Support: file findutils gawk gdbm gettext-tools
+Support: glibc-devel glibc-locale groff gzip info less
+Support: libbz2-devel libdb-4_5
+Support: libltdl-3 libmudflap%{gcc_version} libstdc++%{gcc_version}
+Support: libvolume_id libxcrypt libzio
+Support: linux-kernel-headers make man netcfg
+Support: net-tools pam-modules patch perl-base sysvinit
+Support: texinfo timezone util-linux login
+Support: terminfo-base libgomp43 libuuid1 psmisc
+%ifarch ia64
+Support: libunwind libunwind-devel
+%endif
+
+Keep: audit-libs binutils bzip2 cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada
+Keep: libunwind libunwind-devel libzio make pam-devel pam-modules
+Keep: patch perl-base perl rcs timezone gmp libmpfr1
+Keep: cpp43 gcc43 gcc43-ada libstdc++43
+Keep: cpp42 gcc42 gcc42-ada libstdc++42
+Keep: cpp41 gcc41 gcc41-ada libstdc++41
+Keep: java-1_6_0-openjdk java-1_6_0-openjdk-devel
+
+Prefer: libreadline5
+Prefer: libdb_java-4_5 libltdl-3 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: java-1_5_0-sun java-1_5_0-sun-jdbc java-1_5_0-sun-devel java-1_5_0-bea java-1_5_0-bea-devel
+Prefer: java-1_7_0-icedtea
+%ifarch ppc ppc64
+Prefer: java-1_5_0-ibm
+%endif
+%ifarch s390 s390x
+Prefer: java-1_6_0-ibm
+%endif
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript-library
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default
+Prefer: libstdc++%{gcc_version} libgcc%{gcc_version}
+Prefer: libstdc++%{gcc_version}-32bit libstdc++%{gcc_version}-64bit
+Prefer: libstroke
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: saxon:java-1_4_2-cacao gjdoc:antlr
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm-devel
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs
+Prefer: gnu-jaf gnu-javamail avahi-compat-mDNSResponder yast2-control-center-qt
+Prefer: vim-normal myspell-american wine
+Prefer: eclipse-platform eclipse-scripts
+Prefer: yast2-theme-openSUSE
+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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: xfce4-desktop:xfce4-desktop-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: OpenOffice_org:OpenOffice_org-branding-upstream
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: glib2:glib2-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+%if ! 0%{?opensuse_bs}
+Prefer: -crossover-office
+%ifnarch s390 s390x
+Prefer: -java-1_6_0-ibm
+%endif
+%ifnarch ppc
+Prefer: -java-1_5_0-ibm -java-1_5_0-ibm-jdbc
+%endif
+Prefer: -java-1_4_2-gcj-compat -java-1_4_2-gcj-compat-devel
+%endif
+Prefer: -java-1_4_2-cacao -java-1_4_2-cacao-devel -java-1_4_2-ibm -java-1_4_2-ibm-devel
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc%{gcc_version} libgcc%{gcc_version}-32bit libgcc%{gcc_version}-64bit
+Prefer: libgcc%{gcc_version}-x86 libffi%{gcc_version} libgcj_bc%{gcc_version}
+Prefer: libgomp%{gcc_version} libgomp%{gcc_version}-32bit libgomp%{gcc_version}-64bit
+Prefer: libmudflap%{gcc_version} libmudflap%{gcc_version}-32bit libmudflap%{gcc_version}-64bit
+Prefer: libobjc%{gcc_version}
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini
+Prefer: -libcdio-mini -faac-mini
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel
+
+Conflict: ghostscript-library:ghostscript-mini
+Conflict: ghostscript-fonts-std:ghostscript-mini
+
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release,udev
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+Ignore: OpenOffice_org:OpenOffice_org-i18n
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: yast2-casa-ats:CASA_auth_token_svc
+
+%if 0%{?opensuse_bs}
+Substitute: java2-devel-packages gcc-java java-1_4_2-gcj-compat-devel
+%else
+ %ifnarch s390 s390x ppc ppc64 ia64
+Substitute: java2-devel-packages java-1_5_0-sun-devel unzip update-alternatives
+ %else
+ %ifarch s390 s390x ppc ppc64
+Substitute: java2-devel-packages java-1_5_0-ibm-devel unzip update-alternatives
+ %endif
+ %ifarch ia64
+Substitute: java2-devel-packages java-1_5_0-bea-devel unzip update-alternatives
+ %endif
+ %endif
+%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-kdump kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+%ifarch ppc64
+Substitute: mono-devel mono-devel mono-biarchcompat
+Substitute: mono-basic mono-basic mono-biarchcompat
+Substitute: mono-tools mono-tools mono-biarchcompat
+%endif
+
+
+Optflags: i586 -march=i586 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+Optflags: i686 -march=i686 -mtune=i686 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+Optflags: x86_64 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+Optflags: ppc -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+Optflags: ppc64 -fmessage-length=0 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector
+
+Optflags: * -O2
+
+%define suse_version 1100
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kernel-source kernel-syms
+%kernel_module_package_buildreqs kernel-source kernel-syms
+%suse_version 1100
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl11.1.conf b/configs/sl11.1.conf
new file mode 100644
index 0000000..ef63de8
--- /dev/null
+++ b/configs/sl11.1.conf
@@ -0,0 +1,407 @@
+%define gcc_version 43
+
+Preinstall: aaa_base acl attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libbz2-1 libgcc%{gcc_version} libxcrypt m4 libncurses5 pam
+Preinstall: permissions popt libreadline5 rpm sed tar zlib libselinux1
+
+Runscripts: aaa_base
+
+Order: libopenssl0_9_8:openssl-certs
+
+VMinstall: util-linux perl-base libdb-4_5 libvolume_id1 libsepol1
+
+Required: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+Required: gettext-runtime glibc libtool perl rpm zlib libmpfr1 gmp
+Required: libncurses5
+
+Support: audit-libs cpio cpp cpp%{gcc_version} cracklib cvs
+Support: file findutils gawk gdbm gettext-tools
+Support: glibc-devel glibc-locale groff gzip info less
+Support: libbz2-devel libdb-4_5
+Support: libstdc++%{gcc_version}
+Support: libvolume_id1 libxcrypt libzio
+Support: linux-kernel-headers make man netcfg
+Support: net-tools pam-modules patch perl-base sysvinit
+Support: texinfo timezone util-linux login
+Support: libgomp43 libuuid1 psmisc
+Support: terminfo-base
+
+Support: build brp-check-suse post-build-checks rpmlint-Factory
+Keep: brp-check-suse
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+%endif
+
+Keep: audit-libs binutils bzip2 cpio cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada
+Keep: libunwind libunwind-devel libzio make pam-devel pam-modules
+Keep: patch perl-base perl rcs timezone gmp libmpfr1
+Keep: cpp43 gcc43 gcc43-ada libstdc++43
+Keep: cpp42 gcc42 gcc42-ada libstdc++42
+Keep: cpp41 gcc41 gcc41-ada libstdc++41
+Keep: java-1_6_0-openjdk java-1_6_0-openjdk-devel
+Keep: libvolume_id libvolume_id1
+
+Prefer: -openSUSE-build-key
+Prefer: libreadline5
+Prefer: libdb_java-4_5 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript-library
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default
+Prefer: libstdc++%{gcc_version} libgcc%{gcc_version}
+Prefer: libstdc++%{gcc_version}-32bit libstdc++%{gcc_version}-64bit
+Prefer: libstroke
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs
+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: 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: xfce4-desktop:xfce4-desktop-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: OpenOffice_org:OpenOffice_org-branding-upstream
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner190-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: ant:xerces-j2
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc%{gcc_version} libgcc%{gcc_version}-32bit libgcc%{gcc_version}-64bit
+Prefer: libgcc%{gcc_version}-x86 libffi%{gcc_version} libgcj_bc%{gcc_version}
+Prefer: libgomp%{gcc_version} libgomp%{gcc_version}-32bit libgomp%{gcc_version}-64bit
+Prefer: libmudflap%{gcc_version} libmudflap%{gcc_version}-32bit libmudflap%{gcc_version}-64bit
+Prefer: libobjc%{gcc_version}
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini
+Prefer: -libcdio-mini -faac-mini
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libevoldap-2_4-2
+Conflict: ghostscript-library:ghostscript-mini
+Conflict: ghostscript-fonts-std:ghostscript-mini
+Prefer: -libopenal0-soft -openal-soft -lsb-buildenv
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: OpenOffice_org:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-dvd9,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release,udev
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+Ignore: OpenOffice_org:OpenOffice_org-i18n
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+
+%ifarch s390 s390x
+Ignore: yast2-all-packages:yast2-x11
+%endif
+
+%ifnarch ia64 s390 s390x ppc ppc64
+Prefer: java-1_6_0-openjdk java-1_6_0-openjdk-devel
+%endif
+%ifarch s390 s390x ppc ppc64
+Prefer: java-1_6_0-ibm java-1_6_0-ibm-devel
+%endif
+%ifarch ia64
+Prefer: java-1_6_0-bea java-1_6_0-bea-devel
+%endif
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifnarch ia64 s390 s390x ppc ppc64
+Substitute: java2-devel-packages java-1_6_0-openjdk-devel
+%else
+ %ifarch s390 s390x ppc ppc64
+Substitute: java2-devel-packages java-1_6_0-ibm-devel unzip update-alternatives
+ %endif
+ %ifarch ia64
+Substitute: java2-devel-packages java-1_6_0-bea-devel unzip update-alternatives
+ %endif
+%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+%ifarch ppc64
+Substitute: mono-devel mono-devel mono-biarchcompat
+Substitute: mono-basic mono-basic mono-biarchcompat
+Substitute: mono-tools mono-tools mono-biarchcompat
+Substitute: mono-data-sqlite mono-data-sqlite libsqlite3-0-32bit
+%endif
+
+
+Optflags: i586 -march=i586 -mtune=i686 -fmessage-length=0
+Optflags: i686 -march=i686 -mtune=i686 -fmessage-length=0
+Optflags: x86_64 -fmessage-length=0
+Optflags: ppc -fmessage-length=0
+Optflags: ppc64 -fmessage-length=0
+Optflags: ia64 -fmessage-length=0
+Optflags: s390 -fmessage-length=0
+Optflags: s390x -fmessage-length=0
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1110
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+
+%suse_version 1110
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl11.2.conf b/configs/sl11.2.conf
new file mode 100644
index 0000000..daa1bcb
--- /dev/null
+++ b/configs/sl11.2.conf
@@ -0,0 +1,452 @@
+%define gcc_version 44
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux
+Substitute: kiwi-filesystem:ext3 e2fsprogs procps psmisc reiserfs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot module-init-tools elfutils squashfs aufs aufs-kmp-default
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-xenboot ncurses-utils curl dhcpcd iputils nbd net-tools netcfg nfs-client parted grub mdadm
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot
+Substitute: kiwi-boot:usbboot kiwi-desc-usbboot
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot
+
+Substitute: build:debug vim strace gdb
+
+Preinstall: aaa_base acl attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libbz2-1 libgcc%{gcc_version} libxcrypt m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar zlib libselinux1
+Preinstall: liblzma0 libcap2 libpcre0
+Preinstall: libpopt0 libelf1 liblua5_1
+
+Runscripts: aaa_base
+
+Order: libopenssl0_9_8:openssl-certs
+
+VMinstall: util-linux perl-base libdb-4_5 libsepol1 libblkid1 libuuid1
+
+Required: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+Required: gettext-runtime glibc libtool perl rpm zlib libmpfr1
+Required: libncurses5 libgmp3 libgmpxx4
+
+Support: audit-libs cpio cpp cpp%{gcc_version} cracklib cvs
+Support: file findutils gawk gdbm gettext-tools
+Support: glibc-devel glibc-locale groff gzip info less
+Support: libbz2-devel libdb-4_5
+Support: libstdc++%{gcc_version}
+Support: libxcrypt libzio
+Support: linux-kernel-headers make man netcfg
+Support: net-tools pam-modules patch perl-base sysvinit
+Support: texinfo timezone util-linux login
+Support: libgomp%{gcc_version} libuuid1 psmisc
+Support: terminfo-base
+
+# build tools packages
+Support: build brp-check-suse post-build-checks
+Support: rpmlint-Factory
+Keep: brp-check-suse
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+%endif
+
+Keep: audit-libs binutils bzip2 cpio cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada libpcre0
+Keep: libunwind libunwind-devel libzio make pam-devel pam-modules
+Keep: patch perl-base perl rcs timezone libmpfr1 libcap2
+Keep: gmp libgmp3 libgmpxx4
+Keep: cpp44 gcc44 gcc44-ada libstdc++44
+Keep: cpp43 gcc43 gcc43-ada libstdc++43
+Keep: cpp42 gcc42 gcc42-ada libstdc++42
+Keep: cpp41 gcc41 gcc41-ada libstdc++41
+Keep: java-1_6_0-openjdk java-1_6_0-openjdk-devel libcloog0 libppl7 libppl_c2
+Keep: libpopt0
+
+Prefer: -suse-build-key
+Prefer: krb5 krb5-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_5 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript-library
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default preload-kmp-default
+Prefer: libstdc++%{gcc_version} libgcc%{gcc_version}
+Prefer: libstdc++%{gcc_version}-32bit libstdc++%{gcc_version}-64bit
+Prefer: libstroke
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs
+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: 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: OpenOffice_org:OpenOffice_org-branding-upstream
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: beagle-index:preload-kmp-default
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc%{gcc_version} libgcc%{gcc_version}-32bit libgcc%{gcc_version}-64bit
+Prefer: libgcc%{gcc_version}-x86 libffi%{gcc_version} libgcj_bc%{gcc_version}
+Prefer: libgomp%{gcc_version} libgomp%{gcc_version}-32bit libgomp%{gcc_version}-64bit
+Prefer: libmudflap%{gcc_version} libmudflap%{gcc_version}-32bit libmudflap%{gcc_version}-64bit
+Prefer: libobjc%{gcc_version} libgfortran%{gcc_version}
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini
+Prefer: -libcdio-mini -faac-mini
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libevoldap-2_4-2
+Conflict: ghostscript-library:ghostscript-mini
+Conflict: ghostscript-fonts-std:ghostscript-mini
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: OpenOffice_org:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -java-1_7_0-icedtea-devel -libiniparser -loudmouth -libkonq4 -libnetcdf-4
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+
+#Temporary hack to solve #442202
+Ignore: yast2-all-packages:yast2-boot-server,yast2-heartbeat,yast2-issleconfig,yast2-linux-user-mgmt,yast2-trans-am,yast2-trans-be,yast2-trans-he,yast2-trans-ms,yast2-trans-my,yast2-trans-tk
+
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release,udev
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre,libpcre0
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+Ignore: OpenOffice_org:OpenOffice_org-i18n
+Ignore: OpenOffice_org:OpenOffice_org-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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: pulseaudio:kernel
+
+%ifarch s390 s390x
+Ignore: yast2-all-packages:yast2-x11
+%endif
+
+%ifnarch ia64 s390 s390x
+Prefer: java-1_6_0-openjdk java-1_6_0-openjdk-devel
+%endif
+%ifarch s390 s390x
+Prefer: java-1_6_0-ibm java-1_6_0-ibm-devel
+%endif
+%ifarch ia64
+Prefer: java-1_6_0-bea java-1_6_0-bea-devel
+%endif
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+Substitute: java2-devel-packages java-1_6_0-openjdk-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+Optflags: i586 -fomit-frame-pointer -fmessage-length=0
+Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0
+Optflags: x86_64 -fmessage-length=0
+Optflags: ppc -fmessage-length=0
+Optflags: ppc64 -fmessage-length=0
+Optflags: ia64 -fmessage-length=0
+Optflags: s390 -fmessage-length=0
+Optflags: s390x -fmessage-length=0
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1120
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+
+%suse_version 1120
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl11.3.conf b/configs/sl11.3.conf
new file mode 100644
index 0000000..4155315
--- /dev/null
+++ b/configs/sl11.3.conf
@@ -0,0 +1,489 @@
+%define gcc_version 45
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-11-3
+Substitute: kiwi-filesystem:ext3 e2fsprogs procps psmisc reiserfs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot module-init-tools elfutils squashfs clicfs e2fsprogs fribidi gfxboot-devel gawk gfxboot gfxboot-devel grub hdparm hwinfo iproute2 kiwi-tools lvm2 make memtest86+ netcfg psmisc
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-xenboot ncurses-utils curl dhcpcd iputils nbd net-tools netcfg nfs-client parted grub mdadm
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot
+Substitute: kiwi-boot:usbboot kiwi-desc-usbboot
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot
+
+Substitute: build:debug vim strace gdb
+
+Preinstall: aaa_base acl attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libbz2-1 libgcc%{gcc_version} libxcrypt m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar zlib libselinux1
+Preinstall: liblzma0 libcap2 libpcre0
+Preinstall: libpopt0 libelf1 liblua5_1
+
+Runscripts: aaa_base
+
+Order: libopenssl0_9_8:openssl-certs
+
+VMinstall: util-linux perl-base libdb-4_5 libsepol1 libblkid1 libuuid1
+
+Required: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+Required: gettext-runtime glibc libtool perl rpm zlib libmpfr1
+Required: libncurses5 libgmp3 libgmpxx4
+
+Support: libaudit1
+Support: cpio cpp cpp%{gcc_version} cracklib cvs
+Support: file findutils gawk gdbm gettext-tools
+Support: glibc-devel glibc-locale groff gzip info less
+Support: libbz2-devel libdb-4_5
+Support: libstdc++%{gcc_version}
+Support: libxcrypt libzio
+Support: make man netcfg
+Support: linux-glibc-devel
+Support: net-tools pam-modules patch perl-base sysvinit-tools
+Support: texinfo timezone util-linux login
+Support: libgomp%{gcc_version} libuuid1 psmisc
+Support: terminfo-base update-alternatives pwdutils build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+Keep: brp-check-suse
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+%endif
+
+Keep: libaudit1 binutils bzip2 cpio cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada libpcre0
+Keep: libunwind libunwind-devel libzio make pam-devel pam-modules
+Keep: patch perl-base perl rcs timezone libmpfr1 libcap2
+Keep: gmp libgmp3 libgmpxx4 libmpc2
+Keep: cpp45 gcc45 gcc45-ada libstdc++45
+Keep: cpp44 gcc44 gcc44-ada libstdc++44
+Keep: cpp43 gcc43 gcc43-ada libstdc++43
+Keep: cpp42 gcc42 gcc42-ada libstdc++42
+Keep: cpp41 gcc41 gcc41-ada libstdc++41
+Keep: java-1_6_0-openjdk java-1_6_0-openjdk-devel libcloog0 libppl7 libppl_c2
+Keep: libpopt0 pkg-config
+
+Prefer: -suse-build-key
+Prefer: krb5 krb5-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_5 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript-library
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default preload-kmp-default
+Prefer: libstdc++%{gcc_version} libgcc%{gcc_version}
+Prefer: libstdc++%{gcc_version}-32bit libstdc++%{gcc_version}-64bit
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs
+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: 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: OpenOffice_org:OpenOffice_org-branding-upstream
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: beagle-index:preload-kmp-default
+Prefer: dummy-release
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc%{gcc_version} libgcc%{gcc_version}-32bit libgcc%{gcc_version}-64bit
+Prefer: libgcc%{gcc_version}-x86 libffi%{gcc_version} libffi%{gcc_version}-devel libgcj_bc%{gcc_version}
+Prefer: libgomp%{gcc_version} libgomp%{gcc_version}-32bit libgomp%{gcc_version}-64bit
+Prefer: libmudflap%{gcc_version} libmudflap%{gcc_version}-32bit libmudflap%{gcc_version}-64bit
+Prefer: libobjc%{gcc_version} libgfortran%{gcc_version}
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini
+Prefer: -libcdio-mini -faac-mini
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libevoldap-2_4-2
+Conflict: ghostscript-library:ghostscript-mini
+Conflict: ghostscript-fonts-std:ghostscript-mini
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: OpenOffice_org:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -java-1_7_0-icedtea-devel -libiniparser -loudmouth -libkonq4 -libnetcdf-4
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng14-compat-devel
+Prefer: -python3 -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+
+#Temporary hack to solve #442202
+Ignore: yast2-all-packages:yast2-boot-server,yast2-heartbeat,yast2-issleconfig,yast2-linux-user-mgmt,yast2-trans-am,yast2-trans-be,yast2-trans-he,yast2-trans-ms,yast2-trans-my,yast2-trans-tk
+
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release,udev
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre,libpcre0
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+Ignore: OpenOffice_org:OpenOffice_org-i18n
+Ignore: OpenOffice_org:OpenOffice_org-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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+
+%ifnarch ia64 s390 s390x
+Prefer: java-1_6_0-openjdk java-1_6_0-openjdk-devel
+%endif
+%ifarch s390 s390x
+Prefer: java-1_6_0-ibm java-1_6_0-ibm-devel
+%endif
+%ifarch ia64
+Prefer: java-1_6_0-bea java-1_6_0-bea-devel
+%endif
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+# We use always openjdk on openSUSE !
+#%ifnarch ia64 s390 s390x
+Substitute: java2-devel-packages java-1_6_0-openjdk-devel
+#%else
+# %ifarch s390 s390x
+#Substitute: java2-devel-packages java-1_6_0-ibm-devel unzip update-alternatives
+# %endif
+# %ifarch ia64
+#Substitute: java2-devel-packages java-1_6_0-bea-devel unzip update-alternatives
+# %endif
+#%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+Optflags: i586 -fomit-frame-pointer -fmessage-length=0
+Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0
+Optflags: x86_64 -fmessage-length=0
+Optflags: ppc -fmessage-length=0
+Optflags: ppc64 -fmessage-length=0
+Optflags: ia64 -fmessage-length=0
+Optflags: s390 -fmessage-length=0
+Optflags: s390x -fmessage-length=0
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1130
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+
+%suse_version 1130
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl11.4.conf b/configs/sl11.4.conf
new file mode 100644
index 0000000..53a4b52
--- /dev/null
+++ b/configs/sl11.4.conf
@@ -0,0 +1,598 @@
+%define gcc_version 45
+
+Patterntype: rpm-md ymp
+%if "%_repository" == "images"
+Type: kiwi
+Repotype: none
+Patterntype: none
+Prefer: openSUSE-release
+%endif
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-11-3
+Substitute: kiwi-filesystem:ext3 e2fsprogs procps psmisc reiserfs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot module-init-tools elfutils squashfs fribidi gfxboot-devel gawk gfxboot gfxboot-devel grub hdparm hwinfo iproute2 kiwi-tools lvm2 make memtest86+ netcfg psmisc squashfs sysfsutils syslinux clicfs e2fsprogs
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot adaptec-firmware atftp bc bind-libs bind-utils bootsplash bootsplash-branding-openSUSE busybox bzip2 clicfs cryptsetup curl dhcpcd dialog e2fsprogs eject fbiterm file fribidi gettext-runtime gfxboot gfxboot-devel grub hwinfo kernel-default kernel-default-base kernel-desktop kexec-tools kiwi-tools lvm2 make module-init-tools netcfg net-tools parted pciutils psmisc squashfs sysconfig sysfsutils tar util-linux jing
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-xenboot ncurses-utils curl dhcpcd iputils nbd net-tools netcfg nfs-client parted grub mdadm
+Substitute: kiwi-boot:usbboot kiwi-desc-usbboot
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot
+
+Preinstall: aaa_base acl attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libbz2-1 libgcc%{gcc_version} libxcrypt m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar zlib libselinux1
+Preinstall: liblzma5 libcap2 libpcre0
+Preinstall: libpopt0 libelf1 liblua5_1
+
+Runscripts: aaa_base
+
+Order: libopenssl0_9_8:openssl-certs
+
+VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1
+
+ExportFilter: \.x86_64\.rpm$ x86_64
+ExportFilter: \.ia64\.rpm$ ia64
+ExportFilter: \.s390x\.rpm$ s390x
+ExportFilter: \.ppc64\.rpm$ ppc64
+ExportFilter: \.ppc\.rpm$ ppc
+ExportFilter: \.i686\.rpm$ i686
+ExportFilter: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+ExportFilter: ^glibc(?:-devel)?-64bit-.*\.sparcv9\.rpm$ sparcv9
+ExportFilter: ^blocxx-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^boost-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^bzip2-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^curl-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^dbus-1-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^dbus-1-glib-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^e2fsprogs-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^expat-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^fontconfig-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^freetype2-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^gcc45-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^gcc44-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^gcc43-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^glib2-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^glibc-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^hal-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^hwinfo-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^icu-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^jpeg-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^kdelibs3-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^kernel-default-.*(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^kernel-desktop-.*(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^kernel-pae-.*(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libidn-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libpng12-0-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libqt4-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libxcrypt-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libxml2-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libzypp-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^openssl-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^pcre-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^perl-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^perl-gettext-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^qt3-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^rpm-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^sysfsutils-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^wireless-tools-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libICE-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libSM-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libX11-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXau-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXdmcp-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXext-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXfixes-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXmu-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXrender-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libfontenc-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libs-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libxcb-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-server-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-core-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-hardware-detection-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-perl-bindings-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-pkg-bindings-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-qt-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-xml-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^zlib-(?:debuginfo|debugsource)-.*\.rpm$ .
+#ExportFilter: -debuginfo-.*\.rpm$
+#ExportFilter: -debugsource-.*\.rpm$
+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
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+ExportFilter: ^wine.*\.i586.rpm$ . x86_64
+
+#Required: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+#Required: gettext-runtime glibc libtool perl rpm zlib libmpfr4
+#Required: libncurses5 libgmp10 libgmpxx4 libppl9 libppl_c4
+Required: gcc gcc%{gcc_version} glibc perl rpm tar patch
+
+Support: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+Support: gettext-runtime glibc libtool perl rpm zlib
+Support: libncurses5
+Support: libaudit1 cpio cpp cpp%{gcc_version} cracklib cvs
+Support: file findutils gawk gdbm gettext-tools
+Support: glibc-devel glibc-locale groff gzip info less
+Support: libbz2-devel libdb-4_8
+Support: libstdc++%{gcc_version}
+# for boot.udev
+Support: udev
+Support: libxcrypt libzio
+Support: linux-glibc-devel make man netcfg
+Support: net-tools pam-modules patch perl-base sysvinit-tools
+Support: texinfo timezone util-linux libmount1 login
+Support: libgomp%{gcc_version} libuuid1 psmisc
+Support: terminfo-base update-alternatives pwdutils build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+Keep: brp-check-suse
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+
+# testing deltas (only for O:F for now!)
+#Support: build-mkdrpms deltarpm
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+%endif
+
+Keep: libaudit1 binutils bzip2 cpio cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada libpcre0
+Keep: libunwind libunwind-devel libzio make pam-devel pam-modules
+Keep: patch perl-base perl rcs timezone libmpfr4 libcap2
+Keep: gmp libgmp10 libgmpxx4 libmpc2
+Keep: cpp45 gcc45 gcc45-ada libstdc++45
+Keep: cpp44 gcc44 gcc44-ada libstdc++44
+Keep: cpp43 gcc43 gcc43-ada libstdc++43
+Keep: cpp42 gcc42 gcc42-ada libstdc++42
+Keep: cpp41 gcc41 gcc41-ada libstdc++41
+Keep: java-1_6_0-openjdk java-1_6_0-openjdk-devel libcloog0 libppl9 libppl_c4
+Keep: libpopt0 pkg-config libmount1
+
+Prefer: -suse-build-key
+Prefer: krb5 krb5-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript-library
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default preload-kmp-default
+Prefer: libstdc++%{gcc_version} libgcc%{gcc_version}
+Prefer: libstdc++%{gcc_version}-32bit libstdc++%{gcc_version}-64bit
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs
+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: 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: beagle-index:preload-kmp-default
+Prefer: dummy-release
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc%{gcc_version} libgcc%{gcc_version}-32bit libgcc%{gcc_version}-64bit
+Prefer: libgcc%{gcc_version}-x86 libffi%{gcc_version} libffi%{gcc_version}-devel libgcj_bc%{gcc_version}
+Prefer: libgomp%{gcc_version} libgomp%{gcc_version}-32bit libgomp%{gcc_version}-64bit
+Prefer: libmudflap%{gcc_version} libmudflap%{gcc_version}-32bit libmudflap%{gcc_version}-64bit
+Prefer: libobjc%{gcc_version} libgfortran%{gcc_version}
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Conflict: ghostscript-library:ghostscript-mini
+Conflict: ghostscript-fonts-std:ghostscript-mini
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -java-1_7_0-icedtea-devel -libiniparser -loudmouth -libkonq4 -libnetcdf-4
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng14-compat-devel
+Prefer: -python3 -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release,udev
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre,libpcre0
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+
+%ifnarch ia64 s390 s390x
+Prefer: java-1_6_0-openjdk java-1_6_0-openjdk-devel
+%endif
+%ifarch s390 s390x
+Prefer: java-1_6_0-ibm java-1_6_0-ibm-devel
+%endif
+%ifarch ia64
+Prefer: java-1_6_0-bea java-1_6_0-bea-devel
+%endif
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+# We use always openjdk on openSUSE !
+#%ifnarch ia64 s390 s390x
+Substitute: java2-devel-packages java-1_6_0-openjdk-devel
+#%else
+# %ifarch s390 s390x
+#Substitute: java2-devel-packages java-1_6_0-ibm-devel unzip update-alternatives
+# %endif
+# %ifarch ia64
+#Substitute: java2-devel-packages java-1_6_0-bea-devel unzip update-alternatives
+# %endif
+#%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+Optflags: i586 -fomit-frame-pointer -fmessage-length=0
+Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0
+Optflags: x86_64 -fmessage-length=0
+Optflags: ppc -fmessage-length=0
+Optflags: ppc64 -fmessage-length=0
+Optflags: ia64 -fmessage-length=0
+Optflags: s390 -fmessage-length=0
+Optflags: s390x -fmessage-length=0
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1140
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+
+%suse_version 1140
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sl12.1.conf b/configs/sl12.1.conf
new file mode 100644
index 0000000..8aa0cfc
--- /dev/null
+++ b/configs/sl12.1.conf
@@ -0,0 +1,636 @@
+%define gcc_version 46
+%define _with_aaa_base_malloc_debug 0
+
+Patterntype: rpm-md ymp
+%if "%_repository" == "images"
+Type: kiwi
+Repotype: none
+Patterntype: none
+Prefer: openSUSE-release
+%endif
+
+CiCntStart: 1.1
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-12-1 kiwi-instsource-plugins-openSUSE-11-3
+Substitute: kiwi-filesystem:ext3 e2fsprogs procps psmisc reiserfs
+Substitute: kiwi-filesystem:squashfs squashfs
+# cdrkit-cdrtools-compat should not be necessary - bnc#680148 (coolo)
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot module-init-tools elfutils squashfs fribidi gfxboot-devel gawk gfxboot gfxboot-devel grub hdparm hwinfo iproute2 kiwi-tools lvm2 make memtest86+ netcfg psmisc squashfs sysfsutils syslinux clicfs e2fsprogs cdrkit-cdrtools-compat
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot adaptec-firmware atftp bc bind-libs bind-utils bootsplash bootsplash-branding-openSUSE busybox bzip2 clicfs cryptsetup curl dhcpcd dialog e2fsprogs eject fbiterm file fribidi gettext-runtime gfxboot gfxboot-devel grub hwinfo kernel-default kernel-default-base kernel-desktop kexec-tools kiwi-tools lvm2 make module-init-tools netcfg net-tools parted pciutils psmisc squashfs sysconfig sysfsutils tar util-linux jing kernel-firmware
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-xenboot ncurses-utils curl dhcpcd iputils nbd net-tools netcfg nfs-client parted grub mdadm
+Substitute: kiwi-boot:usbboot kiwi
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot kernel-default kexec-tools
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep insserv
+Preinstall: libbz2-1 libgcc%{gcc_version} libxcrypt m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar zlib libselinux1
+Preinstall: liblzma5 libcap2 libpcre0 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_1
+
+Runscripts: aaa_base
+
+Order: libopenssl0_9_8:openssl-certs
+
+VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1
+
+ExportFilter: \.x86_64\.rpm$ x86_64
+ExportFilter: \.ia64\.rpm$ ia64
+ExportFilter: \.s390x\.rpm$ s390x
+ExportFilter: \.ppc64\.rpm$ ppc64
+ExportFilter: \.ppc\.rpm$ ppc
+ExportFilter: \.i686\.rpm$ i686
+ExportFilter: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+ExportFilter: ^glibc(?:-devel)?-64bit-.*\.sparcv9\.rpm$ sparcv9
+ExportFilter: ^blocxx-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^boost-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^bzip2-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^curl-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^dbus-1-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^dbus-1-glib-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^e2fsprogs-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^expat-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^fontconfig-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^freetype2-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^gcc46-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^gcc45-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^gcc44-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^gcc43-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^glib2-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^glibc-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^hal-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^hwinfo-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^icu-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^jpeg-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^kdelibs3-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^kernel-default-.*(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^kernel-desktop-.*(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^kernel-pae-.*(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libidn-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libpng12-0-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libqt4-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libxcrypt-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libxml2-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^libzypp-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^openssl-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^pcre-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^perl-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^perl-gettext-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^qt3-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^rpm-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^sysfsutils-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^wireless-tools-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libICE-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libSM-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libX11-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXau-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXdmcp-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXext-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXfixes-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXmu-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libXrender-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libfontenc-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libs-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-libxcb-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^xorg-x11-server-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-core-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-hardware-detection-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-perl-bindings-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-pkg-bindings-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-qt-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^yast2-xml-(?:debuginfo|debugsource)-.*\.rpm$ .
+ExportFilter: ^zlib-(?:debuginfo|debugsource)-.*\.rpm$ .
+#ExportFilter: -debuginfo-.*\.rpm$
+#ExportFilter: -debugsource-.*\.rpm$
+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
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+ExportFilter: ^wine.*\.i586.rpm$ . x86_64
+
+#Required: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+#Required: gettext-runtime glibc libtool perl rpm zlib libmpfr4
+#Required: libncurses5 libgmp10 libgmpxx4 libppl9 libppl_c4
+Required: gcc gcc%{gcc_version} glibc perl rpm tar patch
+
+Support: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+Support: gettext-runtime glibc libtool perl rpm zlib
+Support: libncurses5
+Support: libaudit1 cpio cpp cpp%{gcc_version} cracklib cvs
+Support: file findutils gawk gdbm gettext-tools
+Support: glibc-devel glibc-locale groff gzip info less
+Support: libbz2-devel libdb-4_8
+Support: libstdc++%{gcc_version}
+# for boot.udev
+Support: udev
+Support: libxcrypt libzio
+Support: linux-glibc-devel make man netcfg
+Support: net-tools pam-modules patch perl-base sysvinit-tools
+Support: texinfo timezone util-linux libmount1 login
+Support: libgomp%{gcc_version} libuuid1 psmisc
+Support: terminfo-base update-alternatives pwdutils build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+Keep: brp-check-suse
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+
+# testing deltas (only for O:F for now!)
+#Support: build-mkdrpms deltarpm
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+Preinstall: libunwind
+%endif
+
+Keep: libaudit1 binutils bzip2 cpio cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada libpcre0
+Keep: libunwind libunwind-devel libzio make pam-devel pam-modules
+Keep: patch perl-base perl rcs timezone libmpfr4 libcap2
+Keep: gmp libgmp10 libgmpxx4 libmpc2
+Keep: cpp46 gcc46 gcc46-ada libstdc++46
+Keep: cpp45 gcc45 gcc45-ada libstdc++45
+Keep: cpp44 gcc44 gcc44-ada libstdc++44
+Keep: cpp43 gcc43 gcc43-ada libstdc++43
+Keep: cpp42 gcc42 gcc42-ada libstdc++42
+Keep: cpp41 gcc41 gcc41-ada libstdc++41
+Keep: java-1_6_0-openjdk java-1_6_0-openjdk-devel libcloog0 libppl9 libppl_c4
+Keep: libpopt0 pkg-config libmount1
+Keep: libacl1 libattr1
+
+Prefer: -suse-build-key
+Prefer: krb5 krb5-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript-library
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++%{gcc_version} libgcc%{gcc_version}
+Prefer: libstdc++%{gcc_version}-32bit libstdc++%{gcc_version}-64bit
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs
+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: 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: rubygem-rack-1_1
+Prefer: wallpaper-branding-openSUSE
+
+# temporarly - already fix submitted
+Prefer: -kde3-kaffeine
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc%{gcc_version} libgcc%{gcc_version}-32bit libgcc%{gcc_version}-64bit
+Prefer: libgcc%{gcc_version}-x86 libffi%{gcc_version} libffi%{gcc_version}-devel libgcj_bc%{gcc_version}
+Prefer: libgomp%{gcc_version} libgomp%{gcc_version}-32bit libgomp%{gcc_version}-64bit
+Prefer: libmudflap%{gcc_version} libmudflap%{gcc_version}-32bit libmudflap%{gcc_version}-64bit
+Prefer: libobjc%{gcc_version} libgfortran%{gcc_version}
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Conflict: ghostscript-library:ghostscript-mini
+Conflict: ghostscript-fonts-std:ghostscript-mini
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -java-1_7_0-icedtea-devel -libiniparser -loudmouth -libkonq4 -libnetcdf-4
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng14-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release,udev
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre,libpcre0
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+Ignore: postfix:iproute2
+Ignore: systemd:systemd-presets-branding
+Ignore: polkit:ConsoleKit
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+
+%ifnarch ia64 s390 s390x
+Prefer: java-1_6_0-openjdk java-1_6_0-openjdk-devel
+%endif
+%ifarch s390 s390x
+Prefer: java-1_6_0-ibm java-1_6_0-ibm-devel
+%endif
+%ifarch ia64
+Prefer: java-1_6_0-bea java-1_6_0-bea-devel
+%endif
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+# We use always openjdk on openSUSE !
+#%ifnarch ia64 s390 s390x
+Substitute: java2-devel-packages java-1_6_0-openjdk-devel
+#%else
+# %ifarch s390 s390x
+#Substitute: java2-devel-packages java-1_6_0-ibm-devel unzip update-alternatives
+# %endif
+# %ifarch ia64
+#Substitute: java2-devel-packages java-1_6_0-bea-devel unzip update-alternatives
+# %endif
+#%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+Optflags: i586 -fomit-frame-pointer -fmessage-length=0
+Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0
+Optflags: x86_64 -fmessage-length=0
+Optflags: ppc -fmessage-length=0
+Optflags: ppc64 -fmessage-length=0
+Optflags: ia64 -fmessage-length=0
+Optflags: s390 -fmessage-length=0
+Optflags: s390x -fmessage-length=0
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1210
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+%_with_aaa_base_malloc_debug 0
+
+%suse_version 1210
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sl12.2.conf b/configs/sl12.2.conf
new file mode 100644
index 0000000..fd58b64
--- /dev/null
+++ b/configs/sl12.2.conf
@@ -0,0 +1,608 @@
+
+%define gcc_version 47
+%define _with_aaa_base_malloc_debug 1
+
+Patterntype: rpm-md ymp
+%if "%_repository" == "images"
+Type: kiwi
+Repotype: none
+Patterntype: none
+Prefer: openSUSE-release
+%endif
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-12-1
+Substitute: kiwi-filesystem:ext3 e2fsprogs
+Substitute: kiwi-filesystem:ext4 e2fsprogs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-filesystem:btrfs btrfsprogs
+Substitute: kiwi-boot:usbboot kiwi
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot kiwi-desc-isoboot-requires
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:tbz kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-netboot-requires
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot kiwi-desc-vmxboot-requires
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot kiwi-desc-xenboot-requires
+Substitute: kiwi-setup:image kiwi createrepo tar -kiwi-desc-isoboot-requires -kiwi-desc-oemboot-requires -kiwi-desc-netboot-requires -kiwi-desc-vmxboot-requires -kiwi-desc-xenboot-requires
+
+
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep insserv
+Preinstall: libbz2-1 libgcc%{gcc_version} m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar zlib libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_1
+Preinstall: libpcre1
+
+Runscripts: aaa_base
+
+Order: libopenssl0_9_8:openssl-certs
+
+VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1
+
+ExportFilter: \.x86_64\.rpm$ x86_64
+ExportFilter: \.ia64\.rpm$ ia64
+ExportFilter: \.s390x\.rpm$ s390x
+ExportFilter: \.ppc64\.rpm$ ppc64
+ExportFilter: \.ppc\.rpm$ ppc
+ExportFilter: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+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: ^acroread.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+
+Required: gcc gcc%{gcc_version} glibc rpm tar patch
+
+Support: perl rpm-build
+Support: cpio
+Support: file findutils gawk
+Support: glibc-locale groff info less
+Support: libbz2-devel
+# for boot.udev
+Support: udev
+Support: man netcfg
+Support: net-tools pam-modules sysvinit-tools
+Support: texinfo timezone util-linux login psmisc
+Support: terminfo-base update-alternatives pwdutils build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+Keep: brp-check-suse
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+# Extracting appdata.xml from desktop files
+Support: brp-extract-appdata
+
+# testing deltas (only for O:F for now!)
+#Support: build-mkdrpms deltarpm
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+Preinstall: libunwind
+%endif
+
+Keep: libaudit1 binutils bzip2 cpio cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada libpcre1
+Keep: libunwind libunwind-devel libzio make pam-devel pam-modules
+Keep: patch perl-base perl rcs timezone libmpfr4 libcap2
+Keep: gmp libgmp10 libgmpxx4 libmpc2
+Keep: cpp47 gcc47 gcc47-ada libstdc++47
+Keep: cpp46 gcc46 gcc46-ada libstdc++46
+Keep: cpp45 gcc45 gcc45-ada libstdc++45
+Keep: cpp44 gcc44 gcc44-ada libstdc++44
+Keep: cpp43 gcc43 gcc43-ada libstdc++43
+Keep: cpp42 gcc42 gcc42-ada libstdc++42
+Keep: cpp41 gcc41 gcc41-ada libstdc++41
+Keep: java-1_7_0-openjdk java-1_7_0-openjdk-devel libcloog0 libppl9 libppl_c4
+Keep: libpopt0 pkg-config libmount1
+Keep: libacl1 libattr1 rpm-build
+
+Prefer: -suse-build-key
+Prefer: krb5 krb5-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++%{gcc_version} libgcc%{gcc_version}
+Prefer: libstdc++%{gcc_version}-32bit libstdc++%{gcc_version}-64bit
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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: 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: plymouth:plymouth-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-openSUSE
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1
+Prefer: geronimo-servlet-2_4-api
+
+# just temporary
+Prefer: -rubygems
+
+# temporarly - already fix submitted
+Prefer: -kde3-kaffeine
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc%{gcc_version} libgcc%{gcc_version}-32bit libgcc%{gcc_version}-64bit
+Prefer: libgcc%{gcc_version}-x86 libffi%{gcc_version} libffi%{gcc_version}-devel libgcj_bc%{gcc_version}
+Prefer: libffi%{gcc_version}-32bit libffi%{gcc_version}-64bit
+Prefer: libgomp%{gcc_version} libgomp%{gcc_version}-32bit libgomp%{gcc_version}-64bit
+Prefer: libmudflap%{gcc_version} libmudflap%{gcc_version}-32bit libmudflap%{gcc_version}-64bit
+Prefer: libobjc%{gcc_version} libgfortran%{gcc_version} libquadmath%{gcc_version}
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -java-1_7_0-icedtea-devel -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng14-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX
+
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+Ignore: postfix:iproute2
+Ignore: aaa_base:systemd
+Ignore: systemd:systemd-presets-branding
+Ignore: polkit:ConsoleKit
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: autoyast2:yast2-schema
+
+# to be removed after 12.2 release
+Substitute: xorg-x11 xorg-x11 appres bdftopcf beforelight bitmap editres fonttosfnt fslsfonts fstobdf iceauth ico lbxproxy listres luit mkcomposecache oclock proxymngr rendercheck rstart showfont smproxy viewres x11perf xbacklight xbiff xcalc xclipboard xclock xcmsdb xcompmgr xcursor-themes xcursorgen xdbedizzy xditview xdpyinfo xedit xev xeyes xf86dga xfd xfindproxy xfontsel xfs xfsinfo xfwp xgamma xgc xhost xinput xkbcomp xkbevd xkbprint xkbutils xkill xload xlogo xlsatoms xlsclients xlsfonts xmag xman xmessage xmore xorg-scripts xplsprinters xpr xprehashprinterlist xprop xrandr xrefresh xrestop xrx xscope xset xsetmode xsetpointer xsm xstdcmap xtrap xvidtune xvinfo xwd xwininfo xwud
+
+%ifnarch ia64 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
+%ifarch ia64
+Prefer: java-1_6_0-bea java-1_6_0-bea-devel
+%endif
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+# We use always openjdk on openSUSE !
+#%ifnarch ia64 s390 s390x
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+#%else
+# %ifarch s390 s390x
+#Substitute: java2-devel-packages java-1_6_0-ibm-devel unzip update-alternatives
+# %endif
+# %ifarch ia64
+#Substitute: java2-devel-packages java-1_6_0-bea-devel unzip update-alternatives
+# %endif
+#%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+Optflags: i586 -fomit-frame-pointer -fmessage-length=0
+Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0
+Optflags: x86_64 -fmessage-length=0
+Optflags: ppc -fmessage-length=0
+Optflags: ppc64 -fmessage-length=0
+Optflags: ia64 -fmessage-length=0
+Optflags: s390 -fmessage-length=0
+Optflags: s390x -fmessage-length=0
+# need mcpu=ultrasparc to complete sparcv8plus to sparcv9 (adds, for example, atomic ops)
+Optflags: sparcv9 -fmessage-length=0 -mcpu=ultrasparc
+Optflags: sparc64 -fmessage-length=0 -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1220
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+%_with_aaa_base_malloc_debug 1
+
+%suse_version 1220
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sl12.3.conf b/configs/sl12.3.conf
new file mode 100644
index 0000000..1fd50c1
--- /dev/null
+++ b/configs/sl12.3.conf
@@ -0,0 +1,638 @@
+
+%define gcc_version 47
+%define _with_aaa_base_malloc_debug 1
+
+Patterntype: rpm-md ymp
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-12-1
+Substitute: kiwi-filesystem:ext3 e2fsprogs
+Substitute: kiwi-filesystem:ext4 e2fsprogs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-filesystem:btrfs btrfsprogs
+Substitute: kiwi-boot:usbboot kiwi
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot kiwi-desc-isoboot-requires
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:tbz kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-netboot-requires
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot kiwi-desc-vmxboot-requires
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot kiwi-desc-xenboot-requires
+Substitute: kiwi-setup:image kiwi createrepo tar -kiwi-desc-isoboot-requires -kiwi-desc-oemboot-requires -kiwi-desc-netboot-requires -kiwi-desc-vmxboot-requires -kiwi-desc-xenboot-requires
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+
+FileProvides: /usr/sbin/groupadd shadow
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_1
+Preinstall: libpcre1
+
+Runscripts: aaa_base
+
+Order: libopenssl0_9_8:openssl-certs
+
+VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1 net-tools
+
+ExportFilter: \.x86_64\.rpm$ x86_64
+ExportFilter: \.ia64\.rpm$ ia64
+ExportFilter: \.s390x\.rpm$ s390x
+ExportFilter: \.ppc64\.rpm$ ppc64
+ExportFilter: \.ppc\.rpm$ ppc
+ExportFilter: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: \.armv7l\.rpm$ armv7l
+ExportFilter: \.armv7hl\.rpm$ armv7l
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+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: ^acroread.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+
+Required: rpm-build
+
+# needed for su's default config - perhaps we should use a simplified form?
+Support: pam-modules
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+# Extracting appdata.xml from desktop files
+Support: brp-extract-appdata
+
+# testing deltas (only for O:F for now!)
+#Support: build-mkdrpms deltarpm
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+Preinstall: libunwind
+%endif
+
+Prefer: -suse-build-key
+Prefer: krb5 krb5-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++6 libgcc_s1
+Prefer: libstdc++6-32bit libstdc++6-64bit
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslog-service syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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: 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-openSUSE
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi
+# for now gstream 0.10 is it
+Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-utils typelib-1_0-GstInterfaces-0_10
+# prefer the small systemd for building
+Prefer: libudev-mini-devel libudev-mini1
+Prefer: systemd-mini systemd-mini-devel
+Prefer: systemd-mini-devel:systemd-mini
+Prefer: udev-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
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+Prefer: -libffi43
+
+Prefer: wxWidgets-2_9-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
+Prefer: libgcc_s1-x86 libffi4 libffi4-devel libgcj_bc%{gcc_version}
+Prefer: libffi4-32bit libffi4-64bit
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap%{gcc_version} libmudflap%{gcc_version}-32bit libmudflap%{gcc_version}-64bit
+Prefer: libobjc%{gcc_version} libgfortran3 libquadmath%{gcc_version}
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc -java-1_7_0-icedtea-javadoc
+%ifnarch %arm
+Prefer: -java-1_7_0-icedtea-devel
+%endif
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng15-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX
+# prefer module-init-tools
+Prefer: -kmod-compat
+
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+Ignore: postfix:iproute2
+Ignore: aaa_base:systemd
+Ignore: ConsoleKit:systemd
+Ignore: openssh:systemd
+Ignore: cronie:systemd
+Ignore: systemd:kbd
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: polkit:ConsoleKit
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: autoyast2:yast2-schema
+Ignore: libgio-2_0-0:dbus-1-x11
+
+%ifarch %arm
+Prefer: java-1_7_0-icedtea java-1_7_0-icedtea-devel
+%else
+%ifnarch ia64 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
+%ifarch ia64
+Prefer: java-1_6_0-bea java-1_6_0-bea-devel
+%endif
+%endif
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+
+%ifarch %arm
+Substitute: java2-devel-packages java-1_7_0-icedtea-devel
+%else
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+Optflags: i586 -fomit-frame-pointer -fmessage-length=0
+Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0
+Optflags: x86_64 -fmessage-length=0
+Optflags: ppc -fmessage-length=0
+Optflags: ppc64 -fmessage-length=0
+Optflags: ia64 -fmessage-length=0
+Optflags: s390 -fmessage-length=0
+Optflags: s390x -fmessage-length=0
+Optflags: armv5el -fmessage-length=0
+Optflags: armv5tel -fmessage-length=0
+Optflags: armv7l -fmessage-length=0
+Optflags: armv7hl -fmessage-length=0
+# need mcpu=ultrasparc to complete sparcv8plus to sparcv9 (adds, for example, atomic ops)
+Optflags: sparcv9 -fmessage-length=0 -mcpu=ultrasparc
+Optflags: sparc64 -fmessage-length=0 -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1230
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+%_with_aaa_base_malloc_debug 1
+
+%suse_version 1230
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sl13.1.conf b/configs/sl13.1.conf
new file mode 100644
index 0000000..4fc1616
--- /dev/null
+++ b/configs/sl13.1.conf
@@ -0,0 +1,695 @@
+%define gcc_version 48
+
+Patterntype: rpm-md ymp
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-12-1
+Substitute: kiwi-filesystem:ext3 e2fsprogs
+Substitute: kiwi-filesystem:ext4 e2fsprogs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-filesystem:btrfs btrfsprogs
+Substitute: kiwi-boot:usbboot kiwi
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot kiwi-desc-isoboot-requires
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:tbz kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-netboot-requires
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot kiwi-desc-vmxboot-requires
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot kiwi-desc-xenboot-requires
+Substitute: kiwi-setup:image kiwi createrepo tar -kiwi-desc-isoboot-requires -kiwi-desc-oemboot-requires -kiwi-desc-netboot-requires -kiwi-desc-vmxboot-requires -kiwi-desc-xenboot-requires
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+Conflict: libudev1:udev-mini
+
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /sbin/netconfig sysconfig-netconfig
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_1
+Preinstall: libpcre1
+
+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
+
+ExportFilter: \.x86_64\.rpm$ x86_64
+ExportFilter: \.ia64\.rpm$ ia64
+ExportFilter: \.s390x\.rpm$ s390x
+ExportFilter: \.ppc64\.rpm$ ppc64
+ExportFilter: \.ppc\.rpm$ ppc
+ExportFilter: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: \.armv7l\.rpm$ armv7l
+ExportFilter: \.armv7hl\.rpm$ armv7l
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+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: ^acroread.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+
+Required: rpm-build
+
+# needed for su's default config - perhaps we should use a simplified form?
+Support: pam-modules
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+# Extracting appdata.xml from desktop files
+Support: brp-extract-appdata
+
+# testing deltas (only for O:F for now!)
+#Support: build-mkdrpms deltarpm
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+Preinstall: libunwind
+%endif
+
+Prefer: -suse-build-key
+Prefer: krb5-mini krb5-mini-devel
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslog-service syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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: 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-openSUSE
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi
+# for now gstream 0.10 is it
+Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-utils typelib-1_0-GstInterfaces-0_10
+# prefer the small systemd for building
+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: 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
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: wxWidgets-2_9-devel
+
+Prefer: -NX -xaw3dd -db43
+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: libgcc_s1-x86 libffi4 libgcj_bc1
+Prefer: libffi4-32bit libffi4-64bit
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc -java-1_7_0-icedtea-javadoc
+%ifnarch %arm
+Prefer: -java-1_7_0-icedtea-devel
+%endif
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX
+# prefer module-init-tools
+Prefer: -kmod-compat
+Prefer: gettext-tools-mini gettext-runtime-mini
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# amarok dependency
+Prefer: phonon-backend-gstreamer-0_10
+
+Ignore: java-1_7_0-openjdk:mozilla-nss
+Ignore: java-1_7_0-openjdk:java-ca-certificates
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+Ignore: postfix:iproute2
+Ignore: aaa_base:systemd
+Ignore: ConsoleKit:systemd
+Ignore: openssh:systemd
+Ignore: cronie:systemd
+Ignore: systemd:kbd
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: polkit:ConsoleKit
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+Ignore: man:groff-full
+Ignore: git-core:rsync
+Ignore: apache2:systemd
+Ignore: icewm-lite:icewm
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: autoyast2:yast2-schema
+Ignore: libgio-2_0-0:dbus-1-x11
+Ignore: weather-wallpaper:inkscape
+
+%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
+Prefer: -java-1_5_0-ibm-devel
+%endif
+
+%ifarch %arm
+Substitute: java2-devel-packages java-1_7_0-icedtea-devel
+%else
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+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: 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
+%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
+
+%define suse_version 1310
+
+%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
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+
+%suse_version 1310
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver 48
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sl13.2.conf b/configs/sl13.2.conf
new file mode 100644
index 0000000..8597ae3
--- /dev/null
+++ b/configs/sl13.2.conf
@@ -0,0 +1,674 @@
+%define gcc_version 48
+
+Patterntype: rpm-md ymp
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-12-1
+Substitute: kiwi-filesystem:ext3 e2fsprogs
+Substitute: kiwi-filesystem:ext4 e2fsprogs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-filesystem:btrfs btrfsprogs
+Substitute: kiwi-boot:usbboot kiwi
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot kiwi-desc-isoboot-requires
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:tbz kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-netboot-requires
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot kiwi-desc-vmxboot-requires
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot kiwi-desc-xenboot-requires
+Substitute: kiwi-setup:image kiwi createrepo tar -kiwi-desc-isoboot-requires -kiwi-desc-oemboot-requires -kiwi-desc-netboot-requires -kiwi-desc-vmxboot-requires -kiwi-desc-xenboot-requires
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+Conflict: libudev1:udev-mini
+
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /usr/sbin/useradd shadow
+FileProvides: /sbin/netconfig sysconfig-netconfig
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_1
+Preinstall: libpcre1
+
+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 libsmartcols1
+# 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: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: \.armv7l\.rpm$ armv7l
+ExportFilter: \.armv7hl\.rpm$ armv7l
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+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: ^acroread.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+
+Required: rpm-build
+
+# needed for su's default config - perhaps we should use a simplified form?
+Support: pam-modules
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+# Extracting appdata.xml from desktop files
+Support: brp-extract-appdata
+
+# testing deltas (only for O:F for now!)
+#Support: build-mkdrpms deltarpm
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+Preinstall: libunwind
+%endif
+
+Prefer: -suse-build-key
+Prefer: krb5-mini krb5-mini-devel
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslog-service syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-openSUSE
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi
+# for now gstream 0.10 is it
+Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-utils typelib-1_0-GstInterfaces-0_10
+# prefer the small systemd for building
+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 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 -linuxconsoletools
+
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: wxWidgets-2_9-devel
+
+Prefer: -NX -xaw3dd -db43
+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
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc -java-1_7_0-icedtea-javadoc
+%ifnarch %arm
+Prefer: -java-1_7_0-icedtea-devel
+%endif
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX
+# prefer module-init-tools
+Prefer: -kmod-compat
+Prefer: gettext-tools-mini gettext-runtime-mini
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# 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
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+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
+Ignore: systemd:kbd
+Ignore: systemd:systemd-presets-branding
+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
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+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
+Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel
+%endif
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+
+%ifarch %arm
+Substitute: java2-devel-packages java-1_7_0-icedtea-devel
+%else
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+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
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1320
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+
+%suse_version 1320
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver 48
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sl13.3.conf b/configs/sl13.3.conf
new file mode 100644
index 0000000..520b9f0
--- /dev/null
+++ b/configs/sl13.3.conf
@@ -0,0 +1,784 @@
+%define gcc_version 5
+
+Substitute: kiwi-packagemanager:instsource kiwi-desc-isoboot-requires kiwi-instsource kiwi-instsource-plugins-openSUSE-13-2
+Substitute: kiwi-setup:image kiwi createrepo tar -kiwi-desc-isoboot-requires -kiwi-desc-oemboot-requires -kiwi-desc-netboot-requires -kiwi-desc-vmxboot-requires -kiwi-desc-xenboot-requires
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+Conflict: libudev1:udev-mini
+
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /usr/sbin/useradd shadow
+FileProvides: /sbin/netconfig sysconfig-netconfig
+FileProvides: /usr/bin/docbook2man docbook-utils
+FileProvides: /usr/bin/mkisofs cdrkit-cdrtools-compat
+FileProvides: /usr/sbin/lockdev lockdev
+FileProvides: /bin/logger util-linux-systemd
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 libncurses6 pam
+Preinstall: permissions libreadline7 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_3-5
+Preinstall: libpcre1
+
+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 libsmartcols1
+VMinstall: kernel-obs-build
+VMInstall: iproute2
+
+ExportFilter: \.x86_64\.rpm$ x86_64
+ExportFilter: \.ia64\.rpm$ ia64
+ExportFilter: \.s390x\.rpm$ s390x
+ExportFilter: \.ppc64\.rpm$ ppc64
+ExportFilter: \.ppc64le\.rpm$ ppc64le
+ExportFilter: \.ppc\.rpm$ ppc
+ExportFilter: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: \.armv7l\.rpm$ armv7l
+ExportFilter: \.armv7hl\.rpm$ armv7l
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+ExportFilter: ^glibc(?:-devel)?-64bit-.*\.sparcv9\.rpm$ sparcv9
+ExportFilter: ^acroread.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+
+Required: rpm-build
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+# Extracting appdata.xml from desktop files
+Support: brp-extract-appdata
+
+Prefer: -suse-build-key
+Prefer: krb5-mini krb5-mini-devel
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline7
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: mono-devel
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslog-service syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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 enlightenment-theme-upstream
+Prefer: amarok:amarok-xine
+Prefer: kdenetwork3-vnc:tightvnc
+Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat-jsp-2_2-api tomcat-jsp-2_3-api tomcat-servlet-2_5-api
+Prefer: -servletapi3 -servletapi4 -servletapi5
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: plasma5-desktop:plasma5-desktop-branding-upstream
+Prefer: plasma5-workspace:plasma5-workspace-branding-upstream
+Prefer: sddm:sddm-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: kdebase4-openSUSE:kdebase4-workspace
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+Prefer: e17-devel:e17
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-openSUSE
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi -libhdf5_hl9-openmpi -libhdf5-9-openmpi -libhdf5-10-openmpi -libhdf5_hl10-openmpi
+# for now gstream 0.10 is it
+Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-utils typelib-1_0-GstInterfaces-0_10 libQtGLib-2_0-0 libQtGLib-devel
+# prefer the small systemd for building
+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 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: -primus -primus-32bit
+Prefer: -staging-build-key
+Prefer: -sssd-wbclient
+Prefer: -clutter-gst-devel
+Prefer: -opencv-qt5-devel
+# ffmpeg and its fork libav both provide libswscale; prefer the 'original' ffmpeg
+Prefer: -libswscale-libav-devel -libavformat-libav-devel -libavresample-libav-devel
+# as long as kactivities4 exists and is provided
+Prefer: kactivities5
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: wxWidgets-2_9-devel
+Prefer: libopenssl-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
+Prefer: libffi4 libffi-devel-gcc%{gcc_version}
+Prefer: -libatomic1-gcc49 -libitm1-gcc49 -libgcj_bc1-gcc49 -libtsan0-gcc49 -libatomic1-gcc49-32bit -libitm1-gcc49-32bit
+Prefer: -libitm1-gcc48 -libitm1-gcc48-32bit -libatomic1-gcc48 -libatomic1-gcc48-32bit -libtsan0-gcc48
+Prefer: -libstdc++6-gcc48 -libgomp1-gcc48 -libatomic1-gcc48
+Prefer: libgcc_s1-x86 libgcj_bc1
+Prefer: libffi4-32bit libffi4-64bit
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc -java-1_7_0-icedtea-javadoc
+Prefer: -java-1_7_0-icedtea-devel
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX perl-Test-YAML
+Prefer: gettext-tools-mini gettext-runtime-mini
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# amarok dependency resolution
+Prefer: phonon-backend-gstreamer
+# replacing mkinitrd
+Prefer: dracut
+# replacing module-init-tools
+Prefer: kmod-compat
+# Temporary
+Prefer: oxygen5-cursors
+# Temporary
+Prefer: -perl-App-cpanminus
+# wireshark has now split off the ui. qt is considered experimental 2014-08-09
+Prefer: wireshark-ui-gtk
+# libmediaart is prepared for a larger update; for now favor mediaart-1.0
+Prefer: -typelib-1_0-MediaArt-2_0
+
+Ignore: installation-images-openSUSE:cracklib-dict-full
+Ignore: java-1_7_0-openjdk:mozilla-nss
+Ignore: java-1_7_0-openjdk:java-ca-certificates
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libgtk-3-0:adwaita-icon-theme
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-iscsi-lio-server:lio-utils
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: autoyast2:yast2-schema
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+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
+Ignore: systemd:kbd
+Ignore: systemd:kmod
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: pesign:systemd
+Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: libsystemd0-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: jdk-bootstrap:this-is-only-for-build-envs
+Prefer: -harfbuzz-bootstrap -harfbuzz-bootstrap-devel
+Ignore: harfbuzz-bootstrap:this-is-only-for-build-envs
+Ignore: polkit:ConsoleKit
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+Ignore: NetworkManager:iproute2
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: libgio-2_0-0:dbus-1-x11
+Ignore: weather-wallpaper:inkscape
+Ignore: libgamin-1-0:gamin-server
+Ignore: libfam0-gamin:gamin-server
+Ignore: python3:python3-pip
+Ignore: avahi:sysvinit(network)
+Ignore: cluster-glue:sysvinit(network)
+
+# RUBY STUFF
+
+%define %_with_ruby21 0
+
+Macros:
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in the
+# ruby-common as well.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygem() %{expand:%%{rubygems%rb_build_versions STOP %*}}
+%rubygemsSTOP() %nil
+%rubygemsxSTOP() %{expand:%%rubygemsxxSTOP -a %*}
+%rubygemsxxSTOP(a:) %{-a*}) %*
+
+%rubySTOP() %nil
+%rubyxSTOP() %*
+
+%ruby() %{expand:%%{ruby%rb_build_versions STOP %*}}
+
+%rubydevel() %{expand:%%{rubydevel%rb_build_versions STOP %*}}
+
+%rubydevelSTOP() %nil
+%rubydevelxSTOP() %*
+
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+# if you change any macros here you have to update the copy in the
+# ruby2.1 package as well.
+
+%rubygemsruby21() rubygem(ruby:2.1.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby21() %{expand:%%{rubygemsx%*}}
+
+%rubyruby21() ruby2.1 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby21() %{expand:%%{rubyx%*}}
+
+%rubydevelruby21() ruby2.1-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby21() %{expand:%%{rubydevelx%*}}
+
+%_with_ruby21 1
+
+:Macros
+
+Macros:
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in the
+# prjconf aswell.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygemsruby22() rubygem(ruby:2.2.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby22() %{expand:%%{rubygemsx%*}}
+
+%rubyruby22() ruby2.2 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby22() %{expand:%%{rubyx%*}}
+
+%rubydevelruby22() ruby2.2-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby22() %{expand:%%{rubydevelx%*}}
+
+%_with_ruby22 1
+
+:Macros
+
+%define %_with_ruby21 0
+%define rb_default_ruby ruby22
+%define rb_default_ruby_suffix ruby2.2
+%define rb_default_ruby_abi ruby:2.2.0
+
+%define rb_build_ruby_abis ruby:2.1.0 ruby:2.2.0
+%define rb_build_versions ruby21 ruby22
+Macros:
+%rb_default_ruby ruby22
+%rb_default_ruby_suffix ruby2.2
+%rb_default_ruby_abi ruby:2.2.0
+
+%rb_build_ruby_abis ruby:2.1.0 ruby:2.2.0
+%rb_build_versions ruby21 ruby22
+:Macros
+
+Prefer: -ruby-stdlib
+Prefer: %{rb_default_ruby_suffix}-rubygem-gem2rpm
+Prefer: %{rb_default_ruby_suffix}-rubygem-ruby-dbus
+Prefer: %{rb_default_ruby_suffix}-rubygem-yard
+Prefer: %{rb_default_ruby_suffix}-rubygem-rspec
+Prefer: %{rb_default_ruby_suffix}-rubygem-yast-rake
+Prefer: %{rb_default_ruby_suffix}-rubygem-cheetah
+Prefer: %{rb_default_ruby_suffix}-rubygem-inifile
+Prefer: %{rb_default_ruby_suffix}-rubygem-bundler
+Prefer: %{rb_default_ruby_suffix}-rubygem-sass
+
+# END RUBY STUFF
+
+Prefer: java-1_8_0-openjdk java-1_8_0-openjdk-devel
+Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+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: armv7l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv7hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: aarch64 -fmessage-length=0 -grecord-gcc-switches
+Optflags: ppc64le -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
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+%ifarch armv6l armv6hl
+Target: armv6hl-suse-linux
+%endif
+%ifarch armv7l armv7hl
+Target: armv7hl-suse-linux
+%endif
+
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1321
+%define is_opensuse 1
+
+Macros:
+%suse_version 1321
+%is_opensuse 1
+
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kmod-compat kernel-syms
+%kernel_module_package_buildreqs kmod-compat kernel-syms
+
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver 5
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+:Macros
+
diff --git a/configs/sl15.0.conf b/configs/sl15.0.conf
new file mode 100644
index 0000000..2eb146d
--- /dev/null
+++ b/configs/sl15.0.conf
@@ -0,0 +1,854 @@
+
+Release: lp150.<CI_CNT>.<B_CNT>
+%define gcc_version 7
+
+# Help with the switch to the gcc7 provided libs
+Prefer: -libstdc++6-gcc7 -libtsan0-gcc7 -libgomp1-gcc7 -libgcc_s1-gcc7 -libatomic1-gcc7 -libcilkrts5-gcc7 -libitm1-gcc7
+Prefer: -liblsan0-gcc7 -libmpx2-gcc7 -libubsan0-gcc7
+
+Substitute: kiwi-packagemanager:instsource product-builder-plugin-Tumbleweed
+Substitute: system-packages:kiwi-product product-builder
+Substitute: kiwi-packagemanager: kiwi-packagemanager:zypper
+
+Prefer: installation-images-openSUSE installation-images-debuginfodeps-openSUSE
+
+# switch to kiwi v8
+Prefer: python3-kiwi
+Prefer: kiwi-boot-require
+
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /usr/sbin/useradd shadow
+FileProvides: /usr/sbin/usermod shadow
+FileProvides: /sbin/netconfig sysconfig-netconfig
+FileProvides: /usr/bin/docbook2man docbook-utils
+FileProvides: /usr/bin/mkisofs cdrkit-cdrtools-compat
+#FileProvides: /usr/bin/mkisofs mkisofs
+FileProvides: /usr/sbin/lockdev lockdev
+FileProvides: /bin/logger util-linux-systemd
+FileProvides: /bin/csh tcsh
+FileProvides: /usr/bin/csh tcsh
+FileProvides: /usr/bin/mimencode metamail
+FileProvides: /usr/bin/pkg-config pkg-config
+FileProvides: /usr/bin/sg_inq sg3_utils
+FileProvides: /usr/bin/tput ncurses-utils
+FileProvides: /usr/bin/eu-nm elfutils
+FileProvides: /usr/bin/Xvfb xorg-x11-server
+FileProvides: /usr/bin/xmllint libxml2-tools
+FileProvides: /sbin/setcap libcap-progs
+FileProvides: /usr/bin/setfacl acl
+FileProvides: /usr/bin/fipscheck fipscheck
+FileProvides: /usr/bin/python python-base
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep liblua5_3-5
+Preinstall: libbz2-1 libgcc_s1 libncurses6 pam
+Preinstall: permissions libreadline7 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1
+Preinstall: libpcre1
+
+Runscripts: aaa_base
+
+Prefer: libdb-4_8-devel
+Prefer: cdrkit-cdrtools-compat genisoimage
+VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1 libsmartcols1
+VMinstall: kernel-obs-build
+VMInstall: net-tools-deprecated
+
+Required: rpm-build
+# Build all packages with -pie enabled
+Required: gcc-PIE
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+Preinstall: libunwind
+%endif
+
+### Branding related preferences
+Prefer: awesome:awesome-branding-upstream
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: cinnamon-gschemas:cinnamon-gschemas-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: gdm:gdm-branding-upstream
+Prefer: gfxboot-branding-openSUSE -gfxboot-branding-basedonopensuse
+Prefer: glib2:glib2-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: icewm-theme-branding
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: libcinnamon-desktop-data:libcinnamon-desktop-data-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: libpurple-branding-upstream
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mate-desktop-gschemas:mate-desktop-gschemas-branding-upstream
+Prefer: NetworkManager:NetworkManager-branding-openSUSE
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: plasma5-desktop:plasma5-desktop-branding-upstream
+Prefer: plasma5-workspace:plasma5-workspace-branding-upstream
+Prefer: sddm:sddm-branding-upstream
+Prefer: systemd-presets-branding-openSUSE
+Prefer: wallpaper-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+
+# Build cycle handling - prefer -mini packages were possible, break deps as needed
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: gettext-tools-mini gettext-runtime-mini
+Prefer: ghostscript-mini
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: krb5-mini krb5-mini-devel
+Prefer: libudev-mini-devel libudev-mini1 udev-debuginfo libudev1-debuginfo
+Prefer: libunbound-devel-mini
+Prefer: log4j-mini
+Prefer: systemd-mini-devel:systemd-mini
+Prefer: systemd-mini systemd-mini-devel libsystemd0-mini
+Prefer: udev-mini libcom_err2-mini libext2fs2-mini
+Prefer: -harfbuzz-bootstrap -harfbuzz-bootstrap-devel
+
+# break dependency of the -mini packages: they are valid for OBS, but not for end-user-installation
+Ignore: erlang-rebar-obs:this-is-only-for-build-envs
+Ignore: harfbuzz-bootstrap:this-is-only-for-build-envs
+Ignore: jdk-bootstrap:this-is-only-for-build-envs
+Ignore: libsystemd0-mini:this-is-only-for-build-envs
+Ignore: libudev-mini1:this-is-only-for-build-envs
+Ignore: libunbound-devel-mini:this-is-only-for-build-envs
+Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: udev-mini:this-is-only-for-build-envs
+
+# curl
+Ignore: libcurl-mini-devel:this-is-only-for-build-envs
+Ignore: libcurl4-mini:this-is-only-for-build-envs
+# curl: -full and -mini packages don't mingle well
+Prefer: -libcurl4-mini -libcurl-mini-devel
+Conflict: libcurl4-mini:curl
+Conflict: libcurl-mini-devel:libcurl4
+
+# When kiwi comes into play, we do not want the -mini packages; -mini does not target end user systems
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+
+# udev: -full and -mini packages don't mingle well
+Prefer: libudev1:udev
+Conflict: libudev1:udev-mini
+Conflict: udev:libudev-mini1
+
+# systemd: -full and -mini packages don't mingle well
+Conflict: systemd:libsystemd0-mini
+Conflict: systemd-mini-devel:systemd
+
+Prefer: -suse-build-key
+# Set postfix as the 'default' smtp_daemon (virtual symbol provided by all MTAs)
+Prefer: postfix
+# Give the worker any default apache2-MPM for apache2- chosing 'prefork' (alternatives are -event and -worker, dep-wise they are equal)
+
+# prefer the PHP5 variants over PHP7
+Prefer: php5-ctype
+Prefer: php5-devel
+Prefer: php5-dom
+Prefer: php5-ftp
+Prefer: php5-gd
+Prefer: php5-gettext
+Prefer: php5-mbstring
+Prefer: php5-pear
+Prefer: php5-pear-Archive_Tar
+Prefer: php5-pear-Horde
+Prefer: php5 php5-json
+Prefer: php5-tokenizer
+Prefer: php5-zip
+
+# Below list still needs to be reviewed
+
+Prefer: xorg-x11-Xvnc:icewm
+Prefer: cracklib-dict-small
+Prefer: apache2:apache2-prefork
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+Prefer: libmpx2 libmpxwrappers2 libmpx2-32bit libmpxwrappers2-32bit
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslog-service syslogd
+# rmt is provided by tar-rmt and star-rmt - we prefer star-rmt, which was the one in the past providing rmt
+Prefer: star-rmt
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+Prefer: gnu-jaf yast2-control-center-qt
+Prefer: vim-normal myspell-american wine
+Prefer: yast2-theme-openSUSE enlightenment-theme-upstream
+Prefer: amarok:amarok-xine
+Prefer: kdenetwork3-vnc:tightvnc
+Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat-jsp-2_2-api tomcat-jsp-2_3-api tomcat-servlet-2_5-api
+Prefer: -dbus-1-nox11
+Prefer: -servletapi3 -servletapi4 -servletapi5
+Prefer: icewm-lite
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api -java-1_5_0-gcj-compat -geronimo-jta-1_1-api classpathx-mail
+Prefer: rhino:xmlbeans-mini
+Prefer: rpcbind eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: boo tog-pegasus
+Prefer: sysvinit(network) wicked-service
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: kdebase4-openSUSE:kdebase4-workspace
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+Prefer: libGLw1
+# Help GNOME:Factory over librest-0_7-0 vs librest0 choice
+Prefer: librest-0_7-0
+# Tumbleweed ships nodejs4 for compatibility reasons - but it's not the preferred version
+Prefer: -nodejs4
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: vala
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5 -ruby2.2-rubygem-listen-3_0 -ruby2.2-rubygem-fast_gettext-1_1 -ruby2.2-rubygem-nokogiri-1_6 -ruby2.3-rubygem-nokogiri-1_6
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi -libhdf5_hl9-openmpi -libhdf5-9-openmpi -libhdf5-10-openmpi -libhdf5_hl10-openmpi -libhdf5-11-openmpi -libhdf5_hl11-openmpi -libhdf5-100-openmpi -libhdf5_hl100-openmpi
+# prefer the small systemd for building
+Prefer: star
+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 -glib2-devel-32bit
+Prefer: postgresql postgresql-server postgresql-devel
+Prefer: -unzip-rcc
+Prefer: -primus -primus-32bit
+Prefer: -staging-build-key
+Prefer: -sssd-wbclient
+Prefer: -clutter-gst-devel
+Prefer: -opencv-qt5-devel
+# ffmpeg and its fork libav both provide libswscale; prefer the 'original' ffmpeg
+Prefer: -libswscale-libav-devel -libavformat-libav-devel -libavresample-libav-devel -libavcodec-libav-devel -libavdevice-libav-devel -libavfilter-libav-devel -libpostproc-libav-devel -libavutil-libav-devel
+Prefer: -ffmpeg2-devel
+# as long as kactivities4 exists and is provided
+Prefer: kactivities5
+# oxygen5-icon-theme osboletes oxygen-icon-theme
+Prefer: oxygen5-icon-theme
+Prefer: npm6
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: wxWidgets-3_0-devel
+Prefer: libopenssl-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
+Prefer: libffi-devel
+Prefer: libatomic1 libcilkrts5 libitm1 liblsan0 libtsan0 libubsan0
+Prefer: libatomic1-32bit libcilkrts5-32bit libitm1-32bit libubsan0-32bit
+Prefer: libgcc_s1-x86 libgcj_bc1
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: gnome-keyring-32bit
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: python3-docutils python2-pep8
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX perl-Test-YAML -perl-Pod-Usage
+Prefer: libpsm2-compat
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# amarok dependency resolution
+Prefer: phonon-backend-gstreamer
+# replacing mkinitrd
+Prefer: dracut
+# replacing module-init-tools
+Prefer: kmod-compat
+# Temporary
+Prefer: oxygen5-cursors
+# Temporary
+Prefer: -perl-App-cpanminus
+# libmediaart is prepared for a larger update; for now favor mediaart-1.0
+Prefer: -typelib-1_0-MediaArt-2_0
+Prefer: -typelib-1_0-Gtk-2_0 -typelib-1_0-Gtk-4_0
+Prefer: -python-atspi
+Prefer: gettext-its-gtk3 gtk3-schema
+
+Ignore: installation-images-openSUSE:cracklib-dict-full
+Ignore: systemd-sysvinit:systemd
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: librtas:util-linux
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: cloud-init:cloud-init-config
+# python-pyudev requires libudev1 in normal situations
+Ignore: python-pyudev:libudev1
+Ignore: python-SPARQLWrapper:python-rdflib
+Ignore: python3-SPARQLWrapper:python3-rdflib
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libgtk-3-0:adwaita-icon-theme
+Ignore: libgtk-3-0:gdk-pixbuf-loader-rsvg
+Ignore: samba-libs:krb5
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-iscsi-lio-server:lio-utils
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: autoyast2:yast2-schema
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+Ignore: postfix:iproute2
+Ignore: aaa_base:systemd
+Ignore: gpm:systemd
+Ignore: openssh:systemd
+Ignore: cronie:systemd
+Ignore: systemd:kbd
+Ignore: systemd:kmod
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: pesign:systemd
+Ignore: polkit:ConsoleKit
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+Ignore: NetworkManager:iproute2
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+Ignore: sysconfig:sysvinit(network)
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: libgio-2_0-0:dbus-1-x11
+Ignore: weather-wallpaper:inkscape
+Ignore: libgamin-1-0:gamin-server
+Ignore: libfam0-gamin:gamin-server
+Ignore: python3:python3-pip
+Ignore: avahi:sysvinit(network)
+Ignore: cluster-glue:sysvinit(network)
+Ignore: dracut:systemd-sysvinit
+
+%ifarch ppc64le
+#Constraint: hostlabel PPC64LE_HOST
+Constraint: hardware:cpu:flag power8
+%endif
+
+Macros:
+# RUBY - UNVERSIONED STUFF
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in the
+# prjconf aswell.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygem() %{expand:%%{rubygems%rb_build_versions STOP %*}}
+%rubygemsSTOP() %nil
+%rubygemsxSTOP() %{expand:%%rubygemsxxSTOP -a %*}
+%rubygemsxxSTOP(a:) %{-a*}) %*
+
+%rubySTOP() %nil
+%rubyxSTOP() %*
+
+%ruby() %{expand:%%{ruby%rb_build_versions STOP %*}}
+
+%rubydevel() %{expand:%%{rubydevel%rb_build_versions STOP %*}}
+
+%rubydevelSTOP() %nil
+%rubydevelxSTOP() %*
+#
+
+# RUBY STUFF
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in
+# ruby2.2 aswell.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygemsruby22() rubygem(ruby:2.2.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby22() %{expand:%%{rubygemsx%*}}
+
+%rubyruby22() ruby2.2 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby22() %{expand:%%{rubyx%*}}
+
+%rubydevelruby22() ruby2.2-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby22() %{expand:%%{rubydevelx%*}}
+
+%_with_ruby22 1
+
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in
+# ruby2.3 aswell.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygemsruby23() rubygem(ruby:2.3.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby23() %{expand:%%{rubygemsx%*}}
+
+%rubyruby23() ruby2.3 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby23() %{expand:%%{rubyx%*}}
+
+%rubydevelruby23() ruby2.3-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby23() %{expand:%%{rubydevelx%*}}
+
+%_with_ruby23 1
+
+:Macros
+
+%define _with_ruby22 1
+%define _with_ruby23 1
+
+%define rb_default_ruby ruby22
+%define rb_default_ruby_suffix ruby2.2
+%define rb_default_ruby_abi ruby:2.2.0
+
+%define rb_build_ruby_abis ruby:2.2.0 ruby:2.3.0
+%define rb_build_versions ruby22 ruby23
+Macros:
+%rb_default_ruby ruby22
+%rb_default_ruby_suffix ruby2.2
+%rb_default_ruby_abi ruby:2.2.0
+
+%rb_build_ruby_abis ruby:2.2.0 ruby:2.3.0
+%rb_build_versions ruby22 ruby23
+:Macros
+
+Prefer: -ruby-stdlib
+Prefer: %{rb_default_ruby_suffix}-rubygem-gem2rpm
+Prefer: %{rb_default_ruby_suffix}-rubygem-ruby-dbus
+Prefer: %{rb_default_ruby_suffix}-rubygem-yard
+Prefer: %{rb_default_ruby_suffix}-rubygem-rspec
+Prefer: %{rb_default_ruby_suffix}-rubygem-yast-rake
+Prefer: %{rb_default_ruby_suffix}-rubygem-cheetah
+Prefer: %{rb_default_ruby_suffix}-rubygem-inifile
+Prefer: %{rb_default_ruby_suffix}-rubygem-bundler
+Prefer: %{rb_default_ruby_suffix}-rubygem-sass
+Prefer: %{rb_default_ruby_suffix}-rubygem-cfa
+
+# END RUBY STUFF
+
+# PYTHON STUFF
+# defined in tpython-rpm-macros
+
+Macros:
+%have_python2 1
+%have_python3 1
+%python_module() %{expand: %{?have_python2:python2-%{**}} %{?have_python3:python3-%{**}} %{?have_pypy3:pypy3-%{**}}}
+:Macros
+
+# END PYTHON STUFF
+
+Prefer: java-1_8_0-openjdk java-1_8_0-openjdk-devel java-1_8_0-openjdk-javadoc java-1_8_0-openjdk-headless
+Substitute: java2-devel-packages java-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+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: armv7l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv7hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: aarch64 -fmessage-length=0 -grecord-gcc-switches
+Optflags: ppc64le -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
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+%ifarch armv6l armv6hl
+Target: armv6hl-suse-linux
+%endif
+%ifarch armv7l armv7hl
+Target: armv7hl-suse-linux
+%endif
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1500
+%define is_opensuse 1
+
+Macros:
+%suse_version 1500
+%is_opensuse 1
+
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kmod-compat kernel-syms
+%kernel_module_package_buildreqs kmod-compat kernel-syms
+
+%sles_version 0
+%do_profiling 1
+%_vendor suse
+
+# Reproducible builds
+%source_date_epoch_from_changelog Y
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver 7
+# The following shlibs have latest versions built from GCC 6 sources
+%product_libs_gcc_ver_libasan3 6
+%product_libs_gcc_ver_libgo9 6
+%product_libs_gcc_ver_libgfortran3 6
+# reminded by richi 2017 4/3
+%product_libs_gcc_ver_libgcj_bc1 6
+# The following shlibs have been introduced with GCC 7
+%product_libs_gcc_ver_libmpxwrappers2 7
+%product_libs_gcc_ver_libmpx2 7
+%product_libs_gcc_ver_libasan4 7
+%product_libs_gcc_ver_libgo11 7
+%product_libs_gcc_ver_libgfortran4 7
+%gcc_version 7
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+:Macros
+
diff --git a/configs/sl15.5.conf b/configs/sl15.5.conf
new file mode 100644
index 0000000..520b9f0
--- /dev/null
+++ b/configs/sl15.5.conf
@@ -0,0 +1,784 @@
+%define gcc_version 5
+
+Substitute: kiwi-packagemanager:instsource kiwi-desc-isoboot-requires kiwi-instsource kiwi-instsource-plugins-openSUSE-13-2
+Substitute: kiwi-setup:image kiwi createrepo tar -kiwi-desc-isoboot-requires -kiwi-desc-oemboot-requires -kiwi-desc-netboot-requires -kiwi-desc-vmxboot-requires -kiwi-desc-xenboot-requires
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+Conflict: libudev1:udev-mini
+
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /usr/sbin/useradd shadow
+FileProvides: /sbin/netconfig sysconfig-netconfig
+FileProvides: /usr/bin/docbook2man docbook-utils
+FileProvides: /usr/bin/mkisofs cdrkit-cdrtools-compat
+FileProvides: /usr/sbin/lockdev lockdev
+FileProvides: /bin/logger util-linux-systemd
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 libncurses6 pam
+Preinstall: permissions libreadline7 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_3-5
+Preinstall: libpcre1
+
+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 libsmartcols1
+VMinstall: kernel-obs-build
+VMInstall: iproute2
+
+ExportFilter: \.x86_64\.rpm$ x86_64
+ExportFilter: \.ia64\.rpm$ ia64
+ExportFilter: \.s390x\.rpm$ s390x
+ExportFilter: \.ppc64\.rpm$ ppc64
+ExportFilter: \.ppc64le\.rpm$ ppc64le
+ExportFilter: \.ppc\.rpm$ ppc
+ExportFilter: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: \.armv7l\.rpm$ armv7l
+ExportFilter: \.armv7hl\.rpm$ armv7l
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+ExportFilter: ^glibc(?:-devel)?-64bit-.*\.sparcv9\.rpm$ sparcv9
+ExportFilter: ^acroread.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+
+Required: rpm-build
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+# remove build-compare support to disable "same result" package dropping
+Support: build-compare
+# Extracting appdata.xml from desktop files
+Support: brp-extract-appdata
+
+Prefer: -suse-build-key
+Prefer: krb5-mini krb5-mini-devel
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline7
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: mono-devel
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslog-service syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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 enlightenment-theme-upstream
+Prefer: amarok:amarok-xine
+Prefer: kdenetwork3-vnc:tightvnc
+Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat-jsp-2_2-api tomcat-jsp-2_3-api tomcat-servlet-2_5-api
+Prefer: -servletapi3 -servletapi4 -servletapi5
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: plasma5-desktop:plasma5-desktop-branding-upstream
+Prefer: plasma5-workspace:plasma5-workspace-branding-upstream
+Prefer: sddm:sddm-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: kdebase4-openSUSE:kdebase4-workspace
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+Prefer: e17-devel:e17
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-openSUSE
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi -libhdf5_hl9-openmpi -libhdf5-9-openmpi -libhdf5-10-openmpi -libhdf5_hl10-openmpi
+# for now gstream 0.10 is it
+Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-utils typelib-1_0-GstInterfaces-0_10 libQtGLib-2_0-0 libQtGLib-devel
+# prefer the small systemd for building
+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 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: -primus -primus-32bit
+Prefer: -staging-build-key
+Prefer: -sssd-wbclient
+Prefer: -clutter-gst-devel
+Prefer: -opencv-qt5-devel
+# ffmpeg and its fork libav both provide libswscale; prefer the 'original' ffmpeg
+Prefer: -libswscale-libav-devel -libavformat-libav-devel -libavresample-libav-devel
+# as long as kactivities4 exists and is provided
+Prefer: kactivities5
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: wxWidgets-2_9-devel
+Prefer: libopenssl-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
+Prefer: libffi4 libffi-devel-gcc%{gcc_version}
+Prefer: -libatomic1-gcc49 -libitm1-gcc49 -libgcj_bc1-gcc49 -libtsan0-gcc49 -libatomic1-gcc49-32bit -libitm1-gcc49-32bit
+Prefer: -libitm1-gcc48 -libitm1-gcc48-32bit -libatomic1-gcc48 -libatomic1-gcc48-32bit -libtsan0-gcc48
+Prefer: -libstdc++6-gcc48 -libgomp1-gcc48 -libatomic1-gcc48
+Prefer: libgcc_s1-x86 libgcj_bc1
+Prefer: libffi4-32bit libffi4-64bit
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc -java-1_7_0-icedtea-javadoc
+Prefer: -java-1_7_0-icedtea-devel
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX perl-Test-YAML
+Prefer: gettext-tools-mini gettext-runtime-mini
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# amarok dependency resolution
+Prefer: phonon-backend-gstreamer
+# replacing mkinitrd
+Prefer: dracut
+# replacing module-init-tools
+Prefer: kmod-compat
+# Temporary
+Prefer: oxygen5-cursors
+# Temporary
+Prefer: -perl-App-cpanminus
+# wireshark has now split off the ui. qt is considered experimental 2014-08-09
+Prefer: wireshark-ui-gtk
+# libmediaart is prepared for a larger update; for now favor mediaart-1.0
+Prefer: -typelib-1_0-MediaArt-2_0
+
+Ignore: installation-images-openSUSE:cracklib-dict-full
+Ignore: java-1_7_0-openjdk:mozilla-nss
+Ignore: java-1_7_0-openjdk:java-ca-certificates
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libgtk-3-0:adwaita-icon-theme
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-iscsi-lio-server:lio-utils
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: autoyast2:yast2-schema
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+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
+Ignore: systemd:kbd
+Ignore: systemd:kmod
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: pesign:systemd
+Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: libsystemd0-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: jdk-bootstrap:this-is-only-for-build-envs
+Prefer: -harfbuzz-bootstrap -harfbuzz-bootstrap-devel
+Ignore: harfbuzz-bootstrap:this-is-only-for-build-envs
+Ignore: polkit:ConsoleKit
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+Ignore: NetworkManager:iproute2
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: libgio-2_0-0:dbus-1-x11
+Ignore: weather-wallpaper:inkscape
+Ignore: libgamin-1-0:gamin-server
+Ignore: libfam0-gamin:gamin-server
+Ignore: python3:python3-pip
+Ignore: avahi:sysvinit(network)
+Ignore: cluster-glue:sysvinit(network)
+
+# RUBY STUFF
+
+%define %_with_ruby21 0
+
+Macros:
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in the
+# ruby-common as well.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygem() %{expand:%%{rubygems%rb_build_versions STOP %*}}
+%rubygemsSTOP() %nil
+%rubygemsxSTOP() %{expand:%%rubygemsxxSTOP -a %*}
+%rubygemsxxSTOP(a:) %{-a*}) %*
+
+%rubySTOP() %nil
+%rubyxSTOP() %*
+
+%ruby() %{expand:%%{ruby%rb_build_versions STOP %*}}
+
+%rubydevel() %{expand:%%{rubydevel%rb_build_versions STOP %*}}
+
+%rubydevelSTOP() %nil
+%rubydevelxSTOP() %*
+
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+# if you change any macros here you have to update the copy in the
+# ruby2.1 package as well.
+
+%rubygemsruby21() rubygem(ruby:2.1.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby21() %{expand:%%{rubygemsx%*}}
+
+%rubyruby21() ruby2.1 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby21() %{expand:%%{rubyx%*}}
+
+%rubydevelruby21() ruby2.1-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby21() %{expand:%%{rubydevelx%*}}
+
+%_with_ruby21 1
+
+:Macros
+
+Macros:
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in the
+# prjconf aswell.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygemsruby22() rubygem(ruby:2.2.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby22() %{expand:%%{rubygemsx%*}}
+
+%rubyruby22() ruby2.2 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby22() %{expand:%%{rubyx%*}}
+
+%rubydevelruby22() ruby2.2-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby22() %{expand:%%{rubydevelx%*}}
+
+%_with_ruby22 1
+
+:Macros
+
+%define %_with_ruby21 0
+%define rb_default_ruby ruby22
+%define rb_default_ruby_suffix ruby2.2
+%define rb_default_ruby_abi ruby:2.2.0
+
+%define rb_build_ruby_abis ruby:2.1.0 ruby:2.2.0
+%define rb_build_versions ruby21 ruby22
+Macros:
+%rb_default_ruby ruby22
+%rb_default_ruby_suffix ruby2.2
+%rb_default_ruby_abi ruby:2.2.0
+
+%rb_build_ruby_abis ruby:2.1.0 ruby:2.2.0
+%rb_build_versions ruby21 ruby22
+:Macros
+
+Prefer: -ruby-stdlib
+Prefer: %{rb_default_ruby_suffix}-rubygem-gem2rpm
+Prefer: %{rb_default_ruby_suffix}-rubygem-ruby-dbus
+Prefer: %{rb_default_ruby_suffix}-rubygem-yard
+Prefer: %{rb_default_ruby_suffix}-rubygem-rspec
+Prefer: %{rb_default_ruby_suffix}-rubygem-yast-rake
+Prefer: %{rb_default_ruby_suffix}-rubygem-cheetah
+Prefer: %{rb_default_ruby_suffix}-rubygem-inifile
+Prefer: %{rb_default_ruby_suffix}-rubygem-bundler
+Prefer: %{rb_default_ruby_suffix}-rubygem-sass
+
+# END RUBY STUFF
+
+Prefer: java-1_8_0-openjdk java-1_8_0-openjdk-devel
+Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+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: armv7l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv7hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: aarch64 -fmessage-length=0 -grecord-gcc-switches
+Optflags: ppc64le -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
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+%ifarch armv6l armv6hl
+Target: armv6hl-suse-linux
+%endif
+%ifarch armv7l armv7hl
+Target: armv7hl-suse-linux
+%endif
+
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1321
+%define is_opensuse 1
+
+Macros:
+%suse_version 1321
+%is_opensuse 1
+
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kmod-compat kernel-syms
+%kernel_module_package_buildreqs kmod-compat kernel-syms
+
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver 5
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+:Macros
+
diff --git a/configs/sl42.1.conf b/configs/sl42.1.conf
new file mode 100644
index 0000000..9186de6
--- /dev/null
+++ b/configs/sl42.1.conf
@@ -0,0 +1,796 @@
+%define gcc_version 48
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-13-2
+Substitute: kiwi-filesystem:ext3 e2fsprogs
+Substitute: kiwi-filesystem:ext4 e2fsprogs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-filesystem:btrfs btrfsprogs
+Substitute: kiwi-boot:usbboot kiwi
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot kiwi-desc-isoboot-requires
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:tbz kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-netboot-requires
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot kiwi-desc-vmxboot-requires
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot kiwi-desc-xenboot-requires
+Substitute: kiwi-setup:image kiwi createrepo tar -kiwi-desc-isoboot-requires -kiwi-desc-oemboot-requires -kiwi-desc-netboot-requires -kiwi-desc-vmxboot-requires -kiwi-desc-xenboot-requires
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+Conflict: libudev1:udev-mini
+
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /usr/sbin/useradd shadow
+FileProvides: /sbin/netconfig sysconfig-netconfig
+FileProvides: /usr/bin/docbook2man docbook-utils
+FileProvides: /usr/bin/mkisofs cdrkit-cdrtools-compat
+FileProvides: /usr/sbin/lockdev lockdev
+FileProvides: /bin/logger util-linux-systemd
+FileProvides: /bin/csh tcsh
+FileProvides: /usr/bin/csh tcsh
+FileProvides: /usr/bin/mimencode metamail
+FileProvides: /usr/bin/pkg-config pkg-config
+FileProvides: /usr/bin/sg_inq sg3_utils
+FileProvides: /usr/bin/tput ncurses-utils
+FileProvides: /usr/bin/eu-nm elfutils
+FileProvides: /usr/bin/Xvfb xorg-x11-server
+FileProvides: /usr/bin/xmllint libxml2-tools
+FileProvides: /sbin/setcap libcap-progs
+FileProvides: /usr/bin/setfacl acl
+FileProvides: /usr/bin/fipscheck fipscheck
+FileProvides: /usr/bin/python python
+
+# Until input-utils has been formaly removed
+Prefer: -input-utils
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_1
+Preinstall: libpcre1
+
+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 libsmartcols1
+
+%ifarch ppc64le
+Constraint: hostlabel PPC64LE_HOST
+%endif
+
+# On qemu arches, kernel-obs-build does not make any sense
+# on ARMv7 you can not boot the kernel as a guest, there is a special
+# guest kernel. Same is true for PPC
+%ifnarch armv6l armv6hl armv7l armv7hl ppc
+VMinstall: kernel-obs-build
+%endif
+
+%ifarch armv6l armv6hl
+Target: armv6hl-suse-linux
+%endif
+%ifarch armv7l armv7hl
+Target: armv7hl-suse-linux
+%endif
+
+%if "%qemu_user_space_build" == "1"
+
+%ifarch aarch64
+Target: aarch64-suse-linux
+%endif
+
+Hostarch: x86_64
+#Constraint: hostlabel QEMU_ARM
+
+Macros:
+%qemu_user_space_build 1
+%_without_mono 1
+%_without_wayland 1
+:Macros
+
+%ifarch armv6l armv6hl
+Preinstall: qemu-linux-user
+%endif
+
+%ifarch aarch64
+Runscripts: qemu-linux-user
+Preinstall: qemu-linux-user
+%endif
+
+%endif
+
+Required: rpm-build
+
+# needed for su's default config - perhaps we should use a simplified form?
+Support: pam-modules
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks
+%ifnarch armv6hl armv6l aarch64
+Support: rpmlint-Factory
+%endif
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+Preinstall: libunwind
+%endif
+
+Prefer: -suse-build-key
+Prefer: krb5-mini krb5-mini-devel
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslog-service syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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 enlightenment-theme-upstream
+Prefer: amarok:amarok-xine
+Prefer: kdenetwork3-vnc:tightvnc
+Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat-jsp-2_2-api tomcat6-servlet-2_5-api
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-openSUSE
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi
+# for now gstream 0.10 is it
+Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-utils typelib-1_0-GstInterfaces-0_10
+# prefer the small systemd for building
+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 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: -primus -primus-32bit
+Prefer: -staging-build-key
+# ffmpeg and its fork libav both provide libswscale; prefer the 'original' ffmpeg
+Prefer: -libswscale-libav-devel -libavformat-libav-devel -libavresample-libav-devel -libavcodec-libav-devel
+Prefer: oxygen5-cursors
+Prefer: -opencv-qt5-devel
+Prefer: libopenssl-devel
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: wxWidgets-2_9-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
+Prefer: -libgcj_bc1-gcc49
+Prefer: libitm1 libitm1-32bit libatomic1 libatomic1-32bit libtsan0 libtsan0-32bit
+Prefer: libgcc_s1-x86 libffi4 libgcj_bc1 libffi%{gcc_version}-devel
+Prefer: libffi4-32bit libffi4-64bit
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc -java-1_7_0-icedtea-javadoc
+Prefer: -java-1_7_0-icedtea-devel
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX
+Prefer: gettext-tools-mini gettext-runtime-mini
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# amarok dependency resolution
+Prefer: phonon-backend-gstreamer
+# replacing mkinitrd
+Prefer: dracut
+# replacing module-init-tools
+Prefer: kmod-compat
+# Temporary
+Prefer: oxygen-cursors4
+# Temporary
+Prefer: -perl-App-cpanminus
+# wireshark has now split off the ui. qt is considered experimental 2014-08-09
+Prefer: wireshark-ui-gtk
+Prefer: plasma5-workspace-branding-upstream
+
+# comes in two flavors
+Prefer: -libhdf5-10-openmpi -libhdf5_hl10-openmpi
+
+Ignore: installation-images-openSUSE:cracklib-dict-full
+Ignore: java-1_7_0-openjdk:mozilla-nss
+Ignore: java-1_7_0-openjdk:java-ca-certificates
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libgtk-3-0:adwaita-icon-theme
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-iscsi-lio-server:lio-utils
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: autoyast2:yast2-schema
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+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
+Ignore: systemd:kbd
+Ignore: systemd:kmod
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: pesign:systemd
+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: jdk-bootstrap:this-is-only-for-build-envs
+Ignore: polkit:ConsoleKit
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+Ignore: NetworkManager:iproute2
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: libgio-2_0-0:dbus-1-x11
+Ignore: weather-wallpaper:inkscape
+Ignore: libgamin-1-0:gamin-server
+Ignore: libfam0-gamin:gamin-server
+Ignore: python3:python3-pip
+Ignore: avahi:sysvinit(network)
+Ignore: cluster-glue:sysvinit(network)
+
+Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+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: ppc64le -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: armv6l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6hl -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
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+
+%define sle_version 120100
+%define suse_version 1315
+%define is_opensuse 1
+
+Macros:
+%sle_version 120100
+%suse_version 1315
+%is_opensuse 1
+:Macros
+
+%define _without_mono 1
+%define _without_wayland 1
+%define _without_vlc 1
+%define _without_compat_libs 1
+
+%define _with_ruby21 1
+
+%define rb_default_ruby ruby21
+%define rb_default_ruby_suffix ruby2.1
+%define rb_default_ruby_abi ruby:2.1.0
+
+%define rb_build_ruby_abis ruby:2.1.0
+%define rb_build_versions ruby21
+
+#Prefer: rubygem(%{rb_default_ruby_abi}:gem2rpm)
+Prefer: %{rb_default_ruby_suffix}-rubygem-gem2rpm
+Prefer: %{rb_default_ruby_suffix}-rubygem-rack
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kmod-compat kernel-syms
+%kernel_module_package_buildreqs kmod-compat kernel-syms
+
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_without_mono 1
+%_without_vlc 1
+%_without_compat_libs 1
+%_with_ruby21 1
+%rb_default_ruby ruby21
+%rb_default_ruby_suffix ruby2.1
+%rb_default_ruby_abi ruby:2.1.0
+
+%rb_build_ruby_abis ruby:2.1.0
+%rb_build_versions ruby21
+
+%rubygemsruby21() rubygem(ruby:2.1.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby21() %{expand:%%{rubygemsx%*}}
+#
+%rubygemsruby22() rubygem(ruby:2.2.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby22() %{expand:%%{rubygemsx%*}}
+#
+%rubygem() %{expand:%%{rubygems%rb_build_versions STOP %*}}
+%rubygemsSTOP() %nil
+%rubygemsxSTOP() %{expand:%%rubygemsxxSTOP -a %*}
+%rubygemsxxSTOP(a:) %{-a*}) %*
+#
+%rubyruby21() ruby2.1 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby21() %{expand:%%{rubyx%*}}
+#
+%rubyruby22() ruby2.2 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby22() %{expand:%%{rubyx%*}}
+#
+%rubySTOP() %nil
+%rubyxSTOP() %*
+#
+%ruby() %{expand:%%{ruby%rb_build_versions STOP %*}}
+#
+%rubydevelruby21() ruby2.1-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby21() %{expand:%%{rubydevelx%*}}
+#
+%rubydevelruby22() ruby2.2-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby22() %{expand:%%{rubydevelx%*}}
+#
+%rubydevel() %{expand:%%{rubydevel%rb_build_versions STOP %*}}
+#
+%rubydevelSTOP() %nil
+%rubydevelxSTOP() %*
+
+%_vendor suse
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver_libasan0 48
+%product_lifiullbs_gcc_ver_libgcj_bc1 48
+%product_libs_gcc_ver_libobjc4 48
+%product_libs_gcc_ver 5
+
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sl42.2.conf b/configs/sl42.2.conf
new file mode 100644
index 0000000..3e3ee10
--- /dev/null
+++ b/configs/sl42.2.conf
@@ -0,0 +1,855 @@
+%define gcc_version 48
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-13-2
+Substitute: kiwi-filesystem:ext3 e2fsprogs
+Substitute: kiwi-filesystem:ext4 e2fsprogs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-filesystem:btrfs btrfsprogs
+Substitute: kiwi-boot:usbboot kiwi
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot kiwi-desc-isoboot-requires
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:tbz kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-netboot-requires
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot kiwi-desc-vmxboot-requires
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot kiwi-desc-xenboot-requires
+Substitute: kiwi-setup:image kiwi createrepo tar -kiwi-desc-isoboot-requires -kiwi-desc-oemboot-requires -kiwi-desc-netboot-requires -kiwi-desc-vmxboot-requires -kiwi-desc-xenboot-requires
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+Conflict: libudev1:udev-mini
+Conflict: udev:libudev-mini1
+Conflict: udev-mini-devel:udev
+
+Conflict: systemd:libsystemd0-mini
+Conflict: systemd-mini-devel:systemd
+
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /usr/sbin/useradd shadow
+FileProvides: /sbin/netconfig sysconfig-netconfig
+FileProvides: /usr/bin/docbook2man docbook-utils
+FileProvides: /usr/bin/mkisofs cdrkit-cdrtools-compat
+FileProvides: /usr/sbin/lockdev lockdev
+FileProvides: /bin/logger util-linux-systemd
+FileProvides: /bin/csh tcsh
+FileProvides: /usr/bin/csh tcsh
+FileProvides: /usr/bin/mimencode metamail
+FileProvides: /usr/bin/pkg-config pkg-config
+FileProvides: /usr/bin/sg_inq sg3_utils
+FileProvides: /usr/bin/tput ncurses-utils
+FileProvides: /usr/bin/eu-nm elfutils
+FileProvides: /usr/bin/Xvfb xorg-x11-server
+FileProvides: /usr/bin/xmllint libxml2-tools
+FileProvides: /sbin/setcap libcap-progs
+FileProvides: /usr/bin/setfacl acl
+FileProvides: /usr/bin/fipscheck fipscheck
+FileProvides: /usr/bin/python python
+
+# Until input-utils has been formaly removed
+Prefer: -input-utils
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_1
+Preinstall: libpcre1
+
+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 libsmartcols1
+
+# On qemu arches, kernel-obs-build does not make any sense
+# on ARMv7 you can not boot the kernel as a guest, there is a special
+# guest kernel. Same is true for PPC
+%ifnarch armv6l armv6hl armv7l armv7hl ppc
+VMinstall: kernel-obs-build
+%endif
+
+%ifarch armv6l armv6hl
+Target: armv6hl-suse-linux
+%endif
+%ifarch armv7l armv7hl
+Target: armv7hl-suse-linux
+%endif
+
+%ifarch armv6l armv6hl armv7l armv7hl
+# https://bugzilla.suse.com/show_bug.cgi?id=983749
+Macros:
+%product_libs_gcc_ver_libffi4 48
+:Macros
+%endif
+
+ExportFilter: ^kernel-obs-build.*\.x86_64\.rpm$ . i586
+
+ExportFilter: \.x86_64\.rpm$ x86_64
+ExportFilter: \.ia64\.rpm$ ia64
+ExportFilter: \.s390x\.rpm$ s390x
+ExportFilter: \.ppc64\.rpm$ ppc64
+ExportFilter: \.ppc\.rpm$ ppc
+ExportFilter: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: -64bit-.*\.aarch64_ilp32\.rpm$
+ExportFilter: \.armv7l\.rpm$ armv7l
+ExportFilter: \.armv7hl\.rpm$ armv7l
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+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: ^acroread.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+ExportFilter: \.aarch64\.rpm$ aarch64
+ExportFilter: \.aarch64_ilp32\.rpm$ aarch64_ilp32
+
+Required: rpm-build
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks
+%ifnarch armv6hl armv6l
+Support: rpmlint-Factory
+%endif
+
+# testing deltas (only for O:F for now!)
+#Support: build-mkdrpms deltarpm
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+Preinstall: libunwind
+%endif
+
+Prefer: -suse-build-key
+Prefer: krb5-mini krb5-mini-devel
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslog-service syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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 enlightenment-theme-upstream
+Prefer: amarok:amarok-xine
+Prefer: kdenetwork3-vnc:tightvnc
+Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat-jsp-2_2-api tomcat6-servlet-2_5-api
+Prefer: icewm-lite
+Prefer: icewm-theme-branding
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: NetworkManager:NetworkManager-branding-openSUSE
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: mate-desktop-gschemas:mate-desktop-gschemas-branding-upstream
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-openSUSE
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi
+Prefer: -libpsm2-compat
+# for now gstream 0.10 is it
+Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-utils typelib-1_0-GstInterfaces-0_10
+# prefer the small systemd for building
+Prefer: libudev-mini-devel libudev-mini1 udev-debuginfo libudev1-debuginfo
+Prefer: systemd-mini systemd-mini-devel libsystemd0-mini
+Prefer: systemd-mini-devel:systemd-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 -glib2-devel-32bit
+Prefer: postgresql postgresql-server
+Prefer: -unzip-rcc
+Prefer: -primus -primus-32bit
+Prefer: -staging-build-key
+# ffmpeg and its fork libav both provide libswscale; prefer the 'original' ffmpeg
+Prefer: -ffmpeg2-devel
+Prefer: -libswscale-libav-devel -libavformat-libav-devel -libavresample-libav-devel -libavcodec-libav-devel -libavdevice-libav-devel -libavfilter-libav-devel -libpostproc-libav-devel -libavutil-libav-devel
+Prefer: oxygen5-cursors
+Prefer: -opencv-qt5-devel
+Prefer: libopenssl-devel
+Prefer: -boost_1_61-devel
+Prefer: libunbound-devel-mini
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: wxWidgets-2_9-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
+Prefer: -libgcj_bc1-gcc49
+
+# do not build with gcc6
+Prefer: -libstdc++6-gcc6 -libgcj_bc1-gcc6 -libubsan0-gcc6 -libcilkrts5-gcc6 -liblsan0-gcc6
+# do not prefer the legacy one
+Prefer: gnu-unifont-bitmap-fonts
+
+Prefer: libitm1 libatomic1 libtsan0 libubsan0
+Prefer: libitm1-32bit libatomic1-32bit libtsan0-32bit libubsan0-32bit
+Prefer: libgcc_s1-x86 libffi4 libgcj_bc1 libffi%{gcc_version}-devel
+Prefer: libffi4-32bit libffi4-64bit
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc -java-1_7_0-icedtea-javadoc
+Prefer: -java-1_7_0-icedtea-devel
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX
+Prefer: gettext-tools-mini gettext-runtime-mini
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# amarok dependency resolution
+Prefer: phonon-backend-gstreamer
+# replacing mkinitrd
+Prefer: dracut
+# replacing module-init-tools
+Prefer: kmod-compat
+# Temporary
+Prefer: oxygen-cursors4
+# Temporary
+#Prefer: -perl-App-cpanminus
+# wireshark has now split off the ui. qt is considered experimental 2014-08-09
+Prefer: wireshark-ui-gtk
+Prefer: plasma5-workspace-branding-upstream
+
+# comes in two flavors
+Prefer: -libhdf5-10-openmpi -libhdf5_hl10-openmpi
+
+# we have both python-dateutil and python-python-dateutil. The former is from
+# SLE so let's prefer it
+Prefer: python-dateutil
+
+## From 42.1:Update
+# boo#966483
+#Prefer: -libavcodec-libav-devel -libavdevice-libav-devel
+# boo#966639
+#Substitute: ceph-devel ceph-devel-compat
+# boo#963771 -- liburcu0 provides liburcu.so.2 o_O and in openSUSE we also have userspace-rcu
+Prefer: liburcu0
+# boo#968966
+#Prefer: metatheme-breeze-common
+
+Prefer: php5 php5-pear php5-devel php5-tokenizer
+Prefer: php5-zip php5-ftp php5-dom php5-gd php5-gettext php5-ctype php5-mbstring php5-json
+# take the same version in SLE
+Prefer: -ruby2.1-rubygem-fast_gettext-1_1 -ruby2.1-rubygem-fast_gettext-1_2
+Prefer: -ruby2.1-rubygem-web-console-2
+
+Ignore: installation-images-openSUSE:cracklib-dict-full
+Ignore: java-1_7_0-openjdk:mozilla-nss
+Ignore: java-1_7_0-openjdk:java-ca-certificates
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libgtk-3-0:adwaita-icon-theme
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-iscsi-lio-server:lio-utils
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: autoyast2:yast2-schema
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+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
+Ignore: systemd:kbd
+Ignore: systemd:kmod
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: pesign:systemd
+Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: libsystemd0-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: libunbound-devel-mini:this-is-only-for-build-envs
+Ignore: jdk-bootstrap:this-is-only-for-build-envs
+Ignore: polkit:ConsoleKit
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+Ignore: NetworkManager:iproute2
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: libgio-2_0-0:dbus-1-x11
+Ignore: weather-wallpaper:inkscape
+Ignore: libgamin-1-0:gamin-server
+Ignore: libfam0-gamin:gamin-server
+Ignore: python3:python3-pip
+Ignore: avahi:sysvinit(network)
+Ignore: cluster-glue:sysvinit(network)
+
+Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+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: ppc64le -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: armv6l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6hl -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
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%ifarch s390x
+%define disable_32bit 1
+%define tuneflag zEC12
+%define archflag zEC12
+
+Macros:
+%disable_32bit 1
+%tuneflag zEC12
+%archflag zEC12
+:Macros
+
+%endif
+
+%define leap_version 420200
+%define sle_version 120200
+%define suse_version 1315
+%define is_opensuse 1
+
+Macros:
+%sle_version 120200
+%suse_version 1315
+%is_opensuse 1
+:Macros
+
+%define _without_mono 1
+%define _without_wayland 1
+%define _without_vlc 1
+%define _without_compat_libs 1
+
+%define _with_ruby21 1
+
+%define rb_default_ruby ruby21
+%define rb_default_ruby_suffix ruby2.1
+%define rb_default_ruby_abi ruby:2.1.0
+
+%define rb_build_ruby_abis ruby:2.1.0
+%define rb_build_versions ruby21
+
+#Prefer: rubygem(%{rb_default_ruby_abi}:gem2rpm)
+Prefer: %{rb_default_ruby_suffix}-rubygem-gem2rpm
+Prefer: %{rb_default_ruby_suffix}-rubygem-rack
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kmod-compat kernel-syms
+%kernel_module_package_buildreqs kmod-compat kernel-syms
+
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_without_mono 1
+%_without_vlc 1
+%_without_compat_libs 1
+%_with_ruby21 1
+%rb_default_ruby ruby21
+%rb_default_ruby_suffix ruby2.1
+%rb_default_ruby_abi ruby:2.1.0
+
+%rb_build_ruby_abis ruby:2.1.0
+%rb_build_versions ruby21
+
+%rubygemsruby21() rubygem(ruby:2.1.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby21() %{expand:%%{rubygemsx%*}}
+#
+%rubygemsruby22() rubygem(ruby:2.2.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby22() %{expand:%%{rubygemsx%*}}
+#
+%rubygem() %{expand:%%{rubygems%rb_build_versions STOP %*}}
+%rubygemsSTOP() %nil
+%rubygemsxSTOP() %{expand:%%rubygemsxxSTOP -a %*}
+%rubygemsxxSTOP(a:) %{-a*}) %*
+#
+%rubyruby21() ruby2.1 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby21() %{expand:%%{rubyx%*}}
+#
+%rubyruby22() ruby2.2 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby22() %{expand:%%{rubyx%*}}
+#
+%rubySTOP() %nil
+%rubyxSTOP() %*
+#
+%ruby() %{expand:%%{ruby%rb_build_versions STOP %*}}
+#
+%rubydevelruby21() ruby2.1-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby21() %{expand:%%{rubydevelx%*}}
+#
+%rubydevelruby22() ruby2.2-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby22() %{expand:%%{rubydevelx%*}}
+#
+%rubydevel() %{expand:%%{rubydevel%rb_build_versions STOP %*}}
+#
+%rubydevelSTOP() %nil
+%rubydevelxSTOP() %*
+
+%_vendor suse
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver_libasan0 48
+%product_lifiullbs_gcc_ver_libgcj_bc1 48
+%product_libs_gcc_ver_libobjc4 48
+%product_libs_gcc_ver 5
+
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sl42.3.conf b/configs/sl42.3.conf
new file mode 100644
index 0000000..696c150
--- /dev/null
+++ b/configs/sl42.3.conf
@@ -0,0 +1,855 @@
+%define gcc_version 48
+
+Substitute: kiwi-packagemanager:zypper zypper
+Substitute: kiwi-packagemanager:smart smart
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux kiwi-instsource-plugins-openSUSE-13-2
+Substitute: kiwi-filesystem:ext3 e2fsprogs
+Substitute: kiwi-filesystem:ext4 e2fsprogs
+Substitute: kiwi-filesystem:squashfs squashfs
+Substitute: kiwi-filesystem:btrfs btrfsprogs
+Substitute: kiwi-boot:usbboot kiwi
+Substitute: kiwi-boot:isoboot kiwi-desc-isoboot kiwi-desc-isoboot-requires
+Substitute: kiwi-boot:oemboot kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:tbz kiwi-desc-oemboot kiwi-desc-oemboot-requires
+Substitute: kiwi-boot:netboot kiwi-desc-netboot kiwi-desc-netboot-requires
+Substitute: kiwi-boot:vmxboot kiwi-desc-vmxboot kiwi-desc-vmxboot-requires
+Substitute: kiwi-boot:xenboot kiwi-desc-xenboot kiwi-desc-xenboot-requires
+Substitute: kiwi-setup:image kiwi createrepo tar -kiwi-desc-isoboot-requires -kiwi-desc-oemboot-requires -kiwi-desc-netboot-requires -kiwi-desc-vmxboot-requires -kiwi-desc-xenboot-requires
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+Conflict: libudev1:udev-mini
+Conflict: udev:libudev-mini1
+Conflict: udev-mini-devel:udev
+
+Conflict: systemd:libsystemd0-mini
+Conflict: systemd-mini-devel:systemd
+
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /usr/sbin/useradd shadow
+FileProvides: /sbin/netconfig sysconfig-netconfig
+FileProvides: /usr/bin/docbook2man docbook-utils
+FileProvides: /usr/bin/mkisofs cdrkit-cdrtools-compat
+FileProvides: /usr/sbin/lockdev lockdev
+FileProvides: /bin/logger util-linux-systemd
+FileProvides: /bin/csh tcsh
+FileProvides: /usr/bin/csh tcsh
+FileProvides: /usr/bin/mimencode metamail
+FileProvides: /usr/bin/pkg-config pkg-config
+FileProvides: /usr/bin/sg_inq sg3_utils
+FileProvides: /usr/bin/tput ncurses-utils
+FileProvides: /usr/bin/eu-nm elfutils
+FileProvides: /usr/bin/Xvfb xorg-x11-server
+FileProvides: /usr/bin/xmllint libxml2-tools
+FileProvides: /sbin/setcap libcap-progs
+FileProvides: /usr/bin/setfacl acl
+FileProvides: /usr/bin/fipscheck fipscheck
+FileProvides: /usr/bin/python python
+
+# Until input-utils has been formaly removed
+Prefer: -input-utils
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_1
+Preinstall: libpcre1
+
+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 libsmartcols1
+
+# On qemu arches, kernel-obs-build does not make any sense
+# on ARMv7 you can not boot the kernel as a guest, there is a special
+# guest kernel. Same is true for PPC
+%ifnarch armv6l armv6hl armv7l armv7hl ppc
+VMinstall: kernel-obs-build
+%endif
+
+%ifarch armv6l armv6hl
+Target: armv6hl-suse-linux
+%endif
+%ifarch armv7l armv7hl
+Target: armv7hl-suse-linux
+%endif
+
+%ifarch armv6l armv6hl armv7l armv7hl
+# https://bugzilla.suse.com/show_bug.cgi?id=983749
+Macros:
+%product_libs_gcc_ver_libffi4 48
+:Macros
+%endif
+
+ExportFilter: ^kernel-obs-build.*\.x86_64\.rpm$ . i586
+
+ExportFilter: \.x86_64\.rpm$ x86_64
+ExportFilter: \.ia64\.rpm$ ia64
+ExportFilter: \.s390x\.rpm$ s390x
+ExportFilter: \.ppc64\.rpm$ ppc64
+ExportFilter: \.ppc\.rpm$ ppc
+ExportFilter: -ia32-.*\.rpm$
+ExportFilter: -32bit-.*\.sparc64\.rpm$
+ExportFilter: -64bit-.*\.sparcv9\.rpm$
+ExportFilter: -64bit-.*\.aarch64_ilp32\.rpm$
+ExportFilter: \.armv7l\.rpm$ armv7l
+ExportFilter: \.armv7hl\.rpm$ armv7l
+ExportFilter: ^glibc(?:-devel)?-32bit-.*\.sparc64\.rpm$ sparc64
+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: ^acroread.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64
+ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64
+ExportFilter: ^avmailgate.*\.s390.rpm$ . s390x
+ExportFilter: ^flash-player.*\.i586.rpm$ . x86_64
+ExportFilter: ^novell-messenger-client.*\.i586.rpm$ . x86_64
+ExportFilter: ^openCryptoki-32bit.*\.s390.rpm$ . s390x
+ExportFilter: \.aarch64\.rpm$ aarch64
+ExportFilter: \.aarch64_ilp32\.rpm$ aarch64_ilp32
+
+Required: rpm-build
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks
+%ifnarch armv6hl armv6l
+Support: rpmlint-Factory
+%endif
+
+# testing deltas (only for O:F for now!)
+#Support: build-mkdrpms deltarpm
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+Preinstall: libunwind
+%endif
+
+Prefer: -suse-build-key
+Prefer: krb5-mini krb5-mini-devel
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslog-service syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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 enlightenment-theme-upstream
+Prefer: amarok:amarok-xine
+Prefer: kdenetwork3-vnc:tightvnc
+Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat-jsp-2_2-api tomcat6-servlet-2_5-api
+Prefer: icewm-lite
+Prefer: icewm-theme-branding
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: NetworkManager:NetworkManager-branding-openSUSE
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: mate-desktop-gschemas:mate-desktop-gschemas-branding-upstream
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-openSUSE
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi
+Prefer: -libpsm2-compat
+# for now gstream 0.10 is it
+Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-utils typelib-1_0-GstInterfaces-0_10
+# prefer the small systemd for building
+Prefer: libudev-mini-devel libudev-mini1 udev-debuginfo libudev1-debuginfo
+Prefer: systemd-mini systemd-mini-devel libsystemd0-mini
+Prefer: systemd-mini-devel:systemd-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 -glib2-devel-32bit
+Prefer: postgresql postgresql-server
+Prefer: -unzip-rcc
+Prefer: -primus -primus-32bit
+Prefer: -staging-build-key
+# ffmpeg and its fork libav both provide libswscale; prefer the 'original' ffmpeg
+Prefer: -ffmpeg2-devel
+Prefer: -libswscale-libav-devel -libavformat-libav-devel -libavresample-libav-devel -libavcodec-libav-devel -libavdevice-libav-devel -libavfilter-libav-devel -libpostproc-libav-devel -libavutil-libav-devel
+Prefer: oxygen5-cursors
+Prefer: -opencv-qt5-devel
+Prefer: libopenssl-devel
+Prefer: -boost_1_61-devel
+Prefer: libunbound-devel-mini
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: wxWidgets-2_9-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
+Prefer: -libgcj_bc1-gcc49
+
+# do not build with gcc6
+Prefer: -libstdc++6-gcc6 -libgcj_bc1-gcc6 -libubsan0-gcc6 -libcilkrts5-gcc6 -liblsan0-gcc6
+# do not prefer the legacy one
+Prefer: gnu-unifont-bitmap-fonts
+
+Prefer: libitm1 libatomic1 libtsan0 libubsan0
+Prefer: libitm1-32bit libatomic1-32bit libtsan0-32bit libubsan0-32bit
+Prefer: libgcc_s1-x86 libffi4 libgcj_bc1 libffi%{gcc_version}-devel
+Prefer: libffi4-32bit libffi4-64bit
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc -java-1_7_0-icedtea-javadoc
+Prefer: -java-1_7_0-icedtea-devel
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX
+Prefer: gettext-tools-mini gettext-runtime-mini
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# amarok dependency resolution
+Prefer: phonon-backend-gstreamer
+# replacing mkinitrd
+Prefer: dracut
+# replacing module-init-tools
+Prefer: kmod-compat
+# Temporary
+Prefer: oxygen-cursors4
+# Temporary
+#Prefer: -perl-App-cpanminus
+# wireshark has now split off the ui. qt is considered experimental 2014-08-09
+Prefer: wireshark-ui-gtk
+Prefer: plasma5-workspace-branding-upstream
+
+# comes in two flavors
+Prefer: -libhdf5-10-openmpi -libhdf5_hl10-openmpi
+
+# we have both python-dateutil and python-python-dateutil. The former is from
+# SLE so let's prefer it
+Prefer: python-dateutil
+
+## From 42.1:Update
+# boo#966483
+#Prefer: -libavcodec-libav-devel -libavdevice-libav-devel
+# boo#966639
+#Substitute: ceph-devel ceph-devel-compat
+# boo#963771 -- liburcu0 provides liburcu.so.2 o_O and in openSUSE we also have userspace-rcu
+Prefer: liburcu0
+# boo#968966
+#Prefer: metatheme-breeze-common
+
+Prefer: php5 php5-pear php5-devel php5-tokenizer
+Prefer: php5-zip php5-ftp php5-dom php5-gd php5-gettext php5-ctype php5-mbstring php5-json
+# take the same version in SLE
+Prefer: -ruby2.1-rubygem-fast_gettext-1_1 -ruby2.1-rubygem-fast_gettext-1_2
+Prefer: -ruby2.1-rubygem-web-console-2
+
+Ignore: installation-images-openSUSE:cracklib-dict-full
+Ignore: java-1_7_0-openjdk:mozilla-nss
+Ignore: java-1_7_0-openjdk:java-ca-certificates
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libgtk-3-0:adwaita-icon-theme
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-iscsi-lio-server:lio-utils
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: autoyast2:yast2-schema
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+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
+Ignore: systemd:kbd
+Ignore: systemd:kmod
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: pesign:systemd
+Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: libsystemd0-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: libunbound-devel-mini:this-is-only-for-build-envs
+Ignore: jdk-bootstrap:this-is-only-for-build-envs
+Ignore: polkit:ConsoleKit
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+Ignore: NetworkManager:iproute2
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: libgio-2_0-0:dbus-1-x11
+Ignore: weather-wallpaper:inkscape
+Ignore: libgamin-1-0:gamin-server
+Ignore: libfam0-gamin:gamin-server
+Ignore: python3:python3-pip
+Ignore: avahi:sysvinit(network)
+Ignore: cluster-glue:sysvinit(network)
+
+Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+# until the builds of the packages are fixed...
+Substitute: yast2-theme-SLED
+Substitute: yast2-theme-SLE
+
+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: ppc64le -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: armv6l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6hl -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
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%ifarch s390x
+%define disable_32bit 1
+%define tuneflag zEC12
+%define archflag zEC12
+
+Macros:
+%disable_32bit 1
+%tuneflag zEC12
+%archflag zEC12
+:Macros
+
+%endif
+
+%define leap_version 420300
+%define sle_version 120300
+%define suse_version 1315
+%define is_opensuse 1
+
+Macros:
+%sle_version 120300
+%suse_version 1315
+%is_opensuse 1
+:Macros
+
+%define _without_mono 1
+%define _without_wayland 1
+%define _without_vlc 1
+%define _without_compat_libs 1
+
+%define _with_ruby21 1
+
+%define rb_default_ruby ruby21
+%define rb_default_ruby_suffix ruby2.1
+%define rb_default_ruby_abi ruby:2.1.0
+
+%define rb_build_ruby_abis ruby:2.1.0
+%define rb_build_versions ruby21
+
+#Prefer: rubygem(%{rb_default_ruby_abi}:gem2rpm)
+Prefer: %{rb_default_ruby_suffix}-rubygem-gem2rpm
+Prefer: %{rb_default_ruby_suffix}-rubygem-rack
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kmod-compat kernel-syms
+%kernel_module_package_buildreqs kmod-compat kernel-syms
+
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_without_mono 1
+%_without_vlc 1
+%_without_compat_libs 1
+%_with_ruby21 1
+%rb_default_ruby ruby21
+%rb_default_ruby_suffix ruby2.1
+%rb_default_ruby_abi ruby:2.1.0
+
+%rb_build_ruby_abis ruby:2.1.0
+%rb_build_versions ruby21
+
+%rubygemsruby21() rubygem(ruby:2.1.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby21() %{expand:%%{rubygemsx%*}}
+#
+%rubygemsruby22() rubygem(ruby:2.2.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby22() %{expand:%%{rubygemsx%*}}
+#
+%rubygem() %{expand:%%{rubygems%rb_build_versions STOP %*}}
+%rubygemsSTOP() %nil
+%rubygemsxSTOP() %{expand:%%rubygemsxxSTOP -a %*}
+%rubygemsxxSTOP(a:) %{-a*}) %*
+#
+%rubyruby21() ruby2.1 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby21() %{expand:%%{rubyx%*}}
+#
+%rubyruby22() ruby2.2 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby22() %{expand:%%{rubyx%*}}
+#
+%rubySTOP() %nil
+%rubyxSTOP() %*
+#
+%ruby() %{expand:%%{ruby%rb_build_versions STOP %*}}
+#
+%rubydevelruby21() ruby2.1-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby21() %{expand:%%{rubydevelx%*}}
+#
+%rubydevelruby22() ruby2.2-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby22() %{expand:%%{rubydevelx%*}}
+#
+%rubydevel() %{expand:%%{rubydevel%rb_build_versions STOP %*}}
+#
+%rubydevelSTOP() %nil
+%rubydevelxSTOP() %*
+
+%_vendor suse
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver_libasan0 48
+%product_lifiullbs_gcc_ver_libgcj_bc1 48
+%product_libs_gcc_ver_libobjc4 48
+%product_libs_gcc_ver 5
+
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sl8.1.conf b/configs/sl8.1.conf
new file mode 100644
index 0000000..e1b095e
--- /dev/null
+++ b/configs/sl8.1.conf
@@ -0,0 +1,196 @@
+Repotype: suse
+
+Preinstall: aaa_base acl attr bash db devs diffutils filesystem
+Preinstall: fileutils fillup glibc grep libgcc libxcrypt m4 ncurses
+Preinstall: pam permissions readline rpm sed sh-utils shadow tar
+Preinstall: textutils
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 cracklib db gcc gdbm gettext
+Required: glibc libtool ncurses pam perl rpm zlib
+
+Support: bind9-utils bison cpio cpp cyrus-sasl e2fsprogs file
+Support: findutils flex gawk gdbm-devel glibc-devel glibc-locale
+Support: gpm groff gzip kbd less libstdc++ make man mktemp modutils
+Support: ncurses-devel net-tools netcfg pam-devel pam-modules
+Support: patch ps rcs sendmail strace syslogd sysvinit texinfo
+Support: timezone unzip util-linux vim zlib-devel
+
+Keep: binutils bzip2 cpp cracklib file findutils fpk gawk gcc
+Keep: gcc-c++ gdbm glibc-devel glibc-locale gnat gnat-runtime
+Keep: gzip libstdc++ make mktemp pam-devel pam-modules patch perl
+Keep: popt rcs shlibs5 timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ia64
+Substitute: java2-devel-packages java2 java2-jre jpackage-utils
+%else
+ %ifarch ia64 s390
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils
+ %endif
+ %ifarch s390x
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils glibc-32bit baselibs-32bit
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit baselibs-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit glibc-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-sn2 kernel-64k-pagesize
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-pmac64_32bit kernel-power3 kernel-smp kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-s390x
+%endif
+
+Macros:
+%insserv_prereq aaa_base
+%fillup_prereq fillup fileutils
+%install_info_prereq texinfo
+%suse_version 810
+%sles_version 0
+%ul_version 0
+%_vendor suse
diff --git a/configs/sl8.2.conf b/configs/sl8.2.conf
new file mode 100644
index 0000000..a12fbce
--- /dev/null
+++ b/configs/sl8.2.conf
@@ -0,0 +1,199 @@
+Repotype: suse
+
+Preinstall: aaa_base acl attr bash coreutils db devs diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc libxcrypt m4 ncurses pam permissions readline
+Preinstall: rpm sed shadow tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 cracklib db gcc gdbm gettext
+Required: glibc libtool ncurses pam perl rpm zlib
+
+Support: bind9-utils bison cpio cpp cvs cyrus-sasl2 e2fsprogs
+Support: file findutils flex gawk gdbm-devel glibc-devel glibc-locale
+Support: gpm groff gzip info kbd less libstdc++ make man mktemp
+Support: modutils ncurses-devel net-tools netcfg pam-devel pam-modules
+Support: patch ps rcs sendmail strace syslogd sysvinit texinfo
+Support: timezone unzip util-linux vim zlib-devel
+
+Keep: binutils bzip2 cpp cracklib file findutils fpk gawk gcc
+Keep: gcc-c++ gdbm glibc-devel glibc-locale gnat gnat-runtime
+Keep: gzip libstdc++ make mktemp pam-devel pam-modules patch perl
+Keep: popt rcs shlibs5 timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ia64
+Substitute: java2-devel-packages java2 java2-jre jpackage-utils
+%else
+ %ifarch ia64 s390
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils
+ %endif
+ %ifarch s390x
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils glibc-32bit baselibs-32bit
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit glibc-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-sn2 kernel-64k-pagesize
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-pmac64_32bit kernel-power3 kernel-smp kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-s390x
+%endif
+
+Macros:
+%insserv_prereq insserv
+%fillup_prereq fillup fileutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%suse_version 820
+%sles_version 0
+%ul_version 0
+%jds_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl9.0.conf b/configs/sl9.0.conf
new file mode 100644
index 0000000..f5ab2b5
--- /dev/null
+++ b/configs/sl9.0.conf
@@ -0,0 +1,200 @@
+Repotype: suse
+
+Preinstall: aaa_base acl attr bash bzip2 coreutils db devs diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc libxcrypt m4 ncurses pam permissions popt readline
+Preinstall: rpm sed shadow tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 cracklib db gcc gdbm gettext
+Required: glibc libtool ncurses perl rpm zlib
+
+Support: bind-utils bison cpio cpp cvs cyrus-sasl e2fsprogs file
+Support: findutils flex gawk gdbm-devel glibc-devel glibc-locale
+Support: gpm groff gzip info kbd less libstdc++ make man mktemp
+Support: modutils ncurses-devel net-tools netcfg openldap2-client
+Support: openssl pam-devel pam-modules patch ps rcs sendmail strace
+Support: syslogd sysvinit texinfo timezone unzip util-linux vim
+Support: zlib-devel
+
+Keep: binutils cpp cracklib file findutils fpk gawk gcc gcc-c++
+Keep: gdbm glibc-devel glibc-locale gnat gnat-runtime gzip libstdc++
+Keep: libunwind make mktemp pam-devel pam-modules patch perl rcs
+Keep: shlibs5 timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ia64
+Substitute: java2-devel-packages java2 java2-jre jpackage-utils
+%else
+ %ifarch ia64 s390
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils
+ %endif
+ %ifarch s390x
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils glibc-32bit baselibs-32bit
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit glibc-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-sn2 kernel-64k-pagesize
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-pmac64_32bit kernel-power3 kernel-smp kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-s390x
+%endif
+
+Macros:
+%insserv_prereq insserv
+%fillup_prereq fillup fileutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%suse_version 900
+%sles_version 0
+%ul_version 0
+%jds_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl9.1.conf b/configs/sl9.1.conf
new file mode 100644
index 0000000..24d4fcf
--- /dev/null
+++ b/configs/sl9.1.conf
@@ -0,0 +1,203 @@
+Repotype: suse
+
+Preinstall: aaa_base acl attr bash bzip2 coreutils db devs diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc libselinux libxcrypt m4 ncurses pam permissions
+Preinstall: popt pwdutils readline rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 db gcc gdbm gettext glibc
+Required: libtool ncurses perl rpm zlib
+
+Support: bind-utils bison cpio cpp cracklib cvs cyrus-sasl e2fsprogs
+Support: file findutils flex gawk gdbm-devel glibc-devel glibc-locale
+Support: gpm groff gzip info kbd less libstdc++ make man mktemp
+Support: module-init-tools ncurses-devel net-tools netcfg
+Support: openldap2-client openssl pam-modules patch procinfo procps
+Support: psmisc rcs strace syslogd sysvinit tcpd texinfo timezone
+Support: unzip util-linux vim zlib-devel
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-c++ gdbm
+Keep: glibc-devel glibc-locale gnat gnat-runtime gzip libstdc++
+Keep: libunwind make mktemp pam-devel pam-modules patch perl rcs
+Keep: shlibs5 timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java2 java2-jre jpackage-utils
+%else
+ %ifarch ia64
+Substitute: java2-devel-packages IBMJava2-JRE BEAJava2-JRE BEAJava2-SDK jpackage-utils
+ %endif
+ %ifarch s390 ppc
+Substitute: java2-devel-packages IBMJava2-JRE IBMJava2-SDK jpackage-utils
+ %endif
+ %ifarch s390x
+Substitute: java2-devel-packages IBMJava2-JRE IBMJava2-SDK jpackage-utils XFree86-libs-32bit
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit glibc-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-sn2 kernel-64k-pagesize
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-pmac64_32bit kernel-power3 kernel-smp kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-s390x
+%endif
+
+Macros:
+%insserv_prereq insserv
+%fillup_prereq fillup fileutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%suse_version 910
+%sles_version 0
+%ul_version 0
+%jds_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl9.2.conf b/configs/sl9.2.conf
new file mode 100644
index 0000000..cd1902f
--- /dev/null
+++ b/configs/sl9.2.conf
@@ -0,0 +1,198 @@
+Repotype: suse
+
+Preinstall: aaa_base acl attr bash bzip2 coreutils db devs diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc libnscd libselinux libxcrypt m4 ncurses pam
+Preinstall: permissions popt pwdutils readline rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 db gcc gdbm gettext glibc
+Required: libtool ncurses perl rpm zlib
+
+Support: bind-utils bison cpio cpp cracklib cvs cyrus-sasl e2fsprogs
+Support: file findutils flex gawk gdbm-devel glibc-devel glibc-locale
+Support: gpm groff gzip info less libstdc++ libzio make man mktemp
+Support: module-init-tools ncurses-devel net-tools netcfg
+Support: openldap2-client openssl pam-modules patch procinfo procps
+Support: psmisc rcs strace syslogd sysvinit tcpd texinfo timezone
+Support: unzip util-linux vim zlib-devel
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-c++ gdbm
+Keep: glibc-devel glibc-locale gnat gnat-runtime gzip libstdc++
+Keep: libunwind libzio make mktemp pam-devel pam-modules patch
+Keep: perl rcs timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel jpackage-utils update-alternatives
+%else
+ %ifnarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel jpackage-utils update-alternatives
+ %else
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit jpackage-utils update-alternatives
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-s390x
+%endif
+
+Macros:
+%insserv_prereq insserv sed devs
+%fillup_prereq fillup coreutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%suse_version 920
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sl9.3.conf b/configs/sl9.3.conf
new file mode 100644
index 0000000..33c4256
--- /dev/null
+++ b/configs/sl9.3.conf
@@ -0,0 +1,198 @@
+Repotype: suse
+
+Preinstall: aaa_base acl attr bash bzip2 coreutils db devs diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc libnscd libselinux libxcrypt m4 ncurses pam
+Preinstall: permissions popt pwdutils readline rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 db gcc gdbm gettext glibc
+Required: libtool ncurses perl rpm zlib
+
+Support: bind-utils bison cpio cpp cracklib cvs cyrus-sasl e2fsprogs
+Support: file findutils flex gawk gdbm-devel glibc-devel glibc-locale
+Support: gpm groff gzip info klogd less libstdc++ libzio make
+Support: man mktemp module-init-tools ncurses-devel net-tools
+Support: netcfg openldap2-client openssl pam-modules patch procinfo
+Support: procps psmisc rcs strace syslogd sysvinit tcpd texinfo
+Support: timezone unzip util-linux vim zlib-devel
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-c++ gdbm
+Keep: glibc-devel glibc-locale gnat gnat-runtime gzip libstdc++
+Keep: libunwind libunwind-devel libzio make mktemp pam-devel pam-modules
+Keep: patch perl rcs timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel jpackage-utils update-alternatives
+%else
+ %ifnarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel jpackage-utils update-alternatives
+ %else
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit jpackage-utils update-alternatives
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-s390x
+%endif
+
+Macros:
+%insserv_prereq insserv sed devs
+%fillup_prereq fillup coreutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%suse_version 930
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sle12.0.conf b/configs/sle12.0.conf
new file mode 120000
index 0000000..75ce23b
--- /dev/null
+++ b/configs/sle12.0.conf
@@ -0,0 +1 @@
+sles12.conf \ No newline at end of file
diff --git a/configs/sle12.1.conf b/configs/sle12.1.conf
new file mode 120000
index 0000000..75ce23b
--- /dev/null
+++ b/configs/sle12.1.conf
@@ -0,0 +1 @@
+sles12.conf \ No newline at end of file
diff --git a/configs/sle12.2.conf b/configs/sle12.2.conf
new file mode 120000
index 0000000..75ce23b
--- /dev/null
+++ b/configs/sle12.2.conf
@@ -0,0 +1 @@
+sles12.conf \ No newline at end of file
diff --git a/configs/sle12.3.conf b/configs/sle12.3.conf
new file mode 120000
index 0000000..75ce23b
--- /dev/null
+++ b/configs/sle12.3.conf
@@ -0,0 +1 @@
+sles12.conf \ No newline at end of file
diff --git a/configs/sle12.4.conf b/configs/sle12.4.conf
new file mode 120000
index 0000000..75ce23b
--- /dev/null
+++ b/configs/sle12.4.conf
@@ -0,0 +1 @@
+sles12.conf \ No newline at end of file
diff --git a/configs/sle15.0.conf b/configs/sle15.0.conf
new file mode 100644
index 0000000..a04ddd3
--- /dev/null
+++ b/configs/sle15.0.conf
@@ -0,0 +1,836 @@
+
+%define gcc_version 7
+
+Patterntype: rpm-md ymp
+
+Substitute: kiwi-packagemanager:instsource product-builder-plugin-Tumbleweed
+Substitute: system-packages:kiwi-product product-builder
+Substitute: kiwi-packagemanager: kiwi-packagemanager:zypper
+
+%ifarch s390
+Substitute: valgrind
+Substitute: valgrind-devel
+Substitute: pkgconfig(valgrind)
+%endif
+%ifarch s390 s390x
+Substitute: libunwind-devel
+Substitute: pkgconfig(libunwind)
+%endif
+
+%ifarch s390 s390x
+Ignore: libsensors4-devel
+%endif
+
+Prefer: lua53 liblua5_3-5 lua53-devel libtolua++-5_3-devel
+Prefer: -liblua5_3 -liblua5_1 -liblua5_2
+
+FileProvides: /bin/csh tcsh
+FileProvides: /bin/logger util-linux-systemd
+FileProvides: /sbin/netconfig sysconfig-netconfig
+FileProvides: /sbin/setcap libcap-progs
+FileProvides: /usr/bin/csh tcsh
+FileProvides: /usr/bin/docbook2man docbook-utils
+FileProvides: /usr/bin/eu-nm elfutils
+FileProvides: /usr/bin/fipscheck fipscheck
+FileProvides: /usr/bin/killall psmisc
+FileProvides: /usr/bin/mimencode metamail
+FileProvides: /usr/bin/mkisofs cdrkit-cdrtools-compat
+FileProvides: /usr/bin/pkg-config pkg-config
+FileProvides: /usr/bin/python python-base
+FileProvides: /usr/bin/setfacl acl
+FileProvides: /usr/bin/sg_inq sg3_utils
+FileProvides: /usr/bin/tput ncurses-utils
+FileProvides: /usr/bin/xmllint libxml2-tools
+FileProvides: /usr/bin/Xvfb xorg-x11-server
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /usr/sbin/lockdev lockdev
+FileProvides: /usr/sbin/useradd shadow
+FileProvides: /usr/sbin/usermod shadow
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 libncurses6 pam
+Preinstall: permissions libreadline7 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_3-5
+Preinstall: libpcre1
+
+Runscripts: aaa_base
+
+Prefer: libdb-4_8-devel
+Prefer: cdrkit-cdrtools-compat genisoimage
+VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1 libsmartcols1
+VMinstall: kernel-obs-build
+VMInstall: iproute2
+
+Required: rpm-build
+Required: gcc-PIE
+
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+
+### Branding related preferences
+Prefer: awesome:awesome-branding-upstream
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: cinnamon-gschemas:cinnamon-gschemas-branding-upstream
+Prefer: enlightenment-theme-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: gdm:gdm-branding-upstream
+Prefer: gfxboot-branding-openSUSE -gfxboot-branding-basedonopensuse
+Prefer: glib2:glib2-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: icewm-theme-branding
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: libcinnamon-desktop-data:libcinnamon-desktop-data-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: libpurple-branding-upstream
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mate-desktop-gschemas:mate-desktop-gschemas-branding-upstream
+Prefer: NetworkManager-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: plasma5-desktop:plasma5-desktop-branding-upstream
+Prefer: plasma5-workspace:plasma5-workspace-branding-upstream
+Prefer: sddm:sddm-branding-upstream
+Prefer: systemd-presets-branding-SLE
+Prefer: wallpaper-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: yast2-theme-openSUSE
+
+# Build cycle handling - prefer -mini packages were possible, break deps as needed
+
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: gettext-tools-mini gettext-runtime-mini
+Prefer: ghostscript-mini
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: krb5-mini krb5-mini-devel
+Prefer: libudev-mini-devel libudev-mini1 udev-debuginfo libudev1-debuginfo
+Prefer: libunbound-devel-mini
+Prefer: log4j-mini
+Prefer: systemd-mini-devel:systemd-mini
+Prefer: systemd-mini systemd-mini-devel libsystemd0-mini
+Prefer: udev-mini libcom_err2-mini libext2fs2-mini
+Prefer: -harfbuzz-bootstrap -harfbuzz-bootstrap-devel
+
+# break dependency of the -mini packages: they are valid for OBS, but not for end-user-installation
+Ignore: erlang-rebar-obs:this-is-only-for-build-envs
+Ignore: harfbuzz-bootstrap:this-is-only-for-build-envs
+Ignore: jdk-bootstrap:this-is-only-for-build-envs
+Ignore: libsystemd0-mini:this-is-only-for-build-envs
+Ignore: libudev-mini1:this-is-only-for-build-envs
+Ignore: libunbound-devel-mini:this-is-only-for-build-envs
+Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: udev-mini:this-is-only-for-build-envs
+Ignore: curl-mini:this-is-only-for-build-envs
+Ignore: libcurl-mini-devel:this-is-only-for-build-envs
+Ignore: libcurl4-mini:this-is-only-for-build-envs
+
+# When kiwi comes into play, we do not want the -mini packages; -mini does not target end user systems
+Conflict: kiwi:curl-mini
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+
+# udev: -full and -mini packages don't mingle well
+Prefer: libudev1:udev
+Conflict: libudev1:udev-mini
+Conflict: udev:libudev-mini1
+
+# systemd: -full and -mini packages don't mingle well
+Conflict: systemd:libsystemd0-mini
+Conflict: systemd-mini-devel:systemd
+
+# curl: there is a -mini package to bootstrap and a full; some programs decide on what they want to build in based on what curl can do, so let's prefer full curl
+Prefer: -curl-mini -libcurl-mini-devel -libcurl4-mini
+
+# Set postfix as the 'default' smtp_daemon (virtual symbol provided by all MTAs)
+Prefer: postfix
+
+# prefer the PHP5 variants over PHP7
+Prefer: php5-ctype
+Prefer: php5-devel
+Prefer: php5-dom
+Prefer: php5-ftp
+Prefer: php5-gd
+Prefer: php5-gettext
+Prefer: php5-mbstring
+Prefer: php5-pear
+Prefer: php5-pear-Archive_Tar
+Prefer: php5-pear-Horde
+Prefer: php5 php5-json
+Prefer: php5-tokenizer
+Prefer: php5-zip
+
+# go exists in mutliple versions by now - we prefer the 'unversioned package'
+Prefer: go
+
+# python([23])-pep8 is provided by python\1-pep8 and python\1-pycodestyle - favoring 'the real one'
+Prefer: python2-pep8 python3-pep8
+
+# When perl provides a module that is also in a different package, but the consumer specifies no version, we go with perl
+Prefer: perl
+
+# Assist migration to python-pycups (python3-cups is going to be removed)
+Prefer: python3-pycups python-pycups
+
+# Apache requires a MPM - we pick prefork
+Prefer: apache2:apache2-prefork
+
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslogd
+
+# rmt is provided by tar-rmt and star-rmt - we prefer star-rmt, which was the one in the past providing rmt
+Prefer: star-rmt
+
+# A couple packares require a dbus daemon to show notifications - unless oterhwise specified, we prefer the 'standalong notification-daemon;
+Prefer: notification-daemon
+
+# Stuff that wants to have /etc/os-release available should require distribution-release, which we then offer dummy-release for (openSUSE-release changes daily for TW)
+Prefer: dummy-release
+
+# Tumbleweed ships nodejs4 for compatibility reasons - but it's not the preferred version
+Prefer: -nodejs4
+
+# have choice for libpulse.so.0 needed by wine-32bit: apulse-32bit libpulse0-32bit - prefering the 'original'
+Prefer: libpulse0-32bit
+
+# Below list still needs to be reviewed
+
+Prefer: xorg-x11-Xvnc:icewm
+Prefer: cracklib-dict-small
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+Prefer: libmpx2 libmpxwrappers2 libmpx2-32bit libmpxwrappers2-32bit
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: syslog-service
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: microcode_ctl:kernel-default
+Prefer: gnu-jaf yast2-control-center-qt
+Prefer: vim-normal myspell-american wine
+Prefer: amarok:amarok-xine
+Prefer: kdenetwork3-vnc:tightvnc
+Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat-jsp-2_2-api tomcat-jsp-2_3-api tomcat-servlet-2_5-api
+Prefer: -dbus-1-nox11
+Prefer: -servletapi3 -servletapi4 -servletapi5
+Prefer: icewm-lite
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: librest-0_7-0
+
+Prefer: rhino:xmlbeans-mini
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api -java-1_5_0-gcj-compat -geronimo-jta-1_1-api classpathx-mail
+Prefer: mx4j:log4j-mini
+
+Prefer: rpcbind eclipse-source
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: boo tog-pegasus
+Prefer: sysvinit(network) wicked-service
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: kdebase4-openSUSE:kdebase4-workspace
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: libGLw1
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: vala
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: -ruby2.4-rubygem-fast_gettext-1_1 -ruby2.4-rubygem-listen-3_0 -ruby2.4-rubygem-nokogiri-1_6 -ruby2.4-rubygem-i18n-0_6 -ruby2.4-rubygem-ruby_dep-1_3
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi -libhdf5_hl9-openmpi -libhdf5-9-openmpi -libhdf5-10-openmpi -libhdf5_hl10-openmpi -libhdf5-11-openmpi -libhdf5_hl11-openmpi -libhdf5-100-openmpi -libhdf5_hl100-openmpi
+# prefer the small systemd for building
+Prefer: star
+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 -glib2-devel-32bit
+Prefer: -typelib-1_0-GdkPixbuf-2_0-64bit -typelib-1_0-Pango-1_0-64bit -glib2-devel-64bit
+Prefer: postgresql postgresql-server postgresql-devel
+Prefer: -unzip-rcc
+Prefer: -primus -primus-32bit
+Prefer: -staging-build-key
+Prefer: -sssd-wbclient
+Prefer: -clutter-gst-devel
+Prefer: -opencv-qt5-devel
+# ffmpeg and its fork libav both provide libswscale; prefer the 'original' ffmpeg
+Prefer: -libswscale-libav-devel -libavformat-libav-devel -libavresample-libav-devel -libavcodec-libav-devel -libavdevice-libav-devel -libavfilter-libav-devel -libpostproc-libav-devel -libavutil-libav-devel
+Prefer: -ffmpeg2-devel -python-configparser2
+# as long as kactivities4 exists and is provided
+Prefer: kactivities5
+# oxygen5-icon-theme osboletes oxygen-icon-theme
+Prefer: oxygen5-icon-theme
+Prefer: npm6
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+Prefer: wxWidgets-3_0-devel
+Prefer: libopenssl-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
+Prefer: libffi-devel
+Prefer: libatomic1 libcilkrts5 libitm1 liblsan0 libtsan0 libubsan0
+Prefer: libatomic1-32bit libcilkrts5-32bit libitm1-32bit libubsan0-32bit
+Prefer: libatomic1-64bit libcilkrts5-64bit libitm1-64bit libubsan0-64bit
+Prefer: libgcc_s1-x86 libgcj_bc1
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: pcre-tools
+Prefer: libpopt0 makeinfo
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: gnome-keyring-32bit
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: python3-docutils
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX perl-Test-YAML -perl-Pod-Usage
+Prefer: libpsm2-compat
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# amarok dependency resolution
+Prefer: phonon-backend-gstreamer
+# replacing mkinitrd
+Prefer: dracut
+# replacing module-init-tools
+Prefer: kmod-compat
+# Temporary
+Prefer: oxygen5-cursors
+# Temporary
+Prefer: -perl-App-cpanminus
+# libmediaart is prepared for a larger update; for now favor mediaart-1.0
+Prefer: -typelib-1_0-MediaArt-2_0
+Prefer: -typelib-1_0-Gtk-2_0 -typelib-1_0-Gtk-4_0
+Prefer: -python-atspi
+Prefer: gettext-its-gtk3 gtk3-schema
+# for pkgconfig(ijs) and no one actually rely on ghostscript-mini-devel in Factory
+Prefer: ghostscript-devel
+# for pkgconfig(libotf) libotf-devel and libotf-devel-32bit both provides it
+Prefer: libotf-devel
+
+Ignore: installation-images-openSUSE:cracklib-dict-full
+Ignore: systemd-sysvinit:systemd
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: librtas:util-linux
+Ignore: pwdutils:openslp
+Ignore: rpm:suse-build-key,build-key
+Ignore: cloud-init:cloud-init-config
+# python-pyudev requires libudev1 in normal situations
+Ignore: python-pyudev:libudev1
+Ignore: python-SPARQLWrapper:python-rdflib
+Ignore: python3-SPARQLWrapper:python3-rdflib
+Ignore: bind-utils:bind-libs
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: libgtk-3-0:adwaita-icon-theme
+Ignore: libgtk-3-0:gdk-pixbuf-loader-rsvg
+Ignore: samba-libs:krb5
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-iscsi-lio-server:lio-utils
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: autoyast2:yast2-schema
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+Ignore: postfix:iproute2
+Ignore: aaa_base:systemd
+Ignore: gpm:systemd
+Ignore: openssh:systemd
+Ignore: cronie:systemd
+Ignore: systemd:kbd
+Ignore: systemd:kmod
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: pesign:systemd
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+
+
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: transmission-common:transmission-ui
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+Ignore: NetworkManager:iproute2
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+Ignore: sysconfig:sysvinit(network)
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: openSUSE-release:product_flavor(openSUSE)
+Ignore: libgio-2_0-0:dbus-1-x11
+Ignore: weather-wallpaper:inkscape
+Ignore: libgamin-1-0:gamin-server
+Ignore: libfam0-gamin:gamin-server
+Ignore: python3:python3-pip
+Ignore: avahi:sysvinit(network)
+Ignore: cluster-glue:sysvinit(network)
+Ignore: dracut:systemd-sysvinit
+
+Macros:
+# RUBY - UNVERSIONED STUFF
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in the
+# prjconf aswell.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygem() %{expand:%%{rubygems%rb_build_versions STOP %*}}
+%rubygemsSTOP() %nil
+%rubygemsxSTOP() %{expand:%%rubygemsxxSTOP -a %*}
+%rubygemsxxSTOP(a:) %{-a*}) %*
+
+%rubySTOP() %nil
+%rubyxSTOP() %*
+
+%ruby() %{expand:%%{ruby%rb_build_versions STOP %*}}
+
+%rubydevel() %{expand:%%{rubydevel%rb_build_versions STOP %*}}
+
+%rubydevelSTOP() %nil
+%rubydevelxSTOP() %*
+#
+
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in
+# ruby2.4 aswell.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygemsruby24() rubygem(ruby:2.4.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby24() %{expand:%%{rubygemsx%*}}
+
+%rubyruby24() ruby2.4 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby24() %{expand:%%{rubyx%*}}
+
+%rubydevelruby24() ruby2.4-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby24() %{expand:%%{rubydevelx%*}}
+
+%_with_ruby24 1
+
+%rb_default_ruby ruby24
+%rb_default_ruby_suffix ruby2.4
+%rb_default_ruby_abi ruby:2.4.0
+
+%rb_build_ruby_abis ruby:2.4.0
+%rb_build_versions ruby24
+:Macros
+
+%define _with_ruby24 1
+
+%define rb_default_ruby ruby24
+%define rb_default_ruby_suffix ruby2.4
+%define rb_default_ruby_abi ruby:2.4.0
+
+%define rb_build_ruby_abis ruby:2.4.0
+%define rb_build_versions ruby24
+
+Prefer: -ruby-stdlib
+Prefer: %{rb_default_ruby_suffix}-rubygem-gem2rpm
+Prefer: %{rb_default_ruby_suffix}-rubygem-ruby-dbus
+Prefer: %{rb_default_ruby_suffix}-rubygem-yard
+Prefer: %{rb_default_ruby_suffix}-rubygem-rspec
+Prefer: %{rb_default_ruby_suffix}-rubygem-yast-rake
+Prefer: %{rb_default_ruby_suffix}-rubygem-cheetah
+Prefer: %{rb_default_ruby_suffix}-rubygem-inifile
+Prefer: %{rb_default_ruby_suffix}-rubygem-bundler
+Prefer: %{rb_default_ruby_suffix}-rubygem-sass
+Prefer: %{rb_default_ruby_suffix}-rubygem-cfa
+
+# END RUBY STUFF
+
+# PYTHON STUFF
+
+Macros:
+%pythons %{?!skip_python2:python2} %{?!skip_python3:python3}
+
+# This method for generating python_modules gets too deep to expand at about 5 python flavors.
+# It is replaced by a Lua macro in macros.lua
+# However, OBS has a much higher expansion depth, so this works fine.
+%python_module_iter(a:) %{-a*}-%{args} %{expand:%%{?!python_module_iter_%1:%%{python_module_iter -a%*}}}
+%python_module_iter_STOP stop
+%python_module() %{expand:%%define args %{**}} %{expand:%%{python_module_iter -a %{pythons} STOP}}
+
+%add_python() %{expand:%%define pythons %pythons %1}
+:Macros
+
+# END PYTHON STUFF
+
+Prefer: java-1_8_0-openjdk java-1_8_0-openjdk-devel java-1_8_0-openjdk-javadoc java-1_8_0-openjdk-headless
+Substitute: java2-devel-packages java-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+Optflags: i586 -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches
+# no longer needed according to Richard Biener
+# Optflags: i686 -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches -fstack-protector
+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: armv7l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv7hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: aarch64 -fmessage-length=0 -grecord-gcc-switches
+Optflags: ppc64le -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
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+%ifarch sparcv9
+Target: sparcv9
+%endif
+%ifarch armv6l armv6hl
+Target: armv6hl-suse-linux
+%endif
+%ifarch armv7l armv7hl
+Target: armv7hl-suse-linux
+%endif
+
+
+#Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1500
+%define sle_version 150000
+
+%define is_opensuse 0
+
+%define is_susecaasp 1
+%define is_susesap 1
+
+Macros:
+%suse_version 1500
+%sle_version 150000
+%is_susecaasp 1
+%is_susesap 1
+%is_opensuse 0
+
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kmod-compat kernel-syms
+%kernel_module_package_buildreqs kmod-compat kernel-syms
+
+%sles_version 0
+%do_profiling 1
+%_vendor suse
+
+# Reproducible builds
+%source_date_epoch_from_changelog Y
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver 7
+# The following shlibs have latest versions built from GCC 6 sources
+%product_libs_gcc_ver_libasan3 6
+%product_libs_gcc_ver_libgo9 6
+%product_libs_gcc_ver_libgfortran3 6
+# reminded by richi 2017 4/3
+%product_libs_gcc_ver_libgcj_bc1 6
+# The following shlibs have been introduced with GCC 7
+%product_libs_gcc_ver_libmpxwrappers2 7
+%product_libs_gcc_ver_libmpx2 7
+%product_libs_gcc_ver_libasan4 7
+%product_libs_gcc_ver_libgo11 7
+%product_libs_gcc_ver_libgfortran4 7
+%gcc_version 7
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+:Macros
+
diff --git a/configs/sles10.conf b/configs/sles10.conf
new file mode 100644
index 0000000..bdc5827
--- /dev/null
+++ b/configs/sles10.conf
@@ -0,0 +1,200 @@
+Preinstall: aaa_base acl attr bash bzip2 coreutils db diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc libnscd libxcrypt m4 ncurses pam
+Preinstall: permissions popt pwdutils readline rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 db gcc gdbm gettext glibc
+Required: libtool ncurses perl rpm zlib
+
+Support: bind-libs bind-utils bison cpio cpp cracklib cvs cyrus-sasl
+Support: e2fsprogs file findutils flex gawk gdbm-devel gettext-devel
+Support: glibc-devel glibc-locale gpm groff gzip info klogd less
+Support: libcom_err libstdc++ libzio make man mktemp module-init-tools
+Support: ncurses-devel net-tools netcfg openldap2-client openssl
+Support: pam-modules patch procinfo procps psmisc rcs strace sysvinit
+Support: tcpd texinfo timezone unzip util-linux vim zlib-devel
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada libstdc++ libunwind
+Keep: libunwind-devel libzio make mktemp pam-devel pam-modules
+Keep: patch perl rcs timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+Prefer: novell-NLDAPsdk zaptel-kmp-default
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel update-alternatives
+%else
+ %ifnarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel update-alternatives
+ %else
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit update-alternatives
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-um kernel-xen kernel-kdump
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen kernel-kdump
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-kdump kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kernel-source kernel-syms
+%kernel_module_package_buildreqs kernel-source kernel-syms
+%suse_version 1010
+%sles_version 10
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sles11.conf b/configs/sles11.conf
new file mode 120000
index 0000000..87e994a
--- /dev/null
+++ b/configs/sles11.conf
@@ -0,0 +1 @@
+sl11.1.conf \ No newline at end of file
diff --git a/configs/sles11sp2.conf b/configs/sles11sp2.conf
new file mode 100644
index 0000000..e0c3a9a
--- /dev/null
+++ b/configs/sles11sp2.conf
@@ -0,0 +1,486 @@
+
+%define gcc_version 43
+
+Preinstall: aaa_base acl attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libbz2-1 libgcc%{gcc_version} libxcrypt m4 libncurses5 pam
+Preinstall: permissions popt libreadline5 rpm sed tar zlib libselinux1
+Preinstall: liblzma5
+
+Runscripts: aaa_base
+
+Order: libopenssl0_9_8:openssl-certs
+
+VMinstall: util-linux perl-base libdb-4_5 libblkid1 libuuid1 libsepol1
+
+Keep: libvolume_id
+
+Required: autoconf automake binutils bzip2 gcc gcc%{gcc_version}
+Required: gettext-runtime glibc libtool perl rpm zlib libmpfr1 gmp
+Required: libncurses5
+
+Support: audit-libs cpio cpp cpp%{gcc_version} cracklib cvs
+Support: file findutils gawk gdbm gettext-tools
+Support: glibc-devel glibc-locale groff gzip info less
+Support: libbz2-devel libdb-4_5
+Support: libstdc++%{gcc_version}
+Support: libxcrypt libzio
+Support: linux-kernel-headers make man netcfg
+Support: net-tools pam-modules patch perl-base sysvinit
+Support: texinfo timezone util-linux login
+Support: libgomp43 libuuid1 psmisc
+Support: terminfo-base
+
+Support: build brp-check-suse post-build-checks rpmlint-Factory
+Keep: brp-check-suse
+
+%ifarch ia64
+Support: libunwind libunwind-devel
+%endif
+
+FileProvides: /usr/bin/docbook2man docbook-utils
+FileProvides: /usr/bin/msgfmt gettext
+FileProvides: /usr/sbin/useradd pwdutils
+FileProvides: /usr/sbin/groupadd pwdutils
+FileProvides: /usr/sbin/update-alternatives update-alternatives
+FileProvides: /usr/bin/host bind-utils
+
+Keep: audit-libs binutils bzip2 cpio cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel glibc-locale gzip libada
+Keep: libunwind libunwind-devel libzio make pam-devel pam-modules
+Keep: patch perl-base perl rcs timezone gmp libmpfr1
+Keep: cpp43 gcc43 gcc43-ada libstdc++43
+Keep: cpp42 gcc42 gcc42-ada libstdc++42
+Keep: cpp41 gcc41 gcc41-ada libstdc++41
+Keep: java-1_6_0-openjdk java-1_6_0-openjdk-devel
+
+Prefer: -openSUSE-build-key
+Prefer: libreadline5
+Prefer: libdb_java-4_5 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta libpng fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-openSUSE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript-library
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default
+Prefer: libstdc++%{gcc_version} libgcc%{gcc_version}
+Prefer: libstdc++%{gcc_version}-32bit libstdc++%{gcc_version}-64bit
+Prefer: libstroke
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs
+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: 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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: xfce4-desktop:xfce4-desktop-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: OpenOffice_org:OpenOffice_org-branding-upstream
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner190-32bit
+Prefer: mozilla-xulrunner190-devel:mozilla-xulrunner190
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: ant:xerces-j2
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: libsepol1
+Prefer: libexpat1 uuid-runtime
+Prefer: -x11-input-synaptics -kde4-marble
+Prefer: libdlm3
+Prefer: squid
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: -vmware-player
+Prefer: libgcc%{gcc_version} libgcc%{gcc_version}-32bit libgcc%{gcc_version}-64bit
+Prefer: libgcc%{gcc_version}-x86 libffi%{gcc_version} libgcj_bc%{gcc_version}
+Prefer: libgomp%{gcc_version} libgomp%{gcc_version}-32bit libgomp%{gcc_version}-64bit
+Prefer: libmudflap%{gcc_version} libmudflap%{gcc_version}-32bit libmudflap%{gcc_version}-64bit
+Prefer: libobjc%{gcc_version} libgfortran%{gcc_version}
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini
+Prefer: -libcdio-mini -faac-mini
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libevoldap-2_4-2
+Conflict: ghostscript-library:ghostscript-mini
+Conflict: ghostscript-fonts-std:ghostscript-mini
+Prefer: -libopenal0-soft -openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: OpenOffice_org:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -java-1_7_0-icedtea-devel -libiniparser -loudmouth -libkonq4 -libnetcdf-4
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kdm:kdm-branding-upstream
+
+Prefer: libica-2_0_2
+Prefer: libxklavier12:libxklavier
+Prefer: webyast-base-ui:webyast-base-ui-branding-default
+Prefer: libpacemaker-devel:libglue-devel
+Prefer: libpacemaker3:libglue2
+Prefer: pacemaker:resource-agents
+
+# have choice for jaxen-bootstrap >= 1.1 needed by dom4j: jaxen-bootstrap jaxen
+Prefer: -jaxen-bootstrap
+# have choice for jaf >= 1.0.2
+Prefer: geronimo-jaf-1_0_2-api
+# have choice for javamail_1.3.1_api
+Prefer: excalibur-avalon-logkit:geronimo-javamail-1_3_1-api
+# have choice for jms_1.1_api
+Prefer: excalibur-avalon-logkit:geronimo-jms-1_1-api
+# have choice for jacc: geronimo-j2ee-1_4-apis geronimo-jacc-1_0-api
+Prefer: geronimo-jacc-1_0-api
+# have choice for antlr >= 2.7.1 needed by checkstyle: antlr antlr-bootstrap
+Prefer: checkstyle:antlr
+#have choice for antlr >= 2.7.6 needed by hibernate3: antlr antlr-bootstrap
+Prefer: hibernate3:antlr
+#have choice for antlr needed by jpam: antlr antlr-bootstrap
+Prefer: jpam:antlr
+#have choice for spacewalk-java-jdbc needed by spacewalk-java: spacewalk-java-postgresql spacewalk-java-oracle
+Prefer: spacewalk-java:spacewalk-java-oracle
+#have choice for jsp: geronimo-j2ee-1_4-apis geronimo-jsp-2_1-api geronimo-jsp-2_0-api
+Prefer: geronimo-jsp-2_0-api
+#have choice for jta: geronimo-j2ee-1_4-apis geronimo-jta-1_1-api java-1_5_0-gcj-compat
+Prefer: geronimo-jta-1_1-api
+#have choice for cglib >= 2.1.3 needed by jmock: cglib-nohook cglib
+Prefer: jmock:cglib
+#have choice for cglib >= 2.1.3 needed by hibernate3: cglib-nohook cglib
+Prefer: hibernate3:cglib
+# not wanted
+Prefer: -gnu-jaf
+
+# openoffice -> libreoffice
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: libreoffice:xerces-j2
+Prefer: -libreoffice
+Prefer: libreoffice:libreoffice-calc
+Prefer: libreoffice:mono-core
+
+Prefer: libservicelog:libservicelog-1_1-1
+
+
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-dvd9,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release,udev
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+
+Ignore: libgcc:glibc-32bit
+Ignore: libgcc41:glibc-32bit
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+Ignore: OpenOffice_org:OpenOffice_org-i18n
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: beagle-index:sled-release
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kdelibs4:kdelibs4-branding
+
+Ignore: spacewalk-check:zypp-plugin-spacewalk
+Ignore: libreoffice-de:myspell-german-dictionary
+Ignore: libreoffice:libreoffice-i18n
+Ignore: yast2-qt:yast2-branding
+
+%ifarch s390 s390x
+Ignore: yast2-all-packages:yast2-x11
+%endif
+
+%ifnarch ia64 s390 s390x ppc ppc64
+Prefer: java-1_6_0-openjdk java-1_6_0-openjdk-devel
+%endif
+%ifarch s390 s390x ppc ppc64
+Prefer: java-1_6_0-ibm java-1_6_0-ibm-devel
+%endif
+%ifarch ia64
+Prefer: java-1_6_0-bea java-1_6_0-bea-devel
+%endif
+
+Prefer: -java-1_5_0-gcj-compat-devel
+%if 0
+Substitute: java2-devel-packages java-1_6_0-openjdk-devel
+%else
+ %ifnarch ia64 s390 s390x ppc ppc64
+Substitute: java2-devel-packages java-1_6_0-openjdk-devel
+ %else
+ %ifarch s390 s390x ppc ppc64
+Substitute: java2-devel-packages java-1_6_0-ibm-devel unzip update-alternatives
+ %endif
+ %ifarch ia64
+Substitute: java2-devel-packages java-1_6_0-bea-devel unzip update-alternatives
+ %endif
+ %endif
+%endif
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+Substitute: kde4-kwin kwin
+
+Optflags: i586 -march=i586 -mtune=i686 -fmessage-length=0
+Optflags: i686 -march=i686 -mtune=i686 -fmessage-length=0
+Optflags: x86_64 -fmessage-length=0
+Optflags: ppc -fmessage-length=0
+Optflags: ppc64 -fmessage-length=0
+Optflags: ia64 -fmessage-length=0
+Optflags: s390 -fmessage-length=0
+Optflags: s390x -fmessage-length=0
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1110
+%define sles_version 11
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq module-init-tools kernel-syms
+%kernel_module_package_buildreqs module-init-tools kernel-syms
+
+%suse_version 1110
+%sles_version 11
+%ul_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/sles12.conf b/configs/sles12.conf
new file mode 100644
index 0000000..2368530
--- /dev/null
+++ b/configs/sles12.conf
@@ -0,0 +1,667 @@
+%define gcc_version 48
+
+Patterntype: rpm-md ymp
+
+Substitute: kiwi-packagemanager:instsource kiwi-instsource cdrkit-cdrtools-compat syslinux dosfstools kiwi-instsource-plugins-SLE-12
+
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+Conflict: libudev1:udev-mini
+Conflict: udev:udev-mini
+Conflict: sles-release:dummy-release
+
+FileProvides: /usr/sbin/groupadd shadow
+FileProvides: /usr/sbin/useradd shadow
+FileProvides: /sbin/netconfig sysconfig-netconfig
+FileProvides: /usr/bin/docbook2man docbook-utils
+FileProvides: /usr/bin/mkisofs cdrkit-cdrtools-compat
+FileProvides: /usr/sbin/lockdev lockdev
+FileProvides: /bin/logger util-linux-systemd
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 m4 libncurses5 pam
+Preinstall: permissions libreadline6 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_1
+Preinstall: libpcre1 libsmartcols1
+
+Runscripts: aaa_base
+
+Order: libopenssl0_9_8:openssl-certs
+
+VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1 net-tools
+VMInstall: kernel-obs-build
+
+%ifarch DISABLED_aarch64
+Preinstall: qemu-linux-user
+Runscripts: qemu-linux-user
+Hostarch: x86_64
+Macros:
+%qemu_user_space_build 1
+:Macros
+%endif
+
+Required: rpm-build
+
+Support: pam-modules
+
+# the basic stuff
+Support: perl build-mkbaselibs
+Support: brp-check-suse post-build-checks rpmlint-Factory
+
+Prefer: libblkid1-mini libuuid1-mini libmount1-mini libsmartcols1-mini libdb-4_8-devel
+Prefer: krb5-mini krb5-mini-devel
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: libreadline5
+Prefer: libdb_java-4_8 libicu
+Prefer: cracklib-dict-small postfix
+Prefer: jta fam mozilla mozilla-nss
+Prefer: unixODBC libsoup glitz
+Prefer: gnome-panel desktop-data-SLE gnome2-SuSE
+Prefer: mono-nunit gecko-sharp2
+Prefer: apache2-prefork Mesa openmotif-libs ghostscript-mini ghostscript
+Prefer: gtk-sharp2 glib-sharp2 glade-sharp2
+Prefer: libzypp-zmd-backend novell-NLDAPsdk zaptel-kmp-default
+Prefer: hbedv-dazuko-kmp-default dazuko-kmp-default vmware-wkstnmods-kmp-default
+Prefer: virtualbox-kmp-default virtualbox-host-kmp-default
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+Prefer: libstdc++6-gcc%{gcc_version} libgcc_s1-gcc%{gcc_version} libgomp1-gcc%{gcc_version}
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: libstroke
+Prefer: syslog-service syslogd
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2 inkscape:gtkmm24
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: gjdoc:antlr-bootstrap
+Prefer: tomboy:gconf-sharp2 tomboy:gnome-sharp2
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: glitz-32bit:Mesa-32bit
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: banshee:banshee-engine-gst helix-banshee:helix-banshee-engine-gst
+Prefer: banshee-1:banshee-1-client-classic
+Prefer: libfam0
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-alsa
+Prefer: java-1_5_0-ibm:java-1_5_0-ibm-fonts
+Prefer: java-1_6_0-ibm:java-1_6_0-ibm-fonts
+Prefer: microcode_ctl:kernel-default
+Prefer: notification-daemon
+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-SLE
+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
+Prefer: icewm-lite
+Prefer: patterns-openSUSE-GNOME-cd:banshee
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: ant-trax:saxon
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: mono-web:mono-data-sqlite
+Prefer: gnome-games:gnuchess
+Prefer: glchess:gnuchess
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: gimp:gimp-branding-upstream
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: glib2:glib2-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mysql-connector-java:java-1_5_0-gcj-compat
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api
+Prefer: rhino:xmlbeans-mini
+Prefer: ghostscript-devel:ghostscript-library
+Prefer: gdm:gdm-branding-upstream
+Prefer: rpcbind log4j-mini eclipse-source
+Prefer: mx4j:log4j-mini
+Prefer: podsleuth:sg3_utils
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: mozilla-xulrunner191
+Prefer: mozilla-xulrunner191-32bit
+Prefer: boo tog-pegasus
+Prefer: kde4-kupdateapplet:kde4-kupdateapplet-zypp
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: dummy-release
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: vala
+Prefer: wallpaper-branding-SLE
+Prefer: -crimson
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi
+Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-utils typelib-1_0-GstInterfaces-0_10
+# prefer the small systemd for building
+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 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: kernel-default-devel
+Prefer: wxWidgets-2_9-devel
+
+Prefer: -NX -xaw3dd -db43
+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: libgcc_s1-x86 libffi4 libgcj_bc1
+Prefer: libffi4-32bit libffi4-64bit
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: CASA_auth_token_svc:xerces-j2
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4 -java-1_7_0-openjdk-javadoc -java-1_7_0-icedtea-javadoc
+Prefer: -java-1_7_0-icedtea-devel
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: pcre-tools
+Prefer: libpopt0
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: gnome-shell:mozilla-js20
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX
+Prefer: gettext-tools-mini gettext-runtime-mini
+Prefer: mozilla-nss-certs
+Prefer: phonon-backend-gstreamer-0_10
+Prefer: dracut
+Prefer: kmod-compat
+
+Prefer: typelib-1_0-Wnck-3_0
+Prefer: -cups154-libs -cups154-client -cups154
+
+Ignore: java-1_7_0-openjdk:mozilla-nss
+Ignore: java-1_7_0-openjdk:java-ca-certificates
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-iscsi-lio-server:lio-utils
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+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
+Ignore: systemd:kbd
+Ignore: systemd:kmod
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: pesign:systemd
+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
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: gawk:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: m4:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: util-linux-mini:info
+Ignore: gettext-tools:info
+Ignore: gettext-runtime:info
+Ignore: libgcrypt-devel:info
+Ignore: binutils:info
+Ignore: gzip:info
+Ignore: make:info
+Ignore: bison:info
+Ignore: flex:info
+Ignore: help2man:info
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+Ignore: NetworkManager:NetworkManager-client
+Ignore: libbeagle:beagle
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: hal:pm-utils
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: util-linux-mini:util-linux-mini-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: pulseaudio:kernel
+Ignore: transmission-common:transmission-ui
+Ignore: mutter-moblin:moblin-branding
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+Ignore: NetworkManager:iproute2
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: openSUSE-release:product_flavor(openSUSE)
+Ignore: sles-release:product_flavor(SLES)
+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
+Ignore: avahi:sysvinit(network)
+Ignore: sysconfig:sysvinit(network)
+
+Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel
+
+Prefer: -java-1_5_0-gcj-compat-devel
+Prefer: -java-1_6_0-ibm-devel
+%ifarch %ix86 x86_64
+Prefer: -java-1_5_0-ibm-devel
+%endif
+
+Substitute: java2-devel-packages java-1_7_0-openjdk-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+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: ppc64le -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: aarch64 -fmessage-length=0 -grecord-gcc-switches -fstack-protector
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables
+
+%define suse_version 1315
+%define _without_mono 1
+%define _without_vlc 1
+%define _without_compat_libs 1
+
+%define rb_default_ruby ruby21
+%define rb_default_ruby_suffix ruby2.1
+%define rb_default_ruby_abi ruby:2.1.0
+
+%define rb_build_ruby_abis ruby:2.1.0
+%define rb_build_versions ruby21
+
+#Prefer: rubygem(%{rb_default_ruby_abi}:gem2rpm)
+Prefer: %{rb_default_ruby_suffix}-rubygem-gem2rpm
+
+Macros:
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kmod-compat kernel-syms
+%kernel_module_package_buildreqs kmod-compat kernel-syms
+%maintenance_vendor SUSE LLC <https://www.suse.com/>
+%maintenance_distribution SUSE Linux Enterprise 12
+
+%suse_version 1315
+%sles_version 0
+%ul_version 0
+%do_profiling 1
+%_without_mono 1
+%_without_vlc 1
+%_without_compat_libs 1
+%rb_default_ruby ruby21
+%rb_default_ruby_suffix ruby2.1
+%rb_default_ruby_abi ruby:2.1.0
+
+%rb_build_ruby_abis ruby:2.1.0
+%rb_build_versions ruby21
+
+%rubygemsruby21() rubygem(ruby:2.1.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby21() %{expand:%%{rubygemsx%*}}
+#
+%rubygemsruby22() rubygem(ruby:2.2.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby22() %{expand:%%{rubygemsx%*}}
+#
+%rubygem() %{expand:%%{rubygems%rb_build_versions STOP %*}}
+%rubygemsSTOP() %nil
+%rubygemsxSTOP() %{expand:%%rubygemsxxSTOP -a %*}
+%rubygemsxxSTOP(a:) %{-a*}) %*
+#
+%rubyruby21() ruby2.1 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby21() %{expand:%%{rubyx%*}}
+#
+%rubyruby22() ruby2.2 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby22() %{expand:%%{rubyx%*}}
+#
+%rubySTOP() %nil
+%rubyxSTOP() %*
+#
+%ruby() %{expand:%%{ruby%rb_build_versions STOP %*}}
+#
+%rubydevelruby21() ruby2.1-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby21() %{expand:%%{rubydevelx%*}}
+#
+%rubydevelruby22() ruby2.2-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby22() %{expand:%%{rubydevelx%*}}
+#
+%rubydevel() %{expand:%%{rubydevel%rb_build_versions STOP %*}}
+#
+%rubydevelSTOP() %nil
+%rubydevelxSTOP() %*
+
+%_vendor suse
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver 48
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/configs/sles15.conf b/configs/sles15.conf
new file mode 100644
index 0000000..a1e0699
--- /dev/null
+++ b/configs/sles15.conf
@@ -0,0 +1,860 @@
+
+%define gcc_version 7
+
+Substitute: kiwi python3-kiwi
+
+Substitute: kiwi-packagemanager:instsource product-builder-plugin-SLE_15
+Substitute: system-packages:kiwi-product product-builder
+Substitute: kiwi-packagemanager: kiwi-packagemanager:zypper
+
+%ifarch s390
+Substitute: valgrind
+Substitute: valgrind-devel
+Substitute: pkgconfig(valgrind)
+%endif
+%ifarch s390 s390x
+Substitute: libunwind-devel
+Substitute: pkgconfig(libunwind)
+%endif
+
+%ifarch s390 s390x
+Ignore: libsensors4-devel
+%endif
+
+%define _without_mono 1
+Macros:
+%_without_mono 1
+:Macros
+
+Prefer: lua53 liblua5_3-5 lua53-devel libtolua++-5_3-devel
+Prefer: -liblua5_3 -liblua5_1 -liblua5_2
+
+Preinstall: aaa_base attr bash coreutils diffutils
+Preinstall: filesystem fillup glibc grep
+Preinstall: libbz2-1 libgcc_s1 libncurses6 pam
+Preinstall: permissions libreadline7 rpm sed tar libz1 libselinux1
+Preinstall: liblzma5 libcap2 libacl1 libattr1
+Preinstall: libpopt0 libelf1 liblua5_3-5
+Preinstall: libpcre1
+
+Runscripts: aaa_base
+
+Prefer: libdb-4_8-devel
+Prefer: cdrkit-cdrtools-compat genisoimage
+VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1 libsmartcols1
+VMinstall: kernel-obs-build
+VMInstall: iproute2
+
+Required: rpm-build
+# Build all packages with -pie enabled
+Required: gcc-PIE
+
+# the basic stuff
+Support: perl
+Support: brp-check-suse post-build-checks rpmlint-Factory
+
+### Branding related preferences
+Prefer: awesome:awesome-branding-upstream
+Prefer: bundle-lang-gnome:gnome-session-branding-openSUSE
+Prefer: cinnamon-gschemas:cinnamon-gschemas-branding-upstream
+Prefer: enlightenment-theme-upstream
+Prefer: exo-data:exo-branding-upstream
+Prefer: fcitx:fcitx-branding-openSUSE
+Prefer: gdm:gdm-branding-upstream
+Prefer: gfxboot-branding-openSUSE -gfxboot-branding-basedonopensuse
+Prefer: glib2:glib2-branding-upstream
+Prefer: gnome-panel:gnome-panel-branding-upstream
+Prefer: gnome-session:gconf2-branding-openSUSE
+Prefer: gnome-session:gnome-session-branding-openSUSE
+Prefer: icewm-theme-branding
+Prefer: kde4-kdm:kde4-kdm-branding-upstream
+Prefer: kdebase4-workspace:kdebase4-workspace-branding-upstream
+Prefer: kdelibs4-branding:kdelibs4-branding-upstream
+Prefer: kdelibs4:kdelibs4-branding-upstream
+Prefer: kdm:kdm-branding-upstream
+Prefer: libcinnamon-desktop-data:libcinnamon-desktop-data-branding-upstream
+Prefer: libexo-1-0:libexo-1-0-branding-upstream
+Prefer: libgarcon-1-0:libgarcon-branding-upstream
+Prefer: libgarcon-data:libgarcon-branding-upstream
+Prefer: libgio-2_0-0:gio-branding-upstream
+Prefer: libglib-2_0-0:glib2-branding-upstream
+Prefer: libpurple-branding-upstream
+Prefer: libreoffice:libreoffice-branding-upstream
+Prefer: libsocialweb:libsocialweb-branding-upstream
+Prefer: libxfce4ui:libxfce4ui-branding-upstream
+Prefer: lightdm-gtk-greeter:lightdm-gtk-greeter-branding-upstream
+Prefer: mate-desktop-gschemas:mate-desktop-gschemas-branding-upstream
+Prefer: NetworkManager-branding-upstream
+Prefer: PackageKit:PackageKit-branding-upstream
+Prefer: plasma5-desktop:plasma5-desktop-branding-upstream
+Prefer: plasma5-workspace:plasma5-workspace-branding-upstream
+Prefer: sddm:sddm-branding-upstream
+Prefer: systemd-presets-branding-SLE
+Prefer: wallpaper-branding-openSUSE
+Prefer: xfce4-notifyd:xfce4-notifyd-branding-upstream
+Prefer: xfce4-settings:xfce4-settings-branding-upstream
+Prefer: xfdesktop:xfdesktop-branding-upstream
+Prefer: yast2-branding-openSUSE
+Prefer: yast2-qt:yast2-qt-branding-openSUSE
+Prefer: yast2-theme-openSUSE
+
+# Build cycle handling - prefer -mini packages were possible, break deps as needed
+
+Conflict: krb5-devel:krb5-mini
+Conflict: krb5:krb5-mini-devel
+Prefer: gettext-tools-mini gettext-runtime-mini
+Prefer: ghostscript-mini
+Prefer: krb5-mini-devel:krb5-mini
+Prefer: krb5-mini krb5-mini-devel
+Prefer: libudev-mini-devel libudev-mini1 udev-debuginfo libudev1-debuginfo
+Prefer: libunbound-devel-mini
+Prefer: log4j-mini
+Prefer: systemd-mini-devel:systemd-mini
+Prefer: systemd-mini systemd-mini-devel libsystemd0-mini
+Prefer: udev-mini libcom_err2-mini libext2fs2-mini
+Prefer: -harfbuzz-bootstrap -harfbuzz-bootstrap-devel
+
+# break dependency of the -mini packages: they are valid for OBS, but not for end-user-installation
+Ignore: erlang-rebar-obs:this-is-only-for-build-envs
+Ignore: harfbuzz-bootstrap:this-is-only-for-build-envs
+Ignore: jdk-bootstrap:this-is-only-for-build-envs
+Ignore: libsystemd0-mini:this-is-only-for-build-envs
+Ignore: libudev-mini1:this-is-only-for-build-envs
+Ignore: libunbound-devel-mini:this-is-only-for-build-envs
+Ignore: systemd-mini:this-is-only-for-build-envs
+Ignore: udev-mini:this-is-only-for-build-envs
+Ignore: curl-mini:this-is-only-for-build-envs
+Ignore: libcurl-mini-devel:this-is-only-for-build-envs
+Ignore: libcurl4-mini:this-is-only-for-build-envs
+
+# Ring0 packages should not pull in 'info' - making the base VM smaller
+Ignore: binutils:info
+Ignore: bison:info
+Ignore: coreutils:info
+Ignore: cpio:info
+Ignore: diffutils:info
+Ignore: findutils:info
+Ignore: flex:info
+Ignore: gawk:info
+Ignore: gettext-runtime:info
+Ignore: gettext-tools:info
+Ignore: grep:info
+Ignore: groff:info
+Ignore: gzip:info
+Ignore: help2man:info
+Ignore: libgcrypt-devel:info
+Ignore: m4:info
+Ignore: make:info
+Ignore: sed:info
+Ignore: tar:info
+Ignore: util-linux:info
+Ignore: which:info
+
+# Let's speed up things: We don't need Mesa-dri and Mesa-gallium in the build system
+Ignore: Mesa:Mesa-dri
+Ignore: Mesa:Mesa-gallium
+
+# When kiwi comes into play, we do not want the -mini packages; -mini does not target end user systems
+Conflict: kiwi:curl-mini
+Conflict: kiwi:libudev-mini1
+Conflict: kiwi:systemd-mini
+
+# udev: -full and -mini packages don't mingle well
+Prefer: libudev1:udev
+Conflict: libudev1:udev-mini
+Conflict: udev:libudev-mini1
+
+# systemd: -full and -mini packages don't mingle well
+Conflict: systemd:libsystemd0-mini
+Conflict: systemd-mini-devel:systemd
+
+# curl: there is a -mini package to bootstrap and a full; some programs decide on what they want to build in based on what curl can do, so let's prefer full curl
+Prefer: -curl-mini -libcurl-mini-devel -libcurl4-mini
+
+#Prefer: -openSUSE-build-key
+# Set postfix as the 'default' smtp_daemon (virtual symbol provided by all MTAs)
+Prefer: postfix
+# Give the worker any default apache2-MPM for apache2- chosing 'prefork' (alternatives are -event and -worker, dep-wise they are equal)
+
+# prefer the PHP5 variants over PHP7
+Prefer: php5-ctype
+Prefer: php5-devel
+Prefer: php5-dom
+Prefer: php5-ftp
+Prefer: php5-gd
+Prefer: php5-gettext
+Prefer: php5-mbstring
+Prefer: php5-pear
+Prefer: php5-pear-Archive_Tar
+Prefer: php5-pear-Horde
+Prefer: php5 php5-json
+Prefer: php5-tokenizer
+Prefer: php5-zip
+
+# go exists in mutliple versions by now - we prefer the 'unversioned package'
+Prefer: go
+
+# python([23])-pep8 is provided by python\1-pep8 and python\1-pycodestyle - favoring 'the real one'
+Prefer: python2-pep8 python3-pep8
+
+# When perl provides a module that is also in a different package, but the consumer specifies no version, we go with perl
+Prefer: perl
+
+# Assist migration to python-pycups (python3-cups is going to be removed)
+Prefer: python3-pycups python-pycups
+
+# Apache requires a MPM - we pick prefork
+Prefer: apache2:apache2-prefork
+
+# for symbol syslog (syslogd is best as it has the least dependencies)
+Prefer: syslogd
+
+# rmt is provided by tar-rmt and star-rmt - we prefer star-rmt, which was the one in the past providing rmt
+Prefer: star-rmt
+
+# A couple packares require a dbus daemon to show notifications - unless oterhwise specified, we prefer the 'standalong notification-daemon;
+Prefer: notification-daemon
+
+# Stuff that wants to have /etc/os-release available should require distribution-release, which we then offer dummy-release for (openSUSE-release changes daily for TW)
+Prefer: dummy-release
+
+# Tumbleweed ships nodejs4 for compatibility reasons - but it's not the preferred version
+Prefer: -nodejs4
+
+# have choice for libpulse.so.0 needed by wine-32bit: apulse-32bit libpulse0-32bit - prefering the 'original'
+Prefer: libpulse0-32bit
+
+# do not used openmpi variant to build against netcdf
+Prefer: netcdf-devel
+
+# Below list still needs to be reviewed
+
+Prefer: xorg-x11-Xvnc:icewm
+Prefer: cracklib-dict-small
+Prefer: libstdc++6 libgcc_s1 libquadmath0
+Prefer: libstdc++6-32bit libstdc++6-64bit
+Prefer: libstdc++6-x86
+Prefer: libmpx2 libmpxwrappers2 libmpx2-32bit libmpxwrappers2-32bit
+%ifarch s390x
+Prefer: -libstdc++41
+%endif
+Prefer: syslog-service
+Prefer: poppler-tools
+Prefer: libjpeg8-devel libjpeg-turbo
+Prefer: microcode_ctl:kernel-default
+Prefer: gnu-jaf yast2-control-center-qt
+Prefer: vim-normal myspell-american wine
+Prefer: amarok:amarok-xine
+Prefer: kdenetwork3-vnc:tightvnc
+Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat-jsp-2_2-api tomcat-jsp-2_3-api tomcat-servlet-2_5-api
+Prefer: -dbus-1-nox11
+Prefer: -servletapi3 -servletapi4 -servletapi5
+Prefer: icewm-lite
+Prefer: yast2-ncurses-pkg
+Prefer: monodevelop: mono-addins
+Prefer: texlive-xmltex texlive-tools texlive-jadetex
+Prefer: libesd-devel:esound
+Prefer: libesd0:esound-daemon
+Prefer: package-lists-openSUSE-KDE-cd: esound-daemon
+Prefer: librest-0_7-0
+
+Prefer: rhino:xmlbeans-mini
+Prefer: -geronimo-jta-1_0_1B-api -geronimo-jms-1_1-api -geronimo-el-1_0-api -java-1_5_0-gcj-compat -geronimo-jta-1_1-api classpathx-mail
+Prefer: mx4j:log4j-mini
+
+Prefer: rpcbind eclipse-source
+Prefer: libcdio_cdda0 libcdio_paranoia0
+Prefer: boo tog-pegasus
+Prefer: sysvinit(network) wicked-service
+Prefer: kdebase4-workspace:kdebase4-workspace-ksysguardd
+Prefer: kdebase4-openSUSE:kdebase4-workspace
+Prefer: ant:xerces-j2
+Prefer: dhcp-client:dhcp
+Prefer: libGLw1
+# provides typelib(St)
+Prefer: -cinnamon
+Prefer: -bundle-lang-kde-de -bundle-lang-kde-en -bundle-lang-kde-es
+Prefer: -bundle-lang-kde-fr -bundle-lang-kde-pt -bundle-lang-kde-el
+Prefer: -bundle-lang-kde-zh -bundle-lang-kde-ja -bundle-lang-kde-ru -bundle-lang-kde-pl
+Prefer: -bundle-lang-kde-sv -bundle-lang-kde-ko -bundle-lang-kde-fi -bundle-lang-kde-da
+Prefer: -bundle-lang-kde-cs -bundle-lang-kde-nl -bundle-lang-kde-hu -bundle-lang-kde-nb
+Prefer: -bundle-lang-kde-it -bundle-lang-kde-ca -bundle-lang-kde-ar
+Prefer: -bundle-lang-gnome-es -bundle-lang-gnome-de -bundle-lang-gnome-fr
+Prefer: -bundle-lang-gnome-pt -bundle-lang-gnome-en -bundle-lang-gnome-el
+Prefer: -bundle-lang-gnome-zh -bundle-lang-gnome-ja -bundle-lang-gnome-ru -bundle-lang-gnome-cs
+Prefer: -bundle-lang-gnome-ko -bundle-lang-gnome-da -bundle-lang-gnome-nl -bundle-lang-gnome-hu
+Prefer: -bundle-lang-gnome-pl -bundle-lang-gnome-fi -bundle-lang-gnome-nb -bundle-lang-gnome-sv
+Prefer: -bundle-lang-gnome-it -bundle-lang-gnome-ca -bundle-lang-gnome-ar
+Prefer: -bundle-lang-gnome-extras-es -bundle-lang-gnome-extras-de -bundle-lang-gnome-extras-fr
+Prefer: -bundle-lang-gnome-extras-pt -bundle-lang-gnome-extras-en -bundle-lang-gnome-extras-el
+Prefer: -bundle-lang-gnome-extras-zh -bundle-lang-gnome-extras-ja -bundle-lang-gnome-extras-ru -bundle-lang-gnome-extras-cs
+Prefer: -bundle-lang-gnome-extras-ko -bundle-lang-gnome-extras-da -bundle-lang-gnome-extras-nl -bundle-lang-gnome-extras-hu
+Prefer: -bundle-lang-gnome-extras-pl -bundle-lang-gnome-extras-fi -bundle-lang-gnome-extras-nb -bundle-lang-gnome-extras-sv
+Prefer: -bundle-lang-gnome-extras-it -bundle-lang-gnome-extras-ca -bundle-lang-gnome-extras-ar
+Prefer: -bundle-lang-common-es -bundle-lang-common-de -bundle-lang-common-fr
+Prefer: -bundle-lang-common-pt -bundle-lang-common-en -bundle-lang-common-el
+Prefer: -bundle-lang-common-ja -bundle-lang-common-zh -bundle-lang-common-cs -bundle-lang-common-ru
+Prefer: -bundle-lang-common-nl -bundle-lang-common-hu -bundle-lang-common-pl -bundle-lang-common-da
+Prefer: -bundle-lang-common-ko -bundle-lang-common-nb -bundle-lang-common-fi -bundle-lang-common-sv
+Prefer: -bundle-lang-common-it -bundle-lang-common-ca -bundle-lang-common-ar
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -libreoffice -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -python-setuptools
+Prefer: -kdenetwork3-InstantMessenger
+Prefer: -icc-profiles
+Prefer: vala
+# in doubt, take xerces
+Prefer: -crimson
+# in doubt, take higher versions
+Prefer: -rubygem-rack-1_1 -rubygem-rack-1_2 -rubygem-rack-1_3 -rubygem-tilt-1_1 -rubygem-rack-1_4
+Prefer: -rubygem-method_source-0_7 -rubygem-rails-2_3 -rubygem-activerecord-2_3
+Prefer: -rubygem-json_pure-1_5
+Prefer: geronimo-servlet-2_4-api
+Prefer: -libhdf5-0-openmpi -libhdf5_hl0-openmpi -libhdf5_hl8-openmpi -libhdf5-8-openmpi -libhdf5_hl9-openmpi -libhdf5-9-openmpi -libhdf5-10-openmpi -libhdf5_hl10-openmpi -libhdf5-11-openmpi -libhdf5_hl11-openmpi -libhdf5-100-openmpi -libhdf5_hl100-openmpi
+# python-scimpy: have choice for fftw-devel: fftw3-devel fftw3_3_3_6-gnu-hpc-devel fftw3_3_...
+Prefer: fftw3-devel
+# prefer the small systemd for building
+Prefer: star
+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 -glib2-devel-32bit
+Prefer: -typelib-1_0-GdkPixbuf-2_0-64bit -typelib-1_0-Pango-1_0-64bit -glib2-devel-64bit
+Prefer: postgresql postgresql-server postgresql-devel
+Prefer: -unzip-rcc
+Prefer: -primus -primus-32bit
+Prefer: -staging-build-key
+Prefer: -sssd-wbclient
+Prefer: -clutter-gst-devel
+Prefer: -opencv-qt5-devel
+# ffmpeg and its fork libav both provide libswscale; prefer the 'original' ffmpeg
+Prefer: -libswscale-libav-devel -libavformat-libav-devel -libavresample-libav-devel -libavcodec-libav-devel -libavdevice-libav-devel -libavfilter-libav-devel -libpostproc-libav-devel -libavutil-libav-devel
+Prefer: -ffmpeg2-devel -python-configparser2
+# as long as kactivities4 exists and is provided
+Prefer: kactivities5
+# oxygen5-icon-theme osboletes oxygen-icon-theme
+Prefer: oxygen5-icon-theme
+Prefer: npm6
+
+# kernel bug (coolo)
+Prefer: kernel-default-devel
+
+# have choice for mysql-devel: libmariadb-devel libmysqlclient-devel
+# Prefer: libmariadb-devel
+Prefer: libmysqlclient-devel
+
+Prefer: wxWidgets-3_0-devel
+Prefer: libopenssl-devel
+
+Prefer: -NX -xaw3dd -db43
+Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis
+Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit
+Prefer: libffi-devel
+Prefer: libatomic1 libcilkrts5 libitm1 liblsan0 libtsan0 libubsan0
+Prefer: libatomic1-32bit libcilkrts5-32bit libitm1-32bit libubsan0-32bit
+Prefer: libatomic1-64bit libcilkrts5-64bit libitm1-64bit libubsan0-64bit
+Prefer: libgcc_s1-x86 libgcj_bc1
+Prefer: libgomp1 libgomp1-32bit libgomp1-64bit
+Prefer: libmudflap4 libmudflap4-32bit libmudflap4-64bit
+Prefer: libobjc4 libgfortran3 libquadmath0
+Prefer: -libnetpbm -libcdio7-mini -libiso9660-5-mini -libiso9660-7-mini -libcdio10-mini -libcdio12-mini
+Prefer: -libcdio-mini -faac-mini -libcdio-mini-devel
+Prefer: -seamonkey
+Prefer: -libdb-4_4-devel -libdb-4_5-devel -libevoldap-2_4-2
+Prefer: libopenal0-soft openal-soft -lsb-buildenv
+Prefer: -libevent
+Prefer: gnu-crypto libusb-compat-devel
+Prefer: libusb-0_1-4
+Prefer: libreoffice:xerces-j2
+Prefer: k3b:libdvdread4
+Prefer: glibc-devel
+Prefer: -libpcap -libiniparser -loudmouth -libkonq4 -libnetcdf-4
+Prefer: NetworkManager:dhcp-client
+Prefer: kdebase3-SuSE:kdebase3
+Prefer: pcre-tools
+Prefer: libpopt0 makeinfo
+Prefer: -apache2-mod_perl -otrs -qa_apache_testsuite -ctcs2
+Prefer: libgnome-keyring-devel
+Prefer: gnome-keyring-32bit
+Prefer: linux-glibc-devel
+Prefer: squid sysvinit
+Prefer: libpng16-compat-devel
+Prefer: -python3 -python3-gobject-devel -python3-gobject2-devel -x11-video-fglrxG02 -libpng12-0
+Prefer: python3-docutils
+Prefer: perl-Mail-SPF:perl-Error libldb0 -audit-libs mysql-community-server mysql-community-server-client
+#needed because new xml-commons package
+Prefer: xml-commons-resolver12 xml-commons-jaxp-1.3-apis
+Prefer: xmlgraphics-fop:xerces-j2
+Prefer: cogl-devel
+Prefer: -perl-XML-SAX perl-Test-YAML -perl-Pod-Usage
+Prefer: libpsm2-compat
+# choice p11-kit-nss-trust
+Prefer: mozilla-nss-certs
+# amarok dependency resolution
+Prefer: phonon-backend-gstreamer
+# replacing mkinitrd
+Prefer: dracut
+# replacing module-init-tools
+Prefer: kmod-compat
+# Temporary
+Prefer: oxygen5-cursors
+# Temporary
+Prefer: -perl-App-cpanminus
+# libmediaart is prepared for a larger update; for now favor mediaart-1.0
+Prefer: -typelib-1_0-MediaArt-2_0
+Prefer: -typelib-1_0-Gtk-2_0 -typelib-1_0-Gtk-4_0
+Prefer: -python-atspi
+Prefer: gettext-its-gtk3 gtk3-schema
+# for pkgconfig(ijs) and no one actually rely on ghostscript-mini-devel in Factory
+Prefer: ghostscript-devel
+# for pkgconfig(libotf) libotf-devel and libotf-devel-32bit both provides it
+Prefer: libotf-devel
+
+Ignore: installation-images-openSUSE:cracklib-dict-full
+Ignore: systemd-sysvinit:systemd
+Ignore: openSUSE-release:openSUSE-release-ftp,openSUSE-release-dvd5,openSUSE-release-biarch,openSUSE-release-livecdkde,openSUSE-release-livecdgnome
+Ignore: cracklib:cracklib-dict
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,distribution-release,udev
+Ignore: sysvinit:mingetty
+Ignore: gettext-tools:libgcj,libstdc++-devel,libgcj41,libstdc++41-devel,libgcj42,libstdc++42-devel
+Ignore: libgcj43,libstdc++43-devel
+Ignore: libgcj44,libstdc++44-devel
+Ignore: libgcj45,libstdc++45-devel
+Ignore: libgcj46,libstdc++46-devel
+Ignore: libgcj47,libstdc++47-devel
+Ignore: librtas:util-linux
+Ignore: pwdutils:openslp
+Ignore: rpm:suse-build-key,build-key
+Ignore: cloud-init:cloud-init-config
+# python-pyudev requires libudev1 in normal situations
+Ignore: python-pyudev:libudev1
+Ignore: python-SPARQLWrapper:python-rdflib
+Ignore: python3-SPARQLWrapper:python3-rdflib
+Ignore: bind-utils:bind-libs
+Ignore: portmap:syslogd
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: xorg-x11-server:xorg-x11-driver-input,xorg-x11-driver-video
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,OpenEXR,aspell,cups-libs,mDNSResponder-lib,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2-devel:indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: libgtk-3-0:adwaita-icon-theme
+Ignore: libgtk-3-0:gdk-pixbuf-loader-rsvg
+Ignore: samba-libs:krb5
+Ignore: libbonoboui:gnome-desktop
+Ignore: libxfce4ui-1-0:exo-tools
+Ignore: docbook_4:iso_ent,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2_theme,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:libxslt
+Ignore: yast2-iscsi-lio-server:lio-utils
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11,libyui_pkg
+Ignore: autoyast2:yast2-schema
+# not during build
+Ignore: yui_backend
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: yast2-network:yast2-inetd
+Ignore: openslp-devel:openssl-devel
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: texlive-bin:ghostscript-x11
+Ignore: texlive-bin-omega:ghostscript-x11
+Ignore: yast2-country:yast2-trans-stats
+Ignore: tpb:tpctl-kmp
+Ignore: tpctl:tpctl-kmp
+Ignore: zaptel:zaptel-kmp
+Ignore: mkinitrd:pciutils
+Ignore: pciutils:pciutils-ids
+Ignore: postfix:iproute2
+Ignore: aaa_base:systemd
+Ignore: gpm:systemd
+Ignore: openssh:systemd
+Ignore: cronie:systemd
+Ignore: systemd:kbd
+Ignore: systemd:kmod
+Ignore: systemd:systemd-presets-branding
+Ignore: systemd:dbus-1
+Ignore: systemd:pam-config
+Ignore: systemd:udev
+Ignore: pesign:systemd
+Ignore: logrotate:cron
+Ignore: texlive-filesystem:cron
+Ignore: xinit:xterm
+Ignore: xdm:xterm
+Ignore: gnome-control-center:gnome-themes-accessibility
+
+
+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
+Ignore: libgcc42:glibc-32bit
+Ignore: libgcc43:glibc-32bit
+Ignore: libgcc44:glibc-32bit
+Ignore: libgcc45:glibc-32bit
+Ignore: libgcc46:glibc-32bit
+Ignore: libgcc47:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: libstdc41++:glibc-32bit
+Ignore: libstdc42++:glibc-32bit
+Ignore: libstdc43++:glibc-32bit
+Ignore: libstdc44++:glibc-32bit
+Ignore: libstdc45++:glibc-32bit
+Ignore: libstdc46++:glibc-32bit
+Ignore: libstdc47++:glibc-32bit
+Ignore: ncurses-32bit
+
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: openct:syslog
+Ignore: postfix:sysvinit(syslog)
+Ignore: cups:sysvinit(syslog)
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: libreoffice-de:myspell-german-dictionary
+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: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: e17:e17-branding e17:e17-theme
+
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+
+Ignore: coreutils:coreutils-lang
+Ignore: cpio:cpio-lang
+Ignore: glib2:glib2-lang
+Ignore: gtk2:gtk2-lang
+Ignore: gtk:gtk-lang
+Ignore: atk:atk-lang
+Ignore: MozillaThunderbird:pinentry-dialog
+Ignore: seamonkey:pinentry-dialog
+Ignore: pinentry:pinentry-dialog
+Ignore: gpg2:gpg2-lang
+Ignore: util-linux:util-linux-lang
+Ignore: suseRegister:distribution-release
+Ignore: compiz:compiz-decorator
+Ignore: icecream:gcc-c++
+Ignore: no
+Ignore: package
+Ignore: provides
+Ignore: j9vm/libjvm.so()(64bit)
+Ignore: kdepim3:suse_help_viewer
+Ignore: kdebase3-SuSE:kdebase3-SuSE-branding
+Ignore: kio_sysinfo:kdebase3-SuSE-branding
+Ignore: gnome-menus:gnome-menus-branding
+Ignore: epiphany:epiphany-branding
+Ignore: gnome-control-center:gnome-control-center-branding
+Ignore: phonon:phonon-backend
+Ignore: openwbem-devel
+Ignore: MozillaFirefox:MozillaFirefox-branding
+Ignore: yast2:yast2-branding
+Ignore: plymouth:plymouth-branding
+Ignore: plymouth:suspend
+Ignore: yast2-qt:yast2-branding
+Ignore: yast2-theme-SLE:yast2-branding
+Ignore: yast2-registration:yast2-registration-branding
+Ignore: compiz:compiz-branding
+Ignore: texlive:perl-Tk texlive-bin:perl-Tk
+Ignore: xfce4-desktop:xfce4-desktop-branding
+Ignore: xfce4-panel:xfce4-panel-branding
+Ignore: xfce4-session:xfce4-session-branding
+Ignore: kdebase4-runtime:kdebase4-runtime-branding
+Ignore: kwin:kdebase4-workspace-branding
+Ignore: transmission-common:transmission-ui
+Ignore: sysvinit-tools:mkinitrd cifs-utils:mkinitrd
+Ignore: mkinitrd:sbin_init samba-client:cifs-utils
+Ignore: opensc:pinentry
+Ignore: gpg2:pinentry
+Ignore: NetworkManager:dhcp
+Ignore: NetworkManager:iproute2
+# sysconfig requires it at runtime, not buildtime
+Ignore: sysconfig:dbus-1
+Ignore: sysconfig:procps
+Ignore: sysconfig:iproute2
+Ignore: sysconfig-network:iproute2
+Ignore: sysconfig:tunctl
+Ignore: sysconfig:sysvinit(network)
+# no build dependencies
+Ignore: libksuseinstall1:yast2-packager
+Ignore: libksuseinstall1:zypper
+Ignore: syslog-service:logrotate
+Ignore: libglue-devel:cluster-glue
+Ignore: libqca2:gpg2
+Ignore: NetworkManager:wpa_supplicant
+Ignore: NetworkManager:dhcp-client
+Ignore: openSUSE-release:product_flavor(openSUSE)
+Ignore: libgio-2_0-0:dbus-1-x11
+Ignore: weather-wallpaper:inkscape
+Ignore: libgamin-1-0:gamin-server
+Ignore: libfam0-gamin:gamin-server
+Ignore: python3:python3-pip
+Ignore: avahi:sysvinit(network)
+Ignore: cluster-glue:sysvinit(network)
+Ignore: dracut:systemd-sysvinit
+# actually a workaround for installation-images requiring
+# gettext-runtime-mini and getting conflict because systat
+# requires gettext (which is only provided by !-mini)
+Ignore: saptune:sysstat
+
+Macros:
+# RUBY - UNVERSIONED STUFF
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in the
+# prjconf aswell.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygem() %{expand:%%{rubygems%rb_build_versions STOP %*}}
+%rubygemsSTOP() %nil
+%rubygemsxSTOP() %{expand:%%rubygemsxxSTOP -a %*}
+%rubygemsxxSTOP(a:) %{-a*}) %*
+
+%rubySTOP() %nil
+%rubyxSTOP() %*
+
+%ruby() %{expand:%%{ruby%rb_build_versions STOP %*}}
+
+%rubydevel() %{expand:%%{rubydevel%rb_build_versions STOP %*}}
+
+%rubydevelSTOP() %nil
+%rubydevelxSTOP() %*
+#
+
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+# if you change any macros here you have to update the copy in
+# ruby2.5 aswell.
+#
+# IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT IMPORTANT
+#
+%rubygemsruby25() rubygem(ruby:2.5.0:%{expand:%%rubygemsx%*} %{expand:%%{rubygems%*}}
+%rubygemsxruby25() %{expand:%%{rubygemsx%*}}
+
+%rubyruby25() ruby2.5 %{expand:%%rubyx%*} %{expand:%%{ruby%*}}
+%rubyxruby25() %{expand:%%{rubyx%*}}
+
+%rubydevelruby25() ruby2.5-devel %{expand:%%rubydevelx%*} %{expand:%%{rubydevel%*}}
+%rubydevelxruby25() %{expand:%%{rubydevelx%*}}
+
+
+### Things to define default ruby stuff for the distro
+%rb_default_ruby ruby25
+%rb_default_ruby_suffix ruby2.5
+%rb_default_ruby_abi ruby:2.5.0
+:Macros
+
+Macros:
+%rb_build_ruby_abis ruby:2.5.0
+%rb_build_versions ruby25
+
+%_with_ruby25 1
+:Macros
+
+%define rb_default_ruby ruby25
+%define rb_default_ruby_suffix ruby2.5
+%define rb_default_ruby_abi ruby:2.5.0
+
+%define rb_build_ruby_abis ruby:2.5.0
+%define rb_build_versions ruby25
+
+%define _with_ruby25 1
+
+Prefer: -ruby-stdlib
+Prefer: %{rb_default_ruby_suffix}-rubygem-gem2rpm
+Prefer: %{rb_default_ruby_suffix}-rubygem-ruby-dbus
+Prefer: %{rb_default_ruby_suffix}-rubygem-yard
+Prefer: %{rb_default_ruby_suffix}-rubygem-rspec
+Prefer: %{rb_default_ruby_suffix}-rubygem-yast-rake
+Prefer: %{rb_default_ruby_suffix}-rubygem-cheetah
+Prefer: %{rb_default_ruby_suffix}-rubygem-inifile
+Prefer: %{rb_default_ruby_suffix}-rubygem-bundler
+Prefer: %{rb_default_ruby_suffix}-rubygem-sass
+Prefer: %{rb_default_ruby_suffix}-rubygem-cfa
+Prefer: %{rb_default_ruby_suffix}-rubygem-mime-types
+
+# END RUBY STUFF
+
+# PYTHON STUFF
+
+Macros:
+%pythons %{?!skip_python2:python2} %{?!skip_python3:python3}
+
+# This method for generating python_modules gets too deep to expand at about 5 python flavors.
+# It is replaced by a Lua macro in macros.lua
+# However, OBS has a much higher expansion depth, so this works fine.
+%python_module_iter(a:) %{-a*}-%{args} %{expand:%%{?!python_module_iter_%1:%%{python_module_iter -a%*}}}
+%python_module_iter_STOP stop
+%python_module() %{expand:%%define args %{**}} %{expand:%%{python_module_iter -a %{pythons} STOP}}
+
+%add_python() %{expand:%%define pythons %pythons %1}
+:Macros
+
+# END PYTHON STUFF
+
+Prefer: java-9-openjdk java-9-openjdk-devel java-9-openjdk-javadoc java-9-openjdk-headless
+# Prefer java 8 if java 9 was no option
+Prefer: java-1_8_0-openjdk java-1_8_0-openjdk-devel java-1_8_0-openjdk-javadoc java-1_8_0-openjdk-headless
+# And then fall back to jaba 7 if needed
+Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel java-1_7_0-openjdk-javadoc java-1_7_0-openjdk-headless
+Substitute: java2-devel-packages java-devel
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc sparc sparcv9
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-xen
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-ppc64 kernel-ps3
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-default kernel-ppc64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+Optflags: i586 -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches
+# no longer needed according to Richard Biener
+# Optflags: i686 -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches -fstack-protector
+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: armv7l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv7hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6l -fmessage-length=0 -grecord-gcc-switches
+Optflags: armv6hl -fmessage-length=0 -grecord-gcc-switches
+Optflags: aarch64 -fmessage-length=0 -grecord-gcc-switches
+Optflags: ppc64le -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
+Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc
+
+%ifarch armv7l armv7hl
+Target: armv7hl-suse-linux
+%endif
+
+Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection
+
+%define suse_version 1500
+%define sle_version 150000
+
+%define is_susecaasp 1
+%define is_susesap 1
+
+Macros:
+%suse_version 1500
+%sle_version 150000
+%is_susecaasp 1
+%is_susesap 1
+
+%insserv_prereq insserv sed
+%fillup_prereq fillup coreutils grep diffutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%kernel_module_package_buildreq kmod-compat kernel-syms
+%kernel_module_package_buildreqs kmod-compat kernel-syms
+
+%sles_version 0
+%do_profiling 1
+%_vendor suse
+
+# Reproducible builds
+%source_date_epoch_from_changelog Y
+
+# define which gcc package builds the system libraries
+%product_libs_gcc_ver 7
+# The following shlibs have latest versions built from GCC 6 sources
+%product_libs_gcc_ver_libasan3 6
+%product_libs_gcc_ver_libgo9 6
+%product_libs_gcc_ver_libgfortran3 6
+# reminded by richi 2017 4/3
+%product_libs_gcc_ver_libgcj_bc1 6
+# The following shlibs have been introduced with GCC 7
+%product_libs_gcc_ver_libmpxwrappers2 7
+%product_libs_gcc_ver_libmpx2 7
+%product_libs_gcc_ver_libasan4 7
+%product_libs_gcc_ver_libgo11 7
+%product_libs_gcc_ver_libgfortran4 7
+%gcc_version 7
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+:Macros
+
diff --git a/configs/sles8.conf b/configs/sles8.conf
new file mode 100644
index 0000000..12bbe19
--- /dev/null
+++ b/configs/sles8.conf
@@ -0,0 +1,196 @@
+Repotype: suse
+
+Preinstall: aaa_base acl attr bash db devs diffutils filesystem
+Preinstall: fileutils fillup glibc grep libgcc libxcrypt m4 ncurses
+Preinstall: pam permissions readline rpm sed sh-utils shadow tar
+Preinstall: textutils
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 cracklib db gcc gdbm gettext
+Required: glibc libtool ncurses pam perl rpm zlib
+
+Support: bind9-utils bison cpio cpp cyrus-sasl e2fsprogs file
+Support: findutils flex gawk gdbm-devel glibc-devel glibc-locale
+Support: gpm groff gzip kbd less libstdc++ make man mktemp modutils
+Support: ncurses-devel net-tools netcfg pam-devel pam-modules
+Support: patch ps rcs sendmail strace syslogd sysvinit texinfo
+Support: timezone unzip util-linux vim zlib-devel
+
+Keep: binutils bzip2 cpp cracklib file findutils fpk gawk gcc
+Keep: gcc-c++ gdbm glibc-devel glibc-locale gnat gnat-runtime
+Keep: gzip libstdc++ make mktemp pam-devel pam-modules patch perl
+Keep: popt rcs shlibs5 timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ia64
+Substitute: java2-devel-packages java2 java2-jre jpackage-utils
+%else
+ %ifarch ia64 s390
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils
+ %endif
+ %ifarch s390x
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils glibc-32bit baselibs-32bit
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit baselibs-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit glibc-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-sn2 kernel-64k-pagesize
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-pmac64_32bit kernel-power3 kernel-smp kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-s390x
+%endif
+
+Macros:
+%insserv_prereq aaa_base
+%fillup_prereq fillup fileutils
+%install_info_prereq texinfo
+%suse_version 810
+%sles_version 8
+%ul_version 0
+%_vendor suse
diff --git a/configs/sles9.conf b/configs/sles9.conf
new file mode 100644
index 0000000..70ea7d6
--- /dev/null
+++ b/configs/sles9.conf
@@ -0,0 +1,203 @@
+Repotype: suse
+
+Preinstall: aaa_base acl attr bash bzip2 coreutils db devs diffutils
+Preinstall: filesystem fillup glibc grep insserv libacl libattr
+Preinstall: libgcc libselinux libxcrypt m4 ncurses pam permissions
+Preinstall: popt pwdutils readline rpm sed tar zlib
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 db gcc gdbm gettext glibc
+Required: libtool ncurses perl rpm zlib
+
+Support: bind-utils bison cpio cpp cracklib cvs cyrus-sasl e2fsprogs
+Support: file findutils flex gawk gdbm-devel glibc-devel glibc-locale
+Support: gpm groff gzip info kbd less libstdc++ make man mktemp
+Support: module-init-tools ncurses-devel net-tools netcfg
+Support: openldap2-client openssl pam-modules patch procinfo procps
+Support: psmisc rcs strace syslogd sysvinit tcpd texinfo timezone
+Support: unzip util-linux vim zlib-devel
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-c++ gdbm
+Keep: glibc-devel glibc-locale gnat gnat-runtime gzip libstdc++
+Keep: libunwind make mktemp pam-devel pam-modules patch perl rcs
+Keep: shlibs5 timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java2 java2-jre jpackage-utils
+%else
+ %ifarch ia64
+Substitute: java2-devel-packages IBMJava2-JRE BEAJava2-JRE BEAJava2-SDK jpackage-utils
+ %endif
+ %ifarch s390 ppc
+Substitute: java2-devel-packages IBMJava2-JRE IBMJava2-SDK jpackage-utils
+ %endif
+ %ifarch s390x
+Substitute: java2-devel-packages IBMJava2-JRE IBMJava2-SDK jpackage-utils XFree86-libs-32bit
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit glibc-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-sn2 kernel-64k-pagesize
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-pmac64_32bit kernel-power3 kernel-smp kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-s390x
+%endif
+
+Macros:
+%insserv_prereq insserv
+%fillup_prereq fillup fileutils
+%suseconfig_fonts_prereq perl aaa_base
+%install_info_prereq info
+%suse_version 910
+%sles_version 9
+%ul_version 0
+%jds_version 0
+%do_profiling 1
+%_vendor suse
diff --git a/configs/spectool.conf b/configs/spectool.conf
new file mode 100644
index 0000000..39bac9e
--- /dev/null
+++ b/configs/spectool.conf
@@ -0,0 +1,4 @@
+%define spectool_version 1
+
+Macros:
+%spectool_version 1
diff --git a/configs/ubuntu.conf b/configs/ubuntu.conf
new file mode 100644
index 0000000..e383e60
--- /dev/null
+++ b/configs/ubuntu.conf
@@ -0,0 +1,233 @@
+
+Repotype: debian
+
+Preinstall: bash sed grep coreutils debianutils
+Preinstall: libc6 libncurses5 libacl1 libattr1 libpcre3
+Preinstall: libreadline6 tar gawk dpkg libc-bin
+Preinstall: sysv-rc init-system-helpers
+Preinstall: gzip base-files base-passwd
+Preinstall: readline-common libselinux1 libsepol1
+Preinstall: libgcc1 util-linux debconf tzdata findutils upstart libdbus-1-3
+Preinstall: liblzma5 xz-utils libstdc++6 passwd libnih1 libnih-dbus1
+Preinstall: login zlib1g libbz2-1.0 libtinfo5 libsigsegv2
+Preinstall: dash insserv libmpfr4 libgmp10 libdebconfclient0
+Preinstall: perl-base perl libperl5.22
+
+Order: libc6:libc-bin
+Order: base-files:screen
+Order: base-files:initscripts
+Order: initscripts:util-linux
+Order: sysv-rc:hostname
+Order: sysv-rc:kmod
+
+Runscripts: gawk
+
+Runscripts: base-files base-passwd passwd sysv-rc
+
+VMinstall: binutils libblkid1 libuuid1 mount libmount1 libsmartcols1
+%ifarch ppc64le
+# for LE switch
+VMinstall: kernel-obs-build
+%endif
+
+Substitute: snapcraft-plugin:kbuild snapcraft
+Prefer: -sudo-ldap
+
+Required: autoconf automake binutils bzip2 gcc gettext libc6
+Required: libtool libncurses5 perl zlib1g dpkg
+Required: build-essential
+
+Support: fakeroot
+Support: bison cpio cvs login
+Support: file findutils flex diffutils
+Support: groff-base gzip hostname info less
+Support: make man sysv-rc
+Support: net-tools
+Support: patch procps psmisc strace
+Support: unzip vim ncurses-base
+Support: locales upstart-compat-sysv
+Support: mount
+# module-init-tools texinfo
+
+# circular dependendencies in openjdk stack
+Order: openjdk-6-jre-lib:openjdk-6-jre-headless
+Order: openjdk-6-jre-headless:ca-certificates-java
+
+Order: base-files:glibc
+Order: dpkg:gawk
+
+# Workaround for missing prerequires:
+Preinstall: initramfs-tools initscripts
+Support: initramfs-tools initscripts
+
+Keep: binutils cpp file findutils gawk gcc gcc-ada gcc-c++
+Keep: gzip libada libstdc++ libunwind
+Keep: libunwind-devel libzio make pam-devel pam-modules
+Keep: patch perl timezone
+Keep: m4 dpkg dpkg-dev perl-modules libdpkg-perl
+
+Prefer: gawk libdb-dev
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: default-jdk
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office -libjack-dev
+Prefer: -libjpeg-turbo8-dev -libblas3gf
+Prefer: -make-guile
+
+# double packages in universe
+Prefer: -pkgconf
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: upstart:ifupdown
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: initramfs-tools:udev
+Ignore: mountall:udev
+Ignore: mountall:plymouth
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+Substitute: utempter
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel
+%else
+ %ifnarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel
+ %else
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-um kernel-xen kernel-kdump
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen kernel-kdump
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-kdump kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+%define ubuntu_version 1604
+
+Macros:
+%ubuntu_version 1604
+
diff --git a/configs/ul1.conf b/configs/ul1.conf
new file mode 100644
index 0000000..a4ca28d
--- /dev/null
+++ b/configs/ul1.conf
@@ -0,0 +1,196 @@
+Repotype: suse
+
+Preinstall: aaa_base acl attr bash db devs diffutils filesystem
+Preinstall: fileutils fillup glibc grep libgcc libxcrypt m4 ncurses
+Preinstall: pam permissions readline rpm sed sh-utils shadow tar
+Preinstall: textutils
+
+Runscripts: aaa_base
+
+VMinstall: util-linux perl
+
+Required: autoconf automake binutils bzip2 cracklib db gcc gdbm gettext
+Required: glibc libtool ncurses pam perl rpm zlib
+
+Support: bind9-utils bison cpio cpp cyrus-sasl e2fsprogs file
+Support: findutils flex gawk gdbm-devel glibc-devel glibc-locale
+Support: gpm groff gzip kbd less libstdc++ make man mktemp modutils
+Support: ncurses-devel net-tools netcfg pam-devel pam-modules
+Support: patch ps rcs sendmail strace syslogd sysvinit texinfo
+Support: timezone unzip util-linux vim zlib-devel
+
+Keep: binutils bzip2 cpp cracklib file findutils fpk gawk gcc
+Keep: gcc-c++ gdbm glibc-devel glibc-locale gnat gnat-runtime
+Keep: gzip libstdc++ make mktemp pam-devel pam-modules patch perl
+Keep: popt rcs shlibs5 timezone
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: aaa_base:aaa_skel,suse-release,logrotate,ash,mingetty,distribution-release
+Ignore: gettext-devel:libgcj,libstdc++-devel
+Ignore: pwdutils:openslp
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifnarch s390 s390x ia64
+Substitute: java2-devel-packages java2 java2-jre jpackage-utils
+%else
+ %ifarch ia64 s390
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils
+ %endif
+ %ifarch s390x
+Substitute: java2-devel-packages IBMJava2-SDK jpackage-utils glibc-32bit baselibs-32bit
+ %endif
+%endif
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit baselibs-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit glibc-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-um
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-sn2 kernel-64k-pagesize
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-pmac64_32bit kernel-power3 kernel-smp kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-iseries64 kernel-pseries64 kernel-pmac64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-s390x
+%endif
+
+Macros:
+%insserv_prereq aaa_base
+%fillup_prereq fillup fileutils
+%install_info_prereq texinfo
+%suse_version 810
+%sles_version 0
+%ul_version 1
+%_vendor suse
diff --git a/createarchdeps b/createarchdeps
new file mode 100755
index 0000000..aab8346
--- /dev/null
+++ b/createarchdeps
@@ -0,0 +1,58 @@
+#!/usr/bin/perl -w
+
+# Archlinux support, based on the GSoC work of Nikolay Rysev <mad.f3ka@gmail.com>
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{"BUILD_DIR"} || "/usr/lib/build");
+}
+
+use strict;
+use Build ':arch';
+use Build::Archrepo;
+use Digest::MD5 ();
+use File::Path;
+use Getopt::Long;
+
+Getopt::Long::Configure("no_ignore_case");
+
+my $cachedir = "/var/cache/build";
+
+sub getreponame {
+ my ($url) = @_;
+ return $1 if "/$url/" =~ /.*\/([^\/]+)\/os\//;
+ return undef;
+}
+
+GetOptions("cachedir=s" => \$cachedir) or exit(1);
+
+for my $url (@ARGV) {
+ die("$url: not an remote Archlinux repo") unless $url =~ /^(:?ftps?|https?):\/\/([^\/]*)\/?/;
+ my $reponame = getreponame($url);
+ die("could not determine reponame from url $url\n") unless defined $reponame;
+ my $repoid = Digest::MD5::md5_hex($url);
+ my $dir = "$cachedir/$repoid";
+ $url .= '/' unless $url =~ /\/$/;
+ File::Path::mkpath($dir);
+ system("$INC[0]/download", $dir, "$url$reponame.db");
+ Build::Archrepo::parse("$dir/$reponame.db", sub { Build::writedeps(\*STDOUT, $_[0], $url) }, 'addselfprovides' => 1);
+}
diff --git a/createdebdeps b/createdebdeps
new file mode 100755
index 0000000..313ad35
--- /dev/null
+++ b/createdebdeps
@@ -0,0 +1,99 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2016 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{"BUILD_DIR"} || "/usr/lib/build");
+}
+
+use strict;
+use Digest::MD5;
+use File::Path;
+use Getopt::Long;
+use Build ':deb';
+use Build::Deb;
+use Build::Debrepo;
+
+Getopt::Long::Configure("no_ignore_case");
+
+#
+# supported urls
+#
+# distribution: <baseurl>/<dist>/[components]
+# flat repo: <baseurl>/.
+
+my $cachedir = "/var/cache/build";
+my $archpath;
+
+GetOptions('cachedir=s' => \$cachedir, 'archpath=s' => \$archpath) or exit(1);
+
+if (!$archpath) {
+ $archpath = `uname -p` || 'unknown';
+ chomp $archpath;
+}
+my $basearch = $archpath;
+$basearch =~ s/:.*//;
+$basearch = Build::Deb::basearch($basearch);
+my $pkgnum = 0;
+
+for my $url (@ARGV) {
+ die("$url: not an remote debian repo\n") unless $url =~ /^(:?ftps?|https?):\/\/([^\/]*)\/?/;
+ my $repoid = Digest::MD5::md5_hex($url);
+ my $dir = "$cachedir/$repoid";
+
+ my @components;
+ my $baseurl = $url;
+
+ if ($url =~ /^(.*\/)\.(\/.*)?$/) {
+ # flat repo
+ $baseurl = $1;
+ @components = ('.');
+ $url = defined($2) ? "$1$2" : $1;
+ $url .= '/' unless $url =~ /\/$/;
+ } else {
+ if ($url =~ /([^\/]+)$/) {
+ @components = split(/[,+]/, $1);
+ $url =~ s/([^\/]+)$//;
+ }
+ push @components, 'main' unless @components;
+ $url .= '/' unless $url =~ /\/$/;
+ $baseurl = $url;
+ $url =~ s/([^\/]+\/)$/dists\/$1/;
+ $baseurl =~ s/([^\/]+\/)$//;
+ }
+
+ File::Path::mkpath($dir);
+ for my $component (@components) {
+ unlink("$dir/Packages.gz");
+ if ($component eq '.') {
+ system($INC[0]."/download", $dir, "${url}Packages.gz");
+ die("Packages.gz missing\n") unless -s "$dir/Packages.gz";
+ } else {
+ system($INC[0]."/download", $dir, "$url$component/binary-$basearch/Packages.gz");
+ die("Packages.gz missing for basearch $basearch, component $component\n") unless -s "$dir/Packages.gz";
+ }
+ Build::Debrepo::parse("$dir/Packages.gz", sub {
+ $pkgnum++;
+ $_[0]->{'id'} = "$pkgnum/0/0";
+ Build::writedeps(\*STDOUT, $_[0], $baseurl);
+ }, 'addselfprovides' => 1);
+ }
+}
diff --git a/createdirdeps b/createdirdeps
new file mode 100755
index 0000000..aa602ab
--- /dev/null
+++ b/createdirdeps
@@ -0,0 +1,99 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use Build;
+use Getopt::Long;
+
+use strict;
+
+Getopt::Long::Configure("no_ignore_case");
+
+my $oldfile;
+
+GetOptions ("oldfile=s" => \$oldfile) or exit(1);
+
+sub queryfromfilename {
+ my ($fn) = @_;
+ $fn =~ s/.*\///;
+ return {'name' => $1, 'arch' => $2} if $fn =~ /^(.*)-[^-]+-[^-]+\.([^\. ]+)\.rpm$/;
+ return {'name' => $1, 'arch' => $2} if $fn =~ /^([^_]*)_(?:[^_]*)_([^_]*)\.deb$/;
+ return {'name' => $1, 'arch' => $2} if $fn =~ /^(.*)-[^-]+-[^-]+-([^-]+)\.pkg\.tar\.[gx]z$/;
+ return undef;
+}
+
+
+######################################################################
+
+my %old;
+if (defined($oldfile) && open(F, '<', $oldfile)) {
+ while (<F>) {
+ chomp;
+ $old{$1} = $_ if /^([PRrCOI]:[^ ]+): /;
+ }
+ close F;
+}
+
+my %seen;
+
+for my $dir (@ARGV) {
+ my $cmd = "find $dir -follow -type f \\( -name \"*.rpm\" -o -name \"*.deb\" -o -name \"*.pkg.tar.gz\" -o -name \"*.pkg.tar.xz\" \\) -a ! -name \"*src.rpm\" -printf '\%T@/\%s/\%i \%p\\n'";
+ open(F, '-|', $cmd) or next;
+ while (<F>) {
+ chomp;
+ next unless /^([\d\.]+\/\d+\/\d+) (.*)$/;
+ my $id = $1;
+ my $path = $2;
+ # newer find version add a fraction part to %T@, strip it
+ $id =~ s/^(\d+)\.\d+/$1/;
+ next if $path =~ /\.(?:patch|delta)\.rpm$/; # not good for building...
+ if (%old) {
+ my $q = queryfromfilename($path);
+ if ($q && defined($q->{'name'}) && defined($q->{'arch'})) {
+ my $idx = "$q->{'name'}.$q->{'arch'}-$id";
+ if ($old{"I:$idx"} && $old{"P:$idx"}) {
+ # reuse old data
+ next if $seen{$idx};
+ $seen{$idx} = 1;
+ print "F:$idx: $path\n";
+ for (qw{P R C O I r s}) {
+ print $old{"$_:$idx"}."\n" if $old{"$_:$idx"};
+ }
+ next;
+ }
+ }
+ }
+ my $q = Build::query($path, 'addselfprovides' => 1, 'conflicts' => 1, 'evra' => 1, 'buildtime' => 1, 'weakdeps' => 1);
+ next unless $q && defined($q->{'name'}) && defined($q->{'arch'}) && defined($q->{'version'});
+ my $idx = "$q->{'name'}.$q->{'arch'}-$id";
+ next if $seen{$idx};
+ $seen{$idx} = 1;
+ $q->{'id'} = $id;
+ $q->{'location'} = $path;
+ Build::writedeps(\*STDOUT, $q);
+ }
+ close F;
+}
+
diff --git a/createmdkdeps b/createmdkdeps
new file mode 100755
index 0000000..f1b8c96
--- /dev/null
+++ b/createmdkdeps
@@ -0,0 +1,50 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 2015 SUSE Linux GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+# Mandriva/Mageia support
+
+BEGIN {
+ unshift @INC, ($::ENV{"BUILD_DIR"} || "/usr/lib/build");
+}
+
+use strict;
+use Build ':mdk';
+use Build::Mdkrepo;
+use Digest::MD5 ();
+use File::Path;
+use Getopt::Long;
+
+Getopt::Long::Configure("no_ignore_case");
+
+my $cachedir = "/var/cache/build";
+
+GetOptions("cachedir=s" => \$cachedir) or exit(1);
+
+for my $url (@ARGV) {
+ die("$url: not an remote mandriva/mageia repo") unless $url =~ /^(:?ftps?|https?):\/\/([^\/]*)\/?/;
+ my $repoid = Digest::MD5::md5_hex($url);
+ my $dir = "$cachedir/$repoid";
+ $url .= '/' unless $url =~ /\/$/;
+ File::Path::mkpath($dir);
+ system("$INC[0]/download", $dir, "${url}media_info/synthesis.hdlist.cz");
+ Build::Mdkrepo::parse("$dir/synthesis.hdlist.cz", sub { Build::writedeps(\*STDOUT, $_[0], $url) }, 'addselfprovides' => 1);
+}
diff --git a/createrepomddeps b/createrepomddeps
new file mode 100755
index 0000000..dc7445f
--- /dev/null
+++ b/createrepomddeps
@@ -0,0 +1,154 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use strict;
+use Data::Dumper;
+use Getopt::Long;
+use Build ':rpm';
+use Build::Rpm;
+use Build::Rpmmd;
+use Digest::MD5 ();
+use File::Path qw(mkpath rmtree);
+use File::Basename;
+
+Getopt::Long::Configure("no_ignore_case");
+
+my $opt_dump;
+my $opt_old;
+my $opt_nosrc;
+my $opt_bc;
+my $opt_zypp;
+my $cachedir = "/var/cache/build";
+
+sub printold {
+ my ($pkg, $baseurl, $old_seen) = @_;
+
+ my $arch = $pkg->{'arch'};
+ $arch = 'src' if $pkg->{'arch'} eq 'nosrc';
+ return if $arch eq 'src' && $opt_nosrc;
+ my $evr = $pkg->{'version'}.'-'.$pkg->{'release'};
+ $evr = "$pkg->{'epoch'}:$evr" if $pkg->{'epoch'};
+ my $loc = $baseurl . $pkg->{'location'};
+ if ($old_seen->{$pkg->{'name'}}->{$arch}) {
+ my $vv = Build::Rpm::verscmp($old_seen->{$pkg->{'name'}}->{$arch}->{'evr'}, $evr, 0);
+ if ($vv >= 0) {
+ print "$loc\n";
+ return;
+ }
+ print $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'}."\n";
+ }
+ $old_seen->{$pkg->{'name'}}->{$arch}->{'evr'} = $evr;
+ $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'} = $loc;
+}
+
+GetOptions (
+ "nosrc" => \$opt_nosrc,
+ "dump" => \$opt_dump,
+ "old" => \$opt_old,
+ "zypp=s" => \$opt_zypp,
+ "cachedir=s" => \$cachedir,
+ ) or exit(1);
+
+$opt_bc = 1 unless $opt_dump || $opt_old;
+
+my $old_seen = {}; # for opt_old
+my @packages; # for opt_dump
+
+for my $url (@ARGV) {
+ my $dir;
+ my $baseurl = $url;
+ if ($opt_zypp) {
+ $dir = $opt_zypp;
+ } elsif ($url =~ /^(?:ftps?|https?):\/\/([^\/]*)\/?/) {
+ my $repoid = Digest::MD5::md5_hex($url);
+ $dir = "$cachedir/$repoid/";
+ $baseurl .= '/' unless $baseurl =~ /\/$/;
+ mkpath("${dir}repodata");
+ system($INC[0].'/download', "${dir}repodata", "${baseurl}repodata/repomd.xml");
+ } else {
+ $dir = $url;
+ }
+ $dir .= '/' unless $dir =~ /\/$/;
+ $baseurl .= '/' unless $baseurl =~ /\/$/;
+
+ if (! -s "${dir}repodata/repomd.xml") {
+ die("zypp repo $url is not up to date, please refresh first\n") if $opt_zypp;
+ die("repo $url does not contain a repomd.xml file\n");
+ }
+
+ my @primaryfiles;
+ Build::Rpmmd::parse_repomd("${dir}repodata/repomd.xml", \@primaryfiles);
+ @primaryfiles = grep {$_->{'type'} eq 'primary' && defined($_->{'location'})} @primaryfiles;
+# print Dumper(\@primaryfiles);
+
+ for my $f (@primaryfiles) {
+ my $u = "$dir$f->{'location'}";
+ if ($] > 5.007) {
+ require Encode;
+ utf8::downgrade($u);
+ }
+ my $cached;
+ if (-e $u) {
+ $cached = 1;
+ $cached = 0 if exists($f->{'size'}) && $f->{'size'} != (-s _);
+ $cached = 0 if !$opt_zypp && !exists($f->{'size'}) && $u !~ /[0-9a-f]{32}-primary/;
+ }
+ 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;
+ open($fh, '<', $u) or die "Error opening $u: $!\n";
+ if ($u =~ /\.gz$/) {
+ use IO::Uncompress::Gunzip qw($GunzipError);
+ $fh = new IO::Uncompress::Gunzip $fh or die "Error opening $u: $GunzipError\n";
+ }
+ Build::Rpmmd::parse($fh, sub {
+ if ($opt_dump) {
+ $_[0]->{'baseurl'} = $baseurl;
+ push @packages, $_[0] if $opt_dump;
+ }
+ if ($opt_bc) {
+ binmode STDOUT, ":utf8";
+ Build::writedeps(\*STDOUT, $_[0], $baseurl);
+ } elsif ($opt_old) {
+ printold($_[0], $baseurl, $old_seen);
+ }
+ }, 'addselfprovides' => 1);
+ close($fh);
+ }
+}
+
+if ($opt_dump) {
+ print Data::Dumper->Dump([\@packages], ['packages']); # caution: excessive memory consumption!
+}
+
diff --git a/createyastdeps b/createyastdeps
new file mode 100755
index 0000000..b5fb603
--- /dev/null
+++ b/createyastdeps
@@ -0,0 +1,73 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use Build ':rpm';
+use Build::Susetags;
+use Getopt::Long;
+use File::Path qw(mkpath);
+
+use strict;
+
+Getopt::Long::Configure("no_ignore_case");
+
+my $opt_zypp;
+my $cachedir = "/var/cache/build";
+
+GetOptions ("zypp=s" => \$opt_zypp, "cachedir=s" => \$cachedir) or exit(1);
+
+for my $url (@ARGV) {
+ # XXX: use descrdir/datadir from content file
+ my $descrdir = 'suse/setup/descr';
+ my $datadir = 'suse';
+
+ my $dir;
+ my $baseurl = $url;
+ if ($opt_zypp) {
+ $dir = $opt_zypp;
+ } elsif ($url =~ /^(?:ftps?|https?):\/\/([^\/]*)\/?/) {
+ my $repoid = Digest::MD5::md5_hex($url);
+ $dir = "$cachedir/$repoid/";
+ $baseurl .= '/' unless $baseurl =~ /\/$/;
+ mkpath($dir);
+ system("$INC[0]/download", "$dir/", "${baseurl}$descrdir/packages.gz");
+ $descrdir = '.';
+ } else {
+ $dir = $url;
+ }
+ $dir .= '/' unless $dir =~ /\/$/;
+ $baseurl .= '/' unless $baseurl =~ /\/$/;
+
+ my $packages = "$dir$descrdir/packages";
+ $packages = "$packages.gz" if ! -e $packages && -e "$packages.gz";
+ Build::Susetags::parse($packages, sub {
+ my $xurl = $baseurl;
+ # multi cd support hack
+ $xurl =~ s/1\/$/$_[0]->{'medium'}/ if $_[0]->{'medium'};
+ $xurl .= "$datadir/" if $datadir;
+ Build::writedeps(\*STDOUT, $_[0], $xurl);
+ }, 'addselfprovides' => 1);
+}
+
diff --git a/createzyppdeps b/createzyppdeps
new file mode 100755
index 0000000..8d85e49
--- /dev/null
+++ b/createzyppdeps
@@ -0,0 +1,64 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use strict;
+
+use Build::Zypp;
+use Getopt::Long;
+
+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;
+ for my $r (Build::Zypp::parseallrepos()) {
+ print "$r->{'name'}\n" if $r->{'enabled'};
+ }
+ 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);
+
+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/debtransform b/debtransform
new file mode 100755
index 0000000..d678471
--- /dev/null
+++ b/debtransform
@@ -0,0 +1,493 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+use strict;
+use Digest::MD5;
+use Digest::SHA;
+
+sub usage
+{
+ die("usage: debtransform [--debug] [--changelog <changelog>] [--release <release number>] <srcdir> <dscfile> <outdir>\n");
+}
+
+sub parsedsc {
+ my ($fn) = @_;
+ my @control;
+ local *F;
+ open(F, '<', $fn) || die("Error in reading $fn: $!\n");
+ @control = <F>;
+ close F;
+ chomp @control;
+ splice(@control, 0, 3) if @control > 3 && $control[0] =~ /^-----BEGIN/;
+ my @seq = ();
+ my %tag;
+ while (@control) {
+ my $c = shift @control;
+ last if $c eq ''; # new paragraph
+ my ($tag, $data) = split(':', $c, 2);
+ next unless defined $data;
+ push @seq, $tag;
+ $tag = uc($tag);
+ while (@control && $control[0] =~ /^\s/) {
+ $data .= "\n".substr(shift @control, 1);
+ }
+ $data =~ s/^\s+//s;
+ $data =~ s/\s+$//s;
+ $tag{$tag} = $data;
+ }
+ $tag{'__seq'} = \@seq;
+ return \%tag;
+}
+
+sub writedsc {
+ my ($fn, $tags) = @_;
+ print "Writing $fn\n";
+ open(F, '>', $fn) || die("open $fn: $!\n");
+ my @seq = @{$tags->{'__seq'} || []};
+ my %seq = map {uc($_) => 1} @seq;
+ for (sort keys %$tags) {
+ if (! $seq{$_}) {
+ # ucfirst will change checksums-sha1 to Checksums-sha1 but the canonical
+ # form is Checksums-Sha1, hence the need for the second transformation
+ my $camel_tag = ucfirst(lc($_));
+ $camel_tag =~ s/-\K(\w)/\U$1/g;
+ push @seq, $camel_tag;
+ }
+ }
+ for my $seq (@seq) {
+ my $ucseq = uc($seq);
+ my $d = $tags->{$ucseq};
+ next unless defined $d;
+ $d =~ s/\n/\n /sg;
+ print F "$seq: $d\n";
+ }
+ print F "\n";
+ close F;
+}
+
+sub listtar {
+ my ($tar, $skipdebiandir) = @_;
+ print "Scanning $tar...\n";
+ local *F;
+ my @c;
+ unless(defined($skipdebiandir)) {
+ $skipdebiandir = 1;
+ }
+ open(F, '-|', 'tar', '--numeric-owner', '-tvf', $tar) ||
+ die("Execution of tar subprocess failed: $!\n");
+ while(<F>) {
+ next unless /^([-dlbcp])(.........)\s+\d+\/\d+\s+(\S+) \d\d\d\d-\d\d-\d\d \d\d:\d\d(?::\d\d)? (.*)$/;
+ my ($type, $mode, $size, $name) = ($1, $2, $3, $4);
+ next if $type eq 'd';
+ if ($type eq 'l') {
+ next if $skipdebiandir eq 0;
+ die("Archive contains a link: $name\n");
+ }
+ if ($type ne '-') {
+ next if $skipdebiandir eq 0;
+ die("Archive contains an unexpected type for file \"$name\"\n");
+ }
+ $name =~ s/^\.\///;
+ $name =~ s/^debian\/// if $skipdebiandir eq 1;
+ push @c, {'name' => $name, 'size' => $size};
+ }
+ close(F) || die("tar exited with non-zero status: $!\n");
+ return @c;
+}
+
+sub extracttar {
+ my ($tar, $filename, $s) = @_;
+ local *F;
+ print "Extracting $tar...\n";
+ open(F, '-|', 'tar', '-xOf', $tar, $filename) ||
+ die("Execution of tar subprocess failed: $!\n");
+ my $file = '';
+ while ($s > 0) {
+ my $l = sysread(F, $file, $s, length($file));
+ die("Error while reading from tar subprocess: $!\n") unless $l;
+ $s -= $l;
+ }
+ my @file = split("\n", $file);
+ close(F) || warn("tar exited with non-zero status: $!\n");
+ return @file;
+}
+
+sub dodiff {
+ my ($oldname, $newname, $origtarfile, @content) = @_;
+ my @oldcontent;
+ for my $c (@{$origtarfile->{'content'}}) {
+ if ($c->{'name'} eq $newname) {
+ @oldcontent = extracttar($origtarfile->{'name'}, $c->{'name'}, $c->{'size'});
+ }
+ }
+ if ($newname eq $origtarfile->{'tardir'}."/debian/changelog") {
+ my $firstline = $content[0];
+ my $version = $firstline;
+ $version =~ s/.*\((.*)\).*/$1/g;
+ if ($version ne $origtarfile->{'version'}) {
+ $firstline =~ s/\(.*\)/($origtarfile->{'version'})/g;
+ my $date = `date -R`;
+ chomp($date);
+ my @newcontent = ($firstline, "", " * version number update by debtransform", "", " -- debtransform <build\@opensuse.org> ".$date, "");
+ push(@newcontent, @content);
+ @content = @newcontent;
+ }
+ }
+ return unless @content;
+ print DIFF "--- $oldname\n";
+ print DIFF "+++ $newname\n";
+ if (@oldcontent) {
+ print DIFF "\@\@ -1,".scalar(@oldcontent)." +1,".scalar(@content)." \@\@\n";
+ print DIFF "-$_\n" for @oldcontent;
+ } else {
+ print DIFF "\@\@ -0,0 +1,".scalar(@content)." \@\@\n";
+ }
+ print DIFF "+$_\n" for @content;
+}
+
+sub dotar {
+ my ($tar, $tardir, $origin, $origtarfile, @c) = @_;
+ local *F;
+ open(F, '-|', 'tar', '-xOf', $tar) || die("tar: $!\n");
+ for my $c (@c) {
+ my $s = $c->{'size'};
+ my $file = '';
+ while ($s > 0) {
+ my $l = sysread(F, $file, $s, length($file));
+ die("tar read error\n") unless $l;
+ $s -= $l;
+ }
+ next if $origin && $origin->{$c->{'name'}} ne $tar;
+ my @file = split("\n", $file);
+ dodiff("$tardir.orig/debian/$c->{'name'}", "$tardir/debian/$c->{'name'}", $origtarfile, @file);
+ }
+ close(F);
+}
+
+sub dofile {
+ my ($file, $tardir, $dfile, $origtarfile) = @_;
+ local *F;
+ print "Processing file \"$file\"...\n";
+ open(F, '<', $file) || die("Error in reading $file: $!\n");
+ my @file = <F>;
+ close F;
+ chomp(@file);
+ dodiff("$tardir.orig/$dfile", "$tardir/$dfile", $origtarfile, @file);
+}
+
+sub doseries {
+ my ($series, $tardir) = @_;
+ my $dir = $series;
+ $dir =~ s/[^\/]+$//;
+ $dir =~ s/\/+$//;
+ $dir = '.' if $dir eq '';
+ local *F;
+ open(F, '<', $series) || die("$series: $!\n");
+ my @series = <F>;
+ close F;
+ chomp(@series);
+ print "Processing series file \"$series\"...\n";
+ for my $patch (@series) {
+ $patch =~ s/(^|\s+)#.*//;
+ next if $patch =~ /^\s*$/;
+ my $level = 1;
+ $level = $1 if $patch =~ /\s.*-p\s*(\d+)/;
+ $patch =~ s/\s.*//;
+ print "Processing patch $dir/$patch...\n";
+ open(F, '<', "$dir/$patch") || die("Error in reading $dir/$patch: $!\n");
+ while(<F>) {
+ chomp;
+ if ((/^--- ./ || /^\+\+\+ ./) && !/^... \/dev\/null/) {
+ my $start = substr($_, 0, 4);
+ $_ = substr($_, 4);
+ my $l = $level;
+ while ($l > 0) {
+ last unless s/.*?\///;
+ $l--;
+ }
+ if ($start eq '--- ') {
+ print DIFF "$start$tardir.orig/$_\n";
+ } else {
+ print DIFF "$start$tardir/$_\n";
+ }
+ next;
+ }
+ print DIFF "$_\n";
+ }
+ close F;
+ }
+}
+
+sub addfile {
+ my ($file, $algorithm) = @_;
+ my $base = $file;
+ $base =~ s/.*\///;
+ local *F;
+ open(F, '<', $file) || die("Error in reading $file: $!\n");
+ my $size = -s F;
+ my $ctx;
+ if ($algorithm =~ /^MD5/) {
+ $ctx = Digest::MD5->new;
+ } elsif ($algorithm =~ /^SHA/) {
+ $ctx = Digest::SHA->new($algorithm);
+ } else {
+ die("Unknown digest $algorithm\n");
+ }
+ $ctx->addfile(*F);
+ close F;
+ my $md5 = $ctx->hexdigest();
+ return "$md5 $size $base";
+}
+
+print "** Started: debtransform @ARGV\n";
+
+my $debug = 0;
+my $changelog;
+my $release;
+
+while (@ARGV > 3) {
+ if ($ARGV[0] eq '--debug') {
+ shift @ARGV;
+ $debug = 1;
+ } elsif ($ARGV[0] eq '--changelog') {
+ shift @ARGV;
+ $changelog = shift @ARGV;
+ } elsif ($ARGV[0] eq '--release') {
+ shift @ARGV;
+ $release = shift @ARGV;
+ } else {
+ usage();
+ }
+}
+
+if( @ARGV != 3 ) {
+ usage();
+}
+
+my $dir = $ARGV[0];
+my $dsc = $ARGV[1];
+my $out = $ARGV[2];
+
+die("$out is not a directory\n") unless -d $out;
+
+my $tags = parsedsc($dsc);
+
+opendir(D, $dir) || die("Could not open $dir: $!\n");
+my @dir = grep {$_ ne '.' && $_ ne '..'} readdir(D);
+closedir(D);
+my %dir = map {$_ => 1} @dir;
+
+my $tarfile = $tags->{'DEBTRANSFORM-TAR'};
+my @debtarfiles;
+if ($tags->{'DEBTRANSFORM-FILES-TAR'}) {
+ @debtarfiles = split(' ', $tags->{'DEBTRANSFORM-FILES-TAR'});
+}
+
+if (!$tarfile || !@debtarfiles) {
+ my @tars = grep {/\.tgz$|\.tar(?:\.gz|\.bz2|\.xz)?$/} @dir;
+ my @debtars = grep {/^debian\.tar(?:\.gz|\.bz2|\.xz)?$/} @tars;
+ if (!$tarfile) {
+ print "No DEBTRANSFORM-TAR line in the .dsc file.\n";
+ print "Attempting automatic discovery of a suitable source archive.\n";
+ @tars = grep {!/^debian\.tar(?:\.gz|\.bz2|\.xz)?$/} @tars;
+ if (@debtarfiles) {
+ my %debtarfiles = map {$_ => 1} @debtarfiles;
+ @tars = grep {!$debtarfiles{$_}} @tars;
+ }
+ die("None of the files looks like a usable source tarball.\n") unless @tars;
+ die("Too many files looking like a usable source tarball (would not know which to pick): @tars\n") if @tars > 1;
+ $tarfile = $tars[0];
+ print "Source archive chosen for transformation: $tarfile\n";
+ }
+ if (!exists($tags->{'DEBTRANSFORM-FILES-TAR'})) {
+ print "No DEBTRANSFORM-FILES-TAR line in the .dsc file.\n";
+ print "Attempting automatic discovery of a debian archive.\n";
+ }
+ if (@debtars && !exists($tags->{'DEBTRANSFORM-FILES-TAR'})) {
+ die("package contains more than one debian archive\n") if @debtars > 1;
+ @debtarfiles = ($debtars[0]);
+ print "Debian archive chosen for transformation: $debtars[0]\n";
+ }
+}
+
+my $name = $tags->{'SOURCE'};
+die("dsc file contains no Source: line\n") unless defined($name);
+my $version = $tags->{'VERSION'};
+die("dsc file contains no Version: line\n") unless defined($version);
+# no epoch in version, please
+if ($version =~ s/^\d+://) {
+ print "Stripped epoch from Version field, which is now \"$version\".\n";
+}
+
+
+# debtransform will always generate a 1.0 format type,
+# so it has to transform all source archives into weak gzip files.
+my $tmptar;
+if ($tarfile =~ /\.tar\.bz2/) {
+ my $old = $tarfile;
+ $tarfile =~ s/\.tar\.bz2/\.tar\.gz/;
+ $tmptar = "$out/$tarfile";
+ print "converting $dir/$old to $tarfile\n";
+ system( ( "debtransformbz2", "$dir/$old", "$tmptar" )) == 0 || die("cannot transform .tar.bz2 to .tar.gz");
+}
+if ($tarfile =~ /\.tar\.xz/) {
+ my $old = $tarfile;
+ $tarfile =~ s/\.tar\.xz/\.tar\.gz/;
+ $tmptar = "$out/$tarfile";
+ print "converting $dir/$old to $tarfile\n";
+ system( ( "debtransformxz", "$dir/$old", "$tmptar" )) == 0 || die("cannot transform .tar.xz to .tar.gz");
+}
+if ($tarfile =~ /\.zip/) {
+ my $old = $tarfile;
+ $tarfile =~ s/\.zip/\.tar\.gz/;
+ $tmptar = "$out/$tarfile";
+ print "converting $dir/$old to $tarfile\n";
+ system( ( "debtransformzip", "$dir/$old", "$tmptar" )) == 0 || die("cannot transform .zip to .tar.gz");
+}
+if ($tarfile =~ /\.tgz$/) {
+ my $old = $tarfile;
+ $tarfile =~ s/\.tgz/\.tar.gz/;
+ $tmptar = "$out/$tarfile";
+ print "renaming $dir/$old to $tarfile\n";
+ system ( ("mv", "$dir/$old", "$tmptar" ) ) == 0 || die("cannot rename .tgz to .tar.gz");
+}
+
+if ( $tags->{'DEBTRANSFORM-RELEASE'} && $release ) {
+ # if dsc file contains the tag DEBTRANSFORM-RELEASE
+ # and "release" is given as a commad line parameter,
+ # replace "version" from dsc file by "version-release".
+ # From "version" the current release is stripped before
+ # (last "-" and the part after the last "-").
+ # On OBS, release is incremented automatically
+ # (same as for RPMs)
+ $version = $version . "+" . $release;
+ $tags->{'VERSION'} = $version;
+ print "Modifying dsc Version field to \"$tags->{VERSION}\"\n";
+}
+
+my @files;
+my @checksums_sha1;
+my @checksums_sha256;
+my $v = $version;
+$v =~ s/-[^-]*$//;
+$tarfile =~ /.*(\.tar.*?)$/;
+my $ntarfile = "${name}_$v.orig$1";
+if( $tmptar ) {
+ print "Moving $dir/$tarfile to $out/$ntarfile\n";
+ link("$tmptar", "$out/$ntarfile") || die("link: $!\n");
+ unlink("$tmptar");
+} else {
+ print "Hardlinking $dir/$tarfile to $out/$ntarfile\n";
+ link("$dir/$tarfile", "$out/$ntarfile") || die("link: $!\n");
+}
+push @files, addfile("$out/$ntarfile", "MD5");
+push @checksums_sha1, addfile("$out/$ntarfile", "SHA1");
+push @checksums_sha256, addfile("$out/$ntarfile", "SHA256");
+print "files @files\n";
+
+my $tarpath = "$out/$ntarfile";
+my $tardir = $tarfile;
+$tardir =~ s/\.orig\.tar/\.tar/;
+$tardir =~ s/\.tar.*?$//;
+my @tarfilecontent = listtar($tarpath, 0);
+my $origtarfile = {'name' => $tarpath, 'content' => \@tarfilecontent, 'version' => $tags->{'VERSION'}, 'tardir' => $tardir};
+
+print "Generating $out/${name}_$version.diff\n";
+# Since we are generating a unitary diff, we must re-set Format:.
+$tags->{"FORMAT"} = "1.0";
+open(DIFF, '>', "$out/${name}_$version.diff") || die("Cannot open $out/${name}_$version.diff for write: $!\n");
+
+undef $changelog if $dir{'debian.changelog'};
+
+my %debtarorigin;
+my %debtarcontent;
+for my $debtarfile (@debtarfiles) {
+ my @c = listtar("$dir/$debtarfile");
+ $debtarcontent{$debtarfile} = \@c;
+ for (@c) {
+ die("\"$_->{'name'}\" exists in both the debian archive as well as the package source directory.\n") if $dir{"debian.$_->{'name'}"};
+ undef $changelog if $_->{'name'} eq 'changelog';
+ $debtarorigin{$_->{'name'}} = "$dir/$debtarfile";
+ }
+}
+
+dofile($changelog, $tardir, 'debian/changelog', $origtarfile) if defined $changelog;
+
+if ($tags->{'DEBTRANSFORM-FILES'}) {
+ for my $file (split(' ', $tags->{'DEBTRANSFORM-FILES'})) {
+ dofile("$dir/$file", $tardir, $file, $origtarfile);
+ }
+}
+
+for my $debtarfile (@debtarfiles) {
+ dotar("$dir/$debtarfile", $tardir, \%debtarorigin, $origtarfile, @{$debtarcontent{$debtarfile} });
+}
+
+for my $file (grep {/^debian\./} @dir) {
+ next if $file eq 'debian.series';
+ next if $file =~ /\.tar$/;
+ next if $file =~ /\.tar\./;
+ dofile("$dir/$file", $tardir, 'debian/'.substr($file, 7), $origtarfile);
+}
+
+if ($tags->{'DEBTRANSFORM-SERIES'}) {
+ doseries("$dir/$tags->{'DEBTRANSFORM-SERIES'}", $tardir);
+} elsif ($dir{"debian.series"}) {
+ doseries("$dir/debian.series", $tardir);
+} elsif ($dir{"patches.series"}) {
+ doseries("$dir/patches.series", $tardir);
+}
+
+close(DIFF);
+
+if (! -s "$out/${name}_$version.diff") {
+ unlink("$out/${name}_$version.diff");
+} else {
+ system('gzip', '-9', "$out/${name}_$version.diff");
+ if (-f "$out/${name}_$version.diff.gz") {
+ push @files, addfile("$out/${name}_$version.diff.gz", "MD5");
+ push @checksums_sha1, addfile("$out/${name}_$version.diff.gz", "SHA1");
+ push @checksums_sha256, addfile("$out/${name}_$version.diff.gz", "SHA256");
+ } else {
+ push @files, addfile("$out/${name}_$version.diff", "MD5");
+ push @checksums_sha1, addfile("$out/${name}_$version.diff", "SHA1");
+ push @checksums_sha256, addfile("$out/${name}_$version.diff", "SHA256");
+ }
+}
+
+$tags->{'CHECKSUMS-SHA1'} = "\n".join("\n", @checksums_sha1);
+$tags->{'CHECKSUMS-SHA256'} = "\n".join("\n", @checksums_sha256);
+$tags->{'FILES'} = "\n".join("\n", @files);
+delete $tags->{'DEBTRANSFORM-SERIES'};
+delete $tags->{'DEBTRANSFORM-TAR'};
+delete $tags->{'DEBTRANSFORM-FILES-TAR'};
+delete $tags->{'DEBTRANSFORM-FILES'};
+delete $tags->{'DEBTRANSFORM-RELEASE'};
+writedsc("$out/${name}_$version.dsc", $tags);
+
+if( $debug ) {
+ print `ls -la $out`;
+ print `cat $out/${name}_$version.dsc`;
+ print `zcat $out/${name}_$version.diff.gz`;
+}
+
+exit(0);
diff --git a/debtransformbz2 b/debtransformbz2
new file mode 100755
index 0000000..b49ed4c
--- /dev/null
+++ b/debtransformbz2
@@ -0,0 +1,31 @@
+#! /bin/bash
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+if test $# -ne 2; then
+ exit 1
+fi
+
+bz="$1"
+tar="$2"
+
+bzcat "$bz" | gzip -f - >"$tar" || exit 1
+exit 0
diff --git a/debtransformxz b/debtransformxz
new file mode 100755
index 0000000..91d0f83
--- /dev/null
+++ b/debtransformxz
@@ -0,0 +1,6 @@
+#!/bin/sh
+if test $# -ne 2; then
+ exit 1
+fi
+xz -cd "$1" | gzip -f - >"$2" || exit 1
+exit 0
diff --git a/debtransformzip b/debtransformzip
new file mode 100755
index 0000000..2335745
--- /dev/null
+++ b/debtransformzip
@@ -0,0 +1,34 @@
+#! /bin/bash
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+if test $# -ne 2; then
+ exit 1
+fi
+
+zip="$1"
+tar="$2"
+
+tmp=$(mktemp -d)
+unzip -q -d "$tmp" -- "$zip" || exit 1
+( cd "$tmp" && tar czO * ) >"$tar" || exit 1
+rm -r "$tmp"
+exit 0
diff --git a/dist/PKGBUILD b/dist/PKGBUILD
new file mode 100644
index 0000000..6eb7e4b
--- /dev/null
+++ b/dist/PKGBUILD
@@ -0,0 +1,17 @@
+pkgname=build
+pkgver=20170320
+pkgrel=0
+pkgdesc="Build packages in sandbox"
+arch=('i686' 'x86_64')
+url="https://www.github.com/openSUSE/obs-build"
+license=('GPL-2.0+' 'GPL-2.0')
+groups=('base-devel')
+depends=('perl')
+source=(obs-build-${pkgver}.tar.gz)
+md5sums=('SKIP')
+
+package() {
+ msg "Installing build ..."
+ cd "${srcdir}"/obs-build-${pkgver}
+ make DESTDIR=${pkgdir} install
+}
diff --git a/dist/build.changes b/dist/build.changes
new file mode 100644
index 0000000..96c5c74
--- /dev/null
+++ b/dist/build.changes
@@ -0,0 +1,1584 @@
+-------------------------------------------------------------------
+Wed Aug 29 13:57:07 UTC 2018 - Adrian Schröter <adrian@suse.de>
+
+- Fall back to $mailaddr if $VC_MAILADDR is unset/null
+- don't crash with no rpm macros defined
+- Kiwi: support parsing of repos where the .repo file got used
+- package hostarch definition in preinstallimages
+- avoid double creation of monitor fifo
+- Debian:
+ - debootstrap: ensure /etc/hosts exists
+ - debootstrap: Add abuild shadow password entry
+ - livebuild: publish source tarball
+ - Adds Debian configurations for jessie and unstable
+ - collect *.ddeb, *.udeb files
+
+-------------------------------------------------------------------
+Thu Aug 16 14:55:53 UTC 2018 - adrian@suse.de
+
+- docker format: New podman/buildah build engine support
+- Support for full names in changes files
+- Set %url macro when seeing an Url:
+- pacman CLI updates
+- enable core dump generation in VM builds
+- Disable kpti on guest kernel for performance and correctness
+- support for e2fsprogs 1.43.1 with old kernels
+
+-------------------------------------------------------------------
+Fri Jun 29 12:02:10 UTC 2018 - FSchreiner@suse.com
+
+- docker:
+ * use a correct prefixed label for disturl
+ * Support building multiple image types containing a docker image
+ * Set build user to root for docker/fissile builds
+ * Compress containers so that old kiwi versions can handle them
+ * Put obs-docker-support uninstall before the last user line
+ * Also pass arch and buildflavor when creating the containerinfo
+ * set disturl as container LABEL
+ * Uncompress kiwi generated containers
+ * build-vm-docker: type=bind instead of type=volume in --mount option
+- computeblocklists/extractbuild:
+ * Tweak verbose logging of directories in computeblocklists/extractbuild
+ * add support for FIEMAP ioctl
+ * don't use bare F for file
+ * document and use alternate ioctl numbers
+ * more tweaks and sanity checks
+ * Fallback to encode/decode helpers if perl does not support 'Q' in pack/unpack
+ * Use 'eval' when querying the blocklist
+- Misc:
+ * fix escaping in regexp
+ * log toplevel KIWI directories in verbose mode
+ * Split kiwi product parser in a separate function
+ * Always add extra dependencies when doing sysdeps expansion
+ * Fix REPOTYPE setting if the PKGCONFIG file is generated by a service
+ * support zypper's handling of versioned deps
+ * pam-modules got dropped on sles 15
+ * testing for build specific filesystem, which are more important then worker defaults
+ * mark lint option as obsolete
+ * Make sure that we know all pre/vminstalls
+
+
+-------------------------------------------------------------------
+Tue Apr 3 11:30:47 UTC 2018 - adrian@suse.de
+
+- KIWI: Support OBS-Profiles kiwi annotation
+ kiwi profile filtering
+- Switch to a little perl http server to get rid of the python2 dependency
+- Avoid Ubuntu 18.04 uncompress failure messages
+- Don't rely on AppImage's auto-detection for architecture
+- build-recipe-livebuild: count ONIE images as build results
+
+-------------------------------------------------------------------
+Fri Feb 9 15:17:38 UTC 2018 - adrian@suse.de
+
+- add sysrq functionality for KVM builds
+- add initial SLES 15 config
+
+-------------------------------------------------------------------
+Wed Jan 31 13:37:35 UTC 2018 - adrian@suse.de
+
+- add own baselibs config for SLE 11
+
+-------------------------------------------------------------------
+Wed Jan 24 16:04:35 UTC 2018 - adrian@suse.de
+
+- Fix picking of right changes file for changelog generation (boo#1077145)
+
+-------------------------------------------------------------------
+Tue Nov 28 13:33:11 UTC 2017 - adrian@suse.de
+
+- Fixed Dockerfile repository parsing
+- Improve file name check extractbuild
+- track release number of containers
+- Define SOURCEURL and PATCHURL macros
+- Keep preinstalled packages
+- add libidn2 and libunistring to preinstall for archlinux
+
+-------------------------------------------------------------------
+Tue Nov 21 09:12:41 UTC 2017 - coolo@suse.com
+
+- buildignore the sle flavor of mkbaselibs for sle
+
+-------------------------------------------------------------------
+Fri Nov 17 09:36:04 UTC 2017 - adrian@suse.de
+
+- prepare for suse_version 1550 in factory (by Dominique)
+
+-------------------------------------------------------------------
+Thu Nov 9 16:12:53 UTC 2017 - adrian@suse.de
+
+- fixes syntax error fissile support
+- various container handling improvements
+- support new debian control.tar.xz files
+
+-------------------------------------------------------------------
+Thu Oct 12 16:00:09 UTC 2017 - adrian@suse.de
+
+- proper fix for for liblua, for factory and leap 15.0
+
+-------------------------------------------------------------------
+Thu Sep 21 08:55:08 UTC 2017 - coolo@suse.com
+
+- Support getting the container tags from the Dockerfile
+- Put the disturl in the .buildenv file
+- Support rpm-buildroot-override buildflag
+- Support kvm builds on Debian
+- Support with/without/unless rich deps
+- Added obs-docker-support script for docker images
+- Initial SLE 15 config
+
+-------------------------------------------------------------------
+Wed Aug 2 14:59:15 UTC 2017 - lnussel@suse.de
+
+- Temporary hack to aid liblua5_3 -> liblua5_3-5 rename
+
+-------------------------------------------------------------------
+Thu Jul 20 13:59:20 CEST 2017 - mls@suse.de
+
+- switch baselibs scheme for debuginfo packages from
+ foo-debuginfo-32bit to foo-32bit-debuginfo [fate#323217]
+
+-------------------------------------------------------------------
+Fri Mar 17 12:57:03 UTC 2017 - adrian@suse.de
+
+- fix usage of the right service generated files.
+- debootstrap: Also mount sysfs
+- Fileprovides should only match package names, not provides
+- avoid export of build results of sym links pointing to external files
+- support build of different flavors via multibuild
+- experimental AppImage build support
+- reworked openstack support (still experimental)
+
+-------------------------------------------------------------------
+Thu Feb 9 13:15:55 UTC 2017 - adrian@suse.de
+
+- updated confguration for tumbleweed
+- Arch linux fixes
+- mount swap by label
+- allow custom qemu options
+- allow to override hostname
+- fix build with vm-type lxc
+
+-------------------------------------------------------------------
+Wed Jan 25 16:06:13 UTC 2017 - adrian@suse.de
+
+- fix haskell builds (bsc#1018895)
+- fix multi type kiwi profile handling
+- minor distribution config and bug fixes
+
+-------------------------------------------------------------------
+Tue Dec 6 15:36:20 UTC 2016 - adrian@suse.de
+
+- add config for openSUSE Leap 42.3 (alpha, non-final)
+- handle Fedora 25 special cases
+- Improve /proc mount behaviour
+- fix dependency on CentOS (build#2415)
+- Use weak dependencies as 3rd choice breaker
+- support statistics from xvda devices
+- build env wipe support (--wipe command)
+
+-------------------------------------------------------------------
+Tue Nov 29 07:01:58 UTC 2016 - adrian@suse.de
+
+- speed up build (for preinstall and keeping packages)
+- Recognize Recommends and Supplements relations of RPMs.
+- fix build against susetags repos
+
+-------------------------------------------------------------------
+Tue Oct 25 15:51:17 UTC 2016 - adrian@suse.de
+
+- Add clang binaries to ccache symlinking
+- Fix a probable tabs to spaces bug
+- Kiwi: allow to specify ExclusiveArch and ExcludeArch
+- build-vm-kvm: use virtio-rng-device also on aarch64
+- Add support for LXC as libvirt driver
+- support multiple image builds for multiple profiles
+- Add optional whitelisting for allowed buildroots and parameters
+- build-vm-xen: use xvd devices for disks and hvc0 for console for recent xen
+- build-vm-kvm: fix vm_enable_console also for kvm_serial_console case
+- sl13.3.conf: Prepare for bash 4.4, using libreadline7
+- Add and clarify licenses
+
+-------------------------------------------------------------------
+Wed Aug 10 11:51:43 UTC 2016 - lnussel@suse.de
+
+- calculate leap version for default config
+
+-------------------------------------------------------------------
+Tue Aug 9 13:36:48 UTC 2016 - adrian@suse.de
+
+- first version of Leap 42.2 configuration
+- provide loop devices in docker VM
+- support lxc 2.0
+- Add architecture-specific sources extract for Arch Linux
+- snapcraft improvements
+
+-------------------------------------------------------------------
+Thu Jun 30 05:47:52 UTC 2016 - adrian@suse.de
+
+- adding first snapcraft support
+
+-------------------------------------------------------------------
+Wed Apr 27 15:03:56 UTC 2016 - adrian@suse.de
+
+- fix build on armv7hl
+
+-------------------------------------------------------------------
+Wed Apr 27 06:31:53 UTC 2016 - adrian@suse.de
+
+- run debtransform after buildtime source services
+- Handle also aarch32* and armv8 cases for kvm cpu switches
+- add support for LXC 1.0.8
+- added DoD for aarch64 repositories on Debian
+
+-------------------------------------------------------------------
+Fri Apr 8 09:37:41 UTC 2016 - adrian@suse.de
+
+- support unpacking of obscpio archives in source
+- added DoD for aarch64 repositories on Debian
+- aarch64_ilp32 support
+- KVM: telnet feature fixes and documentation
+- KVM: run qemu as user
+- fail when space allocation is not successful (on supported FS)
+
+-------------------------------------------------------------------
+Fri Mar 4 07:29:26 UTC 2016 - adrian@suse.de
+
+- add switch to enable VM console input
+- add --vm-user option to run kvm as non-root
+- Implement experimental obscpio unpacking
+- Use fallocate -p for a fast zero-fill, correctly truncate.
+- PowerVM backend
+- Make --ignoreignore only ignore ignores from the project config
+- aggregate patches fields
+- Fail simpleimage build when integration scripts fail
+- mkdrpms: do not create debuginfo/source deltas
+
+Kiwi:
+- Support new Kiwi v8 (experimental)
+- Make sure kiwi is called in UTF-8 locale
+- Kiwi appliance: support "replaces" attribute and handle it as buildignore
+- KIWI profile support
+- Support a way to map urls to OBS project/repos
+
+Debian:
+- Support lintian when OBS_DCH_RELEASE set
+- Add support for debbuild's eval and .debmacros
+
+-------------------------------------------------------------------
+Thu Nov 5 14:59:24 UTC 2015 - adrian@suse.de
+
+- add openSUSE 42.1 config (bnc#953782)
+- avoid full path in sha256 files of products
+- support virtio-rng device in kvm builds
+- lxc 1.1 support
+
+-------------------------------------------------------------------
+Fri Oct 9 08:41:04 UTC 2015 - adrian@suse.de
+
+- avoid dependency to perl(parent) again
+- fixed buildtime source service execution
+- fixed debian collax support
+
+-------------------------------------------------------------------
+Thu Sep 17 10:45:57 UTC 2015 - adrian@suse.de
+
+- collax support added
+- Fix auto-detection of -p1 option to patch
+- Handle .deb files that have sysv ar(1) filenames
+- Exported RECIPEFILE in build-recipe-livebuild
+
+-------------------------------------------------------------------
+Wed Sep 2 15:29:28 UTC 2015 - adrian@suse.de
+
+- openSUSE 13.3 config added (bnc#944121)
+- Support old versions of Archive::Tar
+- debtransformer xz archive support
+- workaround for broken chroot command (Mageia:5 shipped with it)
+- Support building with Mandriva/Mageia Repositories
+- debian: Various bugfixes for lintian support
+- debian: Generate .changes files when building deb packages.
+- create /dev/loop-control for kernel >= 3.1
+- support singleexport flag handling
+- Fix precedence of unary '-' and '!'
+- fix ppc qemu registration rules
+
+-------------------------------------------------------------------
+Wed Jun 17 15:01:43 UTC 2015 - adrian@suse.de
+
+- fixing test suite call
+
+-------------------------------------------------------------------
+Mon Jun 15 11:41:12 UTC 2015 - adrian@suse.de
+
+- support build time source services
+- docker VM support
+- Simple image creation support
+- vc: create changelog file only in case of a change
+- get hostarch based on preinstalled kernel image
+- architecture CanDo updates
+- avoid endless loops during in binfmt misc registration
+- debian debootstrap fixes
+- added support of debbuild build engine
+- optional support of network inside of KVM
+- allow lintian to break the build
+
+-------------------------------------------------------------------
+Tue Mar 17 07:20:36 UTC 2015 - adrian@suse.de
+
+- workaround initrd breakage when using initrd for systemd with older systems
+- fixes for building in LXC containers
+- avoid emulator for arm on aarch64
+- Fixing UTC symlink resolving when setting localtime
+- ppc64le can build ppc64 with KVM
+- build-vm-kvm: Switch armv7 to virt machine
+- Fix --no-checks with older rpmbuild
+- documenation updates
+
+-------------------------------------------------------------------
+Fri Jan 30 07:23:36 UTC 2015 - adrian@suse.de
+
+- add recommend to perl(Net::SSL) (bnc#880212)
+- add support for debian debootstrap build engine
+- Update arch config
+- Add support for conflicts, addselfprovides, weakdeps to query functions
+- installed package handling works also for arch and debian now
+- large code cleanup
+- bugfixes and documentation updates
+
+-------------------------------------------------------------------
+Mon Nov 24 15:45:59 UTC 2014 - adrian@suse.de
+
+- Add releasesuffix hack for new PTF handling
+- support parallel build jobs for debs
+- Fix repocfg usage in the "exact match" case
+- Improve exclarch handling for deb builds
+- rewritten workaround for broken chroot tool
+
+-------------------------------------------------------------------
+Mon Oct 27 09:01:57 UTC 2014 - adrian@suse.de
+
+- add support for new chroot tool
+ * fixes Ubuntu 14.10 builds
+- man pages for unrpm and vc
+
+-------------------------------------------------------------------
+Fri Sep 19 05:37:09 UTC 2014 - adrian@suse.de
+
+- drop not available packages from SLE 12 config
+
+-------------------------------------------------------------------
+Thu Sep 18 10:46:25 UTC 2014 - adrian@suse.de
+
+- fix syntax error in SLE 12 config
+
+-------------------------------------------------------------------
+Tue Sep 16 06:29:02 UTC 2014 - adrian@suse.de
+
+- add SLE 12 config (bnc#893618)
+- build-vm-kvm: Always use -mem-prealloc when using -mem-path
+- debian livebuild support
+- various ppc handling fixes
+- various smaller fixes
+
+-------------------------------------------------------------------
+Thu Apr 24 19:09:19 UTC 2014 - adrian@suse.de
+
+- build script got refactored and split in multiple modules
+
+-------------------------------------------------------------------
+Thu Feb 20 18:41:16 UTC 2014 - adrian@suse.de
+
+- bugfix release
+ - /sys mounting
+ - binfmtmisc setup
+
+-------------------------------------------------------------------
+Thu Dec 5 13:26:34 UTC 2013 - adrian@suse.de
+
+- fix ppc64le vs. ppc64 emulator check (none needed)
+
+-------------------------------------------------------------------
+Thu Dec 5 10:01:44 UTC 2013 - adrian@suse.de
+
+- fix vc tool regression from "minor fixes"
+
+-------------------------------------------------------------------
+Wed Dec 4 08:26:56 UTC 2013 - adrian@suse.de
+
+- support for project side configured VM kernels
+- ppc64le support
+- minor fixes
+
+-------------------------------------------------------------------
+Tue Oct 15 09:37:05 UTC 2013 - adrian@suse.de
+
+- update openSUSE 13.1 build configuration
+- add openSUSE 13.2 build configuration
+- add support for m86k
+- add support for Tizen changelog date format
+- export .packages, .verified and .ova files for kiwi
+- initvm code cleanup
+- Do not specify compression format for Arch packages when extracting
+- export kiwi-image:$type for kiwi files with schemaversion 5.6 or newer
+- mount tmpfs on $BUILD_ROOT/dev/shm
+- Create devices nodes if udev is not running
+- more arm architectures
+- make version '0' a valid version
+- fix the call to lintian, lintian gets a dsc file as input
+- adding generic parameter to hand over kiwi parameters
+
+-------------------------------------------------------------------
+Fri Aug 2 20:35:02 UTC 2013 - dvlaeev@suse.com
+
+- add requires for Fedora
+
+-------------------------------------------------------------------
+Fri May 17 09:44:35 UTC 2013 - adrian@suse.de
+
+- fix build for non-SUSE rpm distros
+
+-------------------------------------------------------------------
+Fri May 17 09:24:49 UTC 2013 - adrian@suse.de
+
+- fix a number of issues regarding statistics collection
+ => works with more udev versions now
+
+-------------------------------------------------------------------
+Wed May 15 16:17:04 UTC 2013 - adrian@suse.de
+
+- fix qemu-binfmt registration in chroot builds
+
+-------------------------------------------------------------------
+Tue May 14 10:52:18 UTC 2013 - adrian@suse.de
+
+- debian builds call linitian now if installed
+- Arch Linux: support new pacman tool syntax
+- support kiwi installation medias with new kiwi versions
+- fixed regression using build host rpm instead of the version from chroot
+- fixed repository priority ordering, when only some repos have a priority
+ and kiwi appliances get build
+
+-------------------------------------------------------------------
+Wed May 8 11:12:37 UTC 2013 - adrian@suse.de
+
+- support multi architecture initvm binaries
+ => vminit gets build as subpackage now again
+- De-hardcode hugetlbfs from ppc
+- Do not emulate VGA
+- support new nameing scheme of install images of kiwi builds
+
+-------------------------------------------------------------------
+Mon Apr 29 07:40:19 UTC 2013 - adrian@suse.de
+
+- disabling fsync again for newer rpm versions to speed up
+ installation phase again.
+
+-------------------------------------------------------------------
+Fri Apr 26 11:35:37 UTC 2013 - adrian@suse.de
+
+- cloud support for Amanzon EC2 and openstack
+- fixed SPEC_REL support
+- fixed zvm build
+- fixed uml support
+- fixing ext4 usage on old distros
+- final openSUSE 12.3 config
+- arm build support fixes
+
+-------------------------------------------------------------------
+Tue Apr 2 11:09:59 UTC 2013 - coolo@suse.com
+
+- add sl13.1.conf (openSUSE:Factory prjconf of 2013-03-29)
+- have ncurses-devel-32bit require ncurses-devel and not ncurses-32bit
+- do not put .socket files into the 32bit packages
+- unbreak kvm for x86_64
+
+-------------------------------------------------------------------
+Fri Mar 8 09:43:58 UTC 2013 - adrian@suse.de
+
+- fix kvm support for x86_64 again
+
+-------------------------------------------------------------------
+Mon Mar 4 11:03:17 UTC 2013 - adrian@suse.de
+
+- avoid writing out incomplete IO statistics
+
+-------------------------------------------------------------------
+Wed Feb 27 09:14:05 UTC 2013 - adrian@suse.de
+
+- ARM AArch64 support added
+- Generic system emulator support as VM added
+- s390 z/VM build environment support added
+- support collecting resource statistics during build (for OBS 2.4)
+- rpm5 fixes
+- kvm support for armv7l
+- mount /dev/pts with right permissions
+
+-------------------------------------------------------------------
+Mon Nov 26 08:49:59 UTC 2012 - adrian@suse.de
+
+- fixed deb building
+- collecting statistics during VM build
+
+-------------------------------------------------------------------
+Fri Oct 5 10:58:15 UTC 2012 - adrian@suse.de
+
+- backport /proc mounting for rpmlint for factory
+
+-------------------------------------------------------------------
+Thu Sep 27 07:33:21 UTC 2012 - coolo@suse.com
+
+- change to automatic date version in _service
+- update from git (4afd9f0ee03f9e51cf8db9a27fae4663e3f4dde6)
+
+Martin Koegler (1):
+ Bug fix: ignore links in orig tar files
+
+Michael Schroeder (1):
+ - be more verbose when the preinstallimage unpack fails
+
+Stephan Kulow (2):
+ the difference between openSUSE and SLE is outdated
+ do not cumulate packages with 12.2's rpm
+
+-------------------------------------------------------------------
+Tue Sep 25 11:25:49 UTC 2012 - coolo@suse.com
+
+- remove build-mkbaselibs-sle, the split is no longer necessary
+- remove default requires for devel-32bit
+
+-------------------------------------------------------------------
+Tue Sep 25 08:30:55 UTC 2012 - coolo@suse.com
+
+- fix logic for cumulating packages
+
+-------------------------------------------------------------------
+Mon Sep 24 15:47:27 UTC 2012 - coolo@suse.com
+
+- update to current git (03587016a7eca7788f404820642a2b5a1556aa0b)
+
+Adrian Schröter (1):
+ - use default MEMSIZE in check_for_ppc
+
+Anas Nashif (2):
+ pass --use-system-qemu option to init_buildsystem
+ Support https repositories
+
+Frank Lichtenheld (1):
+ init_buildsystem: fail early on reorder failure
+
+Martin Koegler (4):
+ Diff can't handle empty files
+ Refactor diff generation
+ Handle overriden files already present in the orig.tar.gz correctly in debtransform
+ Correct version number of binaries, if necessary
+
+Michael Schroeder (3):
+ - don't add self-provides for src packages
+ - support binary rpms with fo SOURCERPM header element
+ - drop '-o' bsdtar flag when unpacking preinstall images
+
+Werner Fink (1):
+ Make init_buildsystem able to use the features of newer rpm
+
+-------------------------------------------------------------------
+Fri Aug 24 14:04:11 CEST 2012 - mls@suse.de
+
+- update to current git
+ * fixed arch PKGBUILD parsing
+ * add .qcow2 file handling for kiwi
+ * support root tar ball output format of kiwi
+
+-------------------------------------------------------------------
+Tue Aug 21 08:56:05 UTC 2012 - adrian@suse.de
+
+- update to current git
+ * fixed cross build initialsation with chroot
+ * ignore prereqs for subpacks to be built
+ * more Arch Linux support
+ * new --vmdisk-clean switch
+- add recommends to qemu-linux-user
+
+-------------------------------------------------------------------
+Thu Jul 19 07:47:23 UTC 2012 - adrian@suse.de
+
+- update openSUSE 12.2 config to RC1 state
+- add openSUSE 12.3 config to fix build for factory
+- do not package compressed _and_ uncompressed kiwi images
+- add build timestamps in each logfile line
+
+-------------------------------------------------------------------
+Mon Jul 2 08:40:26 UTC 2012 - adrian@suse.de
+
+- preinstallimage support added
+
+-------------------------------------------------------------------
+Thu Jun 14 13:54:42 UTC 2012 - adrian@suse.de
+
+- build fixes for Fedora 17
+- syntax error fix for kiwi vmx builds
+
+-------------------------------------------------------------------
+Tue Jun 5 14:25:08 UTC 2012 - coolo@suse.com
+
+- update from git:
+ (mls) simplify debug package code so that it also works with --target
+
+-------------------------------------------------------------------
+Thu May 31 12:24:32 UTC 2012 - adrian@suse.de
+
+- take care of prjconf target: definition for spec file parsing
+
+-------------------------------------------------------------------
+Wed May 30 12:51:09 UTC 2012 - adrian@suse.de
+
+- support for breakages in Fedora:17
+ * support enforced ordering during preinstall and vminstall phase
+ * allow to extract files via symlinked directories
+
+-------------------------------------------------------------------
+Mon May 14 14:54:27 UTC 2012 - coolo@suse.com
+
+- work around command line size limit
+ mkbaselibs may fail on an excessive number of packages (bnc#761977)
+- improve build root owner setting
+- don't die at compile time if Archive::Tar is not available
+
+-------------------------------------------------------------------
+Tue Apr 24 13:59:49 UTC 2012 - adrian@suse.de
+
+- fixed breakage with older perls
+- ~ support for rpm version compare
+- handle broken deb packages better
+- no more hardcoded copy-in of qemu* binaries
+
+-------------------------------------------------------------------
+Mon Apr 23 09:49:45 UTC 2012 - adrian@suse.de
+
+- do not use sle-baselibs.conf on openSUSE
+
+-------------------------------------------------------------------
+Tue Apr 17 13:54:12 UTC 2012 - cfarrell@suse.com
+
+- license update: GPL-2.0+ and GPL-2.0
+ See e.g. spec2changelog by Pascal Bleser. Also, there should be a copy of
+ the GPL-2.0 license in the package
+
+-------------------------------------------------------------------
+Wed Mar 7 09:55:02 UTC 2012 - adrian@suse.de
+
+- check_emulator needs to use $BUILD_DIR for initvm checks or obs
+ worker builds may break
+- Introduce --vmdisk-mount-options
+
+-------------------------------------------------------------------
+Wed Feb 29 10:02:52 UTC 2012 - adrian@suse.de
+
+- using xz compression for kiwi raw files
+- progress counters during installing
+- 12.2 config added
+
+-------------------------------------------------------------------
+Mon Feb 13 08:49:34 UTC 2012 - adrian@suse.de
+
+- Support for openSUSE 12.2 (current factory)
+- Support for crossbuild via Hostarch directive
+- PPC KVM support
+- swap space gets taken into account for ulimits
+- Failure on not supported personality set
+
+-------------------------------------------------------------------
+Tue Oct 25 14:40:05 UTC 2011 - adrian@suse.de
+
+- use github.com as git repo now
+- fix build for rpmv5
+
+-------------------------------------------------------------------
+Mon Oct 10 19:29:20 CEST 2011 - mls@suse.de
+
+- add sles11sp2 build config and adapt autodetection [bnc#711770]
+
+-------------------------------------------------------------------
+Tue Oct 4 12:43:27 UTC 2011 - adrian@suse.de
+
+- use new qemu-*-binfmt handler to run commands with correct $0
+- fix build for Factory
+
+-------------------------------------------------------------------
+Mon Sep 26 20:33:59 UTC 2011 - adrian@suse.de
+
+- fixing kvm cpuid setting for AMD and Intel CPU's
+- support new xen tools
+- fixed qemu build initialisation
+
+-------------------------------------------------------------------
+Sun Aug 7 19:58:28 UTC 2011 - opensuse@cboltz.de
+
+- Requires:/Recommends: were part of the package description.
+ Moved them to the correct place.
+
+-------------------------------------------------------------------
+Fri Jul 1 07:26:34 UTC 2011 - adrian@suse.de
+
+- compat mode for broken kiwi of openSUSE 11.4
+
+-------------------------------------------------------------------
+Thu Jun 30 10:42:15 UTC 2011 - adrian@suse.de
+
+- fixed kiwi execution call for some versions
+
+-------------------------------------------------------------------
+Fri Jun 17 08:35:15 UTC 2011 - adrian@suse.de
+
+- support new kiwi command line mode
+
+-------------------------------------------------------------------
+Mon Jun 6 14:57:47 UTC 2011 - adrian@suse.de
+
+- do not build ia64 baselibs packages for openSUSE anymore
+
+-------------------------------------------------------------------
+Wed May 25 12:14:38 UTC 2011 - adrian@suse.de
+
+- allow to use simple spec file parser via Build::show
+
+-------------------------------------------------------------------
+Thu May 12 10:20:53 UTC 2011 - adrian@suse.de
+
+- conflict with old bsdtar (not supporting --chroot)
+
+-------------------------------------------------------------------
+Wed Apr 27 12:34:17 UTC 2011 - adrian@suse.de
+
+- revert to single cpu build default for debian packages
+
+-------------------------------------------------------------------
+Fri Apr 15 08:55:14 UTC 2011 - adrian@suse.de
+
+- switch back to single process build for debian to be conform with
+ their policy
+- use cpuid kvm64 on kvm for 64bit as workaround for a cpuid bug
+
+-------------------------------------------------------------------
+Tue Mar 29 14:59:28 UTC 2011 - lnussel@suse.de
+
+- make sure default.conf is no stale symlink
+
+-------------------------------------------------------------------
+Tue Mar 1 15:35:21 UTC 2011 - adrian@suse.de
+
+- support new cross build initvm. Done by James Perkins from LinuxFoundation
+- do not use loop device anymore when using block devices directly
+
+-------------------------------------------------------------------
+Thu Jan 20 10:18:09 UTC 2011 - lnussel@suse.de
+
+- force use of bsdtar for VMs (bnc#665768, CVE-2010-4226)
+
+-------------------------------------------------------------------
+Thu Nov 11 12:24:13 UTC 2010 - adrian@suse.de
+
+- workaround for distros with appstart like Ubuntu 10.10
+
+-------------------------------------------------------------------
+Tue Nov 2 16:32:42 UTC 2010 - lnussel@suse.de
+
+- delta size limit 80%
+- actually unlink the delta file if the delta is too big
+
+-------------------------------------------------------------------
+Wed Oct 27 13:38:48 UTC 2010 - lnussel@suse.de
+
+- use '.drpm' suffix instead of '.delta.rpm' for delta rpms
+- makedeltarpms -> mkdrpms and also rename subpackage to match
+ script name
+- since mkdrpms needs Build.pm make perl-TimeDate dependency of
+ build optional
+
+-------------------------------------------------------------------
+Mon Oct 18 14:38:16 UTC 2010 - lnussel@suse.de
+
+- add missing optional perl dependencies
+
+-------------------------------------------------------------------
+Fri Oct 15 10:27:08 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * export also fallback archs as exclusive archs for kiwi product
+ building, fixes factory dvd5 64bit media
+ * cross build fixes by Martin Mohring
+ * correct disk image file creation, it was one byte too large by James Perkins
+
+-------------------------------------------------------------------
+Tue Sep 21 13:23:00 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * workaround for supporting rpm install on cross build with native
+ acceleration
+
+-------------------------------------------------------------------
+Mon Sep 20 12:25:56 UTC 2010 - lnussel@suse.de
+
+- package mkdrpms script in separate package
+
+-------------------------------------------------------------------
+Tue Aug 24 08:32:05 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * support for mips cross build
+
+-------------------------------------------------------------------
+Wed Aug 4 15:31:41 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * replace release number macros with 0 if not specified
+
+-------------------------------------------------------------------
+Wed Jul 28 15:44:41 CEST 2010 - mls@suse.de
+
+- update to current git
+ * document --repo and --dist
+ * update wiki links
+ * fix bugs in repo handling
+ * fix distribution autodetection code
+
+-------------------------------------------------------------------
+Thu Jul 22 09:22:03 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * support for Files provide
+
+-------------------------------------------------------------------
+Thu Jul 8 13:15:42 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * export BUILD_DEBUG so rpmlint can check for it (bnc#618004)
+
+-------------------------------------------------------------------
+Tue Jun 29 15:06:06 CEST 2010 - mls@suse.de
+
+- update to current git
+ * add 11.3 config
+ * fix repo creation in --noinit case
+ * support ovf files directly
+ * allow multiple --oldpackages
+ * delta rpm support
+
+-------------------------------------------------------------------
+Mon Jun 21 12:20:36 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * fixes for image building for SLE 10
+ * fix parsing of macros that contain {} blocks
+ * support xz decoder helper script
+ * don't substitute in lines with %(), the parser cannot handle it (bnc#613965)
+ * run kvm instance with the right number of cpus according to given parallel build jobs
+
+-------------------------------------------------------------------
+Sat May 29 13:35:34 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * noatime VM mount
+ * _service file rename happens inside of chroot/vm now.
+
+-------------------------------------------------------------------
+Tue May 4 08:26:13 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * CBinstall and CBPreninstall directive support from Jan-Simon
+
+-------------------------------------------------------------------
+Wed Apr 21 09:58:46 UTC 2010 - adrian@suse.de
+
+- detect kvm virtio initrds on SUSE systems automatically
+
+-------------------------------------------------------------------
+Mon Apr 19 00:54:32 CEST 2010 - ro@suse.de
+
+- build-mkbaselibs: also move baselibs*conf to subpackage
+
+-------------------------------------------------------------------
+Fri Apr 16 01:11:45 CEST 2010 - ro@suse.de
+
+- add BuildIgnore build-mkbaselibs to be able to bootstrap
+
+-------------------------------------------------------------------
+Thu Apr 15 14:04:56 UTC 2010 - adrian@suse.de
+
+- split out -mkbaselibs package to avoid build dependency problems
+ on perl version updates in future.
+- update to current git
+ * added armv6el to emulator archs by Jan-Simon.
+ * fixing a logic error in arch= attribute handling for kiwi
+
+-------------------------------------------------------------------
+Fri Apr 9 07:58:24 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * Support for remote yum repos by yi.y.yang@intel.com
+ * fixed kiwi file parsing for arch= attributes
+
+-------------------------------------------------------------------
+Wed Mar 31 15:00:48 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * kvm autosetup enhancements
+ * multiple bugfixes and refactoring
+
+-------------------------------------------------------------------
+Wed Mar 10 13:34:45 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * Kiwi exclude arch handling
+
+-------------------------------------------------------------------
+Mon Mar 8 12:07:03 UTC 2010 - adrian@suse.de
+
+- create default.conf symlink to correct *.conf based on
+ %suse_version and %sles_version macros
+
+-------------------------------------------------------------------
+Thu Feb 25 08:22:52 UTC 2010 - adrian@suse.de
+
+- add dependency to tar (needed for deb builds)
+- use current git
+ * Added '--uid uid:gid' feature to specify abuild id in chroot
+ (by David Greaves)
+
+-------------------------------------------------------------------
+Sat Feb 20 10:49:00 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * fix for permissions for debian (done by Jan-Simon)
+
+-------------------------------------------------------------------
+Thu Feb 11 19:09:11 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * fixed handling of kiwi build results
+
+-------------------------------------------------------------------
+Mon Feb 8 15:52:12 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * support kiwi 4.1 schema files
+
+-------------------------------------------------------------------
+Tue Jan 19 14:57:22 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * fixed missing --root parameter for substitutedeps call
+
+-------------------------------------------------------------------
+Mon Jan 18 16:38:58 UTC 2010 - adrian@suse.de
+
+- update to current git
+ * create .sha256 files for kiwi image results
+
+-------------------------------------------------------------------
+Wed Jan 13 15:21:28 UTC 2010 - adrian@suse.de
+
+- update to current git repo
+ * unbreaking kiwi builds again
+
+-------------------------------------------------------------------
+Sun Jan 3 13:02:40 UTC 2010 - adrian@suse.de
+
+- update to current git repo, update to commit 549cf6c6e148b7f8c05c12ee06f3094cb67149f9
+ * minor bugfixes
+ * sparc support fixes
+
+-------------------------------------------------------------------
+Thu Dec 10 07:00:00 UTC 2009 - adrian@suse.de
+
+- switch to git repository, update to commit c8b33e430bfb40b80df43249279bd561d874d786
+ * product building via abuild user
+ * prodoct building speedup
+
+-------------------------------------------------------------------
+Fri Nov 27 09:44:56 UTC 2009 - adrian@suse.de
+
+- update to svn(r9279)
+ Debian packages get configured at install time again now.
+ But keeping additional configuration step afterwards for failed
+ configutions (due to dep cycles)
+
+-------------------------------------------------------------------
+Fri Nov 27 09:11:15 UTC 2009 - adrian@suse.de
+
+- add requires to perl-TimeDate for changelog2spec app
+
+-------------------------------------------------------------------
+Wed Nov 25 10:54:24 UTC 2009 - adrian@suse.de
+
+- update to svn(r9238)
+ * Debian chroot enviroments are running post installation scripts
+ now after all packages got installed, not after each installation
+ (partly fixes Ubuntu 9.10 setup)
+
+-------------------------------------------------------------------
+Sat Nov 21 19:50:44 UTC 2009 - adrian@suse.de
+
+- update to current svn(r9154)
+ * add support for xz compressed rpms (Fedora 12) on platforms without xz support in
+ rpm.
+ * speed up install by disabling fsync in rpm config
+
+-------------------------------------------------------------------
+Thu Nov 5 06:16:05 UTC 2009 - adrian@suse.de
+
+- update to current svn (r8506)
+ - product iso generation is done by kiwi now
+ - debs get generated via "make install"
+
+-------------------------------------------------------------------
+Wed Sep 23 12:01:05 CEST 2009 - mls@suse.de
+
+- update to current svn (r8048)
+ - support openSUSE 11.2 [bnc#539914]
+
+-------------------------------------------------------------------
+Mon Jul 27 17:03:47 CEST 2009 - ro@suse.de
+
+- update to current svn (r7751)
+ - support for legacy releasepkg mechanism
+ - only print parse warnings if $config->{'warnings'} is set
+ - set warnings for expanddeps/substitutedeps
+ - use UTC as default timezone
+ - also consider patches as sources
+ - do not call depmod until we use also the native kernel,
+ it can't match otherwise
+ - return with value 3, if basic file system creation fails.
+ bs_worker will mark the build host as bad and retries on another one.
+ - handle files from service correctly and strip their prefix.
+ - - also add rpmv3 compatibility hack to createrpmdeps
+ - mount proc filesystem for build compare run
+ - fix for ccache support from
+ - add build-ids for debuginfo packages for subpacks
+
+-------------------------------------------------------------------
+Wed Jun 3 13:40:08 CEST 2009 - adrian@suse.de
+
+- update to current svn (r7483)
+ * Jan-Simons "ChangeTarget" support
+ * fix for handling missing self provides with rpm format 3.0.6
+
+-------------------------------------------------------------------
+Thu Apr 23 12:14:36 CEST 2009 - adrian@suse.de
+
+- update to current svn (r7164)
+ * package vc tool correctly
+ * avoid running fsck on vm instances after 23 build runs
+- install files via Makefile instead of manual calls in spec file
+
+-------------------------------------------------------------------
+Mon Apr 20 14:48:41 CEST 2009 - adrian@suse.de
+
+- update to current svn (r7126)
+ * new blocklist based build result export
+ * Martin Mohrings cross build extensions
+ * vc tool included now
+
+-------------------------------------------------------------------
+Wed Mar 23 15:20:17 CET 2009 - adrian@suse.de
+
+- Fix for "Requires(pre/post)" tags
+- fix missing abuild group in /etc/gshadow on debian like distros
+
+-------------------------------------------------------------------
+Wed Feb 25 15:20:17 CET 2009 - adrian@suse.de
+
+- Update for bug fix for image build with additional packages in --create step
+ (fix from cthiel, bnc#479537)
+
+-------------------------------------------------------------------
+Fri Feb 20 12:04:00 CET 2009 - adrian@suse.de
+
+- Fix kvm support together with Alexander
+- Support for new disturl containing a complete pointer to build
+ service instance resource
+- add support for package compare to allow Build Service to drop
+ same packages after build
+- image repack support from Christoph
+
+-------------------------------------------------------------------
+Tue Jan 27 14:27:19 CET 2009 - adrian@suse.de
+
+- update to current buildservice/1.5 branch
+- More fixes for kiwi image build
+- Move Susetags.pm to correct Build:: namespace
+
+-------------------------------------------------------------------
+Wed Dec 10 14:27:19 CET 2008 - froh@suse.de
+
+- update to r5853:
+- added: new armv7el arch for all binaries for up to ARMv7 EABI with VFP
+- Fix kiwi image build support within osc
+
+-------------------------------------------------------------------
+Fri Dec 5 09:11:19 CET 2008 - froh@suse.de
+
+- remove baselibs.conf from the spec file, too
+
+-------------------------------------------------------------------
+Fri Dec 5 02:26:21 CET 2008 - ro@suse.de
+
+- delete baselibs.conf (nowadays stored in package sources)
+
+-------------------------------------------------------------------
+Wed Dec 3 13:17:26 CET 2008 - ro@suse.de
+
+- delete automatic requires for debuginfo-xxbit
+
+-------------------------------------------------------------------
+Wed Dec 3 11:30:37 CET 2008 - froh@suse.de
+
+- config update
+
+-------------------------------------------------------------------
+Fri Nov 28 15:19:21 CET 2008 - froh@suse.de
+
+- many kiwi fixes
+- _no_ cross build support yet
+
+-------------------------------------------------------------------
+Thu Nov 13 15:01:59 CET 2008 - ro@suse.de
+
+- update mkbaselibs broken by previous debuginfo change
+- various fixes for kiwi build
+- add sl11.1.conf
+- add support for --disturl
+- also save .desktopfiles for coolo
+
+-------------------------------------------------------------------
+Thu Oct 23 14:59:19 CEST 2008 - ro@suse.de
+
+- disable ppc:ia32 stuff again, causes trouble and can not work
+
+-------------------------------------------------------------------
+Tue Oct 21 13:25:50 CEST 2008 - jblunck@suse.de
+
+- Generate debuginfo packages for baselibs (bnc #396196)
+
+-------------------------------------------------------------------
+Mon Oct 20 17:56:20 CEST 2008 - ro@suse.de
+
+- update to svn trunk of today:
+- init_buildsystem: check for some left space before calling rpmbuild
+ - create dev/shm as directory
+- baselibs_global.conf: update to current internal revision
+ - add ia32 stuff for x86 binaries on ppc
+ - add ldconfig for all non-devel baselibs packages
+- changed: to function also with emulators better use fakeroot-tcp
+ for debian build
+- fixed: changed basis for memory calculation to assume also a stack
+ which can be swapped well. gcc often needs much memory here
+- recognize SLES10
+- fix boolification in && and ||
+- re-preinstall critical packages on update
+- fix creation of buildenv to do it the same time with and without VM.
+- fixes installation-images build for ppc
+- fixed #406596: don't ignore BuildRequires in subpackages
+- print finished message
+- set BUILD_USER depending on the suse_version like it is done in
+ old autobuild
+- added documentation for specfile control comments for build(1)
+- add --incarnation
+- add --create-build-binaries
+- support badarch (aka excludearch)
+- add support for Requires(pre) or (post) semantic
+
+-------------------------------------------------------------------
+Mon Aug 11 16:15:23 CEST 2008 - adrian@suse.de
+
+Update from current svn trunk:
+- Improved XEN support (XEN call only once per build)
+- Add post build check hooks
+- rpmlint support
+- added kvm support
+- refactored code in various places
+
+-------------------------------------------------------------------
+Tue Jun 3 17:53:22 CEST 2008 - mls@suse.de
+
+- fix debtransform bug [bnc#396766]
+
+-------------------------------------------------------------------
+Thu May 29 16:17:17 CEST 2008 - mls@suse.de
+
+- add 11.0 config
+- fix debian provides
+- fix rpm tag parsing
+- add with/without/define/ccache/icecream/debug options
+- update mkbaselibs
+
+-------------------------------------------------------------------
+Fri Sep 14 18:27:13 CEST 2007 - mls@suse.de
+
+- add sl10.3 config [#310089]
+- also look for BuildRequires in subpackage definitions [#305568]
+- allow removal of more config parameters
+
+-------------------------------------------------------------------
+Thu Aug 2 15:56:09 CEST 2007 - mls@suse.de
+
+- support 'order' config option
+- support 'patterntype' config option
+- new setdeps() method
+- support for flexible query options
+- support 'description' query
+- fix bug in changelog2spec time cutoff
+- make debtransform understand Debtransform-Tar/Debtransform-Files-Tar/
+ Debtransform-Series
+- fix bug in substitutedeps
+
+-------------------------------------------------------------------
+Wed Jun 13 17:18:17 CEST 2007 - mls@suse.de
+
+- implement rpm installation order calculation in perl
+- make substitute code modify requires, too
+- add filelist query support
+- add prereq parsing support
+- speed up version comparison a bit
+
+-------------------------------------------------------------------
+Thu May 10 20:02:29 CEST 2007 - mls@suse.de
+
+- add _vendor to configs
+- fix deban dependency compare
+- allow not operator in configs
+- fix build from source rpms
+
+-------------------------------------------------------------------
+Thu Apr 12 16:22:16 CEST 2007 - mls@suse.de
+
+- add --root to rpm call in rpm to work around a bug in rpm [#255720]
+
+-------------------------------------------------------------------
+Thu Apr 5 15:59:21 CEST 2007 - mls@suse.de
+
+- update to 1561:
+ * support architecture dependand requires in dsc files
+ * support "global" definitions for rpm
+ * support vminstall config option
+
+-------------------------------------------------------------------
+Mon Mar 12 15:40:49 CET 2007 - mls@suse.de
+
+- update to r1419:
+ * fix buildroot in debtransform
+ * obey version numbers when expanding
+
+-------------------------------------------------------------------
+Fri Mar 2 21:23:40 CET 2007 - mls@suse.de
+
+- transform suse changes file to rpm specfile format
+- improved debian support
+
+-------------------------------------------------------------------
+Fri Jan 26 17:14:08 CET 2007 - poeml@suse.de
+
+- update to r1114:
+ - re-add the lost unrpm script
+
+-------------------------------------------------------------------
+Fri Jan 26 15:58:32 CET 2007 - poeml@suse.de
+
+- update to r1110:
+ - make exclarch an array
+ - remount root rw in xen case, needed if root is not reiserfs
+ - add repotype/runscripts options
+ - remove devs in sl10.1/10.2
+ - fix boolean test to make "00" false like rpm does
+ - add rpm_verscmp for version comparison
+ - runscripts
+ - macro blocks
+ - read_config_dist
+ - useful xen exit status
+ - add --kill
+ - update 10.2 config
+ - extend spec/dsc parser
+ - fixed two bugs in the specfile parser
+
+-------------------------------------------------------------------
+Fri Nov 24 17:43:28 CET 2006 - mls@suse.de
+
+- fix suse_version in sl10.1/sles10 config
+- add sl10.2 config
+- make dist autodetection work with opensuse
+- fix macro sequencing and expression parser bugs
+- treat preinstalls as keep
+
+-------------------------------------------------------------------
+Thu Aug 24 00:49:19 CEST 2006 - ro@suse.de
+
+- init_buildsystem: when preinstalling, handle only sh scripts
+
+-------------------------------------------------------------------
+Wed Jun 14 17:42:26 CEST 2006 - mls@suse.de
+
+- support for buildservice and debian packages
+
+-------------------------------------------------------------------
+Fri Apr 28 17:07:30 CEST 2006 - mls@suse.de
+
+- add ndeps back to expansion calls
+- save original macro name so that other regexp calls don't destroy
+ it
+
+-------------------------------------------------------------------
+Wed Apr 19 15:34:10 CEST 2006 - mls@suse.de
+
+- add --list-state option [#119869]
+- suppress stat messages when deleting rpms [#154385]
+- delete not-ready flag when rpm expansion failes [#133568]
+- update baselibs.conf
+
+-------------------------------------------------------------------
+Tue Apr 11 16:00:53 CEST 2006 - mls@suse.de
+
+- fix typo in configs
+- fix macro handling
+
+-------------------------------------------------------------------
+Fri Apr 7 19:06:09 CEST 2006 - mls@suse.de
+
+- mkbaselibs: do not leave .src.rpm in the release [#158816]
+
+-------------------------------------------------------------------
+Tue Apr 4 12:26:24 CEST 2006 - mls@suse.de
+
+- add update-alternatives to java2-devel-packages macro [#156137]
+
+-------------------------------------------------------------------
+Mon Mar 27 20:01:01 CEST 2006 - mls@suse.de
+
+- run zic to set default timezone [#142363]
+- update baselibs.conf
+
+-------------------------------------------------------------------
+Fri Mar 24 17:04:41 CET 2006 - mls@suse.de
+
+- fix handling of "keep" [#160346]
+- fix old configs [#159947]
+
+-------------------------------------------------------------------
+Mon Mar 20 14:35:11 CET 2006 - mls@suse.de
+
+- make mkbaselibs use the right version for the srcrpm
+- update mkbaselibs configuration files
+
+-------------------------------------------------------------------
+Fri Mar 10 14:15:40 CET 2006 - mls@suse.de
+
+- add package expansion and dependency substitution support
+
+-------------------------------------------------------------------
+Wed Feb 8 21:29:48 CET 2006 - agruen@suse.de
+
+- Adjust the package lists so that the build script can at least
+ be used again.
+
+-------------------------------------------------------------------
+Wed Jan 25 21:45:57 CET 2006 - mls@suse.de
+
+- converted neededforbuild to BuildRequires
+
+-------------------------------------------------------------------
+Mon Sep 12 11:11:30 CEST 2005 - mls@suse.de
+
+- also search for ix86 packages when building x86_64 [#116069]
+
+-------------------------------------------------------------------
+Mon Sep 5 12:13:09 CEST 2005 - mls@suse.de
+
+- add --baselibs option
+- fix --extra-packs
+
+-------------------------------------------------------------------
+Thu May 12 14:45:32 CEST 2005 - mls@suse.de
+
+- Fix typo in init_buildsystem that prevented the reuse of the build
+ environment [#74714]
+
+-------------------------------------------------------------------
+Fri Mar 11 18:03:30 CET 2005 - mls@suse.de
+
+- integrated patches into tarball
+- allowed build for older dists [#65506]
+
+-------------------------------------------------------------------
+Wed Mar 2 12:28:07 CET 2005 - agruen@suse.de
+
+- Some more cleanups for 9.3.
+- When using the default list of packages, also try to include the
+ packages in neededforbuild.
+
+-------------------------------------------------------------------
+Mon Feb 28 17:36:02 CET 2005 - agruen@suse.de
+
+- ldconfig must be called with its absolute path.
+
+-------------------------------------------------------------------
+Tue May 25 14:49:13 CEST 2004 - mls@suse.de
+
+- overhaul the manpage
+
+-------------------------------------------------------------------
+Thu Mar 25 18:31:56 CET 2004 - mls@suse.de
+
+- incorporate ro's diff
+
+-------------------------------------------------------------------
+Wed Mar 24 20:26:39 CET 2004 - mls@suse.de
+
+- really adapt to 9.1
+- add --root and --extra-packs options
+- use BuildRequires: line
+- use user 'abuild' if norootforbuild found
+- fix BUILD_DIR security issue (#35281)
+
+-------------------------------------------------------------------
+Thu Mar 11 20:00:13 CET 2004 - ro@suse.de
+
+- adapted for 9.1
+
+-------------------------------------------------------------------
+Mon Nov 10 23:54:37 CET 2003 - mmj@suse.de
+
+- Accept "-h" for help
+- rpm -ba is now rpmbuild -ba
+- Add Maximum RPM reference
+
+-------------------------------------------------------------------
+Mon Nov 10 13:48:39 CET 2003 - mmj@suse.de
+
+- Update the default USEDFORBUILD to match todays packages
+- Don't build as root
+
+-------------------------------------------------------------------
+Wed Oct 15 12:23:49 CEST 2003 - mmj@suse.de
+
+- Fix to work on amd64 (from mls) [#32229]
+
+-------------------------------------------------------------------
+Fri Sep 5 16:01:54 CEST 2003 - mls@suse.de
+
+- select i586 on i686 is user didn't specify arch
+- complain if user wan't to build i686 on a not-i686 processor
+- patch rpmrc so that i686 rpms are written if building for i686
+
+-------------------------------------------------------------------
+Thu Sep 4 16:12:03 CEST 2003 - mls@suse.de
+
+- port to sl90
+- allow path for BUILD_RPMS
+- add BUILD_ARCH and autodetection
+- add --jobs and --target options
+
+-------------------------------------------------------------------
+Fri Aug 29 05:40:30 CEST 2003 - nashif@suse.de
+
+- fixed call for "head"
+
+-------------------------------------------------------------------
+Thu Aug 7 11:58:11 CEST 2003 - schwab@suse.de
+
+- Fix typo.
+
+-------------------------------------------------------------------
+Thu Aug 7 09:57:35 CEST 2003 - mmj@suse.de
+
+- Enhance build.1 a bit
+
+-------------------------------------------------------------------
+Sat Mar 8 08:11:29 CET 2003 - kukuk@suse.de
+
+- Fix build on 8.2 (coreutils) [Bug #24895]
+
+-------------------------------------------------------------------
+Fri Jan 31 19:58:17 CET 2003 - kukuk@suse.de
+
+- Fix build patch from bk.
+
+-------------------------------------------------------------------
+Wed Jan 29 14:08:09 CET 2003 - kukuk@suse.de
+
+- Add workaround for duplicate packages for different archs
+- Add support for upcoming 8.2
+
+-------------------------------------------------------------------
+Fri Oct 4 17:18:26 CEST 2002 - bk@suse.de
+
+- integrate 8.1 diff into tarball and update README
+- build.dif: init_buildsystem: add support for earlyer distributions
+
+-------------------------------------------------------------------
+Mon Sep 9 13:00:19 MEST 2002 - mls@suse.de
+
+- Adjust for SuSE Linux 8.1 again
+- Fix parameter parsing
+- Changed build to accept .src.rpm sources
+
+-------------------------------------------------------------------
+Mon Aug 19 11:14:50 CEST 2002 - kukuk@suse.de
+
+- Adjust for SuSE Linux 8.1
+
+-------------------------------------------------------------------
+Tue Jul 30 16:00:16 CEST 2002 - kukuk@suse.de
+
+- Fix get_version_number.sh
+
+-------------------------------------------------------------------
+Thu Jul 18 13:19:11 CEST 2002 - kukuk@suse.de
+
+- Don't create /etc/rc.config
+
+-------------------------------------------------------------------
+Wed Jul 3 09:48:44 CEST 2002 - kukuk@suse.de
+
+- Add default package list for new spec files without usedforbuild
+- Make it work with gcc 2.95 and gcc 3.1
+
+-------------------------------------------------------------------
+Thu Mar 7 16:58:21 CET 2002 - kukuk@suse.de
+
+- Fix build/init_buildsystem
+
+-------------------------------------------------------------------
+Mon Jan 14 16:38:56 CET 2002 - kukuk@suse.de
+
+- Add manual page from Gerd Knorr
+
+------------------------------------------------------------------
+Fri Dec 14 21:27:00 CET 2001 - kukuk@suse.de
+
+- Fix file list
+- Ignore new RPMs from pre-8.0 on 7.3
+
+------------------------------------------------------------------
+Fri Dec 14 15:49:38 CET 2001 - kukuk@suse.de
+
+- More fixes
+
+-------------------------------------------------------------------
+Tue Nov 27 16:10:57 CET 2001 - kukuk@suse.de
+
+- New build script which uses "usedforbuild"
+
+-------------------------------------------------------------------
+Thu Jan 18 13:11:25 CET 2001 - kukuk@suse.de
+
+- Update Readme and init_buildsystem for 7.1
+
+-------------------------------------------------------------------
+Thu Nov 30 18:09:49 CET 2000 - kukuk@suse.de
+
+- Update init_buildsystem, add README
+
+-------------------------------------------------------------------
+Wed Nov 15 18:07:58 CET 2000 - kukuk@suse.de
+
+- First version
+
diff --git a/dist/build.dsc b/dist/build.dsc
new file mode 100644
index 0000000..09dbe68
--- /dev/null
+++ b/dist/build.dsc
@@ -0,0 +1,9 @@
+Format: 1.0
+Source: build
+Version: 20160531
+Binary: build
+Maintainer: Adrian Schroeter <adrian@suse.de>
+Architecture: all
+Standards-Version: 3.7.2
+Build-Depends: debhelper (>= 4)
+
diff --git a/dist/build.spec b/dist/build.spec
new file mode 100644
index 0000000..e177597
--- /dev/null
+++ b/dist/build.spec
@@ -0,0 +1,253 @@
+#
+# spec file for package build
+#
+# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany.
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via http://bugs.opensuse.org/
+#
+# needsrootforbuild
+# needsbinariesforbuild
+
+
+Name: build
+Summary: A Script to Build SUSE Linux RPMs
+License: GPL-2.0+ and GPL-2.0
+Group: Development/Tools/Building
+Version: 20171122
+Release: 0
+Source: obs-build-%{version}.tar.gz
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
+BuildArch: noarch
+#!BuildIgnore: build-mkbaselibs build-mkbaselibs-sle
+# Keep the following dependencies in sync with obs-worker package
+Requires: bash
+Requires: binutils
+Requires: perl
+Requires: tar
+%if 0%{?fedora}
+Requires: perl-MD5
+Requires: perl-TimeDate
+%endif
+Conflicts: bsdtar < 2.5.5
+%if 0%{?suse_version} > 1000
+# None of them are actually required for core features.
+# Perl helper scripts use them.
+Recommends: perl(Date::Language)
+Recommends: perl(Date::Parse)
+Recommends: perl(LWP::UserAgent)
+Recommends: perl(Pod::Usage)
+Recommends: perl(Time::Zone)
+Recommends: perl(URI)
+Recommends: perl(XML::Parser)
+Recommends: perl(Net::SSL)
+Recommends: perl(YAML)
+Recommends: perl(YAML::LibYAML)
+Recommends: bsdtar
+Recommends: qemu-linux-user
+Recommends: /sbin/mkfs.ext3
+%endif
+
+%if 0%{?suse_version} > 1120 || ! 0%{?suse_version}
+Requires: build-mkbaselibs
+%endif
+
+%if 0%{?suse_version} > 1120 || 0%{?mdkversion}
+Recommends: build-mkdrpms
+%endif
+
+%description
+This package provides a script for building RPMs for SUSE Linux in a
+chroot environment.
+
+
+%if 0%{?suse_version} > 1120 || ! 0%{?suse_version}
+
+%package mkbaselibs
+Summary: Tools to generate base lib packages
+# NOTE: this package must not have dependencies which may break boot strapping (eg. perl modules)
+Group: Development/Tools/Building
+
+%description mkbaselibs
+This package contains the parts which may be installed in the inner build system
+for generating base lib packages.
+
+%package mkdrpms
+Summary: Tools to generate delta rpms
+Group: Development/Tools/Building
+Requires: deltarpm
+# XXX: we wanted to avoid that but mkdrpms needs Build::Rpm::rpmq
+Requires: build
+
+%description mkdrpms
+This package contains the parts which may be installed in the inner build system
+for generating delta rpm packages.
+
+%endif
+
+%define initvm_arch %{_host_cpu}
+%if %{_host_cpu} == "i686"
+%define initvm_arch i586
+%endif
+%package initvm-%{initvm_arch}
+Summary: Virtualization initializer for emulated cross architecture builds
+Group: Development/Tools/Building
+Requires: build
+BuildRequires: gcc
+BuildRequires: glibc-devel
+Provides: build-initvm
+Obsoletes: build-initvm
+%if 0%{?suse_version} > 1200
+BuildRequires: glibc-devel-static
+%endif
+
+%description initvm-%{initvm_arch}
+This package provides a script for building RPMs for SUSE Linux in a
+chroot or a secure virtualized
+
+%prep
+%setup -q -n obs-build-%version
+
+%build
+%if 0%{?suse_version}
+# initvm
+make CFLAGS="$RPM_BUILD_FLAGS" initvm-all
+%endif
+
+%install
+# initvm
+%if 0%{?suse_version}
+make DESTDIR=%{buildroot} initvm-install
+strip %{buildroot}/usr/lib/build/initvm.*
+export NO_BRP_STRIP_DEBUG="true"
+chmod 0644 %{buildroot}/usr/lib/build/initvm.*
+%endif
+
+# main
+make DESTDIR=%{buildroot} install
+
+# tweak default config on suse
+%if 0%{?suse_version}
+cd %{buildroot}/usr/lib/build/configs/
+SUSE_V=%{?suse_version}
+SLE_V=%{?sle_version}
+%if 0%{?sle_version} && 0%{?is_opensuse} && %suse_version == 1315
+# this is SUSE Leap 42.X
+ln -s sl42.${SLE_V:3:1}.conf default.conf
+%endif
+%if 0%{?sle_version} && 0%{?is_opensuse} && %suse_version > 1315
+# this is SUSE Leap 15 and higher
+ln -s sl${SLE_V:0:2}.${SLE_V:3:1}.conf default.conf
+%endif
+%if !0%{?sle_version} && ( 0%{?suse_version} <= 1310 || 0%{?suse_version} == 1320 || 0%{?suse_version} == 1330 || 0%{?suse_version} == 1550 )
+# this is old openSUSE releases and Factory
+ln -s sl${SUSE_V:0:2}.${SUSE_V:2:1}.conf default.conf
+%endif
+%if 0%{?sle_version} && !0%{?is_opensuse}
+# this is SUSE SLE 12 and higher
+ln -s sle${SLE_V:0:2}.${SLE_V:3:1}.conf default.conf
+%endif
+%if 0%{?sles_version} == 1110
+# this is SUSE SLE 11
+ln -s sles11sp2.conf default.conf
+%endif
+# make sure that we have a config
+test -e default.conf || exit 1
+%endif
+
+# tweak baselibs config on suse
+%if 0%{?suse_version}
+cd %{buildroot}/usr/lib/build
+%if %suse_version == 1500
+# SLE 15 / Leap 15
+ln -sf baselibs_configs/baselibs_global-sle15.conf baselibs_global.conf
+%endif
+%if %suse_version == 1315
+# SLE 12 / Leap 42
+ln -sf baselibs_configs/baselibs_global-sle12.conf baselibs_global.conf
+%endif
+%if %suse_version <= 1110
+# SLE 11
+ln -sf baselibs_configs/baselibs_global-sle11.conf baselibs_global.conf
+%endif
+test -e baselibs_global.conf || exit 1
+%endif
+
+%check
+if [ `whoami` != "root" ]; then
+ echo "WARNING: Not building as root, tests did not run!"
+ exit 0
+fi
+if [ ! -f "%{buildroot}/usr/lib/build/configs/default.conf" ]; then
+ echo "WARNING: No default config, tests did not run!"
+ exit 0
+fi
+# get back the default.conf link
+cp -av %{buildroot}/usr/lib/build/configs/default.conf configs/
+# do not get confused when building this already with build:
+export BUILD_IGNORE_2ND_STAGE=1
+# use our own build code
+export BUILD_DIR=$PWD
+cd test
+# target is autodetected
+%if 0%{?sles_version}
+echo "SLES config differs currently on purpose between OBS and build script."
+echo "Skipping test case"
+exit 0
+%endif
+%if 0%{?qemu_user_space_build}
+echo "test suite is not prepared to run using qemu linux user"
+echo "Skipping test case"
+exit 0
+%endif
+# we need to patch the not packaged configs, due to the buildignore
+sed -i 's,build-mkbaselibs,,' ../configs/*.conf
+./testbuild.sh /.build.binaries/
+
+%files
+%defattr(-,root,root)
+%doc README
+/usr/bin/build
+/usr/bin/buildvc
+/usr/bin/unrpm
+/usr/lib/build
+%config(noreplace) /usr/lib/build/emulator/emulator.sh
+%{_mandir}/man1/build.1*
+%{_mandir}/man1/unrpm.1*
+%{_mandir}/man1/vc.1*
+%if 0%{?suse_version}
+%exclude /usr/lib/build/initvm.*
+%endif
+
+%if 0%{?suse_version} > 1120 || ! 0%{?suse_version}
+%exclude /usr/lib/build/mkbaselibs
+%exclude /usr/lib/build/baselibs*
+%exclude /usr/lib/build/mkdrpms
+
+%files mkbaselibs
+%defattr(-,root,root)
+%dir /usr/lib/build
+/usr/lib/build/mkbaselibs
+/usr/lib/build/baselibs*
+
+%files mkdrpms
+%defattr(-,root,root)
+%dir /usr/lib/build
+/usr/lib/build/mkdrpms
+%endif
+
+%if 0%{?suse_version}
+%files initvm-%{initvm_arch}
+%defattr(-,root,root)
+/usr/lib/build/initvm.*
+%endif
+
+%changelog
diff --git a/dist/debian.changelog b/dist/debian.changelog
new file mode 100644
index 0000000..101552f
--- /dev/null
+++ b/dist/debian.changelog
@@ -0,0 +1,201 @@
+build (20160531) unstable; urgency=low
+
+ * Update to current git trunk
+ - add sles11sp2 build config and adapt autodetection
+
+ -- Michael Schroeder <mls@suse.de> Mon, 10 Oct 2011 19:30:22 +0200
+
+build (2011.09.26-1) unstable; urgency=low
+
+ * Update to current git trunk
+
+ -- Adrian Schroeter <adrian@suse.de> Fri, 01 Jul 2010 10:03:54 +0200
+
+build (2011.07.01-1) unstable; urgency=low
+
+ * Update to current git trunk
+
+ -- Adrian Schroeter <adrian@suse.de> Fri, 01 Jul 2010 10:03:54 +0200
+
+build (2010.12.15-1) unstable; urgency=low
+
+ * Update to current git trunk
+ - support bsdtar for setting up build enviroment
+ - make expanddeps use the highest version of a package if multiple
+ versions aver available in a repository [bnc#656599]
+
+ -- Michael Schroeder <mls@suse.de> Wed, 15 Dec 2010 14:08:29 +0200
+
+build (2010.07.28-1) unstable; urgency=low
+
+ * Update to current git trunk
+ - document --repo and --dist
+ - update wiki links
+ - fix bugs in repo handling
+ - fix distribution autodetection code
+
+ -- Michael Schroeder <mls@suse.de> Wed, 28 Jul 2010 12:46:52 +0200
+
+build (2010.07.08-1) unstable; urgency=low
+
+ * Update to current git trunk
+
+ -- Adrian Schroeter <adrian@suse.de> Wed, 08 Jul 2010 10:03:54 +0200
+
+build (2010.06.29-1) unstable; urgency=low
+
+ * Update to current git trunk
+ - add 11.3 config
+ - fix repo creation in --noinit case
+ - support ovf files directly
+ - allow multiple --oldpackages
+ - delta rpm support
+
+ -- Adrian Schroeter <adrian@suse.de> Tue, 29 Jun 2010 10:03:54 +0200
+
+build (2010.02.02-1) unstable; urgency=low
+
+ * Update to current git trunk
+ - Support new kiwi 4.1 schema files
+
+ -- Adrian Schroeter <adrian@suse.de> Tue, 02 Feb 2010 10:03:54 +0200
+
+build (2009.09.23-1) unstable; urgency=low
+
+ * Update to current svn trunk
+
+ -- Michael Schroeder <mls@suse.de> Wed, 23 Sep 2009 12:03:54 +0200
+
+build (2009.04.20-1) unstable; urgency=low
+
+ * Update to current svn trunk
+
+ -- Adrian Schroeter <adrian@suse.de> Mon, 20 Feb 2009 08:27:13 +0200
+
+build (2009.02.20-1) unstable; urgency=low
+
+ * Fix kvm support together with Alexander
+ * Support for new disturl containing a complete pointer to build
+ service instance resource
+ * add support for package compare to allow Build Service to drop
+ same packages after build
+ * image repack support from Christoph
+
+ -- Adrian Schroeter <adrian@suse.de> Fri, 20 Feb 2009 08:27:13 +0200
+
+build (2007.09.14-1) unstable; urgency=low
+
+ * update to 2173:
+ - add sl10.3 config [#310089]
+ - also look for BuildRequires in subpackage definitions [#305568]
+ - allow removal of more config parameters
+
+ -- Michael Schroeder <mls@suse.de> Fri, 14 Sep 2007 18:27:13 +0200
+
+build (2007.08.02-1) unstable; urgency=low
+
+ * update to 1902:
+ - support 'order' config option
+ - support 'patterntype' config option
+ - new setdeps() method
+ - support for flexible query options
+ - support 'description' query
+ - fix bug in changelog2spec time cutoff
+ - make debtransform understand Debtransform-Tar/Debtransform-Files-Tar/
+ Debtransform-Series
+ - fix bug in substitutedeps
+
+ -- Michael Schroeder <mls@suse.de> Thu, 2 Aug 2007 15:58:48 +0200
+
+build (2007.06.13-1) unstable; urgency=low
+
+ * update to 1727:
+ - implement rpm installation order calculation in perl
+ - make substitute code modify requires, too
+ - add filelist query support
+ - add prereq parsing support
+ - speed up version comparison a bit
+
+ -- Michael Schroeder <mls@suse.de> Wed, 13 Jun 2007 17:18:17 +0100
+
+build (2007.05.10-1) unstable; urgency=low
+
+ * update to 1653:
+ - add _vendor to configs
+ - fix deban dependency compare
+ - allow not operator in configs
+ - fix build from source rpms
+
+ -- Michael Schroeder <mls@suse.de> Thu, 10 May 2007 20:02:29 +0100
+
+build (2007.04.12-1) unstable; urgency=low
+
+ * update to 1575:
+ - add --root to rpm call in rpm to work around a bug in rpm [#255720]
+
+ -- Michael Schroeder <mls@suse.de> Thu, 12 Apr 2007 16:22:51 +0100
+
+build (2007.04.05-1) unstable; urgency=low
+
+ * update to 1561:
+ - support architecture dependand requires in dsc files
+ - support "global" definitions for rpm
+ - support vminstall config option
+
+ -- Michael Schroeder <mls@suse.de> Thu, 5 Apr 2007 16:01:51 +0100
+
+build (2007.03.12-1) unstable; urgency=low
+
+ * update to r1419:
+ - fix buildroot in debtransform call
+ - obey version numbers when expanding
+
+ -- Michael Schroeder <mls@suse.de> Mon, 12 Mar 2007 15:42:48 +0100
+
+build (2007.03.02-1) unstable; urgency=low
+
+ * update
+ - transform suse changes file to rpm specfile format
+ - improved debian support
+
+ -- Michael Schroeder <mls@suse.de> Fri, 2 Mar 2007 21:22:41 +0100
+
+build (2007.01.26-1) unstable; urgency=low
+
+ * update to r1114
+ - re-add the lost unrpm script
+ - make exclarch an array
+ - remount root rw in xen case, needed if root is not reiserfs
+ - add repotype/runscripts options
+ - remove devs in sl10.1/10.2
+ - fix boolean test to make "00" false like rpm does
+ - add rpm_verscmp for version comparison
+ - runscripts
+ - macro blocks
+ - read_config_dist
+ - useful xen exit status
+ - add --kill
+ - update 10.2 config
+ - extend spec/dsc parser
+ - fixed two bugs in the specfile parser
+
+ -- Peter Poeml <poeml@suse.de> Fri, 26 Jan 2007 14:15:22 +0100
+
+build (2006.10.5-1) unstable; urgency=low
+
+ * update for fixed XEN build
+
+ -- Michael Schroeder <mls@suse.de> Thu, 5 Oct 2006 10:58:42 +0200
+
+build (2006.8.10-1) unstable; urgency=low
+
+ * update for fixed XEN build and proc mounting
+
+ -- Adrian Schroeter <adrian@suse.de> Thu, 10 Aug 2006 12:01:08 +0200
+
+build (2006.6.14-1) unstable; urgency=low
+
+ * Initial release based on build-2006.6.14-5.1.src.rpm
+
+ -- Rene Engelhard <rengelhard@suse.de> Thu, 22 Jun 2006 12:01:08 +0200
+
diff --git a/dist/debian.compat b/dist/debian.compat
new file mode 100644
index 0000000..7ed6ff8
--- /dev/null
+++ b/dist/debian.compat
@@ -0,0 +1 @@
+5
diff --git a/dist/debian.control b/dist/debian.control
new file mode 100644
index 0000000..4823cbe
--- /dev/null
+++ b/dist/debian.control
@@ -0,0 +1,18 @@
+Source: build
+Section: devel
+Priority: optional
+Maintainer: Adrian Schroeter <adrian@suse.de>
+Build-Depends: debhelper (>= 5)
+Standards-Version: 3.7.2
+
+Package: obs-build
+Architecture: all
+Depends: ${perl:Depends}, rpm
+Recommends: rpm2cpio
+Conflicts: build
+Replaces: build
+Provides: build
+Description: A script to build SUSE Linux RPMs
+ This package provides a script for building RPMs for SUSE Linux
+ in a chroot environment.
+
diff --git a/dist/debian.copyright b/dist/debian.copyright
new file mode 100644
index 0000000..7732754
--- /dev/null
+++ b/dist/debian.copyright
@@ -0,0 +1,21 @@
+This package was debianized by Rene Engelhard <rengelhard@suse.de> on
+Thu, 22 Jun 2006 12:01:08 +0200.
+
+It was downloaded from http://software.opensuse.org/download/openSUSE:/Tools/SUSE_Linux_Factory/src
+
+Upstream authors: Thorsten Kukuk <kukuk@suse.de>
+ Michael Schrter <mls@suse.de>
+ Bernhard Kaindl <bk@suse.de>
+ Mad Martin Jorgensen <mmj@suse.de>
+ Andreas Schwab <schwab@suse.de>
+ Rdiger Oertel <ro@suse.de>
+ Andreas Gruenbacher <agruen@suse.de>
+
+Copyright: (c) 1997-2007 SuSE GmbH Nuernberg, Germany
+
+License:
+
+GPL
+
+The Debian packaging is (C) 2006, Rene Engelhard <rengelhard@suse.de> and
+is licensed under the GPL, see `/usr/share/common-licenses/GPL'.
diff --git a/dist/debian.docs b/dist/debian.docs
new file mode 100644
index 0000000..e845566
--- /dev/null
+++ b/dist/debian.docs
@@ -0,0 +1 @@
+README
diff --git a/dist/debian.links b/dist/debian.links
new file mode 100644
index 0000000..03eb6de
--- /dev/null
+++ b/dist/debian.links
@@ -0,0 +1,2 @@
+usr/bin/build usr/bin/obs-build
+usr/lib/build usr/lib/obs-build
diff --git a/dist/debian.rules b/dist/debian.rules
new file mode 100644
index 0000000..fe59bc6
--- /dev/null
+++ b/dist/debian.rules
@@ -0,0 +1,65 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany
+# This file and all modifications and additions to the pristine package
+# are under the same license as the package itself.
+#
+# Please submit bugfixes or commens via http://bugs.opensuse.org
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+SHELL=/bin/bash
+
+configure: configure-stamp
+configure-stamp:
+ dh_testdir
+ touch configure-stamp
+
+
+build: build-stamp
+
+build-stamp: configure-stamp
+ dh_testdir
+ touch build-stamp
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp configure-stamp
+
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+ make DESTDIR=$(CURDIR)/debian/obs-build install
+
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs
+ dh_installdocs
+ dh_installexamples
+ dh_installman
+ dh_link
+ dh_strip
+ dh_compress
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary-indep: build install
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/download b/download
new file mode 100755
index 0000000..98328c9
--- /dev/null
+++ b/download
@@ -0,0 +1,77 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use LWP::UserAgent;
+use URI;
+use File::Path;
+use File::Basename;
+
+use strict;
+
+die "USAGE: $0 DIR URLS..." unless $#ARGV >= 1;
+
+my $dir = shift @ARGV;
+
+my $ua = LWP::UserAgent->new(
+ agent => "openSUSE build script",
+ timeout => 42,
+ ssl_opts => {
+ verify_hostname => 1
+ });
+
+for my $url (@ARGV) {
+ if ($url =~ /^zypp:\/\/([^\/]*)\/?/) {
+ use Build::Zypp;
+ 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 $u =~ /\/$/;
+ $url =~ s/^zypp:\/\/[^\/]*\/*//;
+ $url = URI->new($u.$url);
+ if ($url->scheme eq 'dir') {
+ my $dest = "$dir/".basename($url->path);
+ unlink($dest); # just in case
+ system('cp', $url->path, $dest) && die("cp $url->path $dest failed\n");
+ last;
+ }
+ } else {
+ $url = URI->new($url);
+ }
+ $ua->env_proxy;
+ my $dest = "$dir/".basename($url->path);
+ unlink($dest); # just in case
+ my $retry = 3;
+ while ($retry--) {
+ my $res = $ua->mirror($url, $dest);
+ last if $res->is_success;
+ # if it's a redirect we probably got a bad mirror and should just retry
+ die "requesting $url failed: ".$res->status_line."\n" unless $retry && $res->previous;
+ warn "retrying $url\n";
+ }
+}
+
+# vim:sw=2
diff --git a/dummyhttpserver b/dummyhttpserver
new file mode 100755
index 0000000..af26a8c
--- /dev/null
+++ b/dummyhttpserver
@@ -0,0 +1,191 @@
+#!/usr/bin/perl
+
+# dead-simple HTTP server
+# serves current directory on localhost:80
+
+use Socket;
+use POSIX;
+use Fcntl qw(:DEFAULT :flock);
+
+use strict;
+
+$| = 1;
+
+my ($build_root, $dir) = @ARGV;
+
+if (defined($build_root)) {
+ chroot($build_root) || die("chroot $build_root: $!\n");
+ chdir('/') || die("chdir /: $!\n");
+}
+if (defined($dir)) {
+ chdir($dir) || die("chdir $dir: $!\n");
+}
+
+my $tcpproto = getprotobyname('tcp');
+my $acceptsock;
+socket($acceptsock , PF_INET, SOCK_STREAM, $tcpproto) || die "socket: $!\n";
+setsockopt($acceptsock, SOL_SOCKET, SO_REUSEADDR, pack("l",1));
+bind($acceptsock, sockaddr_in(80, inet_aton('127.0.0.1'))) || die "bind: $!\n";
+listen($acceptsock , 512) || die "listen: $!\n";
+
+my $sock;
+my $status;
+
+sub reply {
+ my ($str, @hdrs) = @_;
+ if (@hdrs && $hdrs[0] =~ /^status: ((\d+).*)/i) {
+ $status = $2;
+ $hdrs[0] = "HTTP/1.1 $1";
+ $hdrs[0] =~ s/:/ /g;
+ } else {
+ $status = 200;
+ unshift @hdrs, "HTTP/1.1 200 OK";
+ }
+ push @hdrs, "Cache-Control: no-cache";
+ push @hdrs, "Connection: close";
+ push @hdrs, "Content-Length: ".length($str) if defined($str);
+ my $data = join("\r\n", @hdrs)."\r\n\r\n";
+ $data .= $str if defined $str;
+ fcntl($sock, F_SETFL,O_NONBLOCK);
+ my $dummy = '';
+ 1 while sysread($sock, $dummy, 1024, 0);
+ fcntl($sock, F_SETFL,0);
+ my $l;
+ while (length($data)) {
+ $l = syswrite($sock, $data, length($data));
+ die("write error: $!\n") unless $l;
+ $data = substr($data, $l);
+ }
+}
+
+sub reply_error {
+ my ($errstr) = @_;
+ my $code = 400;
+ my $tag = 'Error';
+ if ($errstr =~ /^(\d+)\s+([^\r\n]*)/) {
+ $code = $1;
+ $tag = $2;
+ } elsif ($errstr =~ /^([^\r\n]+)/) {
+ $tag = $1;
+ }
+ reply("$errstr\n", "Status: $code $tag", 'Content-Type: text/plain');
+}
+
+sub readrequest {
+ my $qu = '';
+ my $request;
+
+ while (1) {
+ if ($qu =~ /^(.*?)\r?\n/s) {
+ $request = $1;
+ last;
+ }
+ die($qu eq '' ? "empty query\n" : "received truncated query\n") if !sysread($sock, $qu, 1024, length($qu));
+ }
+ my ($act, $path, $vers, undef) = split(' ', $request, 4);
+ die("400 No method name\n") if !$act;
+ if ($vers) {
+ die("501 Unsupported method: $act\n") if $act ne 'GET' && $act ne 'HEAD';
+ # read in all headers
+ while ($qu !~ /^(.*?)\r?\n\r?\n(.*)$/s) {
+ die("501 received truncated query\n") if !sysread($sock, $qu, 1024, length($qu));
+ }
+ $qu =~ /^(.*?)\r?\n\r?\n(.*)$/s; # redo regexp to work around perl bug
+ $qu = $2;
+ } else {
+ die("501 Bad method, must be GET\n") if $act ne 'GET';
+ $qu = '';
+ }
+ my $query_string = '';
+ if ($path =~ /^(.*?)\?(.*)$/) {
+ $path = $1;
+ $query_string = $2;
+ }
+ $path =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge; # unescape path
+ die("501 invalid path\n") unless $path =~ /^\//s; # forbid relative paths
+ die("501 invalid path\n") if $path =~ /\0/s;
+ # do simple path substitutions
+ while (1) {
+ next if $path =~ s!//!/!;
+ next if $path =~ s!/\.(?:/|$)!/!;
+ next if $path =~ s!/[^/]+/\.\.(?:/|$)!/!;
+ next if $path =~ s!/\.\.(?:/|$)!/!;
+ last;
+ }
+ return ($path, $query_string, $qu);
+}
+
+sub escape {
+ my ($d) = @_;
+ $d =~ s/&/&amp;/sg;
+ $d =~ s/</&lt;/sg;
+ $d =~ s/>/&gt;/sg;
+ $d =~ s/"/&quot;/sg;
+ return $d;
+}
+
+while (1) {
+ my $peeraddr = accept($sock, $acceptsock);
+ next unless $peeraddr;
+ my $pid = fork();
+ last if defined($pid) && !$pid;
+ close $sock;
+ 1 while waitpid(-1, POSIX::WNOHANG) > 0;
+}
+close($acceptsock);
+
+my $path = '?';
+eval {
+ ($path) = readrequest();
+ my $lpath = ".$path";
+ if (-d $lpath) {
+ if ($path !~ /\/$/) {
+ my $rpath = "$path/";
+ $rpath =~ s/([\000-\040<>;\"#\?&\+=%[\177-\377])/sprintf("%%%02X",ord($1))/sge;
+;
+ reply('', 'Status: 301 Moved Permanently', "Location: $rpath");
+ } else {
+ my %d;
+ my $dir;
+ if (opendir($dir, $lpath)) {
+ %d = map {$_ => 1} readdir($dir);
+ closedir($dir);
+ }
+ delete $d{'.'};
+ delete $d{'..'};
+ my $body = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\"><html>\n";
+ $body .= "<title>Directory listing for ".escape($path)."</title>\n";
+ $body .= "<body>\n";
+ $body .= "<h2>Directory listing for ".escape($path)."</h2>\n";
+ $body .= "<hr>\n<ul>\n";
+ $body .= "<li><a href=\"".escape($_)."\">".escape($_)."</a>\n" for sort keys %d;
+ $body .= "</ul>\n<hr>\n</body>\n</html>\n";
+ reply($body, 'Content-type: text/html');
+ }
+ } elsif (-e _) {
+ my $f;
+ open($f, '<', $lpath) || die("500 $lpath: $!\n");
+ my @s = stat($f);
+ die("stat: $!\n") unless @s;
+ my $l = $s[7];
+ reply(undef, "Content-Length: $l", 'Content-Type: application/octet-stream');
+ my $data;
+ while (1) {
+ last unless $l;
+ my $r = sysread($f, $data, 8192);
+ $data = substr($data, 0, $l) if length($data) > $l;
+ $l -= length($data);
+ while (length($data)) {
+ my $l2 = syswrite($sock, $data, length($data));
+ die("socket write: $!\n") unless $l2;
+ $data = substr($data, $l2);
+ }
+ }
+ close($f);
+ } else {
+ die("404 File not found\n");
+ }
+};
+reply_error($@) if $@;
+close $sock;
+print "[$status $path]";
diff --git a/emulator/emulator.sh b/emulator/emulator.sh
new file mode 100755
index 0000000..3320f9f
--- /dev/null
+++ b/emulator/emulator.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+echo "ERROR: the emulator.sh script needs to be changed to support your emulator!"
+exit 1
+
+
+###
+### Example for the aarch64 emulator:
+###
+
+LOG=$(mktemp)
+./Foundation_v8 --image ./img-foundation.axf \
+ --block-device "$1" \
+ --network=none &> $LOG &
+while test 0$(grep -c terminal_0: $LOG ) -lt 1; do
+ echo ".."
+ sleep 1
+done
+cat $LOG
+# terminal_0: Listening for serial connection on port 5012
+PORT=$(grep terminal_0: $LOG | head -n 1 | cut -d " " -f 8)
+rm -f $LOG
+# telnet dies when emulator is quiting
+telnet 127.0.0.1 $PORT || exit 0
+
+
diff --git a/expanddeps b/expanddeps
new file mode 100755
index 0000000..ec0fe45
--- /dev/null
+++ b/expanddeps
@@ -0,0 +1,472 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use strict;
+
+use Build;
+
+my ($dist, $rpmdeps, $archs, $configdir, $useusedforbuild, $installonly, $noinstall, $isvm);
+my ($obspackage, $buildflavor);
+
+$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs';
+
+while (@ARGV) {
+ if ($ARGV[0] eq '--dist') {
+ shift @ARGV;
+ $dist = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--depfile') {
+ shift @ARGV;
+ $rpmdeps = 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 '--useusedforbuild') {
+ shift @ARGV;
+ $useusedforbuild = 1;
+ next;
+ }
+ if ($ARGV[0] eq '--define') {
+ shift @ARGV;
+ my $def = shift @ARGV;
+ Build::define($def);
+ next;
+ }
+ if ($ARGV[0] eq '--with') {
+ shift @ARGV;
+ my $def = shift @ARGV;
+ Build::define("_with_$def --with-$def");
+ next;
+ }
+ if ($ARGV[0] eq '--without') {
+ shift @ARGV;
+ my $def = shift @ARGV;
+ Build::define("_without_$def --without-$def");
+ next;
+ }
+ if ($ARGV[0] eq '--vm') {
+ shift @ARGV;
+ $isvm = 1;
+ next;
+ }
+ if ($ARGV[0] eq '--buildflavor') {
+ shift @ARGV;
+ $buildflavor = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--obspackage') {
+ shift @ARGV;
+ $obspackage = shift @ARGV;
+ next;
+ }
+ last;
+}
+
+$archs = '' unless defined $archs;
+die("you must specfiy a depfile!\n") unless defined $rpmdeps;
+
+# 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 $binarytype;
+my @archs = split(':', $archs);
+if ($recipe && $recipe =~ /(^|\/)PKGBUILD$/) {
+ push @archs, 'any' unless grep {$_ eq 'any'} @archs;
+ $binarytype = 'arch';
+} elsif ($recipe && $recipe =~ /\.dsc$/) {
+ push @archs, 'all' unless grep {$_ eq 'noarch'} @archs;
+ $binarytype = 'deb';
+} else {
+ push @archs, 'noarch' unless grep {$_ eq 'noarch'} @archs;
+ $binarytype = 'rpm';
+}
+
+# read dist if we can
+my $cf;
+if (defined($dist) && $dist ne '') {
+ $cf = Build::read_config_dist($dist, $archs[0], $configdir);
+ $binarytype = $cf->{'binarytype'} if $cf->{'binarytype'} && $cf->{'binarytype'} ne 'UNDEFINED';
+}
+
+my (%fn, %prov, %req, %con, %obs, %rec, %sup);
+
+my %packs;
+my %repo;
+my %ids;
+
+my %packs_arch;
+my %packs_done;
+
+open(F, '<', $rpmdeps) || die("$rpmdeps: $!\n");
+# WARNING: the following code assumes that the 'I' tag comes last
+my ($pkgF, $pkgP, $pkgR, $pkgC, $pkgO, $pkgr, $pkgs);
+
+my $verscmp = \&Build::Rpm::verscmp;
+
+if ($binarytype && $binarytype eq 'deb') {
+ $verscmp = \&Build::Deb::verscmp;
+ for my $arch (@archs) {
+ $arch = Build::Deb::basearch($arch) unless $arch =~ /^i[456]86$/;
+ }
+}
+
+while(<F>) {
+ chomp;
+ if (/^F:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
+ $pkgF = $2;
+ } elsif (/^P:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
+ $pkgP = $2;
+ } elsif (/^R:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
+ $pkgR = $2;
+ } elsif (/^C:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
+ $pkgC = $2;
+ } elsif (/^O:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
+ $pkgO = $2;
+ } elsif (/^r:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
+ $pkgr = $2;
+ } elsif (/^s:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
+ $pkgs = $2;
+ } elsif (/^I:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
+ if (!$packs_done{$1}) {
+ my ($i, $newid) = ($1, $2);
+ undef $i unless !$ids{$i} || $verscmp->($ids{$i}, $newid) < 0;
+ undef $i unless defined($pkgF) && defined($pkgP);
+ if (defined $i) {
+ $i =~ /^(.*)\.([^\.]+)$/ or die;
+ push @{$packs_arch{$2}}, $1;
+ $ids{$i} = $newid;
+ $fn{$i} = $pkgF;
+ $prov{$i} = $pkgP;
+ delete $req{$i};
+ delete $rec{$i};
+ delete $con{$i};
+ delete $obs{$i};
+ delete $rec{$i};
+ delete $sup{$i};
+ $req{$i} = $pkgR;
+ $con{$i} = $pkgC if defined $pkgC;
+ $obs{$i} = $pkgO if defined $pkgO;
+ $rec{$i} = $pkgr if defined $pkgr;
+ $sup{$i} = $pkgs if defined $pkgs;
+ }
+ }
+ undef $pkgF;
+ undef $pkgP;
+ undef $pkgR;
+ undef $pkgC;
+ undef $pkgO;
+ undef $pkgr;
+ undef $pkgs;
+ } elsif ($_ eq 'D:') {
+ %packs_done = %ids;
+ }
+}
+close F;
+
+for my $arch (@archs) {
+ $packs{$_} ||= "$_.$arch" for @{$packs_arch{$arch} || []};
+}
+
+# XXX: move to separate tool
+if (!defined($dist) || $dist eq '') {
+ my $rpmarch = (grep {$fn{"rpm.$_"}} @archs)[0];
+ if (!$rpmarch) {
+ $dist = 'default';
+ } else {
+ my $rpmfn = $fn{"rpm.$rpmarch"};
+ if ($rpmfn =~ /^[a-z]+:\/\//) {
+ require File::Temp;
+ my $tmpdir = File::Temp::tempdir('CLEANUP' => 1);
+ $rpmfn =~ s/.*\//$tmpdir\// unless system("$INC[0]/download", $tmpdir, $rpmfn);
+ }
+ my $rpmdist = '';
+ if ($rpmfn =~ /^\// && -e $rpmfn) {
+ my %res = Build::Rpm::rpmq($rpmfn, 1010);
+ $rpmdist = $res{1010}->[0] || '';
+ }
+ $dist = Build::dist_canon($rpmdist, $archs[0]);
+ # need some extra work for sles11 :(
+ if ($dist =~ /^sles11-/) {
+ my %res = Build::Rpm::rpmq($rpmfn, 1049);
+ $dist =~ s/^sles11-/sles11sp2-/ if grep {/^liblzma/} @{$res{1049} || []};
+ }
+ }
+ print STDERR "Warning: distribution not specified, assuming '$dist' (see $configdir).\n";
+}
+
+$cf ||= Build::read_config_dist($dist, $archs[0], $configdir);
+$cf->{'warnings'} = 1;
+$cf->{'buildflavor'} = $buildflavor if defined $buildflavor;
+$cf->{'obspackage'} = $obspackage if defined $obspackage;
+
+my $dofileprovides = %{$cf->{'fileprovides'}};
+$dofileprovides = 1 if ($binarytype || 'rpm') ne 'rpm';
+
+for my $pack (keys %packs) {
+ my $r = {};
+ my (@s, $s, @pr, @re, @co, @ob, @rc, @su);
+ @s = split(' ', $prov{$packs{$pack}} || '');
+ while (@s) {
+ $s = shift @s;
+ next if !$dofileprovides && $s =~ /^\//;
+ if ($s =~ /^rpmlib\(/) {
+ splice(@s, 0, 2);
+ next;
+ }
+ push @pr, $s;
+ while (@s && $s[0] =~ /^[\(<=>|]/) {
+ $pr[-1] .= " $s[0] $s[1]";
+ $pr[-1] =~ s/ \((.*)\)/ $1/;
+ $pr[-1] =~ s/(<|>){2}/$1/;
+ splice(@s, 0, 2);
+ }
+ }
+ @s = split(' ', $req{$packs{$pack}} || '');
+ while (@s) {
+ $s = shift @s;
+ next if !$dofileprovides && $s =~ /^\//;
+ if ($s =~ /^rpmlib\(/) {
+ splice(@s, 0, 2);
+ next;
+ }
+ push @re, $s;
+ while (@s && $s[0] =~ /^[\(<=>|]/) {
+ $re[-1] .= " $s[0] $s[1]";
+ $re[-1] =~ s/ \((.*)\)/ $1/;
+ $re[-1] =~ s/(<|>){2}/$1/;
+ splice(@s, 0, 2);
+ }
+ }
+ @s = split(' ', $con{$packs{$pack}} || '');
+ while (@s) {
+ $s = shift @s;
+ next if !$dofileprovides && $s =~ /^\//;
+ push @co, $s;
+ while (@s && $s[0] =~ /^[\(<=>|]/) {
+ $co[-1] .= " $s[0] $s[1]";
+ $co[-1] =~ s/ \((.*)\)/ $1/;
+ $co[-1] =~ s/(<|>){2}/$1/;
+ splice(@s, 0, 2);
+ }
+ }
+ @s = split(' ', $obs{$packs{$pack}} || '');
+ while (@s) {
+ $s = shift @s;
+ next if !$dofileprovides && $s =~ /^\//;
+ push @ob, $s;
+ while (@s && $s[0] =~ /^[\(<=>|]/) {
+ $ob[-1] .= " $s[0] $s[1]";
+ $ob[-1] =~ s/ \((.*)\)/ $1/;
+ $ob[-1] =~ s/(<|>){2}/$1/;
+ splice(@s, 0, 2);
+ }
+ }
+ @s = split(' ', $rec{$packs{$pack}} || '');
+ while (@s) {
+ $s = shift @s;
+ next if !$dofileprovides && $s =~ /^\//;
+ if ($s =~ /^rpmlib\(/) {
+ splice(@s, 0, 2);
+ next;
+ }
+ push @rc, $s;
+ while (@s && $s[0] =~ /^[\(<=>|]/) {
+ $rc[-1] .= " $s[0] $s[1]";
+ $rc[-1] =~ s/ \((.*)\)/ $1/;
+ $rc[-1] =~ s/(<|>){2}/$1/;
+ splice(@s, 0, 2);
+ }
+ }
+ @s = split(' ', $sup{$packs{$pack}} || '');
+ while (@s) {
+ $s = shift @s;
+ next if !$dofileprovides && $s =~ /^\//;
+ if ($s =~ /^rpmlib\(/) {
+ splice(@s, 0, 2);
+ next;
+ }
+ push @su, $s;
+ while (@s && $s[0] =~ /^[\(<=>|]/) {
+ $su[-1] .= " $s[0] $s[1]";
+ $su[-1] =~ s/ \((.*)\)/ $1/;
+ $su[-1] =~ s/(<|>){2}/$1/;
+ splice(@s, 0, 2);
+ }
+ }
+ $r->{'provides'} = \@pr;
+ $r->{'requires'} = \@re;
+ $r->{'conflicts'} = \@co;
+ $r->{'obsoletes'} = \@ob;
+ $r->{'recommends'} = \@rc;
+ $r->{'supplements'} = \@su;
+ $repo{$pack} = $r;
+}
+
+
+#######################################################################
+
+sub print_rpmlist {
+ for (@_) {
+ print "$_ $fn{$packs{$_}}\n";
+ print "rpmid: $_:$ids{$packs{$_}}\n" if exists $ids{$packs{$_}};
+ }
+ print "preinstall: @{$cf->{'preinstall'} || []}\n";
+ 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 recipe file for --usedforbuild\n") unless defined $recipe;
+ local *F;
+ open(F, '<', $recipe) || die("$recipe: $!\n");
+ my @usedforbuild;
+ my @buildrequires;
+ while(<F>) {
+ chomp;
+ if (/^#\s*usedforbuild\s*(.*)$/) {
+ push @usedforbuild, split(' ', $1);
+ }
+ if (/^buildrequires:\s*(.*)$/i) {
+ push @buildrequires, split(' ', $1);
+ }
+ }
+ close F;
+ @usedforbuild = @buildrequires unless @usedforbuild;
+ @usedforbuild = Build::unify(@usedforbuild) if @usedforbuild;
+ my @errors;
+ for (@usedforbuild) {
+ push @errors, "package $_ not found" unless $packs{$_} && $fn{$packs{$_}};
+ }
+ if (@errors) {
+ print STDERR "expansion error\n";
+ print STDERR " $_\n" for @errors;
+ exit(1);
+ }
+ print_rpmlist(@usedforbuild);
+ exit(0);
+}
+
+#######################################################################
+
+my $subpacks = [];
+
+my $buildtype = '';
+my $extrasysdeps;
+
+if ($recipe) {
+ my $d = Build::parse($cf, $recipe) || {};
+ $buildtype = Build::recipe2buildtype($recipe) || '';
+ $cf->{'type'} = $buildtype if $buildtype;
+ if ($buildtype eq 'kiwi') {
+ # lets see if this is a product or image build
+ $buildtype = $d->{'imagetype'} && $d->{'imagetype'}->[0] eq 'product' ? 'kiwi-product' : 'kiwi-image';
+ $extrasysdeps = [ grep {/^kiwi-.*:/} @{$d->{'deps'} || []} ];
+ }
+ $subpacks = $d->{'subpacks'};
+ unshift @extradeps, @{$d->{'deps'} || []};
+ if ($d->{'prereqs'}) {
+ my %deps = map {$_ => 1} (@extradeps, @{$d->{'subpacks'} || []});
+ push @extradeps, '--directdepsend--', grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}};
+ }
+}
+
+Build::readdeps($cf, undef, \%repo);
+
+#######################################################################
+
+my @sysdeps = Build::get_sysbuild($cf, $buildtype, $extrasysdeps);
+
+if ($buildtype eq 'kiwi-image' || $buildtype eq 'kiwi-product') {
+ if (!shift @sysdeps) {
+ print STDERR "expansion error\n";
+ print STDERR " $_\n" for @sysdeps;
+ exit(1);
+ }
+ # just use the sysdeps for now, ignore real deps
+ print_rpmlist(@sysdeps);
+ exit(0);
+}
+
+push @extradeps, '--ignoreignore--' if @sysdeps;
+my @bdeps = Build::get_build($cf, $subpacks, @extradeps);
+
+if (!shift @bdeps) {
+ print STDERR "expansion error\n";
+ print STDERR " $_\n" for @bdeps;
+ exit(1);
+}
+
+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);
+}
+
+# get preinstalls/vminstalls and check if the packages exist
+my @xdeps = Build::get_preinstalls($cf);
+push @xdeps, Build::get_vminstalls($cf) if $isvm;
+my @missing = grep {!$packs{$_}} @xdeps;
+if (@missing) {
+ @missing = sort(Build::unify(@missing));
+ print STDERR "expansion error\n";
+ print STDERR " missing pre/vminstalls: ".join(', ', @missing)."\n";
+ exit(1);
+}
+
+# make sure all preinstalls/vminstalls are in bdeps
+@bdeps = Build::unify(@bdeps, @xdeps);
+
+print_rpmlist(@bdeps);
diff --git a/extractbuild b/extractbuild
new file mode 100755
index 0000000..837f861
--- /dev/null
+++ b/extractbuild
@@ -0,0 +1,150 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2018 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+use strict;
+
+# buffer size for reading
+my $bufsize = 4*1024*1024;
+
+my ($opt_skip, $opt_disk, $opt_input, $opt_verbose);
+$opt_verbose = 0;
+
+while (@ARGV) {
+ if ($ARGV[0] eq '--skip') {
+ shift @ARGV;
+ $opt_skip = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--disk') {
+ shift @ARGV;
+ $opt_disk = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--input') {
+ shift @ARGV;
+ $opt_input = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--verbose' || $ARGV[0] eq '-v') {
+ shift @ARGV;
+ $opt_verbose++;
+ next;
+ }
+ last;
+}
+
+die "need to specify disk image\n" unless $opt_disk;
+
+open(F, '<', $opt_disk) || die "$opt_disk: $!\n";
+
+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 "seek: $!\n";
+}
+
+my %done;
+while (<S>) {
+ chomp;
+ last unless length $_;
+ 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' (contains \\0)\n") if $file =~ /\0/;
+ die("already processed: $file\n") if $done{$file};
+ 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 || $file =~ /^KIWI\/[^\/]*$/);
+ 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 (contains \\0)\n") if $target =~ /\0/;
+ 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';
+ print "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//);
+ $done{$file} = 'f';
+ open (O, '>', $file) or die "$file: $!\n";
+ if ($filesize == 0) {
+ close(O) || die("$file: close error: $!\n");
+ next;
+ }
+ $blksize = int($blksize);
+ die "$file: invalid block size $blksize\n" unless $blksize > 0 && $blksize <= $bufsize;
+ my $needtruncate;
+ my $left = $filesize;
+ for my $block (@blocks) {
+ die("bad extent '$block'\n") unless $block =~ /^(\d+)(?::(\d+))?(?:-(\d+)(?::(\d+))?)?$/;
+ my ($startblk, $startoff, $endblk, $endoff) = ($1, $2, $3, $4);
+ $startoff = 0 unless defined $startoff;
+ $endblk = $startblk unless defined $endblk;
+ $endoff = $blksize - 1 unless defined $endoff;
+ my $start = $startblk * $blksize + $startoff;
+ my $len = $endblk * $blksize + $endoff + 1 - $start;
+ die "$file: bad length\n" if $len <= 0;
+ die "$file: extent is outside of file\n" if $left <= 0;
+ $len = $left if $len > $left; # it's ok to overshoot the last block
+ $left -= $len;
+ if ($start == 0) { # a hole!
+ seek(O, $len, 1);
+ $needtruncate = 1;
+ next;
+ }
+ $needtruncate = undef;
+ seek(F, $start, 0) || die "$file: seek: $!\n";
+ while ($len > 0) {
+ my $size = $len > $bufsize ? $bufsize : $len;
+ my $buf;
+ (sysread(F, $buf, $size) || 0) == $size || die("$file: read: $!\n");
+ (syswrite(O, $buf) || 0) == length($buf) || die("$file: write error\n");
+ $len -= $size;
+ }
+ }
+ truncate(O, $filesize) if $needtruncate;
+ close(O) || die("$file: close error: $!\n");
+ # sanity check
+ die "$file: invalid file size ($left bytes left)\n" if $left != 0;
+}
diff --git a/getbinaryid b/getbinaryid
new file mode 100755
index 0000000..a85df82
--- /dev/null
+++ b/getbinaryid
@@ -0,0 +1,77 @@
+#!/usr/bin/perl
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use Build;
+use strict;
+
+my $createmeta;
+my $manifest;
+
+while (@ARGV) {
+ if ($ARGV[0] eq '--createmeta')
+ {
+ shift @ARGV;
+ $createmeta = 1;
+ next;
+ }
+ if ($ARGV[0] eq '--manifest')
+ {
+ shift @ARGV;
+ $manifest = shift @ARGV;
+ next;
+ }
+ last;
+}
+
+my @files;
+if ($manifest) {
+ if ($manifest eq '-') {
+ @files = <STDIN>;
+ } else {
+ local *F;
+ open(F, '<', $manifest) || die("$manifest: $!\n");
+ @files = <F>;
+ close F;
+ }
+ chomp @files;
+}
+push @files, @ARGV;
+
+for my $file (@files) {
+ my $sig = Build::queryhdrmd5($file);
+ die("$file: no signature available\n") unless $sig;
+ if ($createmeta) {
+ local *F;
+ my $mf = $file;
+ $mf =~ s/\.[^\.]*$//;
+ $mf .= ".meta";
+ open(F, '>', $mf) || die("$mf: $!\n");
+ print F "$sig sigmd5\n";
+ close(F) || die("$mf: $!\n");
+ } else {
+ print "$sig\n";
+ }
+}
diff --git a/getbuildids b/getbuildids
new file mode 100755
index 0000000..e9cef3f
--- /dev/null
+++ b/getbuildids
@@ -0,0 +1,79 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 2016 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use Build;
+use strict;
+
+sub getbuildid {
+ my ($pkg) = @_;
+ my $d = Build::query($pkg, 'evra' => 1, 'buildtime' => 1);
+ return $d ? Build::getbuildid($d) : undef;
+}
+
+if (@ARGV && $ARGV[0] eq 'cachecheck') {
+ my $pkg;
+ my $buildid;
+ my $dst;
+ while (<STDIN>) {
+ chomp;
+ if (/^PKG (\S+) (.+)$/) {
+ ($pkg, $buildid, $dst) = ($1, $2, undef);
+ } elsif (/^PKG (\S+)$/) {
+ ($pkg, $buildid, $dst) = ($1, undef, undef);
+ } elsif (/^DST (.+)$/) {
+ $dst = $1;
+ unlink($dst) if -e $dst;
+ } elsif (/^CACHE (.+)$/) {
+ next unless $dst;
+ my $cpkg = $1;
+ next unless -s $cpkg;
+ if ($buildid) {
+ my $bid = getbuildid($cpkg);
+ next unless $bid;
+ if ($bid =~ / 0-/) {
+ my $buildid2 = $buildid;
+ $buildid2 =~ s/ .*?-/0-/;
+ next if $bid ne $buildid2;
+ } else {
+ next if $bid ne $buildid;
+ }
+ }
+ symlink($cpkg, $dst);
+ $dst = undef; # first hit wins
+ }
+ }
+ exit(0);
+}
+
+while (<STDIN>) {
+ chomp;
+ my $dst = $_;
+ my $buildid = getbuildid($dst);
+ next unless $buildid;
+ open(F, '>', "$dst.buildid") || next;
+ print F "$buildid\n";
+ close(F);
+}
diff --git a/help b/help
new file mode 100644
index 0000000..4aadc0c
--- /dev/null
+++ b/help
@@ -0,0 +1,8 @@
+Start the building with this command from the obs-build root directory:
+
+BUILD_DIR=$PWD BUILD_ROOT=/tmp/build/ ./build --cachedir=/tmp/build/cache obs_example/Dockerfile
+
+
+Run the parser with an one liner (against the obs_example/Dockerfile):
+
+perl -e "use Cwd 'abs_path'; use lib abs_path('Build'); use Build::Docker; Build::Docker::parse('', abs_path('obs_example/Dockerfile'))"
diff --git a/init_buildsystem b/init_buildsystem
new file mode 100755
index 0000000..23e1c40
--- /dev/null
+++ b/init_buildsystem
@@ -0,0 +1,1099 @@
+#!/bin/bash
+# Script to create a complete system to build packages in a chroot
+# environment. This script ensures, that all packages given as
+# parameter are installed. All other packges will be deleted.
+#
+# BUILD_ROOT here the packages will be installed/deleted
+# BUILD_RPMS here we get our packages to install (obsolete)
+# BUILD_ARCH path of the architectures we try
+# BUILD_DIST distribution to build for (will be guessed if not set)
+#
+################################################################
+#
+# Copyright (c) 1997-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+#
+# needed globals variables
+#
+export SRC
+export BUILD_DIR=${BUILD_DIR:-/usr/lib/build}
+PATH="$BUILD_DIR:$PATH"
+
+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=()
+repos=()
+
+. $BUILD_DIR/common_functions || exit 1
+
+# should RPMs be installed with --force ?
+USE_FORCE=false
+PREPARE_VM=
+USEUSEDFORBUILD=
+LIST_STATE=
+RPMLIST=
+CLEAN_BUILD=
+CREATE_BUILD_BINARIES=
+DLNOSIGNATURE=
+CACHE_DIR=/var/cache/build
+test -z "$CONFIG_DIR" && CONFIG_DIR="$BUILD_DIR/configs"
+
+while test -n "$1" ; do
+ case "$1" in
+ --prepare)
+ shift
+ PREPARE_VM=true
+ ;;
+ --create-build-binaries)
+ shift
+ CREATE_BUILD_BINARIES=true
+ ;;
+ --useusedforbuild)
+ shift
+ USEUSEDFORBUILD=--useusedforbuild
+ ;;
+ --list-state)
+ shift
+ LIST_STATE=true
+ ;;
+ --rpmlist)
+ shift
+ RPMLIST=$1
+ shift
+ ;;
+ --define|--with|--without|--buildflavor|--obspackage)
+ definesnstuff[${#definesnstuff[@]}]="$1";
+ definesnstuff[${#definesnstuff[@]}]="$2";
+ shift 2
+ ;;
+ --repository|--repo)
+ repos[${#repos[@]}]="$2";
+ shift 2
+ ;;
+ --clean)
+ CLEAN_BUILD="$1"
+ shift
+ ;;
+ --cachedir)
+ CACHE_DIR="$2"
+ shift 2
+ ;;
+ --configdir)
+ CONFIG_DIR="$2"
+ shift 2
+ ;;
+ --nosignature)
+ shift
+ DLNOSIGNATURE="--nosignature"
+ ;;
+ --root)
+ BUILD_ROOT="$2"
+ shift 2
+ ;;
+ --arch)
+ BUILD_ARCH="$2"
+ shift 2
+ ;;
+ --dist)
+ BUILD_DIST="$2"
+ shift 2
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+PKGS=("$@")
+
+if test -z "$BUILD_ROOT" ; then
+ echo "Please specify a build root!"
+ exit 1
+fi
+
+BUILD_IS_RUNNING=$BUILD_ROOT/not-ready
+TMPFILE=$BUILD_ROOT/tmpfile
+
+#
+# needed functions
+#
+
+cleanup_and_exit() {
+ trap EXIT
+ test -z "$1" && set 0
+ if test -n "$2" ; then
+ if test "$1" -ne 0 ; then
+ echo "$2" >&2
+ else
+ echo "$2"
+ fi
+ fi
+ test "$BUILD_ROOT" = / -a -n "$browner" && chown "$browner" "$BUILD_ROOT"
+ # umount so init_buildsystem can be used standalone
+ if test -n "$BUILD_ROOT" -a "$BUILD_ROOT" != / ; then
+# XXX: use stat -f /dev/pts/ -c %T to check whether it's mounted and not suppress errors 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/mnt" 2> /dev/null || true
+ fi
+ exit $1
+}
+
+clean_build_root() {
+ if test -n "$BUILD_ROOT" -a "$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*
+ fi
+}
+
+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
+ echo "Error: setting up a VM requires bsdtar for security reasons."
+ echo "Please install bsdtar."
+ cleanup_and_exit 1
+ fi
+}
+
+preinstall_image_filter() {
+ for PKG in "$@" ; do
+ test -e "$BUILD_ROOT/.preinstall_image/$PKG" && continue
+ echo $PKG
+ done
+}
+
+preinstall_image() {
+ check_exit
+ 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"
+ else
+ unsafe_preinstall_check
+ TAR="tar -x"
+ fi
+ # pipe output through perl to print a dot every 1000 lines
+ if ! $TAR -z --exclude .build --exclude .init_b_cache -f "$BUILD_ROOT/.init_b_cache/rpms/$1" -v > >(tee "$BUILD_ROOT/.preinstallimage.unpack" | perl -e '$|=1; my $done=0; $done++ % 1000 or print "." while <STDIN>; print "\n";') 2>&1 ; then
+ echo "unpack failed."
+ test -e "$BUILD_ROOT/.preinstallimage.unpack" && cat "$BUILD_ROOT/.preinstallimage.unpack"
+ cleanup_and_exit 1
+ fi
+ rm -f "$BUILD_ROOT/.preinstallimage.unpack"
+}
+
+preinstall() {
+ local PKG="$1"
+ check_exit
+ 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-"
+ TAR="/usr/bin/bsdtar -P --chroot -o --numeric-owner -x"
+ else
+ unsafe_preinstall_check
+ CPIO="cpio --extract --unconditional --preserve-modification-time --make-directories --no-absolute-filenames --quiet"
+ TAR="tar -x"
+ fi
+ pkg_preinstall
+}
+
+run_pkg_scripts() {
+ chroot $BUILD_ROOT /sbin/ldconfig 2>/dev/null
+ for PKG in $PACKAGES_TO_RUNSCRIPTS ; do
+ pkg_runscripts
+ check_exit
+ done
+}
+
+reorder() {
+ test -z "$*" && return
+ rm -f $BUILD_ROOT/.init_b_cache/order.manifest
+ for PKG in "$@" ; do
+ echo "$PKG" >> $BUILD_ROOT/.init_b_cache/order.manifest
+ done
+ $BUILD_DIR/order --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir $CONFIG_DIR --manifest $BUILD_ROOT/.init_b_cache/order.manifest $BUILD_ROOT/.init_b_cache/rpms || touch $BUILD_ROOT/exit
+ rm -f $BUILD_ROOT/.init_b_cache/order.manifest
+}
+
+create_devs() {
+ local com file mode arg
+
+ mkdir -m 755 -p $BUILD_ROOT/dev/pts
+ 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
+ if test $com = ln ; then
+ ln -s $arg $BUILD_ROOT/dev/$file
+ continue
+ fi
+ $com -m $mode $BUILD_ROOT/dev/$file $arg
+ done << DEVLIST
+ mknod null 666 c 1 3
+ mknod zero 666 c 1 5
+ mknod full 622 c 1 7
+ mknod random 666 c 1 8
+ mknod urandom 644 c 1 9
+ mknod tty 666 c 5 0
+ mknod ptmx 666 c 5 2
+ mknod loop-control 600 c 10 237
+ mknod loop0 640 b 7 0
+ mknod loop1 640 b 7 1
+ mknod loop2 640 b 7 2
+ mknod loop3 640 b 7 3
+ ln fd 777 /proc/self/fd
+ ln stdin 777 fd/0
+ ln stdout 777 fd/1
+ ln stderr 777 fd/2
+DEVLIST
+}
+
+# check whether the repo list contains a plain "zypp://". Add all
+# enabled zypp repos in this case
+expand_plain_zypp_repo() {
+ local i j
+ r=()
+ for i in "${repos[@]}"; do
+ if test "$i" = "zypp://" ; then
+ for j in $($BUILD_DIR/createzyppdeps --listrepos) ; do
+ r=("${r[@]}" "zypp://$j")
+ done
+ else
+ r=("${r[@]}" "$i")
+ fi
+ done
+ repos=("${r[@]}")
+}
+
+create_cache_file() {
+ local findonly=
+ expand_plain_zypp_repo
+
+ # check if we can reuse the old cache file
+ 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 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#*://}" -a "${SRC#zypp://}" = "$SRC" ; then
+ rm -f $CACHE_FILE.id
+ break
+ fi
+ done
+ fi
+ if test -f $CACHE_FILE.id ; then
+ return
+ fi
+
+ # nope, generate a new cache file
+ test -z "$LIST_STATE" && echo initializing $CACHE_FILE ...
+
+ # figure out a repository type default
+ REPOTYPE=
+ if test -n "$BUILD_DIST" ; then
+ for i in `queryconfig repotype --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"` ; do
+ case $i in
+ arch|debian|hdlist2|rpm-md) REPOTYPE=$i ;;
+ esac
+ test -n "$REPOTYPE" && break
+ done
+ if test -z "$REPOTYPE"; then
+ BINTYPE=`queryconfig binarytype --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"`
+ case "$BINTYPE" in
+ arch) REPOTYPE=arch ;;
+ deb) REPOTYPE=debian ;;
+ esac
+ fi
+ fi
+ if test -z "$REPOTYPE" ; then
+ # check the first init_buildsystem arg, maybe it is a recipe
+ case ${PKGS[0]} in
+ *.spec)
+ REPOTYPE=rpm-md ;;
+ *.dsc)
+ REPOTYPE=debian ;;
+ */PKGBUILD|PKGBUILD|*/_service:*:PKGBUILD|_service:*:PKGBUILD)
+ REPOTYPE=arch ;;
+ esac
+ fi
+ for SRC in "${repos[@]}" -- ${BUILD_RPMS//:/ /}; do
+ if test "$SRC" = '--' ; then
+ findonly=1
+ continue
+ fi
+ SRCREPOTYPE=$REPOTYPE
+ case $SRC in
+ arch@* | debian@* | hdlist2@* | rpmmd@* | rpm-md@* | suse@*)
+ SRCREPOTYPE=${SRC%%@*}
+ SRC=${SRC#*@}
+ ;;
+ esac
+ test -z "$SRC" && SRC=`pwd`
+ 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")"
+ if test "$SRCREPOTYPE" = arch ; then
+ set -- $BUILD_DIR/createarchdeps --cachedir="$CACHE_DIR" "$SRC"
+ elif test "$SRCREPOTYPE" = debian ; then
+ set -- $BUILD_DIR/createdebdeps --cachedir="$CACHE_DIR" --archpath "$BUILD_ARCH" "$SRC"
+ elif test "$SRCREPOTYPE" = suse ; then
+ set -- $BUILD_DIR/createyastdeps --cachedir="$CACHE_DIR" "$SRC"
+ elif test "$SRCREPOTYPE" = hdlist2 ; then
+ set -- $BUILD_DIR/createmdkdeps --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
+ cleanup_and_exit 1 "*** $SRC does not exist"
+ 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 test -z "$findonly" -a -e "$SRC"/repodata/repomd.xml ; then
+ set -- $BUILD_DIR/createrepomddeps "$SRC"
+ else
+ set -- $BUILD_DIR/createdirdeps --oldfile "$CACHE_FILE" "$SRC"
+ fi
+ echo "$@" >&2
+ "$@" || cleanup_and_exit 1
+ echo D:
+ done > $CACHE_FILE.new
+
+ mv $CACHE_FILE.new $CACHE_FILE
+ echo "${repos[*]} ${BUILD_RPMS//:/ /}" > $CACHE_FILE.id
+}
+
+fail_exit() {
+ cleanup_and_exit 1
+}
+
+# modifies $SRC
+downloadpkg() {
+ local url="$1"
+
+ case $url in
+ zypp://* | http://* | https://* | ftp://* | ftps://*) ;;
+ *) cleanup_and_exit 1 "Invalid url: $url" ;;
+ esac
+
+ local cachedir="$(getcachedir "$url")"
+ local name="$(basename "$url")"
+ name=${name/%.pkg.tar.?z/.arch}
+ SRC="$cachedir/$name"
+ local destdir="$cachedir/tmp"
+ mkdir -p "$destdir"
+ echo "downloading $url ... ";
+ $BUILD_DIR/download "$destdir" "$url" || cleanup_and_exit 1
+ local destfile="$destdir/${url##*/}"
+ if test ! -e "$destfile" ; then
+ cleanup_and_exit 1 "expected $destfile after download but it's missing"
+ fi
+ # for rpm check integrity and the signature
+ case $destfile in
+ *.rpm)
+ rpm -K $DLNOSIGNATURE "$destfile" > $destfile.v || { echo "rpm verify failed" >&2; rm -rf "$destdir"; cleanup_and_exit 1; }
+ if grep "NOT OK" $destfile.v; then
+ rm -rf "$destdir"
+ cleanup_and_exit 1
+ fi
+ rm -f "$destfile.v"
+ ;;
+ esac
+ mv "$destfile" "$SRC" || cleanup_and_exit 1
+}
+
+getcachedir() {
+ local url=$1
+ for repo in "${repos[@]}" ; do
+ case $repo in
+ arch@* | debian@* | hdlist2@* | rpmmd@* | rpm-md@* | suse@*) repo=${repo#*@} ;;
+ esac
+ if test "${url:0:${#repo}}" == "$repo" ; then
+ read repoid dummy < <(echo -n "$repo" | md5sum)
+ echo "$CACHE_DIR/$repoid"
+ break
+ fi
+ done
+}
+
+set_build_arch
+
+trap fail_exit EXIT
+
+if test "$BUILD_ROOT" = / ; then
+ browner="$(stat -c %u /)"
+fi
+
+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."
+ if test -z "$BUILD_ROOT" -o "$BUILD_ROOT" = / ; then
+ cleanup_and_exit 1
+ fi
+ 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
+ umount -n $BUILD_ROOT/mnt 2> /dev/null
+ echo "Your build system is broken!! Shall I execute"
+ echo
+ echo " rm -rf -- $BUILD_ROOT/*"
+ echo
+ echo "y - yes, cleanup the build root"
+ echo "N - No, abort build (default on enter)"
+ echo "c - Continue anyway with this build root"
+ echo -n "[y/N/c] "
+ read ANSWER
+ case "$ANSWER" in
+ c|C)
+ rm -f $BUILD_IS_RUNNING $BUILD_ROOT/exit ;;
+ y|Y)
+ clean_build_root ;;
+ *)
+ cleanup_and_exit 1 ;;
+ esac
+fi
+
+#
+# store that we start to build system
+#
+mkdir -p $BUILD_ROOT
+mkdir -p $BUILD_ROOT/.build
+touch $BUILD_IS_RUNNING
+
+# mount /proc and /dev/pts
+mkdir -p $BUILD_ROOT/proc
+mkdir -p $BUILD_ROOT/dev/pts
+if test "$UID" = 0 -a -n "$BUILD_ROOT" -a "$BUILD_ROOT" != / ; then
+ mount -n -tproc none "$BUILD_ROOT/proc"
+ mount -n -tdevpts -omode=0620,gid=5 none "$BUILD_ROOT/dev/pts"
+fi
+
+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
+ pkg_initdb
+ touch $BUILD_ROOT/.init_b_cache/preinstall_finished
+ fi
+else
+ #
+ # now make sure that all the packages are installed.
+ #
+ rm -rf "$BUILD_ROOT/.init_b_cache"
+ mkdir -p "$BUILD_ROOT/.init_b_cache/scripts"
+
+ if test -z "$RPMLIST" ; then
+ #
+ # create rpmdeps file
+ #
+ CACHE_FILE=$BUILD_ROOT/.srcfiles.cache
+ create_cache_file
+
+ #
+ # select and expand packages
+ #
+ RPMLIST=$BUILD_ROOT/.init_b_cache/rpmlist
+ test -z "$LIST_STATE" && echo "expanding package dependencies..."
+ VMOPT=
+ test -z "$PREPARE_VM" || VMOPT=--vm
+ if ! $BUILD_DIR/expanddeps $USEUSEDFORBUILD $VMOPT "${definesnstuff[@]}" --dist "$BUILD_DIST" --depfile "$CACHE_FILE" --archpath "$BUILD_ARCH" --configdir $CONFIG_DIR "${PKGS[@]}" > $RPMLIST ; then
+ rm -f $BUILD_IS_RUNNING
+ cleanup_and_exit 1
+ fi
+ fi
+
+ if test -n "$LIST_STATE" ; then
+ rm -f $BUILD_IS_RUNNING
+ while read PKG SRC ; do
+ test "$PKG" = "preinstall:" && continue
+ test "$PKG" = "runscripts:" && continue
+ test "$PKG" = "cbpreinstall:" && continue
+ test "$PKG" = "vminstall:" && continue
+ test "$PKG" = "dist:" && continue
+ test "$PKG" = "rpmid:" && continue
+ echo "${SRC##*/}"
+ done < $BUILD_ROOT/.init_b_cache/rpmlist
+ rm -rf "$BUILD_ROOT/.init_b_cache"
+ cleanup_and_exit 0
+ fi
+
+ #
+ # 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 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 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=
+ PACKAGES_FROM_PREINSTALLIMAGE=
+ GUESSED_DIST=unknown
+ mkdir -p $BUILD_ROOT/.init_b_cache/rpms
+ rm -f $BUILD_ROOT/.init_b_cache/rpmlist.download
+ while read PKG SRC ; do
+ if test "$PKG" = "preinstall:" ; then
+ PACKAGES_TO_PREINSTALL=$SRC
+ continue
+ fi
+ if test "$PKG" = "vminstall:" ; then
+ 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##*/}"
+ continue
+ fi
+ if test "$PKG" = "preinstallimagesource:" ; then
+ PREINSTALL_IMAGE_SOURCE="$SRC"
+ continue
+ fi
+ if test "$PKG" = "runscripts:" ; then
+ RUNSCRIPTS_SEEN=true
+ PACKAGES_TO_RUNSCRIPTS=$SRC
+ continue
+ fi
+ if test "$PKG" = "dist:" ; then
+ GUESSED_DIST=$SRC
+ continue
+ fi
+ if test "$PKG" = "rpmid:" ; then
+ echo "${SRC#*:}" > $BUILD_ROOT/.init_b_cache/rpms/${SRC%%:*}.id
+ continue
+ fi
+ if test "$PKG" != "${PKG%:}"; then
+ echo "Warning: ignoring unsupported tag '$PKG'" >&2
+ continue
+ fi
+ if test "$SRC" = "preinstallimage" ; then
+ PACKAGES_FROM_PREINSTALLIMAGE="$PACKAGES_FROM_PREINSTALLIMAGE $PKG"
+ PACKAGES_TO_INSTALL="$PACKAGES_TO_INSTALL $PKG"
+ continue
+ fi
+ PACKAGES_TO_INSTALL="$PACKAGES_TO_INSTALL $PKG"
+ if test "${SRC#/}" = "$SRC" ; then
+ case "$SRC" in
+ zypp://* | http://* | https://* | ftp://* | ftps://*)
+ echo "$PKG $SRC" >>$BUILD_ROOT/.init_b_cache/rpmlist.download
+ continue
+ ;;
+ *)
+ cleanup_and_exit 1 "unsupported url for '$PKG': $SRC"
+ ;;
+ esac
+ fi
+ SRCSUF=${SRC/%.pkg.tar.?z/.arch}
+ 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
+
+ # use cached packages where possible
+ if test -s $BUILD_ROOT/.init_b_cache/rpmlist.download ; then
+ echo "calculating packages to download..."
+ while read PKG SRC ; do
+ SRCSUF=${SRC/%.pkg.tar.?z/.arch}
+ if test -s "$BUILD_ROOT/.init_b_cache/rpms/$PKG.id" ; then
+ read cachepkgid < $BUILD_ROOT/.init_b_cache/rpms/$PKG.id
+ echo "PKG $PKG $cachepkgid"
+ else
+ echo "PKG $PKG"
+ fi
+ echo "DST $BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}"
+ if test "$SRC" != "${SRC#zypp://}" ; then
+ # for zypp packages also look in the zypp cache
+ cachedir="/var/cache/zypp/packages/${SRC#zypp://}"
+ echo "CACHE ${cachedir%/*}/${SRC##*/}"
+ fi
+ cachedir="$(getcachedir "$SRC")"
+ echo "CACHE $cachedir/${SRCSUF##*/}"
+ done < $BUILD_ROOT/.init_b_cache/rpmlist.download | "$BUILD_DIR/getbuildids" cachecheck
+ # remove found packages from download list
+ rm -f $BUILD_ROOT/.init_b_cache/rpmlist.download2
+ while read PKG SRC ; do
+ SRCSUF=${SRC/%.pkg.tar.?z/.arch}
+ test -L "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}" || 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
+ fi
+
+ # now do the download of missing packages
+ if test -s $BUILD_ROOT/.init_b_cache/rpmlist.download ; then
+ PACKAGES_TO_DOWNLOAD=`cat ${RPMLIST}.download|awk '{print $2}'`
+ progress_setup PACKAGES_TO_DOWNLOAD
+ while read PKG SRC ; do
+ progress_step PACKAGES_TO_DOWNLOAD
+ downloadpkg "$SRC"
+ # downloadpkg modified $SRC, so it has a right name for use
+ SRCSUF=${SRC/%.pkg.tar.?z/.arch}
+ 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
+ echo
+ fi
+
+ # compatibility...
+ test -z "$RUNSCRIPTS_SEEN" && PACKAGES_TO_RUNSCRIPTS="$PACKAGES_TO_PREINSTALL"
+
+ echo "$GUESSED_DIST" > $BUILD_ROOT/.guessed_dist
+ test -n "$BUILD_DIST" || BUILD_DIST="$GUESSED_DIST"
+
+ pkg_set_type
+
+ if test -n "$PREINSTALL_IMAGE" ; then
+ for PKG in $PACKAGES_FROM_PREINSTALLIMAGE ; do
+ # touch the file so that the copying works
+ touch $BUILD_ROOT/.init_b_cache/rpms/"$PKG.$PSUF"
+ done
+ fi
+
+fi
+
+# XXX: should use an option instead of looking at the recipe?
+CREATE_PREINSTALL_DATA=
+case ${PKGS[0]} in
+ _preinstallimage | */_preinstallimage | _service:*:_preinstallimage | */_service:*:_preinstallimage)
+ mkdir -p $BUILD_ROOT/.preinstall_image
+ CREATE_PREINSTALL_DATA=true
+ echo "saving package data for preinstallimage generation"
+ ;;
+esac
+
+#
+# test if we need to preinstall
+#
+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
+ for PKG in $PACKAGES_TO_RUNSCRIPTS ; do
+ : > $BUILD_ROOT/.init_b_cache/scripts/$PKG.run
+ done
+ PACKAGES_TO_PREINSTALL_FILTERED="$PACKAGES_TO_PREINSTALL"
+ PACKAGES_TO_VMINSTALL_FILTERED="$PACKAGES_TO_VMINSTALL"
+ rm -f "$BUILD_ROOT/.preinstall_image"/*
+ if test -n "$PREINSTALL_IMAGE" ; then
+ preinstall_image "$PREINSTALL_IMAGE" "$PREINSTALL_IMAGE_SOURCE"
+ PACKAGES_TO_PREINSTALL_FILTERED=`preinstall_image_filter $PACKAGES_TO_PREINSTALL_FILTERED`
+ PACKAGES_TO_VMINSTALL_FILTERED=`preinstall_image_filter $PACKAGES_TO_VMINSTALL_FILTERED`
+ fi
+ PACKAGES_TO_PREINSTALL_FILTERED=`reorder $PACKAGES_TO_PREINSTALL_FILTERED`
+ progress_setup PACKAGES_TO_PREINSTALL_FILTERED
+ for PKG in $PACKAGES_TO_PREINSTALL_FILTERED ; do
+ progress_step PACKAGES_TO_PREINSTALL_FILTERED
+ preinstall ${PKG##*/}
+ done
+ echo
+ if test -n "$PREPARE_VM" ; then
+ PACKAGES_TO_VMINSTALL_FILTERED=`reorder $PACKAGES_TO_VMINSTALL_FILTERED`
+ progress_setup PACKAGES_TO_VMINSTALL_FILTERED
+ for PKG in $PACKAGES_TO_VMINSTALL_FILTERED ; do
+ progress_step PACKAGES_TO_VMINSTALL_FILTERED
+ preinstall ${PKG##*/}
+ done
+ fi
+ # for reorder
+ check_exit
+ 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
+ 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_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
+ check_exit
+ done
+ # alreadyinstalled check will not work, but we have to live with that...
+ echo -n 'reordering...'
+ PACKAGES_TO_INSTALL=`reorder $PACKAGES_TO_INSTALL`
+ check_exit
+ echo 'done'
+ Q="'\''"
+ echo "PACKAGES_TO_INSTALL='${PACKAGES_TO_INSTALL//"'"/$Q}'" > $BUILD_ROOT/.build/init_buildsystem.data
+ 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
+
+
+#
+# create .build.binaries directory if requested
+#
+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_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
+ test -f "$BUILD_ROOT/.build.binaries/$PKG.$PSUF" && continue
+ cp "$LPKG" "$BUILD_ROOT/.build.binaries/$PKG.$PSUF"
+ check_exit
+ done
+fi
+
+#
+# reorder packages (already done in vm continuation)
+#
+if ! test -e $BUILD_ROOT/.build/init_buildsystem.data ; then
+ echo -n 'reordering...'
+ PACKAGES_TO_INSTALL=`reorder $PACKAGES_TO_INSTALL`
+ check_exit
+ echo 'done'
+fi
+
+echo "querying package ids..."
+for PKG in $PACKAGES_TO_INSTALL ; do
+ test -s "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" || continue
+ test -L "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" || continue
+ echo "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF"
+done | "$BUILD_DIR/getbuildids"
+
+#
+# get list and ids of already installed packages
+#
+mkdir -p $BUILD_ROOT/.init_b_cache/alreadyinstalled
+listinstalled --root "$BUILD_ROOT" --type "$PSUF" --extraname | (
+ while read id name buildid; do
+ echo "$buildid" > "$BUILD_ROOT/.init_b_cache/alreadyinstalled/$name"
+ done
+)
+
+# do pre-installation work
+pkg_prepare
+
+#
+# delete all packages we don't want
+#
+mkdir -p $BUILD_ROOT/.init_b_cache/todelete
+for PKG in $BUILD_ROOT/.init_b_cache/alreadyinstalled/* ; do
+ PKG=${PKG##*/}
+ test "$PKG" = "*" && continue
+ ln $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG $BUILD_ROOT/.init_b_cache/todelete/$PKG
+done
+for PKG in $PACKAGES_TO_INSTALL; do
+ rm -f $BUILD_ROOT/.init_b_cache/todelete/$PKG
+done
+for PKG in $BUILD_ROOT/.init_b_cache/todelete/* ; do
+ PKG=${PKG##*/}
+ test "$PKG" = "*" && continue
+ echo "deleting $PKG"
+ pkg_erase
+ check_exit
+done
+rm -rf "$BUILD_ROOT/.init_b_cache/todelete"
+
+rm -rf "$BUILD_ROOT/.init_b_cache/preinstalls"
+mkdir -p "$BUILD_ROOT/.init_b_cache/preinstalls"
+for PKG in $PACKAGES_TO_PREINSTALL; do
+ touch "$BUILD_ROOT/.init_b_cache/preinstalls/$PKG"
+done
+
+rm -rf "$BUILD_ROOT/installed-pkg"
+mkdir -p "$BUILD_ROOT/installed-pkg"
+
+test -x $BUILD_ROOT/sbin/ldconfig && chroot $BUILD_ROOT /sbin/ldconfig 2>&1
+
+MAIN_LIST="$PACKAGES_TO_INSTALL"
+progress_setup MAIN_LIST
+for PKG in $MAIN_LIST ; do
+ test -f $BUILD_ROOT/installed-pkg/$PKG && continue
+ progress_step MAIN_LIST
+
+ 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
+ cleanup_and_exit 1 "Package $PKG is missing from the preinstall image"
+ fi
+ read PKG_HDRMD5 PKGID < $BUILD_ROOT/.preinstall_image/$PKG
+ echo "preinstalled ${PKGID%% *}"
+ echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG
+ continue
+ fi
+
+ # get the hdrmd5 if we want to create a preinstall image
+ PKG_HDRMD5=
+ if test -n "$CREATE_PREINSTALL_DATA" -a ! -e $BUILD_ROOT/.preinstall_image/$PKG ; then
+ PKG_HDRMD5=`perl -I$BUILD_DIR -MBuild -e 'print Build::queryhdrmd5($ARGV[0])' $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF`
+ test -n "$PKG_HDRMD5" || cleanup_and_exit 1
+ fi
+
+ test -L $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF || continue
+
+ if test -s "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF.buildid" ; then
+ read PKGID < "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF.buildid"
+ else
+ PKGID=$(perl -I$BUILD_DIR -MBuild -e Build::showquery "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" buildid)
+ fi
+
+ if test -f "$BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG" ; then
+ read OLDPKGID < "$BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG"
+ if test "$PKGID" != "$OLDPKGID" && ! test -e "$BUILD_ROOT/.init_b_cache/preinstalls/$PKG" ; then
+ 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
+ echo "deleting incomplete ${OLDPKGID%% *}"
+ pkg_erase
+ fi
+ if test -e "$BUILD_ROOT/.init_b_cache/preinstalls/$PKG" ; then
+ preinstall "$PKG"
+ fi
+ check_exit
+ fi
+
+ if pkg_cumulate ; then
+ echo "cumulate ${PKGID%% *}"
+ continue
+ fi
+
+ # install the package
+ echo "installing ${PKGID%% *}"
+ 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
+ pkg_install
+ check_exit
+ 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
+
+# do post-installation work
+pkg_finalize
+
+# devices can vanish if devs got uninstalled
+test -c $BUILD_ROOT/dev/null || create_devs
+
+cd $BUILD_ROOT || cleanup_and_exit 1
+
+#
+# setup /etc/mtab
+#
+rm -f $BUILD_ROOT/etc/mtab
+cp /proc/mounts $BUILD_ROOT/etc/mtab
+chmod 644 $BUILD_ROOT/etc/mtab
+
+#
+# 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
+ mv $BUILD_ROOT/etc/nsswitch.conf.tmp $BUILD_ROOT/etc/nsswitch.conf
+}
+
+#
+# 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
+done
+
+echo now finalizing build dir...
+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
+ ;;
+ 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
+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
+ else
+ chroot $BUILD_ROOT /sbin/SuSEconfig --force
+ fi
+fi
+
+if test -x $BUILD_ROOT/usr/X11R6/bin/switch2mesasoft ; then
+ chroot $BUILD_ROOT /usr/X11R6/bin/switch2mesasoft
+fi
+
+for PROG in /usr/bin/TeX/texhash /usr/bin/texhash ; do
+ test -x $BUILD_ROOT/$PROG && \
+ chroot $BUILD_ROOT bash -c ". /etc/profile ; $PROG"
+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 bash -c "$PROG -l \$(readlink -f /usr/share/zoneinfo/UTC)"
+ done
+fi
+
+test -e $BUILD_ROOT/.build/init_buildsystem.data || HOST=`hostname`
+test -e $BUILD_ROOT/etc/hosts || echo "127.0.0.1 localhost" > $BUILD_ROOT/etc/hosts
+if ! grep -F "127.0.0.1 $HOST" $BUILD_ROOT/etc/hosts > /dev/null ; then
+ # this makes a reverse lookup on 127.0.0.1 return the host name,
+ # which is bad, but 127.0.0.2 does not work on all unix systems
+ echo "127.0.0.1 $HOST" > $BUILD_ROOT/etc/hosts.new
+ test -f $BUILD_ROOT/etc/hosts && cat $BUILD_ROOT/etc/hosts >> $BUILD_ROOT/etc/hosts.new
+ 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
+ pkg_initdb_rpm
+ chroot $BUILD_ROOT rpm -q --whatprovides rpm >/dev/null 2>&1 # create provides index
+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/initvm.c b/initvm.c
new file mode 100644
index 0000000..db23045
--- /dev/null
+++ b/initvm.c
@@ -0,0 +1,399 @@
+/*
+ * NAME
+ * initvm - init for qemu, setup binfmt_misc launch build
+ *
+ * SYNOPSIS
+ * initvm
+ *
+ * DESCRIPTION
+ * This is the kernel init script for virtual machines which will
+ * be running executables for an embedded (non-native)
+ * architecture. It registers binfmt_misc handlers for qemu and
+ * executes the build script, and tests many assumptions.
+ *
+ * FILES
+ * /.build/qemu-reg
+ * text file with lines to stuff into the binfmt_misc
+ * filesystem registration file
+ * /.build/build
+ * build script to execute once binfmts are set up
+ *
+ * AUTHOR
+ * Copyright (c) 2012 James Perkins <james.perkins@linuxfoundation.org>
+ * i Adrian Schroeter <adrian@suse.de>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 or 3 as
+ * published by the Free Software Foundation.
+ *
+ * This program 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 this program (see the file COPYING); if not, write to the
+ * Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/utsname.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+
+/* to enable debugging, compile with -DDEBUG */
+#ifdef DEBUG
+#define DBG(x) do { x; } while(0)
+#else
+#define DBG(x)
+#endif
+
+/* function return codes */
+enum okfail { FAIL=0, OK=1 };
+
+/* qemu registration fields, see kernel/Documentation/binfmt_misc.txt */
+enum fields { ignore=0, name, type, offset, magic, mask, interpreter, flags };
+const char * const fieldnames[] = {
+ "ignore", "name", "type", "offset",
+ "magic", "mask", "interpreter", "flags"
+};
+const int n_fields = 8;
+
+/* files in useful places */
+#define SYSFS_BINFMT_MISC "/proc/sys/fs/binfmt_misc"
+#define SYSFS_BINFMT_MISC_REG "/proc/sys/fs/binfmt_misc/register"
+#define SYSFS_BINFMT_MISC_STAT "/proc/sys/fs/binfmt_misc/status"
+
+/* /usr/lib/build/x paths are copied to /.build inside a virtual machine */
+#define BINFMT_REGF_0 "/.build/qemu-reg"
+#define BINFMT_REGF_1 "/usr/lib/build/qemu-reg"
+#define BUILD "/.build/build"
+
+/* useful constant arrays */
+static char *rx_files[] = { "/proc", "/proc/sys", "/proc/sys/fs",
+ SYSFS_BINFMT_MISC, NULL };
+static char *w_files[] = { SYSFS_BINFMT_MISC_REG, NULL };
+
+static char* const args[] = { BUILD, NULL };
+
+/* test access modes for files, return OK or FAIL */
+enum okfail test_access_files(char *files[], int mode, const char *errstr)
+{
+ int i;
+
+ for (i = 0; files[i] != NULL; i++) {
+ if (access(files[i], mode) != 0) {
+ fprintf(stderr, "%s: %s: fails test\n",
+ files[i], errstr);
+ return FAIL;
+ }
+ }
+
+ return OK;
+}
+
+/* find a string in the given file, return OK or FAIL */
+enum okfail strfile(const char *filename, const char *string)
+{
+ char buf[BUFSIZ];
+ FILE *fp;
+ enum okfail found = FAIL;
+
+ fp = fopen(filename, "r");
+ if (fp == NULL)
+ {
+ perror(filename);
+ return FAIL;
+ }
+ while (fgets(buf, sizeof(buf), fp) != NULL)
+ {
+ if (strcmp(buf, string) == 0) {
+ found = OK;
+ break;
+ }
+
+ }
+ (void)fclose(fp);
+
+ return found;
+}
+
+/* write the file with given string, return OK or FAIL */
+enum okfail write_file_string(const char *filename, const char *string)
+{
+ int fd;
+
+ if ((fd = open(filename, O_WRONLY)) == -1)
+ {
+ perror(filename);
+ return FAIL;
+ }
+
+ if (write(fd, string, strlen(string)) == -1)
+ {
+ perror("write");
+ fprintf(stderr, "%s: write failed\n", filename);
+ close(fd);
+ return FAIL;
+ }
+
+ close(fd);
+ return OK;
+}
+
+#ifdef DEBUG
+/* dump contents of the file to stderr, return OK or FAIL */
+enum okfail dump_file(char *path)
+{
+ FILE *fp;
+ char buf[BUFSIZ];
+
+ fp = fopen(path, "r");
+ if (fp == NULL) {
+ perror(path);
+ return FAIL;
+ }
+
+ while (fgets(buf, sizeof(buf), fp) != NULL)
+ {
+ fputs(buf, stderr);
+ }
+
+ fclose(fp);
+ return OK;
+}
+#endif /* DEBUG */
+
+/* parse datafile and register (to regfile) all binary formats found */
+enum okfail binfmt_register(char *datafile, char *regfile)
+{
+ char buf[BUFSIZ];
+ FILE *fp;
+ int line;
+ struct utsname myuname;
+ uname(&myuname);
+
+ fp = fopen(datafile, "r");
+ if (fp == NULL)
+ {
+ perror(datafile);
+ return FAIL;
+ }
+
+ for (line = 1; fgets(buf, sizeof(buf), fp) != NULL; line++)
+ {
+ char tokens[BUFSIZ];
+ char *s = tokens;
+ char *blacklist;
+ char *f[n_fields]; /* field content pointers */
+ int n; /* current field */
+ char path[BUFSIZ];
+
+ if (buf[0] != ':') /* non-data input line */
+ {
+ continue;
+ }
+ blacklist = strchr(buf, ' ');
+ if (blacklist) {
+ int skip = 0;
+ char *eol;
+
+ *blacklist = '\0';
+ blacklist++;
+
+ eol = strchr(blacklist, '\n');
+ if (eol)
+ *eol = '\0';
+
+ for (n = 0; blacklist != NULL; n++)
+ {
+ char *bp = strsep(&blacklist, " ");
+ if (!strcmp(bp, myuname.machine)) {
+#ifdef DEBUG
+ fprintf(stderr, " skipping on hostarch %s line %s\n", bp, buf);
+#endif /* DEBUG */
+ skip = 1;
+ break;
+ }
+ }
+ if (skip)
+ continue;
+ }
+
+ /* copy buf and tokenize :-seperated fields into f[] */
+ strcpy(tokens, buf);
+ for (n = 0; s != NULL && n < n_fields; n++)
+ {
+ f[n] = strsep(&s, ":");
+ }
+
+#ifdef DEBUG
+ int i;
+ fprintf(stderr, "DEBUG: line %d, fields %d:\n", line, n);
+ for (i = name; i < n; i++)
+ {
+ fprintf(stderr, " %s %s\n", fieldnames[i], f[i]);
+ }
+#endif /* DEBUG */
+
+ if (n == n_fields && s != NULL)
+ {
+ fprintf(stderr, "%s: line %d: extra fields, ignoring."
+ " Content: %s", datafile, line, buf);
+ continue;
+ }
+
+ if (n < n_fields)
+ {
+ fprintf(stderr, "%s: line %d: missing fields, ignoring."
+ " Content: %s", datafile, line, buf);
+ 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);
+ if (ret == 0) {
+#ifdef DEBUG
+ fprintf(stderr,
+ "interpreter for '%s' already registered, ignoring\n",
+ f[name]);
+#endif /* DEBUG */
+ continue;
+ }
+#ifdef DEBUG
+ fprintf(stderr,
+ "registering interpreter for '%s'...\n",
+ f[name]);
+#endif /* DEBUG */
+
+ /* 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, return %d\n", datafile, line, f[interpreter], ret);
+#endif /* DEBUG */
+ continue;
+ }
+
+ if (!write_file_string(regfile, buf)) {
+ fprintf(stderr, "%s: line %d: write failed."
+ " Content: %s\n", datafile, line, buf);
+ (void)fclose(fp);
+ return FAIL;
+ }
+
+ /* verify registration completed correctly */
+ snprintf(path, sizeof(path), SYSFS_BINFMT_MISC "/%s", f[name]);
+
+ if (access(path, R_OK) != 0) {
+ fprintf(stderr,
+ "%s: line %d: binfmt path not created, content '%s'\n",
+ path, line, buf);
+ (void)fclose(fp);
+ return FAIL;
+ }
+
+ DBG(fprintf(stderr, "dumping: %s\n", path));
+ DBG(dump_file(path));
+ }
+
+
+ (void)fclose(fp);
+
+ return OK;
+}
+
+/* set up/verify binfmt FS support, program more binfmts, and launch build */
+int main(int argc, char* argv[], char* env[])
+{
+ int retval;
+ char buf[BUFSIZ];
+
+ /* mount proc filesystem if it isn't already */
+ if (mount("proc", "/proc", "proc", MS_MGC_VAL, NULL) == -1) {
+ if (errno != EBUSY) {
+ perror("mount: /proc");
+ exit(1);
+ }
+ }
+
+ /* try to load binfmt module if present, no big deal if it fails */
+ if ((retval = system("/sbin/modprobe binfmt_misc")) != 0) {
+ DBG(fprintf(stderr, "modprobe binfmt_misc exit code %d\n",
+ retval));
+ }
+
+ /* mount binfmt filesystem */
+ if (mount("binfmt_misc", SYSFS_BINFMT_MISC, "binfmt_misc", MS_MGC_VAL,
+ NULL) == -1) {
+ if (errno != EBUSY) {
+ perror("mount: binfmt_misc, " SYSFS_BINFMT_MISC);
+ }
+ }
+
+ /* verify all paths resulting from this are OK */
+ if (!test_access_files(rx_files, R_OK|X_OK, "read/search")) {
+ exit(1);
+ }
+ if (!test_access_files(w_files, W_OK, "write")) {
+ exit(1);
+ }
+
+ if (!strfile("/proc/filesystems", "nodev\tbinfmt_misc\n")) {
+ fprintf(stderr,
+ "/proc/filesystems: binfmt_misc support missing\n");
+ exit(1);
+ }
+
+ if (!strfile(SYSFS_BINFMT_MISC_STAT, "enabled\n")) {
+ fprintf(stderr,
+ "%s: binfmt_misc filesystem support not enabled\n",
+ SYSFS_BINFMT_MISC_STAT);
+ exit(1);
+ }
+
+ if (getenv("BUILD_DIR"))
+ sprintf(buf, "%s/qemu-reg", getenv("BUILD_DIR"));
+
+ if (!buf || !binfmt_register(buf, SYSFS_BINFMT_MISC_REG)) {
+ /* setup all done, do the registration */
+ if (!binfmt_register(BINFMT_REGF_0, SYSFS_BINFMT_MISC_REG)) {
+ fprintf(stderr, "%s: failed. Trying alternate binfmt file\n",
+ BINFMT_REGF_0);
+ if (!binfmt_register(BINFMT_REGF_1, SYSFS_BINFMT_MISC_REG)) {
+ fprintf(stderr, "%s: binfmt registration failed\n",
+ BINFMT_REGF_1);
+ exit(1);
+ }
+ }
+ }
+
+ /* if we are the init process, start build */
+ if (getpid() == 1)
+ {
+ if (access(BUILD, F_OK) != 0) {
+ fprintf(stderr, "%s: build executable missing\n",
+ BUILD);
+ exit(1);
+ }
+ if (access(BUILD, X_OK) != 0) {
+ fprintf(stderr, "%s: not executable\n", BUILD);
+ exit(1);
+ }
+ execve(BUILD, args, env);
+ perror("execve of "BUILD);
+ exit(1);
+ }
+
+ /* success! */
+ exit(0);
+}
diff --git a/killchroot b/killchroot
new file mode 100755
index 0000000..330b7c7
--- /dev/null
+++ b/killchroot
@@ -0,0 +1,108 @@
+#!/usr/bin/perl
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+my $sig = 15;
+my $verbose = 0;
+my $msg = '';
+my $doit = 1;
+
+while (@ARGV) {
+ if ($ARGV[0] eq '-s' || $ARGV[0] eq '--signal') {
+ die("$ARGV[0]: argument required") unless @ARGV > 1;
+ $sig = $ARGV[1];
+ shift @ARGV;
+ shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '-v' || $ARGV[0] eq '--verbose') {
+ $verbose = 1;
+ shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '-n') {
+ $doit = 0;
+ $verbose = 1;
+ shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '-m' || $ARGV[0] eq '--message') {
+ die("$ARGV[0]: argument required") unless @ARGV > 1;
+ $msg = $ARGV[1];
+ shift @ARGV;
+ shift @ARGV;
+ next;
+ }
+ last;
+}
+
+die("usage: killchroot [-s sig] <rootdir>") unless @ARGV == 1 && $ARGV[0] ne '';
+my $dir = $ARGV[0];
+chdir($dir) || die("$dir: $!\n");
+
+$dir = readlink('/proc/self/cwd');
+die("readlink /proc/self/cwd: $!\n") unless defined $dir;
+
+my %pids;
+my $pid;
+my $path;
+
+opendir(D, "/proc") || die("/proc: $!\n");
+for $pid (readdir(D)) {
+ next unless $pid =~ /^\d+$/;
+ $path = readlink("/proc/$pid/root");
+ next unless defined $path;
+ if ($path =~ /^\Q$dir\E(\/.*)?$/) {
+ $pids{$pid} = 1;
+ }
+ $path = readlink("/proc/$pid/exe");
+ if ($path =~ /^\Q$dir\E(\/.*)?$/) {
+ $pids{$pid} = 1;
+ }
+}
+closedir(D);
+
+my @pids = sort keys %pids;
+exit 0 unless @pids;
+
+print "$msg\n" if $msg ne '';
+
+if ($verbose) {
+ my @pidsv = ();
+ for $pid (@pids) {
+ open(F, "</proc/$pid/cmdline");
+ my $cmd = '';
+ sysread(F, $cmd, 128);
+ close F;
+ $cmd =~ s/\0.*//;
+ #$cmd =~ s/ .*//;
+ push @pidsv, "$pid($cmd)";
+ }
+ if (@pids > 1) {
+ print "sending signal $sig to processes @pidsv\n";
+ } else {
+ print "sending signal $sig to process @pidsv\n";
+ }
+}
+exit 0 unless $doit;
+kill $sig => @pids;
+kill CONT => @pids if $sig eq 9;
+exit 0;
diff --git a/listinstalled b/listinstalled
new file mode 100755
index 0000000..aa09eac
--- /dev/null
+++ b/listinstalled
@@ -0,0 +1,59 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use Getopt::Long;
+use Build;
+
+use strict;
+
+Getopt::Long::Configure("no_ignore_case");
+
+my $opt_root;
+my $opt_type;
+my $opt_extraname;
+
+GetOptions ("root=s" => \$opt_root, "type=s" => \$opt_type, "extraname" => \$opt_extraname) or exit(1);
+
+$opt_type ||= 'rpm';
+
+my $ql = Build::queryinstalled($opt_type, $opt_root);
+die("cannot get list of installed packages for type $opt_type\n") unless $ql;
+
+for my $q (@$ql) {
+ next unless defined($q->{'name'}) && defined($q->{'arch'});
+ next if $q->{'arch'} eq 'src' || $q->{'arch'} eq 'nosrc';
+ my $id = "$q->{'name'}.$q->{'arch'}-0/0/0: ";
+ my $evr = $q->{'version'};
+ $evr = "$q->{'epoch'}:$evr" if $q->{'epoch'};
+ $evr .= "-$q->{'release'}" if defined $q->{'release'};
+ my $buildtime = $q->{'buildtime'} || 0;
+ if ($opt_extraname) {
+ print "I:$id$q->{'name'} $q->{'name'}-$evr $buildtime-$q->{'arch'}\n";
+ } else {
+ print "I:$id$q->{'name'}-$evr $buildtime-$q->{'arch'}\n";
+ }
+}
+
diff --git a/livebuild_pre_run.template b/livebuild_pre_run.template
new file mode 100755
index 0000000..679220c
--- /dev/null
+++ b/livebuild_pre_run.template
@@ -0,0 +1,69 @@
+#!/bin/bash
+#
+# This is a template for a livebuild_pre_run script. These scripts are
+# executed by build_livebuild.sh in the chroot environment.
+#
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+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
diff --git a/lxc.conf b/lxc.conf
new file mode 100644
index 0000000..0fe566b
--- /dev/null
+++ b/lxc.conf
@@ -0,0 +1,20 @@
+lxc.aa_profile = lxc-default-with-mounting
+
+lxc.cgroup.devices.deny = a
+# null
+lxc.cgroup.devices.allow = c 1:3 rw
+# zero
+lxc.cgroup.devices.allow = c 1:5 rw
+# full
+lxc.cgroup.devices.allow = c 1:7 rw
+# random
+lxc.cgroup.devices.allow = c 1:8 rw
+# urandom
+lxc.cgroup.devices.allow = c 1:9 rw
+# tty
+lxc.cgroup.devices.allow = c 5:0 rw
+# ptmx
+lxc.cgroup.devices.allow = c 5:2 rw
+# console
+lxc.console = none
+lxc.console.logfile = /dev/stdout
diff --git a/mkbaselibs b/mkbaselibs
new file mode 100755
index 0000000..6620622
--- /dev/null
+++ b/mkbaselibs
@@ -0,0 +1,1187 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+use POSIX;
+use strict;
+use File::Temp qw/tempfile tempdir/;
+
+# See: http://www.rpm.org/max-rpm/s1-rpm-file-format-rpm-file-format.html#S3-RPM-FILE-FORMAT-HEADER-TAG-LISTING
+# cf http://search.cpan.org/~davecross/Parse-RPM-Spec-0.01/lib/Parse/RPM/Spec.pm
+my %STAG = (
+ "NAME" => 1000,
+ "VERSION" => 1001,
+ "RELEASE" => 1002,
+ "EPOCH" => 1003,
+ "SERIAL" => 1003,
+ "SUMMARY" => 1004,
+ "DESCRIPTION" => 1005,
+ "BUILDTIME" => 1006,
+ "BUILDHOST" => 1007,
+ "INSTALLTIME" => 1008,
+ "SIZE" => 1009,
+ "DISTRIBUTION" => 1010,
+ "VENDOR" => 1011,
+ "GIF" => 1012,
+ "XPM" => 1013,
+ "LICENSE" => 1014,
+ "COPYRIGHT" => 1014,
+ "PACKAGER" => 1015,
+ "GROUP" => 1016,
+ "SOURCE" => 1018,
+ "PATCH" => 1019,
+ "URL" => 1020,
+ "OS" => 1021,
+ "ARCH" => 1022,
+ "PREIN" => 1023,
+ "POSTIN" => 1024,
+ "PREUN" => 1025,
+ "POSTUN" => 1026,
+ "OLDFILENAMES" => 1027,
+ "FILESIZES" => 1028,
+ "FILESTATES" => 1029,
+ "FILEMODES" => 1030,
+ "FILERDEVS" => 1033,
+ "FILEMTIMES" => 1034,
+ "FILEMD5S" => 1035,
+ "FILELINKTOS" => 1036,
+ "FILEFLAGS" => 1037,
+ "FILEUSERNAME" => 1039,
+ "FILEGROUPNAME" => 1040,
+ "ICON" => 1043,
+ "SOURCERPM" => 1044,
+ "FILEVERIFYFLAGS" => 1045,
+ "ARCHIVESIZE" => 1046,
+ "PROVIDENAME" => 1047,
+ "PROVIDES" => 1047,
+ "REQUIREFLAGS" => 1048,
+ "REQUIRENAME" => 1049,
+ "REQUIREVERSION" => 1050,
+ "NOSOURCE" => 1051,
+ "NOPATCH" => 1052,
+ "CONFLICTFLAGS" => 1053,
+ "CONFLICTNAME" => 1054,
+ "CONFLICTVERSION" => 1055,
+ "EXCLUDEARCH" => 1059,
+ "EXCLUDEOS" => 1060,
+ "EXCLUSIVEARCH" => 1061,
+ "EXCLUSIVEOS" => 1062,
+ "RPMVERSION" => 1064,
+ "TRIGGERSCRIPTS" => 1065,
+ "TRIGGERNAME" => 1066,
+ "TRIGGERVERSION" => 1067,
+ "TRIGGERFLAGS" => 1068,
+ "TRIGGERINDEX" => 1069,
+ "VERIFYSCRIPT" => 1079,
+ "CHANGELOGTIME" => 1080,
+ "CHANGELOGNAME" => 1081,
+ "CHANGELOGTEXT" => 1082,
+ "PREINPROG" => 1085,
+ "POSTINPROG" => 1086,
+ "PREUNPROG" => 1087,
+ "POSTUNPROG" => 1088,
+ "BUILDARCHS" => 1089,
+ "OBSOLETENAME" => 1090,
+ "OBSOLETES" => 1090,
+ "VERIFYSCRIPTPROG" => 1091,
+ "TRIGGERSCRIPTPROG" => 1092,
+ "COOKIE" => 1094,
+ "FILEDEVICES" => 1095,
+ "FILEINODES" => 1096,
+ "FILELANGS" => 1097,
+ "PREFIXES" => 1098,
+ "INSTPREFIXES" => 1099,
+ "SOURCEPACKAGE" => 1106,
+ "PROVIDEFLAGS" => 1112,
+ "PROVIDEVERSION" => 1113,
+ "OBSOLETEFLAGS" => 1114,
+ "OBSOLETEVERSION" => 1115,
+ "DIRINDEXES" => 1116,
+ "BASENAMES" => 1117,
+ "DIRNAMES" => 1118,
+ "OPTFLAGS" => 1122,
+ "DISTURL" => 1123,
+ "PAYLOADFORMAT" => 1124,
+ "PAYLOADCOMPRESSOR" => 1125,
+ "PAYLOADFLAGS" => 1126,
+ "INSTALLCOLOR" => 1127,
+ "INSTALLTID" => 1128,
+ "REMOVETID" => 1129,
+ "RHNPLATFORM" => 1131,
+ "PLATFORM" => 1132,
+ "PATCHESNAME" => 1133,
+ "PATCHESFLAGS" => 1134,
+ "PATCHESVERSION" => 1135,
+ "CACHECTIME" => 1136,
+ "CACHEPKGPATH" => 1137,
+ "CACHEPKGSIZE" => 1138,
+ "CACHEPKGMTIME" => 1139,
+ "FILECOLORS" => 1140,
+ "FILECLASS" => 1141,
+ "CLASSDICT" => 1142,
+ "FILEDEPENDSX" => 1143,
+ "FILEDEPENDSN" => 1144,
+ "DEPENDSDICT" => 1145,
+ "SOURCEPKGID" => 1146,
+ "PRETRANS" => 1151,
+ "POSTTRANS" => 1152,
+ "PRETRANSPROG" => 1153,
+ "POSTTRANSPROG" => 1154,
+ "DISTTAG" => 1155,
+ "SUGGESTSNAME" => 1156,
+ "SUGGESTSVERSION" => 1157,
+ "SUGGESTSFLAGS" => 1158,
+ "ENHANCESNAME" => 1159,
+ "ENHANCESVERSION" => 1160,
+ "ENHANCESFLAGS" => 1161,
+ "PRIORITY" => 1162,
+ "CVSID" => 1163,
+);
+
+# do not mix numeric tags with symbolic tags.
+# special symbolic tag 'FILENAME' exists.
+
+# This function seems to take a set of tags and populates a global
+# hash-table (%res) with data obtained by doing a binary unpack() on
+# the raw package
+# http://www.rpm.org/max-rpm/s1-rpm-file-format-rpm-file-format.html
+
+sub rpmq_many {
+ my $rpm = shift;
+ my @stags = @_;
+
+ my $need_filenames = grep { $_ eq 'FILENAMES' } @stags;
+ push @stags, 'BASENAMES', 'DIRNAMES', 'DIRINDEXES', 'OLDFILENAMES' if $need_filenames;
+ @stags = grep { $_ ne 'FILENAMES' } @stags if $need_filenames;
+ my %stags = map {0+($STAG{$_} or $_) => $_} @stags;
+
+ my ($magic, $sigtype, $headmagic, $cnt, $cntdata, $lead, $head, $index, $data, $tag, $type, $offset, $count);
+
+ local *RPM;
+ if (ref($rpm) eq 'ARRAY') {
+ ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $rpm->[0]);
+ if ($headmagic != 0x8eade801) {
+ warn("Bad rpm\n");
+ return ();
+ }
+ if (length($rpm->[0]) < 16 + $cnt * 16 + $cntdata) {
+ warn("Bad rpm\n");
+ return ();
+ }
+ $index = substr($rpm->[0], 16, $cnt * 16);
+ $data = substr($rpm->[0], 16 + $cnt * 16, $cntdata);
+ } else {
+ return () unless open(RPM, "<$rpm");
+ if (read(RPM, $lead, 96) != 96) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ ($magic, $sigtype) = unpack('N@78n', $lead);
+ if ($magic != 0xedabeedb || $sigtype != 5) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ if (read(RPM, $head, 16) != 16) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $head);
+ if ($headmagic != 0x8eade801) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ if (read(RPM, $index, $cnt * 16) != $cnt * 16) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ $cntdata = ($cntdata + 7) & ~7;
+ if (read(RPM, $data, $cntdata) != $cntdata) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ }
+
+ my %res = ();
+
+ if (ref($rpm) eq 'ARRAY' && @stags && @$rpm > 1) {
+ my %res2 = &rpmq_many([ $rpm->[1] ], @stags);
+ %res = (%res, %res2);
+ return %res;
+ }
+
+ if (ref($rpm) ne 'ARRAY' && @stags) {
+ if (read(RPM, $head, 16) != 16) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ ($headmagic, $cnt, $cntdata) = unpack('N@8NN', $head);
+ if ($headmagic != 0x8eade801) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ if (read(RPM, $index, $cnt * 16) != $cnt * 16) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ if (read(RPM, $data, $cntdata) != $cntdata) {
+ warn("Bad rpm $rpm\n");
+ close RPM;
+ return ();
+ }
+ }
+ close RPM if ref($rpm) ne 'ARRAY';
+
+ return %res unless @stags; # nothing to do
+
+ while($cnt-- > 0) {
+ ($tag, $type, $offset, $count, $index) = unpack('N4a*', $index);
+ $tag = 0+$tag;
+ if ($stags{$tag}) {
+ eval {
+ my $otag = $stags{$tag};
+ if ($type == 0) {
+ $res{$otag} = [ '' ];
+ } elsif ($type == 1) {
+ $res{$otag} = [ unpack("\@${offset}c$count", $data) ];
+ } elsif ($type == 2) {
+ $res{$otag} = [ unpack("\@${offset}c$count", $data) ];
+ } elsif ($type == 3) {
+ $res{$otag} = [ unpack("\@${offset}n$count", $data) ];
+ } elsif ($type == 4) {
+ $res{$otag} = [ unpack("\@${offset}N$count", $data) ];
+ } elsif ($type == 5) {
+ $res{$otag} = [ undef ];
+ } elsif ($type == 6) {
+ $res{$otag} = [ unpack("\@${offset}Z*", $data) ];
+ } elsif ($type == 7) {
+ $res{$otag} = [ unpack("\@${offset}a$count", $data) ];
+ } elsif ($type == 8 || $type == 9) {
+ my $d = unpack("\@${offset}a*", $data);
+ my @res = split("\0", $d, $count + 1);
+ $res{$otag} = [ splice @res, 0, $count ];
+ } else {
+ $res{$otag} = [ undef ];
+ }
+ };
+ if ($@) {
+ warn("Bad rpm $rpm: $@\n");
+ return ();
+ }
+ }
+ }
+
+ if ($need_filenames) {
+ if ($res{'OLDFILENAMES'}) {
+ $res{'FILENAMES'} = [ @{$res{'OLDFILENAMES'}} ];
+ } else {
+ my $i = 0;
+ $res{'FILENAMES'} = [ map {"$res{'DIRNAMES'}->[$res{'DIRINDEXES'}->[$i++]]$_"} @{$res{'BASENAMES'}} ];
+ }
+ }
+ return %res;
+}
+
+sub rpmq_add_flagsvers {
+ my $res = shift;
+ my $name = shift;
+ my $flags = shift;
+ my $vers = shift;
+
+ return unless $res;
+ my @flags = @{$res->{$flags} || []};
+ my @vers = @{$res->{$vers} || []};
+ for (@{$res->{$name}}) {
+ if (@flags && ($flags[0] & 0xe) && @vers) {
+ $_ .= ' ';
+ $_ .= '<' if $flags[0] & 2;
+ $_ .= '>' if $flags[0] & 4;
+ $_ .= '=' if $flags[0] & 8;
+ $_ .= " $vers[0]";
+ }
+ shift @flags;
+ shift @vers;
+ }
+}
+
+my @preamble = qw{
+ Name Version Release Epoch Summary Copyright License Distribution
+ Disturl Vendor Group Packager Url Icon Prefixes
+};
+
+my $rpm;
+my $arch;
+
+my $config = '';
+
+my $targettype;
+my $targetarch;
+my $prefix;
+my $extension;
+my $configdir;
+my $targetname;
+my $legacyversion;
+
+my @baselib;
+my @config;
+
+my @provides;
+my @obsoletes;
+my @requires;
+my @prerequires;
+my @conflicts;
+my @recommends;
+my @supplements;
+my @suggests;
+
+my @prein;
+my @postin;
+my @preun;
+my @postun;
+my $autoreqprov;
+
+my $verbose;
+my %target_matched;
+my @filesystem;
+
+# Used for each package by
+sub parse_config {
+ my $target = shift;
+ my $pkgname = shift;
+ my $pkgver = shift;
+
+ my $pkghasmatched;
+
+ my $pkgmatches = 1;
+ my $packageseen = 0;
+ $prefix = '';
+ $legacyversion = '';
+ $extension = '';
+ $configdir = '';
+ $targetname = '';
+ ($targetarch, $targettype) = split(':', $target, 2);
+ @baselib = ();
+ @config = ();
+ @provides = ();
+ @obsoletes = ();
+ @requires = ();
+ @recommends = ();
+ @supplements = ();
+ @suggests = ();
+ @prerequires = ();
+ @conflicts = ();
+ @prein = ();
+ @postin = ();
+ @preun = ();
+ @postun = ();
+ $autoreqprov = 'on';
+ my $match1 = '';
+
+ for (split("\n", $config)) {
+ s/^\s+//;
+ s/\s+$//;
+ next if $_ eq '' || $_ =~ /^#/;
+
+ if ($_ eq 'end_of_config') {
+ $pkgmatches = 0;
+ $packageseen = 0;
+ next;
+ }
+
+ s/\<targettype\>/$targettype/g;
+ s/\<targetarch\>/$targetarch/g;
+ s/\<name\>/$pkgname/g;
+ s/\<version\>/$pkgver/g;
+ s/\<prefix\>/$prefix/g;
+ s/\<extension\>/$extension/g;
+ s/\<configdir\>/$configdir/g;
+ s/\<match1\>/$match1/g;
+
+ if (/^arch\s+/) {
+ next unless s/^arch\s+\Q$arch\E\s+//;
+ }
+ next if /^targets\s+/;
+ if (/\s+package\s+[-+_a-zA-Z0-9]+$/) {
+ $pkgmatches = 0; # XXX: hack for targettype/targetarch conditional
+ $packageseen = 1;
+ }
+ if (/\s+package\s+\/[-+_a-zA-Z0-9]+\/$/) {
+ $pkgmatches = 0; # XXX: hack
+ $packageseen = 1;
+ }
+ if (/^targettype\s+/) {
+ next unless s/^targettype\s+\Q$targettype\E\s+//;
+ }
+ if (/^targetarch\s+/) {
+ next unless s/^targetarch\s+\Q$targetarch\E\s+//;
+ }
+ if (/^prefix\s+(.*?)$/) { $prefix = $1; next; }
+ if (/^legacyversion\s+(.*?)$/) { $legacyversion = $1; next; }
+ if (/^extension\s+(.*?)$/) { $extension = $1; next; }
+ if (/^configdir\s+(.*?)$/) { $configdir= $1; next; }
+ if (/^targetname\s+(.*?)$/) {
+ $targetname = $1 if $pkgmatches || !$packageseen;
+ next;
+ }
+
+ $_ = "baselib $_" if /^[\+\-\"]/;
+ $_ = "package $_" if /^[-+_a-zA-Z0-9]+$/;
+ if (/^package\s+\/(.*?)\/$/) {
+ my $pm = $1;
+ $packageseen = 1;
+ $pkgmatches = $pkgname =~ /$pm/;
+ $match1 = defined($1) ? $1 : '' if $pkgmatches;
+ $pkghasmatched |= $pkgmatches if $pkgname =~ /-debuginfo$/ && $target_matched{$target};
+ next;
+ }
+ if (/^package\s+(.*?)$/) {
+ $packageseen = 1;
+ $pkgmatches = $1 eq $pkgname;
+ $pkghasmatched |= $pkgmatches;
+ next;
+ }
+ next unless $pkgmatches;
+ return 0 if $_ eq 'block!';
+ if (/^provides\s+(.*?)$/) { push @provides, $1; next; }
+ if (/^requires\s+(.*?)$/) { push @requires, $1; next; }
+ if (/^recommends\s+(.*?)$/) { push @recommends, $1; next; }
+ if (/^supplements\s+(.*?)$/) { push @supplements, $1; next; }
+ if (/^suggests\s+(.*?)$/) { push @suggests, $1; next; }
+ if (/^prereq\s+(.*?)$/) { push @prerequires, $1; next; }
+ if (/^obsoletes\s+(.*?)$/) { push @obsoletes, $1; next; }
+ if (/^conflicts\s+(.*?)$/) { push @conflicts, $1; next; }
+ if (/^baselib\s+(.*?)$/) { push @baselib, $1; next; }
+ if (/^config\s+(.*?)$/) { push @config, $1; next; }
+ if (/^pre(in)?\s+(.*?)$/) { push @prein, $2; next; }
+ if (/^post(in)?\s+(.*?)$/) { push @postin, $2; next; }
+ if (/^preun\s+(.*?)$/) { push @preun, $1; next; }
+ if (/^postun\s+(.*?)$/) { push @preun, $1; next; }
+ if (/^autoreqprov\s+(.*?)$/) {$autoreqprov = $1; next; }
+ die("bad line: $_\n");
+ }
+ return $pkghasmatched;
+}
+
+sub read_config {
+ my $cfname = shift;
+ local *F;
+ open(F, "<$cfname") || die("$cfname: $!\n");
+ my @cf = <F>;
+ close F;
+ $config .= join('', @cf);
+ # add end of config marker to reset package matching
+ $config .= "\nend_of_config\n";
+}
+
+sub get_targets {
+ my $architecture = shift;
+ my $conf = shift;
+ my %targets;
+ for (split("\n", $conf)) {
+ if (/^arch\s+/) {
+ next unless s/^arch\s+\Q$architecture\E\s+//;
+ }
+ if (/^targets\s+(.*?)$/) {
+ $targets{$_} = 1 for split(' ', $1);
+ }
+ }
+ my @targets = sort keys %targets;
+ return @targets;
+}
+
+# Packages listed in config file
+sub get_pkgnames {
+ my %rpms;
+ for (split("\n", $config)) {
+ if (/^(.*\s+)?package\s+([-+_a-zA-Z0-9]+)\s*$/) { # eg : arch ppc package libnuma-devel
+ $rpms{$2} = 1;
+ } elsif (/^\s*([-+_a-zA-Z0-9]+)\s*$/) { # eg: readline-devel
+ $rpms{$1} = 1;
+ }
+ }
+ return sort keys %rpms;
+}
+
+# Packages listed in config file - debian variant (can have "." in package names)
+sub get_debpkgnames {
+ my %debs;
+ for (split("\n", $config)) {
+ if (/^(.*\s+)?package\s+([-+_a-zA-Z0-9.]+)\s*$/) { # eg : arch ppc package libnuma-devel
+ $debs{$2} = 1;
+ } elsif (/^\s*([-+_a-zA-Z0-9.]+)\s*$/) { # eg: readline-devel
+ $debs{$1} = 1;
+ }
+ }
+ return sort keys %debs;
+}
+
+sub handle_rpms {
+ for $rpm (@_) {
+
+ my @stags = map {uc($_)} @preamble;
+ push @stags, 'DESCRIPTION';
+ push @stags, 'FILENAMES', 'FILEMODES', 'FILEUSERNAME', 'FILEGROUPNAME', 'FILEFLAGS', 'FILEVERIFYFLAGS';
+ push @stags, 'CHANGELOGTIME', 'CHANGELOGNAME', 'CHANGELOGTEXT';
+ push @stags, 'ARCH', 'SOURCERPM', 'RPMVERSION';
+ push @stags, 'BUILDTIME';
+ my %res = rpmq_many($rpm, @stags);
+ die("$rpm: bad rpm\n") unless $res{'NAME'};
+
+ my $rname = $res{'NAME'}->[0];
+ my $sname = $res{'SOURCERPM'}->[0];
+ die("$rpm is a sourcerpm\n") unless $sname;
+ die("bad sourcerpm: $sname\n") unless $sname =~ /^(.*)-([^-]+)-([^-]+)\.(no)?src\.rpm$/;
+ $sname = $1;
+ my $sversion = $2;
+ my $srelease = $3;
+
+ $arch = $res{'ARCH'}->[0];
+ my @targets = get_targets($arch, $config);
+ if (!@targets) {
+ print "no targets for arch $arch, skipping $rname\n";
+ next;
+ }
+ for my $target (@targets) {
+
+ next unless parse_config($target, $res{'NAME'}->[0], $res{'VERSION'}->[0]);
+ die("targetname not set\n") unless $targetname;
+ $target_matched{$target} = 1;
+
+ my %ghosts;
+ my @rpmfiles = @{$res{'FILENAMES'}};
+ my @ff = @{$res{'FILEFLAGS'}};
+ for (@rpmfiles) {
+ $ghosts{$_} = 1 if $ff[0] & (1 << 6);
+ shift @ff;
+ }
+ my %files;
+ my %cfiles;
+ my %moves;
+ my %symlinks;
+ for my $r (@baselib) {
+ my $rr = substr($r, 1);
+ if (substr($r, 0, 1) eq '+') {
+ if ($rr =~ /^(.*?)\s*->\s*(.*?)$/) {
+ if (grep {$_ eq $1} @rpmfiles) {
+ $files{$1} = 1;
+ $moves{$1} = $2;
+ }
+ } else {
+ for (grep {/$rr/} @rpmfiles) {
+ $files{$_} = 1;
+ delete $moves{$_};
+ }
+ }
+ } elsif (substr($r, 0, 1) eq '-') {
+ delete $files{$_} for grep {/$rr/} keys %files;
+ } elsif (substr($r, 0, 1) eq '"') {
+ $rr =~ s/\"$//;
+ if ($rr =~ /^(.*?)\s*->\s*(.*?)$/) {
+ $symlinks{$1} = $2;
+ } else {
+ die("bad baselib string rule: $r\n");
+ }
+ } else {
+ die("bad baselib rule: $r\n");
+ }
+ }
+ if ($configdir) {
+ for my $r (@config) {
+ my $rr = substr($r, 1);
+ if (substr($r, 0, 1) eq '+') {
+ $cfiles{$_} = 1 for grep {/$rr/} grep {!$ghosts{$_}} @rpmfiles;
+ } elsif (substr($r, 0, 1) eq '-') {
+ delete $cfiles{$_} for grep {/$rr/} keys %cfiles;
+ } else {
+ die("bad config rule: $r\n");
+ }
+ }
+ }
+ $files{$_} = 1 for keys %cfiles;
+
+ if (!%files) {
+ print "$rname($target): empty filelist, skipping rpm\n";
+ next;
+ }
+
+ my $i = 0;
+ for (@{$res{'FILENAMES'}}) {
+ $files{$_} = $i if $files{$_};
+ $i++;
+ }
+
+ my %cpiodirs;
+ for (keys %files) {
+ next if $cfiles{$_} || $moves{$_};
+ my $fn = $_;
+ next unless $fn =~ s/\/[^\/]+$//;
+ $cpiodirs{$fn} = 1;
+ }
+
+ my %alldirs;
+ for (keys %files) {
+ next if $cfiles{$_};
+ my $fn = $_;
+ if ($moves{$fn}) {
+ $fn = $moves{$fn};
+ next unless $fn =~ s/\/[^\/]+$//;
+ $alldirs{$fn} = 1;
+ } else {
+ next unless $fn =~ s/\/[^\/]+$//;
+ $alldirs{"$prefix$fn"} = 1;
+ }
+ }
+ $alldirs{$_} = 1 for keys %symlinks;
+ $alldirs{$configdir} = 1 if %cfiles;
+ my $ad;
+ for $ad (keys %alldirs) {
+ $alldirs{$ad} = 1 while $ad =~ s/\/[^\/]+$//;
+ }
+ for (keys %files) {
+ next if $cfiles{$_};
+ my $fn = $_;
+ if ($moves{$fn}) {
+ delete $alldirs{$moves{$fn}};
+ } else {
+ delete $alldirs{"$prefix$fn"};
+ }
+ }
+ delete $alldirs{$_} for keys %symlinks;
+ $ad = $prefix;
+ delete $alldirs{$ad};
+ delete $alldirs{$ad} while $ad =~ s/\/[^\/]+$//;
+ delete $alldirs{$_} for @filesystem;
+
+ print "$rname($target): writing specfile...\n";
+ my ($fh, $specfile) = tempfile(SUFFIX => ".spec");
+ open(SPEC, ">&=", $fh) || die("open: $!\n");
+ for my $p (@preamble) {
+ my $pt = uc($p);
+ next unless $res{$pt};
+ my $d = $res{$pt}->[0];
+ $d =~ s/%/%%/g;
+ if ($p eq 'Name') {
+ print SPEC "Name: $sname\n";
+ next;
+ }
+ if ($p eq 'Version') {
+ print SPEC "Version: $sversion\n";
+ next;
+ }
+ if ($p eq 'Release') {
+ print SPEC "Release: $srelease\n";
+ next;
+ }
+ if ($p eq 'Disturl') {
+ print SPEC "%define disturl $d\n";
+ next;
+ }
+ print SPEC "$p: $d\n";
+ }
+ print SPEC "Source: $rpm\n";
+ print SPEC "NoSource: 0\n" if $res{'SOURCERPM'}->[0] =~ /\.nosrc\.rpm$/;
+ print SPEC "BuildRoot: %{_tmppath}/baselibs-%{name}-%{version}-build\n";
+ print SPEC "%define _target_cpu $targetarch\n";
+ print SPEC "%define __os_install_post %{nil}\n";
+ print SPEC "%description\nUnneeded main package. Ignore.\n\n";
+ print SPEC "%package -n $targetname\n";
+ for my $p (@preamble) {
+ next if $p eq 'Name' || $p eq 'Disturl';
+ my $pt = uc($p);
+ next unless $res{$pt};
+ my $d = $res{$pt}->[0];
+ $d =~ s/%/%%/g;
+ if ($pt eq 'VERSION' && $legacyversion) {
+ $d = $legacyversion;
+ } elsif ($pt eq 'RELEASE' && $legacyversion) {
+ my @bt = localtime($res{'BUILDTIME'}->[0]);
+ $bt[5] += 1900;
+ $bt[4] += 1;
+ $d = sprintf("%04d%02d%02d%02d%02d\n", @bt[5,4,3,2,1]);
+ }
+ print SPEC "$p: $d\n";
+ }
+ print SPEC "Autoreqprov: $autoreqprov\n";
+
+ for my $ar ([\@provides, 'provides'],
+ [\@prerequires, 'prereq'],
+ [\@requires, 'requires'],
+ [\@recommends, 'recommends'],
+ [\@supplements, 'supplements'],
+ [\@obsoletes, 'obsoletes'],
+ [\@conflicts, 'conflicts']) {
+ my @a = @{$ar->[0]};
+ my @na = ();
+ for (@a) {
+ if (substr($_, 0, 1) eq '"') {
+ die("bad $ar->[1] rule: $_\n") unless /^\"(.*)\"$/;
+ push @na, $1;
+ } elsif (substr($_, 0, 1) eq '-') {
+ my $ra = substr($_, 1);
+ @na = grep {!/$ra/} @na;
+ } else {
+ die("bad $ar->[1] rule: $_\n");
+ }
+ }
+ print SPEC ucfirst($ar->[1]).": $_\n" for @na;
+ }
+ my $cpiopre = '';
+ $cpiopre = './' if $res{'RPMVERSION'}->[0] !~ /^3/;
+ my $d = $res{'DESCRIPTION'}->[0];
+ $d =~ s/%/%%/g;
+ if ($legacyversion) {
+ $d = "This rpm was re-packaged from $res{'NAME'}->[0]-$res{'VERSION'}->[0]-$res{'RELEASE'}->[0]\n\n$d";
+ }
+ print SPEC "\n%description -n $targetname\n";
+ print SPEC "$d\n";
+ print SPEC "%prep\n";
+ print SPEC "%build\n";
+ print SPEC "%install\n";
+ print SPEC "rm -rf \$RPM_BUILD_ROOT\n";
+ print SPEC "mkdir \$RPM_BUILD_ROOT\n";
+ print SPEC "cd \$RPM_BUILD_ROOT\n";
+ my @cfl = grep {!$cfiles{$_} && !$moves{$_}} sort keys %files;
+ if (@cfl) {
+ if ($prefix ne '') {
+ print SPEC "mkdir -p \$RPM_BUILD_ROOT$prefix\n";
+ print SPEC "pushd \$RPM_BUILD_ROOT$prefix\n";
+ }
+ print SPEC "cat <<EOFL >.filelist\n";
+ print SPEC "$_\n" for map {$cpiopre.substr($_, 1)} @cfl;
+ print SPEC "EOFL\n";
+ print SPEC "mkdir -p \$RPM_BUILD_ROOT$prefix$_\n" for sort keys %cpiodirs;
+ print SPEC "rpm2cpio $rpm | cpio -i -d -v -E .filelist\n";
+ print SPEC "rm .filelist\n";
+ if (%ghosts) {
+ for my $fn (grep {$ghosts{$_}} @cfl) {
+ my $fnm = $fn;
+ $fnm = '.' unless $fnm =~ s/\/[^\/]+$//;
+ print SPEC "mkdir -p \$RPM_BUILD_ROOT$prefix$fnm\n";
+ print SPEC "touch \$RPM_BUILD_ROOT$prefix$fn\n";
+ }
+ }
+ if ($prefix ne '') {
+ print SPEC "popd\n";
+ }
+ }
+ if (%cfiles || %moves) {
+ print SPEC "mkdir -p .cfiles\n";
+ print SPEC "pushd .cfiles\n";
+ print SPEC "cat <<EOFL >.filelist\n";
+ print SPEC "$_\n" for map {$cpiopre.substr($_, 1)} grep {$cfiles{$_} || $moves{$_}} sort keys %files;
+ print SPEC "EOFL\n";
+ print SPEC "rpm2cpio $rpm | cpio -i -d -v -E .filelist\n";
+ print SPEC "popd\n";
+ if (%cfiles) {
+ print SPEC "mkdir -p \$RPM_BUILD_ROOT$configdir\n";
+ print SPEC "mv .cfiles$_ \$RPM_BUILD_ROOT$configdir\n" for sort keys %cfiles;
+ }
+ for my $fn (sort keys %moves) {
+ my $fnm = $moves{$fn};
+ $fnm = '.' unless $fnm =~ s/\/[^\/]+$//;
+ print SPEC "mkdir -p \$RPM_BUILD_ROOT$fnm\n";
+ print SPEC "mv .cfiles$fn \$RPM_BUILD_ROOT$moves{$fn}\n";
+ }
+ print SPEC "rm -rf .cfiles\n";
+ }
+ for my $fn (sort keys %symlinks) {
+ my $fnm = $fn;
+ $fnm = '.' unless $fnm =~ s/\/[^\/]+$//;
+ print SPEC "mkdir -p \$RPM_BUILD_ROOT$fnm\n";
+ print SPEC "ln -s $symlinks{$fn} \$RPM_BUILD_ROOT$fn\n";
+ }
+ if ($prefix ne '' && grep {/\.so.*$/} @cfl) {
+ @postin = () if @postin == 1 && $postin[0] =~ /^\"-p.*ldconfig/;
+ unshift @postin, "\"/sbin/ldconfig -r $prefix\"";
+ }
+
+ if (@prein) {
+ print SPEC "%pre -n $targetname";
+ print SPEC $prein[0] =~ /^\"-p/ ? " " : "\n";
+ for (@prein) {
+ die("bad prein rule: $_\n") unless /^\"(.*)\"$/;
+ print SPEC "$1\n";
+ }
+ }
+ if (@postin) {
+ print SPEC "%post -n $targetname";
+ print SPEC $postin[0] =~ /^\"-p/ ? " " : "\n";
+ for (@postin) {
+ die("bad postin rule: $_\n") unless /^\"(.*)\"$/;
+ print SPEC "$1\n";
+ }
+ }
+ if (@preun) {
+ print SPEC "%preun -n $targetname";
+ print SPEC $preun[0] =~ /^\"-p/ ? " " : "\n";
+ for (@preun) {
+ die("bad preun rule: $_\n") unless /^\"(.*)\"$/;
+ print SPEC "$1\n";
+ }
+ }
+ if (@postun) {
+ print SPEC "%postun -n $targetname";
+ print SPEC $postun[0] =~ /^\"-p/ ? " " : "\n";
+ for (@postun) {
+ die("bad postun rule: $_\n") unless /^\"(.*)\"$/;
+ print SPEC "$1\n";
+ }
+ }
+
+ print SPEC "\n%clean\n";
+ print SPEC "\nrm -rf \$RPM_BUILD_ROOT\n\n";
+ print SPEC "%files -n $targetname\n";
+ for my $file (sort keys %alldirs) {
+ print SPEC "%dir %attr(0755,root,root) $file\n";
+ }
+ for my $file (keys %files) {
+ my $fi = $files{$file};
+ my $fm = $res{'FILEMODES'}->[$fi];
+ my $fv = $res{'FILEVERIFYFLAGS'}->[$fi];
+ my $ff = $res{'FILEFLAGS'}->[$fi];
+ if (POSIX::S_ISDIR($fm)) {
+ print SPEC "%dir ";
+ }
+ if ($ff & ((1 << 3) | (1 << 4))) {
+ print SPEC "%config(missingok noreplace) ";
+ } elsif ($ff & (1 << 3)) {
+ print SPEC "%config(missingok) ";
+ } elsif ($ff & (1 << 4)) {
+ print SPEC "%config(noreplace) ";
+ } elsif ($ff & (1 << 0)) {
+ print SPEC "%config ";
+ }
+ print SPEC "%doc " if $ff & (1 << 1);
+ print SPEC "%ghost " if $ff & (1 << 6);
+ print SPEC "%license " if $ff & (1 << 7);
+ print SPEC "%readme " if $ff & (1 << 8);
+ if ($fv != 4294967295) {
+ print SPEC "%verify(";
+ if ($fv & 2147483648) {
+ print SPEC "not ";
+ $fv ^= 4294967295;
+ }
+ print SPEC "md5 " if $fv & (1 << 0);
+ print SPEC "size " if $fv & (1 << 1);
+ print SPEC "link " if $fv & (1 << 2);
+ print SPEC "user " if $fv & (1 << 3);
+ print SPEC "group " if $fv & (1 << 4);
+ print SPEC "mtime " if $fv & (1 << 5);
+ print SPEC "mode " if $fv & (1 << 6);
+ print SPEC "rdev " if $fv & (1 << 7);
+ print SPEC ") ";
+ }
+ #sigh, no POSIX::S_ISLNK ...
+ if (($fm & 0170000) == 0120000) {
+ printf SPEC "%%attr(-,%s,%s) ", $res{'FILEUSERNAME'}->[$fi], $res{'FILEGROUPNAME'}->[$fi];
+ } else {
+ printf SPEC "%%attr(%03o,%s,%s) ", $fm & 07777, $res{'FILEUSERNAME'}->[$fi], $res{'FILEGROUPNAME'}->[$fi];
+ }
+ if ($cfiles{$file}) {
+ my $fn = $file;
+ $fn =~ s/.*\///;
+ print SPEC "$configdir/$fn\n";
+ } else {
+ if ($moves{$file}) {
+ print SPEC "$moves{$file}\n";
+ } else {
+ print SPEC "$prefix$file\n";
+ }
+ }
+ }
+ for (keys %symlinks) {
+ printf SPEC "%%attr(-,root,root) $_\n";
+ }
+
+ if ($res{'CHANGELOGTEXT'}) {
+ print SPEC "\n%changelog -n $targetname\n";
+ my @ct = @{$res{'CHANGELOGTIME'}};
+ my @cn = @{$res{'CHANGELOGNAME'}};
+ my @wdays = qw{Sun Mon Tue Wed Thu Fri Sat};
+ my @months = qw{Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec};
+ for my $cc (@{$res{'CHANGELOGTEXT'}}) {
+ my @lt = localtime($ct[0]);
+ my $cc2 = $cc;
+ my $cn2 = $cn[0];
+ $cc2 =~ s/%/%%/g;
+ $cn2 =~ s/%/%%/g;
+ printf SPEC "* %s %s %02d %04d %s\n%s\n", $wdays[$lt[6]], $months[$lt[4]], $lt[3], 1900 + $lt[5], $cn2, $cc2;
+ shift @ct;
+ shift @cn;
+ }
+ }
+
+ close(SPEC) || die("$specfile: $!\n");
+ print "$rname($target): running build...\n";
+ if (system("rpmbuild -bb $specfile".($verbose ? '' : '>/dev/null 2>&1'))) {
+ print "rpmbuild failed: $?\n";
+ print "re-running in verbose mode:\n";
+ system("rpmbuild -bb $specfile 2>&1");
+ exit(1);
+ }
+ unlink($specfile);
+ }
+ }
+}
+
+################################################################
+
+sub handle_debs {
+
+ eval {
+ require Parse::DebControl;
+ };
+ if ($@){
+ print "mkbaselibs needs the perl module Parse::DebControl\n".
+ "Error. baselibs-deb.conf specified but mkbaselibs can't run\n".
+ "Please ensure that 'osc meta prjconf' contains the following line:\n".
+ " Support: libparse-debcontrol-perl\n";
+ return;
+ };
+
+
+ # for each deb:
+ # look in the config file to see if we should be doing anything
+ #
+ # Unpack the deb control data using dpkg-deb
+ # for each target
+ # Unpack the deb control data *and* file data using dpkg-deb
+ # process the config file for this package modifying control and moving files
+ # repackage the target deb
+
+ for my $deb (@_) {
+ # http://www.debian.org/doc/debian-policy/ch-controlfields.html#s-binarycontrolfiles
+ # unpack the outer loop control file - this gives us eg: the arch
+ my $base = tempdir() || die("tempdir: $!\n");
+ system "dpkg -e $deb ${base}/DEBIAN" || die "dpkg -e failed on $deb";
+ my $controlParser = new Parse::DebControl;
+ $controlParser->DEBUG();
+ my $keys = $controlParser->parse_file("${base}/DEBIAN/control");
+# print Dumper($keys);
+ # DebControl supports multiple paragraphs of control data but
+ # debian/control in a .deb only has one (whereas a debian/control
+ # in a build root contains many)
+ # So extract the ref to the first one.
+ my %control = %{@{$keys}[0]};
+
+ # Validate this is a binary deb and get the control data
+ my $d_name = $control{'Package'};
+ my $d_version = $control{'Version'};
+
+ $arch = $control{'Architecture'}; # set global $arch
+
+ # examine the
+ # arch <arch> targets <target_arch>[:<target_type>] [<target_arch>[:<target_type>]...]
+ # line and get a list of target_arch-es
+ my @targets = get_targets($arch, $config);
+ if (!@targets) {
+ print "no targets for arch $arch, skipping $d_name\n";
+ next; # there may be more debs to handle
+ }
+
+ for my $target (@targets) {
+ next unless parse_config($target, $d_name, $d_version);
+ die("targetname not set\n") unless $targetname; # set in the global_conf
+ $target_matched{$target} = 1;
+
+ my $baseTarget = "${base}/$target";
+ # Unpack a .deb to work on. We have to do this each time as we
+ # manipulate the unpacked files.
+ system "mkdir ${base}/$target";
+ system "dpkg -e $deb ${baseTarget}/DEBIAN" || die "dpkg -e failed on $deb";
+ # Note that extracting to $prefix does the clever move to /lib-x86/ or whatever
+ system "dpkg -x $deb ${baseTarget}/$prefix" || die "dpkg -x failed on $deb";
+
+ # Reset the control data
+ $keys = $controlParser->parse_file("${baseTarget}/DEBIAN/control");
+ %control = %{@{$keys}[0]};
+
+ # Force the architecture
+ $control{'Architecture'} = $targetarch;
+
+ # Currently this script does not manipulate any files
+ # If needed they are all unpacked in ${baseTarget}
+
+ # we don't need a dsc/spec file.. all done by just moving files around
+ # and running dpkg -b ${base} $NEW_DEB
+ #
+ # my $dscfile = "/usr/src/packages/DSCS/mkbaselibs$$.dsc";
+
+ print "$d_name($target): writing dscfile...\n";
+ # We can Use Parse::DebControl write_file to create the new control file
+ # just modify tags in there
+
+ # We'll use requires -> Depends:
+ map s/^"(.*)"$/$1/, @requires; # remove leading/trailing "s
+ $control{"Depends"} = @requires ? join(", ", @requires) : ""; # join array if exists or reset it to ""
+
+ map s/^"(.*)"$/$1/, @prerequires;
+ $control{"Pre-Depends"} = @prerequires ? join(", ", @prerequires) : "";
+
+ map s/^"(.*)"$/$1/, @provides;
+ $control{"Provides"} = @provides ? join(", ", @provides) : "";
+
+ map s/^"(.*)"$/$1/, @recommends;
+ $control{"Recommends"} = @recommends ? join(", ", @recommends) : "";
+
+ map s/^"(.*)"$/$1/, @suggests;
+ $control{"Suggests"} = @suggests ? join(", ", @suggests) : "";
+
+ map s/^"(.*)"$/$1/, @obsoletes;
+ $control{"Replaces"} = @obsoletes ? join(", ", @obsoletes) : "";
+
+ map s/^"(.*)"$/$1/, @conflicts;
+ $control{"Conflicts"} = @conflicts ? join(", ", @conflicts) : "";
+
+ map s/^"(.*)"$/$1/, @supplements;
+ $control{"Enhances"} = @supplements ? join(", ", @supplements) : "";
+
+
+ # Tidy up the various control files.
+ # the md5sums are regenerated by dpkg-deb when building
+ foreach my $c_file ( qw(conffiles postins postrm preinst prerm) ) {
+ unlink "${baseTarget}/DEBIAN/$c_file";
+ }
+ # Create them if needed
+ if (@prein) {
+ map s/^"(.*)"$/$1/, @prein; # remove leading/trailing "s
+ open(my $SCRIPT, ">${baseTarget}/DEBIAN/preinst");
+ print $SCRIPT join("\n", @prein) ;
+ chmod(0755, $SCRIPT);
+ close($SCRIPT);
+ }
+ if (@postin) {
+ map s/^"(.*)"$/$1/, @postin;
+ open(my $SCRIPT, ">${baseTarget}/DEBIAN/postinst");
+ print $SCRIPT join("\n", @postin) ;
+ chmod(0755, $SCRIPT);
+ close($SCRIPT);
+ }
+ if (@preun) {
+ map s/^"(.*)"$/$1/, @preun;
+ open(my $SCRIPT, ">${baseTarget}/DEBIAN/prerm");
+ print $SCRIPT join("\n", @preun) ;
+ chmod(0755, $SCRIPT);
+ close($SCRIPT);
+ }
+ if (@postun) {
+ map s/^"(.*)"$/$1/, @postun;
+ open(my $SCRIPT, ">${baseTarget}/DEBIAN/postrm");
+ print $SCRIPT join("\n", @postun) ;
+ chmod(0755, $SCRIPT);
+ close($SCRIPT);
+ }
+
+ # Don't forget to rename the package - or it will replace/uninstall the /-based one
+ $control{"Package"} = "${d_name}-${targettype}";
+
+ $controlParser->write_file("${baseTarget}/DEBIAN/control", \%control, {clobberFile => 1, addNewline=>1 } );
+ system "dpkg -b ${baseTarget} /usr/src/packages/DEBS/${d_name}-${targettype}_${d_version}_${targetarch}.deb" || die "dpkg -b failed on $deb";
+ system "rm -rf ${baseTarget}";
+ }
+ system "rm -rf ${base}";
+ }
+}
+
+while (@ARGV) {
+ if ($ARGV[0] eq '-v') {
+ $verbose = 1;
+ shift @ARGV;
+ } elsif ($ARGV[0] eq '-c') {
+ shift @ARGV;
+ read_config($ARGV[0]);
+ shift @ARGV;
+ } else {
+ last;
+ }
+}
+
+# args is a list of full pathnames to rpm/deb files
+die("Usage: mkbaselibs [-v] [-c config] <rpms>\n") unless @ARGV;
+
+my %goodpkgs = map {$_ => 1} get_pkgnames(); # These are packages named in the config file
+my @pkgs = @ARGV;
+my @rpms;
+my @debugrpms;
+for my $rpm (@pkgs) {
+ my $rpmn = $rpm;
+ unless (-f $rpm) {
+ warn ("$rpm does not exist, skipping\n");
+ next;
+ }
+ my @rpmfiles = `rpm -qp --queryformat "[%{FILENAMES}\n]" $rpm`;
+ if (!@rpmfiles) {
+ warn ("$rpm is empty, skipping\n");
+ next;
+ }
+ next if $rpm =~ /\.(no)?src\.rpm$/; # ignore source rpms
+ next if $rpm =~ /\.spm$/;
+ $rpmn =~ s/.*\///; # Remove leading path info
+ $rpmn =~ s/-[^-]+-[^-]+\.[^\.]+\.rpm$/\.rpm/; # remove all version info
+ $rpmn =~ s/\.rpm$//; # remove extension
+ push @rpms, $rpm if $goodpkgs{$rpmn};
+ if ($rpmn =~ s/-debuginfo$//) {
+ push @debugrpms, $rpm if $goodpkgs{$rpmn};
+ }
+}
+for (@rpms) {
+ die("$_: need absolute path to package\n") unless /^\//;
+}
+
+my %debs_to_process = map {$_ => 1} get_debpkgnames(); # These are packages named in the config file
+my @debs;
+for my $deb (@pkgs) {
+ my $debn = $deb;
+ next unless $debn =~ /\.deb$/;
+ my @debfiles = `dpkg --contents $deb`;
+ if (!@debfiles) {
+ warn ("$deb is empty, skipping\n");
+ next;
+ }
+ $debn =~ s/.*\///; # Remove leading path info
+ $debn =~ s/_[^_]+_[^_]+\.deb$//; # remove all version info and extension
+ push @debs, $deb if $debs_to_process{$debn};
+ print "ignoring $deb as $debn not in baselibs.conf\n" if !$debs_to_process{$debn};
+}
+for (@debs) {
+ die("$_: need absolute path to package\n") unless /^\//;
+}
+
+exit 0 unless @rpms or @debs;
+
+if (@rpms) {
+ @filesystem = split("\n", `rpm -ql filesystem 2>/dev/null`);
+ die("filesystem rpm is not installed\n") unless @filesystem;
+ handle_rpms(@rpms);
+ handle_rpms(@debugrpms);
+}
+
+if (@debs) {
+ handle_debs(@debs);
+}
diff --git a/mkdrpms b/mkdrpms
new file mode 100755
index 0000000..eadca44
--- /dev/null
+++ b/mkdrpms
@@ -0,0 +1,159 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, '/usr/lib/build';
+ unshift @INC, $::ENV{'BUILD_DIR'} if $::ENV{'BUILD_DIR'};
+}
+
+use Build;
+use strict;
+
+my $limit = 80; # throw away deltas bigger than this percentage of the reference
+my %oldpkgs;
+
+sub query {
+ my ($file) = @_;
+
+ return undef if $file =~ /\.(?:patch|delta)\.rpm$/; # XXX: rpmtags?
+ my %res = Build::Rpm::rpmq($file, qw/NAME EPOCH VERSION RELEASE ARCH SOURCERPM NOSOURCE NOPATCH 1124/);
+ return undef unless %res;
+ return undef if $res{'1124'}->[0] && $res{'1124'}->[0] eq 'drpm';
+ my $arch;
+ if ($res{'SOURCERPM'}->[0]) {
+ $arch = $res{'ARCH'}->[0];
+ } else {
+ # no src rpm deltas for now
+# if ($res{'NOSOURCE'}->[0] || $res{'NOPATCH'}->[0]) {
+# $arch = 'nosrc';
+# } else {
+# $arch = 'src';
+# }
+ return undef;
+ }
+ return { file => $file, name => $res{'NAME'}->[0], epoch => $res{'EPOCH'} ? $res{'EPOCH'}->[0] : '', version => $res{'VERSION'}->[0], release => $res{'RELEASE'}->[0], arch => $arch};
+}
+
+sub lsrpms {
+ local *D;
+ if (-f "$_[0]") {
+ return ($_[0]) if $_[0] =~ /\.rpm$/;
+ return ();
+ }
+ opendir(D, $_[0]) || return ();
+ my @r = grep {$_ ne '.' && $_ ne '..'} readdir(D);
+ closedir D;
+ return map {"$_[0]/$_"} grep {/\.rpm$/} sort(@r);
+}
+
+while (@ARGV) {
+ if ($ARGV[0] eq '--limit') {
+ shift @ARGV;
+ die("--limit needs an argument\n") unless @ARGV;
+ $limit = shift @ARGV;
+ next;
+ }
+ last;
+}
+
+my $prevbuild = shift @ARGV || die "USAGE: $0 <oldpkgdir> <directories...>";
+my @prevbuild = ($prevbuild);
+my $i = 1;
+while (-d $prevbuild.$i) {
+ push @prevbuild, $prevbuild.$i;
+ ++$i;
+}
+for my $dir (@prevbuild) {
+ for my $file (lsrpms($dir)) {
+ my $q = query($file);
+ next unless $q;
+ my $n = $q->{'name'}.'.'.$q->{'arch'};
+ push @{$oldpkgs{$n}}, $q;
+ }
+}
+
+my $sysret = 0;
+for my $dir (@ARGV) {
+ for my $file (lsrpms($dir)) {
+ my $q = query($file);
+ next unless $q;
+ next if $q->{'arch'} eq 'src' || $q->{'arch'} eq 'nosrc';
+ next if $q->{'name'} =~ /-debug(:?info|source)/; # no debug deltas
+ my $n = $q->{'name'}.'.'.$q->{'arch'};
+
+ for my $oq (@{$oldpkgs{$n} || []}) {
+ my $v = $oq->{'version'};
+ my $r = $oq->{'release'};
+ if ($v eq $q->{'version'} && $r eq $q->{'release'}) {
+ # skip if same version and release
+ next;
+ }
+ $v .= '_'.$q->{'version'} unless $v eq $q->{'version'};
+ $r .= '_'.$q->{'release'} unless $r eq $q->{'release'};
+ my $dn = sprintf("%s-%s-%s.%s.drpm", $q->{'name'}, $v, $r, $q->{'arch'});
+ my $sn = sprintf("%s-%s-%s.%s.dseq", $q->{'name'}, $v, $r, $q->{'arch'});
+ print "$dn ... ";
+ my $dndir = $q->{'file'};
+ $dndir =~ s/[^\/]+$//s;
+ $dn = "$dndir$dn";
+ my $ret = system('makedeltarpm', '-s', $sn, $oq->{'file'}, $q->{'file'}, $dn);
+ if ($ret || ! -e $dn) {
+ unlink($dn);
+ unlink($sn);
+ print "FAILED\n";
+ $sysret = 1;
+ } else {
+ my $ns = (stat($dn))[7] || 1;
+ my $os = (stat($q->{'file'}))[7] || 1;
+ my $factor = int($ns / $os * 100);
+ if ($factor > $limit) {
+ print "too big ($factor%), removed\n";
+ unlink($dn);
+ unlink($sn);
+ } else {
+ local *F;
+ my $seq = '';
+ if (!open(F, '<', $sn)) {
+ print "missing sequence file, removed\n";
+ unlink($dn);
+ unlink($sn);
+ next;
+ }
+ 1 while sysread(F, $seq, 8192, length($seq));
+ close F;
+ chomp $seq;
+ unlink($sn);
+ $seq = "Name: $q->{'name'}\nEpoch: $q->{'epoch'}\nVersion: $q->{'version'}\nRelease: $q->{'release'}\nArch: $q->{'arch'}\nOldName: $oq->{'name'}\nOldEpoch: $oq->{'epoch'}\nOldVersion: $oq->{'version'}\nOldRelease: $oq->{'release'}\nOldArch: $oq->{'arch'}\nSeq: $seq\n";
+ if (!open(F, '>', $sn) || syswrite(F, $seq) != length($seq) || !close(F)) {
+ print "sequence file write error, removed\n";
+ unlink($dn);
+ unlink($sn);
+ next;
+ }
+ print "ok ($factor%)\n";
+ }
+ }
+ }
+ }
+}
+
+exit $sysret;
diff --git a/obs-docker-support b/obs-docker-support
new file mode 100755
index 0000000..77f5a1d
--- /dev/null
+++ b/obs-docker-support
@@ -0,0 +1,226 @@
+#!/bin/bash
+################################################################
+#
+# Enable docker build support in container.
+#
+# Author: Marco Strigl
+#
+################################################################
+#
+# Copyright (c) 2017 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+LOCAL_REPOS_D="/etc/repos_obs_dockersupport.d/"
+LOCAL_APTREPOS_D="/etc/aptrepos_obs_dockersupport.d/"
+
+zypper() {
+ cmd=
+ # try to find the command
+ globalopts=()
+ while test -n "$1"; do
+ case $1 in
+ -*)
+ globalopts[${#globalopts[@]}]="$1"
+ shift
+ ;;
+ *)
+ cmd=$1
+ shift
+ break
+ ;;
+ esac
+ done
+ case $cmd in
+ in|install|rm|remove|up|update|if|info)
+ exec /usr/bin/zypper -D $LOCAL_REPOS_D "${globalopts[@]}" "$cmd" "$@"
+ ;;
+ ar|addrepo)
+ exec /usr/bin/zypper "${globalopts[@]}" "$cmd" -C "$@"
+ ;;
+ ref|refresh)
+ echo "skipping zypper refresh"
+ exit 0
+ ;;
+ *)
+ exec /usr/bin/zypper "${globalopts[@]}" "$cmd" "$@"
+ ;;
+ esac
+}
+
+obs_pkg_mgr() {
+ case "$1" in
+ install|remove)
+ shift
+ exec /usr/bin/zypper -D $LOCAL_REPOS_D --no-gpg-checks -n in "$@"
+ ;;
+ add_repo)
+ shift
+ exec /usr/bin/zypper ar -C "$@"
+ ;;
+ *)
+ echo "Usage: obs_pkg_mgr (install|add_repo) args" >&2
+ exit 1
+ ;;
+ esac
+}
+
+apt_get() {
+ cmd=
+ # try to find the command
+ globalopts=()
+ while test -n "$1"; do
+ case $1 in
+ -*)
+ globalopts[${#globalopts[@]}]="$1"
+ shift
+ ;;
+ *)
+ cmd=$1
+ shift
+ break
+ ;;
+ esac
+ done
+ case $cmd in
+ update)
+ exit 0
+ ;;
+ install|upgrade)
+ exec /usr/bin/apt-get -o Dir::Etc::SourceList=$LOCAL_APTREPOS_D/obssource -o Dir::Etc::SourceParts=$LOCAL_APTREPOS_D --allow-unauthenticated "${globalopts[@]}" "$cmd" "$@"
+ ;;
+ *)
+ exec /usr/bin/apt-get "${globalopts[@]}" "$cmd" "$@"
+ ;;
+ esac
+}
+
+dnf() {
+ # try to find command
+ globalopts=()
+ while test -n "$1"; do
+ case $1 in
+ -*)
+ globalopts[${#globalopts[@]}]="$1"
+ shift
+ ;;
+ *)
+ cmd=$1
+ shift
+ break
+ ;;
+ esac
+ done
+ case $cmd in
+ in|install|up|update)
+ exec /usr/bin/dnf --setopt=reposdir=$LOCAL_REPOS_D "${globalopts[@]}" "$cmd" "$@"
+ ;;
+ *)
+ exec /usr/bin/dnf "${globalopts[@]}" "$cmd" "$@"
+ ;;
+ esac
+}
+
+yum() {
+ # try to find command
+ globalopts=()
+ while test -n "$1"; do
+ case $1 in
+ -*)
+ globalopts[${#globalopts[@]}]="$1"
+ shift
+ ;;
+ *)
+ cmd=$1
+ shift
+ break
+ ;;
+ esac
+ done
+ case $cmd in
+ in|install|up|update)
+ exec /usr/bin/yum --setopt=reposdir=$LOCAL_REPOS_D "${globalopts[@]}" "$cmd" "$@"
+ ;;
+ *)
+ exec /usr/bin/yum "${globalopts[@]}" "$cmd" "$@"
+ ;;
+ esac
+}
+
+obs_docker_support() {
+ case "$1" in
+ --install|-i)
+ test -e /usr/bin/zypper && ln -s obs-docker-support /usr/local/sbin/zypper
+ test -e /usr/bin/yum && ln -s obs-docker-support /usr/local/sbin/yum
+ test -e /usr/bin/dnf && ln -s obs-docker-support /usr/local/sbin/dnf
+ test -e /usr/bin/apt-get && ln -s obs-docker-support /usr/local/sbin/apt-get
+ ln -s obs-docker-support /usr/local/sbin/obs_pkg_mgr
+ if test -e /usr/bin/zypper -o -e /usr/bin/yum -o -e /usr/bin/dnf ; then
+ mkdir -p "$LOCAL_REPOS_D"
+ cat >$LOCAL_REPOS_D/obs_repository.repo <<'EOF'
+[obs_repository]
+name=obs_repository
+enabled=1
+autorefresh=0
+baseurl=http://localhost:80/
+type=rpm-md
+gpgcheck=0
+EOF
+ test -x /usr/bin/zypper && /usr/bin/zypper -D $LOCAL_REPOS_D ref
+ fi
+ if test -e /usr/bin/apt-get ; then
+ mkdir -p "$LOCAL_APTREPOS_D"
+ echo "deb http://localhost:80 ./" > $LOCAL_APTREPOS_D/obssource
+ test -e /var/lib/apt && mv /var/lib/apt /var/lib/apt.obssave
+ /usr/bin/apt-get -o Dir::Etc::SourceList=$LOCAL_APTREPOS_D/obssource -o Dir::Etc::SourceParts=$LOCAL_APTREPOS_D update
+ fi
+ ;;
+ --uninstall|-u)
+ rm -rf "$LOCAL_REPOS_D"
+ rm -rf "$LOCAL_APTREPOS_D"
+ rm -f /usr/local/sbin/zypper
+ rm -f /usr/local/sbin/yum
+ rm -f /usr/local/sbin/dnf
+ rm -f /usr/local/sbin/apt-get
+ rm -f /usr/local/sbin/obs_pkg_mgr
+ if test -e /var/lib/apt.obssave ; then
+ rm -rf /var/lib/apt
+ mv /var/lib/apt.obssave /var/lib/apt
+ fi
+ rm -f /usr/local/sbin/obs-docker-support
+ ;;
+ esac
+}
+
+case ${0##*/} in
+obs-docker-support)
+ obs_docker_support "$@"
+ ;;
+obs_pkg_mgr)
+ obs_pkg_mgr "$@"
+ ;;
+zypper)
+ zypper "$@"
+ ;;
+apt-get)
+ apt_get "$@"
+ ;;
+*)
+ echo "obs-docker-support: unsupported mode ${0##*/}" >&2
+ exit 1
+esac
+
diff --git a/obs_example/Dockerfile b/obs_example/Dockerfile
new file mode 100644
index 0000000..56101f2
--- /dev/null
+++ b/obs_example/Dockerfile
@@ -0,0 +1,19 @@
+FROM opensuse:latest
+
+# Make obs_pkg_mgr available
+ARG OBS_REPOSITORY_URL
+ADD obs_pkg_mgr /usr/bin/obs_pkg_mgr
+RUN chmod +x /usr/bin/obs_pkg_mgr
+
+RUN obs_pkg_mgr add_repo http://download.opensuse.org/repositories/Virtualization:/containers/openSUSE_Leap_42.2/ "Virtualization:Containers (openSUSE_Leap_42.2)" && ls ; obs_pkg_mgr add_repo http://example.com/my_project:/mysubproject/my_package/ "My example project" && ls
+
+RUN obs_pkg_mgr install util-linux calcurse # amarok
+RUN obs_pkg_mgr install awk gcc \
+ which
+
+RUN ls # irrelevant command before additional dependencies
+
+RUN obs_pkg_mgr install glibc \
+ file-magic && ls ; ls -la ; obs_pkg_mgr install nethogs
+
+RUN obs_pkg_mgr install ssh-contact dumb-init; ls && ls -la
diff --git a/obs_example/fissile_example_spec.yml b/obs_example/fissile_example_spec.yml
new file mode 100644
index 0000000..729235d
--- /dev/null
+++ b/obs_example/fissile_example_spec.yml
@@ -0,0 +1,11 @@
+Name: "uaa-fissile-package"
+Version: 0.0
+Release: 0
+Summary: This package generates docker images for uaa-fissile-release
+License: [TBD]
+Description: "This is a very long description"
+DockerImageDeps:
+ - "fissile-dev:201707081450"
+Build: "./build"
+Artifacts:
+ - ".bosh/cache/*"
diff --git a/obs_example/obs_pkg_mgr b/obs_example/obs_pkg_mgr
new file mode 100755
index 0000000..0c30d7a
--- /dev/null
+++ b/obs_example/obs_pkg_mgr
@@ -0,0 +1,70 @@
+#!/bin/bash
+VERSION="0.1"
+DESCRIPTION="Command/Subcommand line script template"
+
+usage() {
+ echo "Usage: $0 (install|add_repo) args" 1>&2; exit 1;
+}
+function disable_repos {
+ # Disable all repos
+ for repo in "${repos[@]}"; do
+ zypper modifyrepo -d $repo
+ done
+
+ # Add OBS repository
+ zypper ar $OBS_REPOSITORY_URL obs_repository
+}
+
+function enable_repos {
+ # Remove our obs repository
+ zypper rr obs_repository
+
+ # Enable all repos
+ for repo in "${repos[@]}"; do
+ zypper modifyrepo -e $repo
+ done
+}
+
+install() {
+ shift # remove the subcommand
+
+ # Get enables repos and store them so we can enable them in the end.
+ readarray -t repos <<< "$(zypper ls -E | grep "Yes" | awk '{print $1}' )"
+
+ [ ! -z "$OBS_REPOSITORY_URL" ] && disable_repos
+
+ zypper ref
+ # TODO: use the "-r" option to avoid disabling/enabling repos
+ zypper --no-gpg-checks -n in "$@"
+
+ [ ! -z "$OBS_REPOSITORY_URL" ] && enable_repos
+}
+
+# Currently only this format is supported:
+# obs_pkg_mgr add_repo <URI> <alias>
+# obs_pkg_mgr add_repo <URI> <alias>
+add_repo() {
+ shift # remove the subcommand
+
+ # No need to refresh the repo if we are inside OBS
+ if [ ! -z "$OBS_REPOSITORY_URL" ]; then
+ zypper ar -C -G "$@"
+ else
+ zypper ar -G "$@"
+ fi
+}
+
+case "$1" in
+ install)
+ install "$@"
+ ;;
+ add_repo)
+ add_repo "$@"
+ ;;
+ *)
+ usage
+ exit 1
+ ;;
+esac
+
+exit 0;
diff --git a/openstack-console b/openstack-console
new file mode 100644
index 0000000..b8cc193
--- /dev/null
+++ b/openstack-console
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+
+################################################################
+#
+# Copyright (c) 2017 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+import websocket
+import sys
+import re
+import time
+url = ''
+
+if len(sys.argv) != 2:
+ sys.exit("usage: openstack-console <url>")
+else:
+ url = sys.argv[1]
+
+print("openstack-console: Using url '%s'" % url)
+ws = websocket.create_connection(url,
+ header={'Sec-WebSocket-Protocol: binary'})
+buf = ''
+
+timeout=120
+
+while timeout > 0:
+ try:
+ data = ws.recv()
+ break
+ except websocket._exceptions.WebSocketConnectionClosedException:
+ print("Failed to get data from websocket %d retries left." % timeout)
+ ws = websocket.create_connection(url,
+ header={'Sec-WebSocket-Protocol: binary'})
+ timeout -= 1
+ time.sleep(1)
+
+while True:
+ sys.stdout.write(data)
+ if not ws.connected:
+ sys.stdout.write("[connection closed]\n")
+ break
+ buf += data
+ buf = buf[-256:]
+ if re.search("[\r\n]\[\s*[0-9\.]*]\s+reboot: Power down", buf):
+ break
+ data = ws.recv()
+ws.close()
diff --git a/order b/order
new file mode 100755
index 0000000..a3c9d8e
--- /dev/null
+++ b/order
@@ -0,0 +1,101 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use Build;
+use strict;
+
+my ($dist, $archs, $configdir, $manifest);
+
+$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs';
+
+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 && $ARGV[0] eq '--manifest') {
+ shift @ARGV;
+ $manifest = shift @ARGV;
+ next;
+ }
+ last;
+}
+
+die("usage: order [--manifest manifest] cachedir [packages...]\n") unless @ARGV;
+my $cachedir = shift @ARGV;
+
+my @p;
+if ($manifest) {
+ if ($manifest eq '-') {
+ @p = <STDIN>;
+ } else {
+ local *F;
+ open(F, '<', $manifest) || die("$manifest: $!\n");
+ @p = <F>;
+ close F;
+ }
+ chomp @p;
+}
+
+push @p, @ARGV;
+
+my $config = Build::read_config_dist($dist, $archs, $configdir);
+
+my %deps;
+my %bins;
+
+for my $p (@p) {
+ my $q;
+ for my $suf ('rpm', 'deb', 'arch') {
+ next unless -f "$cachedir/$p.$suf";
+ if (! -s "$cachedir/$p.$suf") {
+ $q = {'provides' => [], 'requires' => []}; # package from preinstallimage, no need to order
+ last;
+ }
+ $q = Build::query("$cachedir/$p.$suf", 'filelist' => 1, 'alldeps' => 1, 'addselfprovides' => 1, 'normalizedeps' => 1);
+ die("bad binary: $p.$suf\n") unless $q;
+ push @{$q->{'provides'}}, @{$q->{'filelist'}} if $suf eq 'rpm' && $q->{'filelist'};
+ delete $q->{'filelist'};
+ last;
+ }
+ die("binary not found: $p\n") unless $q;
+ $deps{$p} = $q;
+}
+
+Build::readdeps($config, undef, \%deps);
+@p = Build::order($config, @p);
+print "@p\n";
diff --git a/qemu-reg b/qemu-reg
new file mode 100644
index 0000000..ce679dd
--- /dev/null
+++ b/qemu-reg
@@ -0,0 +1,33 @@
+# register qemu binfmts
+# - used by initvm, build common_functions and init_buildsystem
+# derived from /usr/sbin/qemu-binfmt-conf.sh
+
+# NOTE: this requires a qemu with the binfmt misc handler binary
+
+# NOTE: blacklisted host machine types are added via space separated elements
+
+: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
+
+:alpha:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-alpha-binfmt:P alpha
+
+: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 armv6l armv7l armv8l
+: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 armv6b armv7b armv8b
+
+: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 ppc ppc64
+:ppc64:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc64-binfmt:P ppc64
+:ppc64le:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x15:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-ppc64le-binfmt:P ppc64le
+
+:m68k:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x04:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-m68k-binfmt:P m68k
+
+: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 mips
+: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 mipsel
+
+:riscv64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-riscv64-binfmt:P riscv64
+
+:s390x:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x16:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-s390x-binfmt:P s390x
+
+: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 sh4
+: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 sh4eb
+
+:sparc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sparc-binfmt:P sparc
+
diff --git a/queryconfig b/queryconfig
new file mode 100755
index 0000000..266611d
--- /dev/null
+++ b/queryconfig
@@ -0,0 +1,101 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use strict;
+
+use Build;
+use Build::Rpm;
+
+sub evalmacros {
+ my ($config, $str) = @_;
+ my @xspec;
+ Build::Rpm::parse({%$config, 'save_expanded' => 1} , [ "$str" ], \@xspec);
+ return @xspec && ref($xspec[0]) ? $xspec[0]->[1] : '';
+}
+
+my ($dist, $archs, $configdir, $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 'hostarch') {
+ my $result = $cf->{"hostarch"};
+ 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 'repotype') {
+ print join(' ', @{$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;
+} elsif ($type eq 'eval') {
+ die("Specify what to eval\n") unless defined $argument;
+ my $result = evalmacros($cf, $argument);
+ print "$result\n";
+} else {
+ die("unsupported query type: $type\n");
+}
+
+exit(0);
+
diff --git a/runservices b/runservices
new file mode 100755
index 0000000..f4002ff
--- /dev/null
+++ b/runservices
@@ -0,0 +1,113 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use POSIX;
+use File::Temp ();
+use File::Copy ();
+
+use strict;
+
+use Build::SimpleXML;
+
+my $servicedir = '/usr/lib/obs/service';
+my $buildroot = '';
+
+sub ls {
+ local *D;
+ opendir(D, $_[0]) || return ();
+ my @r = grep {$_ ne '.' && $_ ne '..'} readdir(D);
+ closedir D;
+ return @r;
+}
+
+sub run_services {
+ my ($xml) = @_;
+
+ my $servicexml = Build::SimpleXML::parse($xml);
+ die("not a valid _service file\n") unless $servicexml && $servicexml->{'services'};
+ $servicexml = $servicexml->{'services'}->[0];
+
+ my $tempdir;
+ if ($buildroot ne '') {
+ $tempdir = File::Temp::tempdir('CLEANUP' => 1, 'DIR' => "$buildroot/tmp");
+ die("bad tempdir\n") unless $tempdir =~ s/^\Q$buildroot\E//;
+ } else {
+ $tempdir = File::Temp::tempdir('CLEANUP' => 1);
+ }
+
+ # take default version setting
+ for my $s (@{$servicexml->{'service'} || []}) {
+ # buildtime only is default
+ next unless $s->{'mode'} && $s->{'mode'} eq 'buildtime';
+ die("missing name in service\n") unless $s->{'name'};
+
+ if (! -x "$buildroot$servicedir/$s->{'name'}") {
+ die("service '$s->{'name'}' configured to run, but is not available\n");
+ }
+
+ my @run;
+ push @run, "$servicedir/$s->{'name'}";
+ for my $param (@{$s->{'param'}}) {
+ next if $param->{'name'} eq 'outdir';
+ next unless $param->{'_content'};
+ push @run, "--$param->{'name'}";
+ push @run, $param->{'_content'};
+ }
+ push @run, "--outdir";
+ push @run, $tempdir;
+ my $pid = fork();
+ die("fork: $!\n") unless defined $pid;
+ if ($pid == 0) {
+ if ($buildroot ne '') {
+ chroot($buildroot) || die("chroot $buildroot: $!\n");
+ }
+ exec(@run);
+ die("$run[0]: $!\n");
+ }
+ 1 while waitpid($pid, 0) != $pid;
+ die("service run failed for service '$s->{'name'}'\n") if $?;
+ # copy back
+ for my $file (grep {!/^[:\.]/} ls("$buildroot$tempdir")) {
+ File::Copy::move("$buildroot$tempdir/$file", $file) if -f "$buildroot$tempdir/$file";
+ }
+ }
+}
+
+if (@ARGV > 1 && $ARGV[0] eq '--buildroot') {
+ shift @ARGV;
+ $buildroot = shift @ARGV;
+ $buildroot = '' if $buildroot && $buildroot eq '/';
+ $buildroot =~ s@//+@/@; # or we may fail with 'bad tempdir' later.
+ die("bad buildroot\n") unless $buildroot eq '' || $buildroot =~ /^\//;
+}
+
+local *F;
+open(F, '<', '_service') || die("_service: $!\n");
+my $xml = '';
+1 while sysread(F, $xml, 4096, length($xml)) > 0;
+close F;
+
+run_services($xml);
diff --git a/signdummy b/signdummy
new file mode 100755
index 0000000..df15f84
--- /dev/null
+++ b/signdummy
@@ -0,0 +1,65 @@
+#!/usr/bin/perl
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+# simple "sign" replacement that does nothing but
+# write a 2048 byte file with a fixed signature.
+# sign is used in kiwi builds to sign repositories
+
+my $mode;
+
+while (@ARGV) {
+ if ($ARGV[0] =~ /^-([cdrp])$/) {
+ $mode = $1;
+ shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--') {
+ shift @ARGV;
+ last;
+ }
+ if ($ARGV[0] =~ /^-/) {
+ die("unsupported option $ARGV[0]\n");
+ }
+ last;
+}
+if ($mode eq 'p') {
+ my $block = "sIGnMeP\n";
+ $block .= "\0" x (8192 - length($block));
+ (syswrite(STDOUT, $block) || 0) == 8192 || die("pubkey write: $!\n");
+ exit 0;
+}
+die("only detached mode possible\n") if !$mode || $mode ne 'd';
+die("filter mode not supported\n") unless @ARGV;
+
+for my $file (@ARGV) {
+ local *F;
+ open(F, '<', $file) || die("$file: $!\n");
+ my $buf = '';
+ 1 while sysread(F, $buf, 16384, length($buf));
+ close(F) || die("$file: $!\n");
+ my $block = "sIGnMe!\n";
+ $block .= sprintf("%08x%08x\n", length($buf), unpack("%32C*", $buf));
+ $block .= "\0" x (2048 - length($block));
+ open(F, '>', "$file.asc") || die("$file.asc: $!\n");
+ (syswrite(F, $block) || 0) == 2048 || die("$file.asc: $!\n");
+ close(F) || die("$file.asc: $!\n");
+}
diff --git a/spec2changelog b/spec2changelog
new file mode 100755
index 0000000..f505a9f
--- /dev/null
+++ b/spec2changelog
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+#
+# Tiny perl script that parses a .spec file (STDIN), extracts
+# its %changelog entries and prints (STDOUT) them in the
+# format of a .changes file, ordered.
+#
+# Usage: cat foo.spec | spec2changes.pl > foo.changes
+#
+################################################################
+#
+# Copyright 2009 by Pascal Bleser <pascal.bleser@opensuse.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+use warnings;
+use strict;
+use Date::Language;
+use POSIX qw(strftime setlocale LC_ALL);
+
+# make sure date printed in correct locale
+$ENV{'TZ'} = 'UTC';
+setlocale(LC_ALL, 'C');
+
+my $sep = "-" x 67;
+my @days = qw{Mon Tue Wed Thu Fri Sat Sun};
+my @months = qw{Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec};
+
+#----------------------------------------------------------------------
+#
+my %dh = map { $_ => 1 } @days;
+my %mh = map { $_ => 1 } @months;
+
+my $date_parser = Date::Language->new('English');
+
+my %items = ();
+my $current_block = undef;
+my $time = undef;
+while (<>) {
+ if (/^%changelog/ .. eof()) {
+ next if /^%/;
+ next if /^\s*#/;
+
+ chomp;
+ s/\s+$//;
+
+ if (/^\*\s+(([A-Z][a-z]{2})\s+([A-Z][a-z]{2})\s+\d{1,2}\s+\d{4})(\s+(.*)\s*)$/ and exists $dh{$2} and exists $mh{$3}) {
+ $items{$time} = $current_block if defined $current_block and defined $time;
+ $time = $date_parser->str2time($1);
+ $current_block = [];
+ $_ = $4;
+ } elsif (/^\*/) {
+ warn("not matching a headline: \"$_\"\n");
+ }
+ push(@$current_block, $_);
+ }
+}
+$items{$time} = $current_block if defined $current_block and defined $time;
+
+foreach my $time (sort { $b <=> $a } (keys(%items))) {
+ print $sep, "\n";
+ my $item = $items{$time};
+ my $head = shift(@$item);
+ $head =~ s/^\s+//;
+ $head =~ s/^\-\s+//;
+ if ($head =~ m/^(.+?)\s*<(.+?\@.+?\..+?)>(\s*.*)$/) {
+ $head = "$1 <$2>";
+ } elsif ($head =~ m/^<(.+?\@.+?\..+?)>(\s*.*)$/) {
+ $head = $1;
+ }
+ if ($head =~ m/^\s*-\s*(.+)$/) {
+ $head = $1;
+ }
+
+ print strftime("%a %b %e %H:%M:%S %Z %Y", localtime($time)), " - ", $head, "\n";
+ my $first = shift(@$item);
+ print "\n" unless defined($first) && ($first eq '');
+ print $first, "\n";
+ print join("\n", @$item), "\n" if @$item;
+ print "\n";
+}
diff --git a/spec_add_patch b/spec_add_patch
new file mode 100755
index 0000000..fa0fa2b
--- /dev/null
+++ b/spec_add_patch
@@ -0,0 +1,177 @@
+#!/usr/bin/perl -w
+# vim:sw=4:et
+# Author: Dirk Mueller
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+use strict;
+
+sub helpexit {
+ print "$0: <patches...> [file.spec]\n";
+ exit 1;
+}
+
+my $specname;
+my %diffs;
+
+for my $arg (@ARGV) {
+ if ($arg =~ /\.spec$/) {
+ helpexit() if $specname;
+ $specname = $arg;
+ next;
+ }
+ $diffs{$arg} = 1;
+}
+
+sub find_specfile()
+{
+ opendir(D, ".");
+ my @specs = grep { /\.spec$/ } readdir(D);
+ closedir(D);
+
+ # choose the one with the shortest name (heuristic)
+ $specname = ( sort { length($a) - length($b) } @specs)[0];
+
+}
+
+if (!defined($specname) || ! -f $specname) {
+ &find_specfile();
+}
+
+
+open(S, '<', $specname) or die;
+
+my $ifdef_level = 0;
+my $in_prep = 0;
+my $in_global = 1;
+my $last_patch_in_prep_index = 0;
+my $last_patch_in_global_index = 0;
+my $last_source_in_global_index = 0;
+my @c = ();
+my $index = 0;
+
+# first read the specfile, parse useful information
+while(<S>)
+{
+
+ if(/^\s*%\s*endif/) {
+ $ifdef_level--;
+ $last_patch_in_prep_index = $index if ($in_prep && $ifdef_level == 0);
+ }
+ die if ($ifdef_level < 0);
+ $ifdef_level++ if(/^\s*%\s*if/);
+
+ if ($ifdef_level == 0 && !$in_prep && $in_global
+ && /^\%(?:prep|build|install|package|description|doc)/) {
+ $in_global = 0;
+ }
+
+ if (!$in_prep && /^%prep/i) {
+ $in_prep = 1;
+ die if ($in_global);
+ }
+
+ if ($in_prep
+ && /^%setup\b/) {
+ $last_patch_in_prep_index = $index;
+ }
+
+ if ($in_prep
+ && /^\%(?:build|install|package|description|doc)/) {
+ $in_prep = 0;
+ }
+
+ die if (($in_prep + $in_global) > 1);
+
+ if ($in_global && /^Patch(?:\d+)?:\s+(.+)/) {
+ $last_patch_in_global_index = $index;
+ if ($diffs{$1}) {
+ print "$1 already in, skipped.";
+ delete $diffs{$1};
+ }
+ }
+
+ if ($in_global && $ifdef_level == 0 && /^Source(?:\d+)?:/) {
+ $last_source_in_global_index = $index;
+ }
+
+ if ($in_prep && $ifdef_level == 0 && /^\%patch/) {
+ $last_patch_in_prep_index = $index;
+ }
+ push(@c, $_);
+ $index++;
+}
+close(S);
+
+# append after last Source if this spec doesn't have any Patches
+if ($last_patch_in_global_index == 0) {
+ $last_patch_in_global_index = $last_source_in_global_index;
+}
+
+die if ($ifdef_level > 0);
+die if ($in_global || $in_prep);
+die if ($last_patch_in_prep_index == 0);
+die if ($last_patch_in_global_index == 0);
+
+#print "adding Patch: $diffname to line $last_patch_in_global_index\n";
+#print "adding %patch to line $last_patch_in_prep_index\n";
+
+# determine patch number
+my $patchnum = 0;
+$patchnum = $1+1 if ($c[$last_patch_in_global_index] =~ /Patch(\d+):/);
+$patchnum = 1 if ($c[$last_patch_in_global_index] =~ /Patch:/);
+
+for my $diffname (keys %diffs) {
+ # determine strip level
+ my $striplevel = "";
+ open(P, '<', $diffname) or die "$diffname: $!\n";
+ while(<P>) {
+ # Check if either the --- filename starts with 'a/' or the +++
+ # filename starts with 'b/', or either starts with a package
+ # name/version prefix. We have to check for either, because either
+ # of them could be /dev/null if a file is being added or
+ # deleted.
+ $striplevel = " -p1"
+ if m,^--- a/, or
+ m,^\+\+\+ b/, or
+ m,^(---|\+\+\+) [^/]+-\d+\.,;
+ last if (/^@@ -\d/);
+
+ }
+ close(P);
+
+ print "Adding patch$striplevel $diffname to $specname\n";
+
+
+ splice @c, $last_patch_in_prep_index+1, 0, ("\%patch$patchnum$striplevel\n");
+ splice @c, $last_patch_in_global_index+1, 0,
+ (sprintf "Patch%s:%s%s\n", $patchnum, ' ' x (10-length($patchnum)), $diffname);
+ ++$last_patch_in_global_index;
+ $last_patch_in_prep_index+=2; # actually line number
+ ++$patchnum;
+}
+
+open(O, '>', "$specname.new") or die;
+print O @c;
+close(O);
+
+system("diff", "-u", $specname, "$specname.new");
+rename("$specname.new", $specname);
diff --git a/spectool b/spectool
new file mode 100755
index 0000000..bdb897c
--- /dev/null
+++ b/spectool
@@ -0,0 +1,426 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+=head1 spectool
+
+spectool - tool to work with rpm spec files
+
+=head1 SYNOPSIS
+
+spectool [options] specfiles...
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--help>
+
+display help as manpage
+
+=item B<--dist>=I<STRING>
+
+set distribution, e.g. "11.1-i586" or path to config
+
+=item B<--archpath>=I<STRING>
+
+compatible architecture separated by colon, e.g. C<i586:i486:i386>.
+Autotected if missing.
+
+=item B<--configdir>=I<STRING>
+
+path to config files if B<--dist> didn't specify a full path
+
+=item B<--define>=I<STRING>
+
+=item B<--with>=I<STRING>
+
+=item B<--without>=I<STRING>
+
+same meaning as in rpmbuild
+
+=item B<--tag>=I<STRING>
+
+print tag from spec file, e.g. C<version>. Regexp is also possible,
+e.g. C</source[01]/>
+
+=item B<--sources>
+
+print package source files. If a file C<sources> or
+C<I<packagename>.sources> is present verify the checksums against
+that.
+
+=over 4
+
+=item B<--update>
+
+update the checksums
+
+=item B<--download>
+
+download missing sources
+
+=back
+
+=back
+
+=head1 DESCRIPTION
+
+The B<--sources> option allows to manage a sources file in a way
+similar to Fedora. The sources file lists the check sums and file
+names of the binary files specified in the spec file.
+
+B<--sources> without further options compares the check sums of all
+files and prints a report consisting of a character that describes
+the status of the file and the file name. Meaning of the characters
+is as follows:
+
+=over 4
+
+=item B<.> check sum matches
+
+=item B<!> check sum broken
+
+=item B<d> file is missing, checksum known. Can be verified after download
+
+=item B<-> file is missing and checksum unknown
+
+=item B<_> file is present but checksum unknown
+
+=item B<t> text file, will be skipped for check sums
+
+=item B<?> check sum known but not referenced from spec file
+
+=back
+
+Additionally specifying B<--update> recomputes all check sums and
+updates the sources file.
+
+With B<--download> all missing files are downloaded if the spec file
+has an http or ftp url.
+
+=head2 FORMAT OF THE SOURCES FILE
+
+Lines of the form
+<checksum> <whitespace> <filename>
+
+=head2 NAME OF THE SOURCES FILE
+
+A file named C<sources> is preferred if present for compatibility
+with Fedora. It only contains md5 sums. If that file is not present
+the C<.spec> suffix of the spec file is replaced with C<.sources>
+and the this name used as sources file (e.g. C<foo.spec> ->
+C<foo.sources>). In this file sha1 is preferred. Also, the name of
+the algorithm is prepended with colon to the check sum.
+
+=cut
+
+my $builddir;
+
+BEGIN {
+ $builddir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+ unshift @INC, $builddir;
+}
+
+use strict;
+
+use Build;
+use Pod::Usage;
+use Getopt::Long;
+Getopt::Long::Configure("no_ignore_case");
+
+my (@opt_showtag, $opt_sources, $opt_update, $opt_download);
+
+sub parse_depfile;
+
+my ($dist, $rpmdeps, $archs, $configdir, $useusedforbuild);
+my %options;
+
+GetOptions (
+ \%options,
+ "help" => sub { pod2usage(-exitstatus => 0, -verbose => 2) },
+
+ "dist=s" => \$dist,
+ "archpath=s" => \$archs,
+ "configdir=s" => \$configdir,
+ "define=s" => sub { Build::define($_[1]) },
+ "with=s" => sub { Build::define("_with_".$_[1]." --with-".$_[1]) },
+ "without=s" => sub { Build::define("_without_".$_[1]." --without-".$_[1]) },
+
+ "tag=s" => \@opt_showtag,
+ "sources" => \$opt_sources,
+ "update" => \$opt_update,
+ "download" => \$opt_download,
+ "download-force",
+ "download-recompress=s",
+ "download-outdir=s",
+ "download-compare=s",
+ "download-delete-identical",
+) or pod2usage(1);
+
+pod2usage(1) unless @ARGV;
+
+my $ua;
+
+my @specs = @ARGV;
+
+die "--download must be used together with --sources\n" if ($opt_download && !$opt_sources);
+die "--update must be used together with --sources\n" if ($opt_update && !$opt_sources);
+
+$options{'download-recompress'} ||= 'auto';
+$options{'download-outdir'}.='/' if ($options{'download-outdir'} && $options{'download-outdir'} !~ /\/$/);
+$options{'download-outdir'} ||= '';
+$options{'download-compare'}.='/' if ($options{'download-compare'} && $options{'download-compare'} !~ /\/$/);
+$options{'download-compare'} ||= '';
+
+my @archs;
+if (!defined $archs) {
+ use POSIX qw/uname/;
+ my %archmap = qw/x86_64 i686 i686 i586 i586 i486 i486 i386/;
+ my @a = uname();
+ push @archs, $a[4];
+ while(exists $archmap{$archs[-1]}) {
+ push @archs, $archmap{$archs[-1]};
+ }
+} else {
+ @archs = split(':', $archs);
+}
+push @archs, 'noarch' unless grep {$_ eq 'noarch'} @archs;
+
+unless ($dist) {
+ $dist = 'spectool';
+# $dist = `rpm -q --qf '%{DISTRIBUTION}' rpm 2>/dev/null`;
+# $dist = Build::dist_canon($dist||'', $archs[0]);
+}
+
+if($dist !~ /\// && !defined $configdir) {
+ if($0 =~ /^\//) {
+ use File::Basename qw/dirname/;
+ $configdir = dirname($0).'/configs';
+ undef $configdir unless -e $configdir.'/sl11.3.conf';
+ } else {
+ $configdir = $builddir.'/configs';
+ undef $configdir unless -e $configdir.'/sl11.3.conf';
+ }
+ if(!defined $configdir) {
+ print STDERR "please specify config dir\n";
+ }
+}
+
+#######################################################################
+
+# param: array to fill, spec file
+# return: file name
+sub read_sources_digests($$)
+{
+ my $files = shift;
+ my $spec = shift;
+ my $srcfile = 'sources';
+ if (! -r $srcfile) {
+ $srcfile = $spec;
+ $srcfile =~ s/spec$/sources/;
+ }
+ if (open (F, '<', $srcfile)) {
+ while(<F>) {
+ chomp;
+ my ($sum, $file) = split(/ +/, $_, 2);
+ $files->{$file} = $sum;
+ }
+ close F;
+ }
+ return $srcfile;
+}
+
+# param: file, oldsum
+# return: newsum or undef if match
+sub check_sum($$)
+{
+ my $file = shift;
+ my $oldsum = shift || 'sha1:';
+ my $sum;
+ my $type = 'md5:';
+ if($oldsum =~ /^(\S+:)/) {
+ $type = $1;
+ } else {
+ $oldsum = $type.$oldsum;
+ }
+ if ($type eq 'md5:') {
+ $sum = $type.`md5sum $file` || die "md5sum failed\n";
+ } elsif ($type eq 'sha1:') {
+ $sum = $type.`sha1sum $file` || die "sha1sum failed\n";
+ } else {
+ die "unsupported digest type '$type'\n";
+ }
+ $sum =~ s/ .*//s;
+ if($sum ne $oldsum) {
+ return $sum;
+ }
+ return undef;
+}
+
+sub download($$)
+{
+ my ($url, $dest) = @_;
+ my $retry = 3;
+ while ($retry--) {
+ my $res = $ua->mirror($url, $dest);
+ last if $res->is_success;
+ # if it's a redirect we probably got a bad mirror and should just retry
+ return 0 unless $retry && $res->previous;
+ warn "retrying $url\n";
+ }
+ return 1;
+}
+
+#######################################################################
+
+my $ret = 0;
+for my $spec (@specs) {
+ my $cf = Build::read_config_dist($dist, $archs[0], $configdir);
+ my $parsed = Build::parse($cf, $spec);
+
+ if (!defined $parsed) {
+ die "can't parse $spec\n";
+ }
+
+ for my $tag (@opt_showtag) {
+ if($tag =~ /^\/(.+)\/$/) {
+ my $expr = $1;
+ for my $t (keys %$parsed) {
+ if ($t =~ $expr) {
+ push @opt_showtag, $t;
+ }
+ }
+ } else {
+ if(exists $parsed->{lc $tag}) {
+ print $tag, ": ";
+ my $v = $parsed->{lc $tag};
+ $v = join(' ', @$v) if (ref $v eq 'ARRAY');
+ print $v, "\n";
+ } else {
+ print STDERR "$tag does not exist\n";
+ }
+ }
+ }
+
+ if ($opt_sources) {
+ my $files = {};
+ my $srcfile = read_sources_digests($files, $spec);
+ if ($opt_download) {
+ unless ($ua) {
+ use LWP::UserAgent;
+ $ua = LWP::UserAgent->new(
+ agent => "openSUSE build service",
+ env_proxy => 1,
+ timeout => 42);
+ }
+
+ for my $t (keys %$parsed) {
+ next unless ($t =~ /^(?:source|patch)\d*/);
+ my $url = $parsed->{$t};
+ next unless $url =~ /^(?:https?|ftp):\/\//;
+ my $file = $url;
+ $file =~ s/.*\///;
+ my $src = $options{'download-compare'}.$file;
+ next if -e $src && !($options{'download-force'} || $options{'download-delete-identical'});
+ print "Downloading $file...\n";
+ my $dest = $options{'download-outdir'}.$file;
+ print "$url -> $dest\n";
+
+ if(!download($url, $dest) && $options{'download-recompress'} ne 'no') {
+ # TODO
+ # let's see if the file was recompressed
+ if($url =~ s/\.bz2$/.gz/ && $file =~ s/\.bz2$/.gz/
+ && !download($url, $dest)) {
+ if(system('bznew', $dest) == 0) {
+ print STDERR "Used $file and recompressed to bz2 instead\n";
+ } else {
+ unlink $dest;
+ }
+ } else {
+ print STDERR "Downloading $file failed\n";
+ }
+ }
+ if ($options{'download-delete-identical'} && $options{'download-outdir'}
+ && system('cmp', '-s', $dest, $src) == 0) {
+ unlink($dest);
+ }
+ }
+ }
+ if ($opt_update) {
+ my $changed;
+ for my $t (keys %$parsed) {
+ next unless ($t =~ /^(?:source|patch)\d*/);
+ my $file = $parsed->{$t};
+ $file =~ s/.*\///;
+ next unless -B $file;
+ my $sum = check_sum($file, ($files->{$file} || ($srcfile eq 'sources'?'md5:':'sha1:')));
+ if($sum) {
+ print STDERR "update $file\n";
+ $files->{$file} = $sum;
+ $changed = 1;
+ }
+ }
+ if($changed) {
+ if(open(F, '>', $srcfile)) {
+ for my $file (keys %$files) {
+ $files->{$file} =~ s/^md5:// if $srcfile eq 'sources';
+ print F $files->{$file}, ' ', $file, "\n";
+ }
+ close F;
+ }
+ }
+ } else {
+ for my $t (keys %$parsed) {
+ next unless ($t =~ /^(?:source|patch)\d*/);
+ my $file = $parsed->{$t};
+ $file =~ s/.*\///;
+ if (!exists $files->{$file}) {
+ if (! -e $file) {
+ print '- ';
+ } elsif (-B $file) {
+ print '_ ';
+ } else {
+ print 't ';
+ }
+ } elsif (! -e $file) {
+ print 'd ';
+ delete $files->{$file};
+ } else {
+ my $sum = check_sum($file, $files->{$file});
+ if($sum) {
+ print '! ';
+ $ret = 1;
+ } else {
+ print '. ';
+ }
+ delete $files->{$file};
+ }
+ print $parsed->{$t}, "\n";
+ }
+ for my $file (keys %$files) {
+ print "? $file\n";
+ }
+ }
+ }
+}
+
+exit $ret;
diff --git a/startdockerd b/startdockerd
new file mode 100755
index 0000000..a321643
--- /dev/null
+++ b/startdockerd
@@ -0,0 +1,173 @@
+#!/bin/bash
+
+export BUILD_DIR=${BUILD_DIR:-/usr/lib/build}
+
+CONTAINERD_PID=0
+DOCKERD_PID=0
+WEBSERVER_PID=0
+
+cleanup_and_exit() {
+ test -z "$1" && set 0
+ if test -n "$2" ; then
+ if test "$1" -ne 0 ; then
+ echo "$2" >&2
+ else
+ echo "$2"
+ fi
+ fi
+ if test "$1" != 0 ; then
+ test -n "$WEBSERVER_PID" -a "$WEBSERVER_PID" != 0 && kill "$WEBSERVER_PID"
+ test -n "$DOCKERD_PID" -a "$DOCKERD_PID" != 0 && kill "$DOCKERD_PID"
+ test -n "$CONTAINERD_PID" -a "$CONTAINERD_PID" != 0 && kill "$CONTAINERD_PID"
+ fi
+ exit $1
+}
+
+
+BUILD_ROOT=
+IS_UNSHARED=
+KILL=
+WEBSERVER=
+WEBSERVER_ONLY=
+
+while test -n "$1" ; do
+ case "$1" in
+ --root)
+ BUILD_ROOT="$2"
+ shift 2
+ ;;
+ --webserver)
+ WEBSERVER="$2"
+ shift 2
+ ;;
+ --webserver-only)
+ WEBSERVER_ONLY="1"
+ WEBSERVER="$2"
+ shift 2
+ ;;
+ --isunshared)
+ IS_UNSHARED=true
+ shift
+ ;;
+ --kill)
+ KILL=true
+ shift
+ ;;
+ *)
+ break
+ ;;
+ esac
+done
+
+if test -n "$1" -o -z "$BUILD_ROOT" ; then
+ cleanup_and_exit 1 "Usage: startdockerd --root <buildroot>"
+ echo "Usage: startdockerd --root <buildroot>"
+fi
+
+if test -n "$KILL" ; then
+ if test -e "$BUILD_ROOT/.startdockerd.pids" ; then
+ read CONTAINERD_PID DOCKERD_PID WEBSERVER_PID < $BUILD_ROOT/.startdockerd.pids
+ if test -n "$WEBSERVER_PID" -a "$WEBSERVER_PID" != 0 ; then
+ echo "Stopping local repository server"
+ kill "$WEBSERVER_PID"
+ fi
+ if test -n "$DOCKERD_PID" -a "$DOCKERD_PID" != 0 ; then
+ echo "Stopping docker daemon"
+ kill "$DOCKERD_PID"
+ fi
+ if test -n "$CONTAINERD_PID" -a "$CONTAINERD_PID" != 0 ; then
+ echo "Stopping container daemon"
+ kill "$CONTAINERD_PID"
+ fi
+ rm -f "$BUILD_ROOT/.startdockerd.pids"
+ fi
+ exit 0
+fi
+
+rm -f $BUILD_ROOT/.startdockerd.pids
+
+if test -z "$IS_UNSHARED" -a -z "$WEBSERVER_ONLY" ; then
+ echo "Unsharing environment"
+ # unshare mounts and network
+ exec unshare -m -n $BUILD_DIR/startdockerd --isunshared --root "$BUILD_ROOT" --webserver "$WEBSERVER" "$@"
+ cleanup_and_exit 1 "exec unshare returned"
+fi
+
+# load needed kernel modules
+modprobe bridge br_netfilter
+modprobe nf_nat
+modprobe xt_conntrack
+modprobe ip_tables
+
+if test -n "$IS_UNSHARED" ; then
+ # make mounts private
+ mount --make-rprivate /
+
+ # create loopback interface
+ 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
+fi
+
+# setup cgroups
+if test "$BUILD_ROOT" != '/' ; then
+ test -d /sys/fs/cgroup || cleanup_and_exit 1 "/sys/fs/cgroup does not exist"
+
+ # make build root a mount point
+ mount --rbind --make-private "$BUILD_ROOT" "$BUILD_ROOT"
+ mount --make-rprivate "$BUILD_ROOT"
+
+ # mount /sys
+ if ! test -e $BUILD_ROOT/sys/block; then
+ mkdir -p $BUILD_ROOT/sys
+ mount -n -tsysfs sys $BUILD_ROOT/sys
+ fi
+ # bind mount cgroups
+ mount --rbind /sys/fs/cgroup "$BUILD_ROOT/sys/fs/cgroup"
+ mount --make-rslave "$BUILD_ROOT/sys/fs/cgroup"
+ export DOCKER_RAMDISK=true
+fi
+
+# setup mounts
+test -e "$BUILD_ROOT/proc/self" || mount -n -tproc none $BUILD_ROOT/proc
+
+if test -n "$WEBSERVER" ; then
+ echo "Starting local repository server"
+ $BUILD_DIR/dummyhttpserver "$BUILD_ROOT" "$WEBSERVER" &
+ WEBSERVER_PID=$!
+ echo "$CONTAINERD_PID $DOCKERD_PID $WEBSERVER_PID" > $BUILD_ROOT/.startdockerd.pids
+fi
+
+if test -n "$WEBSERVER_ONLY" ; then
+ echo "SKIPPING DOCKERD"
+ exit 0
+fi
+
+echo "Starting container daemon"
+CONTAINERD_BIN=/usr/sbin/containerd
+test -x $BUILD_ROOT/usr/bin/containerd && CONTAINERD_BIN=/usr/bin/containerd
+chroot $BUILD_ROOT $CONTAINERD_BIN --listen unix:///run/containerd/containerd.sock &
+CONTAINERD_PID=$!
+echo "$CONTAINERD_PID $DOCKERD_PID $WEBSERVER_PID" > $BUILD_ROOT/.startdockerd.pids
+
+echo "Starting docker daemon"
+chroot $BUILD_ROOT /usr/bin/dockerd --containerd /run/containerd/containerd.sock --bridge=none --add-runtime oci=/usr/bin/docker-runc &
+DOCKERD_PID=$!
+echo "$CONTAINERD_PID $DOCKERD_PID $WEBSERVER_PID" > $BUILD_ROOT/.startdockerd.pids
+
+echo "Waiting for docker daemon to complete startup"
+for i in 1 2 3 4 5 6 7 8 9 10 ; do
+ chroot $BUILD_ROOT docker version >/dev/null 2>&1 && break
+ sleep 1
+done
+if ! chroot $BUILD_ROOT docker version >/dev/null 2>&1 ; then
+ cleanup_and_exit 1 "Docker is dead"
+fi
+
+echo "Docker is running"
+exit 0
diff --git a/substitutedeps b/substitutedeps
new file mode 100755
index 0000000..1763427
--- /dev/null
+++ b/substitutedeps
@@ -0,0 +1,352 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+BEGIN {
+ unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
+}
+
+use strict;
+
+use Build;
+
+sub expand {
+ my ($config, $str) = @_;
+ my @xspec;
+ my %cf = %$config;
+ $cf{'save_expanded'} = 1;
+ Build::Rpm::parse(\%cf, [ "$str" ], \@xspec);
+ return @xspec && ref($xspec[0]) ? $xspec[0]->[1] : '';
+}
+
+my ($dist, $buildroot, $rpmdeps, $archs, $configdir, $release, $changelog, $buildflavor, $obspackage);
+$buildflavor = ''; # default to empty
+
+$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs';
+
+while (@ARGV) {
+ if ($ARGV[0] eq '--root') {
+ shift @ARGV;
+ $buildroot = shift @ARGV;
+ next;
+ }
+ 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 '--release') {
+ shift @ARGV;
+ $release = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--changelog') {
+ shift @ARGV;
+ $changelog = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--buildflavor') {
+ shift @ARGV;
+ $buildflavor = shift @ARGV;
+ next;
+ }
+ if ($ARGV[0] eq '--obspackage') {
+ shift @ARGV;
+ $obspackage = shift @ARGV;
+ next;
+ }
+ last;
+}
+die("Usage: substitutedeps --dist <dist> --archpath <archpath> [--configdir <configdir>] <specin> <specout>\n") unless @ARGV == 2;
+my $spec = $ARGV[0];
+my $specdir = $spec;
+$specdir =~ s/[^\/]*$//;
+$specdir = "./" if $specdir eq '';
+
+my $newspec = $ARGV[1];
+
+my $cf = Build::read_config_dist($dist, $archs, $configdir);
+$cf->{'warnings'} = 1;
+
+#######################################################################
+
+my $xspec = [];
+my $d = Build::parse($cf, $spec, $xspec) || {};
+my @sdeps = @{$d->{'deps'} || []};
+my @neg = map {substr($_, 1)} grep {/^-/} @{$d->{'deps'} || []};
+my %neg = map {$_ => 1} @neg;
+@sdeps = grep {!$neg{$_}} @sdeps;
+@sdeps = Build::do_subst($cf, @sdeps);
+@sdeps = grep {!$neg{$_}} @sdeps;
+my %sdeps = map {$_ => 1} @sdeps;
+
+open(F, '>', $newspec) || die("$newspec: $!\n");
+
+my $used;
+my $inchangelog = 0;
+my $mainpkg = '';
+my $pkg;
+
+for my $line (@$xspec) {
+ $line =~ s/\@BUILD_FLAVOR\@/$buildflavor/g if defined $buildflavor;
+ if (defined($obspackage)) {
+ $line =~ s/\@OBS_PACKAGE\@/$obspackage/g;
+ } else {
+ die("recipe contains \@OBS_PACKAGE\@, but no package is set\n") if $line =~ /\@OBS_PACKAGE\@/;
+ }
+ $used = 1;
+ if (ref($line)) {
+ if (!defined($line->[1])) {
+ $used = 0;
+ $line = $line->[0];
+ } else {
+ $line = $line->[1];
+ }
+ }
+
+ if ($inchangelog) {
+ $inchangelog = 0 if $line =~ /^\s*%[^%]/;
+ next if $inchangelog;
+ }
+ if ($changelog && ($line =~ /\s*\%changelog\b/)) {
+ $inchangelog = 1;
+ next;
+ }
+
+ if ($line =~ /^Name\s*:\s*(\S+)/i) {
+ $pkg = $mainpkg = $1 unless $mainpkg;
+ }
+ if ($line =~ /^\s*%package\s+(-n\s+)?(\S+)/) {
+ if ($1) {
+ $pkg = $2;
+ } else {
+ $pkg = "$mainpkg-$2";
+ }
+ }
+
+ if ($line =~ /^Release\s*:\s*(.*?)\s*$/i) {
+ my $spec_rel = $1; # User-provided value
+ my $oldl = $line;
+ if (defined $release) {
+ if (!($line =~ s/<RELEASE\d*>/$release/g)) {
+ if ($line =~ /<(?:CI_CNT|B_CNT)>/) {
+ # XXX: should pass ci_cnt/b_cnt instead
+ if ($release =~ /(\d+)\.(\d+)$/) {
+ my ($ci, $b) = ($1, $2);
+ $line =~ s/<CI_CNT>/$ci/;
+ $line =~ s/<B_CNT>/$b/;
+ } elsif ($release =~ /(\d+)$/) {
+ my $b = $1;
+ $b = '0' if $line =~ s/<CI_CNT>/$b/;
+ $line =~ s/<B_CNT>/$b/;
+ }
+ } else {
+ # no special replacement rules in the line, simply replace
+ $line =~ s/^(Release\s*:\s*).*/$1$release/i;
+ $line =~ s/<SPEC_REL>/$spec_rel/g;
+ }
+ }
+ $line =~ s/<SPEC_REL>//g; # no recursion please
+ } else {
+ # remove macros, as rpm doesn't like them
+ $line =~ s/<RELEASE\d*>/0/;
+ $line =~ s/<CI_CNT>/0/;
+ $line =~ s/<B_CNT>/0/;
+ }
+
+ if ($cf->{'releasesuffix'}) {
+ my $suffix = $cf->{'releasesuffix'};
+ if ($suffix =~ /^file:(.+)$/) {
+ my $file = $1;
+ if ($file =~ /\//s || $file =~ /^\./) {
+ $suffix = "error:illegal release suffix";
+ } else {
+ if (open(RP, '<', "$specdir$file")) {
+ $suffix = "error:no suffix in $file";
+ for (<RP>) {
+ chomp;
+ s/^\s+//;
+ s/\s+$//;
+ $suffix = $_ if $_ && !/^#/;
+ }
+ close RP;
+ } else {
+ $suffix = "error:$file file does not exist";
+ }
+ }
+ }
+ if ($suffix =~ /^error:(.*)$/) {
+ $suffix = $1;
+ $suffix =~ s/^\s+//;
+ $suffix =~ s/\s+$//;
+ $suffix = "Error: $suffix";
+ }
+ $line =~ s/^(Release\s*:\s*.*?)\s*$/$1$suffix/i if $suffix;
+ }
+
+ # this is to be compatible to legacy autobuild.
+ # you can specify a releaseprg in the project configuration,
+ # if your package contains this file it is executed and its
+ # output is used as a release.
+ # use only if you really must.
+ if ($cf->{'releaseprg'} && -f "$specdir$cf->{'releaseprg'}") {
+ my $newl = $line;
+ $newl =~ s/^Release:\s*//;
+ $oldl =~ s/^Release:\s*//;
+ my $project = expand($cf, "%?_project") || 'BUILD_BASENAME';
+ my $arch = expand($cf, "%?_target_cpu") || 'noarch';
+ $::ENV{'BUILD_OLDRELEASE'} = $oldl;
+ my @nl;
+ my $interpreter = "/bin/bash";
+ if (open(RP, '<', "$specdir$cf->{'releaseprg'}")) {
+ @nl = <RP>;
+ close RP;
+ if (@nl && $nl[0] =~ /^#!\s*(\S*)/) {
+ $interpreter = $1;
+ }
+ }
+ if ($buildroot) {
+ my $sd = $specdir;
+ $sd =~ s/^\Q$buildroot\E//;
+ open(RP, "-|", 'chroot', $buildroot, $interpreter, "$sd$cf->{'releaseprg'}", $project, $newl, $pkg, $arch) || die("$cf->{'releaseprg'}: $!\n");
+ } else {
+ open(RP, "-|", $interpreter, "$specdir$cf->{'releaseprg'}", $project, $newl, $pkg, $arch) || die("$cf->{'releaseprg'}: $!\n");
+ }
+ @nl = grep {$_ ne ''} <RP>;
+ if (!close(RP)) {
+ warn("$cf->{'releaseprg'} failed: $?\n");
+ }
+ # and another compatibility hack: if the prg returns pkg:<package>,
+ # the release of the package will be used. yuck...
+ if (@nl && $nl[0] =~ s/^pkg://) {
+ my $relpkg = $nl[0];
+ chomp $relpkg;
+ if ($buildroot) {
+ open(RP, "-|", 'chroot', $buildroot, 'rpm', '-q', '--qf', '%{RELEASE}', $relpkg) || die("rpm: $!\n");
+ } else {
+ open(RP, "-|", 'rpm', '-q', '--qf', '%{RELEASE}', $relpkg) || die("rpm: $!\n");
+ }
+ @nl = grep {$_ ne ''} <RP>;
+ if (!close(RP)) {
+ warn("rpm package query of '$relpkg' failed: $?\n");
+ }
+ }
+ if ($nl[0]) {
+ chomp $nl[0];
+ $line =~ s/^(Release:\s*).*/$1$nl[0]/i;
+ if (defined $release) {
+ if (!($line =~ s/<RELEASE\d*>/$release/g)) {
+ if ($line =~ /<(?:CI_CNT|B_CNT)>/) {
+ # XXX: should pass ci_cnt/b_cnt instead
+ if ($release =~ /(\d+)\.(\d+)$/) {
+ my ($ci, $b) = ($1, $2);
+ $line =~ s/<CI_CNT>/$ci/;
+ $line =~ s/<B_CNT>/$b/;
+ } elsif ($release =~ /(\d+)$/) {
+ my $b = $1;
+ $line =~ s/<B_CNT>/$b/ unless $line =~ s/<CI_CNT>/$b/;
+ }
+ }
+ }
+ }
+ }
+ }
+ # all compat stuff done. we return to your scheduled program
+ }
+
+ if (!$used || ($line !~ /^(?:Requires|BuildRequires|PreReq)(?:\([^\)]+\))?:/i)) {
+ print F "$line\n";
+ next;
+ }
+ if ($line =~ /%\(/) {
+ # too hard for us
+ print F "$line\n";
+ next;
+ }
+
+ my $isbuildrequires = 0;
+ $isbuildrequires = 1 if $line =~ /^BuildRequires/i;
+ my $r = $line;
+ $r =~ s/^[^:]*:\s*//;
+ if ($r =~ /^\(/) {
+ # no rich dependency support for now
+ print F "$line\n";
+ next;
+ }
+ my @deps = $r =~ /([^\s\[,]+)(\s+[<=>]+\s+[^\s\[,]+)?[\s,]*/g;
+ my @ndeps = ();
+ my $replace = 0;
+ my @f2 = Build::do_subst_vers($cf, @deps);
+ my %f2 = @f2;
+ if ($isbuildrequires) {
+ delete $f2{$_} for @neg;
+ delete $f2{$_} for grep {/^-/} keys %f2;
+ }
+ while (@deps) {
+ my ($pack, $vers) = splice(@deps, 0, 2);
+ $vers = '' unless defined $vers;
+ if (($isbuildrequires && $sdeps{$pack}) || exists($f2{$pack})) {
+ push @ndeps, "$pack$vers";
+ delete $f2{$pack};
+ } else {
+ $replace = 1;
+ }
+ }
+ if (%f2) {
+ while (@f2) {
+ my ($pack, $vers) = splice(@f2, 0, 2);
+ next unless exists $f2{$pack};
+ $vers = '' unless defined $vers;
+ push @ndeps, "$pack$vers";
+ }
+ $replace = 1
+ }
+ if ($replace) {
+ $line =~ /^(.*?:\s*)/;
+ print F $1.join(' ', @ndeps)."\n" if @ndeps;
+ } else {
+ print F "$line\n";
+ }
+}
+
+if ($changelog) {
+ print F "%changelog\n";
+ if (open(CF, '<', $changelog)) {
+ while(<CF>) {
+ print F $_;
+ }
+ close CF;
+ }
+}
+
+close(F) || die("close: $!\n");
+
+exit(0);
diff --git a/t/bad.livebuild b/t/bad.livebuild
new file mode 100644
index 0000000..ae2cae0
--- /dev/null
+++ b/t/bad.livebuild
Binary files differ
diff --git a/t/changelog2spec.t b/t/changelog2spec.t
new file mode 100644
index 0000000..56de7c8
--- /dev/null
+++ b/t/changelog2spec.t
@@ -0,0 +1,33 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More tests => 11;
+
+sub onetest(@)
+{
+ my $expected = shift;
+ my $actual = `./changelog2spec --selftest @_`;
+ is($actual, $expected, "changelog2spec --selftest @_");
+}
+
+my @tests=(
+ # format is 1:specfile 2:expected-changes 3++:list-of-changes-files
+ [qw"rpm rpm python-rpm rpm"],
+ [qw"python-rpm python-rpm python-rpm rpm"],
+ [qw"antlr antlr antlr antlr-bootstrap"],
+ [qw"antlr anyunrelated anyunrelated"],
+ [qw"antlr-bootstrap antlr-bootstrap antlr antlr-bootstrap"],
+ [qw"antlr-bootstrap antlr antlr"],
+ [qw"antlr-bootstrap antlr antlr antlr-other"],
+ [qw"foo _service:obs_scm:foo foo _service:obs_scm:foo"],
+ [qw"_service:obs_scm:foo _service:obs_scm:foo foo _service:obs_scm:foo"],
+ [qw"_service:obs_scm:foo foo foo foo-bar"],
+ [qw"_service:obs_scm:foo-bar foo foo foo-other"],
+);
+for my $t (@tests) {
+ my @tmp=@$t;
+ my $file=shift(@tmp);
+ foreach(0..$#tmp) {$tmp[$_].=".changes"}
+ my $expected=shift(@tmp);
+ onetest($expected, $file, @tmp);
+}
diff --git a/t/conflicts.t b/t/conflicts.t
new file mode 100644
index 0000000..12c79ea
--- /dev/null
+++ b/t/conflicts.t
@@ -0,0 +1,78 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More tests => 13;
+
+require 't/testlib.pm';
+
+my $repo = <<'EOR';
+P: a = 1-1
+R: p
+P: b = 1-1 p
+P: c = 1-1 p
+P: d = 1-1
+C: b
+P: e = 1-1
+C: c
+P: f = 1-1
+C: p
+P: g = 1-1
+C: b c
+P: h = 1-1
+R: f
+P: i = 1-1
+P: j = 1-1
+P: k = 1-1
+R: j
+P: l = 1-1
+R: b d
+P: m = 1-1
+C: m
+EOR
+
+my $config = setuptest($repo, "Conflict: i:j");
+my @r;
+
+# test that conflicts can fix choices
+@r = expand($config, 'a');
+is_deeply(\@r, [undef, 'have choice for p needed by a: b c'], 'install a');
+
+@r = expand($config, 'a', 'd');
+is_deeply(\@r, [1, 'a', 'c', 'd'], 'install a d');
+
+@r = expand($config, 'a', 'e');
+is_deeply(\@r, [1, 'a', 'b', 'e'], 'install a e');
+
+# test test conflicting all providers works
+@r = expand($config, 'a', 'd', 'e');
+is_deeply(\@r, [undef, '(provider b is in conflict with d)', '(provider c is in conflict with e)', 'conflict for providers of p needed by a'], 'install a d e');
+
+@r = expand($config, 'a', 'f');
+is_deeply(\@r, [undef, '(provider b is in conflict with f)', '(provider c is in conflict with f)', 'conflict for providers of p needed by a'], 'install a f');
+
+# test that conflicting jobs work
+@r = expand($config, 'b', 'f');
+is_deeply(\@r, [undef, 'f conflicts with b'], 'install b f');
+
+@r = expand($config, 'b', 'h');
+is_deeply(\@r, [undef, '(provider f conflicts with b)', 'conflict for providers of f needed by h'], 'install b h');
+
+# test conflicts specified in the job
+@r = expand($config, 'i', '!i');
+is_deeply(\@r, [undef, 'i is in conflict'], 'install i !i');
+
+@r = expand($config, 'k', '!j');
+is_deeply(\@r, [undef, '(provider j is in conflict)', 'conflict for providers of j needed by k'], 'install k !j');
+
+# test conflicts from project config
+@r = expand($config, 'i', 'j');
+is_deeply(\@r, [undef, 'i conflicts with j', 'j conflicts with i'], 'install i j');
+
+@r = expand($config, 'i', 'k');
+is_deeply(\@r, [undef, '(provider j is in conflict with i)', 'conflict for providers of j needed by k'], 'install i k');
+
+@r = expand($config, 'l');
+is_deeply(\@r, [undef, 'd conflicts with b'], 'install l');
+
+@r = expand($config, 'm');
+is_deeply(\@r, [1, 'm'], 'install m');
diff --git a/t/determinism.t b/t/determinism.t
new file mode 100644
index 0000000..1d7ebc2
--- /dev/null
+++ b/t/determinism.t
@@ -0,0 +1,22 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More tests => 1;
+
+require 't/testlib.pm';
+
+my $repo = <<'EOR';
+P: a = 1-1
+R: b c
+P: b1 = 1-1 b
+C: c1
+P: b2 = 1-1 b
+P: c1 = 1-1 c
+P: c2 = 1-1 c
+EOR
+
+my $config = setuptest($repo, 'Prefer: b1 c1');
+my @r;
+
+@r = expand($config, 'a');
+is_deeply(\@r, [undef, 'b1 conflicts with c1'], 'install a');
diff --git a/t/directory.livebuild b/t/directory.livebuild
new file mode 100644
index 0000000..318d128
--- /dev/null
+++ b/t/directory.livebuild
Binary files differ
diff --git a/t/dist b/t/dist
new file mode 100755
index 0000000..f1fab4f
--- /dev/null
+++ b/t/dist
@@ -0,0 +1,39 @@
+#!/usr/bin/perl -w
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+use strict;
+use Test::More tests => 9;
+use Build;
+
+sub d {
+ Build::dist_canon($_[0], $_[1]||'i586');
+}
+
+is(d("UnitedLinux 1.0 (x86-64)"), "ul1-x86_64");
+is(d("SuSE SLES-8 (ia64)"), "sles8-ia64");
+is(d("SuSE Linux 8.2 (x86-64)"), "8.2-x86_64");
+is(d("SuSE SLES-9 (x86-64)"), "sles9-x86_64");
+is(d("SUSE Linux 10.1 (PPC64)"), "10.1-ppc64");
+is(d("SUSE Linux Enterprise 10 (PPC)"), "sles10-ppc");
+is(d("openSUSE 10.3 (X86-64)"), "10.3-x86_64");
+is(d("SUSE Linux Enterprise 11"), "sles11-i386");
+is(d("openSUSE 11.3"), "11.3-i386");
diff --git a/t/live-build b/t/live-build
new file mode 100755
index 0000000..1b20be0
--- /dev/null
+++ b/t/live-build
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -w -I ..
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+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/obsoletes.t b/t/obsoletes.t
new file mode 100644
index 0000000..c464d83
--- /dev/null
+++ b/t/obsoletes.t
@@ -0,0 +1,53 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More tests => 9;
+
+require 't/testlib.pm';
+
+my $repo = <<'EOR';
+P: a = 1-1
+R: p
+P: b = 1-1 p
+P: c = 1-1 p
+P: d = 1-1
+O: b
+P: e = 1-1
+O: c
+P: f = 1-1
+O: p
+P: g = 1-1
+O: b c
+P: h = 1-1
+R: b d
+EOR
+
+my $config = setuptest($repo);
+my @r;
+
+@r = expand($config, 'a');
+is_deeply(\@r, [undef, 'have choice for p needed by a: b c'], 'install a');
+
+@r = expand($config, 'a', 'd');
+is_deeply(\@r, [1, 'a', 'c', 'd'], 'install a d');
+
+@r = expand($config, 'a', 'e');
+is_deeply(\@r, [1, 'a', 'b', 'e'], 'install a e');
+
+@r = expand($config, 'a', 'd', 'e');
+is_deeply(\@r, [undef, '(provider b is obsoleted by d)', '(provider c is obsoleted by e)', 'conflict for providers of p needed by a'], 'install a d e');
+
+@r = expand($config, 'a', 'f');
+is_deeply(\@r, [undef, 'have choice for p needed by a: b c'], 'install a f');
+
+@r = expand($config, 'b', 'd');
+is_deeply(\@r, [undef, 'd obsoletes b'], 'install b d');
+
+@r = expand($config, 'h');
+is_deeply(\@r, [undef, 'd obsoletes b'], 'install h');
+
+@r = expand($config, 'h', 'd');
+is_deeply(\@r, [undef, '(provider b is obsoleted by d)', 'conflict for providers of b needed by h'], 'install h d');
+
+@r = expand($config, 'h', 'b');
+is_deeply(\@r, [undef, '(provider d obsoletes b)', 'conflict for providers of d needed by h'], 'install h b');
diff --git a/t/ordep.t b/t/ordep.t
new file mode 100644
index 0000000..09f4f29
--- /dev/null
+++ b/t/ordep.t
@@ -0,0 +1,35 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More tests => 4;
+
+require 't/testlib.pm';
+
+my $repo = <<'EOR';
+P: a = 1-1
+R: x | y
+P: b = 1-1
+R: d | e
+P: c = 1-1
+R: d | f
+P: d = 1-1
+P: e = 1-1
+P: f = 1-1
+P: g = 1-1
+R: x | e | d
+EOR
+
+my $config = setuptest($repo, "Binarytype: deb\nPrefer: f\n");
+my @r;
+
+@r = expand($config, 'a');
+is_deeply(\@r, [undef, 'nothing provides x | y needed by a'], 'install a');
+
+@r = expand($config, 'b');
+is_deeply(\@r, [1, 'b', 'd'], 'install b');
+
+@r = expand($config, 'c');
+is_deeply(\@r, [1, 'c', 'f'], 'install c');
+
+@r = expand($config, 'g');
+is_deeply(\@r, [1, 'e', 'g'], 'install g');
diff --git a/t/recommends.t b/t/recommends.t
new file mode 100644
index 0000000..90372cc
--- /dev/null
+++ b/t/recommends.t
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More tests => 4;
+
+require 't/testlib.pm';
+
+my $repo = <<'EOR';
+P: a = 1-1
+R: p
+P: b = 1-1 p
+P: c = 1-1 p
+P: d = 1-1
+r: b
+P: e = 1-1
+r: c
+EOR
+
+my $config = setuptest($repo);
+my @r;
+
+@r = expand($config, 'a');
+is_deeply(\@r, [undef, 'have choice for p needed by a: b c'], 'install a');
+
+@r = expand($config, 'a', 'd');
+is_deeply(\@r, [1, 'a', 'b', 'd'], 'install a d');
+
+@r = expand($config, 'a', 'e');
+is_deeply(\@r, [1, 'a', 'c', 'e'], 'install a e');
+
+@r = expand($config, 'a', 'd', 'e');
+is_deeply(\@r, [undef, 'have choice for p needed by a: b c'], 'install a d e');
diff --git a/t/requires.t b/t/requires.t
new file mode 100644
index 0000000..ab1f486
--- /dev/null
+++ b/t/requires.t
@@ -0,0 +1,95 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More tests => 20;
+
+require 't/testlib.pm';
+
+my $repo = <<'EOR';
+P: a = 1-1
+R: b
+P: b = 1-1
+P: c = 1-1
+R: p
+P: d = 1-1 p
+P: e = 1-1 p
+P: f = 1-1
+R: n
+P: ign2 = 1-1
+R: ign1
+P: ign3 = 1-1
+R: ign4
+P: ign5 = 1-1 ign4
+P: ign6 = 1-1
+R: ign7
+P: ign8 = 1-1
+R: ign7
+P: g = 1-1 h
+P: h = 1-1
+EOR
+
+my $config = setuptest($repo, 'Ignore: ign1 ign5 ign6:ign7');
+my $config2 = setuptest($repo, 'Prefer: d');
+my $config3 = setuptest($repo, 'Prefer: -d');
+my @r;
+
+@r = expand($config);
+is_deeply(\@r, [1], 'install nothing');
+
+@r = expand($config, 'n');
+is_deeply(\@r, [undef, 'nothing provides n'], 'install n');
+
+@r = expand($config, 'f');
+is_deeply(\@r, [undef, 'nothing provides n needed by f'], 'install f');
+
+@r = expand($config, "a");
+is_deeply(\@r, [1, 'a', 'b'], 'install a');
+
+@r = expand($config, "c");
+is_deeply(\@r, [undef, 'have choice for p needed by c: d e'], 'install c');
+
+@r = expand($config2, "c");
+is_deeply(\@r, [1, 'c', 'd'], 'install c with prefer');
+
+@r = expand($config3, "c");
+is_deeply(\@r, [1, 'c', 'e'], 'install c with neg prefer');
+
+@r = expand($config, "ign1");
+is_deeply(\@r, [undef, 'nothing provides ign1'], 'install ign1');
+
+@r = expand($config, "ign2");
+is_deeply(\@r, [1, 'ign2'], 'install ign2');
+
+@r = expand($config, "ign3");
+is_deeply(\@r, [1, 'ign3'], 'install ign3');
+
+@r = expand($config, "ign6");
+is_deeply(\@r, [1, 'ign6'], 'install ign6');
+
+@r = expand($config, "ign8");
+is_deeply(\@r, [undef, 'nothing provides ign7 needed by ign8'], 'install ign8');
+
+@r = expand($config, "ign2", "-ign2");
+is_deeply(\@r, [1, 'ign2'], 'install ign2 -ign2');
+
+@r = expand($config, "ign8", "-ign7");
+is_deeply(\@r, [1, 'ign8'], 'install ign8 -ign7');
+
+@r = expand($config2, "ign5", "-ign5");
+is_deeply(\@r, [1, 'ign5'], 'install ign5 -ign5');
+
+@r = expand($config2, "ign4", "-ign5");
+is_deeply(\@r, [1, 'ign5'], 'install ign4 -ign5');
+
+@r = expand($config, "ign5");
+is_deeply(\@r, [1, 'ign5'], 'install ign5');
+
+@r = expand($config, "ign4");
+is_deeply(\@r, [1, 'ign5'], 'install ign4');
+
+@r = expand($config, "h");
+is_deeply(\@r, [1, 'h'], 'install h');
+
+@r = expand($config, "--directdepsend--", "h");
+is_deeply(\@r, [undef, 'have choice for h: g h'], 'install --directdepsend-- h');
+
diff --git a/t/richdeps.t b/t/richdeps.t
new file mode 100644
index 0000000..ed7a1cc
--- /dev/null
+++ b/t/richdeps.t
@@ -0,0 +1,198 @@
+#!/usr/bin/perl -w
+
+use strict;
+use Test::More tests => 45;
+
+require 't/testlib.pm';
+
+my $repo = <<'EOR';
+P: a = 1-1
+R: (b if c) d
+P: b = 1-1
+P: c = 1-1
+P: d = 1-1
+R: c
+P: n1 = 1-1
+R: n
+P: n2 = 1-1
+C: d
+P: i = 1-1
+P: j = 1-1
+R: k
+P: k = 1-1
+C: (i and j)
+P: lr = 1-1
+R: (b if b)
+P: lc1 = 1-1
+C: (b if b)
+P: lc2 = 1-1
+C: (n if n)
+P: m = 1-1
+C: (b and (n if b))
+P: cx = 1-1
+C: (b and cx and d)
+P: ign1 = 1-1
+R: (ign and b)
+P: ign2 = 1-1
+R: (ign or b)
+P: ign3 = 1-1
+R: (b if ign)
+P: ign4 = 1-1
+R: (ign if b)
+P: bad1 = 1-1
+R: (n foo m)
+P: bad2 = 1-1
+C: (n foo m)
+P: sc = 1-1
+C: (a or sc) (n or sc)
+P: ifelse = 1-1
+R: (b if i else c)
+P: unless = 1-1
+C: (b unless i)
+P: unlesselse = 1-1
+C: (b unless i else c)
+P: wa = 1-1 wx
+P: wb = 1-1 wx wy
+P: wc = 1-1 wy
+EOR
+
+my $config = setuptest($repo, 'Ignore: ign');
+my @r;
+
+@r = expand($config, "()");
+is_deeply(\@r, [undef, 'cannot parse dependency ()'], 'install ()');
+
+@r = expand($config, "(n and )");
+is_deeply(\@r, [undef, 'cannot parse dependency (n and )'], 'install (n and )');
+
+@r = expand($config, "(n foo m)");
+is_deeply(\@r, [undef, 'cannot parse dependency (n foo m)'], 'install (n foo m)');
+
+@r = expand($config, "n");
+is_deeply(\@r, [undef, 'nothing provides n'], 'install n');
+
+@r = expand($config, "(n or o)");
+is_deeply(\@r, [undef, 'nothing provides (n or o)'], 'install (n or o)');
+
+@r = expand($config, "(n and o)");
+is_deeply(\@r, [undef, 'nothing provides (n and o)'], 'install (n and o)');
+
+@r = expand($config, "n1");
+is_deeply(\@r, [undef, "nothing provides n needed by n1"], "install n1");
+
+@r = expand($config, "(n2 and d)");
+is_deeply(\@r, [undef, 'n2 conflicts with d'], "install (n2 and d)");
+
+@r = expand($config, "(n2 or d)");
+is_deeply(\@r, [undef, "have choice for (n2 or d): d n2"], "install (n2 or d)");
+
+@r = expand($config, "a");
+is_deeply(\@r, [1, qw{a b c d}], "install a");
+
+@r = expand($config, 'i', 'j');
+is_deeply(\@r, [undef, '(provider k conflicts with i)', '(provider k conflicts with j)', "conflict for providers of k needed by j"], "install i j");
+
+# test corner cases
+@r = expand($config, "(b if b)");
+is_deeply(\@r, [1], 'install (b if b)');
+
+@r = expand($config, "(n if n)");
+is_deeply(\@r, [1], 'install (n if n)');
+
+@r = expand($config, "lr");
+is_deeply(\@r, [1, 'lr'], 'install lr');
+
+@r = expand($config, "lc1");
+is_deeply(\@r, [undef, '(provider b is in conflict with lc1)', 'conflict for providers of (b if b) needed by lc1'], 'install lc1');
+
+@r = expand($config, "lc2");
+is_deeply(\@r, [undef, 'lc2 conflicts with always true (n if n)'], 'install lc2');
+
+@r = expand($config, "m");
+is_deeply(\@r, [1, 'm'], 'install m');
+
+# complex config from the job
+@r = expand($config, 'b', 'c', 'd', '!(b and c and d)');
+is_deeply(\@r, [undef, 'conflicts with b', 'conflicts with c', 'conflicts with d'], 'install b c d !(b and c and d)');
+
+@r = expand($config, '!(n if n)');
+is_deeply(\@r, [undef, 'conflict with always true (n if n)'], 'install !(n if n)');
+
+@r = expand($config, 'b', 'cx', 'd');
+is_deeply(\@r, [undef, 'cx conflicts with b', 'cx conflicts with d'], 'install b cx d');
+
+@r = expand($config, 'ign');
+is_deeply(\@r, [undef, 'nothing provides ign'], 'install ign');
+
+@r = expand($config, 'ign1');
+is_deeply(\@r, [1, 'b', 'ign1'], 'install ign1');
+
+@r = expand($config, 'ign2');
+is_deeply(\@r, [1, 'ign2'], 'install ign2');
+
+@r = expand($config, 'ign3');
+is_deeply(\@r, [1, 'ign3'], 'install ign3');
+
+@r = expand($config, 'b', 'ign4');
+is_deeply(\@r, [1, 'b', 'ign4'], 'install b ign4');
+
+@r = expand($config, '(ign and b)');
+is_deeply(\@r, [undef, 'nothing provides (ign and b)'], 'install b');
+
+@r = expand($config, 'bad1');
+is_deeply(\@r, [undef, 'cannot parse dependency (n foo m) from bad1'], 'install bad1');
+
+@r = expand($config, 'bad2');
+is_deeply(\@r, [undef, 'cannot parse dependency (n foo m) from bad2'], 'install bad2');
+
+@r = expand($config, 'sc', 'b');
+is_deeply(\@r, [1, 'b', 'sc'], 'install sc b');
+
+@r = expand($config, 'ifelse');
+is_deeply(\@r, [undef, 'have choice for (b if i else c) needed by ifelse: c i'], 'install ifelse');
+
+@r = expand($config, 'ifelse', 'i');
+is_deeply(\@r, [1, 'b', 'i', 'ifelse'], 'install ifelse i');
+
+@r = expand($config, 'ifelse', 'c');
+is_deeply(\@r, [1, 'c', 'ifelse'], 'install ifelse c');
+
+@r = expand($config, 'unless', 'b');
+is_deeply(\@r, [1, 'b', 'i', 'unless'], 'install unless b');
+
+@r = expand($config, 'unless', 'b', '!i');
+is_deeply(\@r, [undef, '(provider i is in conflict)', 'conflict for providers of (b unless i) needed by unless'], 'install unless b !i');
+
+@r = expand($config, 'unlesselse', 'b', 'c');
+is_deeply(\@r, [undef, '(provider i is in conflict with unlesselse)', 'conflict for providers of (b unless i else c) needed by unlesselse'], 'install unlesselse b c');
+
+@r = expand($config, 'unlesselse', 'b');
+is_deeply(\@r, [1, 'b', 'i', 'unlesselse'], 'install unlesselse b');
+
+@r = expand($config, 'unlesselse', 'c');
+is_deeply(\@r, [1, 'c', 'unlesselse'], 'install unlesselse c');
+
+@r = expand($config, '(wx and wy)');
+is_deeply(\@r, [undef, 'have choice for (wx and wy): wa wb', 'have choice for (wx and wy): wb wc'], 'install (wx and wy)');
+
+@r = expand($config, '(wx with wy)');
+is_deeply(\@r, [1, 'wb'], 'install (wx with wy)');
+
+@r = expand($config, '(wx without wy)');
+is_deeply(\@r, [1, 'wa'], 'install (wx without wy)');
+
+@r = expand($config, '(wy without wx)');
+is_deeply(\@r, [1, 'wc'], 'install (wy without wx)');
+
+@r = expand($config, '(wa with wa)');
+is_deeply(\@r, [1, 'wa'], 'install (wa with wa)');
+
+@r = expand($config, '(wa with nnn)');
+is_deeply(\@r, [undef, 'nothing provides (wa with nnn)'], 'install (wa with nnn)');
+
+@r = expand($config, '(wa without wa)');
+is_deeply(\@r, [undef, 'nothing provides (wa without wa)'], 'install (wa without wa)');
+
+@r = expand($config, '(wa without nnn)');
+is_deeply(\@r, [1, 'wa'], 'install (wa without nnn)');
+
diff --git a/t/standard.livebuild b/t/standard.livebuild
new file mode 100644
index 0000000..bd96fda
--- /dev/null
+++ b/t/standard.livebuild
Binary files differ
diff --git a/t/testlib.pm b/t/testlib.pm
new file mode 100644
index 0000000..d9ff33f
--- /dev/null
+++ b/t/testlib.pm
@@ -0,0 +1,26 @@
+
+use Build;
+
+sub expand {
+ my ($c, @r) = Build::expand(@_);
+ return ($c, sort(@r));
+}
+
+sub setuptest {
+ my ($repo, $conf) = @_;
+ my $l = '';
+ my $id = '';
+ for (split("\n", $repo)) {
+ $id = "$1.noarch-0/0/0:" if /^P: (\S+)/;
+ s/:/:$id/;
+ $l .= "$_\n";
+ }
+ local *F;
+ open(F, '<', \$l);
+ my $config = Build::read_config('noarch', [ split("\n", $conf || '') ]);
+ Build::readdeps($config, undef, \*F);
+ close F;
+ return $config;
+}
+
+1;
diff --git a/telnet_login_wrapper b/telnet_login_wrapper
new file mode 100755
index 0000000..23aa13d
--- /dev/null
+++ b/telnet_login_wrapper
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+# login wrapper, just start a shell without arguments.
+# this skips all parameters and is the only way to open a shell without login
+# prompt on most telnetd implementations
+
+/bin/bash --login || sh
+
diff --git a/test-debtransform/1-out/grandorgue_0.3.0.6.1026.diff.gz b/test-debtransform/1-out/grandorgue_0.3.0.6.1026.diff.gz
new file mode 100644
index 0000000..545ea28
--- /dev/null
+++ b/test-debtransform/1-out/grandorgue_0.3.0.6.1026.diff.gz
Binary files differ
diff --git a/test-debtransform/1-out/grandorgue_0.3.0.6.1026.dsc b/test-debtransform/1-out/grandorgue_0.3.0.6.1026.dsc
new file mode 100644
index 0000000..e06cbb3
--- /dev/null
+++ b/test-debtransform/1-out/grandorgue_0.3.0.6.1026.dsc
@@ -0,0 +1,12 @@
+Format: 1.0
+Source: grandorgue
+Binary: grandorgue
+Architecture: any
+Version: 0.3.0.6.1026
+Maintainer: Martin Koegler <martin.koegler@chello.at>
+Standards-Version: 3.9.1
+Build-Depends: debhelper (>= 7), cdbs, cmake, gettext, po4a, libjack-jackd2-dev, libasound2-dev, libwxgtk2.8-dev, docbook-xsl, xsltproc, zip, devscripts
+Files:
+ 7e72e6c31c2af52c227ce4c4c6ee3952 655 grandorgue_0.3.0.6.1026.orig.tar.gz
+ 6d0b166ecd6f5863a5bba1fd576f57a8 756 grandorgue_0.3.0.6.1026.diff.gz
+
diff --git a/test-debtransform/1-out/grandorgue_0.3.0.6.1026.orig.tar.gz b/test-debtransform/1-out/grandorgue_0.3.0.6.1026.orig.tar.gz
new file mode 100644
index 0000000..e991c62
--- /dev/null
+++ b/test-debtransform/1-out/grandorgue_0.3.0.6.1026.orig.tar.gz
Binary files differ
diff --git a/test-debtransform/1/debian.changelog b/test-debtransform/1/debian.changelog
new file mode 100644
index 0000000..624c354
--- /dev/null
+++ b/test-debtransform/1/debian.changelog
@@ -0,0 +1,24 @@
+grandorgue (0.3.0.6.10) unstable; urgency=low
+
+ * OBS build
+
+ -- Martin Koegler <mkoegler@auto.tuwien.ac.at> Sat, 16 Jun 2012 13:08:51 +0200
+
+grandorgue (0.3.0.6.11) unstable; urgency=low
+
+ * OBS build
+
+ -- Martin Koegler <mkoegler@auto.tuwien.ac.at> Sat, 16 Jun 2012 13:08:35 +0200
+
+grandorgue (0.3.0.6.10-1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * OBS build
+
+ -- Martin Koegler <mkoegler@auto.tuwien.ac.at> Sat, 16 Jun 2012 11:27:19 +0200
+
+grandorgue (0.3.0.6) unstable; urgency=low
+
+ * Initial version
+
+ -- Martin Koegler <martin.koegler@chello.at> Sun, 06 Nov 2011 19:44:04 +0100
diff --git a/test-debtransform/1/debian.empty b/test-debtransform/1/debian.empty
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test-debtransform/1/debian.empty
diff --git a/test-debtransform/1/debian.obs-version b/test-debtransform/1/debian.obs-version
new file mode 100644
index 0000000..3e61434
--- /dev/null
+++ b/test-debtransform/1/debian.obs-version
@@ -0,0 +1 @@
+Version: 0.3.0.6.1026
diff --git a/test-debtransform/1/debian.tar.gz b/test-debtransform/1/debian.tar.gz
new file mode 100644
index 0000000..484f362
--- /dev/null
+++ b/test-debtransform/1/debian.tar.gz
Binary files differ
diff --git a/test-debtransform/1/debian1.tar.gz b/test-debtransform/1/debian1.tar.gz
new file mode 100644
index 0000000..b22b94c
--- /dev/null
+++ b/test-debtransform/1/debian1.tar.gz
Binary files differ
diff --git a/test-debtransform/1/go.tar.gz b/test-debtransform/1/go.tar.gz
new file mode 100644
index 0000000..e991c62
--- /dev/null
+++ b/test-debtransform/1/go.tar.gz
Binary files differ
diff --git a/test-debtransform/1/grandorgue.dsc b/test-debtransform/1/grandorgue.dsc
new file mode 100644
index 0000000..7add24f
--- /dev/null
+++ b/test-debtransform/1/grandorgue.dsc
@@ -0,0 +1,11 @@
+Format: 1.0
+Source: grandorgue
+Binary: grandorgue
+Architecture: any
+Version: 0.3.0.6.1026
+Maintainer: Martin Koegler <martin.koegler@chello.at>
+Standards-Version: 3.9.1
+Build-Depends: debhelper (>= 7), cdbs, cmake, gettext, po4a, libjack-jackd2-dev, libasound2-dev, libwxgtk2.8-dev, docbook-xsl, xsltproc, zip, devscripts
+DEBTRANSFORM-FILES-TAR: debian.tar.gz debian1.tar.gz
+Files:
+ 1e0023c7fb1f19a883ec8170efeff360 2817072 grandorgue_0.3.0.6.tar.gz
diff --git a/test-debtransform/2-out/grandorgue_0.3.0.6.1026.diff.gz b/test-debtransform/2-out/grandorgue_0.3.0.6.1026.diff.gz
new file mode 100644
index 0000000..0d4e9e5
--- /dev/null
+++ b/test-debtransform/2-out/grandorgue_0.3.0.6.1026.diff.gz
Binary files differ
diff --git a/test-debtransform/2-out/grandorgue_0.3.0.6.1026.dsc b/test-debtransform/2-out/grandorgue_0.3.0.6.1026.dsc
new file mode 100644
index 0000000..0898745
--- /dev/null
+++ b/test-debtransform/2-out/grandorgue_0.3.0.6.1026.dsc
@@ -0,0 +1,12 @@
+Format: 1.0
+Source: grandorgue
+Binary: grandorgue
+Architecture: any
+Version: 0.3.0.6.1026
+Maintainer: Martin Koegler <martin.koegler@chello.at>
+Standards-Version: 3.9.1
+Build-Depends: debhelper (>= 7), cdbs, cmake, gettext, po4a, libjack-jackd2-dev, libasound2-dev, libwxgtk2.8-dev, docbook-xsl, xsltproc, zip, devscripts
+Files:
+ 7ab43adb27b5ce885dccd5526745a5a1 655 grandorgue_0.3.0.6.1026.orig.tar.gz
+ aee05a68c294747ab67965c8675f9821 756 grandorgue_0.3.0.6.1026.diff.gz
+
diff --git a/test-debtransform/2-out/grandorgue_0.3.0.6.1026.orig.tar.gz b/test-debtransform/2-out/grandorgue_0.3.0.6.1026.orig.tar.gz
new file mode 100644
index 0000000..84cd163
--- /dev/null
+++ b/test-debtransform/2-out/grandorgue_0.3.0.6.1026.orig.tar.gz
Binary files differ
diff --git a/test-debtransform/2/debian.changelog b/test-debtransform/2/debian.changelog
new file mode 100644
index 0000000..624c354
--- /dev/null
+++ b/test-debtransform/2/debian.changelog
@@ -0,0 +1,24 @@
+grandorgue (0.3.0.6.10) unstable; urgency=low
+
+ * OBS build
+
+ -- Martin Koegler <mkoegler@auto.tuwien.ac.at> Sat, 16 Jun 2012 13:08:51 +0200
+
+grandorgue (0.3.0.6.11) unstable; urgency=low
+
+ * OBS build
+
+ -- Martin Koegler <mkoegler@auto.tuwien.ac.at> Sat, 16 Jun 2012 13:08:35 +0200
+
+grandorgue (0.3.0.6.10-1) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * OBS build
+
+ -- Martin Koegler <mkoegler@auto.tuwien.ac.at> Sat, 16 Jun 2012 11:27:19 +0200
+
+grandorgue (0.3.0.6) unstable; urgency=low
+
+ * Initial version
+
+ -- Martin Koegler <martin.koegler@chello.at> Sun, 06 Nov 2011 19:44:04 +0100
diff --git a/test-debtransform/2/debian.empty b/test-debtransform/2/debian.empty
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/test-debtransform/2/debian.empty
diff --git a/test-debtransform/2/debian.obs-version b/test-debtransform/2/debian.obs-version
new file mode 100644
index 0000000..3e61434
--- /dev/null
+++ b/test-debtransform/2/debian.obs-version
@@ -0,0 +1 @@
+Version: 0.3.0.6.1026
diff --git a/test-debtransform/2/debian.tar.gz b/test-debtransform/2/debian.tar.gz
new file mode 100644
index 0000000..484f362
--- /dev/null
+++ b/test-debtransform/2/debian.tar.gz
Binary files differ
diff --git a/test-debtransform/2/debian1.tar.gz b/test-debtransform/2/debian1.tar.gz
new file mode 100644
index 0000000..b22b94c
--- /dev/null
+++ b/test-debtransform/2/debian1.tar.gz
Binary files differ
diff --git a/test-debtransform/2/go.tar.bz2 b/test-debtransform/2/go.tar.bz2
new file mode 100644
index 0000000..9d835e1
--- /dev/null
+++ b/test-debtransform/2/go.tar.bz2
Binary files differ
diff --git a/test-debtransform/2/grandorgue.dsc b/test-debtransform/2/grandorgue.dsc
new file mode 100644
index 0000000..7add24f
--- /dev/null
+++ b/test-debtransform/2/grandorgue.dsc
@@ -0,0 +1,11 @@
+Format: 1.0
+Source: grandorgue
+Binary: grandorgue
+Architecture: any
+Version: 0.3.0.6.1026
+Maintainer: Martin Koegler <martin.koegler@chello.at>
+Standards-Version: 3.9.1
+Build-Depends: debhelper (>= 7), cdbs, cmake, gettext, po4a, libjack-jackd2-dev, libasound2-dev, libwxgtk2.8-dev, docbook-xsl, xsltproc, zip, devscripts
+DEBTRANSFORM-FILES-TAR: debian.tar.gz debian1.tar.gz
+Files:
+ 1e0023c7fb1f19a883ec8170efeff360 2817072 grandorgue_0.3.0.6.tar.gz
diff --git a/test-debtransform/run.sh b/test-debtransform/run.sh
new file mode 100755
index 0000000..204e312
--- /dev/null
+++ b/test-debtransform/run.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+function fail
+{
+ echo "$1: FAIL"
+ exit 1
+}
+function run
+{
+ rm -rf out
+ mkdir out
+ ERROR=0
+ PATH=..:$PATH ../debtransform $1 $1/$2 out || ERROR=1
+ if [ "$ERROR" != "$3" ]; then
+ fail $1
+ fi
+ echo "$1: OK"
+ if [ "$ERROR" = 0 ]; then
+ for a in out/*
+ do
+ NAME="`basename "$a"`"
+ case $NAME in
+ *.dsc)
+ debdiff $4/$NAME out/$NAME
+ ;;
+ esac
+ done
+ fi
+}
+
+run 1 grandorgue.dsc 0 1-out
+run 2 grandorgue.dsc 0 2-out \ No newline at end of file
diff --git a/test/Fedora_11.conf b/test/Fedora_11.conf
new file mode 100644
index 0000000..1f4dac1
--- /dev/null
+++ b/test/Fedora_11.conf
@@ -0,0 +1,305 @@
+%define _project Fedora:11
+
+### from Fedora:11
+%define _repository standard
+
+Preinstall: acl attr bash bzip2 coreutils device-mapper-libs diffutils
+Preinstall: filesystem glibc grep libacl libattr
+Preinstall: libgcc m4 ncurses pam nss nspr
+Preinstall: popt readline ncurses-libs rpm sed tar zlib
+Preinstall: rpm-libs pcre info libselinux sqlite
+Preinstall: elfutils-libelf findutils neon openssl krb5-libs
+Preinstall: e2fsprogs-libs expat bzip2-libs libstdc++ setup libsepol
+Preinstall: perl-libs policycoreutils libcap db4 file-libs lua
+Preinstall: shadow-utils chkconfig nss-softokn-freebl util-linux-ng
+
+Runscripts: setup
+
+VMinstall: perl device-mapper
+
+Required: autoconf automake binutils bzip2 gcc gdbm gettext glibc
+Required: libtool ncurses nss-softokn-freebl perl rpm zlib rpm-build
+
+Support: bind-libs bind-utils bison cpio cpp cracklib cvs
+Support: e2fsprogs file findutils flex gawk gdbm-devel gettext-devel
+Support: glibc-devel gpm groff gzip info less
+Support: make man module-init-tools
+Support: ncurses-devel net-tools openssl
+Support: patch procinfo procps psmisc rcs strace
+Support: texinfo unzip util-linux-ng zlib-devel vim-enhanced
+Support: initscripts bzip2-devel shadow-utils
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel gzip libada libstdc++ libunwind
+Keep: libunwind-devel make pam-devel pam-modules shadow-utils
+Keep: patch nss-softokn-freebl perl rcs rpm-build ncurses-libs nss nspr
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: initscripts:syslog-ng
+Prefer: generic-logos
+Prefer: text-www-browser:lynx
+Prefer: docbook-utils:lynx
+Prefer: kdepim:pinentry-qt
+Prefer: syslogd sysklogd
+Prefer: kernel
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: initscripts:kernel,udev,ethtool,mingetty
+Ignore: tetex:tetex-fonts,desktop-file-utils
+Ignore: pam:glib2
+Ignore: libraw1394:kernel
+
+Ignore: gettext-devel:libgcj,libstdc++-devel,libgcj_bc.so.1
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: phonon:phonon-backend
+Ignore: phonon:phonon-backend(x86-32)
+Ignore: phonon:phonon-backend(x86-64)
+
+Ignore: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifarch %arm
+# workaround for broken Fedora arm distro
+#Ignore: bind-libs:libcrypto.so.6
+#Ignore: bind-utils:libcrypto.so.6
+%endif
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel
+%else
+ %ifnarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel
+ %else
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit
+ %endif
+%endif
+
+#
+# Bugfix broken dependencies
+#
+Substitute: python python redhat-rpm-config
+
+#
+# SUSE compatibilities
+#
+Substitute: alsa alsa-lib
+Substitute: alsa-devel alsa-lib-devel
+Substitute: docbook-toys docbook-utils
+Substitute: expat expat expat-devel
+Substitute: gtkdoc gtk-doc
+Substitute: db db4
+Substitute: db-devel db4-devel
+Substitute: dbus-1 dbus
+Substitute: dbus-1-devel dbus-devel
+Substitute: dbus-1-glib dbus-glib
+Substitute: dbus-1-python dbus-python
+Substitute: dbus-1-mono dbus-sharp
+Substitute: gtk-devel gtk+-devel
+Substitute: te_latex tetex-latex
+Substitute: xorg-x11-devel xorg-x11-proto-devel xorg-x11-xtrans-devel
+Substitute: krb5 krb5-libs
+Substitute: libsigc++2-devel libsigc++20-devel
+Substitute: libXerces-c-devel xerces-c-devel
+Substitute: libgphoto2-devel gphoto2-devel
+Substitute: libredland-devel redland-devel
+Substitute: libraptor-devel raptor-devel
+Substitute: librasqal-devel rasqal-devel
+Substitute: openldap2 openldap
+Substitute: openldap2-devel openldap-devel
+Substitute: pulseaudio-devel pulseaudio-libs-devel
+Substitute: xorg-x11-Mesa-devel mesa-libGL-devel
+Substitute: ImageMagick-Magick++-devel ImageMagick-c++-devel
+Substitute: ImageMagick-Magick++ ImageMagick-c++
+Substitute: pyxml PyXML
+
+Substitute: Mesa mesa-libGL
+Substitute: Mesa-devel mesa-libGL-devel
+Substitute: freetype2 freetype
+Substitute: freetype2-devel freetype-devel
+Substitute: liblcms-devel lcms-devel
+Substitute: libqt4-devel qt-devel
+Substitute: kdelibs4-devel kdelibs-devel
+
+Prefer: -Glide3-libGL
+Prefer: wxGTK-media:GConf2
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-um kernel-xen kernel-kdump
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen kernel-kdump
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-kdump kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+#
+# experimentel, testing for mc
+#
+Substitute: sgml-skel sgml-common
+Substitute: docbook-xsl-stylesheets docbook-style-xsl
+
+Substitute: libelf elfutils-libelf
+
+%define fedora_version 11
+
+
+Macros:
+%vendor obs://build.opensuse.org/Fedora:11
+%_project Fedora:11
+
+%distribution Fedora:11
+%_project Fedora:11
+
+### from Fedora:11
+%_repository standard
+%opensuse_bs 1
+%fedora_version 11
+%_vendor redhat
+
+#From fedora buildsys-macros package
+%fedora 11
+%dist .fc11
+%fc11 1
+
+%kernel_module_package_buildreqs kernel-devel
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/test/Fedora_12.conf b/test/Fedora_12.conf
new file mode 100644
index 0000000..f0fe9a1
--- /dev/null
+++ b/test/Fedora_12.conf
@@ -0,0 +1,311 @@
+%define _project Fedora:12
+
+### from Fedora:12
+%define _repository standard
+
+Preinstall: acl attr bash bzip2 coreutils device-mapper-libs diffutils
+Preinstall: filesystem glibc grep libacl libattr
+Preinstall: libgcc m4 ncurses pam nss nspr
+Preinstall: popt readline ncurses-libs rpm sed tar zlib
+Preinstall: rpm-libs pcre info libselinux sqlite
+Preinstall: elfutils-libelf findutils openssl krb5-libs
+Preinstall: e2fsprogs-libs expat bzip2-libs libstdc++ setup libsepol
+Preinstall: perl-libs libcap db4 file-libs lua
+Preinstall: shadow-utils chkconfig util-linux-ng
+Preinstall: xz-libs nss-util libblkid libuuid
+Preinstall: nss-softokn-freebl nss-softokn
+
+#Runscripts: setup
+
+VMinstall: perl device-mapper
+
+Required: autoconf automake binutils bzip2 gcc gdbm gettext glibc
+Required: libtool ncurses nss-softokn-freebl perl rpm zlib rpm-build
+
+Support: bind-libs bind-utils bison cpp cracklib cvs cpio
+Support: e2fsprogs file findutils flex gawk gdbm-devel gettext-devel
+Support: glibc-devel gpm groff gzip info less
+Support: make man module-init-tools
+Support: ncurses-devel net-tools openssl
+Support: patch procinfo procps psmisc rcs strace
+Support: texinfo unzip util-linux-ng zlib-devel vim-enhanced
+Support: initscripts bzip2-devel shadow-utils
+
+Keep: binutils cpp cracklib file findutils gawk gcc gcc-ada gcc-c++
+Keep: gdbm glibc-devel gzip libada libstdc++ libunwind
+Keep: libunwind-devel make pam-devel pam-modules shadow-utils
+Keep: patch nss-softokn-freebl perl rcs rpm-build ncurses-libs nss nspr
+
+Prefer: xorg-x11-libs libpng fam mozilla mozilla-nss xorg-x11-Mesa
+Prefer: unixODBC libsoup glitz java-1_4_2-sun gnome-panel
+Prefer: desktop-data-SuSE gnome2-SuSE mono-nunit gecko-sharp2
+Prefer: apache2-prefork openmotif-libs ghostscript-mini gtk-sharp
+Prefer: glib-sharp libzypp-zmd-backend mDNSResponder
+
+Prefer: gnome-sharp2:art-sharp2 gnome-sharp:art-sharp
+Prefer: ifolder3:gnome-sharp2 ifolder3:gconf-sharp2
+Prefer: nautilus-ifolder3:gnome-sharp2
+Prefer: gconf-sharp2:glade-sharp2 gconf-sharp:glade-sharp
+Prefer: tomboy:gconf-sharp tomboy:gnome-sharp
+Prefer: zmd:libzypp-zmd-backend
+Prefer: yast2-packagemanager-devel:yast2-packagemanager
+Prefer: initscripts:syslog-ng
+Prefer: generic-logos
+Prefer: text-www-browser:lynx
+Prefer: docbook-utils:lynx
+Prefer: kdepim:pinentry-qt
+Prefer: syslogd sysklogd
+Prefer: kernel
+
+Prefer: -libgcc-mainline -libstdc++-mainline -gcc-mainline-c++
+Prefer: -libgcj-mainline -viewperf -compat -compat-openssl097g
+Prefer: -zmd -OpenOffice_org -pam-laus -libgcc-tree-ssa -busybox-links
+Prefer: -crossover-office
+Prefer: -xz-lzma-compat
+
+Conflict: ghostscript-library:ghostscript-mini
+
+Ignore: initscripts:kernel,udev,ethtool,mingetty,glib2
+Ignore: tetex:tetex-fonts,desktop-file-utils
+Ignore: pam:glib2
+Ignore: libraw1394:kernel
+Ignore: qt-x11:phonon-backend
+Ignore: qt-x11:phonon-backend(x86-32)
+Ignore: qt-x11:phonon-backend(x86-64)
+
+Ignore: gettext-devel:libgcj,libstdc++-devel,libgcj_bc.so.1
+Ignore: pam-modules:resmgr
+Ignore: rpm:suse-build-key,build-key
+Ignore: bind-utils:bind-libs
+Ignore: alsa:dialog,pciutils
+Ignore: portmap:syslogd
+Ignore: fontconfig:freetype2
+Ignore: fontconfig-devel:freetype2-devel
+Ignore: xorg-x11-libs:freetype2
+Ignore: xorg-x11:x11-tools,resmgr,xkeyboard-config,xorg-x11-Mesa,libusb,freetype2,libjpeg,libpng
+Ignore: apache2:logrotate
+Ignore: arts:alsa,audiofile,resmgr,libogg,libvorbis
+Ignore: kdelibs3:alsa,arts,pcre,OpenEXR,aspell,cups-libs,mDNSResponder,krb5,libjasper
+Ignore: kdelibs3-devel:libvorbis-devel
+Ignore: kdebase3:kdebase3-ksysguardd,OpenEXR,dbus-1,dbus-1-qt,hal,powersave,openslp,libusb
+Ignore: kdebase3-SuSE:release-notes
+Ignore: jack:alsa,libsndfile
+Ignore: libxml2-devel:readline-devel
+Ignore: gnome-vfs2:gnome-mime-data,desktop-file-utils,cdparanoia,dbus-1,dbus-1-glib,krb5,hal,libsmbclient,fam,file_alteration
+Ignore: libgda:file_alteration
+Ignore: gnutls:lzo,libopencdk
+Ignore: gnutls-devel:lzo-devel,libopencdk-devel
+Ignore: pango:cairo,glitz,libpixman,libpng
+Ignore: pango-devel:cairo-devel
+Ignore: cairo-devel:libpixman-devel
+Ignore: libgnomeprint:libgnomecups
+Ignore: libgnomeprintui:libgnomecups
+Ignore: orbit2:libidl
+Ignore: orbit2-devel:libidl,libidl-devel,indent
+Ignore: qt3:libmng
+Ignore: qt-sql:qt_database_plugin
+Ignore: gtk2:libpng,libtiff
+Ignore: libgnomecanvas-devel:glib-devel
+Ignore: libgnomeui:gnome-icon-theme,shared-mime-info
+Ignore: scrollkeeper:docbook_4,sgml-skel
+Ignore: gnome-desktop:libgnomesu,startup-notification
+Ignore: python-devel:python-tk
+Ignore: gnome-pilot:gnome-panel
+Ignore: gnome-panel:control-center2
+Ignore: gnome-menus:kdebase3
+Ignore: gnome-main-menu:rug
+Ignore: libbonoboui:gnome-desktop
+Ignore: postfix:pcre
+Ignore: docbook_4:iso_ent,sgml-skel,xmlcharent
+Ignore: control-center2:nautilus,evolution-data-server,gnome-menus,gstreamer-plugins,gstreamer,metacity,mozilla-nspr,mozilla,libxklavier,gnome-desktop,startup-notification
+Ignore: docbook-xsl-stylesheets:xmlcharent
+Ignore: liby2util-devel:libstdc++-devel,openssl-devel
+Ignore: yast2:yast2-ncurses,yast2-theme-SuSELinux,perl-Config-Crontab,yast2-xml,SuSEfirewall2
+Ignore: yast2-core:netcat,hwinfo,wireless-tools,sysfsutils
+Ignore: yast2-core-devel:libxcrypt-devel,hwinfo-devel,blocxx-devel,sysfsutils,libstdc++-devel
+Ignore: yast2-packagemanager-devel:rpm-devel,curl-devel,openssl-devel
+Ignore: yast2-devtools:perl-XML-Writer,libxslt,pkgconfig
+Ignore: yast2-installation:yast2-update,yast2-mouse,yast2-country,yast2-bootloader,yast2-packager,yast2-network,yast2-online-update,yast2-users,release-notes,autoyast2-installation
+Ignore: yast2-bootloader:bootloader-theme
+Ignore: yast2-packager:yast2-x11
+Ignore: yast2-x11:sax2-libsax-perl
+Ignore: openslp-devel:openssl-devel
+Ignore: java-1_4_2-sun:xorg-x11-libs
+Ignore: java-1_4_2-sun-devel:xorg-x11-libs
+Ignore: kernel-um:xorg-x11-libs
+Ignore: tetex:xorg-x11-libs,expat,fontconfig,freetype2,libjpeg,libpng,ghostscript-x11,xaw3d,gd,dialog,ed
+Ignore: yast2-country:yast2-trans-stats
+Ignore: libgcc:glibc-32bit
+Ignore: libstdc++:glibc-32bit
+Ignore: susehelp:susehelp_lang,suse_help_viewer
+Ignore: mailx:smtp_daemon
+Ignore: cron:smtp_daemon
+Ignore: hotplug:syslog
+Ignore: pcmcia:syslog
+Ignore: avalon-logkit:servlet
+Ignore: jython:servlet
+Ignore: ispell:ispell_dictionary,ispell_english_dictionary
+Ignore: aspell:aspel_dictionary,aspell_dictionary
+Ignore: smartlink-softmodem:kernel,kernel-nongpl
+Ignore: OpenOffice_org-de:myspell-german-dictionary
+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: phonon:phonon-backend
+Ignore: phonon:phonon-backend(x86-32)
+Ignore: phonon:phonon-backend(x86-64)
+
+Ignore: simias:mono(log4net)
+Ignore: zmd:mono(log4net)
+Ignore: horde:mod_php_any,php-gettext,php-mcrypt,php-imap,php-pear-log,php-pear,php-session,php
+Ignore: xerces-j2:xml-commons-apis,xml-commons-resolver
+Ignore: xdg-menu:desktop-data
+Ignore: nessus-libraries:nessus-core
+Ignore: evolution:yelp
+Ignore: mono-tools:mono(gconf-sharp),mono(glade-sharp),mono(gnome-sharp),mono(gtkhtml-sharp),mono(atk-sharp),mono(gdk-sharp),mono(glib-sharp),mono(gtk-sharp),mono(pango-sharp)
+Ignore: gecko-sharp2:mono(glib-sharp),mono(gtk-sharp)
+Ignore: vcdimager:libcdio.so.6,libcdio.so.6(CDIO_6),libiso9660.so.4,libiso9660.so.4(ISO9660_4)
+Ignore: libcdio:libcddb.so.2
+Ignore: gnome-libs:libgnomeui
+Ignore: nautilus:gnome-themes
+Ignore: gnome-panel:gnome-themes
+Ignore: gnome-panel:tomboy
+
+%ifarch %arm
+# workaround for broken Fedora arm distro
+#Ignore: bind-libs:libcrypto.so.6
+#Ignore: bind-utils:libcrypto.so.6
+%endif
+
+%ifnarch s390 s390x ppc ia64
+Substitute: java2-devel-packages java-1_4_2-sun-devel
+%else
+ %ifnarch s390x
+Substitute: java2-devel-packages java-1_4_2-ibm-devel
+ %else
+Substitute: java2-devel-packages java-1_4_2-ibm-devel xorg-x11-libs-32bit
+ %endif
+%endif
+
+#
+# Bugfix broken dependencies
+#
+Substitute: python python redhat-rpm-config
+
+#
+# SUSE compatibilities
+#
+Substitute: alsa alsa-lib
+Substitute: alsa-devel alsa-lib-devel
+Substitute: docbook-toys docbook-utils
+Substitute: expat expat expat-devel
+Substitute: gtkdoc gtk-doc
+Substitute: db db4
+Substitute: db-devel db4-devel
+Substitute: dbus-1 dbus
+Substitute: dbus-1-devel dbus-devel
+Substitute: dbus-1-glib dbus-glib
+Substitute: dbus-1-python dbus-python
+Substitute: dbus-1-mono dbus-sharp
+Substitute: gtk-devel gtk+-devel
+Substitute: te_latex tetex-latex
+Substitute: xorg-x11-devel xorg-x11-proto-devel xorg-x11-xtrans-devel
+Substitute: krb5 krb5-libs
+Substitute: libsigc++2-devel libsigc++20-devel
+Substitute: libXerces-c-devel xerces-c-devel
+Substitute: libgphoto2-devel gphoto2-devel
+Substitute: libredland-devel redland-devel
+Substitute: libraptor-devel raptor-devel
+Substitute: librasqal-devel rasqal-devel
+Substitute: openldap2 openldap
+Substitute: openldap2-devel openldap-devel
+Substitute: pulseaudio-devel pulseaudio-libs-devel
+Substitute: xorg-x11-Mesa-devel mesa-libGL-devel
+Substitute: ImageMagick-Magick++-devel ImageMagick-c++-devel
+Substitute: ImageMagick-Magick++ ImageMagick-c++
+Substitute: pyxml PyXML
+
+Substitute: Mesa mesa-libGL
+Substitute: Mesa-devel mesa-libGL-devel
+Substitute: freetype2 freetype
+Substitute: freetype2-devel freetype-devel
+Substitute: liblcms-devel lcms-devel
+Substitute: libqt4-devel qt-devel
+Substitute: kdelibs4-devel kdelibs-devel
+
+Prefer: -Glide3-libGL
+Prefer: wxGTK-media:GConf2
+
+Substitute: yast2-devel-packages docbook-xsl-stylesheets doxygen libxslt perl-XML-Writer popt-devel sgml-skel update-desktop-files yast2 yast2-devtools yast2-packagemanager-devel yast2-perl-bindings yast2-testsuite
+
+%ifarch x86_64 ppc64 s390x sparc64
+Substitute: glibc-devel-32bit glibc-devel-32bit glibc-32bit
+%else
+ %ifarch ppc
+Substitute: glibc-devel-32bit glibc-devel-64bit
+ %else
+Substitute: glibc-devel-32bit
+ %endif
+%endif
+
+%ifarch %ix86
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-bigsmp kernel-debug kernel-um kernel-xen kernel-kdump
+%endif
+%ifarch ia64
+Substitute: kernel-binary-packages kernel-default kernel-debug
+%endif
+%ifarch x86_64
+Substitute: kernel-binary-packages kernel-default kernel-smp kernel-xen kernel-kdump
+%endif
+%ifarch ppc
+Substitute: kernel-binary-packages kernel-default kernel-kdump kernel-ppc64 kernel-iseries64
+%endif
+%ifarch ppc64
+Substitute: kernel-binary-packages kernel-ppc64 kernel-iseries64
+%endif
+%ifarch s390
+Substitute: kernel-binary-packages kernel-s390
+%endif
+%ifarch s390x
+Substitute: kernel-binary-packages kernel-default
+%endif
+
+#
+# experimentel, testing for mc
+#
+Substitute: sgml-skel sgml-common
+Substitute: docbook-xsl-stylesheets docbook-style-xsl
+
+Substitute: libelf elfutils-libelf
+
+%define fedora_version 12
+
+
+Macros:
+%vendor obs://build.opensuse.org/Fedora:12
+%_project Fedora:12
+
+%distribution Fedora:12
+%_project Fedora:12
+
+### from Fedora:12
+%_repository standard
+%opensuse_bs 1
+%fedora_version 12
+%_vendor redhat
+
+#From fedora buildsys-macros package
+%fedora 12
+%dist .fc12
+%fc12 1
+
+%kernel_module_package_buildreqs kernel-devel
+
+%ext_info .gz
+%ext_man .gz
+
+%info_add(:-:) test -x /sbin/install-info -a -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
+%info_del(:-:) test -x /sbin/install-info -a ! -f %{?2}%{?!2:%{_infodir}}/%{1}%ext_info && /sbin/install-info --quiet --delete --info-dir=%{?2}%{?!2:%{_infodir}} %{?2}%{?!2:%{_infodir}}/%{1}%ext_info \
+%{nil}
+
diff --git a/test/baselibs.conf b/test/baselibs.conf
new file mode 100644
index 0000000..c0e9a7c
--- /dev/null
+++ b/test/baselibs.conf
@@ -0,0 +1 @@
+libdummy1
diff --git a/test/common b/test/common
new file mode 100644
index 0000000..73ffec4
--- /dev/null
+++ b/test/common
@@ -0,0 +1,109 @@
+#!/bin/bash
+# common functions for build script testing
+################################################################
+#
+# Copyright (c) 2009 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+#
+
+set -e
+. ${0%/*}/config
+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
+#if [ ! -e "$build_vm_swap" ]; then
+# sudo dd if=/dev/zero of="$build_vm_swap" bs=512 count=0 seek=$((build_vm_swap_size*2*1024))
+#fi
+
+die()
+{
+ test -z "$1" || echo "$*" >&2
+ exit 1
+}
+
+fail()
+{
+ echo FAILED
+ test -z "$1" || echo "$*"
+ exit 2
+}
+
+skip()
+{
+ echo skipped
+ test -z "$1" || echo "$*"
+ exit 3
+}
+
+build_args=()
+repos=()
+repo()
+{
+ local dir
+ eval dir="\"\$repo_$1\""
+ [ -n "$dir" ] || die "repo $1 not defined, try adding repo_$1=/path/to/repo to config.local"
+ test -d "$dir" || skip
+ repos[${#repos[@]}]="--repository";
+ repos[${#repos[@]}]="$dir";
+}
+
+linux32=
+arch32bit()
+{
+ local hostarch=`uname -m`
+ case "$hostarch" in
+ x86_64) linux32=linux32 ;;
+ *) skip ;;
+ esac
+}
+
+enable_kvm()
+{
+ test -w /dev/kvm || skip "no kvm support"
+ build_args+=(--kvm)
+ [ -z "$build_vm_img" ] || build_args+=("$build_vm_img")
+ [ -z "$build_vm_swap" ] || build_args+=(--swap "$build_vm_swap")
+ [ -z "$build_vm_mem" ] || build_args+=(--memory "$build_vm_mem")
+}
+
+run_build()
+{
+ for i in "$@"; do
+ if [ "$i" = '--kvm' ]; then
+ enable_kvm
+ else
+ build_args+=("$i")
+ fi
+ done
+ SU_WRAPPER=""
+ [ -x /usr/bin/sudo ] && SU_WRAPPER="sudo env"
+ set -- $linux32 $SU_WRAPPER \
+ $BUILD_DIR/build \
+ --root "${build_root}" \
+ "${repos[@]}" \
+ "${build_args[@]}"
+ echo "$@"
+ "$@" || fail
+ find $build_root/.build.packages/ -type f -name '*.rpm' -print0 | xargs --no-run-if-empty -0 rpm -K || fail
+}
diff --git a/test/config b/test/config
new file mode 100644
index 0000000..22f38d5
--- /dev/null
+++ b/test/config
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+: ${build_root:=/abuild/build-root}
+#: ${build_vm_img:=/abuild/build-root.img}
+#: ${build_vm_swap:=/abuild/build-root.swap}
+: ${build_vm_mem:=256}
+: ${build_vm_image_size:=500}
+: ${build_vm_swap_size:=100}
diff --git a/test/libdummy1.spec b/test/libdummy1.spec
new file mode 100644
index 0000000..6748229
--- /dev/null
+++ b/test/libdummy1.spec
@@ -0,0 +1,28 @@
+Name: libdummy1
+Version: 0
+Release: 0
+Group: None
+Summary: Dummy
+License: GPL
+BuildRoot: %_tmppath/%name-%version-build
+
+%build
+gcc --version
+echo "int dummy(void) {}" | gcc -shared -Wl,-soname=libdummy.so.1 -o libdummy.so.1 -x c -
+%install
+mkdir -p %buildroot%_libdir
+install libdummy.so.1 %buildroot%_libdir
+
+%clean
+rm -rf %buildroot
+
+%description
+target_cpu %_target_cpu
+arch %_arch
+build_arch %_build_arch
+
+%files
+%defattr(-,root,root)
+%_libdir/libdummy.so.1
+
+%changelog
diff --git a/test/testbuild.11.0-i386 b/test/testbuild.11.0-i386
new file mode 100755
index 0000000..97dfd7c
--- /dev/null
+++ b/test/testbuild.11.0-i386
@@ -0,0 +1,9 @@
+#!/bin/bash
+. ${0%/*}/common
+
+arch32bit
+
+repo 11_0_i386
+
+run_build --dist 11.0-i386 \
+ "$@"
diff --git a/test/testbuild.11.0-x86_64 b/test/testbuild.11.0-x86_64
new file mode 100755
index 0000000..7e8fea8
--- /dev/null
+++ b/test/testbuild.11.0-x86_64
@@ -0,0 +1,7 @@
+#!/bin/bash
+. ${0%/*}/common
+
+repo 11_0_x86_64
+
+run_build --dist 11.0-x86_64 \
+ "$@"
diff --git a/test/testbuild.11.1-i386 b/test/testbuild.11.1-i386
new file mode 100755
index 0000000..c665992
--- /dev/null
+++ b/test/testbuild.11.1-i386
@@ -0,0 +1,9 @@
+#!/bin/bash
+. ${0%/*}/common
+
+arch32bit
+
+repo 11_1_ftp
+
+run_build --dist 11.1-i386 \
+ "$@"
diff --git a/test/testbuild.11.2-i386 b/test/testbuild.11.2-i386
new file mode 100755
index 0000000..ab3f9a2
--- /dev/null
+++ b/test/testbuild.11.2-i386
@@ -0,0 +1,9 @@
+#!/bin/bash
+. ${0%/*}/common
+
+arch32bit
+
+repo 11_2
+
+run_build --dist 11.2-i386 \
+ "$@"
diff --git a/test/testbuild.8.1-i386 b/test/testbuild.8.1-i386
new file mode 100755
index 0000000..64b6daa
--- /dev/null
+++ b/test/testbuild.8.1-i386
@@ -0,0 +1,9 @@
+#!/bin/bash
+. ${0%/*}/common
+
+arch32bit
+
+repo 8_1_i386
+
+run_build --dist 8.1-i386 \
+ "$@"
diff --git a/test/testbuild.Fedora11-i386 b/test/testbuild.Fedora11-i386
new file mode 100755
index 0000000..d69249c
--- /dev/null
+++ b/test/testbuild.Fedora11-i386
@@ -0,0 +1,9 @@
+#!/bin/bash
+. ${0%/*}/common
+
+arch32bit
+
+repo fedora11_i386
+
+run_build --dist $PWD/Fedora_11.conf --arch i686 \
+ "$@"
diff --git a/test/testbuild.Fedora11-x86_64 b/test/testbuild.Fedora11-x86_64
new file mode 100755
index 0000000..55441c5
--- /dev/null
+++ b/test/testbuild.Fedora11-x86_64
@@ -0,0 +1,7 @@
+#!/bin/bash
+. ${0%/*}/common
+
+repo fedora11_x86_64
+
+run_build --dist $PWD/Fedora_11.conf \
+ "$@"
diff --git a/test/testbuild.Fedora12-i386 b/test/testbuild.Fedora12-i386
new file mode 100755
index 0000000..e43a055
--- /dev/null
+++ b/test/testbuild.Fedora12-i386
@@ -0,0 +1,9 @@
+#!/bin/bash
+. ${0%/*}/common
+
+arch32bit
+
+repo fedora12_i386
+
+run_build --dist $PWD/Fedora_12.conf --arch i686 \
+ "$@"
diff --git a/test/testbuild.Fedora12-x86_64 b/test/testbuild.Fedora12-x86_64
new file mode 100755
index 0000000..4db3279
--- /dev/null
+++ b/test/testbuild.Fedora12-x86_64
@@ -0,0 +1,7 @@
+#!/bin/bash
+. ${0%/*}/common
+
+repo fedora12_x86_64
+
+run_build --dist $PWD/Fedora_12.conf \
+ "$@"
diff --git a/test/testbuild.sh b/test/testbuild.sh
new file mode 100755
index 0000000..b81c929
--- /dev/null
+++ b/test/testbuild.sh
@@ -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/test/testbuild.sles10-i386 b/test/testbuild.sles10-i386
new file mode 100755
index 0000000..59108e1
--- /dev/null
+++ b/test/testbuild.sles10-i386
@@ -0,0 +1,10 @@
+#!/bin/bash
+. ${0%/*}/common
+
+arch32bit
+
+repo sle10sp2_i386
+repo sle10sp2_sdk_i386
+
+run_build --dist sles10 \
+ "$@"
diff --git a/test/testbuild.sles10-x86_64 b/test/testbuild.sles10-x86_64
new file mode 100755
index 0000000..5e29cc9
--- /dev/null
+++ b/test/testbuild.sles10-x86_64
@@ -0,0 +1,8 @@
+#!/bin/bash
+. ${0%/*}/common
+
+repo sle10sp2_x86_64
+repo sle10sp2_sdk_x86_64
+
+run_build --dist sles10 \
+ "$@"
diff --git a/test/testbuild.sles9-i386 b/test/testbuild.sles9-i386
new file mode 100755
index 0000000..7e1b7c6
--- /dev/null
+++ b/test/testbuild.sles9-i386
@@ -0,0 +1,10 @@
+#!/bin/bash
+. ${0%/*}/common
+
+arch32bit
+
+repo core9_i386
+repo sles9_i386
+
+run_build --dist sles9 \
+ "$@"
diff --git a/unrpm b/unrpm
new file mode 100755
index 0000000..e1c347c
--- /dev/null
+++ b/unrpm
@@ -0,0 +1,59 @@
+#!/bin/bash
+
+################################################################
+#
+# Copyright (c) 1995-2014 SUSE Linux Products GmbH
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 or 3 as
+# published by the Free Software Foundation.
+#
+# This program 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 this program (see the file COPYING); if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+#
+################################################################
+
+function Usage () {
+ echo "Usage: $(basename $0) [-vq] rpm-files...";
+ echo "Unpack rpm files in current directory.";
+ exit 1
+}
+
+CPIO_OPTS="--extract --unconditional --preserve-modification-time --make-directories"
+
+FILES=""
+VERBOSE=false
+QUIET=false
+
+for i in $* ; do
+ case "$i" in
+ -v)
+ VERBOSE=true
+ ;;
+ -q)
+ QUIET=true
+ ;;
+ *)
+ FILES="$FILES $i"
+ ;;
+ esac
+done
+
+test "$VERBOSE" = "true" && CPIO_OPTS="$CPIO_OPTS --verbose"
+test "$QUIET" = "true" && CPIO_OPTS="$CPIO_OPTS --quiet"
+
+test -z "$FILES" && Usage
+
+for f in $FILES; do
+ if test "$QUIET" = "false" ; then
+ echo -ne "$f:\t"
+ fi
+ rpm2cpio $f | cpio ${CPIO_OPTS}
+done
diff --git a/unrpm.1 b/unrpm.1
new file mode 100644
index 0000000..6ed4dcd
--- /dev/null
+++ b/unrpm.1
@@ -0,0 +1,17 @@
+.TH unrpm 1 "(c) 1997-2014 SuSE Linux AG Nuernberg, Germany"
+.SH NAME
+unrpm \- unpack the contents of one or more rpm files
+.SH SYNOPSIS
+.B unrpm
+.RB [ -v ]
+.RB [ -q ]
+.I rpm
+.RB ...
+
+.SH DESCRIPTION
+The \fBunrpm\fP tool unpacks one or more rpm files into the
+current directory. The \fB-v\fP option makes it print the filenames
+while unpacking, whereas the \fB-q\fP option suppresses any output.
+
+.SH SEE ALSO
+.BR rpm2cpio (8),
diff --git a/vc b/vc
new file mode 100755
index 0000000..55478bb
--- /dev/null
+++ b/vc
@@ -0,0 +1,168 @@
+#!/bin/bash
+# use this script to edit *.changes files
+#
+# based on changelog edit script from xqf
+#
+# Copyright (C) 2002 Ludwig Nussel
+# Copyright (C) 2009 SUSE Linux Products GmbH, Nuernberg, Germany.
+#
+# This program 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 or 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+shopt -s nullglob
+
+if [ -z "$mailaddr" ]; then
+ domain=`dnsdomainname`
+ [ -z "$domain" ] && domain=localhost
+ mailaddr="$USER@$domain"
+fi
+
+if [ -n "$VC_REALNAME" ]; then
+ packager="$VC_REALNAME <${VC_MAILADDR:-$mailaddr}>"
+elif [ -x /usr/bin/rpmdev-packager ]; then
+ packager=`rpmdev-packager`
+else
+ packager="`getent passwd $UID | cut -d: -f5 | cut -d ',' -f 1` <$mailaddr>"
+fi
+
+EDITOR=${EDITOR:-vim}
+date=`LC_ALL=POSIX TZ=UTC date`
+
+if ! which mktemp > /dev/null 2>&1; then
+ echo "mktemp is required for this script to work"
+ exit 1
+fi
+
+while [ -n "$1" ]; do
+ case "$1" in
+ -m)
+ if [ $just_edit ]; then
+ echo "You cannot use -m and -e together!"
+ exit 1
+ fi
+ message="$2"
+ shift 2
+ ;;
+ -e)
+ if [ -n "${message}" ]; then
+ echo "You cannot use -m and -e together!"
+ exit 1
+ fi
+ just_edit=true
+ shift 1
+ ;;
+ --help)
+ echo "Usage: $0 [-m MESSAGE|-e] [filename[.changes]|path [file_with_comment]]"
+ echo
+ echo "Will use '$packager' for changelog entries"
+ echo
+ echo "Options:"
+ echo " -m MESSAGE add MESSAGE to changes (not open an editor)"
+ echo " -e just open changes (cannot be used with -m)"
+ exit 0
+ ;;
+ *) break ;;
+ esac
+done
+
+changelog="$1"
+content="$2"
+pkgpath=
+if [ -n "$changelog" -a -d "$changelog" ]; then
+ pkgpath="$changelog/"
+ changelog=''
+fi
+
+if [ -n "$changelog" ]; then
+ if [ "${changelog%.changes}" = "$changelog" ]; then
+ changelog="$changelog.changes"
+ fi
+else
+ changelog=($pkgpath*.changes)
+ if [ "${#changelog[@]}" -eq 1 ]; then
+ changelog="$changelog"
+ elif [ -n "$changelog" ]; then
+ echo "Choose one of ${changelog[@]}"
+ exit 1
+ fi
+fi
+
+if [ -z "$changelog" ]; then
+ changelog=($pkgpath*.spec)
+ if [ "${#changelog[@]}" -eq 1 ]; then
+ changelog=${changelog%.spec}.changes
+ elif [ -n "$changelog" ]; then
+ echo "Choose one of ${changelog[@]}"
+ exit 1
+ fi
+fi
+
+if [ -z "$changelog" ]; then
+ echo "no .changes and no .spec file found"
+ exit 1
+fi
+
+if [ ! -e "$changelog" ]; then
+ created_new_changelog=true
+ touch $changelog
+fi
+
+tmpfile=`mktemp -q $changelog.vctmp.XXXXXX`
+if [ $? -ne 0 ]; then
+ echo "$0: Can't create temp file, exiting..."
+ exit 1
+fi
+trap "rm -f \"$tmpfile\"" EXIT
+
+set +e
+
+{
+ if [ ! $just_edit ]; then
+ echo "-------------------------------------------------------------------"
+ echo "$date - $packager"
+ echo
+ fi
+ if [ -n "$message" ]; then
+ echo -e "- $message"
+ elif [ -n "$content" ]; then
+ cat "$content"
+ elif [ ! $just_edit ]; then
+ echo "- "
+ fi
+ if [ -f "$changelog" ] && [ -s "$changelog" ] && [ ! $just_edit ]; then
+ # Avoid double newlines at EOF on a new blank .changes file,
+ # but do provide enough spacing between preexisting log entries.
+ echo
+ fi
+ cat $changelog
+} >> "$tmpfile"
+
+if [ -z "$message" ]; then
+ set -- `md5sum "$tmpfile"`
+ chksum="$1"
+ $EDITOR +4 "$tmpfile"
+ set -- `md5sum "$tmpfile"`
+ if [ -z "$content" -a "$chksum" == "$1" ]; then
+ echo "no changes made"
+ if [ "$created_new_changelog" = true ]; then
+ rm -f "$changelog"
+ fi
+ exit 0
+ 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/vc.1 b/vc.1
new file mode 100644
index 0000000..e2b50e2
--- /dev/null
+++ b/vc.1
@@ -0,0 +1,25 @@
+.TH vc 1 "(c) 1997-2014 SuSE Linux AG Nuernberg, Germany"
+.SH NAME
+vs \- create a SUSE stype changes entry
+.SH SYNOPSIS
+.B vc
+.RB [ -m
+.IR message ]
+.RB [ -e ]
+.RI [ changesfile_or_dir
+.RI [ commentfile ]]
+
+.SH DESCRIPTION
+The \fBvc\fP tool adds a new changes entry to a SUSE \fB.changes\fP file.
+The \fB-m\fP option can be used to directly specify the entry, if it is
+not given an editor is started to interactively enter the new changes
+entry. If a \fIcommentfile\fP is given, its content is used as template
+for the new entry instead of an empty entry, whereas the \fB-e\fP option
+suppresses the creation of an empty entry.
+
+If no \fIchangesfile\fP is specified, \fBvc\fP will search the current
+directory for a file ending with \fB.changes\fP. If a directory is
+specified instead of a changes will, it will be searched instead.
+
+.SH SEE ALSO
+.BR build (1),