Package: pbuilder
Version: 0.170
Severity: wishlist
Tags: patch

Hi,

As discussed on the boat under DebConf, here's a patch to enable ccache
support in pbuilder. I've only tested it lightly, but it seems to work
well.

-- System Information:
Debian Release: lenny/sid
  APT prefers oldstable
  APT policy: (500, 'oldstable'), (500, 'unstable'), (500, 'testing'), (500, 
'stable')
Architecture: i386 (i686)

Kernel: Linux 2.6.22-rc4 (SMP w/2 CPU cores; PREEMPT)
Locale: LANG=nb_NO.UTF-8, LC_CTYPE=nb_NO.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages pbuilder depends on:
ii  cdebootstrap                  0.4.3      Bootstrap a Debian system
ii  coreutils                     5.97-5.3   The GNU core utilities
ii  debianutils                   2.21.1     Miscellaneous utilities specific t
ii  debootstrap                   1.0.0      Bootstrap a basic Debian system
ii  gcc                           4:4.1.2-3  The GNU C compiler
ii  wget                          1.10.2-3   retrieves files from the web

Versions of packages pbuilder recommends:
ii  cowdancer                     0.36       Copy-on-write directory tree utili
ii  devscripts                    2.10.5     Scripts to make the life of a Debi
ii  fakeroot                      1.7.1      Gives a fake root environment
ii  sudo                          1.6.8p12-5 Provide limited super user privile

-- no debconf information
diff -Nru /tmp/MNKC25Sy4K/pbuilder-0.170/debian/dirs 
/tmp/iIhIKpSUZF/pbuilder-0.171/debian/dirs
--- /tmp/MNKC25Sy4K/pbuilder-0.170/debian/dirs  2007-01-07 06:53:01.000000000 
+0100
+++ /tmp/iIhIKpSUZF/pbuilder-0.171/debian/dirs  2007-06-27 01:17:22.000000000 
+0200
@@ -4,4 +4,5 @@
 var/cache/pbuilder
 var/cache/pbuilder/result
 var/cache/pbuilder/aptcache
+var/cache/pbuilder/ccache
 
diff -Nru /tmp/MNKC25Sy4K/pbuilder-0.170/Documentation/pbuilder-doc.xml 
/tmp/iIhIKpSUZF/pbuilder-0.171/Documentation/pbuilder-doc.xml
--- /tmp/MNKC25Sy4K/pbuilder-0.170/Documentation/pbuilder-doc.xml       
2007-06-25 14:09:46.000000000 +0200
+++ /tmp/iIhIKpSUZF/pbuilder-0.171/Documentation/pbuilder-doc.xml       
2007-06-27 10:24:41.000000000 +0200
@@ -1496,6 +1496,23 @@
        <command>ccapabilities</command> of this vserver.
       </para>
     </sect1>
+    <sect1 id="ccache">
+      <title>Using pbuilder with ccache</title>
+      <para>
+       It is possible to use the C compiler cache <command>ccache</command>
+       together with <command>pbuilder</command> to speed up repeated builds of
+       the same package (or packages that compile the same files multiple times
+       for some reason). Using <command>ccache</command> can speed up repeated
+       building of large packages dramatically, at the cost of some disk space
+       and bookkeeping.
+      </para>
+      <para>
+       To use <command>pbuilder</command> with <command>ccache</command>, you
+       will need to give the command <command>--use-ccache</command> both
+       when creating the initial chroot and when building. Optionally, you
+       can set <command>USE_CCACHE="yes"</command> in your pbuilderrc file.
+      </para>
+    </sect1>
   </chapter>
   <chapter id="refs">
     <title>Reference materials</title>
@@ -1536,6 +1553,10 @@
              <entry>Default location <command>pbuilder</command> will use as 
apt cache, to store deb packages required during <command>pbuilder</command> 
build.</entry>
            </row>
            <row>
+             <entry><filename>/var/cache/pbuilder/ccache</filename></entry>
+             <entry>Default location <command>pbuilder</command> will use as 
ccache location, if ccache is enabled</entry>
+           </row>
+           <row>
              <entry><filename>/var/cache/pbuilder/result</filename></entry>
              <entry>Default location <command>pbuilder</command> puts the deb 
files and other files created after build</entry>
            </row>
@@ -1614,6 +1635,13 @@
              </entry>
            </row>
            <row>
