* Add support for MultiArch configuration files and checks for a suitable version of dpkg. * Allow multiple keyring packages to be imported. (Closes: #635584)
git-svn-id: http://emdebian.org/svn/current@8055 563faec7-e20c-0410-992a-a66f704d0ccd
This commit is contained in:
parent
04f394acd5
commit
99bbcbe436
10 changed files with 1304 additions and 650 deletions
5
debian/changelog
vendored
5
debian/changelog
vendored
|
@ -1,8 +1,11 @@
|
|||
multistrap (2.1.16) unstable; urgency=low
|
||||
|
||||
* Allow empty aptsources lines. (Closes: #633525)
|
||||
* Add support for MultiArch configuration files and checks for a
|
||||
suitable version of dpkg.
|
||||
* Allow multiple keyring packages to be imported. (Closes: #635584)
|
||||
|
||||
-- Neil Williams <codehelp@debian.org> Mon, 11 Jul 2011 12:21:09 +0100
|
||||
-- Neil Williams <codehelp@debian.org> Fri, 29 Jul 2011 13:36:42 +0200
|
||||
|
||||
multistrap (2.1.15) unstable; urgency=low
|
||||
|
||||
|
|
6
debian/control
vendored
6
debian/control
vendored
|
@ -13,7 +13,7 @@ Vcs-Svn: http://www.emdebian.org/svn/current/
|
|||
Package: multistrap
|
||||
Section: admin
|
||||
Architecture: all
|
||||
Depends: ${perl:Depends}, ${misc:Depends}, apt,
|
||||
Depends: ${perl:Depends}, ${misc:Depends}, apt (>= 0.8.15.2),
|
||||
libconfig-auto-perl, libparse-debian-packages-perl
|
||||
Recommends: emdebian-archive-keyring
|
||||
Suggests: fakeroot
|
||||
|
@ -32,7 +32,9 @@ Description: multiple repository bootstrap based on apt
|
|||
packages have been unpacked but before being configured.
|
||||
.
|
||||
Unlike debootstrap, multistrap relies on working versions of
|
||||
dpkg and apt outside the final filesystem.
|
||||
dpkg and apt outside the final filesystem. If dpkg supports
|
||||
MultiArch, foreign architecture libraries can be installed,
|
||||
where available.
|
||||
.
|
||||
Multistrap supercedes emdebian-rootfs and replaces the previous
|
||||
support for preparing root filesystems for specific machines and
|
||||
|
|
1
debian/dirs
vendored
Normal file
1
debian/dirs
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
/etc/multistrap.d/
|
412
doc/po/da.po
412
doc/po/da.po
File diff suppressed because it is too large
Load diff
439
doc/po/de.po
439
doc/po/de.po
File diff suppressed because it is too large
Load diff
439
doc/po/fr.po
439
doc/po/fr.po
File diff suppressed because it is too large
Load diff
439
doc/po/pt.po
439
doc/po/pt.po
File diff suppressed because it is too large
Load diff
44
examples/multiarch.conf
Normal file
44
examples/multiarch.conf
Normal file
|
@ -0,0 +1,44 @@
|
|||
# Example multistrap configuration file for the sid shortcut.
|
||||
|
||||
[General]
|
||||
arch=
|
||||
directory=
|
||||
# same as --tidy-up option if set to true
|
||||
cleanup=true
|
||||
# same as --no-auth option if set to true
|
||||
# keyring packages listed in each debootstrap will
|
||||
# still be installed.
|
||||
noauth=false
|
||||
# whether to add the /suite to be explicit about where apt
|
||||
# needs to look for packages. Default is false.
|
||||
explicitsuite=false
|
||||
# extract all downloaded archives (default is true)
|
||||
unpack=true
|
||||
# enable MultiArch for the specified architectures
|
||||
multiarch=armel armhf
|
||||
# the order of sections is not important.
|
||||
# the debootstrap option determines which repository
|
||||
# is used to calculate the list of Priority: required packages.
|
||||
debootstrap=Debian Foreign ForeignFloat
|
||||
aptsources=Debian
|
||||
|
||||
[Debian]
|
||||
packages=apt
|
||||
source=http://ftp.uk.debian.org/debian
|
||||
keyring=debian-archive-keyring
|
||||
suite=sid
|
||||
|
||||
[Foreign]
|
||||
packages=libgcc1
|
||||
packages=libc6
|
||||
architecture=armel
|
||||
source=http://ftp.uk.debian.org/debian
|
||||
keyring=debian-archive-keyring
|
||||
suite=sid
|
||||
|
||||
[ForeignFloat]
|
||||
packages=libgcc1 libc6
|
||||
architecture=armhf
|
||||
source=http://ftp.uk.debian.org/debian
|
||||
keyring=debian-archive-keyring
|
||||
suite=sid
|
128
multistrap
128
multistrap
|
@ -35,7 +35,8 @@ use vars qw/ $progname $ourversion $dstrap $extra @aptsources $mirror
|
|||
$omitpreinst @reinstall $tgzname %uniq %required $check @check %uniq
|
||||
$explicit_suite $allow_recommends %omitdebsrc @dsclist @sectoutput
|
||||
%flatfile %important $addimportant @debconf $hookdir %hooks
|
||||
$warn_count /;
|
||||
$warn_count $use_shortcut @foreignarches $olddpkg
|
||||
%foreignpkgs /;
|
||||
|
||||
setlocale(LC_MESSAGES, "");
|
||||
textdomain("multistrap");
|
||||
|
@ -43,7 +44,7 @@ $progname = basename($0);
|
|||
$ourversion = &our_version();
|
||||
$unpack = "true";
|
||||
%omitdebsrc=();
|
||||
|
||||
%foreignpkgs=();
|
||||
while( @ARGV ) {
|
||||
$_= shift( @ARGV );
|
||||
last if m/^--$/;
|
||||
|
@ -53,6 +54,8 @@ while( @ARGV ) {
|
|||
} elsif (/^(-\?|-h|--help|--version)$/) {
|
||||
&usageversion();
|
||||
exit( 0 );
|
||||
} elsif (/^(-s|--shortcut)$/) {
|
||||
$use_shortcut = shift(@ARGV);
|
||||
} elsif (/^(-f|--file)$/) {
|
||||
$file = shift(@ARGV);
|
||||
} elsif (/^(-a|--arch)$/) {
|
||||
|
@ -74,6 +77,16 @@ while( @ARGV ) {
|
|||
die "$progname: "._g("Unknown option")." $_.\n";
|
||||
}
|
||||
}
|
||||
if (defined $use_shortcut) {
|
||||
my $short = "/usr/share/multistrap/".$use_shortcut.".conf";
|
||||
if (-f $short) {
|
||||
$file = $short;
|
||||
}
|
||||
$short = "/etc/multistrap.d/".$use_shortcut.".conf";
|
||||
if (-f $short) {
|
||||
$file = $short;
|
||||
}
|
||||
}
|
||||
$msg = sprintf (_g("Need a configuration file - use %s -f\n"), $progname);
|
||||
die ($msg)
|
||||
if (not defined $file);
|
||||
|
@ -160,6 +173,7 @@ if (not -d "$dir") {
|
|||
}
|
||||
$dir = realpath ($dir);
|
||||
$dir .= ($dir =~ m:/$:) ? '' : "/";
|
||||
# add a do_it wrapper to check the retval of system
|
||||
system ("mkdir -p ${dir}${cachedir}") if (not -d "${dir}${cachedir}");
|
||||
system ("mkdir -p ${dir}${libdir}") if (not -d "${dir}${libdir}");
|
||||
system ("mkdir -p ${dir}${dpkgdir}") if (not -d "${dir}${dpkgdir}");
|
||||
|
@ -194,7 +208,19 @@ if (not -d "${dir}etc/network") {
|
|||
if (not -d "${dir}dev") {
|
||||
mkdir "${dir}dev";
|
||||
}
|
||||
|
||||
if ($olddpkg != 0) {
|
||||
if (not -d "${dir}etc/dpkg/dpkg.cfg.d/") {
|
||||
system ("mkdir -p ${dir}etc/dpkg/dpkg.cfg.d/");
|
||||
}
|
||||
if (not -f "${dir}etc/dpkg/dpkg.cfg.d/multiarch") {
|
||||
open (MA, ">${dir}etc/dpkg/dpkg.cfg.d/multiarch");
|
||||
foreach my $farch (@foreignarches) {
|
||||
print MA "foreign-architecture $farch\n";
|
||||
}
|
||||
close (MA);
|
||||
}
|
||||
}
|
||||
die;
|
||||
&guard_lib64($dir);
|
||||
|
||||
system ("rm -rf ${dir}etc/apt/sources.list.d/*");
|
||||
|
@ -280,15 +306,13 @@ if ((defined $k) and (not defined $noauth)) {
|
|||
}
|
||||
foreach my $gpg (@files) {
|
||||
next if ($gpg =~ /removed/);
|
||||
system ("gpg --no-default-keyring ".
|
||||
$retval = system ("gpg --no-default-keyring ".
|
||||
"--homedir=${dir}/etc/apt/trusted.gpg.d/ ".
|
||||
"--keyring=multistrap.gpg ".
|
||||
" --import ${xdir}/usr/share/keyrings/${gpg} 2>/dev/null");
|
||||
if (-f "${dir}/etc/apt/trusted.gpg.d/multistrap.gpg") {
|
||||
system ("cp ${dir}/etc/apt/trusted.gpg.d/multistrap.gpg ${dir}/etc/apt/trusted.gpg.d/trustdb.gpg");
|
||||
} else {
|
||||
die (_g("Secure Apt handling failed - try without authentication."));
|
||||
}
|
||||
" --import ${xdir}/usr/share/keyrings/${gpg}");
|
||||
$retval /= 256;
|
||||
die (_g("Secure Apt handling failed - try without authentication."))
|
||||
if ($retval != 0);
|
||||
}
|
||||
system ("rm -rf ${xdir}");
|
||||
}
|
||||
|
@ -370,7 +394,7 @@ if ((defined $setupsh) and (-x $setupsh)) {
|
|||
$warn_count++;
|
||||
}
|
||||
}
|
||||
# run first set of hooks
|
||||
# run first set of hooks - probably unnecessary re setupscript.
|
||||
&run_download_hooks(sort @{$hooks{'D'}}) if (defined $hooks{'D'});
|
||||
my $err = &native if (not defined ($foreign) and $unpack eq "true");
|
||||
if (defined $err and $err != 0) {
|
||||
|
@ -1012,6 +1036,9 @@ cleanup=true
|
|||
noauth=false
|
||||
# extract all downloaded archives (default is true)
|
||||
unpack=true
|
||||
# enable MultiArch for the specified architectures
|
||||
# default is empty
|
||||
multiarch=
|
||||
# aptsources is a list of sections to be used for downloading packages
|
||||
# and lists and placed in the /etc/apt/sources.list.d/multistrap.sources.list
|
||||
# of the target. Order is not important
|
||||
|
@ -1046,6 +1073,7 @@ will be created - it is not packed into a .tgz once complete.
|
|||
}
|
||||
|
||||
sub cascade {
|
||||
$olddpkg = &check_multiarch_dpkg;
|
||||
$file = shift;
|
||||
$config = Config::Auto::parse($file, format => 'ini');
|
||||
if (not defined $config or (scalar keys %$config) == 0) {
|
||||
|
@ -1108,7 +1136,14 @@ sub cascade {
|
|||
push (@{$hooks{'N'}}, $fl) if ($hf =~ /^native/);
|
||||
}
|
||||
}
|
||||
my @d = split(' ', lc($keys{$section}{'debootstrap'}));
|
||||
my @ma=();
|
||||
if ($olddpkg != 0) {
|
||||
@ma = split(' ',lc($keys{$section}{'multiarch'}))
|
||||
if (defined $keys{$section}{'multiarch'});
|
||||
}
|
||||
push @foreignarches, @ma;
|
||||
my @d=();
|
||||
@d = split(' ', lc($keys{$section}{'debootstrap'}));
|
||||
push @debootstrap, @d;
|
||||
my @b = split(' ', lc($keys{$section}{'bootstrap'}))
|
||||
if (defined $keys{$section}{'bootstrap'});
|
||||
|
@ -1138,10 +1173,32 @@ sub cascade {
|
|||
# don't set suite or component if URL is of apt-ftparchive trailing-slash form
|
||||
# regexp is: optional string in '[]', string without '[' or ']', string ending in '/'
|
||||
$flatfile{$section}++ if (($sources{$section} =~ /^(\[.*\] )*[^\[\]]+ .+\/$/));
|
||||
if (ref ($keys{$section}{'packages'}) eq 'ARRAY') {
|
||||
$packages{$section}=join(' ', @{$keys{$section}{'packages'}}) if (not exists $packages{$section});
|
||||
if (exists $keys{$section}{'architecture'}) {
|
||||
my $frgn_arch = $keys{$section}{'architecture'};
|
||||
my @tmp=();
|
||||
if (ref ($keys{$section}{'packages'}) eq 'ARRAY') {
|
||||
foreach my $p (@{$keys{$section}{'packages'}}) {
|
||||
push @tmp, "$p:$frgn_arch";
|
||||
}
|
||||
} else {
|
||||
foreach my $p (split(' ', $keys{$section}{'packages'})) {
|
||||
push @tmp, "$p:$frgn_arch";
|
||||
}
|
||||
}
|
||||
if ($olddpkg == 0) {
|
||||
$packages{$section} = join(' ', @tmp);
|
||||
} else {
|
||||
my $dpkgmsg = sprintf (_g("ERR: Unsupportable option: 'architecture'. ".
|
||||
"Current dpkg version does not support MultiArch. ".
|
||||
"Packages for '%s' have been ignored.\n"), $section);
|
||||
warn $dpkgmsg;
|
||||
}
|
||||
} else {
|
||||
$packages{$section}=join(' ', $keys{$section}{'packages'}) if (not exists $packages{$section});
|
||||
if (ref ($keys{$section}{'packages'}) eq 'ARRAY') {
|
||||
$packages{$section}=join(' ', @{$keys{$section}{'packages'}}) if (not exists $packages{$section});
|
||||
} else {
|
||||
$packages{$section}=join(' ', $keys{$section}{'packages'}) if (not exists $packages{$section});
|
||||
}
|
||||
}
|
||||
$suites{$section}=$keys{$section}{'suite'}
|
||||
if (not exists $suites{$section} and not exists $flatfile{$section});
|
||||
|
@ -1170,6 +1227,39 @@ sub cascade {
|
|||
@extrapkgs = keys %uniq;
|
||||
}
|
||||
|
||||
# returns zero on success, non-zero on fail
|
||||
sub check_multiarch_dpkg {
|
||||
my $distro;
|
||||
my $version;
|
||||
my $retval = system ("which lsb_release >/dev/null");
|
||||
$retval /= 256;
|
||||
if ($retval == 1) {
|
||||
# have to assume this is Debian, not Ubuntu
|
||||
$distro = "debian";
|
||||
} else {
|
||||
$distro = lc(`lsb_release -is`);
|
||||
chomp ($distro);
|
||||
}
|
||||
if ($distro eq "debian") {
|
||||
$version = `dpkg -l dpkg|grep dpkg`;
|
||||
chomp ($version);
|
||||
$version =~ s/^ii[ ]+dpkg[ ]+([0-9\.]+)[ ]+.+$/$1/;
|
||||
# fill in the version which gets this support in Debian
|
||||
$retval = system("dpkg --compare-versions $version '>=' 1.20");
|
||||
$retval /= 256;
|
||||
return $retval;
|
||||
} else {
|
||||
# only Ubuntu explicitly supported here
|
||||
# looking for >= 1.16.0~ubuntu4
|
||||
$version = `dpkg -l dpkg|grep dpkg`;
|
||||
chomp ($version);
|
||||
$version =~ s/^ii[ ]+dpkg[ ]+([^ ]+)[ ]+.+$/$1/;
|
||||
$retval = system("dpkg --compare-versions $version '>=' 1.16.0~ubuntu4");
|
||||
$retval /= 256;
|
||||
return $retval;
|
||||
}
|
||||
}
|
||||
|
||||
sub _g {
|
||||
return gettext(shift);
|
||||
}
|
||||
|
@ -1272,10 +1362,16 @@ sub dump_config {
|
|||
print "additional:\t\t$plural".join (", ", sort @extrapkgs)."\n" if (scalar @extrapkgs > 0);
|
||||
print "reinstall:\t\t".join (", ", sort (@reinstall))."\n" if (scalar @reinstall > 0);
|
||||
if (defined $arch and $arch ne "") {
|
||||
printf ("arch:\t\t\t"._g("Architecture to download: %s\n"), $arch);
|
||||
printf ("Architecture:\t\t"._g("Architecture to download: %s\n"), $arch);
|
||||
} else {
|
||||
$msg .= sprintf(_g("Cannot determine architecture from '%s'.\n"), $file);
|
||||
}
|
||||
if ($olddpkg != 0) {
|
||||
printf "MultiArch:\t\t%s\n",_g("Currently installed dpkg does not support MultiArch.");
|
||||
} else {
|
||||
$plural = ngettext("Foreign architecture", "Foreign architectures", scalar @foreignarches);
|
||||
printf ("MultiArch:\t\t%s: %s\n", $plural, join(" ", sort @foreignarches));
|
||||
}
|
||||
if (defined $dir and $dir ne "") {
|
||||
printf ("dir:\t\t\t"._g("Output directory: '%s'\n"), $dir);
|
||||
} else {
|
||||
|
|
|
@ -67,6 +67,9 @@ Example configuration:
|
|||
# whether to add the /suite to be explicit about where apt
|
||||
# needs to look for packages. Default is false.
|
||||
explicitsuite=false
|
||||
# enable MultiArch for the specified architectures
|
||||
# default is empty
|
||||
multiarch=
|
||||
# aptsources is a list of sections to be used
|
||||
# the /etc/apt/sources.list.d/multistrap.sources.list
|
||||
# of the target. Order is not important
|
||||
|
@ -675,4 +678,42 @@ people on the debian-embedded@lists.debian.org mailing list and
|
|||
does not parse correctly. You would need to put the C<--simulate> output
|
||||
on a pastebin website and put the URL in your message.
|
||||
|
||||
=head1 MultiArch support
|
||||
|
||||
To enable multiarch inside a chroot, there is no need to set the second
|
||||
architecture in C<apt>, C<apt> will ask C<dpkg> which will look in
|
||||
F</etc/dpkg/dpkg.cfg> or F</etc/dpkg/dpkg.cfg.d/> and then retrieve the
|
||||
Packages data for each architecture specified using the option:
|
||||
|
||||
foreign-architecture armel
|
||||
|
||||
For multiple architectures, specify the option once for each
|
||||
architecture.
|
||||
|
||||
Using the MultiArch option in the C<General> section of your C<multistrap>
|
||||
configuration file will create a file F</etc/dpkg/dpkg.cfg.d/multiarch>
|
||||
which will implement this support. This option can be repeated (for
|
||||
compatibility with how dpkg works) or as a space-delimited list of
|
||||
architectures on a single line.
|
||||
|
||||
See also http://wiki.debian.org/Multiarch/
|
||||
|
||||
[General]
|
||||
...
|
||||
MultiArch=armel armhf
|
||||
|
||||
Each Section will install packages from the base architecture unless
|
||||
the C<Architecture> option is specified for particular sections.
|
||||
|
||||
[Foreign]
|
||||
packages=libgcc1 libc6
|
||||
architecture=armel
|
||||
source=http://ftp.uk.debian.org/debian
|
||||
keyring=debian-archive-keyring
|
||||
suite=sid
|
||||
|
||||
In the C<--simulate> output, the architecture(s) specified in the
|
||||
MultiArch option will be listed under the "Foreign architectures"
|
||||
listing.
|
||||
|
||||
=cut
|
||||
|
|
Loading…
Reference in a new issue