Преглед изворни кода

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

David Kalnischkies пре 14 година
родитељ
комит
666faa35f8

+ 22 - 11
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)

+ 3 - 0
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

+ 1 - 0
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:

+ 25 - 0
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