[PATCH ath9k-htc-fw 1/3] toolchain: rewrite the build system to allow parallelizing builds

Felix Fietkau nbd at openwrt.org
Sat Apr 6 07:44:47 EDT 2013


Use stampfiles for builds and proper dependencies to allow running
make with -j<N>. The jobserver is also passed to the package make
processes to further optimize build time.

Signed-off-by: Felix Fietkau <nbd at openwrt.org>
---
 Makefile | 167 ++++++++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 107 insertions(+), 60 deletions(-)

diff --git a/Makefile b/Makefile
index 81f4500..21bc1f0 100644
--- a/Makefile
+++ b/Makefile
@@ -1,89 +1,136 @@
 GMP_VER=5.0.5
 GMP_URL=http://ftp.gnu.org/gnu/gmp/gmp-$(GMP_VER).tar.bz2
 GMP_TAR=gmp-$(GMP_VER).tar.bz2
+GMP_DIR=gmp-$(GMP_VER)
 
 MPFR_VER=3.1.1
 MPFR_URL=http://ftp.gnu.org/gnu/mpfr/mpfr-$(MPFR_VER).tar.bz2
 MPFR_TAR=mpfr-$(MPFR_VER).tar.bz2
+MPFR_DIR=mpfr-$(MPFR_VER)
 
 MPC_VER=1.0.1
 MPC_URL=http://ftp.gnu.org/gnu/mpc/mpc-$(MPC_VER).tar.gz
 MPC_TAR=mpc-$(MPC_VER).tar.gz
+MPC_DIR=mpc-$(MPC_VER)
 
 BINUTILS_VER=2.23.1
 BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/binutils-$(BINUTILS_VER).tar.bz2
 BINUTILS_TAR=binutils-$(BINUTILS_VER).tar.bz2
+BINUTILS_DIR=binutils-$(BINUTILS_VER)
+BINUTILS_PATCHES=local/patches/binutils.patch
 
 GCC_VER=4.7.2
 GCC_URL=http://ftp.gnu.org/gnu/gcc/gcc-$(GCC_VER)/gcc-$(GCC_VER).tar.bz2
 GCC_TAR=gcc-$(GCC_VER).tar.bz2
+GCC_DIR=gcc-$(GCC_VER)
+GCC_PATCHES=local/patches/gcc.patch
 
 BASEDIR=$(shell pwd)
 TOOLCHAIN_DIR=$(BASEDIR)/toolchain
 TARGET=xtensa-elf
+DL_DIR=$(TOOLCHAIN_DIR)/dl
+BUILD_DIR=$(TOOLCHAIN_DIR)/build
 
 all: toolchain
 