+             <entry><filename>/var/cache/pbuilder/ccache</filename></entry>
+             <entry>
+               <command>pbuilder</command> copies the content of this 
directory to and from 
+               the ccache directory of outside chroot, if ccache is enabled.
+             </entry>
+           </row>
+           <row>
              <entry><filename>/tmp/XXXX</filename></entry>
              <entry><command>pbuilder-user-mode-linux</command> uses
              a script in <filename>/tmp</filename> to bootstrap into
diff -Nru /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilder-buildpackage 
/tmp/iIhIKpSUZF/pbuilder-0.171/pbuilder-buildpackage
--- /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilder-buildpackage        2007-05-28 
13:37:29.000000000 +0200
+++ /tmp/iIhIKpSUZF/pbuilder-0.171/pbuilder-buildpackage        2007-06-27 
10:03:22.000000000 +0200
@@ -43,6 +43,10 @@
     BUILDUSERNAME=root
 fi
 
+if [ "${USE_CCACHE}" = "yes" ]; then
+    echo "I: using ccache in build, cache is in ${CCACHE_LOCATION}."
+fi
+
 
 # created files should have these UID/GIDs outside of chroot.
 BUILDRESULTUID="${BUILDRESULTUID:-${SUDO_UID:-0}}"
@@ -111,14 +117,33 @@
     exit 1;
 fi
 
+if [ "${USE_CCACHE}" = "yes" ]; then
+    recover_ccache
+
+    if echo "chown -R $BUILDUSERNAME:$BUILDUSERNAME 
/var/cache/pbuilder/ccache" | $CHROOTEXEC /bin/bash; then
+        : # success
+    else
+        echo "E: pbuilder: Failed chowning to $BUILDUSERNAME:$BUILDUSERNAME" 
>&2 
+        exit 1;
+    fi
+fi
+
 echo " -> Building the package"
 
 executehooks "A"
 
-if [ -z "$DEBEMAIL" ]; then
-    DPKG_COMMANDLINE="cd tmp/buildd/*/; dpkg-buildpackage -us -uc 
$DEBBUILDOPTS"
+if [ "${USE_CCACHE}" = "yes" ]; then
+    if [ -z "$DEBEMAIL" ]; then
+        DPKG_COMMANDLINE="cd tmp/buildd/*/; PATH=/usr/lib/ccache:\"\$PATH\" 
CCACHE_DIR=/var/cache/pbuilder/ccache dpkg-buildpackage -us -uc $DEBBUILDOPTS"
+    else
+        DPKG_COMMANDLINE="cd tmp/buildd/*/; PATH=/usr/lib/ccache:\"\$PATH\" 
CCACHE_DIR=/var/cache/pbuilder/ccache dpkg-buildpackage -us -uc  
\"-m$DEBEMAIL\" $DEBBUILDOPTS"
+    fi
 else
-    DPKG_COMMANDLINE="cd tmp/buildd/*/; dpkg-buildpackage -us -uc  
\"-m$DEBEMAIL\" $DEBBUILDOPTS"
+    if [ -z "$DEBEMAIL" ]; then
+        DPKG_COMMANDLINE="cd tmp/buildd/*/; dpkg-buildpackage -us -uc 
$DEBBUILDOPTS"
+    else
+        DPKG_COMMANDLINE="cd tmp/buildd/*/; dpkg-buildpackage -us -uc  
\"-m$DEBEMAIL\" $DEBBUILDOPTS"
+    fi
 fi
 
 (
@@ -152,6 +177,11 @@
 trap umountproc_cleanbuildplace_trap exit sighup
 executehooks "B"
 save_aptcache
+
+if [ "${USE_CCACHE}" = "yes" ]; then
+    save_ccache
+fi
+
 trap cleanbuildplace_trap exit sighup
 umountproc
 
diff -Nru /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilder-checkparams 
/tmp/iIhIKpSUZF/pbuilder-0.171/pbuilder-checkparams
--- /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilder-checkparams 2007-05-17 
13:33:25.000000000 +0200
+++ /tmp/iIhIKpSUZF/pbuilder-0.171/pbuilder-checkparams 2007-06-27 
01:25:02.000000000 +0200
@@ -31,6 +31,7 @@
 BINARY_ARCH="no"
 PBUILDER_BUILD_LOGFILE=
 PRESERVE_BUILDPLACE="no"
+CCACHE_LOCATION="/var/cache/pbuilder/ccache"
 unset EXTRA_CONFIGFILE || true
 PBUILDER_DEBUGMODE=
 SAVE_AFTER_LOGIN=
@@ -184,6 +185,15 @@
            DEBOOTSTRAP="$2";
            shift; shift;
            ;;
+       --use-ccache)
+           # Use this option to enable ccache in the chroot
+           USE_CCACHE="yes";
+           shift;
+           ;;
+       --ccache-location)
+           CCACHE_LOCATION="$2";
+           shift; shift;
+           ;;
        --save-after-login|--save-after-exec)
            SAVE_AFTER_LOGIN=yes;
            shift;
