#!/usr/bin/env make all:: # default target ######################################## # Configurable variables ######################################## MINGW_LIBDIR ?= lib64 TARGET_ARCH ?= x86_64-pc-mingw32 GCC_CONFIG_EXTRA_ARGS ?= --disable-multilib --enable-fully-dynamic-string GCC_BRANCH ?= trunk # "tags/gcc_4_4_0_release" or "branches/gcc-4_4-branch" GCC_REVISION ?= head # revision id "146782" or date "2009-04-25" GMP_VERSION ?= 4.3.0 MPFR_VERSION ?= 2.4.1 MINGW_REVISION ?= HEAD SRC_ARCHIVE ?= mingw-w64-src.tar.bz2 BIN_ARCHIVE ?= mingw-w64-bin_$(shell uname -s).tar.bz2 ######################################## # Pull binutils ######################################## binutils-pull: \ src/binutils/.binutils.pull.marker src/binutils/.binutils.pull.marker: \ src/binutils/.mkdir.marker ### XXX Mook: todo: specify revision cd $(dir $@) && \ cvs -d ":pserver:anoncvs@sourceware.org:/cvs/src" -z3 \ checkout -d . -N binutils touch $@ ######################################## # Pull GCC ######################################## ## find a gcc revision (r???) and a stamp for the file name $(GCC_REV_STAMP) ifneq (,$(findstring -,$(GCC_REVISION))) # GCC_REVISION is a date GCC_REV_STAMP := d$(subst -,,$(GCC_REVISION)) GCC_REVISION := $(shell TZ=Z svn log --non-interactive --no-auth-cache \ -r "{$(subst -,,$(GCC_REVISION))T0000Z}:{$(subst -,,$(GCC_REVISION))T0030Z}" \ svn://gcc.gnu.org/svn/gcc/trunk | \ grep gccadmin | \ grep $(GCC_REVISION) | \ cut -d ' ' -f 1) GCC_REVISION := $(subst r,,$(GCC_REVISION)) else ifeq (_,$(if $(GCC_REVISION),,false)_$(strip \ $(subst 0,, $(subst 1,, $(subst 2,, \ $(subst 3,, $(subst 4,, $(subst 5,, \ $(subst 6,, $(subst 7,, $(subst 8,, \ $(subst 9,, $(subst 0,, $(GCC_REVISION) ))))))))))))) # GCC_REVISION is a number GCC_REVISION := $(GCC_REVISION) GCC_REV_STAMP := r$(GCC_REVISION) else # GCC_REVISION is some opaque string (e.g. "head") GCC_REV_STAMP := r$(GCC_REVISION) endif # GCC revision gcc-pull: \ src/gcc/gcc/.gcc.pull.marker src/gcc/gcc/.gcc.pull.marker: \ src/gcc/gcc/.mkdir.marker cd $(dir $@) && \ svn co --non-interactive --no-auth-cache --revision $(GCC_REVISION) \ svn://gcc.gnu.org/svn/gcc/$(strip $(GCC_BRANCH))/ . touch $@ ######################################## # Download gmp ######################################## gmp-download: \ src/gmp.tar.bz2 src/gmp.tar.bz2: \ src/.mkdir.marker wget -O $@ ftp://ftp.gnu.org/gnu/gmp/gmp-$(GMP_VERSION).tar.bz2 ######################################## # Extract gmp ######################################## gmp-extract: \ src/gcc/.gmp.extract.marker src/gcc/.gmp.extract.marker: \ src/gmp.tar.bz2 tar -C $(dir $@) -xjvf $< mv $(dir $@)/gmp-$(GMP_VERSION) $(dir $@)/gcc/gmp touch $@ ######################################## # Execute autoconf for gmp ######################################## gmp-autoconf: \ src/gcc/gcc/gmp/configure src/gcc/gcc/gmp/configure: \ src/gcc/.gmp.extract.marker cd $(dir $@) && \ autoconf ######################################## # Download mpfr ######################################## mpfr-download: \ src/mpfr.tar.bz2 src/mpfr.tar.bz2: \ src/.mkdir.marker wget -O $@ http://www.mpfr.org/mpfr-current/mpfr-$(MPFR_VERSION).tar.bz2 ######################################## # Extract mpfr ######################################## mpfr-extract: \ src/gcc/.mpfr.extract.marker src/gcc/.mpfr.extract.marker: \ src/mpfr.tar.bz2 tar -C $(dir $@) -xjvf $< mv $(dir $@)/mpfr-$(MPFR_VERSION) $(dir $@)/gcc/mpfr touch $@ ######################################## # Pull mingw ######################################## mingw-pull: \ src/mingw/.mingw.pull.marker src/mingw/.mingw.pull.marker: \ src/mingw/.mkdir.marker svn checkout --non-interactive --no-auth-cache --revision $(MINGW_REVISION) \ https://mingw-w64.svn.sourceforge.net/svnroot/mingw-w64/trunk $(dir $@) touch $@ ## XXX Mook: stamp the source with the revision used ######################################## # Create source tarball ######################################## src-archive: $(SRC_ARCHIVE) ifeq (,$(wildcard $(SRC_ARCHIVE))) $(SRC_ARCHIVE): \ src/binutils/.binutils.pull.marker \ src/gcc/gcc/.gcc.pull.marker \ src/gcc/gcc/gmp/configure \ src/gcc/.mpfr.extract.marker \ src/mingw/.mingw.pull.marker endif $(SRC_ARCHIVE): tar cjf $@ --owner 0 --group 0 --checkpoint --exclude=.svn --exclude=.*.marker \ --exclude=gmp.tar.bz2 --exclude=mpfr.tar.bz2 -C src . ######################################## # Extract source tarball ######################################## src-extract: \ build/.extract-marker build/.extract.marker:: \ $(SRC_ARCHIVE) -mkdir -p $(dir $@) tar -C $(dir $@) -xvjpf $< touch $@ build/.root.init.marker: \ build/root/.mkdir.marker \ build/.extract.marker ifneq (,$(filter MINGW%,$(shell uname -s))) test -e build/root/mingw || \ junction build/root/mingw "build/root/${TARGET_ARCH}" else test -h build/root/mingw || \ ln -s "${TARGET_ARCH}" build/root/mingw endif touch $@ ######################################## # Configure binutils ######################################## binutils-configure: \ build/binutils/obj/.config.marker build/binutils/obj/.config.marker: \ build/binutils/obj/.mkdir.marker \ build/.root.init.marker cd $(dir $@) && \ ../src/configure --target=$(TARGET_ARCH) \ --prefix=$(CURDIR)/build/root \ --with-sysroot=$(CURDIR)/build/root touch $@ ######################################## # Compile binutils ######################################## binutils-compile: \ build/binutils/obj/.compile.marker build/binutils/obj/.compile.marker: \ build/binutils/obj/.config.marker make -C $(dir $@) touch $@ ######################################## # Install binutils ######################################## binutils-install: \ build/binutils/obj/.install.marker build/binutils/obj/.install.marker: \ build/binutils/obj/.compile.marker make -C $(dir $@) install touch $@ ######################################## # Configure GCC ######################################## gcc-configure: \ build/gcc/obj/.config.marker build/gcc/obj/.config.marker: \ build/gcc/obj/.mkdir.marker \ build/binutils/obj/.install.marker \ build/.root.init.marker cd $(dir $@) && \ ../gcc/configure --target=$(TARGET_ARCH) \ --prefix=$(CURDIR)/build/root \ --with-sysroot=$(CURDIR)/build/root \ --enable-languages=all,obj-c++ \ $(GCC_CONFIG_EXTRA_ARGS) touch $@ ######################################## # Compile GCC stage 1 ######################################## gcc-bootstrap-compile: \ build/gcc/obj/.bootstrap.compile.marker build/gcc/obj/.bootstrap.compile.marker: \ build/gcc/obj/.config.marker \ build/root/mingw/.headers.install.marker found_asm=yes make -C $(dir $@) all-gcc touch $@ ######################################## # Install GCC stage 1 ######################################## gcc-bootstrap-install: \ build/gcc/obj/.bootstrap.install.marker build/gcc/obj/.bootstrap.install.marker: \ build/gcc/obj/.bootstrap.compile.marker make -C $(dir $@) install-gcc touch $@ ######################################## # Install mingw-w64 headers ######################################## headers-install: \ build/root/$(TARGET_ARCH)/include/.mkdir.marker build/root/mingw/.headers.install.marker: \ build/root/$(TARGET_ARCH)/include/.mkdir.marker tar cf - --exclude=.svn -C build/mingw/mingw-w64-headers/include . | \ tar xpvf - -C build/root/$(TARGET_ARCH)/include touch $@ ######################################## # Configure mingw-w64 CRT ######################################## crt-configure: \ build/mingw/obj/.config.marker build/mingw/obj/.config.marker: \ build/gcc/obj/.bootstrap.install.marker \ build/mingw/obj/.mkdir.marker cd $(dir $@) && \ PATH=$(realpath build/root/bin):$$PATH \ ../mingw-w64-crt/configure --host=$(TARGET_ARCH) \ --prefix=$(CURDIR)/build/root \ --with-sysroot=$(CURDIR)/build/root touch $@ ######################################## # Compile mingw-w64 CRT ######################################## crt-compile: \ build/mingw/obj/.compile.marker build/mingw/obj/.compile.marker: \ build/mingw/obj/.config.marker PATH=$(realpath build/root/bin):$$PATH \ make -C $(dir $@) touch $@ ######################################## # Install mingw-w64 CRT ######################################## crt-install: \ build/mingw/obj/.install.marker build/mingw/obj/.install.marker: \ build/mingw/obj/.compile.marker PATH=$(realpath build/root/bin):$$PATH \ make -C $(dir $@) install touch $@ ######################################## # Compile full GCC ######################################## gcc-compile: \ build/gcc/obj/.compile.marker \ build/mingw/obj/.install.marker build/gcc/obj/.compile.marker: \ build/mingw/obj/.install.marker PATH=$(realpath build/root/bin):$$PATH \ make -C $(dir $@) touch $@ ######################################## # Install full GCC ######################################## gcc-install: \ build/gcc/obj/.install.marker build/gcc/obj/.install.marker: \ build/gcc/obj/.compile.marker PATH=$(realpath build/root/bin):$$PATH \ make -C $(dir $@) install touch $@ ######################################## # Create release tarball ######################################## release-archive: \ $(BIN_ARCHIVE) $(BIN_ARCHIVE): \ build/gcc/obj/.install.marker tar cjf $(BIN_ARCHIVE) -C build/root\ --owner 0 --group 0 --checkpoint --exclude=.svn --exclude=.*.marker . ######################################## # Helper targets ######################################## %/.mkdir.marker: -mkdir -p $(dir $@) @touch -d 1970-01-01 $@ all:: \ $(BIN_ARCHIVE) .PHONY: \ all \ binutils-pull \ gcc-pull \ gmp-download \ gmp-extract \ gmp-autoconf \ mpfr-download \ mpfr-extract \ mingw-pull \ src-archive \ src-extract \ binutils-configure \ binutils-compile \ binutils-install \ gcc-configure \ gcc-bootstrap-compile \ gcc-bootstrap-install \ headers-install \ crt-configure \ crt-compile \ crt-install \ gcc-compile \ gcc-install \ release-archive \ $(NULL)