-gmp-$(GMP_VER):
-	wget -N -P $(TOOLCHAIN_DIR)/dl $(GMP_URL)
-	tar -C $(TOOLCHAIN_DIR)/dl -xjf $(TOOLCHAIN_DIR)/dl/$(GMP_TAR)
-
-gmp: gmp-$(GMP_VER)
-	mkdir -p $(TOOLCHAIN_DIR)/build/gmp
-	cd $(TOOLCHAIN_DIR)/build/gmp; \
-	$(TOOLCHAIN_DIR)/dl/$</configure --disable-shared --enable-static --prefix=$(TOOLCHAIN_DIR)/inst; \
-	$(MAKE); $(MAKE) check;$(MAKE) install
-
-mpfr-$(MPFR_VER):
-	wget -N -P $(TOOLCHAIN_DIR)/dl $(MPFR_URL)
-	tar -C $(TOOLCHAIN_DIR)/dl -xjf $(TOOLCHAIN_DIR)/dl/$(MPFR_TAR)
-
-mpfr: mpfr-$(MPFR_VER)
-	mkdir -p $(TOOLCHAIN_DIR)/build/mpfr
-	cd $(TOOLCHAIN_DIR)/build/mpfr; \
-	$(TOOLCHAIN_DIR)/dl/$</configure --disable-shared --enable-static --with-gmp=$(TOOLCHAIN_DIR)/inst \
-	--prefix=$(TOOLCHAIN_DIR)/inst; \
-	$(MAKE); $(MAKE) check;$(MAKE) install
-
-mpc-$(MPC_VER):
-	wget -N -P $(TOOLCHAIN_DIR)/dl $(MPC_URL)
-	tar -C $(TOOLCHAIN_DIR)/dl -zxvf $(TOOLCHAIN_DIR)/dl/$(MPC_TAR)
-
-mpc: mpc-$(MPC_VER)
-	mkdir -p $(TOOLCHAIN_DIR)/build/mpfc
-	cd $(TOOLCHAIN_DIR)/build/mpfc; \
-	$(TOOLCHAIN_DIR)/dl/$</configure --disable-shared --enable-static --with-gmp=$(TOOLCHAIN_DIR)/inst \
-	--with-mpfr=$(TOOLCHAIN_DIR)/inst --prefix=$(TOOLCHAIN_DIR)/inst; \
-	$(MAKE); $(MAKE) check;$(MAKE) install
-
-binutils-$(BINUTILS_VER):
-	wget -N -P $(TOOLCHAIN_DIR)/dl $(BINUTILS_URL)
-	tar -C $(TOOLCHAIN_DIR)/dl -xjf $(TOOLCHAIN_DIR)/dl/$(BINUTILS_TAR)
-	patch -d $(TOOLCHAIN_DIR)/dl/$@ -p1 < local/patches/binutils.patch
-
-binutils: binutils-$(BINUTILS_VER)
-	mkdir -p $(TOOLCHAIN_DIR)/build/binutils
-	cd $(TOOLCHAIN_DIR)/build/binutils; \
-	$(TOOLCHAIN_DIR)/dl/$</configure --target=$(TARGET) --prefix=$(TOOLCHAIN_DIR)/inst; \
-	$(MAKE) all; $(MAKE) install
-
-gcc-$(GCC_VER):
-	wget -N -P $(TOOLCHAIN_DIR)/dl $(GCC_URL)
-	tar -C $(TOOLCHAIN_DIR)/dl -xjf $(TOOLCHAIN_DIR)/dl/$(GCC_TAR)
-	patch -d $(TOOLCHAIN_DIR)/dl/$@ -p1 < local/patches/gcc.patch
-
-gcc: gcc-$(GCC_VER)
-	mkdir -p $(TOOLCHAIN_DIR)/build/gcc
-	cd $(TOOLCHAIN_DIR)/build/gcc; \
-	export PATH=$(TOOLCHAIN_DIR)/inst/bin:$(PATH); \
-	$(TOOLCHAIN_DIR)/dl/$</configure --target=$(TARGET) --prefix=$(TOOLCHAIN_DIR)/inst \
-	--enable-languages=c --disable-libssp --disable-shared --disable-libquadmath \
-	--with-gmp=$(TOOLCHAIN_DIR)/inst \
-	--with-mpfr=$(TOOLCHAIN_DIR)/inst \
-	--with-mpc=$(TOOLCHAIN_DIR)/inst --with-newlib; \
-	$(MAKE) all; $(MAKE) install
-
-toolchain: gmp mpfr mpc binutils gcc
+# 1: package name
+# 2: configure arguments
+# 3: make command
+define Common/Compile
+	mkdir -p $(BUILD_DIR)/$($(1)_DIR)
+	+cd $(BUILD_DIR)/$($(1)_DIR) && \
+	$(DL_DIR)/$($(1)_DIR)/configure \
+		--prefix=$(TOOLCHAIN_DIR)/inst \
+		$(2) && \
+	$(3)
+endef
+
+define GMP/Compile
+	$(call Common/Compile,GMP, \
+		--disable-shared --enable-static, \
+		$(MAKE) && $(MAKE) check && $(MAKE) -j1 install \
+	)
+endef
+
+define MPFR/Compile
+	$(call Common/Compile,MPFR, \
+		--disable-shared --enable-static \
+		--with-gmp=$(TOOLCHAIN_DIR)/inst, \
+		$(MAKE) && $(MAKE) check && $(MAKE) -j1 install \
+	)
+endef
+
+define MPC/Compile
+	$(call Common/Compile,MPC, \
+		--disable-shared --enable-static \
+		--with-gmp=$(TOOLCHAIN_DIR)/inst \
+		--with-mpfr=$(TOOLCHAIN_DIR)/inst, \
+		$(MAKE) && $(MAKE) check && $(MAKE) -j1 install \
+	)
+endef
+
+define BINUTILS/Compile
+	$(call Common/Compile,BINUTILS, \
+		--target=$(TARGET), \
+		$(MAKE) && $(MAKE) -j1 install \
+	)
+endef
+
+define GCC/Compile
+	$(call Common/Compile,GCC, \
+		--target=$(TARGET) \
+		--enable-languages=c \
+		--disable-libssp \
+		--disable-shared \
+		--disable-libquadmath \
+		--with-gmp=$(TOOLCHAIN_DIR)/inst \
+		--with-mpfr=$(TOOLCHAIN_DIR)/inst \
+		--with-mpc=$(TOOLCHAIN_DIR)/inst \
+		--with-newlib, \
+		$(MAKE) && $(MAKE) -j1 install \
+	)
+endef
+
+# 1: package name
+# 2: dependencies on other packages
+define Build
+$(DL_DIR)/$($(1)_TAR):
+	mkdir -p $(DL_DIR)
+	wget -N -P $(DL_DIR) $($(1)_URL)
+
+$(DL_DIR)/$($(1)_DIR)/.prepared: $(DL_DIR)/$($(1)_TAR)
+	tar -C $(DL_DIR) -xjf $(DL_DIR)/$($(1)_TAR)
+	$(if $($(1)_PATCHES), \
+		cat $($(1)_PATCHES) | \
+		patch -p1 -d $(DL_DIR)/$($(1)_DIR))
+	touch $$@
+
+$(1)_DEPENDS = $(foreach pkg,$(2),$(BUILD_DIR)/$($(pkg)_DIR)/.built)
+$(BUILD_DIR)/$($(1)_DIR)/.built: $(DL_DIR)/$($(1)_DIR)/.prepared $$($(1)_DEPENDS)
+	mkdir -p $(BUILD_DIR)/$($(1)_DIR)
+	$($(1)/Compile)
+	touch $$@
+
+clean-dl-$(1):
+	rm -rf $(DL_DIR)/$($(1)_DIR)
+
+toolchain: $(BUILD_DIR)/$($(1)_DIR)/.built
+clean-dl: clean-dl-$(1)
+download: $(DL_DIR)/$($(1)_DIR)/.prepared
+
+endef
 
+all: toolchain
 clean:
 	rm -rf $(TOOLCHAIN_DIR)/build $(TOOLCHAIN_DIR)/inst
+clean-dl:
+download:
+toolchain:
+
+.PHONY: all clean clean-dl download toolchain
+
+$(eval $(call Build,GMP))
+$(eval $(call Build,MPFR,GMP))
+$(eval $(call Build,MPC,GMP MPFR))
+$(eval $(call Build,BINUTILS))
+$(eval $(call Build,GCC,MPC MPFR))
-- 
1.8.0.2




More information about the ath9k_htc_fw mailing list