diff -Nru /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilder-createbuildenv 
/tmp/iIhIKpSUZF/pbuilder-0.171/pbuilder-createbuildenv
--- /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilder-createbuildenv      2007-05-27 
12:52:01.000000000 +0200
+++ /tmp/iIhIKpSUZF/pbuilder-0.171/pbuilder-createbuildenv      2007-06-27 
02:25:54.000000000 +0200
@@ -28,6 +28,11 @@
 fi
 echo "Distribution is $DISTRIBUTION."
 
+if [ "${USE_CCACHE}" = "yes" ]; then
+    echo "Will install ccache into chroot."
+    EXTRAPACKAGES="$EXTRAPACKAGES ccache"
+fi
+
 if [ "${PBUILDER_DEBUGMODE}" = "yes" ]; then
     TRAP="echo ignoring trap "
 else
@@ -91,6 +96,10 @@
 $CHROOTEXEC /usr/bin/apt-get -y --force-yes install build-essential dpkg-dev 
apt $EXTRAPACKAGES
 save_aptcache
 
+if [ "${USE_CCACHE}" = "yes" ]; then
+    mkdir -p "$BUILDPLACE/var/cache/pbuilder/ccache"
+fi
+
 executehooks "E"
 unloadhooks
 umountproc
diff -Nru /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilder-modules 
/tmp/iIhIKpSUZF/pbuilder-0.171/pbuilder-modules
--- /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilder-modules     2007-05-27 
07:18:59.000000000 +0200
+++ /tmp/iIhIKpSUZF/pbuilder-0.171/pbuilder-modules     2007-06-27 
10:18:41.000000000 +0200
@@ -75,6 +75,8 @@
  --debootstrapopts [debootstrap options]
  --save-after-login/--save-after-exec
  --debootstrap [debootstrap|cdebootstrap]
+ --use-ccache
+ --ccache-location [path]
 
 pdebuild-specific pbuilder-options:
  --pbuilderroot [command to obtain root privilege for pbuilder] 
@@ -411,6 +413,46 @@
     fi
 }
 
+function recover_ccache() {
+    local doit
+    # recover the ccache archive
+    if [ -n "${USE_CCACHE}" ]; then
+       if [ "$CCACHEHARDLINK" = "yes" ]; then
+           doit=ln
+       else
+           doit=cp
+       fi
+       echo "Obtaining the compiler cache contents"
+       
+        rm -rf "$BUILDPLACE/var/cache/pbuilder/ccache/"*
+
+       # copy over everything
+       cp --preserve=timestamps -R "${CCACHE_LOCATION}/"* 
"$BUILDPLACE"/var/cache/pbuilder/ccache/
+    fi
+}
+
+function save_ccache() {
+    # save the current ccache archive, cleaning out the old one
+    local doit
+    if [ -n "${CCACHE_LOCATION}" ]; then
+       echo "Copying back the compiler cache contents"
+       mkdir -p "${CCACHE_LOCATION}" ;
+       if [ "${CCACHE_HARDLINK}" = "yes" ]; then
+           doit=ln
+       else
+           doit=cp
+       fi
+       
+       # sanity check before deleting
+       if [ -n "${CCACHE_LOCATION}/stats" ]; then
+           rm -rf "${CCACHE_LOCATION}"/*
+       fi
+
+        # copy over everything
+       cp --preserve=timestamps -R "$BUILDPLACE"/var/cache/pbuilder/ccache/* 
"${CCACHE_LOCATION}/"
+    fi
+}
+
 function create_basetgz() {
     # create base.tgz
     ( 
diff -Nru /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilderrc 
/tmp/iIhIKpSUZF/pbuilder-0.171/pbuilderrc
--- /tmp/MNKC25Sy4K/pbuilder-0.170/pbuilderrc   2007-06-25 14:09:46.000000000 
+0200
+++ /tmp/iIhIKpSUZF/pbuilder-0.171/pbuilderrc   2007-06-27 02:13:48.000000000 
+0200
@@ -78,3 +78,8 @@
 
 # default PKGNAME_LOGFILE
 PKGNAME_LOGFILE=""
+
+# speed up builds by using the compiler cache (optional)
+USE_CCACHE="no"
+CCACHE_LOCATION="/var/cache/pbuilder/ccache"
+CCACHE_HARDLINK="yes"

Reply via email to