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)