Online documentation:

Using distcc and crosstool-ng for distributed cross-compilations:
- http://archlinuxarm.org/developers/distcc-cross-compiling

Setting up a distcc environment:
- http://archlinuxarm.org/developers/distributed-compiling

# ===========================================================================

Setting up distcc on the host (the ARM computer):

Add the following to /etc/profile.d/distcc.sh :

#-----8<------------------------------------------
# Explicitly set the ARCH since we are not natively compiling:
export ARCH=armv7hl

# Automatically determine the ARCH we are running distcc on:
MARCH=$( uname -m )
if [ -z "$ARCH" ]; then
  case "$MARCH" in
    i?86)    export ARCH=i486 ;;
    armv7hl) export ARCH=$MARCH ;;
    arm*)    export ARCH=arm ;;
    # Unless $ARCH is already set, use uname -m for all other archs:
    *)       export ARCH=$MARCH ;;
  esac
fi

case "$ARCH" in
    arm*) TARGET=$ARCH-slackware-linux-gnueabi ;;
    *)    TARGET=$ARCH-slackware-linux ;;
esac

# Define the compilers with their full name, not just "gcc" - or else
# we can not distribute the compilation to a distcc cross-compiler:
export CC=${TARGET}-gcc
export CXX=${TARGET}-g++
export AS=${TARGET}-as

# We need a private directory where we will create distcc symlinks:
DISTCC_CPATH="/var/tmp/${UID}/distcc"

# Create distcc compiler and assembler symlinks, for our host architecture:
( mkdir -p $DISTCC_CPATH
  cd $DISTCC_CPATH
  ln -svf /usr/bin/distcc ${TARGET}-gcc
  ln -svf /usr/bin/distcc ${TARGET}-g++
  ln -svf /usr/bin/distcc ${TARGET}-c++
  ln -svf /usr/bin/distcc ${TARGET}-as
)
# So that every compiler call will actually trigger distcc:
export PATH="$DISTCC_CPATH:$PATH"

# First priority is the localhost (the arm computer), note that this must
# be the literal string "localhost" which is interpreted as "run a compilation
# locally if only a single job must be run":
export DISTCC_HOSTS="localhost 192.168.0.1"
#-----8<------------------------------------------

Setting up my own distcc server:

In /etc/hosts.allow, define distccd hosts or network, otherwise the master
won't be able to connect (distcc runs on port 3632):

#-----8<------------------------------------------
distccd: 192.168.0.0/24
#-----8<------------------------------------------

Create a file with defaults for the rc.distccd script which comes next:

#-----8<------------------------------------------
# Example /etc/default/distccd 
DISTCCD_USER=nobody
DISTCCD_NUMJOBS=5
DISTCCD_ALLOW="192.168.0.0/24"
DISTCCD_PID="/var/run/distcc/distccd.pid"
#-----8<------------------------------------------

Create /etc/rc.d/rc.distccd as follows:

#-----8<------------------------------------------
# /etc/rc.d/rc.distccd
#
#    Start/stop/restart the distcc daemon.
#

# Load defaults:
if [ -f /etc/default/distccd ] ; then
  . /etc/default/distccd
fi

DISTCCD_USER=${DISTCCD_USER:-nobody}
DISTCCD_NUMJOBS=${DISTCCD_NUMJOBS:-5}
DISTCCD_ALLOW=${DISTCCD_ALLOW:-"192.168.0.0/24"}
DISTCCD_PID=${DISTCCD_PID:-/var/run/distcc/distccd.pid}

# If we allow cross-compiling, then define the architecture(s) space-separated:
DISTCCD_TARGET=${DISTCCD_TARGET:-"armv7hl"}

# Determine the ARCH we are running the distcc daemon on:
case "$( uname -m )" in
   i?86) DISTCCARCH=i486 ;;
      *) DISTCCARCH=$( uname -m ) ;;
esac

if [ -n "$DISTCCD_TARGET" ]; then
  # Where will distcc find the crosscompiler:
  DISTCC_BASEDIR=/tftpboot/crossdev/${DISTCCARCH}
  for CARCH in $DISTCCD_TARGET ; do
    DISTCC_PATH="${DISTCC_BASEDIR}/${CARCH}/bin:${DISTCC_PATH}"
  done
  echo "Distcc will look for crosscompilers in '$DISTCC_PATH'"
fi

distccd_start() {
  echo "Starting distcc daemon:  /usr/bin/distccd start"
  mkdir -p /var/run/distcc
  chown $DISTCCD_USER /var/run/distcc
  touch /var/log/distccd.log
  chown $DISTCCD_USER /var/log/distccd.log

  DISTCCD_PATH=$DISTCC_PATH/bin \
  /usr/bin/distccd --daemon -N 5 --user $DISTCCD_USER --allow $DISTCCD_ALLOW --jobs $DISTCCD_NUMJOBS --pid-file $DISTCCD_PID --log-file /var/log/distccd.log
}

distccd_stop() {
  killall distccd
}

distccd_status() {
  PIDS=$(cat $DISTCCD_PID 2>/dev/null)
  if [ "$PIDS" == "" ]; then
    echo "distccd is not running!"
  else
    echo "distccd is running at pid(s) ${PIDS}."
  fi
}

case "$1" in
   'start')
      distccd_start
      ;;
   'stop')
      distccd_stop
      ;;
   'restart')
      distccd_stop
      sleep 1
      distccd_start
      ;;
   'status')
      distccd_status
      ;;
   *)
      echo "usage $0 start|stop|restart|status" ;;
esac
#-----8<------------------------------------------


