]> git.saurik.com Git - apt.git/commitdiff
Added compile and unpack support to apt-get
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:53:37 +0000 (16:53 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:53:37 +0000 (16:53 +0000)
Author: jgg
Date: 1999-04-19 06:03:09 GMT
Added compile and unpack support to apt-get

apt-pkg/version.cc
apt-pkg/version.h
cmdline/apt-get.cc
doc/apt-get.8.yo
doc/apt.conf.5.yo
doc/examples/apt.conf

index f3ebb556e0389dae658483e935379bb9ec77e25b..4aad581f8e597c495dfabaa4041eaa5972664581 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: version.cc,v 1.8 1998/12/05 01:44:57 jgg Exp $
+// $Id: version.cc,v 1.9 1999/04/19 06:03:09 jgg Exp $
 /* ######################################################################
 
    Version - Version string 
@@ -248,3 +248,24 @@ bool pkgCheckDep(const char *DepVer,const char *PkgVer,int Op)
    return false;
 }
                                                                        /*}}}*/
+// BaseVersion - Return the upstream version string                    /*{{{*/
+// ---------------------------------------------------------------------
+/* This strips all the debian specific information from the version number */
+string pkgBaseVersion(const char *Ver)
+{
+   // Strip off the bit before the first colon
+   const char *I = Ver;
+   for (; *I != 0 && *I != ':'; I++);
+   if (*I == ':')
+      Ver = I + 1;
+   
+   // Chop off the trailing -
+   I = Ver;
+   unsigned Last = strlen(Ver);
+   for (; *I != 0; I++)
+      if (*I == '-')
+        Last = I - Ver;
+   
+   return string(Ver,Last);
+}
+                                                                       /*}}}*/
index ba7eb592d36354626c1703a754a83ff0ec84ea5e..127519583c7fa9833bf164c7fa911f40349bac31 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: version.h,v 1.4 1998/07/19 21:24:19 jgg Exp $
+// $Id: version.h,v 1.5 1999/04/19 06:03:09 jgg Exp $
 /* ######################################################################
 
    Version - Version comparison routines
@@ -25,5 +25,6 @@ int pkgVersionCompare(const char *A, const char *AEnd, const char *B,
                   const char *BEnd);
 int pkgVersionCompare(string A,string B);
 bool pkgCheckDep(const char *DepVer,const char *PkgVer,int Op);
+string pkgBaseVersion(const char *Ver);
 
 #endif
index fb51c74e15c645fbe10578aa9260f33c8df5d8da..504cde33e3861ca96994b4ced67754a12da2aab6 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: apt-get.cc,v 1.53 1999/04/18 06:51:09 jgg Exp $
+// $Id: apt-get.cc,v 1.54 1999/04/19 06:03:09 jgg Exp $
 /* ######################################################################
    
    apt-get - Cover for dpkg
@@ -1047,6 +1047,13 @@ bool DoCheck(CommandLine &CmdL)
 // DoSource - Fetch a source archive                                   /*{{{*/
 // ---------------------------------------------------------------------
 /* Fetch souce packages */
+struct DscFile
+{
+   string Package;
+   string Version;
+   string Dsc;
+};
+
 bool DoSource(CommandLine &CmdL)
 {
    CacheFile Cache;
@@ -1070,9 +1077,12 @@ bool DoSource(CommandLine &CmdL)
    // Create the download object
    AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));   
    pkgAcquire Fetcher(&Stat);
+
+   DscFile *Dsc = new DscFile[CmdL.FileSize()];
    
    // Load the requestd sources into the fetcher
-   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   unsigned J = 0;
+   for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++)
    {
       string Src;
       
@@ -1130,7 +1140,13 @@ bool DoSource(CommandLine &CmdL)
         // Try to guess what sort of file it is we are getting.
         string Comp;
         if (I->Path.find(".dsc") != string::npos)
+        {
            Comp = "dsc";
+           Dsc[J].Package = Last->Package();
+           Dsc[J].Version = Last->Version();
+           Dsc[J].Dsc = flNotDir(I->Path);
+        }
+        
         if (I->Path.find(".tar.gz") != string::npos)
            Comp = "tar";
         if (I->Path.find(".diff.gz") != string::npos)
@@ -1180,6 +1196,7 @@ bool DoSource(CommandLine &CmdL)
       return false;
 
    // Print error messages
+   bool Failed = false;
    for (pkgAcquire::Item **I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); I++)
    {
       if ((*I)->Status == pkgAcquire::Item::StatDone &&
@@ -1188,8 +1205,51 @@ bool DoSource(CommandLine &CmdL)
       
       cerr << "Failed to fetch " << (*I)->DescURI() << endl;
       cerr << "  " << (*I)->ErrorText << endl;
+      Failed = true;
    }
+   if (Failed == true)
+      return _error->Error("Failed to fetch some archives.");
+   
+   if (_config->FindB("APT::Get::Download-only",false) == true)
+      return true;
    
+   // Unpack the sources
+   for (unsigned I = 0; I != J; I++)
+   {
+      string Dir = Dsc[I].Package + '-' + pkgBaseVersion(Dsc[I].Version.c_str());
+    
+      // See if the package is already unpacked
+      struct stat Stat;
+      if (stat(Dir.c_str(),&Stat) == 0 &&
+         S_ISDIR(Stat.st_mode) != 0)
+      {
+        c0out << "Skipping unpack of already unpacked source in " << Dir << endl;
+      }
+      else
+      {
+        // Call dpkg-source
+        char S[500];
+        snprintf(S,sizeof(S),"%s -x %s",
+                 _config->Find("Dir::Bin::dpkg-source","dpkg-source").c_str(),
+                 Dsc[I].Dsc.c_str());
+        if (system(S) != 0)
+           return _error->Error("Unpack command '%s' failed.",S);
+      }
+  
+      // Try to compile it with dpkg-buildpackage
+      if (_config->FindB("APT::Get::Compile",false) == true)
+      {
+        // Call dpkg-buildpackage
+        char S[500];
+        snprintf(S,sizeof(S),"cd %s && %s %s",
+                 Dir.c_str(),
+                 _config->Find("Dir::Bin::dpkg-buildpackage","dpkg-buildpackage").c_str(),
+                 _config->Find("DPkg::Build-Options","-b -uc").c_str());
+        
+        if (system(S) != 0)
+           return _error->Error("Build command '%s' failed.",S);
+      }      
+   }   
    return true;
 }
                                                                        /*}}}*/
