summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <kalnischkies@gmail.com>2012-08-05 12:23:59 +0200
committerDavid Kalnischkies <kalnischkies@gmail.com>2012-08-05 12:23:59 +0200
commit666faa35f8a42d2a8691daf46a203be6d29166dc (patch)
tree3d23de0fe19af32ccbcdc6855382409a44f230b7
parent727d8712bc8d681ac95e0d8c61d3d0b46d11494c (diff)
ensure that the right architecture is used for cross-dependencies in
cases we have to choose a provider by defaulting on host-arch instead of build-arch
-rw-r--r--cmdline/apt-get.cc33
-rw-r--r--debian/changelog3
-rwxr-xr-xtest/integration/test-bug-632221-cross-dependency-satisfaction1
-rwxr-xr-xtest/integration/test-bug-683786-build-dep-on-virtual-packages25
4 files changed, 51 insertions, 11 deletions
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index b14206f92..6b6c8a23f 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -2895,11 +2895,15 @@ bool DoBuildDep(CommandLine &CmdL)
if (StripMultiArch == false && D->Type != pkgSrcRecords::Parser::BuildDependIndep)
{
size_t const colon = D->Package.find(":");
- if (colon != string::npos &&
- (strcmp(D->Package.c_str() + colon, ":any") == 0 || strcmp(D->Package.c_str() + colon, ":native") == 0))
- Pkg = Cache->FindPkg(D->Package.substr(0,colon));
+ if (colon != string::npos)
+ {
+ if (strcmp(D->Package.c_str() + colon, ":any") == 0 || strcmp(D->Package.c_str() + colon, ":native") == 0)
+ Pkg = Cache->FindPkg(D->Package.substr(0,colon));
+ else
+ Pkg = Cache->FindPkg(D->Package);
+ }
else
- Pkg = Cache->FindPkg(D->Package);
+ Pkg = Cache->FindPkg(D->Package, hostArch);
// a bad version either is invalid or doesn't satify dependency
#define BADVER(Ver) (Ver.end() == true || \
@@ -2918,13 +2922,13 @@ bool DoBuildDep(CommandLine &CmdL)
}
if (verlist.empty() == true)
{
- pkgCache::PkgIterator HostPkg = Cache->FindPkg(D->Package, hostArch);
- if (HostPkg.end() == false)
+ pkgCache::PkgIterator BuildPkg = Cache->FindPkg(D->Package, "native");
+ if (BuildPkg.end() == false && Pkg != BuildPkg)
{
- pkgCache::VerIterator Ver = (*Cache)[HostPkg].InstVerIter(*Cache);
+ pkgCache::VerIterator Ver = (*Cache)[BuildPkg].InstVerIter(*Cache);
if (BADVER(Ver) == false)
verlist.insert(Ver);
- Ver = (*Cache)[HostPkg].CandidateVerIter(*Cache);
+ Ver = (*Cache)[BuildPkg].CandidateVerIter(*Cache);
if (BADVER(Ver) == false)
verlist.insert(Ver);
}
@@ -2943,6 +2947,8 @@ bool DoBuildDep(CommandLine &CmdL)
Pkg = Ver.ParentPkg().Group().FindPkg(hostArch);
else if (strcmp(D->Package.c_str() + colon, ":any") == 0)
forbidden = "Multi-Arch: none";
+ else if (strcmp(D->Package.c_str() + colon, ":native") == 0)
+ Pkg = Ver.ParentPkg().Group().FindPkg("native");
}
else if (Ver->MultiArch == pkgCache::Version::Same)
{
@@ -2950,11 +2956,15 @@ bool DoBuildDep(CommandLine &CmdL)
Pkg = Ver.ParentPkg().Group().FindPkg(hostArch);
else if (strcmp(D->Package.c_str() + colon, ":any") == 0)
forbidden = "Multi-Arch: same";
- // :native gets the buildArch
+ else if (strcmp(D->Package.c_str() + colon, ":native") == 0)
+ Pkg = Ver.ParentPkg().Group().FindPkg("native");
}
else if ((Ver->MultiArch & pkgCache::Version::Foreign) == pkgCache::Version::Foreign)
{
- if (colon != string::npos)
+ if (colon == string::npos)
+ Pkg = Ver.ParentPkg().Group().FindPkg("native");
+ else if (strcmp(D->Package.c_str() + colon, ":any") == 0 ||
+ strcmp(D->Package.c_str() + colon, ":native") == 0)
forbidden = "Multi-Arch: foreign";
}
else if ((Ver->MultiArch & pkgCache::Version::Allowed) == pkgCache::Version::Allowed)
@@ -2972,7 +2982,8 @@ bool DoBuildDep(CommandLine &CmdL)
if (Pkg.end() == true)
Pkg = Grp.FindPreferredPkg(true);
}
- // native gets buildArch
+ else if (strcmp(D->Package.c_str() + colon, ":native") == 0)
+ Pkg = Ver.ParentPkg().Group().FindPkg("native");
}
if (forbidden.empty() == false)
diff --git a/debian/changelog b/debian/changelog
index ef68aea7b..4646762f6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -20,6 +20,9 @@ apt (0.9.7.4) UNRELEASED; urgency=low
- error out on (unsatisfiable) build-deps on purly virtual packages
instead of ignoring these dependencies; thanks to Johannes Schauer
for the detailed report! (Closes: #683786)
+ - ensure that the right architecture is used for cross-dependencies in
+ cases we have to choose a provider by defaulting on host-arch
+ instead of build-arch
* doc/apt-verbatim.ent:
- denote 'wheezy' as stable codename and 'jessie' as testing codename
in the documentation in preparation for release
diff --git a/test/integration/test-bug-632221-cross-dependency-satisfaction b/test/integration/test-bug-632221-cross-dependency-satisfaction
index 7e8a43a86..d90a103c9 100755
--- a/test/integration/test-bug-632221-cross-dependency-satisfaction
+++ b/test/integration/test-bug-632221-cross-dependency-satisfaction
@@ -63,6 +63,7 @@ Inst libc6 (1.0 unstable [amd64])
Inst specific (1.0 unstable [amd64])
Conf libc6 (1.0 unstable [amd64])
Conf specific (1.0 unstable [amd64])' aptget build-dep source-specific-amd64 -s -a armel
+
testequal 'Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
diff --git a/test/integration/test-bug-683786-build-dep-on-virtual-packages b/test/integration/test-bug-683786-build-dep-on-virtual-packages
index 246bd2ef7..879d6a3bc 100755
--- a/test/integration/test-bug-683786-build-dep-on-virtual-packages
+++ b/test/integration/test-bug-683786-build-dep-on-virtual-packages
@@ -18,6 +18,9 @@ insertsource 'unstable' 'diffutils' 'any' '1' 'Build-Depends: texi2html'
insertpackage 'unstable' 'libselinux1-dev' 'amd64' '1' 'Provides: libselinux-dev'
insertsource 'unstable' 'sed' 'any' '1' 'Build-Depends: libselinux-dev'
+insertpackage 'unstable' 'libsehurd1-dev' 'amd64,armel' '1' 'Provides: libsehurd-dev'
+insertsource 'unstable' 'sed2' 'any' '1' 'Build-Depends: libsehurd-dev'
+
setupaptarchive
testequal 'Package: po-debconf:armel
@@ -54,3 +57,25 @@ The following NEW packages will be installed:
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Inst libselinux1-dev (1 unstable [amd64])
Conf libselinux1-dev (1 unstable [amd64])" aptget build-dep sed -s
+
+testequal 'Reading package lists...
+Building dependency tree...
+E: Build-Depends dependency for sed cannot be satisfied because the package libselinux-dev cannot be found' aptget build-dep -aarmel sed -s
+
+testequal "Reading package lists...
+Building dependency tree...
+Note, selecting 'libsehurd1-dev' instead of 'libsehurd-dev'
+The following NEW packages will be installed:
+ libsehurd1-dev
+0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
+Inst libsehurd1-dev (1 unstable [amd64])
+Conf libsehurd1-dev (1 unstable [amd64])" aptget build-dep sed2 -s
+
+testequal "Reading package lists...
+Building dependency tree...
+Note, selecting 'libsehurd1-dev:armel' instead of 'libsehurd-dev:armel'
+The following NEW packages will be installed:
+ libsehurd1-dev:armel
+0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
+Inst libsehurd1-dev:armel (1 unstable [armel])
+Conf libsehurd1-dev:armel (1 unstable [armel])" aptget build-dep -aarmel sed2 -s