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) -x$(if $(findstring bzip2,$($(1)_TAR)),j,z)f $(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))