@@ -1277,6 +1337,8 @@ int main(int argc,const char *argv[])
       {'q',"quiet","quiet",CommandLine::IntLevel},
       {'q',"silent","quiet",CommandLine::IntLevel},
       {'d',"download-only","APT::Get::Download-Only",0},
+      {'b',"compile","APT::Get::Compile",0},
+      {'b',"build","APT::Get::Compile",0},
       {'s',"simulate","APT::Get::Simulate",0},      
       {'s',"just-print","APT::Get::Simulate",0},      
       {'s',"recon","APT::Get::Simulate",0},      
index 3e6e64a492a631b574d5d924fa680929ede4bdac..62f80d75410b6d7fc2baebcb72e209c217e992d4 100644 (file)
@@ -89,7 +89,10 @@ find and download into the current directory the newest available version of
 that source package. Source packages are tracked seperately from binary
 packages via df(deb-src) type lines in the bf(/etc/apt/sources.list) file.
 This probably will mean that you will not get the same source as the package
-you have installed or as you could install.
+you have installed or as you could install. If the --compile options is
+specified then the package will be compiled to a binary .deb using
+dpkg-buildpackage, if --download-only is specified then the source package
+will not be unpacked.
 
 dit(bf(check))
 bf(check) is a diagnostic tool; it updates the package cache and checks for 
@@ -173,6 +176,9 @@ dit(bf(-u, --show-upgraded))
 Show upgraded packages; Print out a list of all packages that are to be
 upgraded. See bf(APT::Get::Show-Upgraded).
 
+dit(bf(-b, --compile, --build))
+Compile source packages after downloading them.
+
 dit(bf(--ignore-hold))
 Ignore package Holds; This causes bf(apt-get) to ignore a hold placed on 
 a package. This may be usefull in conjunction with bf(dist-upgrade) to
index b089f9b0aba0fa7408fe12dc0e16a3410f1bc86d..9e14b861cebd6c483aa818c023ce1090ba3ad554 100644 (file)
@@ -150,7 +150,8 @@ gives the location of the sourcelist and bf(main) is the default configuration
 file (setting has no effect)
 
 Binary programs are pointed to by bf(Dir::Bin). bf(methods) specifies the
-location of the method handlers and bf(gzip), bf(dpkg), bf(apt-get), and
+location of the method handlers and bf(gzip), bf(dpkg), bf(apt-get), 
+bf(dpkg-source), bf(dpkg-buildpackage) and
 bf(apt-cache) specify the location of the respective programs.
 
 manpagesection(APT in DSelect)
@@ -194,6 +195,10 @@ are invoked in order using /bin/sh, should any fail APT will abort.
 dit(bf(Run-Directory))
 APT chdirs to this directory before invoking dpkg, the default is /.
 
+dit(bf(Build-Options))
+These options are passed to dpkg-buildpackage when compiling packages,
+the default is to disable signing and produce all binaries.
+
 enddit()
 
 manpagesection(Debug Options)
index 93426736a166631e8be6f4f7802fb40f563ff1a1..a295e59eaff4e7a3f9018b03338620a7dfca37d8 100644 (file)
@@ -1,4 +1,4 @@
-// $Id: apt.conf,v 1.31 1999/04/11 21:23:10 jgg Exp $
+// $Id: apt.conf,v 1.32 1999/04/19 06:03:09 jgg Exp $
 /* This file is an index of all APT configuration directives. It should
    NOT actually be used as a real config file, though it is a completely
    valid file.
@@ -32,6 +32,7 @@ APT
      Show-Upgraded "false";
      No-Upgrade "false";
      Print-URIs "false";
+     Compile "false";
   };
 
   Cache 
@@ -139,6 +140,8 @@ Dir
      methods "/usr/lib/apt/methods/";
      gzip "/bin/gzip";
      dpkg "/usr/bin/dpkg";
+     dpkg-source "/usr/bin/dpkg-source";
+     dpkg-buildpackage "/usr/bin/dpkg-buildpackage"
      apt-get "/usr/bin/apt-get";
      apt-cache "/usr/bin/apt-cache";
   };
@@ -164,6 +167,9 @@ DPkg
    
    // Prevents daemons from getting cwd as something mountable (default)
    Run-Directory "/";
+   
+   // Build options for apt-get source --compile
+   Build-Options "-b -uc";
 }
 
 /* Options you can set to see some debugging text They corrispond to names