From 8e03e408b009fb4bf8c9165c348652da3d760611 Mon Sep 17 00:00:00 2001
From: comio <comio@cassini.homenet.telecomitalia.it>
Date: Sun, 18 Oct 2009 11:53:53 +0200
Subject: [PATCH] Add distcc support

---
 Config.in                   |   28 ++++++++++++++++++++++++++
 include/package-defaults.mk |   26 ++++++++++++++++++++++-
 rules.mk                    |   11 ++++++++++
 tools/Makefile              |    1 +
 tools/distcc/Makefile       |   46 +++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 110 insertions(+), 2 deletions(-)
 create mode 100644 tools/distcc/Makefile

diff --git a/Config.in b/Config.in
index ae1ba9f..3fa5bb4 100644
--- a/Config.in
+++ b/Config.in
@@ -276,6 +276,34 @@ config CCACHE
 	help
 		Compiler cache; see http://ccache.samba.org/
 
+config DISTCC
+	bool
+	prompt "Use distcc" if DEVEL && EXTERNAL_TOOLCHAIN
+	default n
+	help
+		Distributed C/C++ compiler; see http://distcc.org
+
+config DISTCC_PUMP
+	bool
+	prompt "Enable 'pump' mode" if !CCACHE && DEVEL
+	default n
+	help
+		"The 'pump' mode accelerates remote compilation with distcc buth it's not compatibile with ccache"
+
+config DISTCC_POTENTIAL_HOSTS
+	string
+	prompt "Distcc servers" if DISTCC && DEVEL
+	default "localhost"
+	help
+		Available Distcc servers in your network.
+
+config JOBS
+	int
+	prompt "Number  of jobs to run simultaneously" if DEVEL
+	default 0
+	help
+		Specifies the  number  of jobs (commands) to run simultaneously. The value 0 means "unspecified".
+
 config EXTERNAL_KERNEL_TREE
 	string
 	prompt "Use external kernel tree" if DEVEL
diff --git a/include/package-defaults.mk b/include/package-defaults.mk
index 2b5cb86..195f37e 100644
--- a/include/package-defaults.mk
+++ b/include/package-defaults.mk
@@ -94,13 +94,35 @@ define Build/Configure/Default
 	)
 endef
 
+ifneq ($(strip $(CONFIG_JOBS)),)
+ifneq ($(strip $(CONFIG_JOBS)),0)
+	MAKE_JOBS = -j$(CONFIG_JOBS)
+endif
+endif
+
+ifneq ($(CONFIG_DISTCC),)
+ifneq ($(CONFIG_DISTCC_PUMP),)
+MAKE_DISTCC_VARS=DISTCC_POTENTIAL_HOSTS="$(CONFIG_DISTCC_POTENTIAL_HOSTS)"
+else
+MAKE_DISTCC_VARS=DISTCC_HOSTS="$(CONFIG_DISTCC_POTENTIAL_HOSTS)"
+endif
+endif
+
+ifneq ($(CONFIG_DISTCC_PUMP),)
+FAST_MAKE=pump $(MAKE)
+else
+FAST_MAKE=$(MAKE)
+endif
+
 MAKE_VARS = \
+	$(MAKE_DISTCC_VARS)
 	CFLAGS="$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)" \
 	CXXFLAGS="$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)" \
 	LDFLAGS="$(TARGET_LDFLAGS) $(EXTRA_LDFLAGS)"
 
 MAKE_FLAGS = \
 	$(TARGET_CONFIGURE_OPTS) \
+	$(MAKE_JOBS) \
 	CROSS="$(TARGET_CROSS)" \
 	ARCH="$(ARCH)"
 
@@ -112,14 +134,14 @@ MAKE_PATH = .
 
 define Build/Compile/Default
 	$(MAKE_VARS) \
-	$(MAKE) -C $(PKG_BUILD_DIR)/$(MAKE_PATH) \
+	$(FAST_MAKE) -C $(PKG_BUILD_DIR)/$(MAKE_PATH) \
 		$(MAKE_FLAGS) \
 		$(1);
 endef
 
 define Build/Install/Default
 	$(MAKE_VARS) \
-	$(MAKE) -C $(PKG_BUILD_DIR)/$(MAKE_PATH) \
+	$(FAST_MAKE) -C $(PKG_BUILD_DIR)/$(MAKE_PATH) \
 		$(MAKE_INSTALL_FLAGS) \
 		$(1) install;
 endef
diff --git a/rules.mk b/rules.mk
index 20cb85e..485ffbb 100644
--- a/rules.mk
+++ b/rules.mk
@@ -148,6 +148,17 @@ INSTALL_DIR:=install -d -m0755
 INSTALL_DATA:=install -m0644
 INSTALL_CONF:=install -m0600
 
+ifneq ($(CONFIG_DISTCC),)
+  # FIXME: move this variable to a better location
+ifneq ($(CONFIG_DISTCC_PUMP),y)
+  export DISTCC_HOSTS=$(CONFIG_DISTCC_POTENTIAL_HOSTS)
+else
+  export DISTCC_POTENTIAL_HOSTS=$(CONFIG_DISTCC_POTENTIAL_HOSTS)
+endif
+  TARGET_CC:= distcc $(TARGET_CC)
+  TARGET_CXX:= distcc $(TARGET_CXX)
+endif
+
 ifneq ($(CONFIG_CCACHE),)
   # FIXME: move this variable to a better location
   export CCACHE_DIR=$(STAGING_DIR)/ccache
diff --git a/tools/Makefile b/tools/Makefile
index 0d91b1f..1018ad6 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -16,6 +16,7 @@ tools-y += sstrip ipkg-utils genext2fs squashfs squashfs4 mtd-utils lzma-old mki
 tools-y += firmware-utils patch-cmdline quilt yaffs2
 
 tools-$(CONFIG_CCACHE) += ccache
+tools-$(CONFIG_DISTCC) += distcc
 tools-$(CONFIG_powerpc) += dtc
 tools-dep += lzma
 
diff --git a/tools/distcc/Makefile b/tools/distcc/Makefile
new file mode 100644
index 0000000..34cc7e1
--- /dev/null
+++ b/tools/distcc/Makefile
@@ -0,0 +1,46 @@
+# 
+# Copyright (C) 2006 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/target.mk
+
+PKG_NAME:=distcc
+PKG_VERSION:=3.1
+
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
+PKG_SOURCE_URL:=http://distcc.googlecode.com/files/
+PKG_MD5SUM:=2f6be779869648f2d211ebf09f694715
+PKG_CAT:=zcat
+
+include $(INCLUDE_DIR)/host-build.mk
+
+ifneq ($(strip $(shell which distcc >/dev/null && echo found)),found)
+  define Host/Compile
+	$(MAKE) CC="$(HOSTCC)" -C $(HOST_BUILD_DIR)
+  endef
+
+  define Host/Install
+	$(MAKE) -C $(HOST_BUILD_DIR) install
+  endef
+
+  define Host/Clean
+	-$(MAKE) -C $(HOST_BUILD_DIR) uninstall
+	$(call Host/Clean/Default)
+  endef
+else
+  define Host/Prepare
+  endef
+  define Host/Configure
+  endef
+  define Host/Compile
+  endef
+  define Host/Install
+  endef
+  define Host/Clean
+  endef
+endif
+
+$(eval $(call HostBuild))
-- 
1.6.5

