From 3addbf0819633fff71ee787cd01cf877cfd43f7c Mon Sep 17 00:00:00 2001 From: Zhang Qiang Date: Wed, 6 Aug 2014 15:59:36 +0800 Subject: [PATCH] Upgrade to 2014-07-15 Change-Id: I5cf86c99d49dcd71c95d32397e8f567b16f83055 --- Build.pm | 138 +- Build/Arch.pm | 4 +- Build/Deb.pm | 1 + Build/Kiwi.pm | 1 + Build/LiveBuild.pm | 99 ++ Build/Rpm.pm | 31 +- Build/Zypp.pm | 37 +- Makefile | 14 +- build | 2555 +++++----------------------------- build-pkg | 80 ++ build-pkg-arch | 62 + build-pkg-deb | 111 ++ build-pkg-rpm | 201 +++ build-recipe | 108 ++ build-recipe-arch | 40 + build-recipe-dsc | 86 ++ build-recipe-kiwi | 469 +++++++ build-recipe-livebuild | 222 +++ build-recipe-mock | 83 ++ build-recipe-preinstallimage | 62 + build-recipe-spec | 218 +++ build-vm | 808 +++++++++++ build-vm-ec2 | 211 +++ build-vm-emulator | 70 + build-vm-kvm | 211 +++ build-vm-lxc | 59 + build-vm-openstack | 128 ++ build-vm-qemu | 44 + build-vm-uml | 50 + build-vm-xen | 116 ++ build-vm-zvm | 352 +++++ build_kiwi.sh | 368 ----- changelog2spec | 6 +- common_functions | 68 +- computeblocklists | 145 +- configs/arch.conf | 10 +- configs/sl13.2.conf | 96 +- createarchdeps | 4 +- createrepomddeps | 76 +- createyastdeps | 49 +- createzyppdeps | 67 + detect_architecture.sh | 8 - download | 4 +- emulator/emulator.sh | 2 +- expanddeps | 61 +- extractbuild | 88 +- getchangetarget | 35 - getmacros | 33 - getoptflags | 47 - gettype | 36 - init_buildsystem | 797 ++++------- initscript_qemu_vm | 28 - initvm.c | 37 +- livebuild_pre_run.template | 49 + mkbaselibs | 9 +- order | 1 + qemu-reg | 9 +- queryconfig | 64 + substitutedeps | 2 + t/bad.livebuild | Bin 0 -> 40960 bytes t/directory.livebuild | Bin 0 -> 30720 bytes t/live-build | 52 + t/standard.livebuild | Bin 0 -> 30720 bytes test/common | 8 +- test/testbuild.sh | 19 + vc | 22 +- zvm_functions | 223 --- 67 files changed, 5300 insertions(+), 3894 deletions(-) create mode 100644 Build/LiveBuild.pm create mode 100644 build-pkg create mode 100644 build-pkg-arch create mode 100644 build-pkg-deb create mode 100644 build-pkg-rpm create mode 100644 build-recipe create mode 100644 build-recipe-arch create mode 100644 build-recipe-dsc create mode 100644 build-recipe-kiwi create mode 100644 build-recipe-livebuild create mode 100644 build-recipe-mock create mode 100644 build-recipe-preinstallimage create mode 100644 build-recipe-spec create mode 100644 build-vm create mode 100644 build-vm-ec2 create mode 100644 build-vm-emulator create mode 100644 build-vm-kvm create mode 100644 build-vm-lxc create mode 100644 build-vm-openstack create mode 100644 build-vm-qemu create mode 100644 build-vm-uml create mode 100644 build-vm-xen create mode 100644 build-vm-zvm delete mode 100644 build_kiwi.sh create mode 100755 createzyppdeps delete mode 100644 detect_architecture.sh delete mode 100755 getchangetarget delete mode 100755 getmacros delete mode 100755 getoptflags delete mode 100755 gettype delete mode 100755 initscript_qemu_vm create mode 100755 livebuild_pre_run.template create mode 100755 queryconfig create mode 100644 t/bad.livebuild create mode 100644 t/directory.livebuild create mode 100755 t/live-build create mode 100644 t/standard.livebuild create mode 100755 test/testbuild.sh delete mode 100644 zvm_functions diff --git a/Build.pm b/Build.pm index 5024405..9e6fda3 100644 --- a/Build.pm +++ b/Build.pm @@ -11,6 +11,7 @@ our $do_rpm; our $do_deb; our $do_kiwi; our $do_arch; +our $do_livebuild; sub import { for (@_) { @@ -18,8 +19,9 @@ sub import { $do_deb = 1 if $_ eq ':deb'; $do_kiwi = 1 if $_ eq ':kiwi'; $do_arch = 1 if $_ eq ':arch'; + $do_livebuild = 1 if $_ eq ':livebuild'; } - $do_rpm = $do_deb = $do_kiwi = $do_arch = 1 if !$do_rpm && !$do_deb && !$do_kiwi && !$do_arch; + $do_rpm = $do_deb = $do_kiwi = $do_arch = $do_livebuild = 1 if !$do_rpm && !$do_deb && !$do_kiwi && !$do_arch && !$do_livebuild; if ($do_deb) { require Build::Deb; } @@ -29,6 +31,9 @@ sub import { if ($do_arch) { require Build::Arch; } + if ($do_livebuild) { + require Build::LiveBuild; + } } package Build::Features; @@ -204,6 +209,7 @@ sub read_config { $config->{'fileprovides'} = {}; $config->{'constraint'} = []; $config->{'expandflags'} = []; + $config->{'buildflags'} = []; for my $l (@spec) { $l = $l->[1] if ref $l; next unless defined $l; @@ -220,7 +226,7 @@ sub read_config { } next; } - if ($l0 eq 'preinstall:' || $l0 eq 'vminstall:' || $l0 eq 'required:' || $l0 eq 'support:' || $l0 eq 'keep:' || $l0 eq 'prefer:' || $l0 eq 'ignore:' || $l0 eq 'conflict:' || $l0 eq 'runscripts:' || $l0 eq 'expandflags:') { + if ($l0 eq 'preinstall:' || $l0 eq 'vminstall:' || $l0 eq 'required:' || $l0 eq 'support:' || $l0 eq 'keep:' || $l0 eq 'prefer:' || $l0 eq 'ignore:' || $l0 eq 'conflict:' || $l0 eq 'runscripts:' || $l0 eq 'expandflags:' || $l0 eq 'buildflags:') { my $t = substr($l0, 0, -1); for my $l (@l) { if ($l eq '!*') { @@ -271,13 +277,15 @@ sub read_config { $config->{'order'}->{$l} = 1; } } - } elsif ($l0 eq 'repotype:') { #type of generated repository data + } elsif ($l0 eq 'repotype:') { # type of generated repository data $config->{'repotype'} = [ @l ]; - } elsif ($l0 eq 'type:') { #kind of packaging system (spec,dsc,arch,kiwi,...) + } elsif ($l0 eq 'type:') { # kind of recipe system (spec,dsc,arch,kiwi,...) $config->{'type'} = $l[0]; - } elsif ($l0 eq 'binarytype:') { #rpm,deb,arch,... + } elsif ($l0 eq 'buildengine:') { # build engine (build,mock) + $config->{'buildengine'} = $l[0]; + } elsif ($l0 eq 'binarytype:') { # kind of binary packages (rpm,deb,arch,...) $config->{'binarytype'} = $l[0]; - } elsif ($l0 eq 'patterntype:') { #kind of generated patterns in repository + } elsif ($l0 eq 'patterntype:') { # kind of generated patterns in repository $config->{'patterntype'} = [ @l ]; } elsif ($l0 eq 'release:') { $config->{'release'} = $l[0]; @@ -324,7 +332,7 @@ sub read_config { } if (!$config->{'binarytype'}) { $config->{'binarytype'} = 'rpm' if $config->{'type'} eq 'spec' || $config->{'type'} eq 'kiwi'; - $config->{'binarytype'} = 'deb' if $config->{'type'} eq 'dsc'; + $config->{'binarytype'} = 'deb' if $config->{'type'} eq 'dsc' || $config->{'type'} eq 'livebuild'; $config->{'binarytype'} = 'arch' if $config->{'type'} eq 'arch'; $config->{'binarytype'} ||= 'UNDEFINED'; } @@ -351,6 +359,13 @@ sub read_config { $config->{"expandflags:$_"} = 1; } } + for (@{$config->{'buildflags'} || []}) { + if (/^([^:]+):(.*)$/s) { + $config->{"buildflags:$1"} = $2; + } else { + $config->{"buildflags:$_"} = 1; + } + } return $config; } @@ -394,32 +409,91 @@ sub do_subst_vers { return @res; } +sub add_livebuild_packages { + my ($config, @deps) = @_; + + if ($config->{'substitute'}->{'build-packages:livebuild'}) { + push @deps, @{$config->{'substitute'}->{'build-packages:livebuild'}}; + } else { + # defaults live-build package dependencies base on 4.0~a26 gathered with: + # grep Check_package -r /usr/lib/live/build + push @deps, ( + 'apt-utils', 'dctrl-tools', 'debconf', 'dosfstools', 'e2fsprogs', 'grub', + 'librsvg2-bin', 'live-boot', 'live-config', 'mtd-tools', 'parted', + 'squashfs-tools', 'syslinux', 'syslinux-common', 'wget', 'xorriso', + 'zsync' ); + } + return @deps; +} + # Delivers all packages which get used for building sub get_build { my ($config, $subpacks, @deps) = @_; + + @deps = add_livebuild_packages($config, @deps) if $config->{'type'} eq 'livebuild'; my @ndeps = grep {/^-/} @deps; + my %ndeps = map {$_ => 1} @ndeps; + my @directdepsend; + if ($ndeps{'--directdepsend--'}) { + @directdepsend = @deps; + for (splice @deps) { + last if $_ eq '--directdepsend--'; + push @deps, $_; + } + @directdepsend = grep {!/^-/} splice(@directdepsend, @deps + 1); + } my @extra = (@{$config->{'required'}}, @{$config->{'support'}}); if (@{$config->{'keep'} || []}) { my %keep = map {$_ => 1} (@deps, @{$config->{'keep'} || []}, @{$config->{'preinstall'}}); for (@{$subpacks || []}) { - push @ndeps, "-$_" unless $keep{$_}; + next if $keep{$_}; + push @ndeps, "-$_"; + $ndeps{"-$_"} = 1; } } else { # new "empty keep" mode, filter subpacks from required/support my %subpacks = map {$_ => 1} @{$subpacks || []}; @extra = grep {!$subpacks{$_}} @extra; } - my %ndeps = map {$_ => 1} @ndeps; @deps = grep {!$ndeps{$_}} @deps; push @deps, @{$config->{'preinstall'}}; push @deps, @extra; @deps = grep {!$ndeps{"-$_"}} @deps; @deps = do_subst($config, @deps); @deps = grep {!$ndeps{"-$_"}} @deps; - @deps = expand($config, @deps, @ndeps); + if (@directdepsend) { + @directdepsend = do_subst($config, @directdepsend); + @directdepsend = grep {!$ndeps{"-$_"}} @directdepsend; + unshift @directdepsend, '--directdepsend--' if @directdepsend; + } + @deps = expand($config, @deps, @ndeps, @directdepsend); return @deps; } +# return the package needed for setting up the build environment. +# an empty result means that the packages from get_build should +# be used instead. +sub get_sysbuild { + my ($config, $buildtype) = @_; + my $engine = $config->{'buildengine'} || ''; + $buildtype ||= $config->{'type'} || ''; + my @sysdeps; + if ($engine eq 'mock' && $buildtype ne 'kiwi') { + @sysdeps = @{$config->{'substitute'}->{'system-packages:mock'} || []}; + @sysdeps = ('mock', 'createrepo') unless @sysdeps; + } elsif ($buildtype eq 'livebuild') { + # packages used for build environment setup (build-recipe-livebuild deps) + @sysdeps = @{$config->{'substitute'}->{'system-packages:livebuild'} || []}; + @sysdeps = ('apt-utils', 'cpio', 'dpkg-dev', 'live-build', 'lsb-release', 'tar') unless @sysdeps; + } + return () unless @sysdeps; + @sysdeps = Build::get_build($config, [], @sysdeps); + return @sysdeps unless $sysdeps[0]; + shift @sysdeps; + @sysdeps = unify(@sysdeps, get_preinstalls($config)); + return (1, @sysdeps); +} + # Delivers all packages which shall have an influence to other package builds (get_build reduced by support packages) sub get_deps { my ($config, $subpacks, @deps) = @_; @@ -658,13 +732,23 @@ sub expand { my $requires = $config->{'requiresh'}; my %xignore = map {substr($_, 1) => 1} grep {/^-/} @p; + my @directdepsend; + if ($xignore{'-directdepsend--'}) { + delete $xignore{'-directdepsend--'}; + my @directdepsend = @p; + for my $p (splice @p) { + last if $p eq '--directdepsend--'; + push @p, $p; + } + @directdepsend = grep {!/^-/} splice(@directdepsend, @p + 1); + } @p = grep {!/^-/} @p; my %p; # expanded packages my %aconflicts; # packages we are conflicting with # add direct dependency packages. this is different from below, - # because we add packages even if to dep is already provided and + # because we add packages even if the dep is already provided and # we break ambiguities if the name is an exact match. for my $p (splice @p) { my @q = @{$whatprovides->{$p} || addproviders($config, $p)}; @@ -682,6 +766,7 @@ sub expand { $p{$q[0]} = 1; $aconflicts{$_} = 1 for @{$conflicts->{$q[0]} || []}; } + push @p, @directdepsend; my @pamb = (); my $doamb = 0; @@ -881,6 +966,16 @@ sub add_all_providers { ########################################################################### +sub recipe2buildtype { + my ($recipe) = @_; + return $1 if $recipe =~ /\.(spec|dsc|kiwi|livebuild)$/; + $recipe =~ s/.*\///; + $recipe =~ s/^_service:.*://; + return 'arch' if $recipe eq 'PKGBUILD'; + return 'preinstallimage' if $recipe eq '_preinstallimage'; + return undef; +} + sub show { my ($conffile, $fn, $field, $arch) = @ARGV; my $cf = read_config($arch, $conffile); @@ -906,8 +1001,25 @@ sub parse { return Build::Deb::parse($cf, $fn, @args) if $do_deb && $fn =~ /\.dsc$/; return Build::Kiwi::parse($cf, $fn, @args) if $do_kiwi && $fn =~ /config\.xml$/; return Build::Kiwi::parse($cf, $fn, @args) if $do_kiwi && $fn =~ /\.kiwi$/; - return Build::Arch::parse($cf, $fn, @args) if $do_arch && $fn =~ /(^|\/|-)PKGBUILD$/; - return parse_preinstallimage($cf, $fn, @args) if $fn =~ /(^|\/|-)_preinstallimage$/; + return Build::LiveBuild::parse($cf, $fn, @args) if $do_livebuild && $fn =~ /\.livebuild$/; + my $fnx = $fn; + $fnx =~ s/.*\///; + $fnx =~ s/^[0-9a-f]{32,}-//; # hack for OBS srcrep implementation + $fnx =~ s/^_service:.*://; + return Build::Arch::parse($cf, $fn, @args) if $do_arch && $fnx eq 'PKGBUILD'; + return parse_preinstallimage($cf, $fn, @args) if $fnx eq '_preinstallimage'; + return undef; +} + +sub parse_typed { + my ($cf, $fn, $buildtype, @args) = @_; + $buildtype ||= ''; + return Build::Rpm::parse($cf, $fn, @args) if $do_rpm && $buildtype eq 'spec'; + return Build::Deb::parse($cf, $fn, @args) if $do_deb && $buildtype eq 'dsc'; + return Build::Kiwi::parse($cf, $fn, @args) if $do_kiwi && $buildtype eq 'kiwi'; + return Build::LiveBuild::parse($cf, $fn, @args) if $do_livebuild && $buildtype eq 'livebuild'; + return Build::Arch::parse($cf, $fn, @args) if $do_arch && $buildtype eq 'arch'; + return parse_preinstallimage($cf, $fn, @args) if $buildtype eq 'preinstallimage'; return undef; } diff --git a/Build/Arch.pm b/Build/Arch.pm index 8e561c3..9d4f727 100644 --- a/Build/Arch.pm +++ b/Build/Arch.pm @@ -55,7 +55,7 @@ sub parse { my $var = $1; my $val = $3; if ($2) { - while ($val !~ s/\)\s*$//s) { + while ($val !~ s/\)\s*(?:#.*)?$//s) { my $nextline = ; last unless defined $nextline; chomp $nextline; @@ -68,6 +68,7 @@ sub parse { $ret->{'name'} = $vars{'pkgname'}->[0] if $vars{'pkgname'}; $ret->{'version'} = $vars{'pkgver'}->[0] if $vars{'pkgver'}; $ret->{'deps'} = $vars{'makedepends'} || []; + push @{$ret->{'deps'}}, @{$vars{'checkdepends'} || []}; push @{$ret->{'deps'}}, @{$vars{'depends'} || []}; $ret->{'source'} = $vars{'source'} if $vars{'source'}; return $ret; @@ -173,6 +174,7 @@ sub query { # arch packages don't seem to have a source :( # fake it so that the package isn't confused with a src package $ret->{'source'} = $ret->{'name'} if defined $ret->{'name'}; + $ret->{'buildtime'} = $vars->{'builddate'}->[0] if $opts{'buildtime'} && $vars->{'builddate'}; return $ret; } diff --git a/Build/Deb.pm b/Build/Deb.pm index 3878fd4..2ee5602 100644 --- a/Build/Deb.pm +++ b/Build/Deb.pm @@ -25,6 +25,7 @@ sub parse { $arch = 'all' if !defined($arch) || $arch eq 'noarch'; $arch = 'i386' if $arch =~ /^i[456]86$/; $arch = 'powerpc' if $arch eq 'ppc'; + $arch = 'ppc64el' if $arch eq 'ppc64le'; $arch = 'amd64' if $arch eq 'x86_64'; $arch = 'armel' if $arch =~ /^armv[4567]l$/; $arch = 'armhf' if $arch eq 'armv7hl'; diff --git a/Build/Kiwi.pm b/Build/Kiwi.pm index f976029..515057d 100644 --- a/Build/Kiwi.pm +++ b/Build/Kiwi.pm @@ -188,6 +188,7 @@ sub kiwiparse { if ($instsource->{'productoptions'}) { my $productoptions = $instsource->{'productoptions'}->[0] || {}; for my $po (@{$productoptions->{'productvar'} || []}) { + $ret->{'drop_repository'} = $po->{'_content'} if $po->{'name'} eq 'DROP_REPOSITORY'; $ret->{'version'} = $po->{'_content'} if $po->{'name'} eq 'VERSION'; } for my $po (@{$productoptions->{'productoption'} || []}) { diff --git a/Build/LiveBuild.pm b/Build/LiveBuild.pm new file mode 100644 index 0000000..00da9e3 --- /dev/null +++ b/Build/LiveBuild.pm @@ -0,0 +1,99 @@ +# +# Author: Jan Blunck +# +# This file is part of build. +# +# build is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# build is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with build. If not, see . +# + +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/Rpm.pm b/Build/Rpm.pm index e6a1815..2d8cf08 100644 --- a/Build/Rpm.pm +++ b/Build/Rpm.pm @@ -348,10 +348,20 @@ reexpand: } $macalt = $macros{$macname} unless defined $macalt; $macalt = '' if $mactest == -1; - $line = "$macalt$line"; + if ($macalt =~ /%/) { + push @expandstack, ('', $line, 1) if $line ne ''; + $line = $macalt; + } else { + $expandedline .= $macalt; + } } elsif ($mactest) { $macalt = '' if !defined($macalt) || $mactest == 1; - $line = "$macalt$line"; + if ($macalt =~ /%/) { + push @expandstack, ('', $line, 1) if $line ne ''; + $line = $macalt; + } else { + $expandedline .= $macalt; + } } else { $expandedline .= "%$macorig" unless $macname =~ /^-/; } @@ -360,12 +370,15 @@ reexpand: if (@expandstack) { my $m = pop(@expandstack); if ($m) { - $optmacros = adaptmacros(\%macros, $optmacros, $m); + $optmacros = adaptmacros(\%macros, $optmacros, $m) if ref $m; $expandstack[-2] .= $line; - $line = ''; + $line = pop(@expandstack); + $expandedline = pop(@expandstack); + } else { + my $todo = pop(@expandstack); + $expandedline = pop(@expandstack); + push @expandstack, ('', $todo, 1) if $todo ne ''; } - $line = $line . pop(@expandstack); - $expandedline = pop(@expandstack); goto reexpand; } } @@ -565,6 +578,7 @@ my %rpmstag = ( "EPOCH" => 1003, "SUMMARY" => 1004, "DESCRIPTION" => 1005, + "BUILDTIME" => 1006, "ARCH" => 1022, "OLDFILENAMES" => 1027, "SOURCERPM" => 1044, @@ -580,6 +594,7 @@ my %rpmstag = ( "DIRINDEXES" => 1116, "BASENAMES" => 1117, "DIRNAMES" => 1118, + "DISTURL" => 1123, ); sub rpmq { @@ -842,6 +857,8 @@ sub query { push @tags, qw{EPOCH VERSION RELEASE ARCH}; push @tags, qw{FILENAMES} if $opts{'filelist'}; push @tags, qw{SUMMARY DESCRIPTION} if $opts{'description'}; + push @tags, qw{DISTURL} if $opts{'disturl'}; + push @tags, qw{BUILDTIME} if $opts{'buildtime'}; my %res = rpmq($handle, @tags); return undef unless %res; my $src = $res{'SOURCERPM'}->[0]; @@ -894,6 +911,8 @@ sub query { $data->{'summary'} = $res{'SUMMARY'}->[0]; $data->{'description'} = $res{'DESCRIPTION'}->[0]; } + $data->{'buildtime'} = $res{'BUILDTIME'}->[0] if $opts{'buildtime'}; + $data->{'disturl'} = $res{'DISTURL'}->[0] if $opts{'disturl'} && $res{'DISTURL'}; return $data; } diff --git a/Build/Zypp.pm b/Build/Zypp.pm index 354adca..bd0ced0 100644 --- a/Build/Zypp.pm +++ b/Build/Zypp.pm @@ -4,30 +4,49 @@ use strict; our $root = ''; -sub parsecfg($) -{ - my $file = shift; - my $repocfg = "$root/etc/zypp/repos.d/$file.repo"; +sub parsecfg { + my ($repocfg, $reponame) = @_; + local *REPO; - open(REPO, '<', $repocfg) or return undef; + open(REPO, '<', "$root/etc/zypp/repos.d/$repocfg.repo") or return undef; my $name; my $repo = {}; while () { chomp; if (/^\[(.+)\]/) { - $name = $1; - } else { - my ($key, $value) = split(/=/,$_,2); + $name = $1 if !defined($reponame) || $reponame eq $1; + } elsif (defined($name)) { + my ($key, $value) = split(/=/, $_, 2); $repo->{$key} = $value if defined $key; } } close(REPO); - return undef unless $name; + return undef unless defined $name; $repo->{'description'} = $repo->{'name'} if exists $repo->{'name'}; $repo->{'name'} = $name; return $repo; } +sub parserepo($) { + my ($reponame) = @_; + # first try matching .repo file + if (-e "$root/etc/zypp/repos.d/$reponame.repo") { + my $repo = parsecfg($reponame, $reponame); + return $repo if $repo; + } + # then try all repo files + my @r; + if (opendir(D, "$root/etc/zypp/repos.d")) { + @r = grep {!/^\./ && /.repo$/} readdir(D); + closedir D; + } + for my $r (sort @r) { + my $repo = parsecfg($r, $reponame); + return $repo if $repo; + } + die("could not find repo '$reponame'\n"); +} + 1; # vim: sw=2 diff --git a/Makefile b/Makefile index 5bd4bf9..fd3ec66 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ SCM=$(shell if test -d .svn; then echo svn; elif test -d .git; then echo git; fi DATE=$(shell date +%Y%m%d%H%M) BUILD=build -INITVM_ARCH=$(shell bash detect_architecture.sh) +INITVM_ARCH=$(shell bash -c '. common_functions ; build_host_arch; echo $$BUILD_INITVM_ARCH') ifeq ($(SCM),svn) SVNVER=_SVN$(shell LANG=C svnversion .) @@ -30,7 +30,6 @@ install: $(DESTDIR)$(man1dir) install -m755 \ build \ - build_kiwi.sh \ vc \ createrpmdeps \ order \ @@ -39,19 +38,16 @@ install: extractbuild \ getbinaryid \ killchroot \ - getmacros \ - getoptflags \ - gettype \ - getchangetarget \ + queryconfig \ common_functions \ init_buildsystem \ - initscript_qemu_vm \ substitutedeps \ debtransform \ debtransformbz2 \ debtransformzip \ mkbaselibs \ mkdrpms \ + createzyppdeps \ createarchdeps \ createrepomddeps \ createyastdeps \ @@ -62,11 +58,13 @@ install: spectool \ signdummy \ unrpm \ - zvm_functions \ $(DESTDIR)$(pkglibdir) install -m755 emulator/emulator.sh $(DESTDIR)$(pkglibdir)/emulator/ install -m644 Build/*.pm $(DESTDIR)$(pkglibdir)/Build install -m644 qemu-reg $(DESTDIR)$(pkglibdir) + install -m644 build-vm build-vm-* $(DESTDIR)$(pkglibdir) + install -m644 build-recipe build-recipe-* $(DESTDIR)$(pkglibdir) + install -m644 build-pkg build-pkg-* $(DESTDIR)$(pkglibdir) install -m644 *.pm baselibs_global*.conf lxc.conf $(DESTDIR)$(pkglibdir) install -m644 configs/* $(DESTDIR)$(pkglibdir)/configs install -m644 build.1 $(DESTDIR)$(man1dir) diff --git a/build b/build index aa7a217..9f9fb72 100755 --- a/build +++ b/build @@ -1,17 +1,18 @@ #!/bin/bash # Script to build a package. It uses init_buildsystem to setup a chroot # building tree. This script needs a directory as parameter. This directory -# has to include sources and a spec file. +# has to include sources and a recipe file. # # BUILD_ROOT here the packages will be built # # (c) 1997-2008 SuSE GmbH Nuernberg, Germany # some VMs do not allow to specify the init process... -if test "$0" = "/sbin/init" ; then - exec /.build/build "$@" +if test "$0" = /sbin/init ; then + exec /.build/build "$@" fi +test -z "$BUILD_DIR" -a -e /.build/build.data -a -z "$BUILD_IGNORE_2ND_STAGE" && BUILD_DIR=/.build test -z "$BUILD_DIR" && BUILD_DIR=/usr/lib/build test -z "$BUILD_ROOT" && BUILD_ROOT=/var/tmp/build-root test -z "$CONFIG_DIR" && CONFIG_DIR="$BUILD_DIR/configs" @@ -19,55 +20,23 @@ test -z "$CONFIG_DIR" && CONFIG_DIR="$BUILD_DIR/configs" export BUILD_ARCH BUILD_HOST_ARCH BUILD_ROOT BUILD_RPMS BUILD_DIR BUILD_DEBUG export BUILD_DIST -ccache=0 icecream=0 -statistics=0 -shell= definesnstuff=() repos=() old_packages=() -# defaults for vm_img_mkfs -vm_img_mkfs_ext4_options='-O ^has_journal,^huge_file,^resize_inode,sparse_super' -vm_img_mkfs_ext4_extra='-E lazy_itable_init,discard' -vm_img_mkfs_ext4="mkfs.ext4 -m 0 -q -F $vm_img_mkfs_ext4_options" -vm_img_tunefs_ext4='tune2fs -c 0' -vm_img_mkfs_ext3='mkfs.ext3 -m 0 -q -F' -vm_img_tunefs_ext3='tune2fs -c 0 -o journal_data_writeback' -vm_img_mkfs_ext2='mkfs.ext2 -m 0 -q -F' -vm_img_tunefs_ext2='tune2fs -c 0' -vm_img_mkfs_reiserfs='mkreiserfs -q -f' -vm_img_mkfs_btrfs='mkfs.btrfs' -vm_img_mkfs_xfs='mkfs.xfs -f' - -vm_kernel=/boot/vmlinuz -vm_initrd=/boot/initrd -qemu_bin=/usr/bin/qemu -uml_kernel=/boot/vmlinux-um -uml_initrd=/boot/initrd-um - -# z/VM: use default kernel image from local machine -# lets go with the default parameters. However zvm_initrd will be a required parameter -#zvm_kernel=/boot/image -#zvm_initrd=/boot/initrd_worker -zvm_param="root=/dev/disk/by-path/ccw-0.0.0150-part1 hvc_iucv=8 console=hvc0" -zvm_mult_pass="THR4ME" -#zvm_worker_nr="1" -zvm_init_script="/.build/build" - -kvm_bin=/usr/bin/qemu-kvm -# whether we have virtio support -kvm_virtio= - -# guest visible console device name -console=ttyS0 +# slurp in vm support +. "$BUILD_DIR/build-vm" + +# slurp in recipe support +. "$BUILD_DIR/build-recipe" + +# slurp in package binary support +. "$BUILD_DIR/build-pkg" # need to restore build root owner for non-root builds browner= -# additional kiwi parameters, used for appliance builds with obsrepositories:/ directive -KIWI_PARAMETERS= - # Default uid:gid for the build user ABUILD_UID=399 ABUILD_GID=399 @@ -76,26 +45,14 @@ DO_INIT=true DO_LINT= DO_CHECKS=true CLEAN_BUILD= -USE_SYSTEM_QEMU= -SPECFILES=() +RECIPEFILES=() SRCDIR= BUILD_JOBS= ABUILD_TARGET= CREATE_BASELIBS= USEUSEDFORBUILD= LIST_STATE= -VM_IMAGE= -VM_SWAP= -VM_KERNEL= -VM_INITRD= -VMDISK_ROOTSIZE=4096 -VMDISK_SWAPSIZE=1024 -VMDISK_FILESYSTEM=ext4 -# settings are for speed and not data safety, we format anyway on next run -VMDISK_MOUNT_OPTIONS=__default -VMDISK_CLEAN= -HUGETLBFSPATH= -MEMSIZE= + RUNNING_IN_VM= RPMLIST= RELEASE= @@ -105,7 +62,6 @@ LOGFILE= KILL= CHANGELOG= BUILD_DEBUG= -PERSONALITY_SYSCALL= INCARNATION= DISTURL= LINKSOURCES= @@ -114,10 +70,10 @@ RSYNCSRC= RSYNCDEST= RSYNCDONE= SIGNDUMMY= -HOST_ARCH= -EMULATOR_SCRIPT= -KVM_OPTIONS= -BUILD_EC2_TYPE="t1.micro" +DO_STATISTICS= +RUN_SHELL= +CCACHE= +CACHE_DIR=/var/cache/build # This is for insserv @@ -134,7 +90,7 @@ echo_help () { Some comments for build ----------------------- -With build you can create rpm packages. They will be built in a chroot +With build you can create binary packages. They will be built in a chroot system. This chroot system will be setup automatically. Normally you can simply call build with a spec file as parameter - nothing else has to be set. @@ -174,7 +130,7 @@ Known Parameters: --no-init Skip initialization of build root and start with build immediately. - --no-checks Do not run post-build checks + --no-checks Do not run checks (postbuild and %check) --lint Run rpmlint after build. @@ -358,8 +314,9 @@ Remember to have fun! [*] Maximum RPM: http://www.rpm.org/max-rpm/ EOT } + usage () { - echo "Usage: `basename $0` [--no-init|--clean|--rpms path|--verify|--help] [dir-to-build|spec-to-build]" + echo "Usage: `basename $0` [--no-init|--clean|--rpms path|--verify|--help] [dir-to-build|recipe-to-build]" cleanup_and_exit 1 } @@ -383,62 +340,25 @@ cleanup_and_exit () { if test -n "$RUNNING_IN_VM" ; then echo "$1" > /.build/_exitcode test -n "$browner" && chown "$browner" $BUILD_ROOT - cd / - if test -n "$VM_SWAP" -a -e "$VM_SWAP" ; then - swapoff "$VM_SWAP" 2>/dev/null - echo -n "BUILDSTATUS$1" >"$VM_SWAP" - fi - exec >&0 2>&0 # so that the logging tee finishes - sleep 1 # wait till tee terminates - if test "$VM_TYPE" != lxc; then - kill -9 -1 # goodbye cruel world - if ! test -x /sbin/halt ; then - test -e /proc/sysrq-trigger || mount -n -tproc none /proc - sync - sleep 2 # like halt does - if test -e /proc/sysrq-trigger; then - echo o > /proc/sysrq-trigger - sleep 5 # wait for sysrq to take effect - else - echo "Warning: VM doesn't support sysrq and /sbin/halt not installed" - fi - else - halt -f -p - fi - echo "Warning: clean shut down of the VM didn't work" - fi + vm_shutdown "$1" else - # nop if unused - cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_NAME" - cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_SWAP" - cloud_volume_detach "$VM_SERVER" "$EC2_EXTRACT_VOLUME_root" - cloud_volume_detach "$VM_SERVER" "$EC2_EXTRACT_VOLUME_swap" - - [ -n "$EC2_SNAP_root" ] && ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" - [ -n "$EC2_SNAP_swap" ] && ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap" - [ -n "$EC2_EXTRACT_VOLUME_root" ] && ec2-delete-volume --region "$BUILD_EC2_REGION" "$EC2_EXTRACT_VOLUME_root" - [ -n "$EC2_EXTRACT_VOLUME_swap" ] && ec2-delete-volume --region "$BUILD_EC2_REGION" "$EC2_EXTRACT_VOLUME_swap" - umount -n $BUILD_ROOT/proc/sys/fs/binfmt_misc 2> /dev/null || true umount -n $BUILD_ROOT/proc 2>/dev/null || true umount -n $BUILD_ROOT/dev/pts 2>/dev/null || true umount -n $BUILD_ROOT/dev/shm 2>/dev/null || true - test "$VM_IMAGE" = 1 && VM_IMAGE= - [ -n "$VM_IMAGE" ] && umount $BUILD_ROOT 2>/dev/null || true + umount -n $BUILD_ROOT/sys 2>/dev/null || true + test -n "$VM_IMAGE" -a "$VM_IMAGE" != 1 && umount $BUILD_ROOT 2>/dev/null || true + test -n "$VM_TYPE" && vm_cleanup fi - -# echo "pid $$ exit $1" exit $1 } -fail_exit() -{ - cleanup_and_exit 1 +fail_exit() { + cleanup_and_exit 1 } -shellquote() -{ - for arg; do +shellquote() { + for arg ; do arg=${arg/\\/\\\\} arg=${arg/\$/\\\$} arg=${arg/\"/\\\"} @@ -449,17 +369,15 @@ shellquote() # create a shell script from command line. Used for preserving arguments # through /bin/su -c -toshellscript() -{ - echo "#!/bin/sh -x" - echo -n exec - shellquote "$@" - echo +toshellscript() { + echo "#!/bin/sh -x" + echo -n exec + shellquote "$@" + echo } -setupccache() -{ - if [ "$ccache" = 1 ]; then +setupccache() { + if test -n "$CCACHE" ; then if mkdir -p $BUILD_ROOT/var/lib/build/ccache/bin; then for i in $(ls $BUILD_ROOT/usr/bin | grep -E '^(cc|gcc|[cg][+][+])([-]?[234][.]?[0-9])*$'); do # ln -sf /usr/bin/ccache $BUILD_ROOT/var/lib/build/ccache/bin/$i @@ -473,7 +391,7 @@ setupccache() echo "Installed ccache wrapper as $BUILD_ROOT/var/lib/build/ccache/bin/$i" done fi - mkdir -p "$BUILD_ROOT"/.ccache + mkdir -p "$BUILD_ROOT/.ccache" chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT/.ccache" echo "export CCACHE_DIR=/.ccache" > "$BUILD_ROOT"/etc/profile.d/build_ccache.sh echo 'export PATH=/var/lib/build/ccache/bin:$PATH' >> "$BUILD_ROOT"/etc/profile.d/build_ccache.sh @@ -482,23 +400,21 @@ setupccache() fi } -setupicecream() -{ - if [ "$icecream" -eq 0 ]; then +setupicecream() { + if test "$icecream" -eq 0 ; then rm -rf "$BUILD_ROOT/var/run/icecream" rm -f "$BUILD_ROOT/etc/profile.d/build_icecream.sh" - return + return 0 fi if ! chroot "$BUILD_ROOT" rpm -q icecream >/dev/null 2>/dev/null; then echo "*** icecream package not installed ***" - false - return + return 1 fi echo "using icecream with $icecream jobs" - if [ "$ccache" -ne 1 ]; then + if test -z "$CCACHE" ; then echo 'export PATH=/usr/lib/icecc/bin:/opt/icecream/bin:$PATH' > "$BUILD_ROOT"/etc/profile.d/build_icecream.sh else echo 'export CCACHE_PATH=/usr/lib/icecc/bin:/opt/icecream/bin' > "$BUILD_ROOT"/etc/profile.d/build_icecream.sh @@ -509,25 +425,24 @@ setupicecream() # XXX use changelog like autobuild does instead? # only run create-env if compiler or glibc changed - if [ -z "$icecc_vers" \ + if test -z "$icecc_vers" \ -o ! -e "$BUILD_ROOT/$icecc_vers" \ -o "$BUILD_ROOT/usr/bin/gcc" -nt "$BUILD_ROOT/$icecc_vers" \ -o "$BUILD_ROOT/usr/bin/g++" -nt "$BUILD_ROOT/$icecc_vers" \ -o "$BUILD_ROOT/usr/bin/as" -nt "$BUILD_ROOT/$icecc_vers" \ - -o "$BUILD_ROOT/lib/libc.so.6" -nt "$BUILD_ROOT/$icecc_vers" ] + -o "$BUILD_ROOT/lib/libc.so.6" -nt "$BUILD_ROOT/$icecc_vers" then rm -rf "$BUILD_ROOT/var/run/icecream" mkdir -p "$BUILD_ROOT/var/run/icecream" - if [ -e "$BUILD_ROOT"/usr/bin/create-env ]; then - createenv=/usr/bin/create-env - elif [ -e "$BUILD_ROOT"/usr/lib/icecc/icecc-create-env ]; then - createenv="/usr/lib/icecc/icecc-create-env /usr/bin/gcc /usr/bin/g++" # XXX - elif [ -e "$BUILD_ROOT"/usr/lib64/icecc/icecc-create-env ]; then - createenv="/usr/lib64/icecc/icecc-create-env /usr/bin/gcc /usr/bin/g++" # XXX + if test -e "$BUILD_ROOT"/usr/bin/create-env ; then + createenv=/usr/bin/create-env + elif test -e "$BUILD_ROOT"/usr/lib/icecc/icecc-create-env ; then + createenv="/usr/lib/icecc/icecc-create-env /usr/bin/gcc /usr/bin/g++" # XXX + elif test -e "$BUILD_ROOT"/usr/lib64/icecc/icecc-create-env ; then + createenv="/usr/lib64/icecc/icecc-create-env /usr/bin/gcc /usr/bin/g++" # XXX else - echo "create-env not found" - false - return + echo "create-env not found" + return 1 fi chroot $BUILD_ROOT bash -c "cd /var/run/icecream; $createenv" || cleanup_and_exit 1 icecc_vers=(`shopt -s nullglob; echo $BUILD_ROOT/var/run/icecream/*.tar.{bz2,gz}`) @@ -535,14 +450,13 @@ setupicecream() else echo "reusing existing icecream environment $icecc_vers" fi - if [ -n "$icecc_vers" ]; then - echo "export ICECC_VERSION=$icecc_vers" >> "$BUILD_ROOT"/etc/profile.d/build_icecream.sh + if test -n "$icecc_vers" ; then + echo "export ICECC_VERSION=$icecc_vers" >> "$BUILD_ROOT"/etc/profile.d/build_icecream.sh fi } -setmemorylimit() -{ - if [ -n "$VM_IMAGE" -o -n "$RUNNING_IN_VM" ]; then +setmemorylimit() { + if test -n "$VM_IMAGE" -o -n "$RUNNING_IN_VM" ; then return fi local mem @@ -564,17 +478,16 @@ setmemorylimit() echo "Memory limit set to ${limit}KB" } -create_baselibs() -{ +create_baselibs() { local pkgs=() local line BASELIBS_CFG= - if test "$BUILDTYPE" == "arch" ; then + if test "$BUILDTYPE" == arch ; then return fi - if test "$BUILDTYPE" == "dsc" ; then + if test "$BUILDTYPE" == dsc ; then pkgs=($DEBS) else # spec and kiwi if test -e $BUILD_ROOT$TOPDIR/SOURCES/baselibs.conf ; then @@ -633,20 +546,19 @@ create_baselibs() rm -rf "$BUILD_ROOT/.mkbaselibs" } -copy_oldpackages() -{ +copy_oldpackages() { local i=0 local d local dest - [ -z "$RUNNING_IN_VM" ] || return 0 - if [ -z "$old_packages" ]; then + test -z "$RUNNING_IN_VM" || return 0 + if test -z "$old_packages" ; then rm -rf "$BUILD_ROOT"/.build.oldpackages* return 0 fi for d in "${old_packages[@]}"; do dest="$BUILD_ROOT/.build.oldpackages" test "$i" = 0 || dest="$dest$i" - if [ -d "$d" -a "$d" != "$dest" ] ; then + if test -d "$d" -a "$d" != "$dest" ; then rm -rf "$dest" mkdir -p "$dest" cp -L $d/* "$dest" @@ -655,788 +567,280 @@ copy_oldpackages() done } -vm_img_create() -{ - local img="$1" - local size="$2" - - echo "Creating $img (${size}M)" - mkdir -p "${img%/*}" || cleanup_and_exit 3 - - # prefer fallocate, which avoids fragmentation - r=1 - if type -p fallocate > /dev/null; then - fallocate -l "${size}M" "$img" - r=$? - fi - # fall back to dd method if fallocate is not supported - if [ "$r" -gt "0" ]; then - dd if=/dev/zero of="$img" bs=1M count=0 seek="$size" || cleanup_and_exit 3 - fi -} - -vm_img_mkfs() -{ - local fs="$1" - local img="$2" - local mkfs tunefs - eval "mkfs=\"\$vm_img_mkfs_${fs}\"" - eval "mkfs_exta_options=\"\$vm_img_mkfs_${fs}_extra\"" - eval "tunefs=\"\$vm_img_tunefs_${fs}\"" - - if test -z "$mkfs"; then - echo "filesystem \"$fs\" isn't supported" - cleanup_and_exit 3 - fi - - - echo "Creating $fs filesystem on $img" - if ! $mkfs $mkfs_exta_options "$img"; then - if test -z "$mkfs_exta_options"; then - cleanup_and_exit 3 - else - echo "Format call failed, trying again without extra options..." - $mkfs "$img" || cleanup_and_exit 3 - fi - fi - if test -n "$tunefs" ; then - $tunefs "$img" || cleanup_and_exit 3 - fi -} - -background_monitor_process() -{ - max_disk=0 - max_mem=0 - while sleep 5; do - - # memory usage - if [ -e /proc/meminfo ]; then - memtotal=0 - while read key value unit; do - case $key in - MemTotal:|SwapTotal:) - memtotal=$(( $memtotal + $value )) - ;; - MemFree:|SwapFree:|SwapCached:|Cached:|Buffers:) - memtotal=$(( $memtotal - $value )) - ;; - esac - done < /proc/meminfo - - if [ ${memtotal} -gt $max_mem ]; then - max_mem="${memtotal}" - echo -n $(( $max_mem / 1024 )) > /.build/_statistics.memory.new && mv /.build/_statistics.memory.new /.build/_statistics.memory - fi - fi - - # disk storage usage - if type -p df >& /dev/null; then - c=(`df -m / 2>/dev/null | tail -n 1`) - - if [ ${c[2]} -gt $max_disk ]; then - max_disk="${c[2]}" - echo -n $max_disk > /.build/_statistics.df.new && mv /.build/_statistics.df.new /.build/_statistics.df - fi - fi - - [ -e /.build/_statistics.exit ] && exit 0 - done -} - -detect_vm_2nd_stage() -{ - if test -e /.build/build.data; then - . /.build/build.data - fi - if test -z "$VM_TYPE" ; then - return 1 - fi - if test $$ -eq 1 || test $$ -eq 2; then - # ignore special init signals if we're init - # we're using ' ' instead of '' so that the signal handlers - # are reset in the child processes - trap ' ' HUP TERM - $0 "$@" - cleanup_and_exit $? - fi - echo "2nd stage started in virtual machine" - BUILD_ROOT=/ - BUILD_DIR=/.build - echo "machine type: `uname -m`" - if test "$PERSONALITY" != 0 -a -z "$PERSONALITY_SET" ; then - export PERSONALITY_SET=true - echo "switching personality to $PERSONALITY..." - # this is 32bit perl/glibc, thus the 32bit syscall number - exec perl -e 'syscall(136, '$PERSONALITY') == -1 && warn("personality: $!\n");exec "/.build/build" || die("/.build/build: $!\n")' - fi - RUNNING_IN_VM=true - test -e /proc/version || mount -orw -n -tproc none /proc - if test "$VM_TYPE" != 'lxc'; then - mount -n ${VMDISK_MOUNT_OPTIONS},remount,rw / - fi - umount /run >/dev/null 2>&1 -# qemu inside of xen does not work, check again with kvm later before enabling this -# if [ -e /dev/kqemu ]; then -# # allow abuild user to run qemu -# chmod 0666 /dev/kqemu -# fi - if test "$VM_TYPE" = 'zvm' ; then - VM_SWAP='/dev/dasdb1' - fi - if test "$VM_TYPE" = 'ec2' ; then - VM_SWAP='/dev/sdb1' - # Usually the external system is writing the swap signature, but EC2 volume - # attach is very slow, so let's do it in the VM for now. - mkswap "$VM_SWAP" - fi - if test -n "$VM_SWAP" ; then - for i in 1 2 3 4 5 6 7 8 9 10 ; do - test -e "$VM_SWAP" && break - test $i = 1 && echo "waiting for $VM_SWAP to appear" - echo -n . - sleep 1 - done - test $i = 1 || echo - # recreate the swap device manually if it didn't exist for some - # reason, hardcoded to hda2 atm - if ! test -b "$VM_SWAP" ; then - rm -f "$VM_SWAP" - umask 027 - mknod "$VM_SWAP" b 3 2 - umask 022 - fi - swapon -v "$VM_SWAP" || exit 1 - fi - HOST="$MYHOSTNAME" - - # fork a process monitoring max filesystem fillment during build - if test "$statistics" = "1"; then - background_monitor_process & - fi - - if [ ! -e /dev/.udev ]; then - echo "WARNING: udev not running, creating extra device nodes" - test -e /dev/fd || ln -sf /proc/self/fd /dev/fd - test -e /etc/mtab || ln -sf /proc/mounts /etc/mtab - fi - - # set date to build start on broken systems (now < build start) - if [ $(date '+%s') -lt $(date -r /.build/.date '+%s') ]; then - echo -n "WARNING: system has a broken clock, setting it to a newer time: " - date -s `cat /.build/.date` - fi - - return 0 -} - -find_spec_files() -{ - local spec files - if [ -z "$SPECFILES" ]; then - set -- "`pwd`" - else - set -- "${SPECFILES[@]}" - fi - SPECFILES=() - for spec in "$@"; do - if [ "$spec" = "${spec#/}" ]; then - spec="`pwd`/$spec" - fi - - if [ -d "$spec" ]; then - specs=("$spec"/*.spec) - if [ -n "$specs" ]; then - SPECFILES=("${SPECFILES[@]}" "${specs[@]}") - else - specs=("$spec"/*.spec) - if [ -n "$specs" ]; then - SPECFILES=("${SPECFILES[@]}" "${specs[@]}") - fi - fi - else - SPECFILES[${#SPECFILES[@]}]="$spec"; - fi - done - - if test -z "$SPECFILES"; then - echo no spec files or src rpms found in $@. exit... - cleanup_and_exit 1 - fi -} - -become_root_or_fail() -{ - if [ ! -w /root ]; then +become_root_or_fail() { + if test ! -w /root ; then echo "You have to be root to use $0" >&2 exit 1 fi cleanup_and_exit 1 } -mkdir_build_root() -{ - if [ -d "$BUILD_ROOT" ]; then +mkdir_build_root() { + if test -d "$BUILD_ROOT" ; then # check if it is owned by root - if [ -z "$RUNNING_IN_VM" -a \! -O "$BUILD_ROOT" -a "`stat -c %u $BUILD_ROOT`" -ne 0 ]; then + if test -z "$RUNNING_IN_VM" -a \! -O "$BUILD_ROOT" -a "`stat -c %u $BUILD_ROOT`" -ne 0 ; then echo "BUILD_ROOT=$BUILD_ROOT must be owned by root. Exit..." cleanup_and_exit 1 fi else test "$BUILD_ROOT" != "${BUILD_ROOT%/*}" && mkdir -p "${BUILD_ROOT%/*}" - if ! mkdir $BUILD_ROOT; then + if ! mkdir $BUILD_ROOT ; then echo "can not create BUILD_ROOT=$BUILD_ROOT. Exit..." cleanup_and_exit 1 fi fi - if [ ! -w "$BUILD_ROOT" ]; then + if test ! -w "$BUILD_ROOT" ; then echo "Error: BUILD_ROOT=$BUILD_ROOT not writeable, try --clean." cleanup_and_exit 3 fi rm -rf "$BUILD_ROOT/.build.packages" - if [ -z "$VM_TYPE" -a -z "$RUNNING_IN_VM" ]; then - # don't touch this in VM - rm -rf "$BUILD_ROOT/.build" - mkdir -p "$BUILD_ROOT/.build" + if test -z "$VM_TYPE" -a -z "$RUNNING_IN_VM" ; then + # don't touch this in VM + rm -rf "$BUILD_ROOT/.build" + mkdir -p "$BUILD_ROOT/.build" fi } -ec2_volume_state() -{ - local VM_VOL_NAME="$1" - temp_file=`mktemp` - ec2-describe-volumes "$VM_VOL_NAME" --region "$BUILD_EC2_REGION" > $temp_file - - if grep -q ^ATTACHMENT "$temp_file"; then - grep ^ATTACHMENT "$temp_file" | awk '{ print $5 }' +copy_overlay() { + if test -d "$OVERLAY"; then + pushd $OVERLAY + echo "Copying overlay to BUILD_ROOT" + tar -cpf - . | (cd $BUILD_ROOT ; tar -xvf -) + popd else - grep ^VOLUME "$temp_file" | awk '{ print $5 }' - fi - rm "$temp_file" -} - -cloud_volume_attach() -{ - local VM_SERVER="$1" - local VM_VOL_NAME="$2" - local VM_VOL_DEV="$3" - - if [ "$VM_TYPE" = 'openstack' ]; then - if ! nova volume-attach "$VM_SERVER" "$VM_VOL_NAME" "$VM_VOL_DEV"; then - echo "ERROR: nova attach failed. $?" >&2 - return 3 - fi - while true; do - state=`nova volume-show "$VM_VOL_NAME" | sed -n 's,^|[ ]*status[ ]*|[ ]*\([^ ]*\).*,\1,p'` - [ "$state" == "in-use" ] && break - if [ -z "$state" ]; then - echo "ERROR: unable to find state of volume $VM_VOL_NAME" >&2 - return 3 - fi - if [ "$state" == "available" ]; then - echo "WARNING: volume $VM_VOL_NAME got not attached, retrying" >&2 - if ! nova volume-attach "$VM_SERVER" "$VM_VOL_NAME" "$VM_VOL_DEV"; then - echo "ERROR: nova attach failed. $?" >&2 - return 3 - fi - fi - sleep 3 - done - - if [ ! -e "$VM_VOL_DEV" ]; then - #GROSS HACK: kernel does not care about the given device name -# VM_VOL_DEV="/dev/"`dmesg| sed -n 's,.*\(vd.\): unknown partition tab.*,\1,p' | tail -n 1` - VM_VOL_DEV=`ls -1 /dev/vd? | tail -n 1` - fi - echo "$VM_VOL_DEV" - elif [ "$VM_TYPE" = 'ec2' ]; then - temp_file=`mktemp` - if ! ec2-attach-volume "$VM_VOL_NAME" -d /dev/sdz -i `ec2-instance-id` --region $BUILD_EC2_REGION > "$temp_file"; then - rm "$temp_file" - cleanup_and_exit 1 - fi - # wait that it becomes available - while true; do - state=`ec2_volume_state "$VM_VOL_NAME"` - [ "$state" = "attached" ] && break - sleep 1 - done - # print device node - grep ^ATTACHMENT "$temp_file" | awk '{ print $4 }' - rm "$temp_file" - fi -} - -cloud_volume_detach() -{ - local VM_SERVER="$1" - local VM_VOL_NAME="$2" - if [ "$VM_TYPE" = 'openstack' ]; then - # needed at all? - nova volume-show "$VM_VOL_NAME" | grep -q in-use || return 0 - - # umount seems not to be enough - sync - - if ! nova volume-detach "$VM_SERVER" "$VM_VOL_NAME"; then - echo "ERROR: nova detach of $VM_VOL_NAME failed." >&2 - return 3 - fi - while nova volume-show "$VM_VOL_NAME" | grep -q availabe; do - sleep 3 - done - elif [ "$VM_TYPE" = 'ec2' ]; then - state=`ec2_volume_state "$VM_VOL_NAME"` - if [ "$state" != "available" ]; then - ec2-detach-volume "$VM_VOL_NAME" --region $BUILD_EC2_REGION || return 3 - fi + echo "OVERLAY ($OVERLAY) is no directory - skipping" fi - return 0 } -linux64() -{ - perl -e 'syscall('$PERSONALITY_SYSCALL', 0); exec(@ARGV) || die("$ARGV[0]: $!\n")' "$@" -} - -check_for_arm() -{ - local uname - - uname=$(uname -m) - - if [ "$uname" != "armv7l" ]; then - return - fi - - export HOST_ARCH=armv7l - - export kvm_bin="/usr/bin/qemu-system-arm" - export console=ttyAMA0 - export KVM_OPTIONS="-enable-kvm -M vexpress-a15 -dtb /boot/a15-guest.dtb -cpu cortex-a15" - VM_KERNEL=/boot/zImage - VM_INITRD=/boot/initrd - # prefer the guest kernel - if [ -e /boot/zImage.guest ]; then - VM_KERNEL=/boot/zImage.guest - fi - # prefer the guest initrd - if [ -e /boot/initrd.guest ]; then - VM_INITRD=/boot/initrd.guest +run_rsync() { + if test -n "$RSYNCDEST" ; then + if test -d "$RSYNCSRC" ; then + if ! test -d "$BUILD_ROOT/$RSYNCDEST" ; then + echo "ATTENTION! Creating missing target directory ($BUILD_ROOT/$RSYNCDEST)." + mkdir -p $BUILD_ROOT/$RSYNCDEST + fi + echo "Running rsync ..." + rsync -av $RSYNCSRC/* $BUILD_ROOT/$RSYNCDEST/ + chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT/$RSYNCDEST" + RSYNCDONE=true + echo "... done" + else + echo "RSYNCSRC is not a directory - skipping" + fi + else + echo "RSYNCSRC given, but not RSYNCDEST - skipping" fi - export VM_KERNEL - export VM_INITRD -} - -check_for_ppc() -{ - local uname - - uname=$(uname -m) - - case $uname in - ppc|ppc64) export VM_KERNEL=/boot/vmlinux - export VM_INITRD=/boot/initrd - ;; - ppc64le) export VM_INITRD=/boot/vmlinuxle - export VM_INITRD=/boot/initrdle - ;; - *) return ;; - esac - - grep -q "PowerNV" /proc/cpuinfo && export HOST_ARCH=power7 || export HOST_ARCH=ppc970 - - export kvm_bin="/usr/bin/qemu-system-ppc64" - export console=hvc0 - export KVM_OPTIONS="-enable-kvm -M pseries" - if [ -z "$RUNNING_IN_VM" -a -n "$HUGETLBFSPATH" ];then - if ! grep -q "$HUGETLBFSPATH" /proc/mounts; then - echo "hugetlbfs is not mounted" - exit 1 - fi - PAGES_FREE=$(cat /sys/kernel/mm/hugepages/hugepages-16384kB/free_hugepages) - PAGES_REQ=$(( ${MEMSIZE:-64} / 16 )) - if [ "$PAGES_FREE" -lt "$PAGES_REQ" ];then - echo "please adjust nr_hugepages" - exit 1 - fi - if [ "$HOST_ARCH" = "ppc970" ];then - if ! grep -q -E '(kvm_rma_count.*kvm_hpt_count)|(kvm_hpt_count.*kvm_rma_count)' /proc/cmdline; then - echo "put kvm_rma_count= or kvm_hpt_count=<> to your boot options" - exit 1 - fi - fi - fi } #### main #### trap fail_exit EXIT -archname=`perl -V:archname` -archname="${archname#archname=?}" -case "$archname" in - x86_64*) PERSONALITY_SYSCALL=135 ;; - alpha*) PERSONALITY_SYSCALL=324 ;; - sparc*) PERSONALITY_SYSCALL=191 ;; - ia64*) PERSONALITY_SYSCALL=1140 ;; - i?86*|ppc*|aarch64*|arm*|sh4|cris|m68k*|s390*|unicore32|microblaze) PERSONALITY_SYSCALL=136 ;; - *) echo "ARCHITECTURE PERSONALITY IS UNKNOWN"; exit 1;; -esac - shopt -s nullglob -export PATH=$BUILD_DIR:/sbin:/usr/sbin:$PATH +export PATH=$BUILD_DIR:/sbin:/usr/sbin:/bin:/usr/bin:$PATH -if detect_vm_2nd_stage ; then - set "/.build-srcdir/$SPECFILE" +if vm_detect_2nd_stage ; then + set "/.build-srcdir/$RECIPEFILE" export PATH=/.build:$PATH fi . $BUILD_DIR/common_functions || exit 1 -. $BUILD_DIR/zvm_functions || exit 1 export HOST -needarg() -{ - if [ -z "$ARG" ]; then - echo "$PARAM needs an agrument" >&2 - cleanup_and_exit 1 - fi +needarg() { + if test -z "$ARG" ; then + echo "$PARAM needs an agrument" >&2 + cleanup_and_exit 1 + fi } while test -n "$1"; do - PARAM="$1" - UNSTRIPPED_ARG="$2" - ARG="$2" - [ "$ARG" = "${ARG#-}" ] || ARG="" - ARG2="$3" - [ "$ARG2" = "${ARG2#-}" ] || ARG2="" - shift - case $PARAM in - *-*=*) - ARG=${PARAM#*=} - PARAM=${PARAM%%=*} - set -- "----noarg=$PARAM" "$@" - esac - case $PARAM in - *-help|-h) + PARAM="$1" + ARG="$2" + test "$ARG" = "${ARG#-}" || ARG= + shift + case $PARAM in + *-*=*) + ARG=${PARAM#*=} + PARAM=${PARAM%%=*} + set -- "----noarg=$PARAM" "$@" + ;; + esac + case ${PARAM/#--/-} in + -help|-h) echo_help cleanup_and_exit ;; - *-no*init) + -noinit|-no-init) DO_INIT=false ;; - *-no*checks) + -nochecks|-no-checks) DO_CHECKS=false ;; - -clean|--clean) + -clean) CLEAN_BUILD='--clean' ;; - *-kill) + -kill) KILL=true ;; - *-rpms) + -rpms) needarg BUILD_RPMS="$ARG" shift ;; - *-arch) + -arch) needarg BUILD_ARCH="$ARG" shift ;; - *-verify) + -verify) export VERIFY_BUILD_SYSTEM=true ;; - *-target) + -target) needarg ABUILD_TARGET="$ARG" shift ;; - *-jobs) + -jobs) needarg BUILD_JOBS="$ARG" shift ;; - *-threads) + -threads) needarg BUILD_THREADS="$ARG" shift ;; - *-extra*packs|-X) + -extrapacks|-extra-packs|-X) needarg BUILD_EXTRA_PACKS="$BUILD_EXTRA_PACKS $ARG" shift ;; - *-lint) + -lint) DO_LINT=true ;; - *-baselibs) + -baselibs) CREATE_BASELIBS=true ;; - --kiwi-parameter) - KIWI_PARAMETERS="$KIWI_PARAMETERS $UNSTRIPPED_ARG" - shift - ;; - *-baselibs-internal) + -baselibs-internal) CREATE_BASELIBS=internal ;; - *-use-system-qemu) - USE_SYSTEM_QEMU="--use-system-qemu" - ;; - *-root) + -root) needarg BUILD_ROOT="$ARG" shift ;; - *-cachedir) + -cachedir) needarg CACHE_DIR="$ARG" shift ;; - *-oldpackages) + -oldpackages) needarg old_packages=("${old_packages[@]}" "$ARG") shift ;; - *-dist) + -dist) needarg BUILD_DIST="$ARG" shift ;; - *-emulator-script) - needarg - EMULATOR_SCRIPT="$ARG" - shift - ;; - *-xen|*-kvm|--uml|--qemu|--emulator) - VM_TYPE=${PARAM##*-} - if [ -n "$ARG" ]; then - VM_IMAGE="$ARG" - shift - else - VM_IMAGE=1 - fi - ;; - *-zvm) - VM_TYPE="zvm" - shift - ;; - --lxc) - VM_TYPE=${PARAM##*-} - ;; - --vm-type) - needarg - VM_TYPE="$ARG" - case "$VM_TYPE" in - zvm) ;; - ec2) - test -z "$VM_IMAGE" && VM_IMAGE=1 - . /etc/profile.d/ec2.sh - EC2_INSTANCE_ID=`ec2-instance-id` - BUILD_EC2_ZONE=`ec2-meta-data placement/availability-zone` - BUILD_EC2_REGION=${BUILD_EC2_ZONE%?} - ;; - xen|kvm|uml|qemu|lxc|emulator|openstack) - test -z "$VM_IMAGE" && VM_IMAGE=1 - ;; - none|chroot) VM_TYPE='' ;; - *) - echo "VM $VM_TYPE not supported" - cleanup_and_exit - ;; - esac - shift - ;; - --vm-worker) - needarg - VM_WORKER="$ARG" - shift - ;; - --vm-worker-nr) - needarg - zvm_worker_nr="$ARG" - shift - ;; - --vm-server|--vm-region) - needarg - VM_SERVER="$ARG" - shift - ;; - --vm-volumes) - needarg - VM_VOLUME_NAME="$ARG" - shift - needarg - VM_VOLUME_SWAP="$ARG2" - shift - ;; - --vm-disk) - needarg - VM_IMAGE="$ARG" - shift - ;; - *-xenswap|*-swap) - needarg - VM_SWAP="$ARG" - shift - ;; - *-xenmemory|*-memory) - needarg - MEMSIZE="$ARG" - shift - ;; - *-vm-kernel) - needarg - VM_KERNEL="$ARG" - shift - ;; - *-vm-initrd) - needarg - VM_INITRD="$ARG" - shift - ;; - *-vmdisk-rootsize|--vm-disk-size) - needarg - VMDISK_ROOTSIZE="$ARG" - shift - ;; - *-vmdisk-swapsize|--vm-swap-size) - needarg - VMDISK_SWAPSIZE="$ARG" - shift - ;; - *-vmdisk-filesystem|--vm-disk-filesystem) - needarg - VMDISK_FILESYSTEM="$ARG" - shift - ;; - *-vmdisk-mount-options|--vm-disk-mount-options) - needarg - # options needs to be quoted to handle argument which might start with "-o ..." - VMDISK_MOUNT_OPTIONS=$(echo $ARG | sed 's/^\"\(.*\)\"$/\1/g') - shift - ;; - *-vmdisk-clean) - # delete old root/swap to get rid of the old blocks - VMDISK_CLEAN=true - ;; - *-rpmlist) - needarg - RPMLIST="--rpmlist $ARG" - BUILD_RPMS= - shift - ;; - *-hugetlbfs) - HUGETLBFSPATH="$ARG" - shift - ;; - *-release) + -release) needarg RELEASE="$ARG" shift ;; - *-logfile) + -logfile) needarg LOGFILE="$ARG" shift ;; - *-reason) + -reason) needarg REASON="$ARG" shift ;; - *-norootforbuild) + -norootforbuild) NOROOTFORBUILD=true ;; - *-stage) - needarg - BUILD_RPM_BUILD_STAGE="$ARG" - shift - ;; - *-useusedforbuild) + -useusedforbuild) USEUSEDFORBUILD="--useusedforbuild" ;; - *-configdir) + -configdir) needarg CONFIG_DIR="$ARG" shift ;; - *-list*state) + -list*state) LIST_STATE=true ;; - --define|--with|--without) + -define|-with|-without) needarg - definesnstuff[${#definesnstuff[@]}]="$PARAM"; - definesnstuff[${#definesnstuff[@]}]="$ARG"; + PARAM="-${PARAM/#--/-}" + definesnstuff[${#definesnstuff[@]}]="$PARAM" + definesnstuff[${#definesnstuff[@]}]="$ARG" shift ;; - --repository|--repo) + -repository|-repo) needarg - repos[${#repos[@]}]="$PARAM"; - repos[${#repos[@]}]="$ARG"; + repos[${#repos[@]}]="--repository" + repos[${#repos[@]}]="$ARG" shift ;; - --icecream) + -icecream) needarg icecream="$ARG" - if [ "$icecream" -gt 0 ]; then - BUILD_JOBS="$ARG" - fi + test "$icecream" -gt 0 && BUILD_JOBS="$ARG" shift ;; - --ccache) - ccache=1 + -ccache) + CCACHE=true ;; - --statistics) - statistics=1 + -statistics) + DO_STATISTICS=1 ;; - --debug) + -debug) BUILD_DEBUG=1 ;; - --incarnation) + -incarnation) needarg INCARNATION=$ARG shift ;; - --disturl) + -disturl) needarg DISTURL=$ARG shift ;; - --linksources) + -linksources) LINKSOURCES=true ;; - ----noarg) - echo "$ARG does not take an argument" - cleanup_and_exit - ;; - *-changelog) + -changelog) CHANGELOG=true ;; - --overlay) + -overlay) needarg OVERLAY=$ARG shift ;; - --rsync-src) + -rsync-src) needarg RSYNCSRC=$ARG shift ;; - --rsync-dest) + -rsync-dest) needarg RSYNCDEST=$ARG shift ;; - --uid) + -uid) needarg ABUILD_ID="$ARG" - if test -n "${ABUILD_ID//[0-9:]/}"; then + if test -n "${ABUILD_ID//[0-9:]/}" ; then echo "--uid argument must be uid:gid" cleanup_and_exit fi @@ -1444,348 +848,73 @@ while test -n "$1"; do ABUILD_GID=${ABUILD_ID#*:} shift ;; - --shell) - shell=1 - shift + -rpmlist) + needarg + RPMLIST="--rpmlist $ARG" + BUILD_RPMS= + shift + ;; + -shell) + RUN_SHELL=1 + shift ;; - --signdummy) + -signdummy) SIGNDUMMY=1 ;; + ---noarg) + echo "$ARG does not take an argument" + cleanup_and_exit + ;; -*) - echo Unknown Option "$PARAM". Exit. - cleanup_and_exit 1 + if vm_parse_options "$@" ; then + set -- "${nextargs[@]}" + elif recipe_parse_options "$@" ; then + set -- "${nextargs[@]}" + else + echo "Unknown option '$PARAM'. Exit." + cleanup_and_exit 1 + fi ;; *) - SPECFILES[${#SPECFILES[@]}]="$PARAM"; + RECIPEFILES[${#RECIPEFILES[@]}]="$PARAM" ;; esac done -check_for_ppc -check_for_arm - -if test "$VM_TYPE" = "lxc"; then - VM_IMAGE='' - VM_SWAP='' -fi - -if test "$VM_TYPE" = "zvm"; then - VM_IMAGE='/dev/dasda1' - VM_SWAP='/dev/dasdb1' -fi - -if test "$VM_TYPE" = "ec2"; then - # We can not use bash hashes because old bash does not support it - # This is always the x86_64 loader, we use also by default the - # local x86_64 kernel, which should be able to run a 32bit system - if [ "$BUILD_EC2_ZONE" = "us-east-1" ]; then - BUILD_EC2_AKI="aki-88aa75e1" - elif [ "$BUILD_EC2_ZONE" = "us-west-1" ]; then - BUILD_EC2_AKI="aki-f77e26b2" - elif [ "$BUILD_EC2_ZONE" = "us-west-2" ]; then - BUILD_EC2_AKI="aki-fc37bacc" - elif [ "$BUILD_EC2_ZONE" = "eu-west-1" ]; then - BUILD_EC2_AKI="aki-71665e05" - elif [ "$BUILD_EC2_ZONE" = "ap-southeast-1" ]; then - BUILD_EC2_AKI="aki-fe1354ac" - elif [ "$BUILD_EC2_ZONE" = "ap-southeast-2" ]; then - BUILD_EC2_AKI="aki-3f990e05" - elif [ "$BUILD_EC2_ZONE" = "ap-northeast-1" ]; then - BUILD_EC2_AKI="aki-44992845" - elif [ "$BUILD_EC2_ZONE" = "sa-east-1" ]; then - BUILD_EC2_AKI="aki-c48f51d9" - elif [ "$BUILD_EC2_ZONE" = "us-gov-west-1" ]; then - BUILD_EC2_AKI="aki-79a4c05a" - else - echo "Unknown Amazon EC2 Zone: $BUILD_EC2_ZONE" - exit 1 - fi -fi - -if test "$VMDISK_MOUNT_OPTIONS" = __default; then - if test "$VMDISK_FILESYSTEM" = reiserfs ; then - VMDISK_MOUNT_OPTIONS='-o data=writeback,commit=150,noatime' - elif test "$VMDISK_FILESYSTEM" = btrfs ; then - VMDISK_MOUNT_OPTIONS='-o nobarrier,noatime' - elif test "$VMDISK_FILESYSTEM" = "ext4" ; then - VMDISK_MOUNT_OPTIONS='-o noatime' - elif test "$VMDISK_FILESYSTEM" = "ext3" ; then - VMDISK_MOUNT_OPTIONS='-o data=writeback,nobarrier,commit=150,noatime' - elif test "$VMDISK_FILESYSTEM" = "ext2" ; then - VMDISK_MOUNT_OPTIONS='-o noacl,noatime' - elif test "$VMDISK_FILESYSTEM" = "xfs" ; then - VMDISK_MOUNT_OPTIONS='-o noatime' - else - VMDISK_MOUNT_OPTIONS='-o noatime' - fi -fi - if test -n "$KILL" ; then test -z "$SRCDIR" || usage if test -n "$VM_IMAGE" -a -n "$VM_SWAP" -a -n "$VM_TYPE"; then # mark job as failed so that we don't extract packages - if test "$VM_TYPE" != "zvm"; then + if test "$VM_TYPE" != zvm ; then echo -n "BUILDSTATUS1" >"$VM_SWAP" fi fi (set -C; > "$BUILD_ROOT/exit" 2>/dev/null || true) - if test "$VM_TYPE" = 'lxc'; then - LXCID=${BUILD_ROOT##*/} - lxc-stop -n "$LXCID" || true - lxc-destroy -n "$LXCID" - elif test -z "$VM_IMAGE" ; then + if test -n "$VM_TYPE" ; then + vm_kill + else if ! $BUILD_DIR/killchroot -s 9 $BUILD_ROOT ; then echo "could not kill build in $BUILD_ROOT" cleanup_and_exit 1 fi - elif test "$VM_TYPE" = 'xen'; then - XENID="${VM_IMAGE%/root}" - XENID="${XENID%/tmpfs}" - XENID="${XENID##*/}" - XENID="${XENID#root_}" - if xm list "build_$XENID" >/dev/null 2>&1 ; then - if ! xm destroy "build_$XENID" ; then - echo "could not kill xen build $XENID" - cleanup_and_exit 1 - fi - fi - elif test "$VM_TYPE" = 'zvm'; then - if vmcp q "$VM_WORKER" > /dev/null 2>&1 ; then - if ! zvm_cp destroy $VM_WORKER ; then - echo "could not kill zvm worker $VM_WORKER" - cleanup_and_exit 1 - fi - fi - elif test "$VM_TYPE" = 'ec2'; then - if ec2-describe-instance-status "$VM_BUILD_INSTANCE" --region $BUILD_EC2_REGION >/dev/null 2>&1 ; then - if ec2-terminate-instances "$VM_BUILD_INSTANCE" >/dev/null 2>&1 ; then - echo "could not kill EC2 instance $VM_BUILD_INSTANCE" - cleanup_and_exit 1 - fi - fi - elif test "$VM_TYPE" = 'openstack'; then - if nova show "$VM_VOLUME_NAME" >/dev/null 2>&1 ; then - if ! nova delete "$VM_VOLUME_NAME" ; then - echo "could not kill openstack vm build $VM_VOLUME_NAME" - cleanup_and_exit 1 - fi - fi - elif test -n "$VM_TYPE"; then - if ! fuser -k -TERM "$VM_IMAGE"; then - echo "could not kill build in $VM_IMAGE" - cleanup_and_exit 1 - fi - else - echo "don't know how to kill this build job" - cleanup_and_exit 1 fi cleanup_and_exit 0 fi -if [ "$VM_TYPE" = 'xen' -a -z "$RUNNING_IN_VM" ]; then - # XXX: merge with kvm path? - if [ -n "$VM_KERNEL" ]; then - vm_kernel="$VM_KERNEL" - elif [ -e "/boot/vmlinuz-xen" ]; then - vm_kernel="/boot/vmlinuz-xen" - fi - if [ -n "$VM_INITRD" ]; then - vm_initrd="$VM_INITRD" - elif [ -e "/boot/initrd-xen" ]; then - vm_initrd="/boot/initrd-xen" - fi -fi - -if [ "$VM_TYPE" = 'zvm' -a -z "$RUNNING_IN_VM" ]; then - # verify settings - # In z/VM, this is a 4 digit hex number instead of a linux device. - # This is the root disk defined in user direct - # This number can be given with the parameter --root NR. - if [ -z "$VM_VOLUME_ROOT" ]; then - if [ -n "$BUILD_ROOT" -a ${#BUILD_ROOT} -le 4 ]; then - VM_VOLUME_ROOT="$BUILD_ROOT" - else - VM_VOLUME_ROOT="0150" - fi - fi - # In z/VM, this is a 4 digit hex number instead of a linux device. - # This is the swap disk defined in user direct - # This number can be given with the parameter --swap NR. - if [ -z "$VM_VOLUME_SWAP" ]; then - if [ -n "$VM_SWAP" -a ${#VM_SWAP} -le 4 ]; then - VM_VOLUME_SWAP="$VM_SWAP" - else - VM_VOLUME_SWAP="0250" - fi - fi - # z/VM guest name that is already defined in z/VM - if [ -z "$VM_WORKER" ]; then - echo "ERROR: No z/VM worker id specified" - cleanup_and_exit 3 - fi - if [ -z "$zvm_worker_nr" ]; then - echo "ERROR: No z/VM worker number specified" - cleanup_and_exit 3 - fi - # need the name for a kernel in zvm - if [ -n "$VM_KERNEL" ]; then - vm_kernel="$VM_KERNEL" - elif [ -e "/boot/vmlinux.gz" ]; then - vm_kernel="/boot/vmlinux.gz" - else - echo "ERROR: No z/VM kernel specified" - cleanup_and_exit 3 - fi - # need the name for an initrd in zvm - # this normally will not be the local initrd - if [ -n "$VM_INITRD" ]; then - vm_initrd="$VM_INITRD" - else - echo "ERROR: No z/VM initrd specified" - cleanup_and_exit 3 - fi -fi - -if [ "$VM_TYPE" = 'ec2' -a -z "$RUNNING_IN_VM" ]; then - # verify settings - if [ -z "$AWS_ACCESS_KEY" -o -z "$AWS_ACCESS_KEY" ]; then - echo "ERROR:No amazon EC2 environment set. Set AWS_ACCESS_KEY and AWS_SECRET_KEY." - cleanup_and_exit 3 - fi - if [ -z "$BUILD_EC2_AKI" ]; then - echo "ERROR: No image refering to kernel and ramdisk is defined in BUILD_EC2_AKI env." - cleanup_and_exit 3 - fi - if [ -z "$VM_VOLUME_NAME" ]; then - echo "ERROR: No worker root VM volume name specified." - cleanup_and_exit 3 - fi - if [ -z "$VM_VOLUME_SWAP" ]; then - echo "ERROR: No worker swap VM volume name specified." - cleanup_and_exit 3 - fi - - # go - VM_IMAGE=`cloud_volume_attach "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"` - [ "${VM_IMAGE:0:5}" == "/dev/" ] || cleanup_and_exit 3 -fi - -if [ "$VM_TYPE" = 'openstack' -a -z "$RUNNING_IN_VM" ]; then - # verify settings - if [ -z "$OS_AUTH_URL" ]; then - echo "ERROR:No openstack environment set. This vm-type works only inside of an openstack VM." - cleanup_and_exit 3 - fi - if [ -z "$OBS_OPENSTACK_KERNEL_IMAGE_ID" ]; then - echo "ERROR: No image refering to kernel and ramdisk is defined in OBS_OPENSTACK_KERNEL_IMAGE_ID env." - cleanup_and_exit 3 - fi - if [ -z "$VM_VOLUME_NAME" ]; then - echo "ERROR: No worker root VM volume name specified." - cleanup_and_exit 3 - fi - if [ -z "$VM_VOLUME_SWAP" ]; then - echo "ERROR: No worker swap VM volume name specified." - cleanup_and_exit 3 - fi - if [ -z "$VM_SERVER" ]; then - echo "ERROR: No VM server nod name specified (usually this instance)." - cleanup_and_exit 3 - fi - - # go - VM_IMAGE=`cloud_volume_attach "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"` - [ "${VM_IMAGE:0:5}" == "/dev/" ] || cleanup_and_exit 3 +if test -n "$CLEAN_BUILD" ; then + DO_INIT=true fi -if [ "$VM_TYPE" = 'kvm' -a -z "$RUNNING_IN_VM" ]; then - if [ ! -r /dev/kvm -o ! -x "$kvm_bin" ]; then - echo "host doesn't support kvm" - echo "either the kvm kernel-module is not loaded or kvm is not installed or hardware virtualization is deactivated in the BIOS." - cleanup_and_exit 3 - fi - qemu_bin="$kvm_bin" - if [ -n "$VM_KERNEL" ]; then - vm_kernel="$VM_KERNEL" - fi - - # check if a SUSE system with virtio initrd is running - if [ -z "$VM_INITRD" -a -e /etc/sysconfig/kernel ]; then - a=$( source /etc/sysconfig/kernel; echo $INITRD_MODULES ) - have_virtio_pci="" - have_virtio_blk="" - for i in $a; do - [ "$i" == "virtio_pci" ] && have_virtio_pci="1" - [ "$i" == "virtio_blk" ] && have_virtio_blk="1" - done - [ -n "$have_virtio_pci" -a -n "$have_virtio_blk" ] && VM_INITRD="/boot/initrd" - fi - - if [ -n "$VM_INITRD" ]; then - vm_initrd="$VM_INITRD" - kvm_virtio=1 - elif [ -e "${vm_initrd}-build" ]; then - vm_initrd="${vm_initrd}-build" - kvm_virtio=1 - else - if [ -L "$vm_initrd" ]; then - vm_initrd=`readlink -f "$vm_initrd"` || cleanup_and_exit 3 - fi - vm_initrd_virtio="${vm_initrd}-virtio" - - if [ ! -e ${vm_initrd_virtio} -o $vm_kernel -nt ${vm_initrd_virtio} ]; then - mkinitrd_virtio_cmd=(env rootfstype="$VMDISK_FILESYSTEM" \ - mkinitrd -d /dev/null \ - -m "ext3 ext4 btrfs reiserfs binfmt_misc virtio_pci virtio_blk" \ - -k $vm_kernel \ - -i ${vm_initrd_virtio}) - if [ ! -w /root -o -n "$RPMLIST" ]; then - echo "No initrd that provides virtio support found. virtio accelleration disabled." - echo "Run the following command as root to enable virtio:" - shellquote "${mkinitrd_virtio_cmd[@]}" - echo - elif /sbin/modinfo virtio_pci >/dev/null 2>&1; then - echo "creating $vm_initrd_virtio" - "${mkinitrd_virtio_cmd[@]}" || cleanup_and_exit 1 - kvm_virtio=1 - vm_initrd="${vm_initrd_virtio}" - fi - else - kvm_virtio=1 - vm_initrd="${vm_initrd_virtio}" - fi - fi - - case $HOST_ARCH in - power7|armv7l) kvm_virtio=1;; - ppc970) kvm_virtio=;; - esac - - if [ "$kvm_virtio" = 1 ]; then - VM_SWAPDEV=/dev/vdb - qemu_rootdev=/dev/vda - else - VM_SWAPDEV=/dev/sdb - qemu_rootdev=/dev/sda +if test -n "$VM_TYPE" -a -z "$RUNNING_IN_VM" ; then + if test -z "$VMDISK_FILESYSTEM" -a -n "$BUILD_DIST" ; then + VMDISK_FILESYSTEM=`queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" buildflags vmfstype` fi + test -n "$VMDISK_FILESYSTEM" || VMDISK_FILESYSTEM=ext3 + vm_verify_options fi -if [ "$VM_TYPE" = 'openstack' ]; then - VM_SWAPDEV=/dev/vdb - qemu_rootdev=/dev/vda -fi - -if [ "$VM_TYPE" = 'qemu' ]; then - VM_SWAPDEV=/dev/sdb - qemu_rootdev=/dev/sda -fi - -if [ "$VM_TYPE" = 'uml' ]; then - VM_SWAPDEV=/dev/ubdb -fi - -if [ -z "$RPMLIST" -a -z "$RUNNING_IN_VM" ]; then - if [ -z "$repos" -a -z "$BUILD_RPMS" ]; then +if test -z "$RPMLIST" -a -z "$RUNNING_IN_VM" ; then + if test -z "$repos" -a -z "$BUILD_RPMS" ; then repos=(--repository 'zypp://') fi else @@ -1794,158 +923,56 @@ fi set_build_arch -if [ -n "$CLEAN_BUILD" ]; then - DO_INIT=true -fi - -find_spec_files +expand_recipe_directories if test -n "$LIST_STATE" ; then BUILD_ROOT=`mktemp -d /var/tmp/build-list-state-XXXXXX` test -d "$BUILD_ROOT" || cleanup_and_exit 3 - SPECFILE=$SPECFILES # only one specified anyways - if test "$SPECFILE" != "${SPECFILE%.src.rpm}" ; then - rm -rf "$BUILD_ROOT/usr/src/packages" - mkdir -p $BUILD_ROOT/usr/src/packages/SOURCES $BUILD_ROOT/usr/src/packages/SPECS - rpm -i --nodigest --nosignature --root $BUILD_ROOT $SPECFILE || { - echo "could not install $SPECFILE." 2>&1 - rm -rf "$BUILD_ROOT" - cleanup_and_exit 3 - } - for SPECFILE in $BUILD_ROOT/usr/src/packages/SPECS/*.spec ; do : ; done + RECIPEFILE=$RECIPEFILES # only one specified anyways + if test "$RECIPEFILE" != "${RECIPEFILE%.src.rpm}" ; then + MYSRCDIR="$BUILD_ROOT/usr/src/packages/SOURCES" + recipe_unpack_srcrpm + RECIPEFILE="$MYSRCDIR/$RECIPEFILE" fi - init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" --list-state "${definesnstuff[@]}" "${repos[@]}" $USEUSEDFORBUILD $SPECFILE $BUILD_EXTRA_PACKS + init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" --list-state "${definesnstuff[@]}" "${repos[@]}" $USEUSEDFORBUILD $RECIPEFILE $BUILD_EXTRA_PACKS ERR=$? rm -rf "$BUILD_ROOT" cleanup_and_exit $ERR fi -# z/VM: -# 1. make sure that no buildjob exists anymore by doing an ipl of cms -# 2. detach the root device from the worker -# 3. link the device to the controlling guest -# -> Need a uniq worker id to calculate a uniq device address for linking -# -> VM_IMAGE is the resulting block device -if [ "$VM_TYPE" = 'zvm' ]; then - if [ ! "$0" = "/.build/build" ] ; then - echo "in controlling guest" - zvm_cp worker_init $VM_WORKER $VM_VOLUME_ROOT $VM_VOLUME_SWAP $zvm_worker_nr - zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT - zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP - VM_IMAGE=$(zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_ROOT $zvm_mult_pass $zvm_worker_nr ) - VM_SWAP=$(zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_SWAP $zvm_mult_pass $zvm_worker_nr ) - if [ ! "${VM_IMAGE}" = "dasd${VM_IMAGE#dasd}" -o ! "${VM_SWAP}" = "dasd${VM_SWAP#dasd}" ]; then - echo "did not get a real device for VM_IMAGES: $VM_IMAGE $VM_SWAP" - cleanup_and_exit 3 - else - VM_IMAGE="/dev/"${VM_IMAGE} - VM_SWAP="/dev/"${VM_SWAP} - fi - fi -fi - -echo "VM_IMAGE: $VM_IMAGE, VM_SWAP: $VM_SWAP" - -# doing setup -if test -z "$RUNNING_IN_VM" ; then - if test -n "$VM_IMAGE" ; then - if test "$VM_IMAGE" = 1 ; then - VM_IMAGE="$BUILD_ROOT.img" - echo "using $VM_IMAGE as vm image" - if test -z "$VM_SWAP" -a "$VM_TYPE" != "emulator"; then - VM_SWAP="$BUILD_ROOT.swap" - echo "using $VM_SWAP as vm swap" - fi - fi - if [ "$VM_TYPE" = 'xen' ]; then - # this should not be needed, but sometimes a xen instance got lost - XENID="${VM_IMAGE%/root}" - XENID="${XENID%/tmpfs}" - XENID="${XENID##*/}" - XENID="${XENID#root_}" - xm destroy "build_$XENID" >/dev/null 2>&1 - fi - if test -n "$VMDISK_CLEAN" ; then - # delete old root/swap to get rid of the old blocks - if test -f "$VM_IMAGE" ; then - echo "Deleting old $VM_IMAGE" - rm -rf "$VM_IMAGE" - fi - if test -n "$VM_SWAP" -a -f "$VM_SWAP" ; then - echo "Deleting old $VM_SWAP" - rm -rf "$VM_SWAP" - fi - fi - if test ! -e "$VM_IMAGE"; then - vm_img_create "$VM_IMAGE" "$VMDISK_ROOTSIZE" - if test -z "$CLEAN_BUILD" ; then - vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_IMAGE" - fi - fi - if test -n "$VM_SWAP" -a ! -e "$VM_SWAP" -a ! -b "$VM_SWAP"; then - vm_img_create "$VM_SWAP" "$VMDISK_SWAPSIZE" - fi - if test ! -e "$VM_IMAGE" ; then - echo "you need to create $VM_IMAGE first" - cleanup_and_exit 3 - fi - if test -n "$CLEAN_BUILD" ; then - vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_IMAGE" || cleanup_and_exit 3 - fi - mkdir_build_root - if [ -w /root ]; then - if [ -b $VM_IMAGE ]; then - # mount device directly - mount $VMDISK_MOUNT_OPTIONS $VM_IMAGE $BUILD_ROOT || cleanup_and_exit 3 - else - mount ${VMDISK_MOUNT_OPTIONS},loop $VM_IMAGE $BUILD_ROOT || cleanup_and_exit 3 - fi - else - if ! mount $BUILD_ROOT; then - echo "mounting the build root failed. An fstab entry is probably missing or incorrect." - echo "/etc/fstab should contain an entry like this:" - echo "$VM_IMAGE $BUILD_ROOT auto noauto,user,loop 0 0" - cleanup_and_exit 3 - fi - fi - else - test -w /root || become_root_or_fail - fi - if test -n "$VM_SWAP" ; then - dd if=/dev/zero of="$VM_SWAP" bs=1024 count=1 conv=notrunc 2>/dev/null - echo "mkswap $VM_SWAP" - mkswap "$VM_SWAP" - [ "$VM_TYPE" = 'openstack' ] && openstack_volume_detach "$VM_SERVER" "$VM_VOLUME_SWAP" - fi +# do vm setup if needed +if test -z "$RUNNING_IN_VM" -a -n "$VM_TYPE" -a -n "$VM_IMAGE" ; then + vm_setup fi mkdir_build_root -if [ "$BUILD_ROOT" = / ]; then +if test "$BUILD_ROOT" = / ; then browner="$(stat -c %u /)" fi rm -f $BUILD_ROOT/exit -if [ -w /root ]; then +if test -w /root ; then mkdir -p $BUILD_ROOT/proc + mkdir -p $BUILD_ROOT/sys mkdir -p $BUILD_ROOT/dev/pts mount -n -tproc none $BUILD_ROOT/proc || true mount -n -tdevpts -omode=0620,gid=5 none $BUILD_ROOT/dev/pts fi -if test -z "$VM_IMAGE" -a -z "$LOGFILE"; then +if test -z "$VM_IMAGE" -a -z "$LOGFILE" ; then LOGFILE="$BUILD_ROOT/.build.log" fi -if test -n "$LOGFILE" -a -z "$shell" ; then - echo logging output to $LOGFILE... +if test -n "$LOGFILE" -a -z "$RUN_SHELL" ; then + echo "logging output to $LOGFILE..." rm -f $LOGFILE touch $LOGFILE # set start time, to be substracted for build log timestamps STARTTIME=`perl -e 'print time()'` - if [ -n "$RUNNING_IN_VM" ]; then + if test -n "$RUNNING_IN_VM" ; then # no additional timestamps in inner vm build system exec 1> >(exec -a 'build logging' tee -a $LOGFILE) 2>&1 elif test -n "$VM_IMAGE" ; then @@ -1964,7 +991,7 @@ setmemorylimit # test -z "$HOST" && HOST=`hostname` -if [ -z "$RUNNING_IN_VM" ]; then +if test -z "$RUNNING_IN_VM" ; then echo Using BUILD_ROOT=$BUILD_ROOT test -n "$BUILD_RPMS" && echo Using BUILD_RPMS=$BUILD_RPMS echo Using BUILD_ARCH=$BUILD_ARCH @@ -1975,29 +1002,16 @@ fi test "$BUILD_ARCH" = all && BUILD_ARCH= BUILD_USER_ABUILD_USED= -for SPECFILE in "${SPECFILES[@]}" ; do +for RECIPEFILE in "${RECIPEFILES[@]}" ; do - SRCDIR="${SPECFILE%/*}" - SPECFILE="${SPECFILE##*/}" + SRCDIR="${RECIPEFILE%/*}" + RECIPEFILE="${RECIPEFILE##*/}" - BUILDTYPE= - case $SPECFILE in - *.spec|*.src.rpm) BUILDTYPE=spec ;; - *.dsc) BUILDTYPE=dsc ;; - *.kiwi) BUILDTYPE=kiwi ;; - PKGBUILD) BUILDTYPE=arch ;; - _preinstallimage) BUILDTYPE=preinstallimage ;; - esac - if test -z "$BUILDTYPE" ; then - echo "don't know how to build $SPECFILE" - cleanup_and_exit 1 - fi + recipe_set_buildtype - cd "$SRCDIR" - - if [ -z "$RUNNING_IN_VM" ]; then + if test -z "$RUNNING_IN_VM" ; then echo - echo "$HOST started \"build $SPECFILE\" at `date --utc`." + echo "$HOST started \"build $RECIPEFILE\" at `date --utc`." echo test -n "$REASON" && echo "$REASON" echo @@ -2007,584 +1021,42 @@ for SPECFILE in "${SPECFILES[@]}" ; do # # first setup building directory... # - test -s "$SPECFILE" || { - echo "$SPECFILE" is empty. This should not happen... - cleanup_and_exit 1 - } - - if test "$SPECFILE" != "${SPECFILE%.src.rpm}" ; then - echo processing src rpm $SRCDIR/$SPECFILE ... - MYSRCDIR=$BUILD_ROOT/.build-srcdir - rm -rf "$MYSRCDIR" - mkdir -p "$MYSRCDIR" - cd $MYSRCDIR || cleanup_and_exit 1 - $BUILD_DIR/unrpm -q $SRCDIR/$SPECFILE || { - echo "could not install $SPECFILE." - cleanup_and_exit 1 - } - for SPECFILE in *.spec ; do : ; done - else - MYSRCDIR="$SRCDIR" - fi - - # FIX to work with baselibs_$PROJ etc - if test "$BUILDTYPE" == "dsc" -a -e ${SRCDIR}/baselibs-deb.conf ; then - # Set CREATE_BASELIBS if not set - echo "dsc build and baselibs-deb.conf present: forcing --baselibs to true" - CREATE_BASELIBS=true + cd "$SRCDIR" + if ! test -s "$RECIPEFILE" ; then + echo "$RECIPEFILE is empty. This should not happen..." + cleanup_and_exit 1 fi + MYSRCDIR="$SRCDIR" -# Currently local osc build does not allow extra .deb packages to be -# specified on the command line. Both init_buildsystem and expanddeps -# need to handle .deb dependencies first -# if test -n "$CREATE_BASELIBS" ; then -# case $BUILDTYPE in -# spec) ;; -# dsc) BUILD_EXTRA_PACKS="$BUILD_EXTRA_PACKS libparse-debcontrol-perl" ;; -# esac -# fi + # special hack to build from a .src.rpm + test "$RECIPEFILE" != "${RECIPEFILE%.src.rpm}" && recipe_unpack_srcrpm - echo processing specfile $MYSRCDIR/$SPECFILE ... + echo "processing recipe $MYSRCDIR/$RECIPEFILE ..." - ADDITIONAL_PACKS="" + ADDITIONAL_PACKS= test -z "$BUILD_EXTRA_PACKS" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS $BUILD_EXTRA_PACKS" test -z "$CREATE_BASELIBS" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS build" - test "$ccache" = '0' || ADDITIONAL_PACKS="$ADDITIONAL_PACKS ccache" + test -z "$CCACHE" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS ccache" test "$icecream" = 0 || ADDITIONAL_PACKS="$ADDITIONAL_PACKS icecream gcc-c++" test -z "$DO_LINT" || ADDITIONAL_PACKS="$ADDITIONAL_PACKS rpmlint-Factory" - test "$VMDISK_FILESYSTEM" = 'xfs' && ADDITIONAL_PACKS="$ADDITIONAL_PACKS libblkid1" - test "$VM_TYPE" = 'zvm' && ADDITIONAL_PACKS="$ADDITIONAL_PACKS udev libcap2" + test "$VMDISK_FILESYSTEM" = xfs && ADDITIONAL_PACKS="$ADDITIONAL_PACKS libblkid1" + test "$VM_TYPE" = zvm && ADDITIONAL_PACKS="$ADDITIONAL_PACKS udev libcap2" + # we need to do this before the vm is started if test -n "$CHANGELOG" -a -z "$RUNNING_IN_VM" ; then rm -f $BUILD_ROOT/.build-changelog - case $SPECFILE in - *.dsc) CFFORMAT=debian ;; - *) CFFORMAT=rpm ;; + case $RECIPEFILE in + *.dsc) CFFORMAT=debian ;; + *) CFFORMAT=rpm ;; esac - echo "running changelog2spec --target $CFFORMAT --file $MYSRCDIR/$SPECFILE" - if ! $BUILD_DIR/changelog2spec --target $CFFORMAT --file "$MYSRCDIR/$SPECFILE" > $BUILD_ROOT/.build-changelog ; then + echo "running changelog2spec --target $CFFORMAT --file $MYSRCDIR/$RECIPEFILE" + if ! $BUILD_DIR/changelog2spec --target $CFFORMAT --file "$MYSRCDIR/$RECIPEFILE" > $BUILD_ROOT/.build-changelog ; then rm -f $BUILD_ROOT/.build-changelog fi fi if test -n "$VM_TYPE" -a -z "$RUNNING_IN_VM"; then - rm -rf "$BUILD_ROOT/.build" - mkdir -p "$BUILD_ROOT/.build" - if test "$DO_INIT" = true ; then - # do first stage of init_buildsystem - rm -f $BUILD_ROOT/.build.success - set -- init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" --prepare "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USE_SYSTEM_QEMU $USEUSEDFORBUILD $RPMLIST "$MYSRCDIR/$SPECFILE" $ADDITIONAL_PACKS - echo "$* ..." - start_time=`date +%s` - "$@" || cleanup_and_exit 1 - check_exit - TIME_PREINSTALL=$(( `date +%s` - $start_time )) - unset start_time - if [ ! -w /root ]; then - # remove setuid bit if files belong to user to make e.g. mount work - find $BUILD_ROOT/{bin,sbin,usr/bin,usr/sbin} -type f -uid $UID -perm +4000 -print0 | xargs -0 --no-run-if-empty chmod -s - fi - copy_oldpackages - fi - - # start up xen, rerun ourself - cp -a $BUILD_DIR/. $BUILD_ROOT/.build - if ! test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then - rm -rf "$BUILD_ROOT/.build-srcdir" - mkdir "$BUILD_ROOT/.build-srcdir" - if test "$BUILDTYPE" = kiwi ; then - cp -pRL "$MYSRCDIR"/* $BUILD_ROOT/.build-srcdir - else - cp -p "$MYSRCDIR"/* $BUILD_ROOT/.build-srcdir - fi - MYSRCDIR=$BUILD_ROOT/.build-srcdir - else - # cwd is at $BUILD_ROOT/.build-srcdir which we want to - # umount later so step aside - cd "$SRCDIR" - fi - Q="'\''" - echo "SPECFILE='${SPECFILE//"'"/$Q}'" > $BUILD_ROOT/.build/build.data - echo "BUILD_JOBS='${BUILD_JOBS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "BUILD_ARCH='${BUILD_ARCH//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "BUILD_RPMS='${BUILD_RPMS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - case $BUILD_DIST in - */*) - cp $BUILD_DIST $BUILD_ROOT/.build/build.dist - BUILD_DIST=/.build/build.dist - ;; - esac - echo "BUILD_DIST='${BUILD_DIST//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "RELEASE='${RELEASE//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "BUILD_DEBUG='${BUILD_DEBUG//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "SIGNDUMMY='${SIGNDUMMY//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "DO_LINT='${DO_LINT//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "DO_CHECKS='${DO_CHECKS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "NOROOTFORBUILD='${NOROOTFORBUILD//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "CREATE_BASELIBS='$CREATE_BASELIBS'" >> $BUILD_ROOT/.build/build.data - echo "REASON='${REASON//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "CHANGELOG='${CHANGELOG//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "INCARNATION='${INCARNATION//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "DISTURL='${DISTURL//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "DO_INIT='${DO_INIT//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - echo "KIWI_PARAMETERS='${KIWI_PARAMETERS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data - # FIXME: this depends on the kernel and vm. - # could be hda2, sda2 for xen or hdb/sdb for qemu - test -n "$VM_SWAP" && echo "VM_SWAP='${VM_SWAPDEV:-/dev/hda2}'" >> $BUILD_ROOT/.build/build.data - test -n "$VMDISK_MOUNT_OPTIONS" && echo "VMDISK_MOUNT_OPTIONS='${VMDISK_MOUNT_OPTIONS}'" >> $BUILD_ROOT/.build/build.data - PERSONALITY=0 - if test "$VM_TYPE" != 'lxc'; then - test -n "$PERSONALITY_SYSCALL" && PERSONALITY=`perl -e 'print syscall('$PERSONALITY_SYSCALL', 0)."\n"'` - fi - if test "$(uname -m)" = 'ppc'; then - # ppc kernel never tells us if a 32bit personality is active - PERSONALITY=8 - fi - echo "PERSONALITY='$PERSONALITY'" >> $BUILD_ROOT/.build/build.data - echo "MYHOSTNAME='`hostname`'" >> $BUILD_ROOT/.build/build.data - echo -n "definesnstuff=(" >> $BUILD_ROOT/.build/build.data - shellquote "${definesnstuff[@]}" >> $BUILD_ROOT/.build/build.data - echo ")" >> $BUILD_ROOT/.build/build.data - echo -n "repos=(" >> $BUILD_ROOT/.build/build.data - shellquote "${repos[@]}" >> $BUILD_ROOT/.build/build.data - echo ")" >> $BUILD_ROOT/.build/build.data - echo "VM_TYPE='$VM_TYPE'" >> $BUILD_ROOT/.build/build.data - echo "shell='$shell'" >> $BUILD_ROOT/.build/build.data - echo "statistics='$statistics'" >> $BUILD_ROOT/.build/build.data - # fallback time for broken hosts - date '+@%s' > $BUILD_ROOT/.build/.date - if [ "$VM_TYPE" = 'emulator' ]; then - ln -sf /.build/build $BUILD_ROOT/sbin/init - fi - if [ "$VM_TYPE" = 'zvm' ]; then - # initrd is created in obsstoragesetup. - # If it is desired to use a project dependent kernel, use make_guestinitrd from zvm_functions. - # have to copy kernel/initrd and run zipl to be able to IPL - # have to set init_script before unmounting, thus doing it statically for now. - zvm_init_script="/.build/build" - mkdir -p $BUILD_ROOT/boot - cp $vm_kernel $vm_initrd $BUILD_ROOT/boot - mkdir -p $BUILD_ROOT/boot/zipl - # finally, install bootloader to the worker disk - zipl -t $BUILD_ROOT/boot/zipl -i ${BUILD_ROOT}${vm_kernel} -r ${BUILD_ROOT}${vm_initrd} \ - --parameters "${zvm_param} init=$zvm_init_script rootfsopts=noatime" - fi - umount -n $BUILD_ROOT/proc/sys/fs/binfmt_misc 2> /dev/null || true - umount -n $BUILD_ROOT/proc 2> /dev/null || true - umount -n $BUILD_ROOT/dev/pts 2> /dev/null || true - umount -n $BUILD_ROOT/dev/shm 2> /dev/null || true - umount -n $BUILD_ROOT/mnt 2> /dev/null || true - - if check_use_emulator; then - if [ -e $BUILD_DIR/initvm.$BUILD_HOST_ARCH -a -e "$BUILD_DIR/qemu-reg" ]; then - chmod 0755 "$BUILD_DIR/initvm.$BUILD_HOST_ARCH" - vm_init_script="/.build/initvm.$BUILD_HOST_ARCH" - else - echo "Warning: can't find initscript to register binfmts" - fi - else - vm_init_script="/.build/build" - fi - - if [ "$VM_TYPE" = 'emulator' ]; then - # generic emulator hook. an external script is needed to define - # the emulator startup - sync - pushd $BUILD_DIR/emulator - if [ -z "$EMULATOR_SCRIPT" ]; then - EMULATOR_SCRIPT="./emulator.sh" - elif [ "${EMULATOR_SCRIPT:0:1}" != "/" ]; then - EMULATOR_SCRIPT="./$EMULATOR_SCRIPT" - fi - set -- "$EMULATOR_SCRIPT" "$VM_IMAGE" - echo "$@" - if ! "$@"; then - popd - echo "ERROR: The emulator return with an failure" - cleanup_and_exit 3 - fi - popd - - fi - - if [ "$VM_TYPE" = 'openstack' -o "$VM_TYPE" = 'ec2' ]; then - # No way to handle this via init= parameter here.... - echo "#!/bin/sh" > "$BUILD_ROOT/sbin/init" - echo 'exec /.build/build "$@"' >> "$BUILD_ROOT/sbin/init" - chmod 0755 "$BUILD_ROOT/sbin/init" - fi - if [ "$VM_TYPE" = 'ec2' ]; then - # use the instance kernel, if no kernel got installed via preinstall - if ! test -e "$BUILD_ROOT/boot/vmlinuz"; then - cp /boot/vmlinuz-ec2 "$BUILD_ROOT/boot/vmlinuz" - cp /boot/initrd-ec2 "$BUILD_ROOT/boot/initrd" - fi - # install menu.lst for pv grub - if ! test -e "$BUILD_ROOT/boot/grub/menu.lst"; then - mkdir -p "$BUILD_ROOT/boot/grub" - echo "serial --unit=0 --speed=9600" > "$BUILD_ROOT/boot/grub/menu.lst" - echo "terminal --dumb serial" >> "$BUILD_ROOT/boot/grub/menu.lst" - echo "default 0" >> "$BUILD_ROOT/boot/grub/menu.lst" - echo "timeout 0" >> "$BUILD_ROOT/boot/grub/menu.lst" - echo "hiddenmenu" >> "$BUILD_ROOT/boot/grub/menu.lst" - echo "" >> "$BUILD_ROOT/boot/grub/menu.lst" - echo "title default" >> "$BUILD_ROOT/boot/grub/menu.lst" - echo " root (hd0)" >> "$BUILD_ROOT/boot/grub/menu.lst" - echo " kernel /boot/vmlinuz root=/dev/sda1 xencons=xvc0 console=xvc0 splash=silent" >> "$BUILD_ROOT/boot/grub/menu.lst" - echo " initrd /boot/initrd" >> "$BUILD_ROOT/boot/grub/menu.lst" - fi - fi - if [ -n "$VM_IMAGE" ]; then - check_exit - # needs to work otherwise we have a corrupted file system - umount $BUILD_ROOT || cleanup_and_exit 3 - fi - - if [ "$VM_TYPE" = 'openstack' -o "$VM_TYPE" = 'ec2' ]; then - cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_NAME" || cleanup_and_exit 3 - fi - - if [ -n "$VM_IMAGE" -a "$VM_TYPE" = "zvm" ]; then - # detach the worker root and swap locally and link it in the worker - zvm_cp volume_detach_local $VM_VOLUME_ROOT ${zvm_worker_nr} - zvm_cp volume_detach_local $VM_VOLUME_SWAP ${zvm_worker_nr} - zvm_cp volume_attach $VM_WORKER $VM_VOLUME_ROOT - zvm_cp volume_attach $VM_WORKER $VM_VOLUME_SWAP - fi - - if [ "$VM_TYPE" = 'xen' ]; then - XMROOT="file:$(readlink -f $VM_IMAGE)" - XMROOT=${XMROOT/#file:\/dev/phy:/dev} - XMROOT="disk=$XMROOT,hda1,w" - XMSWAP= - if test -n "$VM_SWAP" ; then - XMSWAP="file:$(readlink -f $VM_SWAP)" - XMSWAP=${XMSWAP/#file:\/dev/phy:/dev} - XMSWAP="disk=$XMSWAP,hda2,w" - fi - XENID="${VM_IMAGE%/root}" - XENID="${XENID%/tmpfs}" - XENID="${XENID##*/}" - XENID="${XENID#root_}" - - echo "booting XEN kernel ..." - if xm list "build_$XENID" >/dev/null 2>&1 ; then - echo "Instance already exist, something really went wrong..." - echo "Please report to your server admin, there might be multiple services running for same domain" - cleanup_and_exit 3 - fi - XEN_CONF_FILE=`mktemp /var/tmp/build.xen.conf-XXXXXXXXX` || cleanup_and_exit 3 - echo "kernel = \"$vm_kernel\"" > $XEN_CONF_FILE - echo "ramdisk = \"$vm_initrd\"" >> $XEN_CONF_FILE - echo "memory = ${MEMSIZE:-64}" >> $XEN_CONF_FILE - echo "vcpus = $BUILD_JOBS" >> $XEN_CONF_FILE - echo "root = \"/dev/hda1 ro\"" >> $XEN_CONF_FILE - echo "extra = \"init=/bin/bash console=ttyS0 panic=1 udev_timeout=360\"" >> $XEN_CONF_FILE - echo "on_poweroff = 'destroy'" >> $XEN_CONF_FILE - echo "on_reboot = 'destroy'" >> $XEN_CONF_FILE - echo "on_crash = 'destroy'" >> $XEN_CONF_FILE - set -- xm create -c $XEN_CONF_FILE name="build_$XENID" $XMROOT $XMSWAP extra="quiet init="$vm_init_script" elevator=noop panic=1 console=ttyS0" - if test "$PERSONALITY" != 0 ; then - # have to switch back to PER_LINUX to make xm work - set -- linux64 "$@" - fi - echo "$@" - "$@" || cleanup_and_exit 3 - rm "$XEN_CONF_FILE" - elif [ "$VM_TYPE" = 'uml' ]; then - echo "booting UML kernel ..." - set -- $uml_kernel initrd=$uml_initrd root=ubda init="$vm_init_script" panic=1 elevator=noop quiet ubda=$VM_IMAGE ubdb=$VM_SWAP ${MEMSIZE:+mem=$MEMSIZE} - echo "$@" - "$@" - elif [ "$VM_TYPE" = 'qemu' -o "$VM_TYPE" = 'kvm' ]; then - echo "booting $VM_TYPE ..." - if [ "$VM_TYPE" = 'kvm' -a -b "$VM_IMAGE" ]; then - # speed optimization when using kvm with raw devices - CACHE=",cache=none" - else - # speed optimization when using kvm with raw files - CACHE=",cache=unsafe" - fi - - # we do not want to have sound inside the VMs - export QEMU_AUDIO_DRV=none - - if [ "$kvm_virtio" = 1 ]; then - qemu_args=(-drive file="$VM_IMAGE",if=virtio$CACHE -drive file="$VM_IMAGE",if=ide,index=0$CACHE) - if [ -n "$VM_SWAP" ]; then - qemu_args=("${qemu_args[@]}" "-drive") - qemu_args=("${qemu_args[@]}" "file=$VM_SWAP,if=virtio$CACHE") - fi - if [ "$HOST_ARCH" = "armv7l" ]; then - qemu_args=(-drive file="$VM_IMAGE",if=none,id=disk$CACHE -device virtio-blk,transport=virtio-mmio.0,drive=disk) - qemu_args=("${qemu_args[@]}" "-drive") - qemu_args=("${qemu_args[@]}" "file=$VM_SWAP,if=none,id=swap$CACHE") - qemu_args=("${qemu_args[@]}" "-device") - qemu_args=("${qemu_args[@]}" "virtio-blk,transport=virtio-mmio.1,drive=swap") - fi - else - if [ "$HOST_ARCH" = "ppc970" ];then - qemu_args=( "-drive" ) - qemu_args=("${qemu_args[@]}" "file=$VM_IMAGE,if=scsi,cache=unsafe") - else - qemu_args=(-hda "$VM_IMAGE") - fi - if [ -n "$VM_SWAP" ]; then - qemu_args=("${qemu_args[@]}" "-drive") - if [ "$HOST_ARCH" = "ppc970" ];then - DISK_IF=scsi - else - DISK_IF=ide - fi - qemu_args=("${qemu_args[@]}" "file=$VM_SWAP,if=$DISK_IF,index=1$CACHE") - fi - fi - if [ -n "$BUILD_JOBS" -a "$icecream" = 0 -a -z "$BUILD_THREADS" ]; then - qemu_args=("${qemu_args[@]}" "-smp" "$BUILD_JOBS") - elif [ -n "$BUILD_JOBS" -a -n "$BUILD_THREADS" ]; then - qemu_args=("${qemu_args[@]}" "-smp" "$BUILD_JOBS,threads=$BUILD_THREADS") - fi - if [ "$VM_TYPE" = 'kvm' -a "$HOST_ARCH" != "armv7l" ]; then - KVM_OPTIONS="$KVM_OPTIONS -cpu host" - if [ -n "$HUGETLBFSPATH" ]; then - KVM_OPTIONS="$KVM_OPTIONS -mem-path $HUGETLBFSPATH" - fi - fi - - set -- $qemu_bin -no-reboot -nographic -vga none -net none $KVM_OPTIONS \ - -kernel $vm_kernel \ - -initrd $vm_initrd \ - -append "root=$qemu_rootdev panic=1 quiet no-kvmclock nmi_watchdog=0 rw elevator=noop console=$console init=$vm_init_script" \ - ${MEMSIZE:+-m $MEMSIZE} \ - "${qemu_args[@]}" - - if test "$PERSONALITY" != 0 ; then - # have to switch back to PER_LINUX to make qemu work - set -- linux64 "$@" - fi - echo "$@" - "$@" - elif [ "$VM_TYPE" = 'ec2' ]; then - echo "booting $VM_TYPE ..." - EC2_SNAP_root=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$VM_VOLUME_NAME" | awk '{ print $2 }'` - if [ "$EC2_SNAP_root" == "${EC2_SNAP_root#snap-}" ]; then - echo "ERROR: Failed to create snapshot for root disk $VM_VOLUME_NAME" - cleanup_and_exit 3 - fi - EC2_SNAP_swap=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$VM_VOLUME_SWAP" | awk '{ print $2 }'` - if [ "$EC2_SNAP_swap" == "${EC2_SNAP_swap#snap-}" ]; then - echo "ERROR: Failed to create snapshot for swap disk $VM_VOLUME_SWAP" - ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" - cleanup_and_exit 3 - fi - # wait for snapshots being processed - while true; do - c=`ec2-describe-snapshots --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" "$EC2_SNAP_swap" | grep completed | wc -l` - [ "$c" == "2" ] && break - done - EC2_AMI=`ec2-register --region "$BUILD_EC2_REGION" -n build-$VM_VOLUME_NAME -a x86_64 -b "/dev/sda1=$EC2_SNAP_root::false" -b "/dev/sdb1=$EC2_SNAP_swap::false" --kernel "$BUILD_EC2_AKI" | awk '{ print $2 }'` - if [ "$EC2_AMI" == "${EC2_AMI#ami-}" ]; then - echo "ERROR: Failed to register the AMI" - ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" - ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap" - cleanup_and_exit 3 - fi - INSTANCE=`ec2-run-instances --region "$BUILD_EC2_REGION" -z "$BUILD_EC2_ZONE" -t $BUILD_EC2_TYPE --kernel "$BUILD_EC2_AKI" --instance-initiated-shutdown-behavior terminate "$EC2_AMI" | grep ^INSTANCE | awk '{ print $2 }'` - if [ "$INSTANCE" == "${INSTANCE#i-}" ]; then - echo "ERROR: Failed to run the instance for AMI $EC2_AMI" - ec2-deregister --region "$BUILD_EC2_REGION" "$EC2_AMI" - ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" - ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap" - cleanup_and_exit 3 - fi - echo "Waiting for finishing the build. No log file until then on EC2 ...." - I=0 - L=0 - EC2_EXTRACT_VOLUME_root="" - EC2_EXTRACT_VOLUME_swap="" - temp_file=`mktemp` - while true; do - ec2-describe-instances --region "$BUILD_EC2_REGION" "$INSTANCE" > $temp_file - state=`grep ^INSTANCE "$temp_file"` - if [ -z "$EC2_EXTRACT_VOLUME_root" ]; then - EC2_EXTRACT_VOLUME_root=`grep ^BLOCKDEVICE $temp_file | grep /dev/sda1 | awk '{ print $3 }'` - EC2_EXTRACT_VOLUME_swap=`grep ^BLOCKDEVICE $temp_file | grep /dev/sdb1 | awk '{ print $3 }'` - fi - # the column of the state is at a differen position depending on the state :/ -# [ "$state" == "${state/stopped/}" ] || break - [ "$state" == "${state/terminated/}" ] || break - I=$(( $I + 1 )) - if [ $I -gt 10 ]; then - echo -n . - I="0" - L=$(( $L + 1 )) - fi - if [ $L -gt 10 ]; then - # dump entire console log as raw here - ec2-get-console-output --region "$BUILD_EC2_REGION" -r "$INSTANCE" - L="0" - fi - sleep 1 - done - rm "$temp_file" - echo - ec2-deregister --region "$BUILD_EC2_REGION" "$EC2_AMI" - # snapshots get deleted after extract - elif [ "$VM_TYPE" = 'openstack' ]; then - echo "booting $VM_TYPE ..." - nova boot --image $OBS_OPENSTACK_KERNEL_IMAGE_ID --flavor m1.small --block_device_mapping vda=${VM_VOLUME_NAME}::$(( $VMDISK_ROOTSIZE / 1024 )):0 --block_device_mapping vdb=${VM_VOLUME_SWAP}::1:0 --poll "build-$VM_VOLUME_NAME" || cleanup_and_exit 3 - -# while [ `nova show "build-$VM_VOLUME_NAME" | sed -n -e 's,|[ ]*status[ ]*|[ ]*\([^ ]*\).*,\1,p'` == "ACTIVE" ]; do -# sleep 5 -# done - nova console-log "build-$VM_VOLUME_NAME" - elif [ "$VM_TYPE" = 'lxc' ]; then - echo "booting $VM_TYPE ..." - LXCCONF="$BUILD_ROOT/.build.lxc.conf" - rm -f "$LXCCONF" - cat $BUILD_DIR/lxc.conf > "$LXCCONF" - cat >> "$LXCCONF" <<-EOF - lxc.rootfs = $BUILD_ROOT - EOF - # XXX: do this always instead of leaking the hosts' one? - echo "rootfs / rootfs rw 0 0" > $BUILD_ROOT/etc/mtab - LXCID=${BUILD_ROOT##*/} - lxc-destroy -n "$LXCID" >/dev/null 2>&1 || true - lxc-create -n "$LXCID" -f "$LXCCONF" || cleanup_and_exit 1 - lxc-start -n "$LXCID" "$vm_init_script" - BUILDSTATUS="$?" - test "$BUILDSTATUS" != 255 || BUILDSTATUS=3 - cleanup_and_exit "$BUILDSTATUS" - elif [ "$VM_TYPE" = 'zvm' ]; then - echo "booting $VM_TYPE ..." - zvm_cp ipl $VM_WORKER $VM_VOLUME_ROOT - # start IUCV Console - # IPL needs some time until IPL really starts... - sleep 2 - # start iucv console. This blocks until build process is finished. - iucvconn $VM_WORKER lnxhvc0 - # Take root and swap devices from worker - # This might be critical regarding timing (IUCV_CONSOLE down, but machine still running) - sleep 5 - zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT - zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP - VM_IMAGE="/dev/$(zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_ROOT $zvm_mult_pass $zvm_worker_nr)" - VM_SWAP="/dev/$(zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_SWAP $zvm_mult_pass $zvm_worker_nr)" - fi - - if [ "$VM_TYPE" = 'openstack' ]; then - VM_IMAGE=`cloud_volume_attach "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"` - [ "${VM_IMAGE:0:5}" == "/dev/" ] || cleanup_and_exit 3 - VM_SWAP=`cloud_volume_attach "$VM_SERVER" "$VM_VOLUME_SWAP" "$VM_SWAP"` - [ "${VM_SWAP:0:5}" == "/dev/" ] || cleanup_and_exit 3 - fi - if [ "$VM_TYPE" = 'ec2' ]; then - VM_IMAGE=`cloud_volume_attach "$VM_SERVER" "$EC2_EXTRACT_VOLUME_root" "$VM_IMAGE"` - [ "${VM_IMAGE:0:5}" == "/dev/" ] || cleanup_and_exit 3 - VM_SWAP=`cloud_volume_attach "$VM_SERVER" "$EC2_EXTRACT_VOLUME_swap" "$VM_SWAP"` - [ "${VM_SWAP:0:5}" == "/dev/" ] || cleanup_and_exit 3 - fi - - # Exctract build resutls from VM - if [ "$VM_TYPE" = 'emulator' ]; then - # Emulators may not offer to use a second swap space. - # So we just mount the filesystem. - # WARNING: This is not safe against attacks. - - mkdir -p $BUILD_ROOT/.build.packages - cd $BUILD_ROOT/.build.packages || cleanup_and_exit 1 - mkdir -p .mount - mount $VM_IMAGE -o loop .mount - if [ -e .mount/.build.packages ]; then - cp -a .mount/.build.packages/* . - fi - exitcode=`cat .mount/.build/_exitcode` - umount .mount - rmdir .mount - - cleanup_and_exit "$exitcode" - - elif test -n "$VM_SWAP" ; then - BUILDSTATUS=`dd if="$VM_SWAP" bs=12 count=1 2>/dev/null` - case $BUILDSTATUS in - BUILDSTATUS[02]) - mkdir -p $BUILD_ROOT/.build.packages - cd $BUILD_ROOT/.build.packages || cleanup_and_exit 1 - echo "build: extracting built packages..." - extractbuild --disk "$VM_IMAGE" --input "$VM_SWAP" --skip 512 -v || cleanup_and_exit 3 - # create same layout as with plain chroot - if test "$BUILDTYPE" = spec ; then - mkdir -p SRPMS - for i in *src.rpm *.desktopfiles ; do - test -e "$i" || continue - mv "$i" SRPMS/ - done - for i in *.rpm ; do - test -e "$i" || continue - arch=${i%.rpm} - arch=${i%.delta} - arch=${arch##*\.} - mkdir -p RPMS/$arch - mv "$i" RPMS/$arch/ - done - elif test "$BUILDTYPE" = dsc ; then - mkdir -p DEBS - find . -type f | while read i; do mv "$i" DEBS/; done - elif test "$BUILDTYPE" = arch ; then - mkdir -p ARCHPKGS - find . -type f | while read i; do mv "$i" ARCHPKGS/; done - elif test "$BUILDTYPE" = kiwi ; then - mkdir -p KIWI - find . -type f | while read i; do mv "$i" KIWI/; done - fi - for i in * ; do - test -f "$i" || continue - case $i in - _*|.*) ;; - *) mkdir -p OTHER ; mv $i OTHER/ ;; - esac - done - if test "$statistics" = 1; then - mkdir -p OTHER - [ -e _statistics ] && mv _statistics OTHER/ - [ -n "$TIME_PREINSTALL" ] && echo "TIME_preinstall: $TIME_PREINSTALL" >> OTHER/_statistics - TIME_TOTAL=$(( `date +%s` - $TIME_START_TIME )) - echo "TIME_total: $TIME_TOTAL" >> OTHER/_statistics - fi - if [ "$VM_TYPE" = 'zvm' ]; then - # free worker devices - zvm_cp volume_detach_local $VM_VOLUME_ROOT ${zvm_worker_nr} - zvm_cp volume_detach_local $VM_VOLUME_SWAP ${zvm_worker_nr} - fi - if [ "$VM_TYPE" = 'openstack' ]; then - cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_NAME" - cloud_volume_detach "$VM_SERVER" "$VM_VOLUME_SWAP" - fi - cleanup_and_exit ${BUILDSTATUS#BUILDSTATUS} - ;; - BUILDSTATUS*) - if [ "$VM_TYPE" = 'zvm' ]; then - # free worker devices - zvm_cp volume_detach_local $VM_VOLUME_ROOT ${zvm_worker_nr} - zvm_cp volume_detach_local $VM_VOLUME_SWAP ${zvm_worker_nr} - fi - cleanup_and_exit ${BUILDSTATUS#BUILDSTATUS} - ;; - *) - if [ "$VM_TYPE" = 'zvm' ]; then - # free worker devices - zvm_cp volume_detach_local $VM_VOLUME_ROOT ${zvm_worker_nr} - zvm_cp volume_detach_local $VM_VOLUME_SWAP ${zvm_worker_nr} - fi - echo "No buildstatus set, either the base system is broken (glibc/bash/perl)" - echo "or the build host has a kernel or hardware problem..." - cleanup_and_exit 3 - ;; - esac - - cleanup_and_exit 1 - fi - + vm_first_stage cleanup_and_exit 0 fi @@ -2597,8 +1069,10 @@ for SPECFILE in "${SPECFILES[@]}" ; do echo "BUILD_INCARNATION=$INCARNATION" > $BUILD_ROOT/.buildenv CREATE_BUILD_BINARIES= test "$BUILDTYPE" = preinstallimage && mkdir -p $BUILD_ROOT/.preinstall_image - egrep '^#[ ]*needsbinariesforbuild[ ]*$' >/dev/null <$MYSRCDIR/$SPECFILE && CREATE_BUILD_BINARIES=--create-build-binaries - set -- init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USE_SYSTEM_QEMU $USEUSEDFORBUILD $CREATE_BUILD_BINARIES $RPMLIST "$MYSRCDIR/$SPECFILE" $ADDITIONAL_PACKS + egrep '^#[ ]*needsbinariesforbuild[ ]*$' >/dev/null <$MYSRCDIR/$RECIPEFILE && CREATE_BUILD_BINARIES=--create-build-binaries + test "$BUILDTYPE" = mock && CREATE_BUILD_BINARIES=--create-build-binaries + test "$BUILDTYPE" = livebuild && CREATE_BUILD_BINARIES=--create-build-binaries + set -- init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USEUSEDFORBUILD $CREATE_BUILD_BINARIES $RPMLIST "$MYSRCDIR/$RECIPEFILE" $ADDITIONAL_PACKS echo "$* ..." start_time=`date +%s` "$@" || cleanup_and_exit 1 @@ -2620,45 +1094,9 @@ for SPECFILE in "${SPECFILES[@]}" ; do copy_oldpackages fi + # hack to process preinstallimages early if test "$BUILDTYPE" = preinstallimage ; then - echo "creating preinstall image..." - test -d "$BUILD_ROOT/.preinstall_image" || cleanup_and_exit 1 - cd $BUILD_ROOT || cleanup_and_exit 1 - TAR="tar" - if test -x /usr/bin/bsdtar; then - TAR="/usr/bin/bsdtar --format gnutar --chroot" - fi - TOPDIRS= - for DIR in .* * ; do - case "$DIR" in - .|..) continue ;; - .build*) continue ;; - .preinstallimage*) continue ;; - .srcfiles*) continue ;; - .pkgs) continue ;; - .rpm-cache) continue ;; - installed-pkg) continue ;; - proc|sys) continue ;; - esac - TOPDIRS="$TOPDIRS $DIR" - done - if ! $TAR -czf .preinstallimage.$$.tar.gz --one-file-system $TOPDIRS ; then - cleanup_and_exit 1 - fi - echo "image created." - TOPDIR=/usr/src/packages - mkdir -p $BUILD_ROOT$TOPDIR/OTHER - rm -f $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.info - for PKG in $BUILD_ROOT/.preinstall_image/* ; do - PKG=${PKG##*/} - read PKG_HDRMD5 PKGID < $BUILD_ROOT/.preinstall_image/$PKG - test -n "$PKG_HDRMD5" || cleanup_and_exit 1 - echo "$PKG_HDRMD5 $PKG" >> $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.info - done - mv $BUILD_ROOT/.preinstallimage.$$.tar.gz $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.tar.gz - rm -f $BUILD_ROOT/.build.packages - ln -s ${TOPDIR#/} $BUILD_ROOT/.build.packages - test -d "$SRCDIR" && cd "$SRCDIR" + recipe_build continue fi @@ -2666,15 +1104,6 @@ for SPECFILE in "${SPECFILES[@]}" ; do read BUILD_DIST < $BUILD_ROOT/.guessed_dist fi - # - # fix rpmrc if we are compiling for i686 - # - test -f $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 && mv $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 $BUILD_ROOT/usr/lib/rpm/rpmrc - if test -e $BUILD_ROOT/usr/lib/rpm/rpmrc -a "$BUILD_ARCH" != "${BUILD_ARCH#i686}" ; then - mv $BUILD_ROOT/usr/lib/rpm/rpmrc $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 - sed -e 's/^buildarchtranslate: athlon.*/buildarchtranslate: athlon: i686/' -e 's/^buildarchtranslate: i686.*/buildarchtranslate: i686: i686/' < $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 > $BUILD_ROOT/usr/lib/rpm/rpmrc - fi - # # install dummy sign program if needed # @@ -2691,23 +1120,22 @@ for SPECFILE in "${SPECFILES[@]}" ; do BUILD_USER=abuild if test -x $BUILD_ROOT/bin/rpm ; then SUSE_VERSION=`chroot $BUILD_ROOT /bin/rpm --eval '%{?suse_version}' 2>/dev/null` - if test -n "$SUSE_VERSION" && test "$SUSE_VERSION" -le 1020 ; then - BUILD_USER=root - fi + test -n "$SUSE_VERSION" -a "${SUSE_VERSION:-0}" -le 1020 && BUILD_USER=root fi if test "$BUILD_USER" = abuild ; then - egrep '^#[ ]*needsrootforbuild[ ]*$' >/dev/null <$SPECFILE && BUILD_USER=root + egrep '^#[ ]*needsrootforbuild[ ]*$' >/dev/null <$RECIPEFILE && BUILD_USER=root else - egrep '^#[ ]*norootforbuild[ ]*$' >/dev/null <$SPECFILE && BUILD_USER=abuild + egrep '^#[ ]*norootforbuild[ ]*$' >/dev/null <$RECIPEFILE && BUILD_USER=abuild fi test -n "$NOROOTFORBUILD" && BUILD_USER=abuild # appliance builds must run as root - if test "$BUILDTYPE" = kiwi; then - imagetype=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $SPECFILE imagetype) - test "$imagetype" = 'product' || BUILD_USER=root + if test "$BUILDTYPE" = kiwi ; then + imagetype=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $RECIPEFILE imagetype) + test "$imagetype" = product || BUILD_USER=root fi + # fixup passwd/group if test $BUILD_USER = abuild ; then if ! egrep '^abuild:' >/dev/null <$BUILD_ROOT/etc/passwd ; then echo "abuild:x:${ABUILD_UID}:${ABUILD_GID}:Autobuild:/home/abuild:/bin/bash" >>$BUILD_ROOT/etc/passwd @@ -2728,10 +1156,10 @@ for SPECFILE in "${SPECFILES[@]}" ; do fi fi if test -f $BUILD_ROOT/etc/shadow ; then - sed -e "s@^root::@root:*:@" < $BUILD_ROOT/etc/shadow > $BUILD_ROOT/etc/shadow.t && mv $BUILD_ROOT/etc/shadow.t $BUILD_ROOT/etc/shadow + sed -i -e "s@^root::@root:*:@" $BUILD_ROOT/etc/shadow fi if test -f $BUILD_ROOT/etc/gshadow ; then - sed -e "s@^root::@root:*:@" < $BUILD_ROOT/etc/gshadow > $BUILD_ROOT/etc/gshadow.t && mv $BUILD_ROOT/etc/gshadow.t $BUILD_ROOT/etc/gshadow + sed -i -e "s@^root::@root:*:@" $BUILD_ROOT/etc/gshadow fi BUILD_USER_ABUILD_USED=true else @@ -2740,318 +1168,92 @@ for SPECFILE in "${SPECFILES[@]}" ; do ABUILD_GID=0 if egrep '^abuild:' >/dev/null <$BUILD_ROOT/etc/passwd ; then rm -rf "$BUILD_ROOT/home/abuild" - egrep -v '^abuild:' <$BUILD_ROOT/etc/passwd >$BUILD_ROOT/etc/passwd.new - mv $BUILD_ROOT/etc/passwd.new $BUILD_ROOT/etc/passwd - egrep -v '^abuild:' <$BUILD_ROOT/etc/group >$BUILD_ROOT/etc/group.new - mv $BUILD_ROOT/etc/group.new $BUILD_ROOT/etc/group + sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/passwd + sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/group if test -f $BUILD_ROOT/etc/shadow ; then - egrep -v '^abuild:' <$BUILD_ROOT/etc/shadow >$BUILD_ROOT/etc/shadow.new - mv $BUILD_ROOT/etc/shadow.new $BUILD_ROOT/etc/shadow + sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/shadow fi if test -f $BUILD_ROOT/etc/gshadow ; then - egrep -v '^abuild:' <$BUILD_ROOT/etc/gshadow >$BUILD_ROOT/etc/gshadow.new - mv $BUILD_ROOT/etc/gshadow.new $BUILD_ROOT/etc/gshadow + sed -i -e '/^abuild:/d' $BUILD_ROOT/etc/gshadow fi fi fi - if test "$BUILDTYPE" = spec ; then - TOPDIR=`chroot $BUILD_ROOT su -c "rpm --eval '%_topdir'" - $BUILD_USER` - if test -z "$TOPDIR"; then - echo "Error: TOPDIR empty" - cleanup_and_exit 1 - fi - else - TOPDIR=/usr/src/packages - mkdir -p $BUILD_ROOT$TOPDIR - fi - - rm -f $BUILD_ROOT/.build.packages - ln -s ${TOPDIR#/} $BUILD_ROOT/.build.packages - mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null mount -n -tdevpts -omode=0620,gid=5 none $BUILD_ROOT/dev/pts 2> /dev/null # needed for POSIX semaphores + test -d $BUILD_ROOT/dev/shm || rm -f $BUILD_ROOT/dev/shm + mkdir -p $BUILD_ROOT/dev/shm mount -n -ttmpfs none $BUILD_ROOT/dev/shm 2> /dev/null - setupicecream + if test -n "$RUNNING_IN_VM" ; then + if test -x /sbin/ip ; then + ip addr add 127.0.0.1/8 dev lo + ip addr add ::1/128 dev lo + ip link set lo up + else + ifconfig lo 127.0.0.1 up + ifconfig lo add ::1/128 + fi + if test -n "$MYHOSTNAME" ; then + hostname "$MYHOSTNAME" + fi + fi + setupicecream setupccache + # fill build directories with sources. Also sets TOPDIR + recipe_setup + + # strip prefix from autogenerated files of source services. + for i in $BUILD_ROOT$TOPDIR/SOURCES/_service\:* ; do + mv "$i" "${i%/*}/${i##*:}" + done + RECIPEFILE="${RECIPEFILE##*:}" + + # create .build.packages link + rm -f $BUILD_ROOT/.build.packages + ln -s ${TOPDIR#/} $BUILD_ROOT/.build.packages + # nasty hack to prevent rpath on known paths # FIXME: do this only for suse if test -d "$BUILD_ROOT/etc/profile.d" ; then echo "export SUSE_IGNORED_RPATHS=/etc/ld.so.conf" > "$BUILD_ROOT/etc/profile.d/buildsystem.sh" fi - # - # now clean up RPM building directories - # - rm -rf "$BUILD_ROOT$TOPDIR" - for i in BUILD RPMS/`uname -m` RPMS/i386 RPMS/noarch SOURCES SPECS SRPMS BUILDROOT OTHER ; do - mkdir -p $BUILD_ROOT$TOPDIR/$i - done - chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" - check_exit - - mkdir -p $BUILD_ROOT$TOPDIR/SOURCES - if test "$BUILDTYPE" = kiwi ; then - mkdir -p $BUILD_ROOT$TOPDIR/KIWI - if test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then - mv "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ - else - if test -z "$LINKSOURCES" ; then - cp -dLR "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ - else - cp -lR "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ - fi - if test "$?" != 0 ; then - echo "source copy failed" - cleanup_and_exit 1 - fi - fi - else - cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ - fi - # strip prefix from autogenerated files of source services. - for i in $BUILD_ROOT$TOPDIR/SOURCES/_service\:*; do - mv "$i" "${i%/*}/${i##*:}" - done - SPECFILE="${SPECFILE##*:}" - + # get rid of old src dir, it is no longer needed and just wastes space test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir && rm -rf "$MYSRCDIR" - CHANGELOGARGS= - test -n "$CHANGELOG" -a -f "$BUILD_ROOT/.build-changelog" && CHANGELOGARGS="--changelog $BUILD_ROOT/.build-changelog" - - if test "$BUILDTYPE" = spec ; then - # do buildrequires/release substitution - args=() - if test -n "$RELEASE"; then - args=(--release "$RELEASE") - fi - substitutedeps "${args[@]}" --root "$BUILD_ROOT" --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" $CHANGELOGARGS "$BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE" "$BUILD_ROOT/.spec.new" || cleanup_and_exit 1 - # extract macros from configuration - getmacros --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" > $BUILD_ROOT/root/.rpmmacros - if test -n "$BUILD_DEBUG" ; then - echo ' -%prep %{?!__debug_package:%{?_build_create_debug:%?_build_insert_debug_package}}%%prep -%package %{?!__debug_package:%{?_build_create_debug:%?_build_insert_debug_package}}%%package -%_build_insert_debug_package \ -%global __debug_package 1 \ -%undefine _enable_debug_packages \ -%debug_package - -' >> $BUILD_ROOT/root/.rpmmacros - fi - - if [ -n "$BUILD_JOBS" ]; then - cat >> $BUILD_ROOT/root/.rpmmacros <<-EOF - %jobs $BUILD_JOBS - %_smp_mflags -j$BUILD_JOBS - EOF - fi - test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/.rpmmacros $BUILD_ROOT/home/abuild/.rpmmacros - # extract optflags from configuration - getoptflags --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" ${BUILD_DEBUG:+--debug} > $BUILD_ROOT/root/.rpmrc - test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/.rpmrc $BUILD_ROOT/home/abuild/.rpmrc - if test -z "$ABUILD_TARGET"; then - ABUILD_TARGET=$(getchangetarget --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" ) - test -z "$ABUILD_TARGET" || echo "build target is $ABUILD_TARGET" - fi - fi - if test -f $BUILD_ROOT/.spec.new ; then - if ! cmp -s $BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE $BUILD_ROOT/.spec.new ; then - echo ----------------------------------------------------------------- - echo "I have the following modifications for $SPECFILE:" - sed -e "/^%changelog/q" $BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE > $BUILD_ROOT/.spec.t1 - sed -e "/^%changelog/q" $BUILD_ROOT/.spec.new > $BUILD_ROOT/.spec.t2 - diff $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2 - rm -f $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2 - mv $BUILD_ROOT/.spec.new $BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE - else - rm -f $BUILD_ROOT/.spec.new - fi - fi - - if test "$BUILDTYPE" = dsc ; then - rm -rf "$BUILD_ROOT$TOPDIR/BUILD" - mkdir -p $BUILD_ROOT$TOPDIR/SOURCES.DEB - chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" - DEB_TRANSFORM= - DEB_SOURCEDIR=$TOPDIR/SOURCES - DEB_DSCFILE=$SPECFILE - for f in $BUILD_ROOT$TOPDIR/SOURCES/debian.* ; do - test -f $f && DEB_TRANSFORM=true - done - if test -n "$DEB_TRANSFORM" ; then - echo "running debian transformer..." - if ! debtransform $CHANGELOGARGS $BUILD_ROOT$TOPDIR/SOURCES $BUILD_ROOT$TOPDIR/SOURCES/$SPECFILE $BUILD_ROOT$TOPDIR/SOURCES.DEB ; then - echo "debian transforming failed." - cleanup_and_exit 1 - fi - DEB_SOURCEDIR=$TOPDIR/SOURCES.DEB - for DEB_DSCFILE in $BUILD_ROOT/$DEB_SOURCEDIR/*.dsc ; do : ; done - DEB_DSCFILE="${DEB_DSCFILE##*/}" - fi - chroot $BUILD_ROOT su -c "dpkg-source -x $DEB_SOURCEDIR/$DEB_DSCFILE $TOPDIR/BUILD" - $BUILD_USER - fi - if test "$BUILDTYPE" = arch ; then - echo "Preparing sources..." - chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && makepkg -s -o 2>&1 >/dev/null" - $BUILD_USER - mv $BUILD_ROOT/$TOPDIR/SOURCES/* -t $BUILD_ROOT/$TOPDIR/BUILD - fi + # patch recipes + recipe_prepare + # hmmm chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" + cd $BUILD_ROOT$TOPDIR/SOURCES || cleanup_and_exit 1 echo ----------------------------------------------------------------- if test "$BUILD_USER" = root ; then - echo ----- building $SPECFILE + echo ----- building $RECIPEFILE else - echo ----- building $SPECFILE "(user $BUILD_USER)" + echo ----- building $RECIPEFILE "(user $BUILD_USER)" fi echo ----------------------------------------------------------------- echo ----------------------------------------------------------------- - if [ -n "$RUNNING_IN_VM" ]; then - if [ -x /sbin/ip ]; then - ip addr add 127.0.0.1/8 dev lo - ip link set lo up - else - ifconfig lo 127.0.0.1 up - fi - if [ -n "$MYHOSTNAME" ]; then - hostname "$MYHOSTNAME" - fi - fi - BUILD_SUCCEEDED=false if test -n "$OVERLAY" ; then - if test -d "$OVERLAY"; then - pushd $OVERLAY - echo "Copying overlay to BUILD_ROOT" - tar -cpf - . | (cd $BUILD_ROOT ; tar -xvf -) - popd - else - echo "OVERLAY ($OVERLAY) is no directory - skipping" - fi + copy_overlay fi if test -n "$RSYNCSRC" ; then - if test -n "$RSYNCDEST"; then - if test -d "$RSYNCSRC"; then - if ! test -d "$BUILD_ROOT/$RSYNCDEST"; then - echo "ATTENTION! Creating target directory ($BUILD_ROOT/$RSYNCDEST) as its not there." - mkdir -p $BUILD_ROOT/$RSYNCDEST - fi - echo "Running rsync ..." - rsync -av $RSYNCSRC/* $BUILD_ROOT/$RSYNCDEST/ - chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT/$RSYNCDEST" - RSYNCDONE=true - echo "... done" - else - echo "RSYNCSRC is no directory - skipping" - fi - else - echo "RSYNCSRC given, but not RSYNCDEST - skipping" - fi + run_rsync fi start_time=`date +%s` - if test "$BUILDTYPE" = spec ; then - test -z "$BUILD_RPM_BUILD_STAGE" && BUILD_RPM_BUILD_STAGE=-ba - - rpmbuild=rpmbuild - test -x $BUILD_ROOT/usr/bin/rpmbuild || rpmbuild=rpm - - # XXX: move _srcdefattr to macro file? - rpmbopts=("$BUILD_RPM_BUILD_STAGE" "--define" "_srcdefattr (-,root,root)") - if test "$rpmbuild" == "rpmbuild" ; then - # use only --nosignature for rpm v4 - rpmbopts[${#rpmbopts[@]}]="--nosignature" - fi - if test -n "$ABUILD_TARGET" ; then - rpmbopts[${#rpmbopts[@]}]="--target=$ABUILD_TARGET" - fi - if test -n "$BUILD_DEBUG" ; then - rpmbopts[${#rpmbopts[@]}]='--define' - rpmbopts[${#rpmbopts[@]}]="_build_create_debug 1" - fi - if test -n "$DISTURL" ; then - rpmbopts[${#rpmbopts[@]}]='--define' - rpmbopts[${#rpmbopts[@]}]="disturl $DISTURL" - fi - if test -n "$RSYNCDONE" ; then - rpmbopts[${#rpmbopts[@]}]='--define' - rpmbopts[${#rpmbopts[@]}]="RSYNCDONE 1" - fi - - # su involves a shell which would require even more - # complicated quoting to bypass than this - toshellscript $rpmbuild \ - "${definesnstuff[@]}" \ - "${rpmbopts[@]}" \ - "$TOPDIR/SOURCES/$SPECFILE" \ - > $BUILD_ROOT/.build.command - chmod 755 $BUILD_ROOT/.build.command - check_exit - if test -n "$shell"; then - chroot $BUILD_ROOT su - - else - chroot $BUILD_ROOT su -c /.build.command - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true - fi - fi - - if test "$BUILDTYPE" = dsc ; then - # Checks to see if a build script should be used - # this allows the build environment to be manipulated - # and alternate build commands can be used -# Debian policy requires to build with single CPU by default -# if [ -n "$BUILD_JOBS" ]; then -# DSC_BUILD_JOBS="-j$BUILD_JOBS" -# fi - DSC_BUILD_CMD="dpkg-buildpackage -us -uc -rfakeroot-tcp $DSC_BUILD_JOBS" - if test -e $BUILD_ROOT/$TOPDIR/SOURCES/build.script ; then - echo "Sourcing build.script to build - it should normally run 'dpkg-buildpackage -us -uc -rfakeroot-tcp'" - DSC_BUILD_CMD="source $TOPDIR/SOURCES/build.script" - chmod +x $BUILD_ROOT/$TOPDIR/SOURCES/build.script - fi - - if test -n "$shell"; then - chroot $BUILD_ROOT su - - else - chroot $BUILD_ROOT su -c "cd $TOPDIR/BUILD && $DSC_BUILD_CMD" - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true - if test "$BUILD_SUCCEEDED" = true -a "$DO_CHECKS" != "false"; then - DEB_CHANGESFILE=${SPECFILE%.dsc}_"$(chroot $BUILD_ROOT su -c 'dpkg-architecture -qDEB_BUILD_ARCH')".changes - chroot $BUILD_ROOT su -c "which lintian > /dev/null && cd $TOPDIR && echo Running lintian && (set -x && lintian -i $DEB_SOURCEDIR/$DEB_DSCFILE)" - $BUILD_USER < /dev/null - fi - fi - - mkdir -p $BUILD_ROOT/$TOPDIR/DEBS - for DEB in $BUILD_ROOT/$TOPDIR/*.deb ; do - test -e "$DEB" && mv "$DEB" "$BUILD_ROOT/$TOPDIR/DEBS" - done - # link sources over - ln $BUILD_ROOT/$DEB_SOURCEDIR/$DEB_DSCFILE $BUILD_ROOT/$TOPDIR/DEBS/ - while read f ; do - ln $BUILD_ROOT/$DEB_SOURCEDIR/$f $BUILD_ROOT/$TOPDIR/DEBS/ - done < <(sed -ne '/^Files:/,$s/^ ................................ [0-9][0-9]* //p' < $BUILD_ROOT/$DEB_SOURCEDIR/$DEB_DSCFILE) - fi - - if test "$BUILDTYPE" = arch ; then - chroot $BUILD_ROOT su -c "cd $TOPDIR/BUILD && makepkg -f" - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true - mkdir -p $BUILD_ROOT/$TOPDIR/ARCHPKGS - for PKG in $BUILD_ROOT/$TOPDIR/BUILD/*.pkg.tar.?z ; do - test -e "$PKG" && mv "$PKG" "$BUILD_ROOT/$TOPDIR/ARCHPKGS" - done - fi - - if test "$BUILDTYPE" = kiwi ; then - . $BUILD_DIR/build_kiwi.sh - run_kiwi - fi - if test "$statistics" = 1; then + recipe_build + if test "$DO_STATISTICS" = 1; then mkdir -p $TOPDIR/OTHER echo "TIME_main_build: $(( `date +%s` - $start_time ))" >> $TOPDIR/OTHER/_statistics fi @@ -3061,7 +1263,7 @@ for SPECFILE in "${SPECFILES[@]}" ; do test -d "$SRCDIR" && cd "$SRCDIR" done -if test -n "$RUNNING_IN_VM" -a -n "$VM_SWAP"; then +if test -n "$RUNNING_IN_VM" -a -n "$DO_STATISTICS" ; then touch /.build/_statistics.exit fi @@ -3069,60 +1271,30 @@ RPMS=`find $BUILD_ROOT/$TOPDIR/RPMS -type f -name "*.rpm" 2>/dev/null || true` DEBS=`find $BUILD_ROOT/$TOPDIR/DEBS -type f -name "*.deb" 2>/dev/null || true` if test -n "$RPMS" -a -n "$BUILD_USER_ABUILD_USED" ; then - echo "... checking for files with abuild user/group" - BADFILE= - while read un gn fn ; do - if test "$un" = abuild -o "$gn" = abuild -o "$un" = ${ABUILD_UID} -o "$gn" = ${ABUILD_GID} ; then - echo " $un $gn $fn" - BADFILE=true - fi - done < <(rpm -qp --qf '[%{FILEUSERNAME} %{FILEGROUPNAME} %{FILENAMES}\n]' $RPMS) - if test -n "$BADFILE" ; then - echo "please fix your filelist (e.g. add defattr)" - cleanup_and_exit 1 - fi + recipe_check_file_owners fi if test -n "$RPMS" -a -d "$BUILD_ROOT/usr/lib/build/checks" ; then - export PNAME="" export DO_RPM_REMOVE=true + # find package name + export PNAME= for SRPM in $BUILD_ROOT/$TOPDIR/SRPMS/*src.rpm ; do test -f "$SRPM" && PNAME=`rpm --nodigest --nosignature -qp --qf "%{NAME}" $SRPM` done mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null for CHECKSCRIPT in $BUILD_ROOT/usr/lib/build/checks/* ; do - echo "... running `basename $CHECKSCRIPT`" + echo "... running ${CHECKSCRIPT##*/}" $CHECKSCRIPT || cleanup_and_exit 1 done umount -n $BUILD_ROOT/proc 2>/dev/null || true fi +# checkscripts may have deleted some binaries RPMS=`find $BUILD_ROOT/$TOPDIR/RPMS -type f -name "*.rpm" 2>/dev/null || true` DEBS=`find $BUILD_ROOT/$TOPDIR/DEBS -type f -name "*.deb" 2>/dev/null || true` -if test -n "$RPMS" -a "$DO_CHECKS" != "false" -a -x "$BUILD_ROOT/opt/testing/bin/rpmlint" ; then - LINT_RPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/RPMS \ - \( -name "*-debuginfo-*" -o -name "*-debugsource-*" \ - -o -name "*-32bit-*" -o -name "*-64bit-*" \ - -o -name "*-x86-*" -o -name "*-ia32-*" \) -prune \ - -o -type f -name '*.rpm' -print)) - SRPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/SRPMS -type f -name "*.rpm")) - echo - echo "RPMLINT report:" - echo "===============" - rpmlint_logfile=$TOPDIR/OTHER/rpmlint.log - rm -f "$BUILD_ROOT$rpmlint_logfile" - ret=0 - mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null - chroot $BUILD_ROOT su -s /opt/testing/bin/rpmlint "$BUILD_USER" -- \ - --info ${LINT_RPM_FILE_LIST[*]#$BUILD_ROOT} \ - ${SRPM_FILE_LIST[*]#$BUILD_ROOT} > "$BUILD_ROOT$rpmlint_logfile" || ret=1 - cat "$BUILD_ROOT$rpmlint_logfile" - echo - umount -n $BUILD_ROOT/proc 2>/dev/null || true - if test "$ret" = 1; then - cleanup_and_exit 1 - fi +if test -n "$RPMS" -a "$DO_CHECKS" != false ; then + recipe_run_rpmlint fi if test \( -n "$RPMS" -o -n "$DEBS" \) -a -n "$CREATE_BASELIBS"; then @@ -3130,102 +1302,23 @@ if test \( -n "$RPMS" -o -n "$DEBS" \) -a -n "$CREATE_BASELIBS"; then fi exitcode=0 -# post build scripts + +# post build work # TODO: don't hardcode. instead run scripts in a directory as it's done for the checks -if test -n "$RPMS" \ - -a -d "$BUILD_ROOT/$TOPDIR/RPMS" \ - -a -d "$BUILD_ROOT/.build.oldpackages" \ - ; then - if test -x "$BUILD_ROOT/usr/lib/build/same-build-result.sh" ; then - echo "... comparing built packages with the former built" - mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null - if chroot $BUILD_ROOT /usr/lib/build/same-build-result.sh /.build.oldpackages "$TOPDIR/RPMS" "$TOPDIR/SRPMS"; then - chroot $BUILD_ROOT touch /.build/.same_result_marker - # XXX: dirty build service hack. fix bs_worker. Search for - # 'same_result_marker' for traces of a first try to get rid of this - if test -n "$REASON" -a -n "$DISTURL"; then - exitcode=2 - fi - fi - umount -n $BUILD_ROOT/proc 2>/dev/null || true - fi - if test ! -e $BUILD_ROOT/.build/.same_result_marker \ - -a -x "$BUILD_ROOT/usr/bin/makedeltarpm" \ - -a -x $BUILD_ROOT/usr/lib/build/mkdrpms; then - echo "... creating delta rpms" - ds=("$BUILD_ROOT/$TOPDIR"/RPMS/* "$BUILD_ROOT$TOPDIR/SRPMS") - chroot $BUILD_ROOT /usr/lib/build/mkdrpms /.build.oldpackages "${ds[@]#$BUILD_ROOT}" +if test -n "$RPMS" -a -d "$BUILD_ROOT/.build.oldpackages" ; then + recipe_compare_oldpackages + # no need to create deltas if the build is the same + if test ! -e $BUILD_ROOT/.build/.same_result_marker ; then + recipe_create_deltarpms fi fi -if test -n "$RUNNING_IN_VM"; then - if test "$statistics" = 1; then - echo "... saving built statistics" - [ -n "$TIME_INSTALL" ] && echo "TIME_install: $TIME_INSTALL" >> $BUILD_ROOT$TOPDIR/OTHER/_statistics - if [ -e /.build/_statistics.df ]; then - echo -n "MAX_mb_used_on_disk: " >> $TOPDIR/OTHER/_statistics - cat /.build/_statistics.df >> $TOPDIR/OTHER/_statistics - echo "" >> $TOPDIR/OTHER/_statistics - rm /.build/_statistics.df - fi - if [ -e /.build/_statistics.memory ]; then - echo -n "MAX_mb_used_memory: " >> $TOPDIR/OTHER/_statistics - cat /.build/_statistics.memory >> $TOPDIR/OTHER/_statistics - echo "" >> $TOPDIR/OTHER/_statistics - rm /.build/_statistics.memory - fi - mkdir -p /sys - mount -n sys /sys -t sysfs - device="hda1" - [ -e /dev/sda ] && device="sda" - [ -e /dev/vda ] && device="vda" - [ -e /dev/dasda ] && device="dasda" # in z/VM - [ -e /dev/nfhd0 ] && device="nfhd0" # in aranym - if [ -e /sys/block/${device}/stat ]; then - disk=(`cat /sys/block/${device}/stat`) - [ "0${disk[0]}" -gt 0 ] && echo "IO_requests_read: ${disk[0]}" >> $TOPDIR/OTHER/_statistics - [ "0${disk[2]}" -gt 0 ] && echo "IO_sectors_read: ${disk[2]}" >> $TOPDIR/OTHER/_statistics - [ "0${disk[4]}" -gt 0 ] && echo "IO_requests_write: ${disk[4]}" >> $TOPDIR/OTHER/_statistics - [ "0${disk[6]}" -gt 0 ] && echo "IO_sectors_write: ${disk[6]}" >> $TOPDIR/OTHER/_statistics - else - echo "ERROR: no root disk device found, yet another new device name?" - ls -l /sys/block/ - fi - umount /sys - fi - - if test -n "$VM_SWAP"; then - echo "... saving built packages" - swapoff "$VM_SWAP" - args="--padstart 512 --padend 512 -v" - case "$BUILDTYPE" in - spec) - computeblocklists $args $TOPDIR/RPMS/*/*.{d,}rpm $TOPDIR/SRPMS/* $TOPDIR/OTHER/* > "$VM_SWAP" - ;; - dsc) - computeblocklists $args $TOPDIR/DEBS/*.deb $TOPDIR/SOURCES.DEB/* $TOPDIR/OTHER/* > "$VM_SWAP" - ;; - kiwi) - computeblocklists $args $TOPDIR/KIWI/* $TOPDIR/OTHER/* > "$VM_SWAP" - ;; - arch) - computeblocklists $args $TOPDIR/ARCHPKGS/* $TOPDIR/OTHER/* > "$VM_SWAP" - ;; - preinstallimage) - computeblocklists $args $TOPDIR/OTHER/* > "$VM_SWAP" - ;; - *) - cleanup_and_exit 1 - ;; - esac || cleanup_and_exit 1 - else - # quit inside of the emulator - cleanup_and_exit "$exitcode" - fi +if test -n "$RUNNING_IN_VM" ; then + vm_wrapup_build $(recipe_resultdirs) OTHER fi echo -echo "$HOST finished \"build $SPECFILE\" at `date --utc`." +echo "$HOST finished \"build $RECIPEFILE\" at `date --utc`." echo cleanup_and_exit "$exitcode" diff --git a/build-pkg b/build-pkg new file mode 100644 index 0000000..529421f --- /dev/null +++ b/build-pkg @@ -0,0 +1,80 @@ +# +# binary package specific functions for the build script +# +# (C) 2014 SUSE, Inc +# + +for i in rpm deb arch ; do + . "$BUILD_DIR/build-pkg-$i" +done + +pkg_initdb() { + pkg_initdb_$PSUF "$@" +} + +pkg_get_installed() { + pkg_get_installed_$PSUF "$@" +} + +pkg_set_packageid() { + pkg_set_packageid_$PSUF "$@" +} + +pkg_install() { + pkg_install_$PSUF "$@" +} + +pkg_verify_installed() { + pkg_verify_installed_$PSUF "$@" +} + +pkg_erase() { + pkg_erase_$PSUF "$@" +} + +pkg_cumulate() { + pkg_cumulate_$PSUF "$@" +} + +pkg_finalize() { + pkg_finalize_$PSUF "$@" +} + +pkg_preinstall() { + pkg_preinstall_$PSUF "$@" +} + +pkg_runscripts() { + pkg_runscripts_$PSUF "$@" +} + +pkg_autodetect_type() { + if test -n "$PREINSTALL_IMAGE" ; then + echo "cannot autodetect build type when using a preinstall image" >&2 + cleanup_and_exit 1 + fi + PSUF= + test -e $BUILD_ROOT/.init_b_cache/rpms/rpm.rpm && PSUF=rpm + test -e $BUILD_ROOT/.init_b_cache/rpms/dpkg.deb && PSUF=deb + test -e $BUILD_ROOT/.init_b_cache/rpms/pacman.arch && PSUF=arch + if test -z "$PSUF" ; then + echo "could not autodetect package type" >&2 + cleanup_and_exit 1 + fi +} + +pkg_set_type() { + PSUF=`queryconfig binarytype --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"` + test "$PSUF" = UNDEFINED && PSUF= + case "$PSUF" in + rpm|deb|arch) + ;; + '') + pkg_autodetect_type + ;; + *) + echo "unknown package type '$PSUF'" >&2 + cleanup_and_exit 1 + ;; + esac +} diff --git a/build-pkg-arch b/build-pkg-arch new file mode 100644 index 0000000..919a744 --- /dev/null +++ b/build-pkg-arch @@ -0,0 +1,62 @@ +# +# Arch specific functions. +# +# (C) 2014 SUSE, Inc +# + +pkg_initdb_arch() { + mkdir -p $BUILD_ROOT/var/lib/pacman/sync + touch $BUILD_ROOT/var/lib/pacman/sync/core.db + touch $BUILD_ROOT/var/lib/pacman/sync/extra.db + touch $BUILD_ROOT/var/lib/pacman/sync/community.db +} + +pkg_get_installed_arch() { + : +} + +pkg_set_packageid_arch() { + PKGID=`readlink $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF` + PKGID="${PKGID##*/}" + PKGID="${PKGID/%.pkg.tar.?z/.arch}" + PKGID="${PKGID%.arch} arch" +} + +pkg_erase_arch() { + cleanup_and_exit 1 +} + +pkg_verify_installed_arch() { + return 1 +} + +pkg_cumulate_arch() { + return 1 +} + +pkg_install_arch() { + # -d -d disables deps checking + ( cd $BUILD_ROOT && chroot $BUILD_ROOT pacman -U --force -d -d --noconfirm .init_b_cache/$PKG.$PSUF 2>&1 || touch $BUILD_ROOT/exit ) | \ + perl -ne '$|=1;/^(warning: could not get filesystem information for |loading packages|looking for inter-conflicts|Targets |Total Installed Size: |Net Upgrade Size: |Proceed with installation|checking package integrity|loading package files|checking for file conflicts|checking keyring|Packages \(\d+\):|:: Proceed with installation|checking available disk space|installing |upgrading |warning:.*is up to date -- reinstalling|Optional dependencies for| )/||/^$/||print' +} + +pkg_finalize_arch() { + : +} + +pkg_preinstall_arch() { + $TAR -f "$BUILD_ROOT/.init_b_cache/rpms/$PKG.arch" + if test -f .INSTALL ; then + cat .INSTALL > ".init_b_cache/scripts/$PKG.post" + echo 'type post_install >/dev/null 2>&1 && post_install' >> ".init_b_cache/scripts/$PKG.post" + fi + rm -f .PKGINFO .INSTALL +} + +pkg_runscripts_arch() { + if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" ; then + echo "running $PKG postinstall script" + ( cd $BUILD_ROOT && chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.post" < /dev/null ) + rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" + fi +} diff --git a/build-pkg-deb b/build-pkg-deb new file mode 100644 index 0000000..199b53f --- /dev/null +++ b/build-pkg-deb @@ -0,0 +1,111 @@ +# +# Debian dpkg specific functions. +# +# (C) 2014 SUSE, Inc +# + +deb_setup() { + mkdir -p $BUILD_ROOT/var/lib/dpkg + mkdir -p $BUILD_ROOT/var/log + mkdir -p $BUILD_ROOT/etc/default + :>> $BUILD_ROOT/var/lib/dpkg/status + :>> $BUILD_ROOT/var/lib/dpkg/available + :>> $BUILD_ROOT/var/log/dpkg.log + :>> $BUILD_ROOT/etc/ld.so.conf + :>> $BUILD_ROOT/etc/default/rcS +} + +pkg_initdb_deb() { + deb_setup + # force dpkg into database to make epoch test work + if ! test "$BUILD_ROOT/.init_b_cache/rpms/dpkg.deb" -ef "$BUILD_ROOT/.init_b_cache/dpkg.deb" ; then + rm -f $BUILD_ROOT/.init_b_cache/dpkg.deb + cp $BUILD_ROOT/.init_b_cache/rpms/dpkg.deb $BUILD_ROOT/.init_b_cache/dpkg.deb || cleanup_and_exit 1 + fi + chroot $BUILD_ROOT dpkg -i --force all .init_b_cache/dpkg.deb >/dev/null 2>&1 +} + +pkg_get_installed_deb() { + : +} + +pkg_set_packageid_deb() { + PKGID=`readlink $BUILD_ROOT/.init_b_cache/rpms/$PKG.deb` + PKGID="${PKGID##*/}" + PKGID="${PKGID%.deb} debian" +} + +pkg_install_deb() { + export DEBIAN_FRONTEND=noninteractive + export DEBIAN_PRIORITY=critical + ( chroot $BUILD_ROOT dpkg --install --force all .init_b_cache/$PKG.deb 2>&1 || touch $BUILD_ROOT/exit ) | \ + perl -ne '$|=1;/^(Configuration file|Installing new config file|Selecting previously deselected|Selecting previously unselected|\(Reading database|Unpacking |Setting up|Creating config file|Preparing to replace dpkg)/||/^$/||print' + check_exit + # ugly workaround for upstart system. some packages (procps) try + # to start a service in their configure phase. As we don't have + # a running upstart, we just link the start binary to /bin/true + if test -e "$BUILD_ROOT/sbin/start"; then + if test "$BUILD_ROOT/sbin/start" -ef "$BUILD_ROOT/sbin/initctl" ; then + echo "linking /sbin/start to /bin/true" + mv "$BUILD_ROOT/sbin/start" "$BUILD_ROOT/sbin/start.disabled" + ln -s "/bin/true" "$BUILD_ROOT/sbin/start" + fi + fi + # another workaround, see bug bnc#733699 + rm -f "$BUILD_ROOT/var/run/init.upgraded" +} + +pkg_erase_deb() { + cleanup_and_exit 1 +} + +pkg_cumulate_deb() { + return 1 +} + +pkg_verify_installed_deb() { + return 1 +} + +pkg_finalize_deb() { + echo "configuring all installed packages..." + # configure all packages after complete installation, not for each package like rpm does + # We need to run this twice, because of cyclic dependencies as it does not succeed on most + # debian based distros in the first attempt. + if ! chroot $BUILD_ROOT dpkg --configure --pending 2>&1; then + echo "first configure attempt failed, trying again..." + chroot $BUILD_ROOT dpkg --configure --pending 2>&1 || cleanup_and_exit 1 + fi +} + +pkg_preinstall_deb() { + ar x "$BUILD_ROOT/.init_b_cache/rpms/$PKG.deb" + mkdir -p .init_b_cache/scripts/control + $TAR -C .init_b_cache/scripts/control -z -f control.tar.gz + if test -f "data.tar.gz" ; then + $TAR -z -f data.tar.gz + elif test -f "data.tar.xz" ; then + $TAR -J -f data.tar.xz + fi + if test -e ".init_b_cache/scripts/$PKG.run" ; then + test -e .init_b_cache/scripts/control/preinst && mv .init_b_cache/scripts/control/preinst ".init_b_cache/scripts/$PKG.pre" + test -e .init_b_cache/scripts/control/postinst && mv .init_b_cache/scripts/control/postinst ".init_b_cache/scripts/$PKG.post" + fi + rm -rf .init_b_cache/scripts/control control.tar.gz data.tar.{g,x}z +} + +pkg_runscripts_deb() { + if ! test -e $BUILD_ROOT/var/lib/dpkg/status ; then + deb_setup + fi + if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" ; then + echo "running $PKG preinstall script" + chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.pre" install < /dev/null + rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" + fi + if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" ; then + echo "running $PKG postinstall script" + chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.post" configure '' < /dev/null + rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" + fi +} diff --git a/build-pkg-rpm b/build-pkg-rpm new file mode 100644 index 0000000..d0b2ef9 --- /dev/null +++ b/build-pkg-rpm @@ -0,0 +1,201 @@ +# +# RPM specific functions. +# +# (C) 2014 SUSE, Inc +# + +#buildhost removed so that id can be generated from repo files +#RPMIDFMT="%{NAME}-%{VERSION}-%{RELEASE} %{BUILDHOST}-%{BUILDTIME}\n" +RPMIDFMT="%{NAME}-%{VERSION}-%{RELEASE} %{BUILDTIME}\n" + +pkg_initdb_rpm() { + echo "initializing rpm db..." + mkdir -p $BUILD_ROOT/var/lib/rpm + # rpm v5 does not have initdb + if ! test -e $BUILD_ROOT/usr/lib/rpm/cpuinfo.yaml ; then + if test -x $BUILD_ROOT/usr/bin/rpmdb ; then + chroot $BUILD_ROOT /usr/bin/rpmdb --initdb || cleanup_and_exit 1 + else + chroot $BUILD_ROOT rpm --initdb || cleanup_and_exit 1 + fi + fi + # hack: add nofsync to db config to speed up install + mkdir -p $BUILD_ROOT/root + DBI_OTHER=`chroot $BUILD_ROOT rpm --eval '%{?__dbi_other}'` + echo "%__dbi_other $DBI_OTHER nofsync" > $BUILD_ROOT/.rpmmacros + echo "%__dbi_other $DBI_OTHER nofsync" > $BUILD_ROOT/root/.rpmmacros +} + +pkg_get_installed_rpm() { + chroot $BUILD_ROOT rpm -qa --qf "%{NAME} $RPMIDFMT" | ( + while read pp ii; do + echo "$ii" > "$BUILD_ROOT/.init_b_cache/alreadyinstalled/$pp" + done + ) + # small hack: we misuse get_installed_rpm as initializer function + rpm_set_checkopts + rpm_init_cumulate +} + +pkg_erase_rpm() { + chroot $BUILD_ROOT rpm --nodeps -e $PKG 2>&1 | { + local retry + while read line; do + case "$line" in + r*failed:\ No\ such\ file\ or\ directory) ;; + error:\ failed\ to\ stat\ *:\ No\ such\ file\ or\ directory) ;; + error:\ *scriptlet\ failed*) + echo "$line" + retry=1 + ;; + *) echo "$line" ;; + esac + done + if test -n "$retry" ; then + echo "re-try deleting $PKG using --noscripts" + chroot $BUILD_ROOT rpm --nodeps --noscripts -e $PKG || true + fi + } +} + +rpm_set_checkopts() { + RPMCHECKOPTS= + RPMCHECKOPTS_HOST= + # on Fedora 10 rpmbuild is in a separate package so we need something else to + # detect rpm4 + test -x $BUILD_ROOT/usr/bin/rpmquery && RPMCHECKOPTS="--nodigest --nosignature" + test -x /usr/bin/rpmquery && RPMCHECKOPTS_HOST="--nodigest --nosignature" +} + +rpm_init_cumulate() { + cumulate=-1 + CUMULATED_LIST=() + CUMULATED_PIDS=() + CUMULATED_HMD5=() + DO_CUMULATE= + typeset -ri suse_version=$(chroot $BUILD_ROOT rpm --eval '%{?suse_version}' 2>/dev/null) + if ((suse_version > 1220)) ; then + DO_CUMULATE=true + fi +} + +pkg_set_packageid_rpm() { + PKGID=`rpm -qp --qf "$RPMIDFMT" $RPMCHECKOPTS_HOST $BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm` +} + +pkg_verify_installed_rpm() { + chroot $BUILD_ROOT rpm --verify $PKG 2>&1 | tee $TMPFILE + if grep ^missing $TMPFILE > /dev/null ; then + return 1 + fi + return 0 +} + +pkg_cumulate_rpm() { + test "$DO_CUMULATE" = true || return 1 + # work around for cross-build installs, we must not overwrite the running rpm + if test "$PKG" = rpm ; then + for i in $BUILD_ROOT/.init_b_cache/preinstalls/rpm-x86-* ; do + test -e "$i" && return 1 + done + fi + let cumulate++ + CUMULATED_LIST[$cumulate]=".init_b_cache/$PKG.rpm" + CUMULATED_PIDS[$cumulate]="$PKGID" + CUMULATED_HMD5[$cumulate]="$PKG_HDRMD5" + return 0 +} + +pkg_install_rpm() { + export ADDITIONAL_PARAMS= + if test "$USE_FORCE" = true ; then + export ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS --force" + fi + # work around for cross-build installs, we must not overwrite the running rpm + if test "$PKG" = rpm ; then + for i in $BUILD_ROOT/.init_b_cache/preinstalls/rpm-x86-* ; do + test -e "$i" && ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS --justdb" + done + fi + ( chroot $BUILD_ROOT rpm --ignorearch --nodeps -U --oldpackage --ignoresize $RPMCHECKOPTS \ + $ADDITIONAL_PARAMS .init_b_cache/$PKG.rpm 2>&1 || \ + touch $BUILD_ROOT/exit ) | \ + grep -v "^warning:.*saved as.*rpmorig$" +} + +pkg_finalize_rpm() { + if test -n "${CUMULATED_LIST[*]}" ; then + echo "now installing cumulated packages" + for ((num=0; num<=cumulate; num++)) ; do + echo ${CUMULATED_LIST[$num]} + PKG=${CUMULATED_LIST[$num]##*/} + test "$BUILD_ROOT/.init_b_cache/rpms/$PKG" -ef "$BUILD_ROOT/${CUMULATED_LIST[$num]}" && continue + rm -f $BUILD_ROOT/${CUMULATED_LIST[$num]} + cp $BUILD_ROOT/.init_b_cache/rpms/$PKG $BUILD_ROOT/${CUMULATED_LIST[$num]} || cleanup_and_exit 1 + done > $BUILD_ROOT/.init_b_cache/manifest + chroot $BUILD_ROOT rpm --ignorearch --nodeps -Uh --oldpackage --ignoresize --verbose $RPMCHECKOPTS \ + $ADDITIONAL_PARAMS .init_b_cache/manifest 2>&1 || touch $BUILD_ROOT/exit + for ((num=0; num<=cumulate; num++)) ; do + rm -f $BUILD_ROOT/${CUMULATED_LIST[$num]} + done + rm -f $BUILD_ROOT/.init_b_cache/manifest + check_exit + for ((num=0; num<=cumulate; num++)) ; do + PKG=${CUMULATED_LIST[$num]##*/} + echo "${CUMULATED_PIDS[$num]}" > $BUILD_ROOT/installed-pkg/${PKG%.rpm} + test -n "${CUMULATED_HMD5[$num]}" || continue + echo "${CUMULATED_HMD5[$num]} ${CUMULATED_PIDS[$num]}" > $BUILD_ROOT/.preinstall_image/${PKG%.rpm} + done + fi +} + +pkg_preinstall_rpm() { + PAYLOADDECOMPRESS=cat + case `rpm -qp --nodigest --nosignature --qf "%{PAYLOADCOMPRESSOR}\n" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm"` in + lzma) rpm --showrc | egrep 'PayloadIsLzma|_lzma' > /dev/null || PAYLOADDECOMPRESS="lzma -d" ;; + xz) rpm --showrc | egrep 'PayloadIsXz|_xz' > /dev/null || PAYLOADDECOMPRESS="xz -d" ;; + esac + if test "$PAYLOADDECOMPRESS" = "lzma -d" ; then + if ! lzma /dev/null 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 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-- + test -z "${PKG##rpm-x86-*[0-9]*}" && chroot $BUILD_ROOT rpm --rebuilddb + fi +} + +pkg_runscripts_rpm() { + if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" ; then + echo "running $PKG preinstall script" + chroot $BUILD_ROOT sh ".init_b_cache/scripts/$PKG.pre" 0 + rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" + fi + if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" ; then + echo "running $PKG postinstall script" + chroot $BUILD_ROOT sh ".init_b_cache/scripts/$PKG.post" 1 + rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" + fi +} diff --git a/build-recipe b/build-recipe new file mode 100644 index 0000000..b8165ec --- /dev/null +++ b/build-recipe @@ -0,0 +1,108 @@ +# +# recipe specific functions for the build script +# +# (C) 2014 SUSE, Inc +# + +KIWI_PARAMETERS= + +for i in spec dsc kiwi arch preinstallimage mock livebuild; do + . "$BUILD_DIR/build-recipe-$i" +done + +recipe_setup() { + recipe_setup_$BUILDTYPE "$@" +} + +recipe_prepare() { + recipe_prepare_$BUILDTYPE "$@" +} + +recipe_build() { + recipe_build_$BUILDTYPE "$@" +} + +recipe_resultdirs () { + recipe_resultdirs_$BUILDTYPE "$@" +} + +recipe_parse_options() { + case ${PARAM/#--/-} in + -stage) + needarg + BUILD_RPM_BUILD_STAGE="$ARG" + shift + ;; + -kiwi-parameter) + test -z "$ARG" && ARG="$1" + needarg + KIWI_PARAMETERS="$KIWI_PARAMETERS $ARG" + shift + ;; + -*) + return 1 + ;; + esac + nextargs=("$@") + return 0 +} + +recipe_set_buildtype() { + BUILDTYPE= + case ${RECIPEFILE##_service:*:} in + *.spec|*.src.rpm) BUILDTYPE=spec ;; + *.dsc) BUILDTYPE=dsc ;; + *.kiwi) BUILDTYPE=kiwi ;; + PKGBUILD) BUILDTYPE=arch ;; + _preinstallimage) BUILDTYPE=preinstallimage ;; + *.livebuild) BUILDTYPE=livebuild ;; + esac + if test -z "$BUILDTYPE" ; then + echo "I don't know how to build $RECIPEFILE" + cleanup_and_exit 1 + fi + # we can't query right after vm startup, so we put the BUILDENGINE in the build.data + if test -z "$RUNNING_IN_VM" ; then + BUILDENGINE= + if test -n "$BUILD_DIST" ; then + BUILDENGINE=`queryconfig buildengine --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"` + test "$BUILDENGINE" = UNDEFINED && BUILDENGINE= + fi + fi + if test "$BUILDENGINE" = mock -a "$BUILDTYPE" = spec ; then + BUILDTYPE=mock + fi +} + +# expands all directories into files +expand_recipe_directories() { + local f t ff found + if test -z "$RECIPEFILES" ; then + set -- "`pwd`" + else + set -- "${RECIPEFILES[@]}" + fi + RECIPEFILES=() + for f in "$@" ; do + if test "$f" = "${f#/}" ; then + f="`pwd`/$f" + fi + if test -d "$f" ; then + for t in .spec .dsc PKGBUILD .kiwi .src.rpm .nosrc.rpm ; do + found= + for ff in "$f"/*$t ; do + test -f "$ff" || continue + RECIPEFILES=("${RECIPEFILES[@]}" "$ff") + found=true + done + test -n "$found" && break + done + else + RECIPEFILES[${#RECIPEFILES[@]}]="$f" + fi + done + if test -z "$RECIPEFILES" ; then + echo "no recipe files found in $@. exit..." + cleanup_and_exit 1 + fi +} diff --git a/build-recipe-arch b/build-recipe-arch new file mode 100644 index 0000000..2db77da --- /dev/null +++ b/build-recipe-arch @@ -0,0 +1,40 @@ +# +# Arch specific functions. +# +# (C) 2014 SUSE, Inc +# + +recipe_setup_arch() { + TOPDIR=/usr/src/packages + rm -rf "$BUILD_ROOT$TOPDIR" + mkdir -p "$BUILD_ROOT$TOPDIR" + mkdir -p "$BUILD_ROOT$TOPDIR/OTHER" + mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES" + mkdir -p "$BUILD_ROOT/$TOPDIR/ARCHPKGS" + mkdir -p "$BUILD_ROOT/$TOPDIR/BUILD" + chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" + cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ + { + echo 'source /etc/makepkg.conf' + printf '%s=%s\n' \ + BUILDDIR $TOPDIR/BUILD \ + PKGDEST $TOPDIR/ARCHPKGS + } > $BUILD_ROOT$TOPDIR/makepkg.conf +} + +recipe_prepare_arch() { + echo "Preparing sources..." + _arch_recipe_makepkg -so "2>&1" ">/dev/null" +} + +recipe_build_arch() { + _arch_recipe_makepkg -ef < /dev/null && BUILD_SUCCEEDED=true +} + +recipe_resultdirs_arch() { + echo ARCHPKGS +} + +_arch_recipe_makepkg() { + chroot $BUILD_ROOT su -lc "source /etc/profile; cd $TOPDIR/SOURCES && makepkg --config ../makepkg.conf $*" $BUILD_USER +} diff --git a/build-recipe-dsc b/build-recipe-dsc new file mode 100644 index 0000000..81cd024 --- /dev/null +++ b/build-recipe-dsc @@ -0,0 +1,86 @@ +# +# dsc specific functions. +# +# (C) 2014 SUSE, Inc +# + +recipe_setup_dsc() { + TOPDIR=/usr/src/packages + rm -rf "$BUILD_ROOT$TOPDIR" + mkdir -p "$BUILD_ROOT$TOPDIR" + mkdir -p "$BUILD_ROOT$TOPDIR/OTHER" + mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES" + mkdir -p "$BUILD_ROOT/$TOPDIR/DEBS" + chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" + cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ + # FIX to work with baselibs_$PROJ etc + if test -e "$MYSRCDIR/baselibs-deb.conf" ; then + echo "dsc build and baselibs-deb.conf present: forcing --baselibs to true" + CREATE_BASELIBS=true + fi +} + +recipe_prepare_dsc() { + rm -rf "$BUILD_ROOT$TOPDIR/BUILD" + mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES.DEB" + chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" + DEB_TRANSFORM= + DEB_SOURCEDIR="$TOPDIR/SOURCES" + DEB_DSCFILE="$RECIPEFILE" + for f in $BUILD_ROOT$TOPDIR/SOURCES/debian.* ; do + test -f $f && DEB_TRANSFORM=true + done + if test -n "$DEB_TRANSFORM" ; then + CHANGELOGARGS= + test -n "$CHANGELOG" -a -f "$BUILD_ROOT/.build-changelog" && CHANGELOGARGS="--changelog $BUILD_ROOT/.build-changelog" + echo "running debian transformer..." + if ! debtransform $CHANGELOGARGS $BUILD_ROOT$TOPDIR/SOURCES $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE $BUILD_ROOT$TOPDIR/SOURCES.DEB ; then + echo "debian transforming failed." + cleanup_and_exit 1 + fi + DEB_SOURCEDIR=$TOPDIR/SOURCES.DEB + for DEB_DSCFILE in $BUILD_ROOT/$DEB_SOURCEDIR/*.dsc ; do : ; done + DEB_DSCFILE="${DEB_DSCFILE##*/}" + fi + chroot $BUILD_ROOT su -c "dpkg-source -x $DEB_SOURCEDIR/$DEB_DSCFILE $TOPDIR/BUILD" - $BUILD_USER +} + +recipe_build_dsc() { + # Checks to see if a build script should be used + # this allows the build environment to be manipulated + # and alternate build commands can be used + # Debian policy requires to build with single CPU by default + # if test -n "$BUILD_JOBS" ; then + # DSC_BUILD_JOBS="-j$BUILD_JOBS" + # fi + DSC_BUILD_CMD="dpkg-buildpackage -us -uc -rfakeroot-tcp $DSC_BUILD_JOBS" + if test -e $BUILD_ROOT/$TOPDIR/SOURCES/build.script ; then + echo "Sourcing build.script to build - it should normally run 'dpkg-buildpackage -us -uc -rfakeroot-tcp'" + DSC_BUILD_CMD="source $TOPDIR/SOURCES/build.script" + chmod +x $BUILD_ROOT/$TOPDIR/SOURCES/build.script + fi + + if test -n "$RUN_SHELL"; then + chroot $BUILD_ROOT su - + else + chroot $BUILD_ROOT su -c "cd $TOPDIR/BUILD && $DSC_BUILD_CMD" - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true + if test "$BUILD_SUCCEEDED" = true -a "$DO_CHECKS" != "false"; then + DEB_CHANGESFILE=${RECIPEFILE%.dsc}_"$(chroot $BUILD_ROOT su -c 'dpkg-architecture -qDEB_BUILD_ARCH')".changes + chroot $BUILD_ROOT su -c "which lintian > /dev/null && cd $TOPDIR && echo Running lintian && (set -x && lintian -i $DEB_SOURCEDIR/$DEB_DSCFILE)" - $BUILD_USER < /dev/null + fi + fi + + for DEB in $BUILD_ROOT/$TOPDIR/*.deb ; do + test -e "$DEB" && mv "$DEB" "$BUILD_ROOT/$TOPDIR/DEBS" + done + + # link used sources over to DEB directory + ln $BUILD_ROOT/$DEB_SOURCEDIR/$DEB_DSCFILE $BUILD_ROOT/$TOPDIR/DEBS/ + while read f ; do + ln $BUILD_ROOT/$DEB_SOURCEDIR/$f $BUILD_ROOT/$TOPDIR/DEBS/ + done < <(sed -ne '/^Files:/,$s/^ ................................ [0-9][0-9]* //p' < $BUILD_ROOT/$DEB_SOURCEDIR/$DEB_DSCFILE) +} + +recipe_resultdirs_dsc() { + echo DEBS +} diff --git a/build-recipe-kiwi b/build-recipe-kiwi new file mode 100644 index 0000000..95afd3f --- /dev/null +++ b/build-recipe-kiwi @@ -0,0 +1,469 @@ +# +# KIWI specific functions. Handle with care. +# +# (C) 2014 SUSE, Inc +# + + +############################################################ + +# post scriptlet generation functions + +kiwi_post_oem() { + cat <<-EOF + echo "compressing oem images... " + cd /$TOPDIR/KIWI-oem + # do not store compressed file _and_ uncompressed one + [ -e "$imageout.gz" ] && rm -f "$imageout" + if [ -e "$imageout.iso" ]; then + echo "take iso file and create sha256..." + mv "$imageout.iso" "/$TOPDIR/KIWI/$imageout$buildnum.iso" + pushd /$TOPDIR/KIWI + if [ -x /usr/bin/sha256sum ]; then + /usr/bin/sha256sum "$imageout$buildnum.iso" > "$imageout$buildnum.iso.sha256" + fi + popd + fi + if [ -e "$imageout.install.iso" ]; then + echo "take install.iso file and create sha256..." + mv "$imageout.install.iso" "/$TOPDIR/KIWI/$imageout$buildnum.install.iso" + pushd /$TOPDIR/KIWI + if [ -x /usr/bin/sha256sum ]; then + /usr/bin/sha256sum "$imageout$buildnum.install.iso" > "$imageout$buildnum.install.iso.sha256" + fi + popd + fi + if [ -e "$imageout.qcow2" ]; then + mv "$imageout.qcow2" "/$TOPDIR/KIWI/$imageout$buildnum.qcow2" + pushd /$TOPDIR/KIWI + if [ -x /usr/bin/sha256sum ]; then + echo "Create sha256 file..." + /usr/bin/sha256sum "$imageout$buildnum.qcow2" > "$imageout$buildnum.qcow2.sha256" + fi + popd + fi + if [ -e "$imageout.raw.install.raw" ]; then + compress_tool="bzip2" + compress_suffix="bz2" + if [ -x /usr/bin/xz ]; then + # take xz to get support for sparse files + compress_tool="xz -2" + compress_suffix="xz" + fi + mv "$imageout.raw.install.raw" "/$TOPDIR/KIWI/$imageout$buildnum.raw.install.raw" + pushd /$TOPDIR/KIWI + echo "\$compress_tool raw.install.raw file..." + \$compress_tool "$imageout$buildnum.raw.install.raw" + if [ -x /usr/bin/sha256sum ]; then + echo "Create sha256 file..." + /usr/bin/sha256sum "$imageout$buildnum.raw.install.raw.\${compress_suffix}" > "$imageout$buildnum.raw.install.raw.\${compress_suffix}.sha256" + fi + popd + fi + if [ -e "$imageout.raw" ]; then + compress_tool="bzip2" + compress_suffix="bz2" + if [ -x /usr/bin/xz ]; then + # take xz to get support for sparse files + compress_tool="xz -2" + compress_suffix="xz" + fi + mv "$imageout.raw" "/$TOPDIR/KIWI/$imageout$buildnum.raw" + pushd /$TOPDIR/KIWI + echo "\$compress_tool raw file..." + \$compress_tool "$imageout$buildnum.raw" + if [ -x /usr/bin/sha256sum ]; then + echo "Create sha256 file..." + /usr/bin/sha256sum "$imageout$buildnum.raw.\${compress_suffix}" > "$imageout$buildnum.raw.\${compress_suffix}.sha256" + fi + popd + fi + EOF +} + +kiwi_post_vmx() { + cat <<-EOF + echo "compressing vmx images... " + cd /$TOPDIR/KIWI-vmx + compress_tool="bzip2" + compress_suffix="bz2" + if [ -x /usr/bin/xz ]; then + # take xz to get support for sparse files + compress_tool="xz -2" + compress_suffix="xz" + fi + VMXFILES="" + SHAFILES="" + for suffix in "ovf" "qcow2" "ova" "tar" "vhdfixed" "vhd"; do + if [ -e "$imageout.\$suffix" ]; then + if [ "\$suffix" == "vhd" -o "\$suffix" == "vhdfixed" ]; then + mv "$imageout.\$suffix" "/$TOPDIR/KIWI/$imageout$buildnum.\$suffix" + pushd /$TOPDIR/KIWI + echo "\$compress_tool \$suffix file..." + \$compress_tool "$imageout$buildnum.\$suffix" + SHAFILES="\$SHAFILES $imageout$buildnum.\$suffix.\${compress_suffix}" + popd + elif [ "\$suffix" == "ovf" ]; then + mv "$imageout.\${suffix}/$imageout.\$suffix" "/$TOPDIR/KIWI/$imageout$buildnum.\$suffix" + SHAFILES="\$SHAFILES $imageout$buildnum.\$suffix" + else + mv "$imageout.\$suffix" "/$TOPDIR/KIWI/$imageout$buildnum.\$suffix" + SHAFILES="\$SHAFILES $imageout$buildnum.\$suffix" + fi + fi + done + # This option has a number of format parameters + for i in "$imageout.vmx" "$imageout.vmdk" "$imageout-disk*.vmdk"; do + test -e \$i && VMXFILES="\$VMXFILES \$i" + done + # take raw files as fallback + if [ -n "\$VMXFILES" ]; then + tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx.tar.bz2" \$VMXFILES + SHAFILES="\$SHAFILES $imageout$buildnum-vmx.tar.bz2" + elif [ -z "\$SHAFILES" -a -e "$imageout.raw" ]; then + mv "$imageout.raw" "/$TOPDIR/KIWI/$imageout$buildnum-vmx.raw" + pushd /$TOPDIR/KIWI + echo "\$compress_tool raw file..." + \$compress_tool "$imageout$buildnum-vmx.raw" + SHAFILES="\$SHAFILES $imageout$buildnum-vmx.raw.\${compress_suffix}" + popd + fi + if [ -e "$imageout.box" ]; then + tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx-box.tar.bz2" $imageout.box $imageout.json + SHAFILES="\$SHAFILES $imageout$buildnum-vmx-box.tar.bz2" + fi + if [ -e "$imageout.xenconfig" ]; then + tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx.tar.bz2" $imageout.xenconfig $imageout.raw initrd-* + SHAFILES="\$SHAFILES $imageout$buildnum-vmx.tar.bz2" + fi + # FIXME: do we need a single .raw file in any case ? + + cd /$TOPDIR/KIWI + if [ -n "\$SHAFILES" -a -x /usr/bin/sha256sum ]; then + for i in \$SHAFILES; do + echo "Create sha256 file..." + /usr/bin/sha256sum "\$i" > "\$i.sha256" + done + fi + tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-raw.tar.bz2" \ + --exclude="$imageout.iso" --exclude="$imageout.raw" --exclude="$imageout.qcow2" * + cd /$TOPDIR/KIWI + if [ -x /usr/bin/sha256sum ]; then + /usr/bin/sha256sum "$imageout$buildnum-raw.tar.bz2" > "$imageout$buildnum-raw.tar.bz2.sha256" + fi + EOF +} + +kiwi_post_xen() { + cat <<-EOF + echo "compressing xen images... " + cd /$TOPDIR/KIWI-xen + # do not store compressed file _and_ uncompressed one + [ -e "$imageout.gz" ] && rm -f "$imageout" + tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-xen.tar.bz2" \ + `grep ^kernel $imageout.xenconfig | cut -d'"' -f2` \ + `grep ^ramdisk $imageout.xenconfig | cut -d'"' -f2` \ + initrd-* \ + "$imageout.xenconfig" \ + "$imageout" + if [ -x /usr/bin/sha256sum ]; then + echo "Create sha256 file..." + cd $TOPDIR/KIWI + /usr/bin/sha256sum "$imageout$buildnum-xen.tar.bz2" > "$imageout$buildnum-xen.tar.bz2.sha256" + fi + EOF +} + +kiwi_post_pxe() { + cat <<-EOF + echo "compressing pxe images... " + cd /$TOPDIR/KIWI-pxe + # do not store compressed file _and_ uncompressed one + [ -e "$imageout.gz" ] && rm -f "$imageout" + tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-pxe.tar.bz2" ${imageout}* initrd-* + if [ -x /usr/bin/sha256sum ]; then + echo "Create sha256 file..." + cd $TOPDIR/KIWI + /usr/bin/sha256sum "$imageout$buildnum-pxe.tar.bz2" > "$imageout$buildnum-pxe.tar.bz2.sha256" + fi + EOF +} + +kiwi_post_iso() { + cat <<-EOF + cd /$TOPDIR/KIWI-iso + for i in *.iso; do + mv "\$i" "/$TOPDIR/KIWI/\${i%.iso}$buildnum.iso" + done + if [ -x /usr/bin/sha256sum ]; then + echo "creating sha256 sum for iso images... " + cd $TOPDIR/KIWI + for i in *.iso; do + /usr/bin/sha256sum "\$i" > "\$i.sha256" + done + fi + EOF +} + +kiwi_post_tbz() { + cat <<-EOF + cd /$TOPDIR/KIWI-tbz + for i in *.tbz; do + file=\$(readlink -f "\$i") + [ -z "\$file" ] && echo readlink failed for $i + mv "\$file" "/$TOPDIR/KIWI/\${i%.tbz}$buildnum.tbz" + done + if [ -x /usr/bin/sha256sum ]; then + echo "creating sha256 sum for tar balls... " + cd $TOPDIR/KIWI + for i in *.tbz; do + /usr/bin/sha256sum "\$i" > "\$i.sha256" + done + fi + EOF +} + +kiwi_post_unknown() { + cat <<-EOF + echo "compressing unkown images... " + cd /$TOPDIR/KIWI-$imgtype + # do not store compressed file _and_ uncompressed one + [ -e "$imageout.gz" ] && rm -f "$imageout" + tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-$imgtype.tar.bz2" * + if [ -x /usr/bin/sha256sum ]; then + echo "Create sha256 file..." + cd /$TOPDIR/KIWI + /usr/bin/sha256sum "$imageout$buildnum-$imgtype.tar.bz2" > "$imageout$buildnum-$imgtype.tar.bz2.sha256" + fi + EOF +} + +############################################################ + +recipe_setup_kiwi() { + TOPDIR=/usr/src/packages + mkdir -p "$BUILD_ROOT$TOPDIR" + mkdir -p "$BUILD_ROOT$TOPDIR/OTHER" + mkdir -p "$BUILD_ROOT$TOPDIR/SOURCES" + mkdir -p "$BUILD_ROOT$TOPDIR/KIWI" + chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" + if test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then + mv "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ + else + if test -z "$LINKSOURCES" ; then + cp -dLR "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ + else + cp -lR "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ + fi + if test "$?" != 0 ; then + echo "source copy failed" + cleanup_and_exit 1 + fi + fi +} + +recipe_prepare_kiwi() { + : +} + +## obsolete with current kiwi versions, only needed for kiwi 3.01 version +run_suse_isolinux() { + for i in $BUILD_ROOT/$TOPDIR/KIWIROOT/main/* ; do + test -d "$i" || continue + i="${i##*/}" + test "$i" = scripts && continue + test "$i" != "${i%0}" && continue + chroot $BUILD_ROOT su -c "suse-isolinux $TOPDIR/KIWIROOT/main/$i $TOPDIR/KIWI/$i.iso" - $BUILD_USER + done +} + +build_kiwi_product() { + echo "running kiwi --create-instsource..." + # runs always as abuild user + mkdir -p "$BUILD_ROOT/$TOPDIR/KIWIROOT" + # XXX: again? + chroot "$BUILD_ROOT" chown -R abuild.abuild "$TOPDIR" + chroot "$BUILD_ROOT" rm -rf "$TOPDIR/KIWIROOT" + ver=`chroot "$BUILD_ROOT" su -c "/usr/sbin/kiwi --version | sed -n 's,.*kiwi version v\(.*\),\1,p'"` + test -n "$ver" || ver=`chroot "$BUILD_ROOT" su -c "/usr/sbin/kiwi --version | sed -n 's,.* vnr: \(.*\),\1,p'"` + if test "${ver:0:1}" == "3" ; then + # old style kiwi 3 builds + chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT -v --logfile terminal -p $TOPDIR/SOURCES --instsource-local --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true + test ${ver:2:2} == "01" && run_suse_isolinux + else + VERBOSE_OPTION="-v 2" + # broken kiwi version, not accepting verbose level + test "${ver:0:1}" == "4" -a "${ver:2:2}" -lt 90 && VERBOSE_OPTION="-v -v" + chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT $VERBOSE_OPTION --logfile terminal -p $TOPDIR/SOURCES --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true + fi + + # move created product to correct destination + for i in $BUILD_ROOT/$TOPDIR/KIWIROOT/main/* ; do + test -e "$i" || continue + f=${i##*/} + case $f in + *.iso) mv $i $BUILD_ROOT/$TOPDIR/KIWI/. ;; + *.packages) mv $i $BUILD_ROOT/$TOPDIR/OTHER/. ;; + *.report) mv $i $BUILD_ROOT/$TOPDIR/OTHER/. ;; + scripts) ;; + *0) ;; + *) test -d $i -a "$drop_repo" != true && mv $i $BUILD_ROOT/$TOPDIR/KIWI/. ;; + esac + done +} + +build_kiwi_appliance() { + if test -z "$RUNNING_IN_VM" ; then + # NOTE: this must be done with the outer system, because it loads the dm-mod kernel modules, which needs to fit to the kernel. + echo "starting device mapper for kiwi..." + test -x /etc/init.d/boot.device-mapper && /etc/init.d/boot.device-mapper start + fi + RUN_BUNDLE="true" + for imgtype in $imagetype ; do + echo "running kiwi --prepare for $imgtype..." + # Do not use $BUILD_USER here, since we always need root permissions + chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && kiwi --prepare $TOPDIR/SOURCES --logfile terminal --root $TOPDIR/KIWIROOT-$imgtype $KIWI_PARAMETERS" - root < /dev/null || cleanup_and_exit 1 + echo "running kiwi --create for $imgtype..." + mkdir -p $BUILD_ROOT/$TOPDIR/KIWI-$imgtype + chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && kiwi --create $TOPDIR/KIWIROOT-$imgtype --logfile terminal --type $imgtype -d $TOPDIR/KIWI-$imgtype $KIWI_PARAMETERS" - root < /dev/null || cleanup_and_exit 1 + rm -rf "/$TOPDIR/KIWI.bundle" + if chroot $BUILD_ROOT su -c "kiwi --bundle-build $TOPDIR/KIWI-$imgtype -d /$TOPDIR/KIWI.bundle/ --bundle-id Build$RELEASE" - root < /dev/null; then + mv "$BUILD_ROOT/$TOPDIR/KIWI.bundle/"* "$BUILD_ROOT/$TOPDIR/KIWI/" || cleanup_and_exit 1 + rmdir "$BUILD_ROOT/$TOPDIR/KIWI.bundle" + unset RUN_BUNDLE + fi + done + BUILD_SUCCEEDED=true + + if test -z "$RUN_BUNDLE"; then + # new kiwi has bundled our result already :) + return + fi + + # + # Legacy bundling code for kiwi version below 5.06.106 + # + + # create tar.gz of images, in case it makes sense + buildnum= + if test -n "$RELEASE"; then + buildnum="-Build$RELEASE" + fi + imagearch=`uname -m` + imageout="$imagename.$imagearch-$imageversion" + for imgtype in $imagetype ; do + case "$imgtype" in + oem) kiwi_post_oem > $BUILD_ROOT/kiwi_post.sh ;; + vmx) kiwi_post_vmx > $BUILD_ROOT/kiwi_post.sh ;; + xen) kiwi_post_xen > $BUILD_ROOT/kiwi_post.sh ;; + pxe) kiwi_post_pxe > $BUILD_ROOT/kiwi_post.sh ;; + iso) kiwi_post_iso > $BUILD_ROOT/kiwi_post.sh ;; + tbz) kiwi_post_tbz > $BUILD_ROOT/kiwi_post.sh ;; + *) kiwi_post_unknown > $BUILD_ROOT/kiwi_post.sh ;; + esac + cat >> $BUILD_ROOT/kiwi_post.sh <<-EOF + cd /$TOPDIR/KIWI-$imgtype + if [ -e "$imageout.channel" ]; then + echo "Found kiwi channel list file, exporting as well..." + cp "$imageout.channel" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.channel" + fi + if [ -e "$imageout.packages" ]; then + echo "Found kiwi package list file, exporting as well..." + cp "$imageout.packages" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.packages" + fi + if [ -e "$imageout.verified" ]; then + echo "Found rpm verification report, exporting as well..." + cp "$imageout.verified" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.verified" + fi + EOF + chroot $BUILD_ROOT su -c "sh -e /kiwi_post.sh" || cleanup_and_exit 1 + rm -f $BUILD_ROOT/kiwi_post.sh + done +} + +recipe_build_kiwi() { + imagetype=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE imagetype) + imagename=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE filename) + imageversion=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE version) + drop_repo=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE drop_repository) + + # prepare rpms as source and createrepo on the repositories + ln -sf $TOPDIR/SOURCES/repos $BUILD_ROOT/repos + cd $BUILD_ROOT/$TOPDIR/SOURCES/repos + for r in */* ; do + test -L $r && continue + test -d $r || continue + repo="$TOPDIR/SOURCES/repos/$r/" + # create compatibility link for old kiwi versions + rc="${r//:/:/}" + if test "$rc" != "$r" ; then + rl="${rc//[^\/]}" + rl="${rl//?/../}" + mkdir -p "${rc%/*}" + ln -s $rl$r "${rc%/*}/${rc##*/}" + repo="$TOPDIR/SOURCES/repos/${rc%/*}/${rc##*/}/" + fi + if test "$imagetype" != product -a "$DO_INIT" != "false" ; then + echo "creating repodata for $repo" + if chroot $BUILD_ROOT createrepo --no-database --simple-md-filenames --help >/dev/null 2>&1 ; then + chroot $BUILD_ROOT createrepo --no-database --simple-md-filenames "$repo" + else + chroot $BUILD_ROOT createrepo "$repo" + fi + fi + done + + # unpack root tar + for t in $BUILD_ROOT/$TOPDIR/SOURCES/root.tar* ; do + test -f $t || continue + mkdir -p $BUILD_ROOT/$TOPDIR/SOURCES/root + chroot $BUILD_ROOT tar -C $TOPDIR/SOURCES/root -xf "$TOPDIR/SOURCES/${t##*/}" + done + + # fix script permissions + chmod a+x $BUILD_ROOT/$TOPDIR/SOURCES/*.sh 2>/dev/null + + # unpack tar files in image directories + if test -d $BUILD_ROOT/$TOPDIR/SOURCES/images ; then + ( + cd $BUILD_ROOT/$TOPDIR/SOURCES/images + for r in */* ; do + test -L $r && continue + test -d $r || continue + for t in $r/root.tar* ; do + test -f $t || continue + mkdir -p $r/root + chroot $BUILD_ROOT tar -C $TOPDIR/SOURCES/images/$r/root -xf "$TOPDIR/SOURCES/images/$r/${t##*/}" + done + # fix script permissions + chmod a+x $BUILD_ROOT/$TOPDIR/SOURCES/images/$r/*.sh 2>/dev/null + # create compatibility link for old kiwi versions + rc="${r//:/:/}" + if test "$rc" != "$r" ; then + rl="${rc//[^\/]}" + rl="${rl//?/../}" + mkdir -p "${rc%/*}" + ln -s $rl$r "${rc%/*}/${rc##*/}" + fi + done + ) + fi + + rm -f $BUILD_ROOT/$TOPDIR/SOURCES/config.xml + ln -s $RECIPEFILE $BUILD_ROOT/$TOPDIR/SOURCES/config.xml + + if test "$imagetype" = product ; then + build_kiwi_product + else + build_kiwi_appliance + fi + + # Hook for running post kiwi build scripts like QA scripts if installed + if test -x $BUILD_ROOT/usr/lib/build/kiwi_post_run ; then + chroot $BUILD_ROOT su -c /usr/lib/build/kiwi_post_run || cleanup_and_exit 1 + fi +} + +recipe_resultdirs_kiwi() { + echo KIWI +} diff --git a/build-recipe-livebuild b/build-recipe-livebuild new file mode 100644 index 0000000..6ae7046 --- /dev/null +++ b/build-recipe-livebuild @@ -0,0 +1,222 @@ +# +# Debian live-build specific functions. +# +# Author: Jan Blunck +# +# This file is part of build. +# +# build is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# build is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with build. If not, see . +# + +recipe_setup_livebuild() { + + TOPDIR=/usr/src/packages + rm -rf "$BUILD_ROOT$TOPDIR" + for i in OTHER SOURCES LIVEBUILD_ROOT ; do + mkdir -p "$BUILD_ROOT$TOPDIR/$i" + done + chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" + if test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then + mv "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ + else + cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ + fi +} + +recipe_prepare_livebuild() { + : +} + +createrepo_debian() { + local DIR=${1} + local ARCH=${2} + local DIST=${3} + + if [ -z "${DIR}" -o ! -d ${DIR} -o ${DIR} = ${DIR##${BUILD_ROOT}} ] ; then + return + fi + + pushd ${DIR} >/dev/null + + # cleanup existing repository files + rm -f Packages Packages.gz Release + rm -fr dists + + mkdir -p dists/${DIST} + # Suite is symlinked to Codename + ln -s ${DIST} dists/stable + + # create Packages and Sources files + mkdir -p dists/${DIST}/main/binary-${ARCH} + mkdir -p dists/${DIST}/main/source + cat > ${BUILD_ROOT}/.createrepo_debian.tmp.sh <<-EOF + cd /.build.binaries || exit 1 + dpkg-scanpackages -m . > dists/${DIST}/main/binary-${ARCH}/Packages + gzip -c9 < dists/${DIST}/main/binary-${ARCH}/Packages \ + > dists/${DIST}/main/binary-${ARCH}/Packages.gz + dpkg-scansources . > dists/${DIST}/main/source/Sources + gzip -c9 dists/${DIST}/main/source/Sources \ + > dists/${DIST}/main/source/Sources.gz + EOF + chroot $BUILD_ROOT su -c "sh /.createrepo_debian.tmp.sh" - root + local RESULT=$? + rm -f $BUILD_ROOT/.createrepo_debian.tmp.sh + [ "${RESULT}" != 0 ] && return + + # create Release file + pushd dists/${DIST} >/dev/null + cat > Release <<-EOF + Origin: Debian + Label: Debian + Suite: stable + Version: 7.1 + Codename: ${DIST} + Date: Sat, 15 Jun 2013 10:55:26 UTC + Description: Debian repository created by build-recipe-livebuild + Components: main + EOF + echo "SHA256:" >> Release + for file in main/binary-${ARCH}/Packages* ; do + local SUM=( $(sha256sum ${file}) ) + local SIZE=$(stat -c '%s' ${file}) + echo " ${SUM} ${SIZE} ${file}" >> Release + done + for file in main/source/Sources* ; do + local SUM=( $(sha256sum ${file}) ) + local SIZE=$(stat -c '%s' ${file}) + echo " ${SUM} ${SIZE} ${file}" >> Release + done + popd >/dev/null + + # TODO: this is missing the signature with the private key + + popd >/dev/null +} + +# This script expects that the $BUILD_ROOT is a Debian installation with +# live-build already installed! +# +# Variables: +# $BUILD_ROOT the Debian chroot +# $TOPDIR/SOURCES includes the live-build config tarball +# $TOPDIR/$LIVEBUILD_ROOT where live-build will be called +# $RECIPEFILE the name of the live-build config tarball + +recipe_build_livebuild() { + local ARCH=$(chroot $BUILD_ROOT su -c "dpkg-architecture -qDEB_BUILD_ARCH") + local DIST=$(chroot $BUILD_ROOT su -c "lsb_release --codename" | awk '{ print $2 }') + local LIVEBUILD_ROOT="LIVEBUILD_ROOT" + + [ -z "${ARCH}" -o -z "${DIST}" ] && cleanup_and_exit 1 + + test -d $BUILD_ROOT/.build.binaries || cleanup_and_exit 1 + if test "$DO_INIT" = true -o ! -d "$BUILD_ROOT/.build.binaries/dists" ; then + echo "creating repository metadata..." + createrepo_debian $BUILD_ROOT/.build.binaries ${ARCH} ${DIST} + fi + + # Write our default configuration variables + mkdir -p $BUILD_ROOT/etc/live + cat > $BUILD_ROOT/etc/live/build.conf <<-EOF + LB_DEBIAN_INSTALLER_DISTRIBUTION="${DIST}" + LB_DISTRIBUTION="${DIST}" + LB_PARENT_DISTRIBUTION="${DIST}" + LB_PARENT_DEBIAN_INSTALLER_DISTRIBUTION="${DIST}" + LB_PARENT_MIRROR_BOOTSTRAP="file:/.build.binaries/" + LB_PARENT_MIRROR_CHROOT="file:/.build.binaries/" + LB_PARENT_MIRROR_CHROOT_SECURITY="file:/.build.binaries/" + LB_PARENT_MIRROR_BINARY="file:/.build.binaries/" + LB_PARENT_MIRROR_BINARY_SECURITY="file:/.build.binaries/" + LB_PARENT_MIRROR_DEBIAN_INSTALLER="file:/.build.binaries/" + LB_MIRROR_BOOTSTRAP="file:/.build.binaries/" + LB_MIRROR_CHROOT="file:/.build.binaries/" + LB_MIRROR_CHROOT_SECURITY="file:/.build.binaries/" + LB_MIRROR_BINARY="file:/.build.binaries/" + LB_MIRROR_BINARY_SECURITY="file:/.build.binaries/" + LB_MIRROR_DEBIAN_INSTALLER="file:/.build.binaries/" + LB_APT_SECURE="false" + EOF + + # Expand live-build configuration to $TOPDIR/$LIVEBUILD_ROOT + echo "Expanding live-build configuration" + tar -xvf $BUILD_ROOT/$TOPDIR/SOURCES/$RECIPEFILE \ + -C $BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT || cleanup_and_exit 1 + + # Skip top-level directory if it matches recipe name, ... + local files=($BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/*) + # ... but ignore some well known names + files=(${files[@]%%*/auto}) + files=(${files[@]%%*/config}) + files=(${files[@]%%*/local}) + if [ ${#files[@]} -eq 1 ] && \ + [ -d $BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/${RECIPEFILE%.livebuild} ] + then + LIVEBUILD_ROOT="LIVEBUILD_ROOT/${RECIPEFILE%.livebuild}" + fi + + # Sanity check to not configure archives inside configuration + files=($BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/config/archives/*) + [ ${#files[@]} -gt 0 ] && cleanup_and_exit 1 + + # TODO: Add the repository public key + # cp ... $BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/config/archives/debian.key + + if [ -x $BUILD_ROOT/usr/lib/build/livebuild_pre_run ] ; then + echo "Running OBS build livebuild_pre_run hook" + chroot $BUILD_ROOT su -c "/usr/lib/build/livebuild_pre_run" - root \ + < /dev/null || cleanup_and_exit 1 + fi + + # TODO: this might move to lb auto/config file + if [ -f $BUILD_ROOT/$TOPDIR/SOURCES/livebuild_pre_run ] ; then + cp $BUILD_ROOT/$TOPDIR/SOURCES/livebuild_pre_run \ + $BUILD_ROOT/.build.livebuild_pre_run + chmod +x $BUILD_ROOT/.build.livebuild_pre_run + echo "Running package livebuild_pre_run hook" + chroot $BUILD_ROOT su -c "/.build.livebuild_pre_run" - root \ + < /dev/null || cleanup_and_exit 1 + fi + + chroot $BUILD_ROOT su -c "cd $TOPDIR/$LIVEBUILD_ROOT && lb build" - root \ + < /dev/null || cleanup_and_exit 1 + + # Move created product to destination + for i in $BUILD_ROOT/$TOPDIR/$LIVEBUILD_ROOT/* ; do + test -f "$i" || continue + case "${i##*/}" in + *.iso) + # all created files share the same name without suffix + mv ${i%%.iso}.* $BUILD_ROOT/$TOPDIR/OTHER/. + BUILD_SUCCEEDED=true + ;; + *) + ;; + esac + done + + # Fail the build if no ISO was created + if [ -z "$(ls $BUILD_ROOT/$TOPDIR/OTHER/*.iso)" ] ; then + echo "No ISO image found" + cleanup_and_exit 1 + fi +} + +recipe_resultdirs_livebuild() { + # our results are already in OTHER + : +} + +# Local Variables: +# mode: Shell-script +# End: diff --git a/build-recipe-mock b/build-recipe-mock new file mode 100644 index 0000000..2aa387a --- /dev/null +++ b/build-recipe-mock @@ -0,0 +1,83 @@ +# +# mock specific functions. +# +# (C) 2014 SUSE, Inc +# + +recipe_setup_mock() { + recipe_setup_spec "$@" +} + +recipe_prepare_mock() { + recipe_prepare_spec "$@" +} + +recipe_build_mock() { + test -d $BUILD_ROOT/.build.binaries || cleanup_and_exit 1 + if test "$DO_INIT" = true -o ! -d "$BUILD_ROOT/.build.binaries/repodata" ; then + echo "creating repository for mock..." + chroot $BUILD_ROOT createrepo --no-database --basedir /.build.binaries -o /.build.binaries /.build.binaries + fi + MOCK_CHROOT_SETUP_CMD="$(queryconfig --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" substitute mock:chroot_setup_cmd)" + test -z "$MOCK_CHROOT_SETUP_CMD" && MOCK_CHROOT_SETUP_CMD="groupinstall buildsys-build" + echo "config_opts['root'] = 'build'" > $BUILD_ROOT/etc/mock/build.cfg + echo "config_opts['target_arch'] = '${BUILD_ARCH%%:*}'" >> $BUILD_ROOT/etc/mock/build.cfg + echo "config_opts['plugin_conf']['ccache_enable'] = False" >> $BUILD_ROOT/etc/mock/build.cfg + echo "config_opts['chroot_setup_cmd'] = '$MOCK_CHROOT_SETUP_CMD'" >> $BUILD_ROOT/etc/mock/build.cfg + cat >> $BUILD_ROOT/etc/mock/build.cfg <<-'EOF' + config_opts['yum.conf'] = """ + [main] + cachedir=/var/cache/yum + debuglevel=1 + reposdir=/dev/null + logfile=/var/log/yum.log + obsoletes=1 + gpgcheck=0 + assumeyes=1 + syslog_ident=mock + syslog_device= + + [build] + name=build + baseurl=file:///.build.binaries + """ + EOF + touch $BUILD_ROOT/etc/resolv.conf + BUILD_SUCCEEDED=false + echo "building src rpm..." + MOCK_INIT_ARG= + test "$DO_INIT" = true || MOCK_INIT_ARG=--no-clean + if chroot $BUILD_ROOT /usr/bin/mock -r build $MOCK_INIT_ARG --buildsrpm --spec "$TOPDIR/SOURCES/$RECIPEFILE" --sources "$TOPDIR/SOURCES" ; then + BUILT_SRPM= + for i in "$BUILD_ROOT/var/lib/mock/build/result/"*src.rpm ; do + test -s "$i" && BUILT_SRPM="${i##*/}" + done + if test -n "$BUILT_SRPM" ; then + mkdir -p "$BUILD_ROOT/$TOPDIR/SRPMS" + mv "$BUILD_ROOT/var/lib/mock/build/result/$BUILT_SRPM" "$BUILD_ROOT/$TOPDIR/SRPMS/$BUILT_SRPM" + echo "building binary rpms..." + if chroot $BUILD_ROOT /usr/bin/mock -v -r build --rebuild --no-clean "$TOPDIR/SRPMS/$BUILT_SRPM" ; then + BUILD_SUCCEEDED=true + # move result over to TOPDIR + rm -f "$TOPDIR/SRPMS/$BUILT_SRPM" + for i in "$BUILD_ROOT/var/lib/mock/build/result/"*.rpm ; do + a="${i%.rpm}" + a="${a##*/}" + a="${a##*.}" + if test "$a" = src -o "$a" = nosrc ; then + mkdir -p "$BUILD_ROOT/$TOPDIR/SRPMS" + mv $i "$BUILD_ROOT/$TOPDIR/SRPMS/." + else + mkdir -p "$BUILD_ROOT/$TOPDIR/RPMS/$a" + mv $i "$BUILD_ROOT/$TOPDIR/RPMS/$a/." + fi + done + fi + fi + fi +} + +recipe_resultdirs_mock() { + echo RPMS SRPMS +} + diff --git a/build-recipe-preinstallimage b/build-recipe-preinstallimage new file mode 100644 index 0000000..2dce153 --- /dev/null +++ b/build-recipe-preinstallimage @@ -0,0 +1,62 @@ +# +# preinstall specific functions. +# +# (C) 2014 SUSE, Inc +# + +recipe_setup_preinstallimage() { + # should never be called + cleanup_and_exit 1 +} + +recipe_prepare_preinstallimage() { + : +} + +recipe_build_preinstallimage() { + echo "creating preinstall image..." + test -d "$BUILD_ROOT/.preinstall_image" || cleanup_and_exit 1 + cd $BUILD_ROOT || cleanup_and_exit 1 + TAR="tar" + if test -x /usr/bin/bsdtar; then + TAR="/usr/bin/bsdtar --format gnutar --chroot" + fi + TOPDIRS= + for DIR in .* * ; do + case "$DIR" in + .|..) continue ;; + .build.kernel*) ;; # to be packaged + .build.initrd*) ;; # to be packaged + .build*) continue ;; + .preinstallimage*) continue ;; + .srcfiles*) continue ;; + .pkgs) continue ;; + .rpm-cache) continue ;; + installed-pkg) continue ;; + proc|sys) continue ;; + esac + TOPDIRS="$TOPDIRS $DIR" + done + if ! $TAR -czf .preinstallimage.$$.tar.gz --one-file-system $TOPDIRS ; then + cleanup_and_exit 1 + fi + echo "image created." + TOPDIR=/usr/src/packages + mkdir -p $BUILD_ROOT$TOPDIR/OTHER + rm -f $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.info + for PKG in $BUILD_ROOT/.preinstall_image/* ; do + PKG=${PKG##*/} + read PKG_HDRMD5 PKGID < $BUILD_ROOT/.preinstall_image/$PKG + test -n "$PKG_HDRMD5" || cleanup_and_exit 1 + echo "$PKG_HDRMD5 $PKG" >> $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.info + done + mv $BUILD_ROOT/.preinstallimage.$$.tar.gz $BUILD_ROOT$TOPDIR/OTHER/preinstallimage.tar.gz + rm -f $BUILD_ROOT/.build.packages + ln -s ${TOPDIR#/} $BUILD_ROOT/.build.packages + test -d "$SRCDIR" && cd "$SRCDIR" +} + +recipe_resultdirs_preinstallimage() { + : +} + diff --git a/build-recipe-spec b/build-recipe-spec new file mode 100644 index 0000000..b120f02 --- /dev/null +++ b/build-recipe-spec @@ -0,0 +1,218 @@ +# +# spec specific functions. +# +# (C) 2014 SUSE, Inc +# + +recipe_setup_spec() { + TOPDIR=`chroot $BUILD_ROOT su -c "rpm --eval '%_topdir'" - $BUILD_USER` + if test -z "$TOPDIR"; then + echo "Error: TOPDIR empty" + cleanup_and_exit 1 + fi + rm -rf "$BUILD_ROOT$TOPDIR" + for i in BUILD RPMS/`uname -m` RPMS/i386 RPMS/noarch SOURCES SPECS SRPMS BUILDROOT OTHER ; do + mkdir -p $BUILD_ROOT$TOPDIR/$i + done + chown -R "$ABUILD_UID:$ABUILD_GID" "$BUILD_ROOT$TOPDIR" + mkdir -p $BUILD_ROOT$TOPDIR/SOURCES + cp -p "$MYSRCDIR"/* $BUILD_ROOT$TOPDIR/SOURCES/ +} + +recipe_prepare_spec() { + args=() + if test -n "$RELEASE"; then + args=(--release "$RELEASE") + fi + + # fixup specfile + CHANGELOGARGS= + test -n "$CHANGELOG" -a -f "$BUILD_ROOT/.build-changelog" && CHANGELOGARGS="--changelog $BUILD_ROOT/.build-changelog" + substitutedeps "${args[@]}" --root "$BUILD_ROOT" --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" $CHANGELOGARGS "$BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE" "$BUILD_ROOT/.spec.new" || cleanup_and_exit 1 + + # fix rpmrc if we are compiling for i686 + test -f $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 && mv $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 $BUILD_ROOT/usr/lib/rpm/rpmrc + if test -e $BUILD_ROOT/usr/lib/rpm/rpmrc -a "$BUILD_ARCH" != "${BUILD_ARCH#i686}" ; then + mv $BUILD_ROOT/usr/lib/rpm/rpmrc $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 + sed -e 's/^buildarchtranslate: athlon.*/buildarchtranslate: athlon: i686/' -e 's/^buildarchtranslate: i686.*/buildarchtranslate: i686: i686/' < $BUILD_ROOT/usr/lib/rpm/rpmrc_i586 > $BUILD_ROOT/usr/lib/rpm/rpmrc + fi + + # extract macros from configuration + queryconfig rawmacros --dist "$BUILD_DIST" --archpath "$BUILD_ARCH" --configdir "$CONFIG_DIR" > $BUILD_ROOT/root/.rpmmacros + if test -n "$BUILD_DEBUG" ; then + echo ' +%prep %{?!__debug_package:%{?_build_create_debug:%?_build_insert_debug_package}}%%prep +%package %{?!__debug_package:%{?_build_create_debug:%?_build_insert_debug_package}}%%package +%_build_insert_debug_package \ +%global __debug_package 1 \ +%undefine _enable_debug_packages \ +%debug_package + +' >> $BUILD_ROOT/root/.rpmmacros + fi + + if test -n "$BUILD_JOBS" ; then + cat >> $BUILD_ROOT/root/.rpmmacros <<-EOF + %jobs $BUILD_JOBS + %_smp_mflags -j$BUILD_JOBS + EOF + fi + test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/.rpmmacros $BUILD_ROOT/home/abuild/.rpmmacros + + # extract optflags from configuration + queryconfig --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" optflags ${BUILD_DEBUG:+debug} > $BUILD_ROOT/root/.rpmrc + test $BUILD_USER = abuild && cp -p $BUILD_ROOT/root/.rpmrc $BUILD_ROOT/home/abuild/.rpmrc + + if test -z "$ABUILD_TARGET"; then + ABUILD_TARGET=$(queryconfig target --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH" ) + test -z "$ABUILD_TARGET" || echo "build target is $ABUILD_TARGET" + fi + + # report specfile changes + if test -f $BUILD_ROOT/.spec.new ; then + if ! cmp -s $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE $BUILD_ROOT/.spec.new ; then + echo ----------------------------------------------------------------- + echo "I have the following modifications for $RECIPEFILE:" + sed -e "/^%changelog/q" $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE > $BUILD_ROOT/.spec.t1 + sed -e "/^%changelog/q" $BUILD_ROOT/.spec.new > $BUILD_ROOT/.spec.t2 + diff $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2 + rm -f $BUILD_ROOT/.spec.t1 $BUILD_ROOT/.spec.t2 + mv $BUILD_ROOT/.spec.new $BUILD_ROOT$TOPDIR/SOURCES/$RECIPEFILE + else + rm -f $BUILD_ROOT/.spec.new + fi + fi +} + +recipe_build_spec() { + test -z "$BUILD_RPM_BUILD_STAGE" && BUILD_RPM_BUILD_STAGE=-ba + + rpmbuild=rpmbuild + test -x $BUILD_ROOT/usr/bin/rpmbuild || rpmbuild=rpm + + # XXX: move _srcdefattr to macro file? + rpmbopts=("$BUILD_RPM_BUILD_STAGE" "--define" "_srcdefattr (-,root,root)") + if test "$DO_CHECKS" != true ; then + rpmbopts[${#rpmbopts[@]}]="--nocheck" + fi + if test "$rpmbuild" == "rpmbuild" ; then + # use only --nosignature for rpm v4 + rpmbopts[${#rpmbopts[@]}]="--nosignature" + fi + if test -n "$ABUILD_TARGET" ; then + rpmbopts[${#rpmbopts[@]}]="--target=$ABUILD_TARGET" + fi + if test -n "$BUILD_DEBUG" ; then + rpmbopts[${#rpmbopts[@]}]='--define' + rpmbopts[${#rpmbopts[@]}]="_build_create_debug 1" + fi + if test -n "$DISTURL" ; then + rpmbopts[${#rpmbopts[@]}]='--define' + rpmbopts[${#rpmbopts[@]}]="disturl $DISTURL" + fi + if test -n "$RSYNCDONE" ; then + rpmbopts[${#rpmbopts[@]}]='--define' + rpmbopts[${#rpmbopts[@]}]="RSYNCDONE 1" + fi + + # su involves a shell which would require even more + # complicated quoting to bypass than this + toshellscript $rpmbuild \ + "${definesnstuff[@]}" \ + "${rpmbopts[@]}" \ + "$TOPDIR/SOURCES/$RECIPEFILE" \ + > $BUILD_ROOT/.build.command + chmod 755 $BUILD_ROOT/.build.command + check_exit + if test -n "$RUN_SHELL"; then + chroot $BUILD_ROOT su - + else + chroot $BUILD_ROOT su -c /.build.command - $BUILD_USER < /dev/null && BUILD_SUCCEEDED=true + fi +} + +recipe_resultdirs_spec() { + echo RPMS SRPMS +} + +recipe_unpack_srcrpm() { + test -n "$LIST_STATE" || echo "processing src rpm $SRCDIR/$RECIPEFILE ..." + MYSRCDIR="$BUILD_ROOT/.build-srcdir" + rm -rf "$MYSRCDIR" + mkdir -p "$MYSRCDIR" + cd $MYSRCDIR || cleanup_and_exit 1 + $BUILD_DIR/unrpm -q $SRCDIR/$RECIPEFILE || { + echo "could not unpack $RECIPEFILE." + cleanup_and_exit 1 + } + for RECIPEFILE in *.spec ; do : ; done +} + +# post build functions... move somewhere else? + +recipe_check_file_owners() { + echo "... checking for files with abuild user/group" + BADFILE= + while read un gn fn ; do + if test "$un" = abuild -o "$gn" = abuild -o "$un" = ${ABUILD_UID} -o "$gn" = ${ABUILD_GID} ; then + echo " $un $gn $fn" + BADFILE=true + fi + done < <(rpm -qp --qf '[%{FILEUSERNAME} %{FILEGROUPNAME} %{FILENAMES}\n]' $RPMS) + if test -n "$BADFILE" ; then + echo "please fix your filelist (e.g. add defattr)" + cleanup_and_exit 1 + fi +} + +recipe_run_rpmlint() { + if ! test -x "$BUILD_ROOT/opt/testing/bin/rpmlint" ; then + return + fi + LINT_RPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/RPMS \ + \( -name "*-debuginfo-*" -o -name "*-debugsource-*" \ + -o -name "*-32bit-*" -o -name "*-64bit-*" \ + -o -name "*-x86-*" -o -name "*-ia32-*" \) -prune \ + -o -type f -name '*.rpm' -print)) + SRPM_FILE_LIST=($(find $BUILD_ROOT/$TOPDIR/SRPMS -type f -name "*.rpm")) + echo + echo "RPMLINT report:" + echo "===============" + rpmlint_logfile=$TOPDIR/OTHER/rpmlint.log + rm -f "$BUILD_ROOT$rpmlint_logfile" + ret=0 + mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null + chroot $BUILD_ROOT su -s /opt/testing/bin/rpmlint "$BUILD_USER" -- \ + --info ${LINT_RPM_FILE_LIST[*]#$BUILD_ROOT} \ + ${SRPM_FILE_LIST[*]#$BUILD_ROOT} > "$BUILD_ROOT$rpmlint_logfile" || ret=1 + cat "$BUILD_ROOT$rpmlint_logfile" + echo + umount -n $BUILD_ROOT/proc 2>/dev/null || true + if test "$ret" = 1 ; then + cleanup_and_exit 1 + fi +} + +recipe_compare_oldpackages() { + if test -x "$BUILD_ROOT/usr/lib/build/same-build-result.sh" ; then + echo "... comparing built packages with the former built" + mount -n -tproc none $BUILD_ROOT/proc 2> /dev/null + if chroot $BUILD_ROOT /usr/lib/build/same-build-result.sh /.build.oldpackages "$TOPDIR/RPMS" "$TOPDIR/SRPMS"; then + chroot $BUILD_ROOT touch /.build/.same_result_marker + # XXX: dirty build service hack. fix bs_worker. Search for + # 'same_result_marker' for traces of a first try to get rid of this + if test -n "$REASON" -a -n "$DISTURL" ; then + exitcode=2 + fi + fi + umount -n $BUILD_ROOT/proc 2>/dev/null || true + fi +} + +recipe_create_deltarpms() { + if test -x "$BUILD_ROOT/usr/bin/makedeltarpm" -a -x $BUILD_ROOT/usr/lib/build/mkdrpms ; then + echo "... creating delta rpms" + ds=("$BUILD_ROOT/$TOPDIR"/RPMS/* "$BUILD_ROOT$TOPDIR/SRPMS") + chroot $BUILD_ROOT /usr/lib/build/mkdrpms /.build.oldpackages "${ds[@]#$BUILD_ROOT}" + fi +} diff --git a/build-vm b/build-vm new file mode 100644 index 0000000..1981cbb --- /dev/null +++ b/build-vm @@ -0,0 +1,808 @@ +# +# VM specific functions for the build script +# +# (C) 2014 SUSE, Inc +# + +# defaults for vm_img_mkfs +vm_img_mkfs_ext4_options='-O ^has_journal,^huge_file,^resize_inode,sparse_super' +vm_img_mkfs_ext4_extra='-E lazy_itable_init,discard' +vm_img_mkfs_ext4="mkfs.ext4 -m 0 -q -F $vm_img_mkfs_ext4_options" +vm_img_tunefs_ext4='tune2fs -c 0' +vm_img_mkfs_ext3='mkfs.ext3 -m 0 -q -F' +vm_img_tunefs_ext3='tune2fs -c 0 -o journal_data_writeback' +vm_img_mkfs_ext2='mkfs.ext2 -m 0 -q -F' +vm_img_tunefs_ext2='tune2fs -c 0' +vm_img_mkfs_reiserfs='mkreiserfs -q -f' +vm_img_mkfs_btrfs='mkfs.btrfs' +vm_img_mkfs_xfs='mkfs.xfs -f' + +# guest visible swap device +VM_SWAPDEV=/dev/hda2 + +VM_TYPE= +VM_IMAGE= +VM_SWAP= +VM_KERNEL= +VM_INITRD= +VM_WORKER= +VM_SERVER= +VM_MEMSIZE= +VMDISK_ROOTSIZE=4096 +VMDISK_SWAPSIZE=1024 +VMDISK_FILESYSTEM= +VMDISK_MOUNT_OPTIONS=__default +VMDISK_CLEAN= + +# zvm specific? +VM_WORKER_NR= + +# kvm specific? +HUGETLBFSPATH= + +# emulator specific? +EMULATOR_SCRIPT= + +for i in ec2 emulator kvm lxc openstack qemu uml xen zvm ; do + . "$BUILD_DIR/build-vm-$i" +done + +VM_WATCHDOG= +VM_WATCHDOG_PID= + +# the following functions just call the corresponding vm versions +vm_kill() { + vm_kill_$VM_TYPE "$@" +} + +vm_verify_options() { + vm_verify_options_$VM_TYPE "$@" +} + +vm_attach_root() { + vm_attach_root_$VM_TYPE "$@" +} + +vm_attach_swap() { + vm_attach_swap_$VM_TYPE "$@" +} + +vm_detach_root() { + vm_detach_root_$VM_TYPE "$@" +} + +vm_detach_swap() { + vm_detach_swap_$VM_TYPE "$@" +} + +vm_fixup() { + vm_fixup_$VM_TYPE "$@" +} + +vm_startup() { + vm_startup_$VM_TYPE "$@" +} + +vm_kill() { + vm_kill_$VM_TYPE "$@" +} + +vm_cleanup() { + kill_watchdog + vm_cleanup_$VM_TYPE "$@" +} + +vm_parse_options() { + case ${PARAM/#--/-} in + -emulator-script) + needarg + EMULATOR_SCRIPT="$ARG" + shift + ;; + -xen|-kvm|-uml|-qemu|-emulator) + VM_TYPE=${PARAM##*-} + test -z "$VM_IMAGE" && VM_IMAGE=1 + if test -n "$ARG" ; then + VM_IMAGE="$ARG" + shift + fi + ;; + -zvm|-lxc) + VM_TYPE=${PARAM##*-} + shift + ;; + -vm-type) + needarg + VM_TYPE="$ARG" + case "$VM_TYPE" in + lxc) ;; + ec2|xen|kvm|uml|qemu|emulator|openstack|zvm) + test -z "$VM_IMAGE" && VM_IMAGE=1 + ;; + none|chroot) VM_TYPE= ;; + *) + echo "VM '$VM_TYPE' is not supported" + cleanup_and_exit + ;; + esac + shift + ;; + -vm-worker) + needarg + VM_WORKER="$ARG" + shift + ;; + -vm-worker-nr|-vm-worker-no) + needarg + VM_WORKER_NR="$ARG" + shift + ;; + -vm-server|-vm-region) + needarg + VM_SERVER="$ARG" + shift + ;; + -vm-volumes) + needarg + VM_VOLUME_NAME="$ARG" + shift + ARG="$1" + test "$ARG" = "${ARG#-}" || ARG= + needarg + VM_VOLUME_SWAP="$ARG" + shift + ;; + -vm-disk) + needarg + VM_IMAGE="$ARG" + shift + ;; + -xenswap|-vm-swap|-swap) + needarg + VM_SWAP="$ARG" + shift + ;; + -xenmemory|-vm-memory|-memory) + needarg + VM_MEMSIZE="$ARG" + shift + ;; + -vm-kernel) + needarg + VM_KERNEL="$ARG" + shift + ;; + -vm-initrd) + needarg + VM_INITRD="$ARG" + shift + ;; + -vmdisk-rootsize|-vm-disk-size) + needarg + VMDISK_ROOTSIZE="$ARG" + shift + ;; + -vmdisk-swapsize|-vm-swap-size) + needarg + VMDISK_SWAPSIZE="$ARG" + shift + ;; + -vmdisk-filesystem|-vm-disk-filesystem) + needarg + VMDISK_FILESYSTEM="$ARG" + shift + ;; + -vmdisk-mount-options|-vm-disk-mount-options) + needarg + # options needs to be quoted to handle argument which might start with "-o ..." + VMDISK_MOUNT_OPTIONS=$(echo $ARG | sed 's/^\"\(.*\)\"$/\1/g') + shift + ;; + -vmdisk-clean) + # delete old root/swap to get rid of the old blocks + VMDISK_CLEAN=true + ;; + -rpmlist) + needarg + RPMLIST="--rpmlist $ARG" + BUILD_RPMS= + shift + ;; + -hugetlbfs) + needarg + HUGETLBFSPATH="$ARG" + shift + ;; + -vm-watchdog) + VM_WATCHDOG=true + ;; + -*) + return 1 + ;; + esac + nextargs=("$@") + return 0 +} + + +# +# shutdown the system from inside the VM +# +vm_shutdown() { + test -n "$VM_WATCHDOG" && echo "### WATCHDOG MARKER START ###" + cd / + test -n "$1" || set 1 + if test -n "$VM_SWAP" -a -e "$VM_SWAP" ; then + swapoff "$VM_SWAP" 2>/dev/null + echo -n "BUILDSTATUS$1" >"$VM_SWAP" + fi + exec >&0 2>&0 # so that the logging tee finishes + sleep 1 # wait till tee terminates + test "$VM_TYPE" = lxc && exit $1 + kill -9 -1 # goodbye cruel world + if ! test -x /sbin/halt ; then + test -e /proc/sysrq-trigger || mount -n -tproc none /proc + sync + sleep 2 # like halt does + if test -e /proc/sysrq-trigger; then + echo o > /proc/sysrq-trigger + sleep 5 # wait for sysrq to take effect + else + echo "Warning: VM doesn't support sysrq and /sbin/halt not installed" + fi + else + sync # halt from systemd is not syncing anymore. + halt -f -p + fi + echo "Warning: clean shut down of the VM didn't work" + exit $1 # init died... +} + +vm_img_create() { + local img="$1" + local size="$2" + + echo "Creating $img (${size}M)" + mkdir -p "${img%/*}" || cleanup_and_exit 3 + + # prefer fallocate, which avoids fragmentation + r=1 + if type -p fallocate > /dev/null ; then + fallocate -l "${size}M" "$img" + r=$? + fi + # fall back to dd method if fallocate is not supported + if test "$r" -gt 0 ; then + dd if=/dev/zero of="$img" bs=1M count=0 seek="$size" || cleanup_and_exit 3 + fi +} + +vm_img_mkfs() { + local fs="$1" + local img="$2" + local mkfs tunefs + eval "mkfs=\"\$vm_img_mkfs_${fs}\"" + eval "mkfs_exta_options=\"\$vm_img_mkfs_${fs}_extra\"" + eval "tunefs=\"\$vm_img_tunefs_${fs}\"" + + if test -z "$mkfs"; then + echo "filesystem \"$fs\" is not supported" + cleanup_and_exit 3 + fi + + echo "Creating $fs filesystem on $img" + if ! $mkfs $mkfs_exta_options "$img"; then + if test -z "$mkfs_exta_options"; then + cleanup_and_exit 3 + else + echo "Format call failed, trying again without extra options..." + $mkfs "$img" || cleanup_and_exit 3 + fi + fi + if test -n "$tunefs" ; then + $tunefs "$img" || cleanup_and_exit 3 + fi +} + +background_monitor_process() { + max_disk=0 + max_mem=0 + while sleep 5; do + test -e /.build/_statistics.exit && exit 0 + + # memory usage + if test -e /proc/meminfo ; then + memtotal=0 + while read key value unit; do + case $key in + MemTotal:|SwapTotal:) memtotal=$(( $memtotal + $value )) ;; + MemFree:|SwapFree:|SwapCached:|Cached:|Buffers:) memtotal=$(( $memtotal - $value )) ;; + esac + done < /proc/meminfo + if test ${memtotal} -gt $max_mem ; then + max_mem="${memtotal}" + echo -n $(( $max_mem / 1024 )) > /.build/_statistics.memory.new && mv /.build/_statistics.memory.new /.build/_statistics.memory + fi + fi + + # disk storage usage + if type -p df >& /dev/null; then + c=(`df -m / 2>/dev/null | tail -n 1`) + + if test ${c[2]} -gt $max_disk ; then + max_disk="${c[2]}" + echo -n $max_disk > /.build/_statistics.df.new && mv /.build/_statistics.df.new /.build/_statistics.df + fi + fi + done +} + +background_watchdog() { + WATCHDOG_START= + WATCHDOG_TIMEOUT=300 + while sleep 5 ; do + WATCH=`grep "### WATCHDOG MARKER" "$LOGFILE" | tail -n 1` + case $WATCH in + *WATCHDOG\ MARKER\ START*) test -n "$WATCHDOG_START" || WATCHDOG_START=`date +%s` ;; + *WATCHDOG\ MARKER\ END*) WATCHDOG_START= ;; + esac + if test -n "$WATCHDOG_START" ; then + NOW=`date +%s` + ELAPSED=$((NOW-WATCHDOG_START)) + if test $ELAPSED -gt $WATCHDOG_TIMEOUT ; then + # kill the VM + echo "### WATCHDOG TRIGGERED, KILLING VM ###" + fuser -k -TERM "$VM_IMAGE" + exit 0 + fi + fi + done +} + +start_watchdog() { + local wf=$(mktemp) + ( background_watchdog & echo $! > "$wf" ) + read VM_WATCHDOG_PID < "$wf" + rm -f "$wf" +} + +kill_watchdog() { + test -n "$VM_WATCHDOG_PID" && kill "$VM_WATCHDOG_PID" + VM_WATCHDOG_PID= +} + +vm_set_personality_syscall() { + local archname + archname=`perl -V:archname 2>/dev/null` + archname="${archname#archname=?}" + case "$archname" in + x86_64*) PERSONALITY_SYSCALL=135 ;; + alpha*) PERSONALITY_SYSCALL=324 ;; + sparc*) PERSONALITY_SYSCALL=191 ;; + ia64*) PERSONALITY_SYSCALL=1140 ;; + i?86*|ppc*|aarch64*|arm*|sh4|cris|m68k*|s390*|unicore32|microblaze) PERSONALITY_SYSCALL=136 ;; + *) echo "Unknown architecture personality: '$archname'"; cleanup_and_exit 1 ;; + esac +} + +# used before calling kvm or xen +linux64() { + perl -e 'syscall('$PERSONALITY_SYSCALL', 0); exec(@ARGV) || die("$ARGV[0]: $!\n")' "$@" +} + +vm_detect_2nd_stage() { + if test ! -e /.build/build.data -o -n "$BUILD_IGNORE_2ND_STAGE" ; then + return 1 + fi + . /.build/build.data + if test -z "$VM_TYPE" ; then + return 1 + fi + if test $$ -eq 1 || test $$ -eq 2 ; then + # ignore special init signals if we're init + # we're using ' ' instead of '' so that the signal handlers + # are reset in the child processes + trap ' ' HUP TERM + $0 "$@" + cleanup_and_exit $? + fi + + test -n "$VM_WATCHDOG" -a -z "$PERSONALITY_SET" && echo "### WATCHDOG MARKER END ###" + echo "2nd stage started in virtual machine" + BUILD_ROOT=/ + BUILD_DIR=/.build + echo "machine type: `uname -m`" + if test "$PERSONALITY" != 0 -a -z "$PERSONALITY_SET" ; then + export PERSONALITY_SET=true + echo "switching personality to $PERSONALITY..." + # this is 32bit perl/glibc, thus the 32bit syscall number + exec perl -e 'syscall(136, '$PERSONALITY') == -1 && warn("personality: $!\n");exec "/.build/build" || die("/.build/build: $!\n")' + fi + RUNNING_IN_VM=true + test -e /proc/version || mount -orw -n -tproc none /proc + if test "$VM_TYPE" != lxc ; then + mount -n ${VMDISK_MOUNT_OPTIONS},remount,rw / + fi + umount /run >/dev/null 2>&1 + # mount /sys + if ! test -e /sys/block; then + mkdir -p /sys + mount -orw -n -tsysfs sysfs /sys + fi +# qemu inside of xen does not work, check again with kvm later before enabling this +# if test -e /dev/kqemu ; then +# # allow abuild user to run qemu +# chmod 0666 /dev/kqemu +# fi + + if test -n "$VM_SWAP" ; then + for i in 1 2 3 4 5 6 7 8 9 10 ; do + test -e "$VM_SWAP" && break + test $i = 1 && echo "waiting for $VM_SWAP to appear" + echo -n . + sleep 1 + done + test $i = 1 || echo + # recreate the swap device manually if it didn't exist for some + # reason, hardcoded to hda2 atm + if ! test -b "$VM_SWAP" ; then + rm -f "$VM_SWAP" + umask 027 + mknod "$VM_SWAP" b 3 2 + umask 022 + fi + # Do not rely on external system writing the signature, it might differ... + mkswap "$VM_SWAP" + swapon -v "$VM_SWAP" || exit 1 + fi + HOST="$MYHOSTNAME" + + # fork a process monitoring max filesystem usage during build + if test "$DO_STATISTICS" = 1 ; then + rm -f /.build/_statistics.exit + ( background_monitor_process & ) + fi + + if test ! -e /dev/.udev ; then + echo "WARNING: udev not running, creating extra device nodes" + test -e /dev/fd || ln -sf /proc/self/fd /dev/fd + test -e /etc/mtab || ln -sf /proc/mounts /etc/mtab + fi + + # set date to build start on broken systems (now < build start) + if test $(date '+%s') -lt $(date -r /.build/.date '+%s') ; then + echo -n "WARNING: system has a broken clock, setting it to a newer time: " + date -s `cat /.build/.date` + fi + + return 0 +} + +vm_set_mount_options() { + if test "$VMDISK_MOUNT_OPTIONS" = __default; then + if test "$VMDISK_FILESYSTEM" = reiserfs ; then + VMDISK_MOUNT_OPTIONS='-o data=writeback,commit=150,noatime' + elif test "$VMDISK_FILESYSTEM" = btrfs ; then + VMDISK_MOUNT_OPTIONS='-o nobarrier,noatime' + elif test "$VMDISK_FILESYSTEM" = "ext4" ; then + VMDISK_MOUNT_OPTIONS='-o noatime' + elif test "$VMDISK_FILESYSTEM" = "ext3" ; then + VMDISK_MOUNT_OPTIONS='-o data=writeback,nobarrier,commit=150,noatime' + elif test "$VMDISK_FILESYSTEM" = "ext2" ; then + VMDISK_MOUNT_OPTIONS='-o noacl,noatime' + elif test "$VMDISK_FILESYSTEM" = "xfs" ; then + VMDISK_MOUNT_OPTIONS='-o noatime' + else + VMDISK_MOUNT_OPTIONS='-o noatime' + fi + fi +} + +# +# create file system and swap space, mount file system to $BUILD_ROOT +# +vm_setup() { + vm_set_mount_options + if test "$VM_IMAGE" = 1 ; then + VM_IMAGE="$BUILD_ROOT.img" + if test -z "$VM_SWAP" -a "$VM_TYPE" != emulator; then + VM_SWAP="$BUILD_ROOT.swap" + fi + echo "VM_IMAGE: $VM_IMAGE, VM_SWAP: $VM_SWAP" + else + echo "VM_IMAGE: $VM_IMAGE, VM_SWAP: $VM_SWAP" + vm_attach_root + fi + # this should not be needed, but sometimes a xen instance got lost + test "$VM_TYPE" = xen && vm_purge_xen + if test -n "$VMDISK_CLEAN" ; then + # delete old root/swap to get rid of the old blocks + if test -n "$VM_IMAGE" -a -f "$VM_IMAGE" ; then + echo "Deleting old $VM_IMAGE" + rm -rf "$VM_IMAGE" + fi + if test -n "$VM_SWAP" -a -f "$VM_SWAP" ; then + echo "Deleting old $VM_SWAP" + rm -rf "$VM_SWAP" + fi + fi + if test ! -e "$VM_IMAGE" ; then + vm_img_create "$VM_IMAGE" "$VMDISK_ROOTSIZE" + if test -z "$CLEAN_BUILD" ; then + vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_IMAGE" + fi + fi + if test -n "$VM_SWAP" -a ! -e "$VM_SWAP" -a ! -b "$VM_SWAP" ; then + vm_img_create "$VM_SWAP" "$VMDISK_SWAPSIZE" + fi + if test ! -e "$VM_IMAGE" ; then + echo "you need to create $VM_IMAGE first" + cleanup_and_exit 3 + fi + if test -n "$CLEAN_BUILD" ; then + vm_img_mkfs "$VMDISK_FILESYSTEM" "$VM_IMAGE" || cleanup_and_exit 3 + fi + # now mount root/swap + mkdir_build_root + if test -w /root ; then + if test -b $VM_IMAGE ; then + # mount device directly + mount $VMDISK_MOUNT_OPTIONS $VM_IMAGE $BUILD_ROOT || cleanup_and_exit 3 + else + mount ${VMDISK_MOUNT_OPTIONS},loop $VM_IMAGE $BUILD_ROOT || cleanup_and_exit 3 + fi + else + if ! mount $BUILD_ROOT; then + echo "mounting the build root failed. An fstab entry is probably missing or incorrect." + echo "/etc/fstab should contain an entry like this:" + echo "$VM_IMAGE $BUILD_ROOT auto noauto,user,loop 0 0" + cleanup_and_exit 3 + fi + fi + if test -n "$VM_SWAP" ; then + vm_attach_swap + dd if=/dev/zero of="$VM_SWAP" bs=1024 count=1 conv=notrunc 2>/dev/null + vm_detach_swap + # mkswap happens inside of the vm + fi +} + +# +# prepare for vm startup +# +vm_first_stage() { + vm_set_personality_syscall + rm -rf "$BUILD_ROOT/.build" + mkdir -p "$BUILD_ROOT/.build" + TIME_PREINSTALL= + if test "$DO_INIT" = true ; then + # do first stage of init_buildsystem + rm -f $BUILD_ROOT/.build.success + set -- init_buildsystem --configdir "$CONFIG_DIR" --cachedir "$CACHE_DIR" --prepare "${definesnstuff[@]}" "${repos[@]}" $CLEAN_BUILD $USEUSEDFORBUILD $RPMLIST "$MYSRCDIR/$RECIPEFILE" $ADDITIONAL_PACKS + echo "$* ..." + start_time=`date +%s` + "$@" || cleanup_and_exit 1 + check_exit + TIME_PREINSTALL=$(( `date +%s` - $start_time )) + unset start_time + if test ! -w /root ; then + # remove setuid bit if files belong to user to make e.g. mount work + find $BUILD_ROOT/{bin,sbin,usr/bin,usr/sbin} -type f -uid $UID -perm +4000 -print0 | xargs -0 --no-run-if-empty chmod -s + fi + copy_oldpackages + fi + + # start up VM, rerun ourself + cp -a $BUILD_DIR/. $BUILD_ROOT/.build + if ! test "$MYSRCDIR" = $BUILD_ROOT/.build-srcdir ; then + rm -rf "$BUILD_ROOT/.build-srcdir" + mkdir "$BUILD_ROOT/.build-srcdir" + if test "$BUILDTYPE" = kiwi ; then + cp -pRL "$MYSRCDIR"/* $BUILD_ROOT/.build-srcdir + else + cp -p "$MYSRCDIR"/* $BUILD_ROOT/.build-srcdir + fi + MYSRCDIR=$BUILD_ROOT/.build-srcdir + else + # cwd is at $BUILD_ROOT/.build-srcdir which we want to + # umount later so step aside + cd "$SRCDIR" + fi + + # do vm specific fixups + vm_fixup + + # the watchdog needs a log file + test -n "$LOGFILE" || VM_WATCHDOG= + # put our config into .build/build.data + Q="'\''" + echo "RECIPEFILE='${RECIPEFILE//"'"/$Q}'" > $BUILD_ROOT/.build/build.data + echo "BUILD_JOBS='${BUILD_JOBS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "BUILD_ARCH='${BUILD_ARCH//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "BUILD_RPMS='${BUILD_RPMS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + case $BUILD_DIST in + */*) + cp $BUILD_DIST $BUILD_ROOT/.build/build.dist + BUILD_DIST=/.build/build.dist + ;; + esac + echo "BUILD_DIST='${BUILD_DIST//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "RELEASE='${RELEASE//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "BUILD_DEBUG='${BUILD_DEBUG//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "SIGNDUMMY='${SIGNDUMMY//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "DO_LINT='${DO_LINT//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "DO_CHECKS='${DO_CHECKS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "NOROOTFORBUILD='${NOROOTFORBUILD//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "CREATE_BASELIBS='$CREATE_BASELIBS'" >> $BUILD_ROOT/.build/build.data + echo "REASON='${REASON//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "CHANGELOG='${CHANGELOG//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "INCARNATION='${INCARNATION//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "DISTURL='${DISTURL//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "DO_INIT='${DO_INIT//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + echo "KIWI_PARAMETERS='${KIWI_PARAMETERS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + test -n "$VM_SWAP" && echo "VM_SWAP='${VM_SWAPDEV//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + test -n "$VMDISK_MOUNT_OPTIONS" && echo "VMDISK_MOUNT_OPTIONS='${VMDISK_MOUNT_OPTIONS//"'"/$Q}'" >> $BUILD_ROOT/.build/build.data + PERSONALITY=0 + test -n "$PERSONALITY_SYSCALL" && PERSONALITY=`perl -e 'print syscall('$PERSONALITY_SYSCALL', 0)."\n"'` + test "$PERSONALITY" = -1 && PERSONALITY=0 # syscall failed? + case $(uname -m) in + ppc|ppcle|s390) PERSONALITY=8 ;; # ppc/s390 kernel never tells us if a 32bit personality is active, assume we run on 64bit + aarch64) test "$BUILD_ARCH" != "${BUILD_ARCH#armv}" && PERSONALITY=8 ;; # workaround, to be removed + esac + test "$VM_TYPE" = lxc && PERSONALITY=0 + echo "PERSONALITY='$PERSONALITY'" >> $BUILD_ROOT/.build/build.data + echo "MYHOSTNAME='`hostname`'" >> $BUILD_ROOT/.build/build.data + echo -n "definesnstuff=(" >> $BUILD_ROOT/.build/build.data + shellquote "${definesnstuff[@]}" >> $BUILD_ROOT/.build/build.data + echo ")" >> $BUILD_ROOT/.build/build.data + echo -n "repos=(" >> $BUILD_ROOT/.build/build.data + shellquote "${repos[@]}" >> $BUILD_ROOT/.build/build.data + echo ")" >> $BUILD_ROOT/.build/build.data + echo "VM_TYPE='$VM_TYPE'" >> $BUILD_ROOT/.build/build.data + echo "RUN_SHELL='$RUN_SHELL'" >> $BUILD_ROOT/.build/build.data + echo "DO_STATISTICS='$DO_STATISTICS'" >> $BUILD_ROOT/.build/build.data + echo "TIME_PREINSTALL='$TIME_PREINSTALL'" >> $BUILD_ROOT/.build/build.data + echo "VM_WATCHDOG='$VM_WATCHDOG'" >> $BUILD_ROOT/.build/build.data + echo "BUILDENGINE='$BUILDENGINE'" >> $BUILD_ROOT/.build/build.data + echo "CCACHE='$CCACHE'" >> $BUILD_ROOT/.build/build.data + echo "ABUILD_TARGET='$ABUILD_TARGET'" >> $BUILD_ROOT/.build/build.data + # fallback time for broken hosts + date '+@%s' > $BUILD_ROOT/.build/.date + # we're done with the root file system, unmount + umount -n $BUILD_ROOT/proc/sys/fs/binfmt_misc 2> /dev/null || true + umount -n $BUILD_ROOT/proc 2> /dev/null || true + umount -n $BUILD_ROOT/dev/pts 2> /dev/null || true + umount -n $BUILD_ROOT/dev/shm 2> /dev/null || true + umount -n $BUILD_ROOT/mnt 2> /dev/null || true + + vm_init_script="/.build/build" + if check_use_emulator ; then + vm_init_script="/.build/$INITVM_NAME" + fi + if test -n "$VM_IMAGE" ; then + # copy out kernel & initrd (if they exist) during unmounting VM image + KERNEL_TEMP_DIR= + if test -z "$VM_KERNEL" -a -e "$BUILD_ROOT/.build.kernel.$VM_TYPE" ; then + KERNEL_TEMP_DIR=`mktemp -d` + cp "$BUILD_ROOT/.build.kernel.$VM_TYPE" "$KERNEL_TEMP_DIR/kernel" + if test -e "$BUILD_ROOT/.build.initrd.$VM_TYPE" ; then + cp "$BUILD_ROOT/.build.initrd.$VM_TYPE" "$KERNEL_TEMP_DIR/initrd" + fi + fi + check_exit + # needs to work otherwise we have a corrupted file system + if ! umount $BUILD_ROOT; then + rm -rf "$KERNEL_TEMP_DIR" + cleanup_and_exit 3 + fi + # copy back the kernel and set it for VM + if test -n "$KERNEL_TEMP_DIR" ; then + mkdir -p "$BUILD_ROOT/boot" + mv "$KERNEL_TEMP_DIR/kernel" "$BUILD_ROOT/boot/kernel" + vm_kernel="$BUILD_ROOT/boot/kernel" + if test -e "$KERNEL_TEMP_DIR/initrd" ; then + mv "$KERNEL_TEMP_DIR/initrd" "$BUILD_ROOT/boot/initrd" + test -z "$VM_INITRD" && vm_initrd="$BUILD_ROOT/boot/initrd" + fi + rmdir "$KERNEL_TEMP_DIR" + fi + fi + vm_detach_root + + # start watchdog if requested + if test -n "$VM_WATCHDOG" ; then + start_watchdog + echo "### WATCHDOG MARKER START ###" + fi + + echo "booting $VM_TYPE..." + vm_startup + + # kill watchdog again + if test -n "$VM_WATCHDOG" ; then + echo "### WATCHDOG MARKER END ###" + kill_watchdog + fi + + vm_attach_root + if test -n "$VM_SWAP" ; then + vm_attach_swap + BUILDSTATUS=`dd if="$VM_SWAP" bs=12 count=1 2>/dev/null` + case $BUILDSTATUS in + BUILDSTATUS[02]) + mkdir -p $BUILD_ROOT/.build.packages + cd $BUILD_ROOT/.build.packages || cleanup_and_exit 1 + echo "build: extracting built packages..." + extractbuild --disk "$VM_IMAGE" --input "$VM_SWAP" --skip 512 -v || cleanup_and_exit 3 + if test "$DO_STATISTICS" = 1 ; then + mkdir -p OTHER + TIME_TOTAL=$(( `date +%s` - $TIME_START_TIME )) + echo "TIME_total: $TIME_TOTAL" >> OTHER/_statistics + fi + cleanup_and_exit ${BUILDSTATUS#BUILDSTATUS} + ;; + BUILDSTATUS*) + cleanup_and_exit ${BUILDSTATUS#BUILDSTATUS} + ;; + *) + echo "No buildstatus set, either the base system is broken (kernel/initrd/udev/glibc/bash/perl)" + echo "or the build host has a kernel or hardware problem..." + cleanup_and_exit 3 + ;; + esac + cleanup_and_exit 1 + fi +} + +vm_save_statistics() { + echo "... saving statistics" + local sys_mounted otherdir + otherdir="$BUILD_ROOT$TOPDIR/OTHER" + test -n "$TIME_PREINSTALL" && echo "TIME_preinstall: $TIME_PREINSTALL" >> $otherdir/_statistics + test -n "$TIME_INSTALL" && echo "TIME_install: $TIME_INSTALL" >> $otherdir/_statistics + if test -e /.build/_statistics.df ; then + echo -n "MAX_mb_used_on_disk: " >> $otherdir/_statistics + cat /.build/_statistics.df >> $otherdir/_statistics + echo "" >> $otherdir/_statistics + rm /.build/_statistics.df + fi + if test -e /.build/_statistics.memory ; then + echo -n "MAX_mb_used_memory: " >> $otherdir/_statistics + cat /.build/_statistics.memory >> $otherdir/_statistics + echo "" >> $otherdir/_statistics + rm /.build/_statistics.memory + fi + if ! test -e /sys/block; then + mkdir -p /sys + mount -n sys /sys -t sysfs + sys_mounted=1 + fi + device="hda1" + test -e /dev/sda && device="sda" + test -e /dev/vda && device="vda" + test -e /dev/dasda && device="dasda" # in z/VM + test -e /dev/nfhd0 && device="nfhd0" # in aranym + if test -e /sys/block/${device}/stat ; then + disk=(`cat /sys/block/${device}/stat`) + test "0${disk[0]}" -gt 0 && echo "IO_requests_read: ${disk[0]}" >> $otherdir/_statistics + test "0${disk[2]}" -gt 0 && echo "IO_sectors_read: ${disk[2]}" >> $otherdir/_statistics + test "0${disk[4]}" -gt 0 && echo "IO_requests_write: ${disk[4]}" >> $otherdir/_statistics + test "0${disk[6]}" -gt 0 && echo "IO_sectors_write: ${disk[6]}" >> $otherdir/_statistics + else + echo "ERROR: no root disk device found, yet another new device name?" + ls -l /sys/block/ + fi + test -n "$sys_mounted" && umount /sys +} + +# args: resultdirs +vm_wrapup_build() { + test "$DO_STATISTICS" = 1 && vm_save_statistics + if test -n "$VM_SWAP"; then + echo "... saving built packages" + swapoff "$VM_SWAP" + pushd "$BUILD_ROOT$TOPDIR" >/dev/null + find "$@" -print0 | computeblocklists --padstart 512 --padend 512 -v --manifest - -0 > "$VM_SWAP" + popd >/dev/null + fi +} diff --git a/build-vm-ec2 b/build-vm-ec2 new file mode 100644 index 0000000..7bb8070 --- /dev/null +++ b/build-vm-ec2 @@ -0,0 +1,211 @@ +# +# EC2 specific functions +# +# (C) 2014 SUSE, Inc +# + +BUILD_EC2_TYPE="t1.micro" + +cloud_volume_attach_ec2() { + local VM_SERVER="$1" + local VM_VOL_NAME="$2" + local VM_VOL_DEV="$3" + + temp_file=`mktemp` + if ! ec2-attach-volume "$VM_VOL_NAME" -d /dev/sdz -i `ec2-instance-id` --region "$BUILD_EC2_REGION" > "$temp_file"; then + rm -f "$temp_file" + cleanup_and_exit 1 + fi + # wait that it becomes available + while true; do + state=`ec2_volume_state "$VM_VOL_NAME"` + test "$state" = attached && break + sleep 1 + done + # print device node + grep ^ATTACHMENT "$temp_file" | awk '{ print $4 }' + rm -f "$temp_file" +} + +cloud_volume_detach_ec2() { + local VM_SERVER="$1" + local VM_VOL_NAME="$2" + state=`ec2_volume_state "$VM_VOL_NAME"` + if test "$state" != available ; then + ec2-detach-volume "$VM_VOL_NAME" --region "$BUILD_EC2_REGION" || return 3 + fi + return 0 +} + +vm_verify_options_ec2() { + # verify settings + if test -z "$AWS_ACCESS_KEY" -o -z "$AWS_ACCESS_KEY" ; then + echo "ERROR: No amazon EC2 environment set. Set AWS_ACCESS_KEY and AWS_SECRET_KEY." + cleanup_and_exit 3 + fi + . /etc/profile.d/ec2.sh + EC2_INSTANCE_ID=`ec2-instance-id` + BUILD_EC2_AKI= + BUILD_EC2_ZONE=`ec2-meta-data placement/availability-zone` + BUILD_EC2_REGION=${BUILD_EC2_ZONE%?} + case "$BUILD_EC2_ZONE" in + us-east-1) BUILD_EC2_AKI=aki-88aa75e1 ;; + us-west-1) BUILD_EC2_AKI=aki-f77e26b2 ;; + us-west-2) BUILD_EC2_AKI=aki-fc37bacc ;; + eu-west-1) BUILD_EC2_AKI=aki-71665e05 ;; + ap-southeast-1) BUILD_EC2_AKI=aki-fe1354ac ;; + ap-southeast-2) BUILD_EC2_AKI=aki-3f990e05 ;; + ap-northeast-1) BUILD_EC2_AKI=aki-44992845 ;; + sa-east-1) BUILD_EC2_AKI=aki-c48f51d9 ;; + us-gov-west-1) BUILD_EC2_AKI=aki-79a4c05a ;; + esac + if test -z "$BUILD_EC2_AKI" ; then + echo "Unknown Amazon EC2 Zone: $BUILD_EC2_ZONE" + cleanup_and_exit 1 + fi + if test -z "$BUILD_EC2_AKI" ; then + echo "ERROR: No image refering to kernel and ramdisk is defined in BUILD_EC2_AKI env." + cleanup_and_exit 3 + fi + if test -z "$VM_VOLUME_NAME" ; then + echo "ERROR: No worker root VM volume name specified." + cleanup_and_exit 3 + fi + if test -z "$VM_VOLUME_SWAP" ; then + echo "ERROR: No worker swap VM volume name specified." + cleanup_and_exit 3 + fi + + VM_SWAPDEV=/dev/sdb1 # in the vm +} + +vm_attach_root_ec2() { + VM_IMAGE=`cloud_volume_attach_ec2 "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"` + test "${VM_IMAGE:0:5}" = /dev/ || cleanup_and_exit 3 +} + +vm_attach_swap_ec2() { + VM_SWAP=`cloud_volume_attach_ec2 "$VM_SERVER" "$EC2_EXTRACT_VOLUME_swap" "$VM_SWAP"` + test "${VM_SWAP:0:5}" = /dev/ || cleanup_and_exit 3 +} + +vm_detach_root_ec2() { + cloud_volume_detach_ec2 "$VM_SERVER" "$VM_VOLUME_NAME" +} + +vm_detach_swap_ec2() { + cloud_volume_detach_ec2 "$VM_SERVER" "$VM_VOLUME_SWAP" +} + +vm_fixup_ec2() { + # No way to handle this via init= parameter here.... + echo "#!/bin/sh" > "$BUILD_ROOT/sbin/init" + echo 'exec /.build/build "$@"' >> "$BUILD_ROOT/sbin/init" + chmod 0755 "$BUILD_ROOT/sbin/init" + # use the instance kernel, if no kernel got installed via preinstall + if ! test -e "$BUILD_ROOT/boot/vmlinuz"; then + cp /boot/vmlinuz-ec2 "$BUILD_ROOT/boot/vmlinuz" + cp /boot/initrd-ec2 "$BUILD_ROOT/boot/initrd" + fi + # install menu.lst for pv grub + if ! test -e "$BUILD_ROOT/boot/grub/menu.lst"; then + mkdir -p "$BUILD_ROOT/boot/grub" + echo "serial --unit=0 --speed=9600" > "$BUILD_ROOT/boot/grub/menu.lst" + echo "terminal --dumb serial" >> "$BUILD_ROOT/boot/grub/menu.lst" + echo "default 0" >> "$BUILD_ROOT/boot/grub/menu.lst" + echo "timeout 0" >> "$BUILD_ROOT/boot/grub/menu.lst" + echo "hiddenmenu" >> "$BUILD_ROOT/boot/grub/menu.lst" + echo "" >> "$BUILD_ROOT/boot/grub/menu.lst" + echo "title default" >> "$BUILD_ROOT/boot/grub/menu.lst" + echo " root (hd0)" >> "$BUILD_ROOT/boot/grub/menu.lst" + echo " kernel /boot/vmlinuz root=/dev/sda1 xencons=xvc0 console=xvc0 splash=silent" >> "$BUILD_ROOT/boot/grub/menu.lst" + echo " initrd /boot/initrd" >> "$BUILD_ROOT/boot/grub/menu.lst" + fi +} + +vm_cleanup_ec2() { + cloud_volume_detach_ec2 "$VM_SERVER" "$VM_VOLUME_NAME" + cloud_volume_detach_ec2 "$VM_SERVER" "$VM_VOLUME_SWAP" + test -n "$EC2_EXTRACT_VOLUME_root" && cloud_volume_detach_ec2 "$VM_SERVER" "$EC2_EXTRACT_VOLUME_root" + test -n "$EC2_EXTRACT_VOLUME_swap" && cloud_volume_detach_ec2 "$VM_SERVER" "$EC2_EXTRACT_VOLUME_swap" + test -n "$EC2_SNAP_root" && ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" + test -n "$EC2_SNAP_swap" && ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap" + test -n "$EC2_EXTRACT_VOLUME_root" && ec2-delete-volume --region "$BUILD_EC2_REGION" "$EC2_EXTRACT_VOLUME_root" + test -n "$EC2_EXTRACT_VOLUME_swap" && ec2-delete-volume --region "$BUILD_EC2_REGION" "$EC2_EXTRACT_VOLUME_swap" +} + +vm_kill_ec2() { + if ec2-describe-instance-status "$VM_BUILD_INSTANCE" --region "$BUILD_EC2_REGION" >/dev/null 2>&1 ; then + if ec2-terminate-instances "$VM_BUILD_INSTANCE" >/dev/null 2>&1 ; then + echo "could not kill EC2 instance $VM_BUILD_INSTANCE" + cleanup_and_exit 1 + fi + fi +} + +vm_startup_ec2() { + EC2_SNAP_root=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$VM_VOLUME_NAME" | awk '{ print $2 }'` + if test "$EC2_SNAP_root" = "${EC2_SNAP_root#snap-}" ; then + echo "ERROR: Failed to create snapshot for root disk $VM_VOLUME_NAME" + cleanup_and_exit 3 + fi + EC2_SNAP_swap=`ec2-create-snapshot --region "$BUILD_EC2_REGION" "$VM_VOLUME_SWAP" | awk '{ print $2 }'` + if test "$EC2_SNAP_swap" = "${EC2_SNAP_swap#snap-}" ; then + echo "ERROR: Failed to create snapshot for swap disk $VM_VOLUME_SWAP" + ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" + cleanup_and_exit 3 + fi + # wait for snapshots being processed + while true; do + c=`ec2-describe-snapshots --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" "$EC2_SNAP_swap" | grep completed | wc -l` + test "$c" = 2 && break + done + EC2_AMI=`ec2-register --region "$BUILD_EC2_REGION" -n build-$VM_VOLUME_NAME -a x86_64 -b "/dev/sda1=$EC2_SNAP_root::false" -b "/dev/sdb1=$EC2_SNAP_swap::false" --kernel "$BUILD_EC2_AKI" | awk '{ print $2 }'` + if test "$EC2_AMI" == "${EC2_AMI#ami-}" ; then + echo "ERROR: Failed to register the AMI" + ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" + ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap" + cleanup_and_exit 3 + fi + INSTANCE=`ec2-run-instances --region "$BUILD_EC2_REGION" -z "$BUILD_EC2_ZONE" -t $BUILD_EC2_TYPE --kernel "$BUILD_EC2_AKI" --instance-initiated-shutdown-behavior terminate "$EC2_AMI" | grep ^INSTANCE | awk '{ print $2 }'` + if test "$INSTANCE" == "${INSTANCE#i-}" ; then + echo "ERROR: Failed to run the instance for AMI $EC2_AMI" + ec2-deregister --region "$BUILD_EC2_REGION" "$EC2_AMI" + ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_root" + ec2-delete-snapshot --region "$BUILD_EC2_REGION" "$EC2_SNAP_swap" + cleanup_and_exit 3 + fi + echo "Waiting for finishing the build. No log file until then on EC2 ...." + I=0 + L=0 + EC2_EXTRACT_VOLUME_root= + EC2_EXTRACT_VOLUME_swap= + temp_file=`mktemp` + while true; do + ec2-describe-instances --region "$BUILD_EC2_REGION" "$INSTANCE" > $temp_file + state=`grep ^INSTANCE "$temp_file"` + if test -z "$EC2_EXTRACT_VOLUME_root" ; then + EC2_EXTRACT_VOLUME_root=`grep ^BLOCKDEVICE $temp_file | grep /dev/sda1 | awk '{ print $3 }'` + EC2_EXTRACT_VOLUME_swap=`grep ^BLOCKDEVICE $temp_file | grep /dev/sdb1 | awk '{ print $3 }'` + fi + # the column of the state is at a differen position depending on the state :/ +# test "$state" = "${state/stopped/}" || break + test "$state" = "${state/terminated/}" || break + I=$(( $I + 1 )) + if test $I -gt 10 ; then + echo -n . + I=0 + L=$(( $L + 1 )) + fi + if test $L -gt 10 ; then + # dump entire console log as raw here + ec2-get-console-output --region "$BUILD_EC2_REGION" -r "$INSTANCE" + L=0 + fi + sleep 1 + done + rm -f "$temp_file" + echo + ec2-deregister --region "$BUILD_EC2_REGION" "$EC2_AMI" + # snapshots get deleted after extract +} diff --git a/build-vm-emulator b/build-vm-emulator new file mode 100644 index 0000000..472385c --- /dev/null +++ b/build-vm-emulator @@ -0,0 +1,70 @@ +# +# generic emulator specific functions +# +# (C) 2014 SUSE, Inc +# + +vm_verify_options_emulator() { + VM_SWAP= +} + +vm_startup_emulator() { + pushd "$BUILD_DIR/emulator" + if test -z "$EMULATOR_SCRIPT" ; then + EMULATOR_SCRIPT=./emulator.sh + elif test "${EMULATOR_SCRIPT:0:1}" != / ; then + EMULATOR_SCRIPT="./$EMULATOR_SCRIPT" + fi + set -- "$EMULATOR_SCRIPT" "$VM_IMAGE" + echo "$@" + if ! "$@"; then + popd + echo "ERROR: The emulator returned with a failure" + cleanup_and_exit 3 + fi + popd + + # Emulators may not offer to use a second swap space. + # So we just mount the filesystem. + # WARNING: This is not safe against attacks. + mkdir -p $BUILD_ROOT/.build.packages + cd $BUILD_ROOT/.build.packages || cleanup_and_exit 1 + mkdir -p .mount + mount $VM_IMAGE -o loop .mount + if test -e .mount/.build.packages ; then + cp -a .mount/.build.packages/* . + fi + exitcode=`cat .mount/.build/_exitcode` + umount .mount + rmdir .mount + cleanup_and_exit "$exitcode" +} + +vm_kill_emulator() { + if ! fuser -k -TERM "$VM_IMAGE" ; then + echo "could not kill build in $VM_IMAGE" + cleanup_and_exit 1 + fi +} + +vm_fixup_emulator() { + # emulator may not be able to hand over kernel parameters + ln -sf /.build/build $BUILD_ROOT/sbin/init +} + +vm_attach_root_emulator() { + : +} +vm_attach_swap_emulator() { + : +} +vm_detach_root_emulator() { + : +} +vm_detach_swap_emulator() { + : +} +vm_cleanup_emulator() { + : +} + diff --git a/build-vm-kvm b/build-vm-kvm new file mode 100644 index 0000000..70024ad --- /dev/null +++ b/build-vm-kvm @@ -0,0 +1,211 @@ +# +# kvm/qemu specific functions +# +# (C) 2014 SUSE, Inc +# + +kvm_bin=/usr/bin/qemu-kvm +kvm_console=ttyS0 + +# assume virtio support by default +kvm_device=virtio-blk-pci +kvm_options= + +kvm_check_ppc970() { + if ! grep -q -E '(kvm_rma_count.*kvm_hpt_count)|(kvm_hpt_count.*kvm_rma_count)' /proc/cmdline ; then + echo "put kvm_rma_count= or kvm_hpt_count=<> to your boot options" + cleanup_and_exit 3 + fi +} + +kvm_check_hugetlb() { + if ! grep -q "$HUGETLBFSPATH" /proc/mounts ; then + echo "hugetlbfs is not mounted to $HUGETLBFSPATH" + cleanup_and_exit 3 + fi + local HUGETLBBLKSIZE=$(stat -f -c "%S" "$HUGETLBFSPATH") + HUGETLBBLKSIZE=$(( ${HUGETLBBLKSIZE:-0} / 1024 )) + if test "$HUGETLBBLKSIZE" -lt 1 -o ! -e "/sys/kernel/mm/hugepages/hugepages-${HUGETLBBLKSIZE}kB" ; then + echo "could not determine hugetlbfs block size" + cleanup_and_exit 3 + fi + local PAGES_FREE=$(cat /sys/kernel/mm/hugepages/hugepages-${HUGETLBBLKSIZE}kB/free_hugepages) + local PAGES_REQ=$(( ${VM_MEMSIZE:-64} * 1024 / $HUGETLBBLKSIZE )) + if test "$PAGES_FREE" -lt "$PAGES_REQ" ; then + echo "expected $PAGES_REQ to be available (have $PAGES_FREE)" + echo "please adjust nr_hugepages" + cleanup_and_exit 3 + fi +} + +vm_verify_options_kvm() { + vm_kernel= + vm_initrd= + + # overwrite some options for specific host architectures + case `uname -m` in + armv7l) + kvm_bin="/usr/bin/qemu-system-arm" + kvm_console=ttyAMA0 + kvm_options="-enable-kvm -M vexpress-a15 -dtb /boot/a15-guest.dtb -cpu cortex-a15" + vm_kernel=/boot/zImage + vm_initrd=/boot/initrd + # prefer the guest kernel/initrd + test -e /boot/zImage.guest && vm_kernel=/boot/zImage.guest + test -e /boot/initrd.guest && vm_initrd=/boot/initrd.guest + kvm_device=virtio-blk-device + ;; + aarch64) + kvm_bin="/usr/bin/qemu-system-aarch64" + kvm_console=ttyAMA0 + kvm_options="-enable-kvm -M virt -cpu host" + vm_kernel=/boot/Image + vm_initrd=/boot/initrd + # prefer the guest kernel/initrd + test -e /boot/Image.guest && vm_kernel=/boot/Image.guest + test -e /boot/initrd.guest && vm_initrd=/boot/initrd.guest + kvm_device=virtio-blk-device + ;; + ppc|ppcle|ppc64|ppc64le) + kvm_bin="/usr/bin/qemu-system-ppc64" + kvm_console=hvc0 + kvm_options="-enable-kvm -M pseries" + grep -q PPC970MP /proc/cpuinfo && kvm_check_ppc970 + vm_kernel=/boot/vmlinux + vm_initrd=/boot/initrd + if test "$BUILD_ARCH" = ppc64le -a -e /boot/vmlinuxle ; then + vm_kernel=/boot/vmlinuxle + vm_initrd=/boot/initrdle + fi + grep -q "pSeries" /proc/cpuinfo && kvm_device=scsi-hd # no virtio on pSeries + grep -q "PowerNV" /proc/cpuinfo || kvm_device=scsi-hd # no virtio on ppc != power7 yet + ;; + s390|s390x) + kvm_bin="/usr/bin/qemu-system-s390x" + kvm_options="-enable-kvm" + kvm_console=hvc0 + vm_kernel=/boot/image + vm_initrd=/boot/initrd + kvm_device=virtio-blk-ccw + ;; + esac + + # check if we can run kvm + if ! test -r /dev/kvm -a -x "$kvm_bin" ; then + echo "host does not support kvm" + echo "either the kvm kernel-module is not loaded or kvm is not installed or hardware virtualization is deactivated in the BIOS." + cleanup_and_exit 3 + fi + + # check hugepages + test -n "$HUGETLBFSPATH" -a "$VM_TYPE" = kvm && kvm_check_hugetlb + + # set kernel + test -n "$VM_KERNEL" && vm_kernel="$VM_KERNEL" + test -z "$vm_kernel" && vm_kernel=/boot/vmlinuz + + # set initrd + test -n "$VM_INITRD" && vm_initrd="$VM_INITRD" + if test -z "$vm_initrd" ; then + # find a nice default + if test -e "/boot/initrd-build" ; then + vm_initrd="/boot/initrd-build" + elif test -e "/boot/initrd-virtio" ; then + vm_initrd="/boot/initrd-virtio" + else + vm_initrd="/boot/initrd" + kvm_device=ide-hd + # use /etc/sysconfig/kernel as indication if we have virtio + if test -e /etc/sysconfig/kernel ; then + local im=$(INITRD_MODULES=; . /etc/sysconfig/kernel; echo "$INITRD_MODULES") + if test "$im" != "${im/virtio/}" ; then + kvm_device=virtio-blk-pci + fi + fi + fi + fi + + case $kvm_device in + virtio*) + qemu_rootdev=/dev/disk/by-id/virtio-0 + VM_SWAPDEV=/dev/disk/by-id/virtio-1 + ;; + *) + qemu_rootdev=/dev/sda + VM_SWAPDEV=/dev/sdb + ;; + esac +} + +vm_startup_kvm() { + qemu_bin="$kvm_bin" + qemu_args=(-drive file="$VM_IMAGE",if=none,id=disk,serial=0,cache=unsafe -device "$kvm_device",drive=disk) + if test -n "$VM_SWAP" ; then + qemu_args=("${qemu_args[@]}" -drive file="$VM_SWAP",if=none,id=swap,serial=1,cache=unsafe -device "$kvm_device",drive=swap) + fi + + if test -n "$BUILD_JOBS" -a "$icecream" = 0 -a -z "$BUILD_THREADS" ; then + qemu_args=("${qemu_args[@]}" "-smp" "$BUILD_JOBS") + elif test -n "$BUILD_JOBS" -a -n "$BUILD_THREADS" ; then + qemu_args=("${qemu_args[@]}" "-smp" "$BUILD_JOBS,threads=$BUILD_THREADS") + fi + if test "$VM_TYPE" = kvm ; then + test "$kvm_console" != ttyAMA0 && kvm_options="$kvm_options -cpu host" + test -n "$HUGETLBFSPATH" && kvm_options="$kvm_options -mem-path $HUGETLBFSPATH" + fi + set -- $qemu_bin -no-reboot -nographic -vga none -net none $kvm_options \ + -kernel $vm_kernel \ + -initrd $vm_initrd \ + -append "root=$qemu_rootdev panic=1 quiet no-kvmclock nmi_watchdog=0 rw rd.driver.pre=binfmt_misc elevator=noop console=$kvm_console init=$vm_init_script" \ + ${VM_MEMSIZE:+-m $VM_MEMSIZE} \ + "${qemu_args[@]}" + + if test "$PERSONALITY" != 0 ; then + # have to switch back to PER_LINUX to make qemu work + set -- linux64 "$@" + fi + export QEMU_AUDIO_DRV=none # we do not want to have sound inside the VMs + echo "$@" + "$@" +} + +vm_kill_kvm() { + if ! fuser -k -TERM "$VM_IMAGE" ; then + echo "could not kill build in $VM_IMAGE" + cleanup_and_exit 1 + fi +} + +vm_fixup_kvm() { + # check if we will use a kernel from the build root, in this case + # we assume the kernel does virtio + if test -z "$VM_KERNEL" -a -e "$BUILD_ROOT/.build.kernel.$VM_TYPE" ; then + # ide-hd is the non-virtio default + if test "$kvm_device" = ide-hd ; then + kvm_device=virtio-blk-pci + qemu_rootdev=/dev/disk/by-id/virtio-0 + VM_SWAPDEV=/dev/disk/by-id/virtio-1 + fi + fi +} + +vm_attach_root_kvm() { + : +} + +vm_attach_swap_kvm() { + : +} + +vm_detach_root_kvm() { + : +} + +vm_detach_swap_kvm() { + : +} + +vm_cleanup_kvm() { + : +} + diff --git a/build-vm-lxc b/build-vm-lxc new file mode 100644 index 0000000..c8eeb9f --- /dev/null +++ b/build-vm-lxc @@ -0,0 +1,59 @@ +# +# LXC specific functions +# +# (C) 2014 SUSE, Inc +# + +vm_verify_options_lxc() { + VM_IMAGE= + VM_SWAP= +} + +vm_startup_lxc() { + LXCCONF="$BUILD_ROOT/.build.lxc.conf" + rm -f "$LXCCONF" + cat $BUILD_DIR/lxc.conf > "$LXCCONF" + cat >> "$LXCCONF" <<-EOF + lxc.rootfs = $BUILD_ROOT + EOF + # XXX: do this always instead of leaking the hosts' one? + echo "rootfs / rootfs rw 0 0" > $BUILD_ROOT/etc/mtab + LXCID=${BUILD_ROOT##*/} + lxc-destroy -n "$LXCID" >/dev/null 2>&1 || true + lxc-create -n "$LXCID" -f "$LXCCONF" || cleanup_and_exit 1 + lxc-start -n "$LXCID" "$vm_init_script" + BUILDSTATUS="$?" + test "$BUILDSTATUS" != 255 || BUILDSTATUS=3 + cleanup_and_exit "$BUILDSTATUS" +} + +vm_kill_lxc() { + LXCID=${BUILD_ROOT##*/} + lxc-stop -n "$LXCID" || true + lxc-destroy -n "$LXCID" +} + +vm_fixup_lxc() { + : +} + +vm_attach_root_lxc() { + : +} + +vm_attach_swap_lxc() { + : +} + +vm_detach_root_lxc() { + : +} + +vm_detach_swap_lxc() { + : +} + +vm_cleanup_lxc() { + : +} + diff --git a/build-vm-openstack b/build-vm-openstack new file mode 100644 index 0000000..92d1d78 --- /dev/null +++ b/build-vm-openstack @@ -0,0 +1,128 @@ +# +# Openstack specific functions +# +# (C) 2014 SUSE, Inc +# + +cloud_volume_attach_openstack() { + local VM_SERVER="$1" + local VM_VOL_NAME="$2" + local VM_VOL_DEV="$3" + + if ! nova volume-attach "$VM_SERVER" "$VM_VOL_NAME" "$VM_VOL_DEV"; then + echo "ERROR: nova attach failed. $?" >&2 + return 3 + fi + while true; do + state=`nova volume-show "$VM_VOL_NAME" | sed -n 's,^|[ ]*status[ ]*|[ ]*\([^ ]*\).*,\1,p'` + test "$state" = "in-use" && break + if test -z "$state" ; then + echo "ERROR: unable to find state of volume $VM_VOL_NAME" >&2 + return 3 + fi + if test "$state" = available ; then + echo "WARNING: volume $VM_VOL_NAME got not attached, retrying" >&2 + if ! nova volume-attach "$VM_SERVER" "$VM_VOL_NAME" "$VM_VOL_DEV"; then + echo "ERROR: nova attach failed. $?" >&2 + return 3 + fi + fi + sleep 3 + done + if test ! -e "$VM_VOL_DEV" ; then + #GROSS HACK: kernel does not care about the given device name +# VM_VOL_DEV="/dev/"`dmesg| sed -n 's,.*\(vd.\): unknown partition tab.*,\1,p' | tail -n 1` + VM_VOL_DEV=`ls -1 /dev/vd? | tail -n 1` + fi + echo "$VM_VOL_DEV" +} + +cloud_volume_detach_openstack() { + local VM_SERVER="$1" + local VM_VOL_NAME="$2" + + # needed at all? + nova volume-show "$VM_VOL_NAME" | grep -q in-use || return 0 + # umount seems not to be enough + sync + if ! nova volume-detach "$VM_SERVER" "$VM_VOL_NAME"; then + echo "ERROR: nova detach of $VM_VOL_NAME failed." >&2 + return 3 + fi + while nova volume-show "$VM_VOL_NAME" | grep -q availabe; do + sleep 3 + done + return 0 +} + +vm_verify_options_openstack() { + # verify settings + if test -z "$OS_AUTH_URL" ; then + echo "ERROR: No openstack environment set. This vm-type works only inside of an openstack VM." + cleanup_and_exit 3 + fi + if test -z "$OBS_OPENSTACK_KERNEL_IMAGE_ID" ; then + echo "ERROR: No image refering to kernel and ramdisk is defined in OBS_OPENSTACK_KERNEL_IMAGE_ID env." + cleanup_and_exit 3 + fi + if test -z "$VM_VOLUME_NAME" ; then + echo "ERROR: No worker root VM volume name specified." + cleanup_and_exit 3 + fi + if test -z "$VM_VOLUME_SWAP" ; then + echo "ERROR: No worker swap VM volume name specified." + cleanup_and_exit 3 + fi + if test -z "$VM_SERVER" ; then + echo "ERROR: No VM server nod name specified (usually this instance)." + cleanup_and_exit 3 + fi + + # XXX why here? + VM_SWAPDEV=/dev/vdb + qemu_rootdev=/dev/vda +} + +vm_attach_root_openstack() { + VM_IMAGE=`cloud_volume_attach_openstack "$VM_SERVER" "$VM_VOLUME_NAME" "$VM_IMAGE"` + test "${VM_IMAGE:0:5}" = "/dev/" || cleanup_and_exit 3 +} + +vm_attach_swap_openstack() { + VM_SWAP=`cloud_volume_attach_openstack "$VM_SERVER" "$VM_VOLUME_SWAP" "$VM_SWAP"` + test "${VM_SWAP:0:5}" = /dev/ || cleanup_and_exit 3 +} + +vm_detach_root_openstack() { + cloud_volume_detach_openstack "$VM_SERVER" "$VM_VOLUME_NAME" +} + +vm_detach_swap_openstack() { + cloud_volume_detach_openstack "$VM_SERVER" "$VM_VOLUME_SWAP" +} + +vm_cleanup_openstack() { + cloud_volume_detach_openstack "$VM_SERVER" "$VM_VOLUME_NAME" + cloud_volume_detach_openstack "$VM_SERVER" "$VM_VOLUME_SWAP" +} + +vm_fixup_openstack() { + # No way to handle this via init= parameter here.... + echo "#!/bin/sh" > "$BUILD_ROOT/sbin/init" + echo 'exec /.build/build "$@"' >> "$BUILD_ROOT/sbin/init" + chmod 0755 "$BUILD_ROOT/sbin/init" +} + +vm_kill_openstack() { + if nova show "$VM_VOLUME_NAME" >/dev/null 2>&1 ; then + if ! nova delete "$VM_VOLUME_NAME" ; then + echo "could not kill openstack vm build $VM_VOLUME_NAME" + cleanup_and_exit 1 + fi + fi +} + +vm_startup_openstack() { + nova boot --image $OBS_OPENSTACK_KERNEL_IMAGE_ID --flavor m1.small --block_device_mapping vda=${VM_VOLUME_NAME}::$(( $VMDISK_ROOTSIZE / 1024 )):0 --block_device_mapping vdb=${VM_VOLUME_SWAP}::1:0 --poll "build-$VM_VOLUME_NAME" || cleanup_and_exit 3 + nova console-log "build-$VM_VOLUME_NAME" +} diff --git a/build-vm-qemu b/build-vm-qemu new file mode 100644 index 0000000..ba95f37 --- /dev/null +++ b/build-vm-qemu @@ -0,0 +1,44 @@ +# +# qemu specific functions +# +# (C) 2014 SUSE, Inc +# + +# just forward everything to kvm... + +vm_verify_options_qemu() { + vm_verify_options_kvm +} + +vm_startup_qemu() { + vm_startup_kvm +} + +vm_kill_qemu() { + vm_kill_kvm +} + +vm_fixup_qemu() { + vm_setup_kvm +} + +vm_attach_root_qemu() { + vm_attach_root_kvm +} + +vm_attach_swap_qemu() { + vm_attach_swap_kvm +} + +vm_detach_root_qemu() { + vm_detach_root_kvm +} + +vm_detach_swap_qemu() { + vm_detach_swap_kvm +} + +vm_cleanup_qemu() { + vm_cleanup_kvm +} + diff --git a/build-vm-uml b/build-vm-uml new file mode 100644 index 0000000..13c6456 --- /dev/null +++ b/build-vm-uml @@ -0,0 +1,50 @@ +# +# UML specific functions +# +# (C) 2014 SUSE, Inc +# + +uml_kernel=/boot/vmlinux-um +uml_initrd=/boot/initrd-um + +vm_verify_options_uml() { + VM_SWAPDEV=/dev/sdb +} + +vm_startup_uml() { + set -- $uml_kernel initrd=$uml_initrd root=ubda init="$vm_init_script" panic=1 elevator=noop quiet ubda=$VM_IMAGE ubdb=$VM_SWAP ${VM_MEMSIZE:+mem=$VM_MEMSIZE} + echo "$@" + "$@" +} + +vm_kill_uml() { + if ! fuser -k -TERM "$VM_IMAGE"; then + echo "could not kill build in $VM_IMAGE" + cleanup_and_exit 1 + fi +} + +vm_fixup_uml() { + : +} + +vm_attach_root_uml() { + : +} + +vm_attach_swap_uml() { + : +} + +vm_detach_root_uml() { + : +} + +vm_detach_swap_uml() { + : +} + +vm_cleanup_uml() { + : +} + diff --git a/build-vm-xen b/build-vm-xen new file mode 100644 index 0000000..d3c55e0 --- /dev/null +++ b/build-vm-xen @@ -0,0 +1,116 @@ +# +# XEN specific functions +# +# (C) 2014 SUSE, Inc +# + +vm_verify_options_xen() { + vm_kernel=/boot/vmlinuz + vm_initrd=/boot/initrd + test -e /boot/vmlinuz-xen && vm_kernel=/boot/vmlinuz-xen + test -e /boot/initrd-xen && vm_initrd=/boot/initrd-xen + test -n "$VM_KERNEL" && vm_kernel="$VM_KERNEL" + test -n "$VM_INITRD" && vm_initrd="$VM_INITRD" +} + +vm_startup_xen() { + XMCMD=xm + test ! -x /usr/sbin/xm -a -x /usr/sbin/xl && XMCMD=xl + XMROOT="file:$(readlink -f $VM_IMAGE)" + XMROOT=${XMROOT/#file:\/dev/phy:/dev} + XMROOT="disk=$XMROOT,hda1,w" + XMSWAP= + if test -n "$VM_SWAP" ; then + XMSWAP="file:$(readlink -f $VM_SWAP)" + XMSWAP=${XMSWAP/#file:\/dev/phy:/dev} + XMSWAP="disk=$XMSWAP,hda2,w" + fi + XENID="${VM_IMAGE%/root}" + XENID="${XENID%/tmpfs}" + XENID="${XENID##*/}" + XENID="${XENID#root_}" + + if $XMCMD list "build_$XENID" >/dev/null 2>&1 ; then + echo "Instance already exists, something really went wrong..." + echo "Please report to your server admin, there might be multiple services running for same domain" + cleanup_and_exit 3 + fi + XEN_CONF_FILE=`mktemp /var/tmp/build.xen.conf-XXXXXXXXX` || cleanup_and_exit 3 + + echo "kernel = \"$vm_kernel\"" > $XEN_CONF_FILE + echo "ramdisk = \"$vm_initrd\"" >> $XEN_CONF_FILE + echo "memory = ${VM_MEMSIZE:-64}" >> $XEN_CONF_FILE + test -n "$BUILD_JOBS" && echo "vcpus = $BUILD_JOBS" >> $XEN_CONF_FILE + echo "root = \"/dev/hda1 ro\"" >> $XEN_CONF_FILE + echo "extra = \"init=/bin/bash console=ttyS0 panic=1 udev_timeout=360\"" >> $XEN_CONF_FILE + echo "on_poweroff = \"destroy\"" >> $XEN_CONF_FILE + echo "on_reboot = \"destroy\"" >> $XEN_CONF_FILE + echo "on_crash = \"destroy\"" >> $XEN_CONF_FILE + if test "$XMCMD" = xm ; then + set -- xm create -c $XEN_CONF_FILE name="build_$XENID" $XMROOT $XMSWAP extra="panic=1 quiet init="$vm_init_script" rd.driver.pre=binfmt_misc elevator=noop console=ttyS0" + else + XLDISK= + XLDISK="\"${XMROOT#disk=}\"" + test -n "$XMSWAP" && XLDISK="$XLDISK, \"${XMSWAP#disk=}\"" + set -- xl create -c $XEN_CONF_FILE name="\"build_$XENID\"" "disk=[ $XLDISK ]" extra=\""panic=1 quiet init="$vm_init_script" rd.driver.pre=binfmt_misc elevator=noop console=ttyS0"\" + fi + if test "$PERSONALITY" != 0 ; then + # have to switch back to PER_LINUX to make xm work + set -- linux64 "$@" + fi + echo "$@" + "$@" || cleanup_and_exit 3 + rm -f "$XEN_CONF_FILE" +} + +vm_kill_xen() { + XMCMD=xm + test ! -x /usr/sbin/xm -a -x /usr/sbin/xl && XMCMD=xl + XENID="${VM_IMAGE%/root}" + XENID="${XENID%/tmpfs}" + XENID="${XENID##*/}" + XENID="${XENID#root_}" + if $XMCMD list "build_$XENID" >/dev/null 2>&1 ; then + if ! $XMCMD destroy "build_$XENID" ; then + echo "could not kill xen build $XENID" + cleanup_and_exit 1 + fi + fi +} + +# XEN only +vm_purge_xen() { + # this should not be needed, but sometimes a xen instance gets lost + XMCMD=xm + test ! -x /usr/sbin/xm -a -x /usr/sbin/xl && XMCMD=xl + XENID="${VM_IMAGE%/root}" + XENID="${XENID%/tmpfs}" + XENID="${XENID##*/}" + XENID="${XENID#root_}" + $XMCMD destroy "build_$XENID" >/dev/null 2>&1 +} + +vm_fixup_xen() { + : +} + +vm_attach_root_xen() { + : +} + +vm_attach_swap_xen() { + : +} + +vm_detach_root_xen() { + : +} + +vm_detach_swap_xen() { + : +} + +vm_cleanup_xen() { + : +} + diff --git a/build-vm-zvm b/build-vm-zvm new file mode 100644 index 0000000..2bbabe6 --- /dev/null +++ b/build-vm-zvm @@ -0,0 +1,352 @@ +# +# z/VM specific functions +# +# (C) 2014 SUSE, Inc +# + +# z/VM: use default kernel image from local machine +# lets go with the default parameters. However zvm_initrd will be a required parameter +#zvm_kernel=/boot/image +#zvm_initrd=/boot/initrd_worker +zvm_param="root=/dev/disk/by-path/ccw-0.0.0150-part1 hvc_iucv=8 console=hvc0" +zvm_mult_pass="THR4ME" +zvm_init_script="/.build/build" + +####################################################################################### + +# this once was in zvm_functions + +zvm_fatal() { + echo "$1" + test -n "$ZVM_CLEANUP" && exit 1 + cleanup_and_exit 1 +} + +prevent_detach() { + if test "$1" = "150" -o "$1" = "0150"; then + zvm_fatal "don't detach local root" + fi +} + +zvm_memset() { + # defining the worker also resets the operating system. Be careful + # $1: user name + # $2: amount in MB + # Note, that this is also limited by the worker definition in the user directory + if test -n "$2"; then + if ! vmcp send $1 define storage ${2}M ; then + zvm_fatal "Could not redefine storage of $1 to ${2}M" + fi + fi +} + +zvm_logon() { + # kill machine if it already runs + # autolog machine + # Needs machine name as $1 + if test -n "$1" ; then + if $(vmcp q "$1" >& /dev/null) ; then + vmcp force $1 + sleep 1 + fi + if ! $(vmcp q "$1" >& /dev/null) ; then + if ! $(vmcp xautolog $1 >& /dev/null) ; then + zvm_fatal "Could not start machine $1. Is $1 defined in the user directory?" + else + # give the worker a moment to initialize + sleep 2 + zvm_memset $1 $VM_MEMSIZE + sleep 2 + fi + fi + fi +} + +zvm_ipl() { + # IPL worker. Needs user as $1 and ipl device as $2. + if test -n "$1" -a -n "$2" ; then + if ! $(vmcp q "$1" >& /dev/null); then + zvm_fatal "User $1 not logged on." + else + if ! $(vmcp send $1 ipl $2); then + zvm_fatal "Could not send command to $1" + fi + fi + else + zvm_fatal "Not enough arguments for ipl. Need user and device number." + fi +} + + +zvm_destroy() { + # Destroy build. Done by killing the worker machine. + # needs user as $1 + if test -n "$1"; then + if ! $(vmcp force $1 ) ; then + zvm_fatal "Could not force $1" + fi + fi +} + +zvm_get_local_devnr() { + # $1 is base address, either 150 or 250 + # $2 is worker number + # there is room for up to 100 workers for this controlling guest, however in our setup I expect only up to 10 workers. + #echo "Debug: zvm_get_local_devnr: arg1: $1 arg2: $2" + if test "$2" -ge 100 ; then + zvm_fatal "Not more than 100 workers supported by one controlling guest." + fi + if test "$1" = "0150" -o "$1" = "150" ; then + DEVNR=$((300+$2)) + else + if test "$1" = "0250" -o "$1" = "250" ; then + DEVNR=$((400+$2)) + else + zvm_fatal "The disk devices for root and swap must be 150 and 250 respectively." + fi + fi + echo $DEVNR +} + +zvm_volume_link_local() { + # attach worker disk to local system as preparation for + # a) prepare worker for build + # b) get rpms of the swap disk after build finished + # disk must be detached from worker first + # The following arguments are needed: + # 1. Worker user name + # 2. Worker disk device number + # 3. Mult password for the disk + # 4. Worker number to generate a uniq local device number + if test -n "$4"; then + DEVNR=$(zvm_get_local_devnr $2 $4) + if ! vmcp link $1 $2 $DEVNR MW pass=THR4ME >& /dev/null ; then + zvm_fatal "Could not link disk $2 from user $1 to local device $DEVNR." + fi + dasd_configure 0.0.0$DEVNR 1 0 >& /dev/null + udevadm settle + DEVICE=$(ls /sys/bus/ccw/devices/0.0.0$DEVNR/block/) + if ! test -b /dev/${DEVICE}1 ; then + zvm_fatal "The device /sys/bus/ccw/devices/0.0.0$DEVNR has not been setup correctly." + fi + echo "${DEVICE}1" + else + zvm_fatal "Not enough arguments given to volume_link_local." + fi +} + +zvm_volume_detach_local() { + # we need + # 1. worker device number + # 2. worker number + DEVNR=$(zvm_get_local_devnr $1 $2) + prevent_detach $DEVNR + dasd_configure 0.0.0$DEVNR 0 0 + if ! vmcp detach $DEVNR >& /dev/null ; then + zvm_fatal "Could not locally detach disk number $1 from worker $2" + fi +} + +zvm_volume_attach() { + # link the local disk of the worker + # $1: user name + # $2: disk device number + # send link * nr nr + if ! vmcp send $1 link \* $2 $2 ; then + zvm_fatal "Could not link remote worker disk number $2 from user $1" + fi +} + +zvm_volume_detach() { + # send machine detach nr + # $1: user name + # $2: disk + if ! vmcp send $1 detach $2 ; then + zvm_fatal "Could not detach disk $2 on worker $1" + fi +} + +zvm_worker_init() { + # 1. Worker user name + # 2. Worker root device number + # 3. Worker swap device number + # 4. Worker number to generate a uniq local device number + # Check for: + # - still mounted dasd + # - configured dasd + # - linked dasd + # - reset worker with force and autolog + DEVNR_ROOT=$(zvm_get_local_devnr $2 $4) + DEVNR_SWAP=$(zvm_get_local_devnr $3 $4) + # First, check for mounts: + for DEVNR in $DEVNR_ROOT $DEVNR_SWAP ; do + if test -d /sys/bus/ccw/devices/0.0.0$DEVNR/block ; then + DEV=$(ls /sys/bus/ccw/devices/0.0.0$DEVNR/block/) + echo "Found device of worker $1 available at $DEVNR, device is /dev/$DEV." + grep "/dev/$DEV" /proc/mounts >& /dev/null && umount /dev/${DEV}1 + fi + done + # Second, check if devices are online + for DEVNR in $DEVNR_ROOT $DEVNR_SWAP ; do + lsdasd $DEVNR | grep $DEVNR && dasd_configure 0.0.0$DEVNR 0 0 + done + # Third, remove stale links + for DEVNR in $DEVNR_ROOT $DEVNR_SWAP ; do + prevent_detach $DEVNR + if vmcp q v $DEVNR 2> /dev/null ; then + vmcp detach $DEVNR + fi + done + # Fourth, reset worker + zvm_logon $1 +} + +zvm_cp() { + modprobe vmcp || zvm_fatal "Cannod load vmcp module" + if test -n "$1" ; then + case "$1" in + start) shift ; zvm_logon "$@" ;; + ipl) shift ; zvm_ipl "$@" ;; + destroy) shift ; zvm_destroy "$@" ;; + volume_attach) shift ; zvm_volume_attach "$@" ;; + volume_detach) shift ; zvm_volume_detach "$@" ;; + volume_link_local) shift ; zvm_volume_link_local "$@" ;; + volume_detach_local) shift ; zvm_volume_detach_local "$@" ;; + memset) shift ; zvm_memset "$@" ;; + worker_init) shift ; zvm_worker_init "$@" ;; + esac + fi +} + +####################################################################################### + +vm_verify_options_zvm() { + VM_IMAGE=/dev/dasda1 + VM_SWAP=/dev/dasdb1 + + VM_SWAPDEV=/dev/dasdb1 # in the vm + + if test -z "$VM_VOLUME_ROOT" ; then + if test -n "$BUILD_ROOT" -a ${#BUILD_ROOT} -le 4 ; then + VM_VOLUME_ROOT="$BUILD_ROOT" + else + VM_VOLUME_ROOT="0150" + fi + fi + # In z/VM, this is a 4 digit hex number instead of a linux device. + # This is the swap disk defined in user direct + # This number can be given with the parameter --swap NR. + if test -z "$VM_VOLUME_SWAP" ; then + if test -n "$VM_SWAP" -a ${#VM_SWAP} -le 4 ; then + VM_VOLUME_SWAP="$VM_SWAP" + else + VM_VOLUME_SWAP="0250" + fi + fi + # z/VM guest name that is already defined in z/VM + if test -z "$VM_WORKER" ; then + echo "ERROR: No z/VM worker id specified" + cleanup_and_exit 3 + fi + if test -z "$VM_WORKER_NR" ; then + echo "ERROR: No z/VM worker number specified" + cleanup_and_exit 3 + fi + # need the name for a kernel in zvm + if test -n "$VM_KERNEL" ; then + vm_kernel="$VM_KERNEL" + elif test -e "/boot/vmlinux.gz" ; then + vm_kernel="/boot/vmlinux.gz" + else + echo "ERROR: No z/VM kernel specified" + cleanup_and_exit 3 + fi + # need the name for an initrd in zvm + # this normally will not be the local initrd + if test -n "$VM_INITRD" ; then + vm_initrd="$VM_INITRD" + else + echo "ERROR: No z/VM initrd specified" + cleanup_and_exit 3 + fi + zvm_cp worker_init $VM_WORKER $VM_VOLUME_ROOT $VM_VOLUME_SWAP $VM_WORKER_NR + zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT + zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP +} + +vm_startup_zvm() { + # link root/swap to the worker + zvm_cp volume_attach $VM_WORKER $VM_VOLUME_ROOT + zvm_cp volume_attach $VM_WORKER $VM_VOLUME_SWAP + zvm_cp ipl $VM_WORKER $VM_VOLUME_ROOT + # start IUCV Console + # IPL needs some time until IPL really starts... + sleep 2 + # start iucv console. This blocks until build process is finished. + iucvconn $VM_WORKER lnxhvc0 + # sleep some time before taking root and swap devices from worker + # This might be critical regarding timing (IUCV_CONSOLE down, but machine still running) + sleep 5 + zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT + zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP +} + +vm_kill_zvm() { + if vmcp q "$VM_WORKER" > /dev/null 2>&1 ; then + if ! zvm_cp destroy $VM_WORKER ; then + echo "could not kill zvm worker $VM_WORKER" + cleanup_and_exit 1 + fi + fi +} + +vm_fixup_zvm() { + # initrd is created in obsstoragesetup. + # If it is desired to use a project dependent kernel, use make_guestinitrd from zvm_functions. + # have to copy kernel/initrd and run zipl to be able to IPL + # have to set init_script before unmounting, thus doing it statically for now. + zvm_init_script="/.build/build" + mkdir -p $BUILD_ROOT/boot + cp $vm_kernel $vm_initrd $BUILD_ROOT/boot + mkdir -p $BUILD_ROOT/boot/zipl + # finally, install bootloader to the worker disk + zipl -t $BUILD_ROOT/boot/zipl -i ${BUILD_ROOT}${vm_kernel} -r ${BUILD_ROOT}${vm_initrd} \ + --parameters "${zvm_param} init=$zvm_init_script rootfsopts=noatime" +} + +vm_attach_root_zvm() { + VM_IMAGE=$(ZVM_CLEANUP=1 zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_ROOT $zvm_mult_pass $VM_WORKER_NR ) + if test "${VM_IMAGE}" = "${VM_IMAGE#dasd}" ; then + echo "did not get a real device for VM_IMAGE: $VM_IMAGE" + cleanup_and_exit 3 + fi + VM_IMAGE="/dev/$VM_IMAGE" +} + +vm_attach_swap_zvm() { + VM_SWAP=$(ZVM_CLEANUP=1 zvm_cp volume_link_local $VM_WORKER $VM_VOLUME_SWAP $zvm_mult_pass $VM_WORKER_NR ) + if test "${VM_SWAP}" = "${VM_SWAP#dasd}" ; then + echo "did not get a real device for VM_SWAP: $VM_SWAP" + cleanup_and_exit 3 + fi + VM_SWAP="/dev/$VM_SWAP" +} + +vm_detach_root_zvm () { + zvm_cp volume_detach_local $VM_VOLUME_ROOT $VM_WORKER_NR +} + +vm_detach_swap_zvm() { + zvm_cp volume_detach_local $VM_VOLUME_SWAP $VM_WORKER_NR +} + +vm_cleanup_zvm() { + if test -n "$VM_WORKER" -a -n "$VM_WORKER_NR" -a -n "$VM_VOLUME_ROOT" -a -n "$VM_VOLUME_SWAP" ; then + ZVM_CLEANUP=1 + (zvm_cp volume_detach $VM_WORKER $VM_VOLUME_ROOT >/dev/null 2>&1) + (zvm_cp volume_detach $VM_WORKER $VM_VOLUME_SWAP >/dev/null 2>&1) + (zvm_cp volume_detach_local $VM_VOLUME_ROOT $VM_WORKER_NR >/dev/null 2>&1) + (zvm_cp volume_detach_local $VM_VOLUME_SWAP $VM_WORKER_NR >/dev/null 2>&1) + fi +} + diff --git a/build_kiwi.sh b/build_kiwi.sh deleted file mode 100644 index 3f91119..0000000 --- a/build_kiwi.sh +++ /dev/null @@ -1,368 +0,0 @@ -#!/bin/bash -run_kiwi() -{ - imagetype=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$SPECFILE imagetype) - imagename=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$SPECFILE filename) - imageversion=$(perl -I$BUILD_DIR -MBuild::Kiwi -e Build::Kiwi::show $BUILD_ROOT/$TOPDIR/SOURCES/$SPECFILE version) - # prepare rpms as source and createrepo on the repositories - ln -sf $TOPDIR/SOURCES/repos $BUILD_ROOT/repos - cd $BUILD_ROOT/$TOPDIR/SOURCES/repos - for r in */* ; do - test -L $r && continue - test -d $r || continue - repo="$TOPDIR/SOURCES/repos/$r/" - # create compatibility link for old kiwi versions - rc="${r//:/:/}" - if test "$rc" != "$r" ; then - rl="${rc//[^\/]}" - rl="${rl//?/../}" - mkdir -p "${rc%/*}" - ln -s $rl$r "${rc%/*}/${rc##*/}" - repo="$TOPDIR/SOURCES/repos/${rc%/*}/${rc##*/}/" - fi - if test "$imagetype" != product -a "$DO_INIT" != "false" ; then - echo "creating repodata for $repo" - if chroot $BUILD_ROOT createrepo --no-database --simple-md-filenames --help >/dev/null 2>&1 ; then - chroot $BUILD_ROOT createrepo --no-database --simple-md-filenames "$repo" - else - chroot $BUILD_ROOT createrepo "$repo" - fi - fi - done - # unpack root tar - for t in $BUILD_ROOT/$TOPDIR/SOURCES/root.tar* ; do - test -f $t || continue - mkdir -p $BUILD_ROOT/$TOPDIR/SOURCES/root - chroot $BUILD_ROOT tar -C $TOPDIR/SOURCES/root -xf "$TOPDIR/SOURCES/${t##*/}" - done - # fix script permissions - chmod a+x $BUILD_ROOT/$TOPDIR/SOURCES/*.sh 2>/dev/null - # unpack tar files in image directories - if test -d $BUILD_ROOT/$TOPDIR/SOURCES/images ; then - ( - cd $BUILD_ROOT/$TOPDIR/SOURCES/images - for r in */* ; do - test -L $r && continue - test -d $r || continue - for t in $r/root.tar* ; do - test -f $t || continue - mkdir -p $r/root - chroot $BUILD_ROOT tar -C $TOPDIR/SOURCES/images/$r/root -xf "$TOPDIR/SOURCES/images/$r/${t##*/}" - done - # fix script permissions - chmod a+x $BUILD_ROOT/$TOPDIR/SOURCES/images/$r/*.sh 2>/dev/null - # create compatibility link for old kiwi versions - rc="${r//:/:/}" - if test "$rc" != "$r" ; then - rl="${rc//[^\/]}" - rl="${rl//?/../}" - mkdir -p "${rc%/*}" - ln -s $rl$r "${rc%/*}/${rc##*/}" - fi - done - ) - fi - rm -f $BUILD_ROOT/$TOPDIR/SOURCES/config.xml - ln -s $SPECFILE $BUILD_ROOT/$TOPDIR/SOURCES/config.xml - if test "$imagetype" = product ; then - echo "running kiwi --create-instsource..." - # runs always as abuild user - mkdir -p "$BUILD_ROOT/$TOPDIR/KIWIROOT" - chroot "$BUILD_ROOT" chown -R abuild.abuild "$TOPDIR" - ver=`chroot "$BUILD_ROOT" su -c "/usr/sbin/kiwi --version | sed -n 's,.*kiwi version v\(.*\),\1,p'"` - if [ ${ver:0:1} == "3" ]; then - # old style kiwi 3 builds - chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT -v --logfile terminal -p $TOPDIR/SOURCES --instsource-local --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true - if [ ${ver:2:2} == "01" ]; then - ## This block is obsolete with current kiwi versions, only needed for kiwi 3.01 version - for i in $BUILD_ROOT/$TOPDIR/KIWIROOT/main/* ; do - test -d "$i" || continue - n="${i##*/}" - test "$n" = scripts && continue - test "$n" != "${n%0}" && continue - chroot $BUILD_ROOT su -c "suse-isolinux $TOPDIR/KIWIROOT/main/$n $TOPDIR/KIWI/$n.iso" - $BUILD_USER - done - fi - else - if [ ${ver:0:1} == "4" -a ${ver:2:2} -lt 90 ]; then - # broken kiwi version, not accepting verbose level - chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT -v -v --logfile terminal -p $TOPDIR/SOURCES --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true - else - # current default - chroot "$BUILD_ROOT" su -c "APPID=- LANG=POSIX /usr/sbin/kiwi --root $TOPDIR/KIWIROOT -v 2 --logfile terminal -p $TOPDIR/SOURCES --create-instsource $TOPDIR/SOURCES" - abuild < /dev/null && BUILD_SUCCEEDED=true - fi - fi - - # move created product to correct destination - for i in $BUILD_ROOT/$TOPDIR/KIWIROOT/main/* ; do - test -e "$i" || continue - f=${i##*/} - case $f in - *.iso) mv $i $BUILD_ROOT/$TOPDIR/KIWI/. ;; - *.packages) mv $i $BUILD_ROOT/$TOPDIR/OTHER/. ;; - scripts) ;; - *0) ;; - *) test -d $i && mv $i $BUILD_ROOT/$TOPDIR/KIWI/. ;; - esac - done - else - BUILD_SUCCEEDED=true - if [ -z "$RUNNING_IN_VM" ]; then - # NOTE: this must be done with the outer system, because it loads the dm-mod kernel modules, which needs to fit to the kernel. - echo "starting device mapper for kiwi..." - [ -x /etc/init.d/boot.device-mapper ] && /etc/init.d/boot.device-mapper start - fi - for imgtype in $imagetype ; do - echo "running kiwi --prepare for $imgtype..." - # Do not use $BUILD_USER here, since we always need root permissions - if chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && kiwi --prepare $TOPDIR/SOURCES --logfile terminal --root $TOPDIR/KIWIROOT-$imgtype $KIWI_PARAMETERS" - root < /dev/null ; then - echo "running kiwi --create for $imgtype..." - mkdir -p $BUILD_ROOT/$TOPDIR/KIWI-$imgtype - chroot $BUILD_ROOT su -c "cd $TOPDIR/SOURCES && kiwi --create $TOPDIR/KIWIROOT-$imgtype --logfile terminal --type $imgtype -d $TOPDIR/KIWI-$imgtype $KIWI_PARAMETERS" - root < /dev/null || cleanup_and_exit 1 - else - cleanup_and_exit 1 - fi - done - - # create tar.gz of images, in case it makes sense - imagearch=`uname -m` - buildnum="" - if test -n "$RELEASE"; then - buildnum="-Build$RELEASE" - fi - imageout="$imagename.$imagearch-$imageversion" - for imgtype in $imagetype ; do - case "$imgtype" in - oem) - cat > $BUILD_ROOT/kiwi_post.sh << EOF -echo "compressing oem images... " -cd /$TOPDIR/KIWI-oem -# do not store compressed file _and_ uncompressed one -[ -e "$imageout.gz" ] && rm -f "$imageout" -if [ -e "$imageout.iso" ]; then - echo "take iso file and create sha256..." - mv "$imageout.iso" "/$TOPDIR/KIWI/$imageout$buildnum.iso" - pushd /$TOPDIR/KIWI - if [ -x /usr/bin/sha256sum ]; then - /usr/bin/sha256sum "$imageout$buildnum.iso" > "$imageout$buildnum.iso.sha256" - fi - popd -fi -if [ -e "$imageout.install.iso" ]; then - echo "take install.iso file and create sha256..." - mv "$imageout.install.iso" "/$TOPDIR/KIWI/$imageout$buildnum.install.iso" - pushd /$TOPDIR/KIWI - if [ -x /usr/bin/sha256sum ]; then - /usr/bin/sha256sum "$imageout$buildnum.install.iso" > "$imageout$buildnum.install.iso.sha256" - fi - popd -fi -if [ -e "$imageout.qcow2" ]; then - mv "$imageout.qcow2" "/$TOPDIR/KIWI/$imageout$buildnum.qcow2" - pushd /$TOPDIR/KIWI - if [ -x /usr/bin/sha256sum ]; then - echo "Create sha256 file..." - /usr/bin/sha256sum "$imageout$buildnum.qcow2" > "$imageout$buildnum.qcow2.sha256" - fi - popd -fi -if [ -e "$imageout.raw.install.raw" ]; then - compress_tool="bzip2" - compress_suffix="bz2" - if [ -x /usr/bin/xz ]; then - # take xz to get support for sparse files - compress_tool="xz -2" - compress_suffix="xz" - fi - mv "$imageout.raw.install.raw" "/$TOPDIR/KIWI/$imageout$buildnum.raw.install.raw" - pushd /$TOPDIR/KIWI - echo "\$compress_tool raw.install.raw file..." - \$compress_tool "$imageout$buildnum.raw.install.raw" - if [ -x /usr/bin/sha256sum ]; then - echo "Create sha256 file..." - /usr/bin/sha256sum "$imageout$buildnum.raw.install.raw.\${compress_suffix}" > "$imageout$buildnum.raw.install.raw.\${compress_suffix}.sha256" - fi - popd -fi -if [ -e "$imageout.raw" ]; then - compress_tool="bzip2" - compress_suffix="bz2" - if [ -x /usr/bin/xz ]; then - # take xz to get support for sparse files - compress_tool="xz -2" - compress_suffix="xz" - fi - mv "$imageout.raw" "/$TOPDIR/KIWI/$imageout$buildnum.raw" - pushd /$TOPDIR/KIWI - echo "\$compress_tool raw file..." - \$compress_tool "$imageout$buildnum.raw" - if [ -x /usr/bin/sha256sum ]; then - echo "Create sha256 file..." - /usr/bin/sha256sum "$imageout$buildnum.raw.\${compress_suffix}" > "$imageout$buildnum.raw.\${compress_suffix}.sha256" - fi - popd -fi - -tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-raw.tar.bz2" \ - --exclude="$imageout.iso" --exclude="$imageout.raw" --exclude="$imageout.qcow2" * -cd /$TOPDIR/KIWI -if [ -x /usr/bin/sha256sum ]; then - /usr/bin/sha256sum "$imageout$buildnum-raw.tar.bz2" > "$imageout$buildnum-raw.tar.bz2.sha256" -fi -EOF - ;; - vmx) - cat > $BUILD_ROOT/kiwi_post.sh << EOF -echo "compressing vmx images... " -cd /$TOPDIR/KIWI-vmx -for suffix in "ovf" "qcow2" "ova"; do - if [ -e "$imageout.\$suffix" ]; then - mv "$imageout.\$suffix" "/$TOPDIR/KIWI/$imageout$buildnum.\$suffix" - pushd /$TOPDIR/KIWI - if [ -x /usr/bin/sha256sum ]; then - echo "Create sha256 \$suffix file..." - /usr/bin/sha256sum "$imageout$buildnum.\$suffix" > "$imageout$buildnum.\$suffix.sha256" - fi - popd - fi -done -# This option has a number of format parameters -VMXFILES="" -SHAFILES="" -for i in "$imageout.vmx" "$imageout.vmdk" "$imageout-disk*.vmdk"; do - test -e \$i && VMXFILES="\$VMXFILES \$i" -done -# take raw files as fallback -if [ -n "\$VMXFILES" ]; then - tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx.tar.bz2" \$VMXFILES - SHAFILES="\$SHAFILES $imageout$buildnum-vmx.tar.bz2" -elif [ -e "$imageout.raw" ]; then - compress_tool="bzip2" - compress_suffix="bz2" - if [ -x /usr/bin/xz ]; then - # take xz to get support for sparse files - compress_tool="xz -2" - compress_suffix="xz" - fi - mv "$imageout.raw" "/$TOPDIR/KIWI/$imageout$buildnum-vmx.raw" - pushd /$TOPDIR/KIWI - echo "\$compress_tool raw file..." - \$compress_tool "$imageout$buildnum-vmx.raw" - SHAFILES="\$SHAFILES $imageout$buildnum-vmx.raw.\${compress_suffix}" - popd -fi -if [ -e "$imageout.xenconfig" ]; then - tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-vmx.tar.bz2" $imageout.xenconfig $imageout.raw initrd-* - SHAFILES="\$SHAFILES $imageout$buildnum-vmx.tar.bz2" -fi -# FIXME: do we need a single .raw file in any case ? - -cd /$TOPDIR/KIWI -if [ -n "\$SHAFILES" -a -x /usr/bin/sha256sum ]; then - for i in \$SHAFILES; do - echo "Create sha256 file..." - /usr/bin/sha256sum "\$i" > "\$i.sha256" - done -fi -EOF - ;; - xen) - cat > $BUILD_ROOT/kiwi_post.sh << EOF -echo "compressing xen images... " -cd /$TOPDIR/KIWI-xen -# do not store compressed file _and_ uncompressed one -[ -e "$imageout.gz" ] && rm -f "$imageout" -tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-xen.tar.bz2" \ - `grep ^kernel $imageout.xenconfig | cut -d'"' -f2` \ - `grep ^ramdisk $imageout.xenconfig | cut -d'"' -f2` \ - initrd-* \ - "$imageout.xenconfig" \ - "$imageout" -if [ -x /usr/bin/sha256sum ]; then - echo "Create sha256 file..." - cd $TOPDIR/KIWI - /usr/bin/sha256sum "$imageout$buildnum-xen.tar.bz2" > "$imageout$buildnum-xen.tar.bz2.sha256" -fi -EOF - ;; - pxe) - cat > $BUILD_ROOT/kiwi_post.sh << EOF -echo "compressing pxe images... " -cd /$TOPDIR/KIWI-pxe -# do not store compressed file _and_ uncompressed one -[ -e "$imageout.gz" ] && rm -f "$imageout" -tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-pxe.tar.bz2" ${imageout}* initrd-* -if [ -x /usr/bin/sha256sum ]; then - echo "Create sha256 file..." - cd $TOPDIR/KIWI - /usr/bin/sha256sum "$imageout$buildnum-pxe.tar.bz2" > "$imageout$buildnum-pxe.tar.bz2.sha256" -fi -EOF - ;; - iso) - cat > $BUILD_ROOT/kiwi_post.sh << EOF -cd /$TOPDIR/KIWI-iso -for i in *.iso; do - mv "\$i" "/$TOPDIR/KIWI/\${i%.iso}$buildnum.iso" -done -if [ -x /usr/bin/sha256sum ]; then - echo "creating sha256 sum for iso images... " - cd $TOPDIR/KIWI - for i in *.iso; do - /usr/bin/sha256sum "\$i" > "\$i.sha256" - done -fi -EOF - ;; - tbz) - cat > $BUILD_ROOT/kiwi_post.sh << EOF -cd /$TOPDIR/KIWI-tbz -for i in *.tbz; do - file=\$(readlink -f "\$i") - [ -z "\$file" ] && echo readlink failed for $i - mv "\$file" "/$TOPDIR/KIWI/\${i%.tbz}$buildnum.tbz" -done -if [ -x /usr/bin/sha256sum ]; then - echo "creating sha256 sum for tar balls... " - cd $TOPDIR/KIWI - for i in *.tbz; do - /usr/bin/sha256sum "\$i" > "\$i.sha256" - done -fi -EOF - ;; - *) - cat > $BUILD_ROOT/kiwi_post.sh << EOF -echo "compressing unkown images... " -cd /$TOPDIR/KIWI-$imgtype -# do not store compressed file _and_ uncompressed one -[ -e "$imageout.gz" ] && rm -f "$imageout" -tar cvjfS "/$TOPDIR/KIWI/$imageout$buildnum-$imgtype.tar.bz2" * -if [ -x /usr/bin/sha256sum ]; then - echo "Create sha256 file..." - cd /$TOPDIR/KIWI - /usr/bin/sha256sum "$imageout$buildnum-$imgtype.tar.bz2" > "$imageout$buildnum-$imgtype.tar.bz2.sha256" -fi -EOF - ;; - esac - cat >> $BUILD_ROOT/kiwi_post.sh << EOF -cd /$TOPDIR/KIWI-$imgtype -if [ -e "$imageout.packages" ]; then - echo "Found kiwi package list file, exporting as well..." - cp "$imageout.packages" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.packages" -fi -if [ -e "$imageout.verified" ]; then - echo "Found rpm verification report, exporting as well..." - cp "$imageout.verified" "/$TOPDIR/OTHER/$imageout$buildnum-$imgtype.verified" -fi -EOF - chroot $BUILD_ROOT su -c "sh -e /kiwi_post.sh" || cleanup_and_exit 1 - rm -f $BUILD_ROOT/kiwi_post.sh - done - fi - # Hook for running post kiwi build scripts like QA scripts if installed - if [ -x $BUILD_ROOT/usr/lib/build/kiwi_post_run ]; then - chroot $BUILD_ROOT su -c /usr/lib/build/kiwi_post_run || cleanup_and_exit 1 - fi -} diff --git a/changelog2spec b/changelog2spec index dceb7e5..4b94798 100755 --- a/changelog2spec +++ b/changelog2spec @@ -49,6 +49,10 @@ if (@ARGV == 2 && $ARGV[0] eq '--file') { opendir(D, $dir) || die("$dir: $!\n"); my @changes = grep {/\.changes$/} readdir(D); closedir(D); + # support _service: prefixes, they need to be stripped + $file =~ s/^_service:.*://; + my %changes = map {/^((?:_service:.*:)?(.*?))$/ ? ($2, $1) : ($_, $_)} @changes; + @changes = keys %changes; @changes = sort {length($a) <=> length($b) || $a cmp $b} @changes; exit(1) unless @changes; # nothing to do if (@changes > 1) { @@ -61,7 +65,7 @@ if (@ARGV == 2 && $ARGV[0] eq '--file') { last unless $file =~ s/[-.][^-.]*$//; } } - @ARGV = ("$dir/$changes[0]"); + @ARGV = ("$dir/$changes{$changes[0]}"); } sub parse_suse { diff --git a/common_functions b/common_functions index a0e528f..4c2c0b6 100755 --- a/common_functions +++ b/common_functions @@ -1,22 +1,13 @@ #!/bin/bash -: ${CACHE_DIR:=/var/cache/build} - -build_host_arch() -{ +build_host_arch() { : ${BUILD_HOST_ARCH:=`uname -m`} + BUILD_INITVM_ARCH="$BUILD_HOST_ARCH" # avoid multiple initvm.* helpers for i586 and i686 - test i686 != "$BUILD_HOST_ARCH" || BUILD_HOST_ARCH=i586 + test i686 != "$BUILD_INITVM_ARCH" || BUILD_INITVM_ARCH=i586 } -set_build_arch() -{ - build_host_arch - - if [ -z "$BUILD_ARCH" ]; then - BUILD_ARCH="$BUILD_HOST_ARCH" - fi - +extend_build_arch() { case $BUILD_ARCH in armv7hl) BUILD_ARCH="armv7hl:armv7l:armv6hl:armv6l:armv5tel" ;; armv7l) BUILD_ARCH="armv7l:armv6l:armv5tel" ;; @@ -37,6 +28,14 @@ set_build_arch() sparc) BUILD_ARCH="sparc" ;; x86_64) BUILD_ARCH="x86_64:i686:i586:i486:i386" ;; esac +} + +set_build_arch() { + build_host_arch + if test -z "$BUILD_ARCH" ; then + BUILD_ARCH="$BUILD_HOST_ARCH" + fi + extend_build_arch if test "$BUILD_ARCH" != "${BUILD_ARCH#i686}" ; then cpuflags=`grep ^flags /proc/cpuinfo` cpuflags="$cpuflags " @@ -47,36 +46,39 @@ set_build_arch() fi } -check_exit() -{ +check_exit() { if test -e $BUILD_ROOT/exit; then echo "exit ..." cleanup_and_exit 1 fi } -check_use_emulator() -{ - arch=":$BUILD_ARCH:" - if test "$arch" != "${arch/:$BUILD_HOST_ARCH:/}"; then - # native supported arch, no emulator - return 1 +check_use_emulator() { + INITVM_NAME= + # check if the extended host arch contains the build arch + local old_build_arch="$BUILD_ARCH" + local arch="${BUILD_ARCH%%:*}" + BUILD_ARCH="$BUILD_HOST_ARCH" + extend_build_arch + BUILD_ARCH=":$BUILD_ARCH:" + if test "$BUILD_ARCH" != "${BUILD_ARCH/:$arch:/}" ; then + # native supported arch, no emulator + BUILD_ARCH="$old_build_arch" + return 1 fi + BUILD_ARCH="$old_build_arch" - # to run the qemu initialization in the XEN chroot, we need to + # to run the qemu initialization in the vm, we need to # register it with a static program or shell script - if test -e $BUILD_DIR/initvm.$BUILD_HOST_ARCH && \ - test -e $BUILD_DIR/qemu-reg; then - chmod 0755 "$BUILD_DIR/initvm.$BUILD_HOST_ARCH" - if [ -z "$PREPARE_VM" ]; then - return 0 # chroot build, we need to run - fi - # emulator in vm already registered during startup - else - # XXX: error? - echo "Warning: cross compile not possible due to missing static binaries. please install build-initvm package for that purpose." - echo " check that the right architecture is available for your build host, you need initvm.$BUILD_HOST_ARCH for this one." + INITVM_NAME="initvm.$BUILD_INITVM_ARCH" + if test -e "$BUILD_DIR/$INITVM_NAME" -a -e "$BUILD_DIR/qemu-reg" ; then + chmod 0755 "$BUILD_DIR/$INITVM_NAME" + return 0 # chroot build, we need to run fi + # XXX: error? + echo "Warning: cross compile not possible due to missing static binaries. please install build-initvm package for that purpose." + echo " check that the right architecture is available for your build host, you need $INITVM_NAME for this one." + INITVM_NAME= return 1 } diff --git a/computeblocklists b/computeblocklists index f9300d6..80d2ca7 100755 --- a/computeblocklists +++ b/computeblocklists @@ -10,12 +10,11 @@ # # a block is either a number or a range (start-end) # -# TODO: instead of printing zeroes for each block in a hole use -# something like 0*num use strict; -my ($opt_padstart, $opt_padend, $opt_verbose); +my ($opt_padstart, $opt_padend, $opt_verbose, $opt_manifest, $opt_mani0); +$opt_verbose = 0; while (@ARGV) { if ($ARGV[0] eq '--padstart') { @@ -30,71 +29,139 @@ while (@ARGV) { } if ($ARGV[0] eq '--verbose' || $ARGV[0] eq '-v') { shift @ARGV; - $opt_verbose = 1; + $opt_verbose++; + next; + } + if ($ARGV[0] eq '-0') { + shift @ARGV; + $opt_mani0 = 1; + next; + } + if ($ARGV[0] eq '--manifest') { + shift @ARGV; + $opt_manifest = shift @ARGV; next; } last; } -if($opt_padstart) { - print "\n"x$opt_padstart; +print "\n"x$opt_padstart if $opt_padstart; + +if ($opt_manifest) { + if ($opt_manifest eq '-') { + open(MANIFEST, '<&STDIN') || die("STDIN dup: $!\n"); + } else { + open(MANIFEST, '<', $opt_manifest) || die("$opt_manifest: $!\n"); + } } -for my $file (@ARGV) { - next unless -f $file; - print STDERR "$file\n" if $opt_verbose; +while (1) { + my $file; + if (@ARGV) { + $file = shift @ARGV; + } elsif ($opt_manifest) { + if ($opt_mani0) { + local $/ = "\0"; + $file = ; + last unless defined $file; + $file =~ s/\0$//s; + } else { + $file = ; + last unless defined $file; + chomp $file; + } + } else { + last; + } my $n = $file; - $n =~ s/.*\///; + $n =~ s/([\000-\037 %])/sprintf("%%%02X", ord($1))/ges; + if (-l $file) { + print STDERR "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//); + my $c = readlink($file); + die("$file: readlink: $!\n") unless defined $c; + if ("/$c/" =~ /\/\.?\//s) { + print STDERR "$file: bad symlink ($c) ignored\n"; + next; + } + if ("/$c/" =~ /^(\/\.\.)+\/(.*?)$/s) { + my ($head, $tail) = ($1, $2); + if (("/$tail/" =~ /\/\.\.\//s) || (($head =~ y!/!!) > ($file =~ y!/!!))) { + print STDERR "$file: bad symlink ($c) ignored\n"; + next; + } + } else { + if ("/$c/" =~ /\/\.\.\//s) { + print STDERR "$file: bad symlink ($c) ignored\n"; + next; + } + } + $c =~ s/([\000-\037 %])/sprintf("%%%02X", ord($1))/ges; + print "l $n $c\n"; + next; + } elsif (-d _) { + print STDERR "$file\n" if $opt_verbose && $opt_verbose > 1; + my @stat = stat(_); + print "d $n\n"; + next; + } elsif (!-f _) { + next; + } + print STDERR "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//); - if(!open(F, '<', $file)) { + if (!open(F, '<', $file)) { print STDERR "$file: $!"; next; } + my @stat = stat(F); + die unless @stat; + my $st_size = $stat[7]; + if ($st_size == 0) { + print "f $n 0\n"; + close F; + next; + } + my $bsize = 'xxxx'; ioctl(F, 2, $bsize) || ioctl(F, 536870914, $bsize) || die("FIGETBSZ: $!\n"); $bsize = unpack("L", $bsize); + die("$file: empty blocksize\n") unless $bsize != 0; - my @stat = stat(F); - my ($st_size, $st_blocks) = ($stat[7], $stat[11], $stat[12]); - + print "f $n $st_size $bsize"; my $blocks = int(($st_size+$bsize-1)/$bsize); - - print "$n $st_size $bsize "; - my ($firstblock, $lastblock); for ($b = 0; $b < $blocks; ++$b) { my $block = pack('I', $b); - if(not defined ioctl(F, 1, $block)) { - if(not defined ioctl(F, 536870913, $block)) { - die "$file: $!"; - } + if (not defined ioctl(F, 1, $block)) { + if (not defined ioctl(F, 536870913, $block)) { + die "$file: $!\n"; + } } $block = unpack('I', $block); - if($b == 0) { - print "$block"; - $firstblock = $block; - } else { - # blocks are non-contiguous - if($lastblock+1 != $block) { - # check if we skipped some that form a range - if($firstblock != $lastblock) { - printf "-$lastblock"; - } + if (!$firstblock && defined($firstblock)) { + # last block was hole + if (!$block) { + $lastblock++; # count holes, 0-2 means three hole blocks + } else { + # switch back from 'hole mode' into normal mode + printf "-$lastblock" if defined($firstblock) && $firstblock != $lastblock; print " $block"; - $firstblock = $block; - } - # last block, check if contiguous - if($b+1==$blocks && $lastblock+1 == $block) { - print "-$block"; + $firstblock = $lastblock = $block; } + next; + } + if (!$firstblock || $lastblock + 1 != $block) { + # start of a new run + printf "-$lastblock" if defined($firstblock) && $firstblock != $lastblock; + print " $block"; + $firstblock = $block; } $lastblock = $block; } + # finish last run + printf "-$lastblock" if defined($firstblock) && $firstblock != $lastblock; close F; print "\n"; } -if($opt_padend) { - print "\n"x$opt_padend; -} +print "\n"x$opt_padend if $opt_padend; diff --git a/configs/arch.conf b/configs/arch.conf index 466475e..c2748fb 100644 --- a/configs/arch.conf +++ b/configs/arch.conf @@ -3,9 +3,10 @@ Repotype: arch Preinstall: glibc bash perl sed grep coreutils pacman pacman-mirrorlist Preinstall: gawk gzip filesystem curl acl gpgme libarchive Preinstall: openssl libssh2 zlib libassuan libgpg-error attr -Preinstall: expat xz bzip2 +Preinstall: expat xz bzip2 readline lzo2 krb5 e2fsprogs keyutils +Preinstall: ncurses -VMinstall: util-linux binutils readline ncurses pcre libcap +VMinstall: util-linux libutil-linux binutils pcre libcap Required: binutils gcc glibc libtool @@ -14,3 +15,8 @@ Support: libtool ncurses perl gpgme libarchive openssl libssh2 Support: libassuan libgpg-error attr expat xz pacman pacman-mirrorlist Support: fakeroot file sudo patch make net-tools pkg-config +Prefer: zlib ttf-dejavu +Prefer: libgl jdk7-openjdk libdrm + +Prefer: -nvidia-libgl -nvidia-304xx-utils + diff --git a/configs/sl13.2.conf b/configs/sl13.2.conf index 77cd7ae..37981f7 100644 --- a/configs/sl13.2.conf +++ b/configs/sl13.2.conf @@ -22,6 +22,7 @@ Conflict: kiwi:systemd-mini Conflict: libudev1:udev-mini FileProvides: /usr/sbin/groupadd pwdutils +FileProvides: /usr/sbin/useradd shadow FileProvides: /sbin/netconfig sysconfig-netconfig Preinstall: aaa_base attr bash coreutils diffutils @@ -37,14 +38,14 @@ Runscripts: aaa_base Order: libopenssl0_9_8:openssl-certs Prefer: libdb-4_8-devel -VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1 net-tools +VMinstall: util-linux libmount1 perl-base libdb-4_8 libsepol1 libblkid1 libuuid1 net-tools +# kernel-obs-build - bnc#865554 ExportFilter: \.x86_64\.rpm$ x86_64 ExportFilter: \.ia64\.rpm$ ia64 ExportFilter: \.s390x\.rpm$ s390x ExportFilter: \.ppc64\.rpm$ ppc64 ExportFilter: \.ppc\.rpm$ ppc -ExportFilter: \.ppc64le\.rpm$ ppc64le ExportFilter: -ia32-.*\.rpm$ ExportFilter: -32bit-.*\.sparc64\.rpm$ ExportFilter: -64bit-.*\.sparcv9\.rpm$ @@ -55,7 +56,7 @@ ExportFilter: ^glibc(?:-devel)?-64bit-.*\.sparcv9\.rpm$ sparcv9 # it would be a great idea to have, but sometimes installation-images wants to build debuginfos in #ExportFilter: -debuginfo-.*\.rpm$ #ExportFilter: -debugsource-.*\.rpm$ -ExportFilter: ^master-boot-code.*\.i586.rpm$ . x86_64 +#ExportFilter: ^master-boot-code.*\.i586.rpm$ . x86_64 ExportFilter: ^acroread.*\.i586.rpm$ . x86_64 ExportFilter: ^avmailgate.*\.i586.rpm$ . x86_64 ExportFilter: ^avmailgate.*\.ppc.rpm$ . ppc64 @@ -134,7 +135,7 @@ Prefer: pkg-config gtk-doc wlan-kmp-default lua-libs lua-devel Prefer: gnu-jaf classpathx-mail avahi-compat-mDNSResponder yast2-control-center-qt Prefer: vim-normal myspell-american wine Prefer: eclipse-platform eclipse-scripts -Prefer: yast2-theme-openSUSE +Prefer: yast2-theme-openSUSE enlightenment-theme-upstream Prefer: amarok:amarok-xine Prefer: kdenetwork3-vnc:tightvnc Prefer: libgweather0 jessie ndesk-dbus ndesk-dbus-glib tomcat6-jsp-2_1-api tomcat6-servlet-2_5-api @@ -237,13 +238,14 @@ Prefer: typelib-1_0-Gst-0_10 gstreamer-0_10-utils-unversioned gstreamer-0_10-uti Prefer: libudev-mini-devel libudev-mini1 udev-debuginfo libudev1-debuginfo Prefer: systemd-mini systemd-mini-devel Prefer: systemd-mini-devel:systemd-mini -Prefer: udev-mini +Prefer: udev-mini libcom_err2-mini libext2fs2-mini Prefer: libudev1:udev Prefer: xmlgraphics-commons:apache-commons-io # the -32bit stuff provides things it shouldn't (hopefully temporary) Prefer: -typelib-1_0-GdkPixbuf-2_0-32bit -typelib-1_0-Pango-1_0-32bit Prefer: postgresql postgresql-server -Prefer: -unzip-rcc +Prefer: -unzip-rcc -linuxconsoletools + # kernel bug (coolo) Prefer: kernel-default-devel @@ -255,6 +257,7 @@ Prefer: -xerces-j2-xml-resolver -xerces-j2-xml-apis Prefer: -vmware-player Prefer: libgcc_s1 libgcc_s1-32bit libgcc_s1-64bit Prefer: libffi%{gcc_version} libffi%{gcc_version}-devel +Prefer: -libatomic1-gcc49 -libitm1-gcc49 -libgcj_bc1-gcc49 -libtsan0-gcc49 -libatomic1-gcc49-32bit -libitm1-gcc49-32bit Prefer: libgcc_s1-x86 libffi4 libgcj_bc1 Prefer: libffi4-32bit libffi4-64bit Prefer: libgomp1 libgomp1-32bit libgomp1-64bit @@ -304,8 +307,12 @@ Prefer: -kmod-compat Prefer: gettext-tools-mini gettext-runtime-mini # choice p11-kit-nss-trust Prefer: mozilla-nss-certs -# amarok dependency +# amarok dependency resolution Prefer: phonon-backend-gstreamer-0_10 +# replacing mkinitrd +Prefer: dracut +# Not sure if wicked is ready yet +Prefer: sysconfig-network Ignore: java-1_7_0-openjdk:mozilla-nss Ignore: java-1_7_0-openjdk:java-ca-certificates @@ -389,6 +396,7 @@ Ignore: mkinitrd:pciutils Ignore: pciutils:pciutils-ids Ignore: postfix:iproute2 Ignore: aaa_base:systemd +Ignore: gpm:systemd Ignore: ConsoleKit:systemd Ignore: openssh:systemd Ignore: cronie:systemd @@ -398,6 +406,8 @@ Ignore: systemd:dbus-1 Ignore: systemd:pam-config Ignore: systemd:udev Ignore: systemd-mini:this-is-only-for-build-envs +Ignore: udev-mini:this-is-only-for-build-envs +Ignore: libudev-mini1:this-is-only-for-build-envs Ignore: polkit:ConsoleKit Ignore: logrotate:cron Ignore: texlive-filesystem:cron @@ -428,6 +438,7 @@ Ignore: man:groff-full Ignore: git-core:rsync Ignore: apache2:systemd Ignore: icewm-lite:icewm +Ignore: cluster-glue:sudo Ignore: libgcc:glibc-32bit Ignore: libgcc41:glibc-32bit @@ -465,6 +476,7 @@ Ignore: libreoffice:libreoffice-i18n Ignore: libreoffice:libreoffice-icon-themes Ignore: mediawiki:php-session,php-gettext,php-zlib,php-mysql,mod_php_any Ignore: squirrelmail:mod_php_any,php-session,php-gettext,php-iconv,php-mbstring,php-openssl +Ignore: perl-Log-Log4perl:rrdtool Ignore: simias:mono(log4net) Ignore: zmd:mono(log4net) @@ -541,6 +553,7 @@ Ignore: NetworkManager:dhcp Ignore: sysconfig:dbus-1 Ignore: sysconfig:procps Ignore: sysconfig:iproute2 +Ignore: sysconfig-network:iproute2 Ignore: sysconfig:tunctl # no build dependencies Ignore: libksuseinstall1:yast2-packager @@ -553,17 +566,14 @@ Ignore: NetworkManager:dhcp-client Ignore: autoyast2:yast2-schema Ignore: libgio-2_0-0:dbus-1-x11 Ignore: weather-wallpaper:inkscape +Ignore: libgamin-1-0:gamin-server +Ignore: libfam0-gamin:gamin-server %ifarch %arm Prefer: java-1_7_0-icedtea java-1_7_0-icedtea-devel %else -%ifnarch s390 s390x Prefer: java-1_7_0-openjdk java-1_7_0-openjdk-devel %endif -%ifarch s390 s390x -Prefer: java-1_6_0-ibm java-1_6_0-ibm-devel -%endif -%endif Prefer: -java-1_5_0-gcj-compat-devel %ifarch %ix86 x86_64 @@ -612,62 +622,30 @@ Substitute: kernel-binary-packages kernel-default Substitute: yast2-theme-SLED Substitute: yast2-theme-SLE -Optflags: i586 -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: x86_64 -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: ppc -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: ppc64 -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: ia64 -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: s390 -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: s390x -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: armv6l -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: armv6hl -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: armv7l -fmessage-length=0 -grecord-gcc-switches -fstack-protector -Optflags: armv7hl -fmessage-length=0 -grecord-gcc-switches -fstack-protector +Optflags: i586 -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches +Optflags: i686 -march=i686 -mtune=generic -fomit-frame-pointer -fmessage-length=0 -grecord-gcc-switches +Optflags: x86_64 -fmessage-length=0 -grecord-gcc-switches +Optflags: ppc -fmessage-length=0 -grecord-gcc-switches +Optflags: ppc64 -fmessage-length=0 -grecord-gcc-switches +Optflags: ia64 -fmessage-length=0 -grecord-gcc-switches +Optflags: s390 -fmessage-length=0 -grecord-gcc-switches +Optflags: s390x -fmessage-length=0 -grecord-gcc-switches +Optflags: armv5el -fmessage-length=0 -grecord-gcc-switches +Optflags: armv5tel -fmessage-length=0 -grecord-gcc-switches +Optflags: armv7l -fmessage-length=0 -grecord-gcc-switches +Optflags: armv7hl -fmessage-length=0 -grecord-gcc-switches Optflags: aarch64 -fmessage-length=0 -grecord-gcc-switches # need mcpu=ultrasparc to complete sparcv8plus to sparcv9 (adds, for example, atomic ops) -Optflags: sparcv9 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc -fstack-protector -Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc -fstack-protector +Optflags: sparcv9 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc +Optflags: sparc64 -fmessage-length=0 -grecord-gcc-switches -mcpu=ultrasparc %ifarch sparcv9 Target: sparcv9 %endif -# Workaround buildservice bug (scheduler arch not matching target arch) -%ifarch armv7l armv7hl -Target: armv7hl-suse-linux -%endif -%ifarch armv6l armv6hl -Target: armv6hl-suse-linux -%endif -Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables +Optflags: * -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables %define suse_version 1320 -%ifarch aarch64 armv6l armv6hl -%define qemu_user_space_build 1 -%endif - -%if "%qemu_user_space_build" == "1" -Hostarch: x86_64 -Constraint: hostlabel QEMU_ARM - -Macros: -%qemu_user_space_build 1 -%_without_mono 1 -:Macros - -%ifarch armv6l armv6hl -Preinstall: qemu-linux-user -%endif - -%ifarch armv7l armv7hl -Preinstall: qemu-linux-user -%endif - -ExportFilter: ^qemu-linux-user.*\.x86_64\.rpm$ . armv7l armv6l -%endif - - Macros: %insserv_prereq insserv sed %fillup_prereq fillup coreutils grep diffutils diff --git a/createarchdeps b/createarchdeps index a97f762..94efdb1 100755 --- a/createarchdeps +++ b/createarchdeps @@ -46,9 +46,9 @@ GetOptions("cachedir=s" => \$cachedir) or exit(1); for my $url (@ARGV) { - die("Not an Archlinux repo") unless $url =~ /^(ht|f)tp:\/\/([^\/]*)\/?/; + die("Not an Archlinux repo") unless $url =~ /^(:?ftps?|https?):\/\/([^\/]*)\/?/; my $reponame = getreponame($url); - my $repoid = Digest::MD5::md5_hex("arch\@$url"); + my $repoid = Digest::MD5::md5_hex($url); my $dir = "$cachedir/$repoid"; $url .= '/' unless $url =~ /\/$/; getrepodb($url, $reponame, $dir); diff --git a/createrepomddeps b/createrepomddeps index 48a6b46..fad84e5 100755 --- a/createrepomddeps +++ b/createrepomddeps @@ -26,6 +26,7 @@ my $opt_dump; my $opt_old; my $opt_nosrc; my $opt_bc; +my $opt_zypp; my $cachedir = "/var/cache/build"; my $old_seen = (); @@ -205,31 +206,30 @@ sub primary_handle_package_end my $el = shift; if($opt_bc) { - printasbuildcachefile(@packages); - shift @packages; + printasbuildcachefile(@packages); + shift @packages; } elsif ($opt_old) { - foreach my $pkg (@packages) { - my $arch = $pkg->{'arch'}; - $arch = 'src' if $pkg->{'arch'} eq 'nosrc'; - next if ($arch eq 'src' && $opt_nosrc); - if(exists($old_seen->{$pkg->{'name'}}->{$arch})) { + foreach my $pkg (@packages) { + my $arch = $pkg->{'arch'}; + $arch = 'src' if $pkg->{'arch'} eq 'nosrc'; + next if ($arch eq 'src' && $opt_nosrc); + if (exists($old_seen->{$pkg->{'name'}}->{$arch})) { my $pv = $old_seen->{$pkg->{'name'}}->{$arch}->{'ver'}; my $rv = $pkg->{'ver'}.'-'.$pkg->{'rel'}; my $vv = Build::Rpm::verscmp($pv, $rv, 0); - if($vv < 0) - { - print $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'}."\n"; - $old_seen->{$pkg->{'name'}}->{$arch}->{'ver'} = $pkg->{'ver'}.'-'.$pkg->{'rel'}; - $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'} = $pkg->{'baseurl'} . $pkg->{'location'}; + if ($vv < 0) { + print $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'}."\n"; + $old_seen->{$pkg->{'name'}}->{$arch}->{'ver'} = $pkg->{'ver'}.'-'.$pkg->{'rel'}; + $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'} = $pkg->{'baseurl'} . $pkg->{'location'}; } else { - print $pkg->{'baseurl'} . $pkg->{'location'}."\n"; + print $pkg->{'baseurl'} . $pkg->{'location'}."\n"; } - } else { + } else { $old_seen->{$pkg->{'name'}}->{$arch}->{'ver'} = $pkg->{'ver'}.'-'.$pkg->{'rel'}; $old_seen->{$pkg->{'name'}}->{$arch}->{'loc'} = $pkg->{'baseurl'} . $pkg->{'location'}; - } } - shift @packages; + } + shift @packages; } } @@ -385,6 +385,7 @@ GetOptions ( "nosrc" => \$opt_nosrc, "dump" => \$opt_dump, "old" => \$opt_old, + "zypp=s" => \$opt_zypp, "cachedir=s" => \$cachedir, ) or exit(1); @@ -400,30 +401,17 @@ my $p = new XML::Parser( #my $url = '/mounts/mirror/SuSE/ftp.suse.com/pub/suse/update/10.1/'; for my $url (@ARGV) { my $dir; - if ($url =~ /^zypp:\/\/([^\/]*)\/?/) { - use Build::Zypp; - my $repo = Build::Zypp::parsecfg($1); - die "can't parse $1\n" unless $repo; - my $type = $repo->{'type'}; - if($type eq 'rpm-md') { - my $name = $repo->{'name'}; - $dir = "/var/cache/zypp/raw/$name/"; - $baseurl = $url; - $baseurl .= '/' unless $baseurl =~ /\/$/; - } elsif ($type eq 'yast2') { - # XXX - exec ($INC[0].'/createyastdeps', $url); - } else { - die "unsupported repo type: $type\n"; - } - } elsif ($url =~ /^http[s]?:\/\/([^\/]*)\/?/) { + if ($opt_zypp) { + $dir = $opt_zypp; + $dir .= '/' unless $dir =~ /\/$/; + $baseurl = $url; + $baseurl .= '/' unless $baseurl =~ /\/$/; + } elsif ($url =~ /^(?:ftps?|https?):\/\/([^\/]*)\/?/) { my $repoid = md5_hex($url); $dir = "$cachedir/$repoid/"; $baseurl = $url; $baseurl .= '/' unless $baseurl =~ /\/$/; getmetadata($baseurl, $dir); - } elsif ($url =~ /^arch\@/) { - exec ("$INC[0]/createarchdeps", "--cachedir=$cachedir", substr($url, 5)); } else { $dir = $url; $dir .= '/' unless $dir =~ /\/$/; @@ -433,14 +421,15 @@ for my $url (@ARGV) { @primaryfiles = (); @cursor = ([undef, $repomdparser]); - $p->parsefile($dir . 'repodata/repomd.xml'); + die("zypp repo $url is not up to date, please refresh first\n") unless -s "${dir}repodata/repomd.xml"; + $p->parsefile("${dir}repodata/repomd.xml"); # print Dumper(\@primaryfiles); - foreach my $f (@primaryfiles) { + for my $f (@primaryfiles) { @cursor = ([undef, $primaryparser]); - my $u = $dir . $f->{'location'}; + my $u = "$dir$f->{'location'}"; if ($] > 5.007) { require Encode; utf8::downgrade($u); @@ -451,9 +440,14 @@ for my $url (@ARGV) { $cached = 0 if exists($f->{'size'}) && $f->{'size'} != (-s _); $cached = 0 if !exists($f->{'size'}) && $u !~ /[0-9a-f]{32}-primary/; } - if ($url =~ /^http[s]?:\/\/([^\/]*)\/?/ and !$cached) { - if (system($INC[0].'/download', $dir . "repodata/", $baseurl . "repodata/" . basename($u))) { - die("download failed\n"); + if (!$cached) { + die("zypp repo $url is not up to date, please refresh first\n") if $opt_zypp; + if ($url =~ /^(?:ftps?|https?):\/\/([^\/]*)\/?/) { + if (system($INC[0].'/download', $dir . "repodata/", $baseurl . "repodata/" . basename($u))) { + die("download failed\n"); + } + } else { + die("inconsistent repodata in $url\n"); } } my $fh; diff --git a/createyastdeps b/createyastdeps index a17bd74..43c83e7 100755 --- a/createyastdeps +++ b/createyastdeps @@ -6,8 +6,12 @@ BEGIN { use Build; use Build::Susetags; +use Getopt::Long; + use strict; +Getopt::Long::Configure("no_ignore_case"); + sub print_pkg($) { my $pkg = shift; @@ -60,43 +64,30 @@ sub callback return 0; } +### main + +my $opt_zypp; +my $cachedir = "/var/cache/build"; + +GetOptions ( + "zypp=s" => \$opt_zypp, + "cachedir=s" => \$cachedir, + ) or exit(1); + for my $url (@ARGV) { my $dir; - if ($url =~ /^zypp:\/\/([^\/]*)\/?/) { - use Build::Zypp; - my $repo = Build::Zypp::parsecfg($1); - die "can't parse $1\n" unless $repo; - die "only yast2 repos supported\n" unless $repo->{'type'} eq 'yast2'; - my $name = $repo->{'name'}; - $dir = "/var/cache/zypp/raw/$name/"; + if ($opt_zypp) { + $dir = $opt_zypp; } else { $dir = $url; } -# a really fucked up system -# if (-e $url."/yast/order") { -# if(open(F, '<', $url."/yast/order")) { -# my $found_products; -# while() { -# chomp; -# my ($a, $b) = split(/ /); -# $a =~ s/^\///; -# if(-e $url.$a) -# { -# push @ARGV, $url.$a; -# $found_products = 1; -# print STDERR "$url -> $url$a\n"; -# } -# } -# close(F); -# next if $found_products; -# } -# } - # XXX: location is actually defined in content file - my $packages = $dir.'/suse/setup/descr/packages'; - + $dir .= '/' unless $dir =~ /\/$/; $url .= '/' unless $url =~ /\/$/; + # XXX: use descrdir from content file + my $packages = $dir.'suse/setup/descr/packages'; + my @order = (); my $pkgs = Build::Susetags::parse($packages, { 'Loc' => 'location', 'Prv' => 'provides', 'Req' => 'requires', 'Tim' => 'buildtime' }, diff --git a/createzyppdeps b/createzyppdeps new file mode 100755 index 0000000..9abf693 --- /dev/null +++ b/createzyppdeps @@ -0,0 +1,67 @@ +#!/usr/bin/perl -w + +BEGIN { + unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build'); +} + +use strict; + +use Build::Zypp; +use Getopt::Long; + +use strict; + +Getopt::Long::Configure("no_ignore_case"); + +my $cachedir = "/var/cache/build"; +my $opt_listrepos; + +GetOptions( + "cachedir=s" => \$cachedir, + "listrepos" => \$opt_listrepos, + ) or exit(1); + +if ($opt_listrepos) { + die("createzyppdeps --listrepos does not take an argument\n") if @ARGV; + opendir(D, "/etc/zypp/repos.d") || exit(0); + my @r = grep {!/^\./ && /.repo$/} readdir(D); + closedir D; + @r = sort @r; + for my $r (@r) { + open(F, '<', "/etc/zypp/repos.d/$r") || next; + my $reponame; + my $enabled; + while() { + chomp; + next if /^\s*#/; + s/\s+$//; + if (/^\[(.*)\]$/) { + print "$reponame\n" if defined($reponame) && $enabled; + $reponame = $1; + $enabled = undef; + } elsif (/enabled=\s*(\S+)/) { + $enabled = $1; + } + } + print "$reponame\n" if defined($reponame) && $enabled; + close F; + } + exit(0); +} +die("createzyppdeps needs exactly one argument\n") if @ARGV != 1; +my $url = $ARGV[0]; + +die("createzyppdeps argument must start with 'zypp://'\n") unless $url =~ /^zypp:\/\/([^\/]*)/; +my $repo = Build::Zypp::parserepo($1); +die("can't parse $1\n") unless $repo; + +my $type = $repo->{'type'}; +my $zyppcachedir = "/var/cache/zypp/raw/$repo->{'name'}"; + +if($type eq 'rpm-md') { + exec ($INC[0].'/createrepomddeps', '--cachedir', $cachedir, '--zypp', $zyppcachedir, $url); +} elsif ($type eq 'yast2') { + exec ($INC[0].'/createyastdeps', '--cachedir', $cachedir, '--zypp', $zyppcachedir, $url); +} else { + die "unsupported repo type: $type\n"; +} diff --git a/detect_architecture.sh b/detect_architecture.sh deleted file mode 100644 index 6ac345e..0000000 --- a/detect_architecture.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -source common_functions - -build_host_arch - -echo $BUILD_HOST_ARCH - diff --git a/download b/download index 9ac2bdf..b0a7c1f 100755 --- a/download +++ b/download @@ -24,11 +24,11 @@ my $ua = LWP::UserAgent->new( for my $url (@ARGV) { if ($url =~ /^zypp:\/\/([^\/]*)\/?/) { use Build::Zypp; - my $repo = Build::Zypp::parsecfg($1); + my $repo = Build::Zypp::parserepo($1); die "can't parse $1\n" unless $repo; die "missing url in repo ".$repo->{'name'}."\n" unless exists $repo->{'baseurl'}; my $u = $repo->{'baseurl'}; - $u .= '/' unless substr($u, -1, 1) eq '/'; + $u .= '/' unless $u =~ /\/$/; $url =~ s/^zypp:\/\/[^\/]*\/*//; $url = URI->new($u.$url); if ($url->scheme eq 'dir') { diff --git a/emulator/emulator.sh b/emulator/emulator.sh index 0051172..78bc238 100755 --- a/emulator/emulator.sh +++ b/emulator/emulator.sh @@ -1,6 +1,6 @@ #!/bin/bash -echo "ERROR: the emulator.sh script got not changed to support your emulator!" +echo "ERROR: the emulator.sh script needs to be changed to support your emulator!" exit 1 diff --git a/expanddeps b/expanddeps index 46ae1f2..48116d8 100755 --- a/expanddeps +++ b/expanddeps @@ -8,7 +8,9 @@ use strict; use Build; -my ($dist, $rpmdeps, $archs, $configdir, $useusedforbuild); +my ($dist, $rpmdeps, $archs, $configdir, $useusedforbuild, $installonly, $noinstall); + +$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs'; while (@ARGV) { if ($ARGV[0] eq '--dist') { @@ -56,17 +58,24 @@ while (@ARGV) { } last; } -$configdir = '.' unless defined $configdir; + $archs = '' unless defined $archs; die("you must specfiy a depfile!\n") unless defined $rpmdeps; -my @extradeps = grep {!/(^|\/)(?:PKGBUILD|_preinstallimage)$/ && !/\.(?:spec|dsc|kiwi)$/} @ARGV; -my @specs = grep {/(^|\/)(?:PKGBUILD|_preinstallimage)$/ || /\.(?:spec|dsc|kiwi)$/} @ARGV; -die("can only work with at most one spec\n") if @specs > 1; -my $spec = $specs[0]; - +# split args in recipe and pkgnames +my $recipe; +my @extradeps; +for my $arg (@ARGV) { + my $buildtype = Build::recipe2buildtype($arg); + if ($buildtype) { + die("can only work with at most one recipe file\n") if defined $recipe; + $recipe = $arg; + } else { + push @extradeps, $arg; + } +} my @archs = split(':', $archs); -if ($spec =~ /(^|\/)PKGBUILD$/) { +if ($recipe =~ /(^|\/)PKGBUILD$/) { push @archs, 'any' unless grep {$_ eq 'any'} @archs; } else { push @archs, 'noarch' unless grep {$_ eq 'noarch'} @archs; @@ -193,8 +202,7 @@ for my $pack (keys %packs) { ####################################################################### -sub print_rpmlist -{ +sub print_rpmlist { for (@_) { print "$_ $fn{$packs{$_}}\n"; print "rpmid: $_:$ids{$packs{$_}}\n" if exists $ids{$packs{$_}}; @@ -203,12 +211,14 @@ sub print_rpmlist print "vminstall: @{$cf->{'vminstall'} || []}\n"; print "runscripts: @{$cf->{'runscripts'} || []}\n"; print "dist: $dist\n" if defined $dist; + print "installonly: $installonly\n" if defined $installonly; + print "noinstall: $noinstall\n" if defined $noinstall; } if ($useusedforbuild) { - die("Need a specfile/dscfile for --usedforbuild\n") unless defined $spec; + die("Need a recipe file for --usedforbuild\n") unless defined $recipe; local *F; - open(F, '<', $spec) || die("$spec: $!\n"); + open(F, '<', $recipe) || die("$recipe: $!\n"); my @usedforbuild; my @buildrequires; while() { @@ -241,11 +251,12 @@ if ($useusedforbuild) { my ($packname, $packvers, $subpacks, @packdeps); $subpacks = []; -if ($spec) { - my $d; - if ($spec =~ /\.kiwi$/) { +if ($recipe) { + my $d = Build::parse($cf, $recipe) || {}; + my $buildtype = Build::recipe2buildtype($recipe) || ''; + $cf->{'type'} = $buildtype if $buildtype; + if ($buildtype eq 'kiwi') { # lets see if this is a product or image build - $d = Build::parse($cf, $spec) || {}; my $type = $d->{'imagetype'} && $d->{'imagetype'}->[0] eq 'product' ? 'product' : 'image'; my @kdeps; if ($type eq 'image') { @@ -257,8 +268,6 @@ if ($spec) { } push @kdeps, grep {/^kiwi-.*:/} @{$d->{'deps'} || []}; $d = { 'deps' => \@kdeps, 'subpacks' => [] }; - } else { - $d = Build::parse($cf, $spec); } $packname = $d->{'name'}; $packvers = $d->{'version'}; @@ -266,7 +275,7 @@ if ($spec) { @packdeps = @{$d->{'deps'} || []}; if ($d->{'prereqs'}) { my %deps = map {$_ => 1} (@packdeps, @{$d->{'subpacks'} || []}); - push @packdeps, grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}}; + push @packdeps, '--directdepsend--', grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}}; } } @@ -282,6 +291,20 @@ if (!shift @bdeps) { exit(1); } +my @sysdeps = Build::get_sysbuild($cf); +if (@sysdeps) { + if (!shift @sysdeps) { + print STDERR "expansion error\n"; + print STDERR " $_\n" for @sysdeps; + exit(1); + } + my %sysdeps = map {$_ => 1} @sysdeps; + my %bdeps = map {$_ => 1} @bdeps; + $installonly = join(' ', grep {!$bdeps{$_}} @sysdeps); + $noinstall = join(' ', grep {!$sysdeps{$_}} @bdeps); + @bdeps = Build::unify(@sysdeps, @bdeps); +} + # make sure all preinstalls are in bdeps; # XXX: also add vmdeps? @bdeps = Build::unify(@bdeps, Build::get_preinstalls($cf)); diff --git a/extractbuild b/extractbuild index f46ffc1..7483ab7 100755 --- a/extractbuild +++ b/extractbuild @@ -6,6 +6,7 @@ use strict; my $bufsize = 4*1024*1024; my ($opt_skip, $opt_disk, $opt_input, $opt_verbose); +$opt_verbose = 0; while (@ARGV) { if ($ARGV[0] eq '--skip') { @@ -25,7 +26,7 @@ while (@ARGV) { } if ($ARGV[0] eq '--verbose' || $ARGV[0] eq '-v') { shift @ARGV; - $opt_verbose = 1; + $opt_verbose++; next; } last; @@ -35,51 +36,86 @@ die "need to specify disk image\n" unless $opt_disk; open(F, '<', $opt_disk) || die "$opt_disk: $!\n"; -if($opt_input) { +if ($opt_input) { open(S, '<', $opt_input) || die "$opt_input: $!\n"; } else { open(S, '<&STDIN') || die "can't dup stdin: $!\n"; } # skip build status -if($opt_skip) { - seek(S, $opt_skip, 0) || die "$!\n"; +if ($opt_skip) { + seek(S, $opt_skip, 0) || die "seek: $!\n"; } -while() { +my %done; +while () { chomp; last unless length $_; - my ($file, $filesize, $blksize, @blocks) = split(/ /); - if($#blocks == -1 && $filesize) { - die "invalid input '$_'\n"; + my ($filetype, $file, $filesize, $blksize, @blocks) = split(/ /); + die("invalid input '$_'\n") unless defined($file); + $file =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge; + die("bad file '$file'\n") if "/$file/" =~ /\/\.{0,2}\//s; + if ($file =~ /^(.*)\//s) { + die("file without directory: $file\n") unless $done{$1} && $done{$1} eq 'd'; } + if ($filetype eq 'd') { # dir + print "$file\n" if $opt_verbose && $opt_verbose > 1; + mkdir($file) || die("mkdir $file: $!\n"); + $done{$file} = 'd'; + next; + } + if ($filetype eq 'l') { # symlink + my $target = $filesize; + die("symlink without target\n") unless defined $target; + $target =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge; + die("bad symlink: $target\n") if "/$target/" =~ /\/\.?\//s; + if ("/$target/" =~ /^(\/\.\.)+\/(.*?)$/s) { + my ($head, $tail) = ($1, $2); + die("bad upref in symlink: $target\n") if "/$tail/" =~ /\/\.\.\//s; + die("bad upref in symlink: $target\n") if ($head =~ y!/!!) > ($file =~ y!/!!); + } else { + die("bad upref in symlink: $target\n") if "/$target/" =~ /\/\.\.\//s; + } + print "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//); + symlink($target, $file) || die("symlink $target $file: $!\n"); + $done{$file} = 'l'; + next; + } + die("illegal file type: $filetype\n") unless $filetype eq 'f'; + die "invalid input '$_'\n" if !@blocks && $filesize; + $done{$file} = 'f'; $filesize = int($filesize); + if ($filesize == 0) { + print "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//); + open (O, '>', $file) or die "$file: $!\n"; + close O; + next; + } $blksize = int($blksize); - die "invalid block size" unless ($blksize > 0 && $blksize <= $bufsize); + die "$file: invalid block size $blksize\n" unless $blksize > 0 && $blksize <= $bufsize; my $maxblocks = int($bufsize/$blksize); - $file =~ s/.*\///; # ensure basename, also stops directory traversal - $file =~ s/[^[:print:]]/_/g; # no binary junk in file names - print "$file\n" if $opt_verbose; - open (O, '>', $file) or die "$file: $!"; + print "$file\n" if $opt_verbose && !($opt_verbose == 1 && $file =~ /^KIWI\/.*\//); + open (O, '>', $file) or die "$file: $!\n"; for my $block (@blocks) { - my ($block, $end) = split(/-/, $block); + my $end; + ($block, $end) = split(/-/, $block); $block = int($block); - - if($block == 0) { # a hole! - seek(O, $blksize, 1); - $filesize -= $blksize; + if ($block == 0) { # a hole! + $end = (($end || 0) + 1) * $blksize; + $end = $filesize if $end > $filesize; + seek(O, $end, 1); + $filesize -= $end; next; } - $end = $block unless $end; $end = int($end); seek(F, $block*$blksize, 0) || die "$file: seek: $!\n"; - while($block <= $end && $filesize) { + while ($block <= $end && $filesize) { my $size; - if($end == $block) { + if ($end == $block) { $size = $blksize; ++$block; - } elsif($maxblocks >= $end-$block) { + } elsif ($maxblocks >= $end-$block) { $size = ($end-$block)*$blksize; $block += $end-$block; } else { @@ -88,14 +124,12 @@ while() { } $size = $filesize if $size > $filesize; my $buf; - if((sysread(F, $buf, $size) || 0) != $size) { - die "$file: read: $!\n"; - } + (sysread(F, $buf, $size) || 0) == $size || die("$file: read: $!\n"); $filesize -= $size; - print O $buf; + (syswrite(O, $buf) || 0) == length($buf) || die("$file: write error\n"); } } - close O; + close(O) || die("$file: close error: $!\n"); # sanity check die "$file: invalid file size ($filesize byes left)\n" if $filesize != 0; } diff --git a/getchangetarget b/getchangetarget deleted file mode 100755 index c9e51a1..0000000 --- a/getchangetarget +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/perl -w - -BEGIN { - unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build'); -} - -use strict; - -use Build; - -my ($dist, $archs, $configdir); - -while (@ARGV) { - if ($ARGV[0] eq '--dist') { - shift @ARGV; - $dist = shift @ARGV; - next; - } - if ($ARGV[0] eq '--archpath') { - shift @ARGV; - $archs = shift @ARGV; - next; - } - if ($ARGV[0] eq '--configdir') { - shift @ARGV; - $configdir = shift @ARGV; - next; - } - last; -} - -die("Usage: getchangetarget --dist --archpath [--configdir ]\n") if @ARGV; - -my $cf = Build::read_config_dist($dist, $archs, $configdir); -print "$cf->{'target'}\n" if $cf->{'target'}; diff --git a/getmacros b/getmacros deleted file mode 100755 index d15af57..0000000 --- a/getmacros +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/perl -w - -BEGIN { - unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build'); -} - -use Build; -use strict; - -my ($dist, $configdir, $archs); - -while (@ARGV) { - if ($ARGV[0] eq '--dist') { - shift @ARGV; - $dist = shift @ARGV; - next; - } - if ($ARGV[0] eq '--archpath') { - shift @ARGV; - $archs = shift @ARGV; - next; - } - if ($ARGV[0] eq '--configdir') { - shift @ARGV; - $configdir = shift @ARGV; - next; - } - last; -} -die("Usage: getmacros --dist [--configdir ]\n") if @ARGV; -my $cf = Build::read_config_dist($dist, $archs, $configdir); -print $cf->{'rawmacros'} if exists $cf->{'rawmacros'}; -exit(0); diff --git a/getoptflags b/getoptflags deleted file mode 100755 index 8031bf9..0000000 --- a/getoptflags +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/perl -w - -BEGIN { - unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build'); -} - -use strict; - -use Build; - -my ($dist, $archs, $configdir, $debug); - -while (@ARGV) { - if ($ARGV[0] eq '--dist') { - shift @ARGV; - $dist = shift @ARGV; - next; - } - if ($ARGV[0] eq '--archpath') { - shift @ARGV; - $archs = shift @ARGV; - next; - } - if ($ARGV[0] eq '--configdir') { - shift @ARGV; - $configdir = shift @ARGV; - next; - } - if ($ARGV[0] eq '--debug') { - shift @ARGV; - $debug = 1; - next; - } - last; -} - -die("Usage: getoptflags --dist --archpath [--configdir ]\n") if @ARGV; - -my $cf = Build::read_config_dist($dist, $archs, $configdir); -exit 0 unless $cf->{'optflags'}; -my $all = $cf->{'optflags'}->{'*'}; -$all = defined($all) && $all ne '' ? " $all" : ''; -$all .= " -g" if $debug; -for (sort keys %{$cf->{'optflags'}}) { - next if $_ eq '*'; - print "optflags: $_ $cf->{'optflags'}->{$_}$all\n"; -} diff --git a/gettype b/gettype deleted file mode 100755 index 1ceb746..0000000 --- a/gettype +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/perl -w - -BEGIN { - unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build'); -} - -use strict; - -use Build; - -my ($dist, $archs, $configdir, $debug); - -while (@ARGV) { - if ($ARGV[0] eq '--dist') { - shift @ARGV; - $dist = shift @ARGV; - next; - } - if ($ARGV[0] eq '--archpath') { - shift @ARGV; - $archs = shift @ARGV; - next; - } - if ($ARGV[0] eq '--configdir') { - shift @ARGV; - $configdir = shift @ARGV; - next; - } - last; -} - -die("Usage: gettype --dist --archpath [--configdir ]\n") if @ARGV; - -my $cf = Build::read_config_dist($dist, $archs, $configdir); -exit 0 unless $cf->{'binarytype'}; -print "$cf->{'binarytype'}\n"; diff --git a/init_buildsystem b/init_buildsystem index ff0bddd..9fec7aa 100755 --- a/init_buildsystem +++ b/init_buildsystem @@ -13,10 +13,13 @@ # needed globals variables # export SRC -export YAST_IS_RUNNING="instsys" -export DEBIAN_FRONTEND=noninteractive -export DEBIAN_PRIORITY=critical export BUILD_DIR=${BUILD_DIR:-/usr/lib/build} + +export YAST_IS_RUNNING=instsys + +# slurp in package binary support +. "$BUILD_DIR/build-pkg" + # need to restore build root owner for non-root builds browner=0 definesnstuff=() @@ -24,22 +27,18 @@ repos=() . $BUILD_DIR/common_functions || exit 1 -# should RPMs be installed with --force ? -USE_FORCE=false - BUILD_IS_RUNNING=$BUILD_ROOT/not-ready TMPFILE=$BUILD_ROOT/tmpfile -#buildhost removed so that id can be generated from repo files -#RPMIDFMT="%{NAME}-%{VERSION}-%{RELEASE} %{BUILDHOST}-%{BUILDTIME}\n" -RPMIDFMT="%{NAME}-%{VERSION}-%{RELEASE} %{BUILDTIME}\n" +# should RPMs be installed with --force ? +USE_FORCE=false PREPARE_VM= -USE_SYSTEM_QEMU= USEUSEDFORBUILD= LIST_STATE= RPMLIST= CLEAN_BUILD= CREATE_BUILD_BINARIES= +CACHE_DIR=/var/cache/build while test -n "$1" ; do case "$1" in @@ -47,10 +46,6 @@ while test -n "$1" ; do shift PREPARE_VM=true ;; - --use-system-qemu) - shift - USE_SYSTEM_QEMU=true - ;; --create-build-binaries) shift CREATE_BUILD_BINARIES=true @@ -75,12 +70,12 @@ while test -n "$1" ; do ;; --repository|--repo) repos[${#repos[@]}]="$2"; - shift 2; + shift 2 ;; --clean) CLEAN_BUILD="$1" shift - ;; + ;; --cachedir) CACHE_DIR="$2" shift 2 @@ -100,8 +95,7 @@ PKGS=("$@") # needed functions # -cleanup_and_exit() -{ +cleanup_and_exit() { trap EXIT test "$BUILD_ROOT" = / -a -n "$browner" && chown "$browner" "$BUILD_ROOT" # umount so init_buildsystem can be used standalone @@ -113,31 +107,33 @@ cleanup_and_exit() exit ${1:-0} } -clean_build_root() -{ - test -n "$BUILD_ROOT" && { - umount -n "$BUILD_ROOT/proc/sys/fs/binfmt_misc" 2> /dev/null || true - umount -n "$BUILD_ROOT/proc" 2> /dev/null || true - umount -n "$BUILD_ROOT/dev/pts" 2> /dev/null || true - umount -n "$BUILD_ROOT/mnt" 2> /dev/null || true - rm -rf -- "$BUILD_ROOT"/* - rm -rf -- "$BUILD_ROOT/.build" - rm -rf -- "$BUILD_ROOT/.root" - rm -rf -- "$BUILD_ROOT/.init_b_cache" - rm -rf -- "$BUILD_ROOT/.preinstall_image/*" - rm -rf -- "$BUILD_ROOT/.preinstallimage"* - mkdir -p "$BUILD_ROOT/proc" - mkdir -p "$BUILD_ROOT/dev/pts" - if [ "$UID" = '0' ]; then - mount -n -tproc none "$BUILD_ROOT/proc" - mount -n -tdevpts -omode=0620,gid=5 none "$BUILD_ROOT/dev/pts" - fi - } +clean_build_root() { + if test -n "$BUILD_ROOT" ; then + umount -n "$BUILD_ROOT/proc/sys/fs/binfmt_misc" 2> /dev/null || true + umount -n "$BUILD_ROOT/proc" 2> /dev/null || true + umount -n "$BUILD_ROOT/dev/pts" 2> /dev/null || true + umount -n "$BUILD_ROOT/dev/shm" 2> /dev/null || true + umount -n "$BUILD_ROOT/mnt" 2> /dev/null || true + rm -rf -- "$BUILD_ROOT"/* 2> /dev/null || true + chattr -a -A -i -R -- "$BUILD_ROOT" 2> /dev/null || true + rm -rf -- "$BUILD_ROOT"/* + rm -rf -- "$BUILD_ROOT/.build" + rm -rf -- "$BUILD_ROOT"/.build.kernel.* + rm -rf -- "$BUILD_ROOT"/.build.initrd.* + rm -rf -- "$BUILD_ROOT/.root" + rm -rf -- "$BUILD_ROOT/.init_b_cache" + rm -rf -- "$BUILD_ROOT"/.preinstall_image/* + rm -rf -- "$BUILD_ROOT"/.preinstallimage* + mkdir -p "$BUILD_ROOT/proc" + mkdir -p "$BUILD_ROOT/dev/pts" + if test "$UID" = 0 ; then + mount -n -tproc none "$BUILD_ROOT/proc" + mount -n -tdevpts -omode=0620,gid=5 none "$BUILD_ROOT/dev/pts" + fi + fi } - -unsafe_preinstall_check() -{ +unsafe_preinstall_check() { # cpio isn't safe so we require bsdtar for VMs. chroot is # unsafe anyways so it's ok for that. if test -n "$PREPARE_VM" ; then @@ -147,22 +143,16 @@ unsafe_preinstall_check() fi } -preinstall_image_filter() -{ +preinstall_image_filter() { for PKG in "$@" ; do test -e "$BUILD_ROOT/.preinstall_image/$PKG" && continue echo $PKG done } -preinstall_image() -{ +preinstall_image() { check_exit - if test -n "$2" ; then - echo "unpacking preinstall image $2" - else - echo "unpacking preinstall image" - fi + echo "unpacking preinstall image${2:+ $2}" cd $BUILD_ROOT || cleanup_and_exit 1 if test -x /usr/bin/bsdtar ; then TAR="/usr/bin/bsdtar -P --chroot --numeric-owner -x" @@ -179,10 +169,10 @@ preinstall_image() rm -f "$BUILD_ROOT/.preinstallimage.unpack" } -preinstall() -{ +preinstall() { + local PKG="$1" check_exit - echo "preinstalling $1..." + echo "preinstalling $PKG..." cd $BUILD_ROOT || cleanup_and_exit 1 if test -x /usr/bin/bsdtar ; then CPIO="/usr/bin/bsdtar -P --chroot -o --numeric-owner -x -f-" @@ -192,118 +182,18 @@ preinstall() CPIO="cpio --extract --unconditional --preserve-modification-time --make-directories --no-absolute-filenames --quiet" TAR="tar -x" fi - if test -e "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" ; then - PAYLOADDECOMPRESS=cat - case `rpm -qp --nodigest --nosignature --qf "%{PAYLOADCOMPRESSOR}\n" "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm"` in - lzma) rpm --showrc | egrep 'PayloadIsLzma|_lzma' > /dev/null || PAYLOADDECOMPRESS="lzma -d" ;; - xz) rpm --showrc | egrep 'PayloadIsXz|_xz' > /dev/null || PAYLOADDECOMPRESS="xz -d" ;; - esac - if test "$PAYLOADDECOMPRESS" = "lzma -d" ; then - if ! lzma /dev/null 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 2>&1 ; then - test -f "$BUILD_DIR/xzdec.sh" && PAYLOADDECOMPRESS="bash $BUILD_DIR/xzdec.sh" - fi - fi - if test "$PAYLOADDECOMPRESS" = cat ; then - rpm2cpio "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" | $CPIO - else - rpm2cpio "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" | $PAYLOADDECOMPRESS | $CPIO - fi - if test -e ".init_b_cache/scripts/$1.run" ; then - rpm -qp --nodigest --nosignature --qf "%{PREIN}" "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" > ".init_b_cache/scripts/$1.pre" - rpm -qp --nodigest --nosignature --qf "%{POSTIN}" "$BUILD_ROOT/.init_b_cache/rpms/$1.rpm" > ".init_b_cache/scripts/$1.post" - echo -n '(none)' > .init_b_cache/scripts/.none - cmp -s ".init_b_cache/scripts/$1.pre" .init_b_cache/scripts/.none && rm -f ".init_b_cache/scripts/$1.pre" - cmp -s ".init_b_cache/scripts/$1.post" .init_b_cache/scripts/.none && rm -f ".init_b_cache/scripts/$1.post" - rm -f .init_b_cache/scripts/.none - fi - elif test -e "$BUILD_ROOT/.init_b_cache/rpms/$1.deb" ; then - ar x "$BUILD_ROOT/.init_b_cache/rpms/$1.deb" control.tar.gz data.tar.gz - mkdir -p .init_b_cache/scripts/control - $TAR -C .init_b_cache/scripts/control -z -f control.tar.gz - $TAR -z -f data.tar.gz - if test -e ".init_b_cache/scripts/$1.run" ; then - test -e .init_b_cache/scripts/control/preinst && mv .init_b_cache/scripts/control/preinst ".init_b_cache/scripts/$1.pre" - test -e .init_b_cache/scripts/control/postinst && mv .init_b_cache/scripts/control/postinst ".init_b_cache/scripts/$1.post" - fi - rm -rf .init_b_cache/scripts/control control.tar.gz data.tar.gz - elif test -e "$BUILD_ROOT/.init_b_cache/rpms/$1.arch" ; then - $TAR -f "$BUILD_ROOT/.init_b_cache/rpms/$1.arch" - if test -f .INSTALL ; then - cat .INSTALL > ".init_b_cache/scripts/$1.post" - echo 'type post_install >/dev/null 2>&1 && post_install' >> ".init_b_cache/scripts/$1.post" - fi - rm -f .PKGINFO .INSTALL - else - echo "warning: package $1 does not exist" - fi + pkg_preinstall } -run_pkg_scripts() -{ +run_pkg_scripts() { chroot $BUILD_ROOT /sbin/ldconfig 2>/dev/null for PKG in $PACKAGES_TO_RUNSCRIPTS ; do - if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" ; then - echo "running $PKG preinstall script" - if test -e "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" ; then - chroot $BUILD_ROOT sh ".init_b_cache/scripts/$PKG.pre" 0 - else - chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.pre" install < /dev/null - fi - rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.pre" - fi - if test -e "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" ; then - echo "running $PKG postinstall script" - if test -e "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" ; then - chroot $BUILD_ROOT sh ".init_b_cache/scripts/$PKG.post" 1 - else - chroot $BUILD_ROOT ".init_b_cache/scripts/$PKG.post" configure '' < /dev/null - fi - rm -f "$BUILD_ROOT/.init_b_cache/scripts/$PKG.post" - fi + pkg_runscripts check_exit done } -init_db() -{ - if test $PSUF = rpm ; then - echo initializing rpm db... - if ! test -e $BUILD_ROOT/usr/lib/rpm/cpuinfo.yaml; then - # rpm v5 does not have initdb - # rpmdb --initdb is recommended and exists since SL9 - if [ -x $BUILD_ROOT/usr/bin/rpmdb ]; then - chroot $BUILD_ROOT /usr/bin/rpmdb --initdb || cleanup_and_exit 1 - else - chroot $BUILD_ROOT rpm --initdb || cleanup_and_exit 1 - fi - fi - # hack: add nofsync to db config to speed up install - mkdir -p $BUILD_ROOT/root - DBI_OTHER=`chroot $BUILD_ROOT rpm --eval '%{?__dbi_other}'` - echo "%__dbi_other $DBI_OTHER nofsync" > $BUILD_ROOT/.rpmmacros - echo "%__dbi_other $DBI_OTHER nofsync" > $BUILD_ROOT/root/.rpmmacros - elif test $PSUF = deb ; then - # force dpkg into database to make epoch test work - if ! test "$BUILD_ROOT/.init_b_cache/rpms/dpkg.deb" -ef "$BUILD_ROOT/.init_b_cache/dpkg.deb" ; then - rm -f $BUILD_ROOT/.init_b_cache/dpkg.deb - cp $BUILD_ROOT/.init_b_cache/rpms/dpkg.deb $BUILD_ROOT/.init_b_cache/dpkg.deb || cleanup_and_exit 1 - fi - chroot $BUILD_ROOT dpkg -i --force all .init_b_cache/dpkg.deb >/dev/null 2>&1 - elif test $PSUF = arch ; then - mkdir -p $BUILD_ROOT/var/lib/pacman/sync - touch $BUILD_ROOT/var/lib/pacman/sync/core.db - touch $BUILD_ROOT/var/lib/pacman/sync/extra.db - touch $BUILD_ROOT/var/lib/pacman/sync/community.db - fi -} - -reorder() -{ +reorder() { test -z "$*" && return rm -f $BUILD_ROOT/.init_b_cache/order.manifest for PKG in "$@" ; do @@ -313,12 +203,11 @@ reorder() rm -f $BUILD_ROOT/.init_b_cache/order.manifest } -create_devs() -{ +create_devs() { local com file mode arg mkdir -m 755 -p $BUILD_ROOT/dev/pts - test -f $BUILD_ROOT/dev/shm && rm -f $BUILD_ROOT/dev/shm + test -d $BUILD_ROOT/dev/shm || rm -f $BUILD_ROOT/dev/shm mkdir -m 755 -p $BUILD_ROOT/dev/shm while read com file mode arg ; do rm -f $BUILD_ROOT/dev/$file @@ -348,16 +237,14 @@ DEVLIST # check whether the repo list contains a plain "zypp://". Add all # enabled zypp repos in this case -maybe_add_all_zypp_repos() -{ +expand_plain_zypp_repo() { local i j r=() for i in "${repos[@]}"; do - if [ "$i" = "zypp://" ]; then - while read j; do - j="${j#/etc/zypp/repos.d/}" - r=("${r[@]}" "zypp://${j%.repo}") - done < <(grep -l enabled=1 /etc/zypp/repos.d/*.repo) + if test "$i" = "zypp://" ; then + for j in $($BUILD_DIR/createzyppdeps --listrepos) ; do + r=("${r[@]}" "zypp://$j") + done else r=("${r[@]}" "$i") fi @@ -365,25 +252,24 @@ maybe_add_all_zypp_repos() repos=("${r[@]}") } -validate_cache_file() -{ - local findonly='' - maybe_add_all_zypp_repos +create_cache_file() { + local findonly= + expand_plain_zypp_repo if ! test -f $CACHE_FILE || ! test -f $CACHE_FILE.id || \ test "${repos[*]} ${BUILD_RPMS//:/ /}" != "$(cat $CACHE_FILE.id 2>/dev/null)"; then rm -f $CACHE_FILE.id else for SRC in "${repos[@]}" ${BUILD_RPMS//:/ /}; do test -n "$SRC" || SRC=. - if [ "${SRC#zypp://}" != "$SRC" ]; then - SRC="/var/cache/zypp/raw" # XXX can't use name here as we'd need to parse the file + if test "${SRC#zypp://}" != "$SRC" ; then + SRC="/var/cache/zypp/raw/${SRC#zypp://}" fi if test "$SRC" -nt $CACHE_FILE; then rm -f $CACHE_FILE.id break fi # always rebuild if we have remote repositories and --clean is given - if test -n "$CLEAN_BUILD" -a "$SRC" != "${SRC#*://}" ; then + if test -n "$CLEAN_BUILD" -a "$SRC" != "${SRC#*://}" -a "${SRC#zypp://}" = "$SRC" ; then rm -f $CACHE_FILE.id break fi @@ -391,26 +277,45 @@ validate_cache_file() fi if ! test -f $CACHE_FILE.id ; then test -z "$LIST_STATE" && echo initializing $CACHE_FILE ... + BINTYPE= + if test -n "$BUILD_DIST" ; then + BINTYPE=`queryconfig binarytype --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"` + test "$BINTYPE" = UNDEFINED && BINTYPE= + fi + if test -z "$BINTYPE" ; then + # check the first init_buildsystem arg, maybe it is a recipe + case ${PKGS[0]} in + *.spec) + BINTYPE=rpm ;; + *.dsc) + BINTYPE=deb ;; + */PKGBUILD|PKGBUILD) + BINTYPE=arch ;; + esac + fi for SRC in "${repos[@]}" -- ${BUILD_RPMS//:/ /}; do if test "$SRC" = '--' ; then findonly=1 continue fi test -z "$SRC" && SRC=`pwd` - if [ "${SRC#zypp://}" != "$SRC" ]; then - set -- $BUILD_DIR/createrepomddeps "$SRC" - elif [ "${SRC#http://}" != "$SRC" -o "${SRC#https://}" != "$SRC" -o "${SRC#ftp://}" != "$SRC" -o "${SRC#ftps://}" != "$SRC" ]; then + if test "${SRC#http://}" != "$SRC" -o "${SRC#https://}" != "$SRC" -o "${SRC#ftp://}" != "$SRC" -o "${SRC#ftps://}" != "$SRC" ; then + # remote repo, cache binary packages mkdir -p "$(getcachedir "$SRC")" - set -- $BUILD_DIR/createrepomddeps --cachedir="$CACHE_DIR" "$SRC" - elif [ "${SRC#arch@http://}" != "$SRC" -o "${SRC#arch@https://}" != "$SRC" -o "${SRC#arch@ftp://}" != "$SRC" -o "${SRC#arch@ftps://}" != "$SRC" ]; then - mkdir -p "$(getcachedir "$SRC")" - set -- $BUILD_DIR/createrepomddeps --cachedir="$CACHE_DIR" "$SRC" - elif [ ! -e "$SRC" ]; then + if test "$BINTYPE" = arch ; then + set -- $BUILD_DIR/createarchdeps --cachedir="$CACHE_DIR" "$SRC" + else + set -- $BUILD_DIR/createrepomddeps --cachedir="$CACHE_DIR" "$SRC" + fi + elif test "${SRC#zypp://}" != "$SRC" ; then + # special zypp repo + set -- $BUILD_DIR/createzyppdeps --cachedir="$CACHE_DIR" "$SRC" + elif test ! -e "$SRC" ; then echo "*** $SRC does not exist" >&2 cleanup_and_exit 1 - elif [ -z "$findonly" -a \( -e "$SRC"/suse/setup/descr/packages -o -e "$SRC"/suse/setup/descr/packages.gz \) ]; then + elif test -z "$findonly" -a \( -e "$SRC"/suse/setup/descr/packages -o -e "$SRC"/suse/setup/descr/packages.gz \) ; then set -- $BUILD_DIR/createyastdeps "$SRC" - elif [ -z "$findonly" -a -e "$SRC"/repodata/repomd.xml ]; then + elif test -z "$findonly" -a -e "$SRC"/repodata/repomd.xml ; then set -- $BUILD_DIR/createrepomddeps "$SRC" else set -- $BUILD_DIR/createrpmdeps "$SRC" @@ -425,22 +330,16 @@ validate_cache_file() fi } -fail_exit() -{ - cleanup_and_exit 1 +fail_exit() { + cleanup_and_exit 1 } # modifies $SRC -downloadpkg() -{ +downloadpkg() { local url="$1" local cachedir - if [ "${url:0:7}" == "zypp://" ] ; then - cachedir="/var/cache/zypp/packages/" - SRC="$cachedir${url#zypp://}" - mkdir -p "${SRC%/*}" || cleanup_and_exit 1 - elif [ "${url:0:7}" == "http://" -o "${url:0:8}" == "https://" -o "${url:0:6}" == "ftp://" -o "${url:0:7}" == "ftps://" ] ; then + if test "${url:0:7}" == "zypp://" -o "${url:0:7}" == "http://" -o "${url:0:8}" == "https://" -o "${url:0:6}" == "ftp://" -o "${url:0:7}" == "ftps://" ; then cachedir="$(getcachedir "$url")" local name="$(basename "$url")" name=${name/%.pkg.tar.?z/.arch} @@ -455,7 +354,7 @@ downloadpkg() echo "downloading $url ... "; $BUILD_DIR/download "$destdir" "$url" || cleanup_and_exit 1 local destfile="$destdir/${url##*/}" - if [ ! -e "$destfile" ]; then + if test ! -e "$destfile" ; then echo "expected $destfile after download but it's missing" >&2 cleanup_and_exit 1 fi @@ -472,19 +371,10 @@ downloadpkg() mv "$destfile" "$SRC" || cleanup_and_exit 1 } -getcachedir() -{ +getcachedir() { local url=$1 - case $url in - zypp://*) - url=${url#zypp:/} - echo "/var/cache/zypp/packages/${url%/*}" - return 0; - ;; - *.pkg.tar.?z) url="arch@$url" ;; - esac for repo in "${repos[@]}" ; do - if [ "${url:0:${#repo}}" == "$repo" -o "${url:0:${#repo}}" == "$repo" ] ; then + if test "${url:0:${#repo}}" == "$repo" ; then read repoid dummy < <(echo -n "$repo" | md5sum) echo "$CACHE_DIR/$repoid" break @@ -492,33 +382,36 @@ getcachedir() done } -get_pkg_filename() -{ - local url="$1" - local name=$(basename $url) - local cachedir=$(getcachedir $url) - local destfile="$cachedir/$name" - echo $destfile +can_reuse_cached_package() { + local cachepkgid pkgid + test -s "$1" || return 1 + # XXX verify for non-rpm types as well + if test -s "$BUILD_ROOT/.init_b_cache/rpms/$PKG.id" -a "${1%.rpm}" != "$1" ; then + pkgid=`rpm -qp --qf "$RPMIDFMT" $RPMCHECKOPTS_HOST "$1"` + read cachepkgid < $BUILD_ROOT/.init_b_cache/rpms/$PKG.id + test "$cachepkgid" = "$pkgid" || return 1 + fi + return 0 } set_build_arch trap fail_exit EXIT -if [ "$BUILD_ROOT" = / ]; then +if test "$BUILD_ROOT" = / ; then browner="$(stat -c %u /)" fi -if [ -n "$CLEAN_BUILD" ]; then +if test -n "$CLEAN_BUILD" ; then clean_build_root fi # # now test if there was an incomplete run # -if test -e $BUILD_IS_RUNNING ; then - echo It seems that there was an incomplete setup of $BUILD_ROOT. - echo To be sure, we will build it again completely... +if test -e "$BUILD_IS_RUNNING" ; then + echo "It seems that there was an incomplete setup of $BUILD_ROOT." + echo "To be sure, we will build it again completely..." umount -n $BUILD_ROOT/proc/sys/fs/binfmt_misc 2> /dev/null || true umount -n $BUILD_ROOT/proc 2> /dev/null umount -n $BUILD_ROOT/dev/pts 2> /dev/null @@ -533,9 +426,12 @@ if test -e $BUILD_IS_RUNNING ; then echo -n "[y/N/c] " read ANSWER case "$ANSWER" in - c|C) rm -f $BUILD_IS_RUNNING ;; - y|Y) clean_build_root ;; - *) cleanup_and_exit 1 ;; + c|C) + rm -f $BUILD_IS_RUNNING ;; + y|Y) + clean_build_root ;; + *) + cleanup_and_exit 1 ;; esac fi @@ -549,13 +445,14 @@ touch $BUILD_IS_RUNNING if test -n "$PREPARE_VM" ; then rm -f $BUILD_ROOT/.build/init_buildsystem.data fi + if test -e $BUILD_ROOT/.build/init_buildsystem.data ; then # vm continuation . $BUILD_ROOT/.build/init_buildsystem.data if ! test -e $BUILD_ROOT/.init_b_cache/preinstall_finished ; then # finish preinstall run_pkg_scripts - init_db + pkg_initdb touch $BUILD_ROOT/.init_b_cache/preinstall_finished fi else @@ -570,7 +467,7 @@ else # create rpmdeps file # CACHE_FILE=$BUILD_ROOT/.srcfiles.cache - validate_cache_file + create_cache_file # # select and expand packages @@ -599,28 +496,30 @@ else fi # - # register the QEMU emulator + # register the QEMU emulator if needed + # (we do not need this for the prepare step, as we do not run scripts in this case) # - if check_use_emulator; then - echo "registering binfmt handlers for VM" - - if [ -x "$BUILD_DIR/initvm.`uname -m`" -a -e "$BUILD_DIR/qemu-reg" ]; then - $BUILD_DIR/initvm.`uname -m` - else - echo "Warning: could not register binfmt handlers. Neither build-initvm nor /usr/sbin/qemu-binfmt-conf.sh exist" - fi - + if test -z "$PREPARE_VM" ; then + if check_use_emulator ; then + echo "registering binfmt handlers for cross build" + "$BUILD_DIR/$INITVM_NAME" echo 0 > /proc/sys/vm/mmap_min_addr read mmap_min_addr < /proc/sys/vm/mmap_min_addr - if [ "$mmap_min_addr" != 0 ]; then - echo "Warning: mmap_min_addr is != 0. If programs fail at mmap this could be the reason" + if test "$mmap_min_addr" != 0 ; then + echo "Warning: mmap_min_addr is != 0. If programs fail at mmap this could be the reason." fi + fi fi + # + # extract the data from the (generated) rpm list + # PACKAGES_TO_INSTALL= PACKAGES_TO_PREINSTALL= PACKAGES_TO_RUNSCRIPTS= PACKAGES_TO_VMINSTALL= + PACKAGES_TO_INSTALLONLY= + PACKAGES_TO_NOINSTALL= PREINSTALL_IMAGE= PREINSTALL_IMAGE_SOURCE= RUNSCRIPTS_SEEN= @@ -637,6 +536,14 @@ else PACKAGES_TO_VMINSTALL=$SRC continue fi + if test "$PKG" = "installonly:" ; then + PACKAGES_TO_INSTALLONLY=$SRC + continue + fi + if test "$PKG" = "noinstall:" ; then + PACKAGES_TO_NOINSTALL=$SRC + continue + fi if test "$PKG" = "preinstallimage:" ; then PREINSTALL_IMAGE=${SRC##*/} ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/${SRC##*/}" @@ -669,7 +576,7 @@ else continue fi PACKAGES_TO_INSTALL="$PACKAGES_TO_INSTALL $PKG" - if [ "${SRC#/}" = "$SRC" ]; then + if test "${SRC#/}" = "$SRC" ; then case "$SRC" in zypp://* | http://* | https://* | ftp://* | ftps://*) echo "$PKG $SRC" >>$BUILD_ROOT/.init_b_cache/rpmlist.download @@ -685,32 +592,52 @@ else ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}" done < $RPMLIST + PACKAGES_TO_ALL="$PACKAGES_TO_INSTALL" + PACKAGES_TO_AVAILABLE="$PACKAGES_TO_INSTALL" + + # subtract noinstall packages from PACKAGES_TO_INSTALL + if test -n "$PACKAGES_TO_NOINSTALL" ; then + settest=" $PACKAGES_TO_NOINSTALL " + PACKAGES_TO_INSTALL= + for PKG in $PACKAGES_TO_ALL ; do + test "$settest" = "${settest/ $PKG /}" && PACKAGES_TO_INSTALL="$PACKAGES_TO_INSTALL $PKG" + done + fi + # subtract installonly packages from PACKAGES_TO_AVAILABLE + if test -n "$PACKAGES_TO_INSTALLONLY" ; then + settest=" $PACKAGES_TO_INSTALLONLY " + PACKAGES_TO_AVAILABLE= + for PKG in $PACKAGES_TO_ALL ; do + test "$settest" = "${settest/ $PKG /}" && PACKAGES_TO_AVAILABLE="$PACKAGES_TO_AVAILABLE $PKG" + done + fi + # check if we really can use cached versions for packages on the download list if test -s $BUILD_ROOT/.init_b_cache/rpmlist.download ; then rm -f $BUILD_ROOT/.init_b_cache/rpmlist.download2 + rpm_set_checkopts while read PKG SRC ; do cachepkg="${SRC##*/}" cachepkg="${cachepkg/%.pkg.tar.?z/.arch}" - cachedir="$(getcachedir "$SRC")" - if test -s "$cachedir/$cachepkg" ; then - if test -s "$BUILD_ROOT/.init_b_cache/rpms/$PKG.id" -a "${SRC%.rpm}" != "$SRC" ; then - PKGID=`rpm -qp --qf "$RPMIDFMT" $RPMCHECKOPTS_HOST "$cachedir/$cachepkg"` - read cachepkgid < $BUILD_ROOT/.init_b_cache/rpms/$PKG.id - if test "$cachepkgid" = "$PKGID" ; then - SRC="$cachedir/$cachepkg" - else - rm -f "$cachedir/$cachepkg" - fi - else - $SRC="$cachedir/$cachepkg" + if test "$SRC" != "$SRC#zypp://" ; then + # for zypp packages also look in the zypp cache + cachedir="/var/cache/zypp/packages/${SRC#zypp://}" + cachedir="${cachedir%/*}" + if can_reuse_cached_package "$cachedir/$cachepkg" ; then + SRCSUF=${SRC/%.pkg.tar.?z/.arch} + ln -s "$cachedir/$cachepkg" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}" + continue fi fi - if test "${SRC#/}" = "$SRC" ; then - echo "$PKG $SRC" >>$BUILD_ROOT/.init_b_cache/rpmlist.download2 - else + cachedir="$(getcachedir "$SRC")" + if can_reuse_cached_package "$cachedir/$cachepkg" ; then SRCSUF=${SRC/%.pkg.tar.?z/.arch} - ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}" + ln -s "$cachedir/$cachepkg" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}" + continue fi + # not found in cache or cache has different package + rm -f "$cachedir/$cachepkg" + echo "$PKG $SRC" >>$BUILD_ROOT/.init_b_cache/rpmlist.download2 done < $BUILD_ROOT/.init_b_cache/rpmlist.download rm -f $BUILD_ROOT/.init_b_cache/rpmlist.download test -s $BUILD_ROOT/.init_b_cache/rpmlist.download2 && mv $BUILD_ROOT/.init_b_cache/rpmlist.download2 $BUILD_ROOT/.init_b_cache/rpmlist.download @@ -728,7 +655,7 @@ else ln -s "$SRC" "$BUILD_ROOT/.init_b_cache/rpms/$PKG.${SRCSUF##*.}" done < $BUILD_ROOT/.init_b_cache/rpmlist.download rm -f $BUILD_ROOT/.init_b_cache/rpmlist.download - printf "\n" + echo fi # compatibility... @@ -736,19 +663,8 @@ else echo "$GUESSED_DIST" > $BUILD_ROOT/.guessed_dist test -n "$BUILD_DIST" || BUILD_DIST="$GUESSED_DIST" - PSUF=`gettype --dist "$BUILD_DIST" --configdir "$CONFIG_DIR" --archpath "$BUILD_ARCH"` - case "$PSUF" in - UNKNOWN|'') - # auto detect from packages - if test -n "$PREINSTALL_IMAGE" ; then - echo "cannot autodetect build type when using a preinstall image" >&2 - cleanup_and_exit 1 - fi - PSUF=rpm - test -e $BUILD_ROOT/.init_b_cache/rpms/dpkg.deb && PSUF=deb - test -e $BUILD_ROOT/.init_b_cache/rpms/pacman.arch && PSUF=arch - ;; - esac + + pkg_set_type if test -n "$PREINSTALL_IMAGE" ; then for PKG in $PACKAGES_FROM_PREINSTALLIMAGE ; do @@ -760,24 +676,12 @@ else fi # -# now test if there is already a build dir. +# test if we need to preinstall # -if test ! -f $BUILD_ROOT/var/lib/rpm/packages.rpm -a ! -f $BUILD_ROOT/var/lib/rpm/Packages -a ! -e $BUILD_ROOT/.build/init_buildsystem.data ; then - mkdir -p $BUILD_ROOT/var/lib/rpm || cleanup_and_exit 1 - mkdir -p $BUILD_ROOT/usr/src/packages/SOURCES || cleanup_and_exit 1 +if test ! -e $BUILD_ROOT/installed-pkg -a ! -e $BUILD_ROOT/.build/init_buildsystem.data ; then mkdir -p $BUILD_ROOT/etc || cleanup_and_exit 1 mkdir -p $BUILD_ROOT/proc || cleanup_and_exit 1 test -f $BUILD_ROOT/etc/HOSTNAME || hostname -f > $BUILD_ROOT/etc/HOSTNAME - if test $PSUF = deb ; then - mkdir -p $BUILD_ROOT/var/lib/dpkg - mkdir -p $BUILD_ROOT/var/log - mkdir -p $BUILD_ROOT/etc/default - :> $BUILD_ROOT/var/lib/dpkg/status - :> $BUILD_ROOT/var/lib/dpkg/available - :> $BUILD_ROOT/var/log/dpkg.log - :> $BUILD_ROOT/etc/ld.so.conf - :> $BUILD_ROOT/etc/default/rcS - fi for PKG in $PACKAGES_TO_RUNSCRIPTS ; do : > $BUILD_ROOT/.init_b_cache/scripts/$PKG.run done @@ -795,7 +699,7 @@ if test ! -f $BUILD_ROOT/var/lib/rpm/packages.rpm -a ! -f $BUILD_ROOT/var/lib/rp progress_step PACKAGES_TO_PREINSTALL_FILTERED preinstall ${PKG##*/} done - printf "\n" + echo if test -n "$PREPARE_VM" ; then PACKAGES_TO_VMINSTALL_FILTERED=`reorder $PACKAGES_TO_VMINSTALL_FILTERED` progress_setup PACKAGES_TO_VMINSTALL_FILTERED @@ -806,21 +710,24 @@ if test ! -f $BUILD_ROOT/var/lib/rpm/packages.rpm -a ! -f $BUILD_ROOT/var/lib/rp fi # for reorder check_exit - if [ -w /root ]; then - test -c $BUILD_ROOT/dev/null || create_devs + if test -w /root ; then + test -c $BUILD_ROOT/dev/null || create_devs fi test -e $BUILD_ROOT/etc/fstab || touch $BUILD_ROOT/etc/fstab test ! -e $BUILD_ROOT/etc/ld.so.conf -a -e $BUILD_ROOT/etc/ld.so.conf.in && cp $BUILD_ROOT/etc/ld.so.conf.in $BUILD_ROOT/etc/ld.so.conf if test -z "$PREPARE_VM" ; then run_pkg_scripts - init_db + pkg_initdb touch $BUILD_ROOT/.init_b_cache/preinstall_finished fi + # mark as preinstalled no longer needed + rm -rf "$BUILD_ROOT/installed-pkg" + mkdir -p "$BUILD_ROOT/installed-pkg" fi if test -n "$PREPARE_VM" ; then echo "copying packages..." - for PKG in $PACKAGES_TO_INSTALL ; do + for PKG in $PACKAGES_TO_ALL ; do rm -f $BUILD_ROOT/.init_b_cache/$PKG.$PSUF cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF $BUILD_ROOT/.init_b_cache/$PKG.$PSUF || cleanup_and_exit 1 ln -s -f ../$PKG.$PSUF $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF @@ -836,11 +743,13 @@ if test -n "$PREPARE_VM" ; then echo "PACKAGES_TO_RUNSCRIPTS='${PACKAGES_TO_RUNSCRIPTS//"'"/$Q}'" >> $BUILD_ROOT/.build/init_buildsystem.data # needed for continuation in xen/kvm with rpm-x86 echo "PACKAGES_TO_PREINSTALL='${PACKAGES_TO_PREINSTALL//"'"/$Q}'" >> $BUILD_ROOT/.build/init_buildsystem.data + echo "PACKAGES_TO_AVAILABLE='${PACKAGES_TO_AVAILABLE//"'"/$Q}'" >> $BUILD_ROOT/.build/init_buildsystem.data echo "PSUF='$PSUF'" >> $BUILD_ROOT/.build/init_buildsystem.data rm -f $BUILD_IS_RUNNING cleanup_and_exit 0 fi + mkdir -p $BUILD_ROOT/proc mkdir -p $BUILD_ROOT/dev/pts mount -n -tproc none $BUILD_ROOT/proc 2>/dev/null || true @@ -853,7 +762,7 @@ rm -rf "$BUILD_ROOT/.build.binaries" if test -n "$CREATE_BUILD_BINARIES" ; then echo "creating .build.binaries directory..." mkdir -p "$BUILD_ROOT/.build.binaries" - for PKG in $PACKAGES_TO_INSTALL ; do + for PKG in $PACKAGES_TO_AVAILABLE ; do test -L "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" || continue LPKG=`readlink -f "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF"` ln "$LPKG" "$BUILD_ROOT/.build.binaries/$PKG.$PSUF" 2>/dev/null @@ -867,13 +776,7 @@ fi # get list and ids of already installed rpms # mkdir -p $BUILD_ROOT/.init_b_cache/alreadyinstalled -if test -f $BUILD_ROOT/var/lib/rpm/packages.rpm -o -f $BUILD_ROOT/var/lib/rpm/Packages ; then - chroot $BUILD_ROOT rpm -qa --qf "%{NAME} $RPMIDFMT" | ( - while read pp ii; do - echo "$ii" > "$BUILD_ROOT/.init_b_cache/alreadyinstalled/$pp" - done - ) -fi +pkg_get_installed # # reorder packages (already done in vm continuation) @@ -885,24 +788,6 @@ if ! test -e $BUILD_ROOT/.build/init_buildsystem.data ; then echo 'done' fi -rpm_e() -{ - chroot $BUILD_ROOT rpm --nodeps -e $PKG 2>&1 | \ - while read line; do - case "$line" in - - r*failed:\ No\ such\ file\ or\ directory) ;; - error:\ failed\ to\ stat\ *:\ No\ such\ file\ or\ directory) ;; - error:\ *scriptlet\ failed*) - echo "$line" - echo "re-try deleting $PKG using --noscripts" - chroot $BUILD_ROOT rpm --nodeps --noscripts -e $PKG || true - ;; - *) echo "$line" ;; - esac - done -} - # # delete all packages we don't want # @@ -919,7 +804,7 @@ for PKG in $BUILD_ROOT/.init_b_cache/todelete/* ; do PKG=${PKG##*/} test "$PKG" = "*" && continue echo "deleting $PKG" - rpm_e "$PKG" + pkg_erase check_exit done rm -rf "$BUILD_ROOT/.init_b_cache/todelete" @@ -933,70 +818,14 @@ done rm -rf "$BUILD_ROOT/installed-pkg" mkdir -p "$BUILD_ROOT/installed-pkg" -RPMCHECKOPTS= -RPMCHECKOPTS_HOST= -# on Fedora 10 rpmbuild is in a separate package so we need something else to -# detect rpm4 -test -x $BUILD_ROOT/usr/bin/rpmquery && RPMCHECKOPTS="--nodigest --nosignature" -test -x /usr/bin/rpmquery && RPMCHECKOPTS_HOST="--nodigest --nosignature" - test -x $BUILD_ROOT/sbin/ldconfig && chroot $BUILD_ROOT /sbin/ldconfig 2>&1 -typeset -ri suse_version=$(chroot $BUILD_ROOT rpm --eval '%{?suse_version}' 2>/dev/null) -typeset -i num cumulate=-1 -typeset -a CUMULATED_LIST=() -typeset -a CUMULATED_PIDS=() -typeset -a CUMULATED_HMD5=() - -DO_CUMULATE= -if ((suse_version > 1220)) ; then - DO_CUMULATE=true -fi - MAIN_LIST="$PACKAGES_TO_INSTALL" -test -n "$DO_CUMULATE" && MAIN_LIST="$MAIN_LIST CUMULATED" progress_setup MAIN_LIST -for PKG in $MAIN_LIST; do +for PKG in $MAIN_LIST ; do test -f $BUILD_ROOT/installed-pkg/$PKG && continue progress_step MAIN_LIST - case $PKG in - CUMULATED) - # - # Use the features of rpm which are reordering the list of packages to - # satisfy dependencies and the final execution of the %posttrans scriplets - # - echo "now installing cumulated packages" - ((cumulate < 0)) && continue - exec 4>$BUILD_ROOT/.init_b_cache/manifest - for ((num=0; num<=cumulate; num++)) ; do - echo ${CUMULATED_LIST[$num]} 1>&4 - PKG=${CUMULATED_LIST[$num]##*/} - test "$BUILD_ROOT/.init_b_cache/rpms/$PKG" -ef "$BUILD_ROOT/${CUMULATED_LIST[$num]}" && continue - rm -f $BUILD_ROOT/${CUMULATED_LIST[$num]} - cp $BUILD_ROOT/.init_b_cache/rpms/$PKG $BUILD_ROOT/${CUMULATED_LIST[$num]} || cleanup_and_exit 1 - done - exec 4>&- - chroot $BUILD_ROOT rpm --ignorearch --nodeps -Uh --oldpackage --ignoresize --verbose $RPMCHECKOPTS \ - $ADDITIONAL_PARAMS .init_b_cache/manifest 2>&1 || touch $BUILD_ROOT/exit - for ((num=0; num<=cumulate; num++)) ; do - rm -f $BUILD_ROOT/${CUMULATED_LIST[$num]} - done - rm -f .init_b_cache/manifest - check_exit - for ((num=0; num<=cumulate; num++)) ; do - PKG=${CUMULATED_LIST[$num]##*/} - echo "${CUMULATED_PIDS[$num]}" > $BUILD_ROOT/installed-pkg/${PKG%.rpm} - test -n "${CUMULATED_HMD5[$num]}" || continue - echo "${CUMULATED_HMD5[$num]} ${CUMULATED_PIDS[$num]}" > $BUILD_ROOT/.preinstall_image/${PKG%.rpm} - done - CUMULATED_LIST=() - CUMULATED_PIDS=() - CUMULATED_HMD5=() - let cumulate=-1 - continue - ;; - esac if test -e "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" -a ! -s "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" ; then # preinstallimage package, make sure it's in the image if ! test -e $BUILD_ROOT/.preinstall_image/$PKG ; then @@ -1008,6 +837,7 @@ for PKG in $MAIN_LIST; do echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG continue fi + PKG_HDRMD5= if test -d $BUILD_ROOT/.preinstall_image ; then if ! test -e $BUILD_ROOT/.preinstall_image/$PKG ; then @@ -1015,58 +845,11 @@ for PKG in $MAIN_LIST; do test -n "$PKG_HDRMD5" || cleanup_and_exit 1 fi fi - test -L $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF || continue - if test $PSUF = deb ; then - # debian world, install deb files - if ! test "$BUILD_ROOT/.init_b_cache/rpms/$PKG.deb" -ef "$BUILD_ROOT/.init_b_cache/$PKG.deb" ; then - rm -f $BUILD_ROOT/.init_b_cache/$PKG.deb - cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.deb $BUILD_ROOT/.init_b_cache/$PKG.deb || cleanup_and_exit 1 - fi - PKGID=`readlink $BUILD_ROOT/.init_b_cache/rpms/$PKG.deb` - PKGID="${PKGID##*/}" - PKGID="${PKGID%.deb} debian" - echo "installing ${PKGID%% *}" - ( chroot $BUILD_ROOT dpkg --install --force all .init_b_cache/$PKG.deb 2>&1 || touch $BUILD_ROOT/exit ) | \ - perl -ne '$|=1;/^(Configuration file|Installing new config file|Selecting previously deselected|\(Reading database|Unpacking |Setting up|Creating config file|Preparing to replace dpkg)/||/^$/||print' - check_exit - echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG - test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG - # ugly workaround for upstart system. some packages (procps) try - # to start a service in their configure phase. As we don't have - # a running upstart, we just link the start binary to /bin/true - if test -e "$BUILD_ROOT/sbin/start"; then - if test "$BUILD_ROOT/sbin/start" -ef "$BUILD_ROOT/sbin/initctl" ; then - echo "linking /sbin/start to /bin/true" - mv "$BUILD_ROOT/sbin/start" "$BUILD_ROOT/sbin/start.disabled" - ln -s "/bin/true" "$BUILD_ROOT/sbin/start" - fi - fi - # another workaround, see bug bnc#733699 - rm -f "$BUILD_ROOT/var/run/init.upgraded" - continue - fi - - if test $PSUF = arch ; then - if ! test "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" -ef "$BUILD_ROOT/.init_b_cache/$PKG.$PSUF" ; then - rm -f $BUILD_ROOT/.init_b_cache/$PKG.$PSUF - cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF $BUILD_ROOT/.init_b_cache/$PKG.$PSUF || cleanup_and_exit 1 - fi - PKGID=`readlink $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF` - PKGID="${PKGID##*/}" - PKGID="${PKGID/%.pkg.tar.?z/.arch}" - PKGID="${PKGID%.arch} arch" - echo "installing ${PKGID%% *}" - # -d -d disables deps checking - ( chroot $BUILD_ROOT pacman -U --force -d -d --noconfirm .init_b_cache/$PKG.$PSUF 2>&1 || touch $BUILD_ROOT/exit ) | \ - perl -ne '$|=1;/^(warning: could not get filesystem information for |loading packages|looking for inter-conflicts|Targets |Total Installed Size: |Net Upgrade Size: |Proceed with installation|checking package integrity|loading package files|checking available disk space|installing |upgrading |warning:.*is up to date -- reinstalling|Optional dependencies for| )/||/^$/||print' - check_exit - echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG - test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG - continue - fi + test -L $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF || continue - if test -f $BUILD_ROOT/.init_b_cache/rpms/$PKG.id -a -f $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG ; then + # XXX? + if test "$VERIFY_BUILD_SYSTEM" != true -a -f $BUILD_ROOT/.init_b_cache/rpms/$PKG.id -a -f $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG ; then read PKGID < $BUILD_ROOT/.init_b_cache/rpms/$PKG.id read OLDPKGID < $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG if test "$PKGID" = "$OLDPKGID" ; then @@ -1077,83 +860,47 @@ for PKG in $MAIN_LIST; do fi fi - PKGID=`rpm -qp --qf "$RPMIDFMT" $RPMCHECKOPTS_HOST $BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm` + pkg_set_packageid if test -f $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG ; then read OLDPKGID < $BUILD_ROOT/.init_b_cache/alreadyinstalled/$PKG if test "$PKGID" != "$OLDPKGID" ; then - echo deleting unwanted ${OLDPKGID%% *} - rpm_e "$PKG" - elif test "$VERIFY_BUILD_SYSTEM" = true ; then - chroot $BUILD_ROOT rpm --verify $PKG 2>&1 | tee $TMPFILE - if grep ^missing $TMPFILE > /dev/null ; then - echo deleting incomplete ${PKGID%% *} - rpm_e "$PKG" - else + echo "deleting unwanted ${OLDPKGID%% *}" + pkg_erase + else + if test "$VERIFY_BUILD_SYSTEM" != true || pkg_verify_installed ; then #echo "keeping ${PKGID%% *}" echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG continue fi - else - #echo "keeping ${PKGID%% *}" - echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG - test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG - continue + echo "deleting incomplete ${OLDPKGID%% *}" + pkg_erase fi if test -e "$BUILD_ROOT/.init_b_cache/preinstalls/$PKG" ; then preinstall "$PKG" - # call for rpm-4.x and not rpm-devel - test -z "${PKG##rpm-[0-9]*}" && chroot $BUILD_ROOT rpm --rebuilddb - # also exec for exchanged rpm ! naming is rpm-x86-- - test -z "${PKG##rpm-x86-*[0-9]*}" && chroot $BUILD_ROOT rpm --rebuilddb fi fi - export ADDITIONAL_PARAMS= - if test "$USE_FORCE" = true ; then - export ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS --force" - fi - # FIXME: work around for cross-build installs, we must not overwrite the running rpm - if test "$PKG" = rpm ; then - for i in $BUILD_ROOT/.init_b_cache/preinstalls/rpm-x86-* ; do - test -e "$i" && ADDITIONAL_PARAMS="$ADDITIONAL_PARAMS --justdb" - done - fi - if test -n "$DO_CUMULATE" -a "$ADDITIONAL_PARAMS" = "${ADDITIONAL_PARAMS%--justdb}"; then + + if pkg_cumulate ; then echo "cumulate ${PKGID%% *}" - let cumulate++ - CUMULATED_LIST[$cumulate]=".init_b_cache/$PKG.rpm" - CUMULATED_PIDS[$cumulate]="$PKGID" - CUMULATED_HMD5[$cumulate]="$PKG_HDRMD5" continue fi + echo "installing ${PKGID%% *}" - if ! test "$BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm" -ef "$BUILD_ROOT/.init_b_cache/$PKG.rpm" ; then - rm -f $BUILD_ROOT/.init_b_cache/$PKG.rpm - cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.rpm $BUILD_ROOT/.init_b_cache/$PKG.rpm || cleanup_and_exit 1 + if ! test "$BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF" -ef "$BUILD_ROOT/.init_b_cache/$PKG.$PSUF" ; then + rm -f $BUILD_ROOT/.init_b_cache/$PKG.$PSUF + cp $BUILD_ROOT/.init_b_cache/rpms/$PKG.$PSUF $BUILD_ROOT/.init_b_cache/$PKG.$PSUF || cleanup_and_exit 1 fi - ( chroot $BUILD_ROOT rpm --ignorearch --nodeps -U --oldpackage --ignoresize $RPMCHECKOPTS \ - $ADDITIONAL_PARAMS .init_b_cache/$PKG.rpm 2>&1 || \ - touch $BUILD_ROOT/exit ) | \ - grep -v "^warning:.*saved as.*rpmorig$" - # delete link so package is only installed once - rm -f $BUILD_ROOT/.init_b_cache/$PKG.rpm - check_exit + pkg_install + rm -f $BUILD_ROOT/.init_b_cache/$PKG.$PSUF + echo "$PKGID" > $BUILD_ROOT/installed-pkg/$PKG test -n "$PKG_HDRMD5" && echo "$PKG_HDRMD5 $PKGID" > $BUILD_ROOT/.preinstall_image/$PKG done -if test $PSUF = deb ; then - echo "configuring all installed packages..." - # configure all packages after complete installation, not for each package like rpm does - # We need to run this twice, because of cyclic dependencies as it does not succeed on most - # debian based distros in the first attempt. - if ! chroot $BUILD_ROOT dpkg --configure --pending 2>&1; then - echo "first configure attempt failed, trying again..." - chroot $BUILD_ROOT dpkg --configure --pending 2>&1 || touch $BUILD_ROOT/exit - fi -fi +pkg_finalize # devices can vanish if devs got uninstalled test -c $BUILD_ROOT/dev/null || create_devs @@ -1167,74 +914,23 @@ rm -f $BUILD_ROOT/etc/mtab cp /proc/mounts $BUILD_ROOT/etc/mtab chmod 644 $BUILD_ROOT/etc/mtab -# -# to be sure, path is set correctly, we have to source /etc/profile before -# starting rpm. -# -# XXX -#rm -f $BUILD_ROOT/bin/rpm.sh -#cp $BUILD_LIBDIR/lib/rpm.sh $BUILD_ROOT/bin/rpm.sh -#chmod 755 $BUILD_ROOT/bin/rpm.sh -#test -f $BUILD_ROOT/bin/rpm -a ! -L $BUILD_ROOT/bin/rpm && \ -# mv $BUILD_ROOT/bin/rpm $BUILD_ROOT/bin/rpm.bin -#rm -f $BUILD_ROOT/bin/rpm -#ln -s rpm.sh $BUILD_ROOT/bin/rpm - -# -# some packages use uname -r to decide which kernel is used to build for. -# this does not work in autobuild always. Here is a wrapper script, that -# gets Version from kernel sources. -# -# XXX -#rm -f $BUILD_ROOT/bin/uname.sh -#cp -v $BUILD_LIBDIR/lib/uname.sh $BUILD_ROOT/bin/uname.sh -#chmod 755 $BUILD_ROOT/bin/uname.sh -#test -f $BUILD_ROOT/bin/uname -a ! -L $BUILD_ROOT/bin/uname && \ -# mv $BUILD_ROOT/bin/uname $BUILD_ROOT/bin/uname.bin -#rm -f $BUILD_ROOT/bin/uname -#ln -s uname.sh $BUILD_ROOT/bin/uname - -# -# some distributions have a /etc/rpmrc or /etc/rpm/macros and some not. -# make sure, that it is setup correctly. -# -# XXX -#rm -f $BUILD_ROOT/etc/rpmrc -#if test -e $BUILD_LIBDIR/lib/rpmrc.$BUILD_BASENAME ; then -# cp -v $BUILD_LIBDIR/lib/rpmrc.$BUILD_BASENAME $BUILD_ROOT/etc/rpmrc -#elif test -e $BUILD_LIBDIR/lib/rpmrc ; then -# cp -v $BUILD_LIBDIR/lib/rpmrc $BUILD_ROOT/etc/rpmrc -#fi - -# XXX -#rm -f $BUILD_ROOT/etc/rpm/macros $BUILD_ROOT/etc/rpm/suse_macros -#mkdir -p $BUILD_ROOT/etc/rpm -#if test -e $BUILD_LIBDIR/lib/macros.$BUILD_BASENAME ; then -# cp -v $BUILD_LIBDIR/lib/macros.$BUILD_BASENAME $BUILD_ROOT/etc/rpm/macros -# cp -v $BUILD_LIBDIR/lib/macros.$BUILD_BASENAME $BUILD_ROOT/etc/rpm/suse_macros -#elif test -e $BUILD_LIBDIR/lib/macros ; then -# cp -v $BUILD_LIBDIR/lib/macros $BUILD_ROOT/etc/rpm/macros -# cp -v $BUILD_LIBDIR/lib/macros $BUILD_ROOT/etc/rpm/suse_macros -#fi - # # make sure, that our nis is not present in the chroot system # test -e $BUILD_ROOT/etc/nsswitch.conf && { - echo removing nis flags from $BUILD_ROOT/etc/nsswitch.conf... - cat $BUILD_ROOT/etc/nsswitch.conf | sed -e"s:nis::g" > \ - $BUILD_ROOT/etc/nsswitch.conf.tmp + echo "removing nis flags from $BUILD_ROOT/etc/nsswitch.conf..." + cat $BUILD_ROOT/etc/nsswitch.conf | sed -e"s:nis::g" > $BUILD_ROOT/etc/nsswitch.conf.tmp mv $BUILD_ROOT/etc/nsswitch.conf.tmp $BUILD_ROOT/etc/nsswitch.conf } # -# creating some default directories +# create some default directories and files +# for DIR in /usr/share/doc/packages \ /usr/X11R6/include/X11/pixmaps \ /usr/X11R6/include/X11/bitmaps ; do mkdir -p $BUILD_ROOT/$DIR done - for FILE in /var/run/utmp /var/log/wtmp /etc/fstab ; do mkdir -p $BUILD_ROOT/${FILE%/*} touch $BUILD_ROOT/$FILE @@ -1245,24 +941,26 @@ if test -x $BUILD_ROOT/sbin/ldconfig ; then CHROOT_RETURN="`chroot $BUILD_ROOT /sbin/ldconfig 2>&1`" case "$CHROOT_RETURN" in *warning:*) - chroot $BUILD_ROOT /sbin/ldconfig - echo - echo chroot $BUILD_ROOT /sbin/ldconfig - echo - echo "$CHROOT_RETURN" - echo - echo "Problem with ldconfig. It's better to reinit the build system..." - echo - cleanup_and_exit 1 - ;; + chroot $BUILD_ROOT /sbin/ldconfig + echo + echo chroot $BUILD_ROOT /sbin/ldconfig + echo + echo "$CHROOT_RETURN" + echo + echo "Problem with ldconfig. It's better to reinit the build system..." + echo + cleanup_and_exit 1 + ;; esac fi -if test -x $BUILD_ROOT/usr/sbin/Check && ! grep -q "/usr/sbin/Check is obsolete" $BUILD_ROOT/usr/sbin/Check; then - chroot $BUILD_ROOT /usr/sbin/Check + +if test -x $BUILD_ROOT/usr/sbin/Check && ! grep -q "/usr/sbin/Check is obsolete" $BUILD_ROOT/usr/sbin/Check ; then + chroot $BUILD_ROOT /usr/sbin/Check fi mkdir -p $BUILD_ROOT/var/adm/packages touch $BUILD_ROOT/var/adm/packages + if test -x $BUILD_ROOT/sbin/SuSEconfig ; then if grep norestarts $BUILD_ROOT/sbin/SuSEconfig > /dev/null ; then chroot $BUILD_ROOT /sbin/SuSEconfig --norestarts --force @@ -1282,7 +980,7 @@ done if test -e $BUILD_ROOT/usr/share/zoneinfo/UTC ; then for PROG in /usr/sbin/zic /usr/bin/zic /bin/zic /sbin/zic ; do - test -x $BUILD_ROOT/$PROG && chroot $BUILD_ROOT $PROG -l UTC + test -x $BUILD_ROOT/$PROG && chroot $BUILD_ROOT bash -c "$PROG -l $(readlink -f /usr/share/zoneinfo/UTC)" done fi @@ -1296,26 +994,17 @@ if ! grep -F "127.0.0.1 $HOST" $BUILD_ROOT/etc/hosts > /dev/null ; then mv $BUILD_ROOT/etc/hosts.new $BUILD_ROOT/etc/hosts fi +# XXX: still needed? if test -x $BUILD_ROOT/bin/rpm -a ! -f $BUILD_ROOT/var/lib/rpm/packages.rpm -a ! -f $BUILD_ROOT/var/lib/rpm/Packages ; then - echo "initializing rpm db..." - if [ -x $BUILD_ROOT/usr/bin/rpmdb ]; then - chroot $BUILD_ROOT /usr/bin/rpmdb --initdb || cleanup_and_exit 1 - else - chroot $BUILD_ROOT rpm --initdb || cleanup_and_exit 1 - fi - # create provides index - chroot $BUILD_ROOT rpm -q --whatprovides rpm >/dev/null 2>&1 + pkg_initdb_rpm + chroot $BUILD_ROOT rpm -q --whatprovides rpm >/dev/null 2>&1 # create provides index fi -# create modules.dep in kvm/xen -# This can not work, until we use the native repository kernel -#if [ $BUILD_ROOT = "/" -a -x /sbin/depmod ]; then -# /sbin/depmod -a -#fi - rm -f $BUILD_ROOT/.rpmmacros $BUILD_ROOT/root/.rpmmacros rm -rf "$BUILD_ROOT/.init_b_cache" rm -f $BUILD_IS_RUNNING rm -f $TMPFILE cleanup_and_exit 0 + +# vim: set tabstop=8 softtabstop=4 shiftwidth=4 noexpandtab: diff --git a/initscript_qemu_vm b/initscript_qemu_vm deleted file mode 100755 index be8d8b5..0000000 --- a/initscript_qemu_vm +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash-static - -# from /usr/sbin/qemu-binfmt-conf.sh -if [ ! -f /proc/sys ]; then - mount-static -n proc -t proc /proc -fi -if [ ! -f /proc/sys/fs/binfmt_misc/register ]; then - mount-static -n binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc -fi -# register arm, ppc, mips - -echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:' > /proc/sys/fs/binfmt_misc/register -echo ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb:' > /proc/sys/fs/binfmt_misc/register - -echo ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc:' > /proc/sys/fs/binfmt_misc/register - -echo ':mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips:' > /proc/sys/fs/binfmt_misc/register -echo ':mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel:' > /proc/sys/fs/binfmt_misc/register -#echo ':mipsn32:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mipsn32:' > /proc/sys/fs/binfmt_misc/register -#echo ':mipsn32el:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsn32el:' > /proc/sys/fs/binfmt_misc/register -#echo ':mips64:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips64:' > /proc/sys/fs/binfmt_misc/register -#echo ':mips64el:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mips64el:' > /proc/sys/fs/binfmt_misc/register - -echo ':sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4:' > /proc/sys/fs/binfmt_misc/register -echo ':sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb:' > /proc/sys/fs/binfmt_misc/register - -#exec /.build/build -/bin/bash-static /.build/build diff --git a/initvm.c b/initvm.c index bed0cc4..55686ea 100644 --- a/initvm.c +++ b/initvm.c @@ -20,6 +20,7 @@ * * AUTHOR * James Perkins + * Adrian Schroeter */ #include @@ -177,7 +178,7 @@ enum okfail binfmt_register(char *datafile, char *regfile) if (buf[0] != ':') /* non-data input line */ { - goto skip; + continue; } /* copy buf and tokenize :-seperated fields into f[] */ @@ -200,22 +201,41 @@ enum okfail binfmt_register(char *datafile, char *regfile) { fprintf(stderr, "%s: line %d: extra fields, ignoring." " Content: %s", datafile, line, buf); - goto skip; + continue; } if (n < n_fields) { fprintf(stderr, "%s: line %d: missing fields, ignoring." " Content: %s", datafile, line, buf); - goto skip; + continue; } + int ret; + /* Is an interpreter for this arch already registered? */ + snprintf(path, sizeof(path), SYSFS_BINFMT_MISC "/%s", f[name]); + ret=access(path, X_OK); + fprintf(stderr, + "interpreter for '%s' is %d\n", + f[name], ret); + if (ret == 0) { +#ifdef DEBUG + fprintf(stderr, + "interpreter for '%s' already registered, ignoring\n", + f[name]); +#endif /* DEBUG */ + continue; + } - if (access(f[interpreter], X_OK) != 0) { + /* Does the interpreter exists? */ + ret=access(f[interpreter], X_OK); + if (ret != 0) { +#ifdef DEBUG fprintf(stderr, "%s: line %d: interpreter '%s' not found," - " ignoring\n", datafile, line, f[interpreter]); - goto skip; + " ignoring, return %d\n", datafile, line, f[interpreter], ret); +#endif /* DEBUG */ + continue; } if (!write_file_string(regfile, buf)) { @@ -238,9 +258,6 @@ enum okfail binfmt_register(char *datafile, char *regfile) DBG(fprintf(stderr, "dumping: %s\n", path)); DBG(dump_file(path)); - -skip: - ; } @@ -327,7 +344,7 @@ int main(int argc, char* argv[], char* env[]) exit(1); } execve(BUILD, args, env); - perror("execve"); + perror("execve of "BUILD); exit(1); } diff --git a/livebuild_pre_run.template b/livebuild_pre_run.template new file mode 100755 index 0000000..d88dad6 --- /dev/null +++ b/livebuild_pre_run.template @@ -0,0 +1,49 @@ +#!/bin/bash +# +# This is a template for a livebuild_pre_run script. These scripts are +# executed by build_livebuild.sh in the chroot environment. +# + +fix_debootstrap() +{ + # debootstrap in Debian 7.0 does not like dash + + if [ -x /usr/sbin/debootstrap ] ; then + sed -i 's|^#!/bin/sh|#!/bin/bash|' /usr/sbin/debootstrap + fi +} + +fix_lb_bootstrap_archive-keys() +{ + if [ -e /usr/lib/live/build/bootstrap_archive-keys ] ; then + sed -i '/apt-get update/{ s/^/#/ }' \ + /usr/lib/live/build/bootstrap_archive-keys + fi +} + +# +# main +# + +: ${TOPDIR:=/usr/src/packages} + +# Distribution and live-build specific hooks +fix_debootstrap +fix_lb_bootstrap_archive-keys + +# Expand configuration based on defaults +cd $TOPDIR/LIVEBUILD_ROOT && lb config || exit 1 + +# Replace all occurances of LB_MIRROR with local repository +sed -i "s|^\(LB_MIRROR_[^=]\+=\).*|\1\"file:$TOPDIR/SOURCES/repos/\"|" \ + $TOPDIR/LIVEBUILD_ROOT/config/bootstrap +sed -i "s|^\(LB_PARENT_MIRROR_[^=]\+=\).*|\1\"file:$TOPDIR/SOURCES/repos/\"|" \ + $TOPDIR/LIVEBUILD_ROOT/config/bootstrap + +# Prevent debootstrap from cleaning our cache +sed -i 's|^\(LB_CACHE_PACKAGES=\).*|\1"false"|' \ + $TOPDIR/LIVEBUILD_ROOT/config/common + +# Disable GPG checking +sed -i 's|^\(LB_APT_SECURE=\).*|\1"false"|' \ + $TOPDIR/LIVEBUILD_ROOT/config/common diff --git a/mkbaselibs b/mkbaselibs index 1446ff0..c7ce4fa 100755 --- a/mkbaselibs +++ b/mkbaselibs @@ -529,8 +529,8 @@ sub handle_rpms { $arch = $res{'ARCH'}->[0]; my @targets = get_targets($arch, $config); if (!@targets) { - print "no targets for arch $arch, nothing to do\n"; - exit(0); + print "no targets for arch $arch, skipping $rname\n"; + next; } for my $target (@targets) { @@ -637,6 +637,7 @@ sub handle_rpms { delete $alldirs{"$prefix$fn"}; } } + delete $alldirs{$_} for keys %symlinks; $ad = $prefix; delete $alldirs{$ad}; delete $alldirs{$ad} while $ad =~ s/\/[^\/]+$//; @@ -965,8 +966,8 @@ sub handle_debs { # line and get a list of target_arch-es my @targets = get_targets($arch, $config); if (!@targets) { - print "no targets for arch $arch, nothing to do\n"; - return; # there may be more debs to handle + print "no targets for arch $arch, skipping $d_name\n"; + next; # there may be more debs to handle } for my $target (@targets) { diff --git a/order b/order index 6682fd6..2236b46 100755 --- a/order +++ b/order @@ -9,6 +9,7 @@ use strict; my ($dist, $archs, $configdir, $manifest); +$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs'; while (@ARGV) { if ($ARGV[0] eq '--dist') { diff --git a/qemu-reg b/qemu-reg index fe1eca5..e18a7cd 100644 --- a/qemu-reg +++ b/qemu-reg @@ -4,10 +4,11 @@ # NOTE: this requires a qemu with the binfmt misc handler binary -:aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-arm64-binfmt:P +:aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-aarch64-binfmt:P +:aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-arm64-binfmt:P :arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-binfmt:P :armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb-binfmt:P -:ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc-binfmt:P +:ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc-binfmt:P :mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips-binfmt:P :mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel-binfmt:P #:mipsn32:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mipsn32-binfmt:P @@ -15,6 +16,6 @@ #:mips64:M::\x7fELF\x02\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips64-binfmt:P #:mips64el:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mips64el-binfmt:P -:sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4-binfmt:P -:sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb-binfmt:P +:sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-sh4-binfmt:P +:sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb-binfmt:P diff --git a/queryconfig b/queryconfig new file mode 100755 index 0000000..f4d383c --- /dev/null +++ b/queryconfig @@ -0,0 +1,64 @@ +#!/usr/bin/perl -w + +BEGIN { + unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build'); +} + +use strict; + +use Build; + +my ($dist, $archs, $configdir, $debug, $type, $argument); + +$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs'; + +while (@ARGV) { + if ($ARGV[0] eq '--dist') { + shift @ARGV; + $dist = shift @ARGV; + next; + } elsif ($ARGV[0] eq '--archpath') { + shift @ARGV; + $archs = shift @ARGV; + next; + } elsif ($ARGV[0] eq '--configdir') { + shift @ARGV; + $configdir = shift @ARGV; + next; + } elsif (defined($type)) { + $argument = shift @ARGV; + } else { + $type = shift @ARGV; + } +} + +die("Please specify what to query\n") unless defined $type; + +my $cf = Build::read_config_dist($dist, $archs, $configdir); +die("Unable to read config\n") unless $cf; + +if ($type eq 'buildflags') { + die("Specify which buildflag to query\n") unless $argument; + my $result = $cf->{"buildflags:$argument"}; + print "$result\n" if defined $result; +} elsif ($type eq 'target' || $type eq 'type' || $type eq 'binarytype' || $type eq 'buildengine' || $type eq 'rawmacros') { + print "$cf->{$type}\n" if $cf->{$type}; +} elsif ($type eq 'optflags') { + exit(0) unless $cf->{'optflags'}; + my $all = $cf->{'optflags'}->{'*'}; + $all = defined($all) && $all ne '' ? " $all" : ''; + $all .= " -g" if $argument && $argument eq 'debug'; + for (sort keys %{$cf->{'optflags'}}) { + next if $_ eq '*'; + print "optflags: $_ $cf->{'optflags'}->{$_}$all\n"; + } +} elsif ($type eq 'substitute') { + die("Specify which substitute to query\n") unless $argument; + my @res = @{$cf->{'substitute'}->{$argument} || []}; + print join(' ', @res)."\n" if @res; +} else { + die("unsupported query type: $type\n"); +} + +exit(0); + diff --git a/substitutedeps b/substitutedeps index efea76a..54e540c 100755 --- a/substitutedeps +++ b/substitutedeps @@ -19,6 +19,8 @@ sub expand { my ($dist, $buildroot, $rpmdeps, $archs, $configdir, $release, $changelog); +$configdir = ($::ENV{'BUILD_DIR'} || '/usr/lib/build') . '/configs'; + while (@ARGV) { if ($ARGV[0] eq '--root') { shift @ARGV; diff --git a/t/bad.livebuild b/t/bad.livebuild new file mode 100644 index 0000000000000000000000000000000000000000..ae2cae0b91594e0151d24ebacd05b43422bd768a GIT binary patch literal 40960 zcmeHQYmeJD7M-u7U%^g`pvA6aNz}{fCc8nKq6N}6=roJ{us|V8^jIBPG$eVF>Eplm zl9Fd+TAJ}ga-8%U1B@g-L>}tg%g5!VF?t=o`<8_<%L~KvsW}RlB|q!+XTr~OoHOws ze(HbIqV}0(i=XFF-#&u}rtO`PcfFRPBeP{uhB*|eBY5k_Ro(6@w{^nz8G^*zhgAT+E(9n%?8>I9ZyxixFOM4gtaT(RNYy zjwPt!yRP89<+~L{tb2JNf))PTzG^CUE(?&5ouOx{PfdG{O`u*?+_yS-!tD;+ywt0lK-}&%75yc z?io3_Po@^6?f!2r|3Cd?G)b~iG1Ihyl|*NnmQINLAV|i=*Fi2m`~5$EUT9iAC;F5` zJeww0B2k#%-raFt7G)kTRu7_C4v+5c_mDtmPr~LDZkR% znhc-yhd{gjmu=kJOLo`)jzw|&*Bky1WrX_wA#^_euuA{;%XbyE$MnAklRfM6KaK@M zLe&2%kOSPe=>I4z7%2VEbA(sg6LjXK=>H(_EW-;N zmzse~Th@Oa!yX6Jrlvc__1{iZKb(MiI(N_lKc@d7yc+-C^WXAd{twrG2W=LadENf% z3h)GG?^7#c?2heC`9BT}8+5Zv1HYyJzn1pEf?@KbAW-vvjqiPH zfbHb}I{$6pKlcBJ{{&jwUmXqHEsPmL9~hN!&-P{8PX0IS|83jyu>Ze3zz4*W&%=m7|G54){3nC@e|U^f`3g}THgl$+x0(n6#Z{|CXWAA z7zep8!{Si@B6xPfCkUSI`i|9O-a8ulfv{6CQIYKb4!|KRgW8UOnh*ngt`2NlWw z?>`~0S6dce=Lye~@|LWcU(;moAPpBKUsTscG1I{j(haN+^j{Xt@%RX|@?X{eb2cwo zQSMv12LHDk|64xzp~Lb2zIgAFZb$tec!o!*J$ArP;HLgZ`>$P~KZ&@l{6CQIYQ-A- zZy*1|X0J8<5B$gdpDK#O+}BMVc>h3!J`BRAoomg1RpU!{A2;k^({EY%2LB({|KRr5 zH$AZbc6`r9{eO%vXI=lhrU@FJg7LRKwyE^+i~fI)(G2hH9X0<~eDB-z`;Pw)`F{kV zQ0e~$|6xi1?Z1!kRjBQ+DuT*BaLTgQL4Svd^+L`2Vo}Z=C;z{{Q-Hf$qE%{V&gd!~Ngg zcztXk{j+@&p$7k3^}i23f7aK3Z4d3gHgO!{$&NST9s-zm?Z zY8oNcd;qzu4S_Z71u6Knd>iJFO!&-?rO$l5avU6iWBmyuaAaOg-~b`vV|osmiio$h zZ(->ezaZ0`&$UvNq3Vb>Uv7Y#f3Z7lEl)lvVg3Q~6)DNTW@Wj6xeFPu^7UVc`HNA^ zZdh79mdQuY4eiHlRgDRpa1fI^{y$qvzH)#NlebAZlL&lDzzj~mf-{opz(z7n`yLJ( zfB=9?R20rS3MYJ7Hlh%)pq3!N5=RSM%3}!%vdHlcGvT{%oiqPMEh0S_#nR4iAxnlpfSY9gn1$YhyWsh2p|H803v`0AOeU0B7g`W z0*C-2fCwN0hyWsh2p|H803v`0AOeU0B7g`W0*C-2fCwN0hyWsh2p|H803v`0435BG DM!?cd literal 0 HcmV?d00001 diff --git a/t/directory.livebuild b/t/directory.livebuild new file mode 100644 index 0000000000000000000000000000000000000000..318d128c6ab61cb27e658f0d8dcaafa3a4d6cf33 GIT binary patch literal 30720 zcmeHQ{g0bA7`|VRzrszcYSl)9F(08_yH#taO={Pww@&+EQbmGup+|58)7mLO()o~v7VJo$%LAe1pLqK|L;>jM(~$R zDH^kI;$JQz81k_YB@v})!lH+Yg3vQM^4$8w%*TBeqC#Ne}>+g8TwtLKj(8(L7@BVXn0T zY{C|hiiL`w#AwQ9bPgcF2z+-tpQPpb&|A=dGdEng0i;)U;*urdXe_C);lH5&yxU3$ zvwu*I|NOEzR9epew)k&bhSdN4k={Q?nf_aj)c^gF{4#TF_|NIy&LohNzIy(*&4105 z^S>^hs6zh>A}|i98y;B^-v9f}|13?e{~ZZ>&Fs?t*97V-O;+H46Lc4ls_s@@?dWsUwkUCk; z(|9H~x>L;*Pxrpe49xQb#=kCn2j0ej3 z`MVdt{`U6IcR#;)`p2ucZ!RA9(wH8PxqyJ5o2ureRw#KV^bmA@oSX52pX3V3= z%T~10fb3dbt@=jkx^0#=@WaJNbrQJOFlveUSg6q2PrZD?xjVi}7q)v@#&nq*isOY$ zGcTKE`fL=G7MOvQ7PK5|m2^}~K?VK``k#)(j=c8)`mb3;>i?0j*UB#SzZOhiZK4AI zo1nXZRh9l@%>Dni=l{CYe*wof0!s8B=Ktwqu#(nHlhFP9h>oWW-TMLQPwr#%FG}DA zv7D*5(JS4Rx#7Pc{f*59YU@AIG-89FAU1XB|JBViP|*M3(87IdXqZGBnyH6x!T(qK ze|6I@UEO8F|K;jz3pcLPe~8cYf5U$aZlKctw}rka7Af?Hkv`+#{21+kX?oi~7FhSf&m;fh_6&dnCH2pIzX8j_yr)1MOk|*Zi0M zKixb#LjMc)f4QWo27a8}wgF~$ee2nOV%o6%4Bq^oX*z5a0{xf!|8`^ARLsWy8=Bz| zVmNl+=6gRJ)6u2zefc5P)nUpy>Lb1}f2+M45kx&G@#{U@3w_kRdDwh@r-oX>WJXS?ka#)4St zej8YyVwn~E7xkaPDGvVM=^+Po#{oJ1*VKQ*Hf*{6+r{%D^}h?0Pxl@b{0|PGyU^Gi z|I78C7{&QNYygq-e*wrA0undAQfYVztGTcR6nubU7Eo0V0$PCjB#W%zzo7qcE>d~| zR9)@ojn47EuKsJL)c;PN7pec9z{tq2a0hQ;HRUd}v~+|A!*?b>yqy{~>f2fXVT{T>mjC=s)}-gxvor;MhjM zvV(`#w^GpC!1vV46!&qrnyYT#(%VvqrGJi;ewH{lAApN9!8~7=LXjfB&UD z*iWY9-TXh8?n2vg{4byX8D=*B+wfnP{@((OtpvC>0h>FXsP+h3s-b&hb) 5; +use Build::LiveBuild; + +use Data::Dumper; +use Digest::MD5 qw(md5_hex); + +my $VAR = ' + + +a + +b +#comment + +! whatever +'; + +is(Build::LiveBuild::filter($VAR), 'a +b +'); + + +my $DEB_ARCHIVE = ' +# comment +deb obs://openSUSE.org:Debian:7.0/standard wheezy main contrib +deb-src obs://openSUSE.org:Debian:7.0/standard wheezy main contrib + +'; +my $DEB_ARCHIVE_RESULT = "\$VAR1 = 'openSUSE.org:Debian:7.0/standard'; +"; + +is(Dumper(Build::LiveBuild::parse_archive($DEB_ARCHIVE)), $DEB_ARCHIVE_RESULT); + +my $config = {}; +$Data::Dumper::Sortkeys = 1; +is(md5_hex(Dumper(Build::LiveBuild::parse( $config, 'standard.livebuild'))), + '9cfb69e8f0581293f207342edacd19e7'); + +#print Dumper(Build::LiveBuild::parse( $config, 'standard.livebuild')); + +is(md5_hex(Dumper(Build::LiveBuild::parse( $config, 'directory.livebuild'))), + 'bc803d2b4a375d9a02b3242117f6c93a'); + +#print Dumper(Build::LiveBuild::parse( $config, 'directory.livebuild')); + +is(md5_hex(Dumper(Build::LiveBuild::parse( $config, 'bad.livebuild'))), + '1e596160978007d1014e9c5e38574700'); + +#print Dumper(Build::LiveBuild::parse( $config, 'bad.livebuild')); diff --git a/t/standard.livebuild b/t/standard.livebuild new file mode 100644 index 0000000000000000000000000000000000000000..bd96fda50f3070ff7e468bdf9a62ec6028b44ca4 GIT binary patch literal 30720 zcmeHQZExE)5YE@=SFmYOtk@)rqF&pzTd{W7fOajKb=Zdig)Gsr8d)?XIc>J}zwb!N zv24kXY)gro(Jc^}FDLS$o;y-Jp0&YS|MM@@4{4fdST}5M;Lmb))a6Hqk8PSq{4ab~ z|LT|+N7&#W+a`{21PK`HN9c2xjaVmZmgRm5O)qZ-oFS z`=C|H-3xJQIF`kEj~%O^2wvy|p1s0D@sOlq*6tRhe$jSC}I5RKqn9W z`SHt%qNEd~j!?joQFO*D`RV1=H^%ZTPyOjUAsDBSboGr*CM=nM%h)Up=(0GFnx`zD z-()z8;!um(nVdy7JhELTt+D@Nkh{9i4))(Le}4G+)$>2zynlE4^hD&G@SIaf`03@-laU{1l&3s-qA14^aqY&6 zrfVbHwbiLF3SU*v)7iW>&HSL4qlkxgK1umYIabwT+9EEavxKEo%`UT?PSlW&{8^l5 zNaRgeNKr_Kk)IR^#kCqG@GdZpX^P_Lf)-hEl*~S>qu9TISxd&}LMy%fa#Afg^@DT& zj6%VpVl;toAdU+e7jIe1^2IDj2rNJng37s8_v5@yVzd1h^RIPPwoc!{{_B<@*Z*4s zy+Z|Q|91fG4pkBS@0RX0bgr}i7}xfH96tY->;D>*ohLNde^~#E2V!no3!8)Yb0vO$pTM`@h8-o(>z(+Wr$=Cl2frVZ#5&{ofA9V4bKH z`|r9o)@;|bi0)cM?*FcX?ari^uXB6t&vo`6@{9HVg8$gI<^FH4gHj4F$G^4%JcQTx zF%xb;3+2ce;aJ~Ewj-7 z+{2R)({nV3`+j^nb}2{yUn~6Q zm#ar*>gWFqY;gZ?dH%2eM@8EI{xLq}J2ditKf2etTj77R{fEWg()nKl>u_99`hV1r z>^^}HwL0;WnI9|SI%h1-q}}fx>BE%R$p5OXKz1H0d|C{YUF<0!rVe4}JU&FDFgxt^0Rhpc^dtEpJ3Qt4E zVyenXKp$8iqRdAA*X%!>i%CL1g(JB;y#5#K{jK6Z!0As@+W#AQT%`TK5ttA5CXM{x zkM6a;UTgm$=GV&l-@(9tdH$mYW#2%+1>gf0TJpbU@kP9k3%alCx9EL^ z{~PQ-_2os<*&Pq@!zHYcYkAX8;1nmf%&4e{~Zp&T2U+ZU;O@yJpZ*8t~-~}IoTT!s_?(j z{yT8ye`)_08@Am4Z2+=|q~FI;hTwlbre%EoSt{IoQJzA0zY$9xD+)p{ifFl~r5})@ zJVzND<)8c%s_~e)p@^BQ7J&l;2&_A#2!1jrMDPOwJjUb%gz|!yWo$ta7&k+slueYJ zx1pGbR&TCBm|yOlz9f?kb3aNzF0YBcALse>@n9gz6|sIZjiqOUkY3QZNEX!x&ot#t zGVjI^A{>XPEdO0Y%jX9mL-Z-i#{z--2)4o1Gx&{!GP6=mQC>r^VaNcuct_#44*VgT z<&`1`9H<1yuXt$TQxTRpL(`OfgqX?zp#W^eW>AVHN(7;b$818UJbJL7ukYtGAva2d n=)#R3$}4MeDT;73dU%$kNQr<%Kq4R!kO)WwBmxqF!$;shObAj# literal 0 HcmV?d00001 diff --git a/test/common b/test/common index 6c42210..45c0da2 100644 --- a/test/common +++ b/test/common @@ -22,6 +22,8 @@ if [ -e ${0%/*}/config.local ]; then . ${0%/*}/config.local fi +: ${BUILD_DIR:=/usr/lib/build} + #if [ ! -e "$build_vm_img" ]; then # sudo dd if=/dev/zero of="$build_vm_img" bs=512 count=0 seek=$((build_vm_image_size*2*1024)) #fi @@ -89,8 +91,10 @@ run_build() build_args+=("$i") fi done - set -- $linux32 sudo env \ - /usr/bin/build \ + SU_WRAPPER="" + [ -x /usr/bin/sudo ] && SU_WRAPPER="sudo env" + set -- $linux32 $SU_WRAPPER \ + $BUILD_DIR/build \ --root "${build_root}" \ "${repos[@]}" \ "${build_args[@]}" diff --git a/test/testbuild.sh b/test/testbuild.sh new file mode 100755 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/vc b/vc index e9d8f55..bf57343 100755 --- a/vc +++ b/vc @@ -125,7 +125,7 @@ set +e echo fi if [ -n "$message" ]; then - echo "- $message" + echo -e "- $message" echo elif [ -n "$content" ]; then cat "$content" @@ -133,24 +133,6 @@ set +e elif [ ! $just_edit ]; then echo "- " echo - if [ -d .osc -a -n "$(which osc 2>/dev/null)" ]; then - OSC_STATUS="$(cd "$pkgpath" &> /dev/null; osc st)" - ADDED="$(sed -n 's/^A[[:blank:]]\+\([^[:blank:]].*\.\(patch\|diff\)\)$/ * \1/p' <<< "$OSC_STATUS")" - DELETED="$(sed -n 's/^D[[:blank:]]\+\([^[:blank:]].*\.\(patch\|diff\)\)$/ * \1/p' <<< "$OSC_STATUS")" - MODIFIED="$(sed -n 's/^M[[:blank:]]\+\([^[:blank:]].*\.\(patch\|diff\)\)$/ * \1/p' <<< "$OSC_STATUS")" - if [ -n "$ADDED" ]; then - echo "- added patches:" - echo "$ADDED" - fi - if [ -n "$DELETED" ]; then - echo "- removed patches:" - echo "$DELETED" - fi - if [ -n "$MODIFIED" ]; then - echo "- modified patches:" - echo "$MODIFIED" - fi - fi fi cat $changelog } >> "$tmpfile" @@ -166,5 +148,7 @@ if [ -z "$message" ]; then fi fi mode=`stat -c "%a" "$changelog"` +user=`stat -c "%U:%G" "$changelog"` mv "$tmpfile" "$changelog" chmod $mode "$changelog" +chown $user "$changelog" diff --git a/zvm_functions b/zvm_functions deleted file mode 100644 index a914694..0000000 --- a/zvm_functions +++ /dev/null @@ -1,223 +0,0 @@ -#!/bin/bash - -zvm_cleanup_and_exit() -{ - if test -n "$1"; then - echo "$1" - umount ${BUILD_ROOT}/proc - umount ${BUILD_ROOT}/dev/pts - cleanup_and_exit 1 - else - exit 0 - cleanup_and_exit 1 - fi -} - -prevent_detach() -{ - if test "$1" = "150" -o "$1" = "0150"; then - echo "don't detach local root" - zvm_cleanup_and_exit 1 - fi -} - -zvm_memset() -{ - # defining the worker also resets the operating system. Be careful - # $1: user name - # $2: amount in MB - # Note, that this is also limited by the worker definition in the user directory - if test -n "$2"; then - if ! vmcp send $1 define storage ${2}M ; then - zvm_cleanup_and_exit "Could not redefine storage of $1 to ${2}M" - fi - fi -} - -zvm_logon() -{ - # kill machine if it already runs - # autolog machine - # Needs machine name as $1 - if test -n "$1"; then - if $(vmcp q "$1" >& /dev/null); then - vmcp force $1 - sleep 1 - fi - if ! $(vmcp q "$1" >& /dev/null); then - if ! $(vmcp xautolog $1 >& /dev/null); then - zvm_cleanup_and_exit "Could not start machine $1. Is $1 defined in the user directory?" - else - # give the worker a moment to initialize - sleep 2 - zvm_memset $1 $MEMSIZE - sleep 2 - fi - fi - fi -} - -zvm_ipl() -{ - # IPL worker. Needs user as $1 and ipl device as $2. - if test -n "$1" -a -n "$2"; then - if ! $(vmcp q "$1" >& /dev/null); then - zvm_cleanup_and_exit "User $1 not logged on." - else - if ! $(vmcp send $1 ipl $2); then - zvm_cleanup_and_exit "Could not send command to $1" - fi - fi - else - zvm_cleanup_and_exit "Not enough arguments for ipl. Need user and device number." - fi -} - - -zvm_destroy() -{ - # Destroy build. Done by killing the worker machine. - # needs user as $1 - if test -n "$1"; then - if ! $(vmcp force $1 ); then - zvm_cleanup_and_exit "Could not force $1" - fi - fi -} - -zvm_get_local_devnr() -{ - # $1 is base address, either 150 or 250 - # $2 is worker number - # there is room for up to 100 workers for this controlling guest, however in our setup I expect only up to 10 workers. - #echo "Debug: zvm_get_local_devnr: arg1: $1 arg2: $2" - if test $2 -ge 100 ; then - zvm_cleanup_and_exit "Not more than 100 workers supported by one controlling guest." - fi - if test "$1" = "0150" -o "$1" = "150" ; then - DEVNR=$((300+$2)) - else - if test "$1" = "0250" -o "$1" = "250" ; then - DEVNR=$((400+$2)) - else - zvm_cleanup_and_exit "The disk devices for root and swap must be 150 and 250 respectively." - fi - fi - echo $DEVNR -} - -zvm_volume_link_local() -{ - # attach worker disk to local system as preparation for - # a) prepare worker for build - # b) get rpms of the swap disk after build finished - # disk must be detached from worker first - # The following arguments are needed: - # 1. Worker user name - # 2. Worker disk device number - # 3. Mult password for the disk - # 4. Worker number to generate a uniq local device number - if test -n "$4"; then - DEVNR=$(zvm_get_local_devnr $2 $4) - if ! vmcp link $1 $2 $DEVNR MW pass=THR4ME >& /dev/null ; then - zvm_cleanup_and_exit "Could not link disk $2 from user $1 to local device $DEVNR." - fi - dasd_configure 0.0.0$DEVNR 1 0 >& /dev/null - udevadm settle - DEVICE=$(ls /sys/bus/ccw/devices/0.0.0$DEVNR/block/) - if ! test -b /dev/${DEVICE}1 ; then - zvm_cleanup_and_exit "The device /sys/bus/ccw/devices/0.0.0$DEVNR has not been setup correctly." - fi - echo "${DEVICE}1" - else - zvm_cleanup_and_exit "Not enough arguments given to volume_link_local." - fi -} - -zvm_volume_detach_local() -{ - # we need - # 1. worker device number - # 2. worker number - DEVNR=$(zvm_get_local_devnr $1 $2) - prevent_detach $DEVNR - dasd_configure 0.0.0$DEVNR 0 0 - if ! vmcp detach $DEVNR >& /dev/null ; then - zvm_cleanup_and_exit "Could not locally detach disk number $1 from worker $2" - fi -} - -zvm_volume_attach() -{ - # link the local disk of the worker - # $1: user name - # $2: disk device number - # send link * nr nr - if ! vmcp send $1 link \* $2 $2 ; then - zvm_cleanup_and_exit "Could not link remote worker disk number $2 from user $1" - fi -} - -zvm_volume_detach() -{ - # send machine detach nr - # $1: user name - # $2: disk - if ! vmcp send $1 detach $2 ; then - zvm_cleanup_and_exit "Could not detach disk $2 on worker $1" - fi -} - -zvm_worker_init() -{ - # 1. Worker user name - # 2. Worker root device number - # 3. Worker swap device number - # 4. Worker number to generate a uniq local device number - # Check for: - # - still mounted dasd - # - configured dasd - # - linked dasd - # - reset worker with force and autolog - DEVNR_ROOT=$(zvm_get_local_devnr $2 $4) - DEVNR_SWAP=$(zvm_get_local_devnr $3 $4) - # First, check for mounts: - for DEVNR in $DEVNR_ROOT $DEVNR_SWAP; do - if [ -d /sys/bus/ccw/devices/0.0.0$DEVNR/block ]; then - DEV=$(ls /sys/bus/ccw/devices/0.0.0$DEVNR/block/) - echo "Found device of worker $1 available at $DEVNR, device is /dev/$DEV." - grep "/dev/$DEV" /proc/mounts >& /dev/null && umount /dev/${DEV}1 - fi - done - # Second, check if devices are online - for DEVNR in $DEVNR_ROOT $DEVNR_SWAP; do - lsdasd $DEVNR | grep $DEVNR && dasd_configure 0.0.0$DEVNR 0 0 - done - # Third, remove stale links - for DEVNR in $DEVNR_ROOT $DEVNR_SWAP; do - prevent_detach $DEVNR - if vmcp q v $DEVNR 2> /dev/null; then - vmcp detach $DEVNR - fi - done - # Fourth, reset worker - zvm_logon $1 -} - -zvm_cp() -{ - modprobe vmcp || zvm_cleanup_and_exit "Cannod load vmcp module" - if test -n $1 ; then - case "$1" in - start) shift ; zvm_logon $* ;; - ipl) shift ; zvm_ipl $* ;; - destroy) shift ; zvm_destroy $* ;; - volume_attach) shift ; zvm_volume_attach $* ;; - volume_detach) shift ; zvm_volume_detach $* ;; - volume_link_local) shift ; zvm_volume_link_local $* ;; - volume_detach_local) shift ; zvm_volume_detach_local $* ;; - memset) shift ; zvm_memset $* ;; - worker_init) shift ; zvm_worker_init $* ;; - esac - fi -} -- 2.34.1