ensure that the right architecture is used for cross-dependencies in
authorDavid Kalnischkies <kalnischkies@gmail.com>
Sun, 5 Aug 2012 10:23:59 +0000 (12:23 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Sun, 5 Aug 2012 10:23:59 +0000 (12:23 +0200)
cases we have to choose a provider by defaulting on host-arch
instead of build-arch

cmdline/apt-get.cc
debian/changelog
test/integration/test-bug-632221-cross-dependency-satisfaction
test/integration/test-bug-683786-build-dep-on-virtual-packages

index b14206f..6b6c8a2 100644 (file)
@@ -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)
index ef68aea..4646762 100644 (file)
@@ -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
index 7e8a43a..d90a103 100755 (executable)
@@ -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:
index 246bd2e..879d6a3 100755 (executable)
@@ -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