Here is a patch for apt-get so that apt-get source <foo> will also install
build-dependencies of foo, and remove build-conflicts of foo.

I don't really like this patch; comments/suggestions on how to better do
this will be appreciated.

Incidentally, Jason, I checked the patch into the aliencode branch...... not
sure if that's what you wanted.

Index: apt-get.cc
===================================================================
RCS file: /cvs/deity/apt/cmdline/apt-get.cc,v
retrieving revision 1.97.2.3
diff -u -r1.97.2.3 apt-get.cc
--- apt-get.cc  2000/06/18 07:28:09     1.97.2.3
+++ apt-get.cc  2000/06/26 00:08:34
@@ -1463,6 +1463,58 @@
                        I->MD5Hash,I->Size,Last->Source()->SourceInfo(Src,
                        Last->Version(),Comp),Src);
       }
+
+      // Process the build-dependencies too
+      if (_config->FindB("APT::Get::BuildDepends",true) == true)
+      {
+         vector<pkgSrcRecords::Parser::BuildDepRec> BuildDeps;
+         if (Last->BuildDepends(BuildDeps) == false)
+            return _error->Error("Unable to get build-dependency information 
for %s",Src.c_str());
+   
+         if (BuildDeps.size() > 0) 
+        {
+           unsigned int ExpectedInst = 0;
+            vector <pkgSrcRecords::Parser::BuildDepRec>::iterator D;
+            pkgProblemResolver Fix(Cache);
+            for (D = BuildDeps.begin(); D != BuildDeps.end(); D++)
+           {
+              pkgCache::PkgIterator Pkg = Cache->FindPkg((*D).Package);
+              if (Pkg.end() == true)
+                 return _error->Error("%s dependency on %s cannot be satisfied 
because the package %s cannot be found", Last->BuildDepType((*D).Type), 
Src.c_str(), (*D).Package.c_str());
+              pkgCache::VerIterator IV = (*Cache)[Pkg].InstVerIter(*Cache);
+
+              if ((*D).Type == pkgSrcRecords::Parser::BuildConflict || 
(*D).Type == pkgSrcRecords::Parser::BuildConflictIndep) 
+              {
+                 // conflict; need to remove if we have an installed version 
+                 // that satisfy the version criteria
+                 if (IV.end() == false && ((*D).Version == "" ||
+                     pkgCheckDep((*D).Version.c_str(), IV.VerStr(), (*D).Op) 
== true)) {
+                        Cache->MarkDelete(Pkg,false);         
+                 }
+              } else {
+                 // depends; need to install or upgrade if we don't have the
+                 // package installed or if the version does not satisfy the
+                 // build dep. This is complicated by the fact that if we
+                 // depend on a version lower than what we already have 
+                 // installed it is not clear what should be done; in practice
+                 // this case should be rare though and right now nothing
+                 // is done about it :-(
+                 if (IV.end() == true || ((*D).Version != "" &&
+                     pkgCheckDep((*D).Version.c_str(), IV.VerStr(), (*D).Op) 
== false)) {
+                        Cache->MarkInstall(Pkg,true);
+                 }
+              }               
+           }
+      
+            Fix.InstallProtect();
+            if (Fix.Resolve(true) == false)
+               _error->Discard();
+   
+            // Now we check the state of the packages,
+            if (Cache->BrokenCount() != 0)
+              return _error->Error("Some broken packages were found while 
trying to process build-dependencies.\nYou might want to run `apt-get -f 
install' to correct these.");
+         }
+      }
    }
    
    // Display statistics
@@ -1524,6 +1576,13 @@
    if (Failed == true)
       return _error->Error("Failed to fetch some archives.");
    
+   if (_config->FindB("APT::Get::BuildDepends", true) == true)
+   {
+      cout << "Processing package build dependencies" << endl;
+      if (InstallPackages(Cache, false))
+         return _error->Error("Failed to process build dependencies");
+   }
+
    if (_config->FindB("APT::Get::Download-only",false) == true)
       return true;
    

randolph
-- 
Debian Developer <[EMAIL PROTECTED]>
http://www.TauSq.org/

Reply via email to