All pastes #1405827 Raw Edit

Stuff

public text v1 · immutable
#1405827 ·published 2009-04-28 06:50 UTC
rendered paste body
#!/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)