###################
# Linux x86 -> OSX 10.4u Cross compiler

PREFIX		= /opt/mac
TARGETS		= i686-apple-darwin8 powerpc-apple-darwin8

SDK 		= MacOSX10.4u.sdk
SDKARCHIVE	= Archive.pax.gz
SDKEXTRACT	= $(GUNZIP) < $(SDKARCHIVE) | $(PAX) -r
SDKDIR		= $(PREFIX)/SDKs/$(SDK)
SDKCXXVER	= 4.0.0
SDKCXXLIB	= libstdc++.6.0.4.dylib

ODCCTAR		= odcctools-20090808.tar.bz2
ODCCEXTRACT	= $(TAR) xjf $(ODCCTAR)
ODCCDIR		= odcctools-20090808
ODCCSTATICLIBS	= # ssl crypto uuid m stdc++ z

GCCTAR		= gcc-5247.tar.gz
GCCEXTRACT	= $(TAR) xzf $(GCCTAR)
GCCDIR		= gcc-5247
GCCVER		= 4.0.1

PAX		= pax
TAR		= tar
GUNZIP		= gunzip
PERL		= perl

PATH		:= $(PATH):$(PREFIX)/bin

export INSTALL		= install -c
export INSTALL_PROGRAM	= $(INSTALL) -s
export INSTALL_SCRIPT	= $(INSTALL)
export INSTALL_DATA	= $(INSTALL) -m 644

.PHONY: install
install: install-sdk install-odcctools install-gcc

.PHONY: clean
clean: clean-odcctools clean-gcc

###################
# SDK

.PHONY: install-sdk
install-sdk: $(SDKDIR)

$(SDKDIR): $(SDKARCHIVE)
	$(SDKEXTRACT)
	touch Developer/SDKs/$(SDK)
	mkdir -p $(PREFIX)/SDKs
	mv Developer/SDKs/$(SDK) $(PREFIX)/SDKs
	rmdir -p Developer/SDKs

###################
# ODCCTOOLS

T_ODCC		= $(foreach i, $(TARGETS), $(i)-odcctools)
T_INSTALL_ODCC	= $(foreach i, $(TARGETS), install-$(i)-odcctools)
T_CLEAN_ODCC	= $(foreach i, $(TARGETS), clean-$(i)-odcctools)
T_ODCCDIR	= $(foreach i, $(TARGETS), $(ODCCDIR).$(i))
T_ODCCCONF	= $(foreach i, $(TARGETS), $(ODCCDIR).$(i)/config.done)

.PHONY: odcctools
odcctools: $(T_ODCC)

.PHONY: install-odcctools
install-odcctools: $(T_INSTALL_ODCC)

.PHONY: clean-odcctools
clean-odcctools: $(T_CLEAN_ODCC)

$(T_ODCCDIR): $(ODCCDIR).%: $(ODCCTAR)
	$(ODCCEXTRACT)
	for i in $(ODCCSTATICLIBS); do \
	    ln -sf `$(CXX) -print-file-name=lib$$i.a` $(ODCCDIR)/libstuff; \
	done
ifneq ($(findstring ssl,$(ODCCSTATICLIBS)),)
	$(PERL) -pi -e "s|^MYLIBS\s+=.*|$$& -lcrypto|" $(ODCCDIR)/ld64/Makefile.in
ifneq ($(findstring crypto,$(ODCCSTATICLIBS)),)
	$(PERL) -pi -e "s|^MYLIBS\s+=.*|$$& -ldl|" $(ODCCDIR)/ld64/Makefile.in
endif
endif
	touch $(ODCCDIR)
	mv $(ODCCDIR) $@

$(T_ODCCCONF): $(ODCCDIR).%/config.done: $(ODCCDIR).%
	cd $(ODCCDIR).$* && \
	./configure --prefix=$(PREFIX) --target=$* \
		--with-sysroot=$(SDKDIR)
	touch $@

$(T_ODCC): %-odcctools: $(ODCCDIR).%/config.done
	$(MAKE) -C $(ODCCDIR).$*

$(T_INSTALL_ODCC): install-%-odcctools: %-odcctools
	$(MAKE) -C $(ODCCDIR).$* install

$(T_CLEAN_ODCC): clean-%-odcctools:
	rm -rf $(ODCCDIR).$*

###################
# GCC

T_GCC		= $(foreach i, $(TARGETS), $(i)-gcc)
T_INSTALL_GCC	= $(foreach i, $(TARGETS), install-$(i)-gcc)
T_CLEAN_GCC	= $(foreach i, $(TARGETS), clean-$(i)-gcc)
T_BUILD_GCC	= $(foreach i, $(TARGETS), build-$(i)-gcc)
T_GCCDIR	= $(foreach i, $(TARGETS), $(GCCDIR).$(i))
T_GCCCONF	= $(foreach i, $(TARGETS), build-$(GCCDIR).$(i)/config.done)
T_GCCDRIVERS	= $(foreach i, $(TARGETS), build-$(GCCDIR).$(i)/driver-gcc build-$(GCCDIR).$(i)/driver-g++)

.PHONY: gcc
gcc: $(T_GCC)

.PHONY: install-gcc
install-gcc: $(T_INSTALL_GCC)

.PHONY: clean-gcc
clean-gcc: $(T_CLEAN_GCC)

$(T_GCCDIR): $(GCCDIR).%: $(GCCTAR)
	$(GCCEXTRACT)
	rm -rf $(GCCDIR)/libstdc++-v3
	$(PERL) -pi -e "s,SYSTEM_HEADER_DIR='\\\$$\\(CROSS_SYSTEM_HEADER_DIR\\)',SYSTEM_HEADER_DIR='$(SDKDIR)\\\$$\\(NATIVE_SYSTEM_HEADER_DIR\\)'," $(GCCDIR)/gcc/configure
	$(PERL) -pi -e "s,/usr/bin/libtool,$(PREFIX)/bin/$*-libtool," $(GCCDIR)/gcc/config/darwin.h
	$(PERL) -pi -e "s|-Wl,-install_name,..slibdir.|-Wl,-install_name,/usr/lib|" $(GCCDIR)/gcc/config/t-slibgcc-darwin
	$(PERL) -pi -e "s,\"lipo\",\"$*-lipo\"," $(GCCDIR)/gcc/config/darwin-driver.c
	touch $(GCCDIR)
	mv $(GCCDIR) $@

$(T_GCCCONF): build-$(GCCDIR).%/config.done: $(GCCDIR).%
	mkdir -p build-$(GCCDIR).$*
	cd build-$(GCCDIR).$* && \
 	../$(GCCDIR).$*/configure --target=$* \
		--prefix=/usr \
		--with-sysroot=$(SDKDIR) --disable-nls \
		--enable-languages=c,c++,objc,obj-c++ \
		--enable-version-specific-runtime-libs \
		--with-gxx-include-dir=\$${prefix}/include/c++/$(SDKCXXVER) \
		--with-as=$(PREFIX)/bin/$*-as \
		--with-ld=$(PREFIX)/bin/$*-ld \
		$(if $(findstring 86,$*), \
			--with-arch=pentium-m --with-tune=prescott)
	touch $@

$(T_BUILD_GCC): build-%-gcc: build-$(GCCDIR).%/config.done
	$(MAKE) -C build-$(GCCDIR).$*

$(T_GCCDRIVERS):
	GCCDIR=$(shell echo $@ | sed 's|build-||;s|/.*||'); \
	ODCCDIR=$(shell echo $@ | sed 's|build-$(GCCDIR)|$(ODCCDIR)|;s|/.*||'); \
	PDN=$(shell echo $@ | sed 's|.*\.[^-]*||;s|/.*-|-|')-$(GCCVER); \
	$(CC) $$GCCDIR/gcc/config/darwin-driver.c \
		-DPDN=\"$$PDN\" \
		-I $$GCCDIR/include \
		-I $$GCCDIR/gcc \
		-I $(PREFIX)/include \
		-L$$ODCCDIR/libmacho \
		-Lbuild-$$GCCDIR/libiberty \
		-liberty -lmacho -o $@ \
		$(CFLAGS) $(LDFLAGS)

$(T_GCC): %-gcc: build-%-gcc build-$(GCCDIR).%/driver-gcc build-$(GCCDIR).%/driver-g++

$(T_INSTALL_GCC): install-%-gcc: %-gcc
	$(MAKE) -C build-$(GCCDIR).$* install prefix=$(PREFIX)
	cd $(PREFIX)/lib/gcc/$*/$(GCCVER) && \
	    mv static/libgcc.a libgcc_static.a && \
	    mv kext/libgcc.a libcc_kext.a && \
	    rm -r static kext && \
	    ln -sf $(SDKDIR)/usr/lib/$(SDKCXXLIB) $(SDKCXXLIB) && \
	    ln -sf $(SDKDIR)/usr/lib/$(SDKCXXLIB) libstdc++.6.dylib && \
	    ln -sf $(SDKDIR)/usr/lib/$(SDKCXXLIB) libstdc++.dylib
	cd $(PREFIX)/bin && \
	    mv $*-g++ $*-g++-$(GCCVER) && \
	    rm $*-gcc $*-c++
	$(INSTALL_PROGRAM) build-$(GCCDIR).$*/driver-gcc $(PREFIX)/bin/$*-gcc
	$(INSTALL_PROGRAM) build-$(GCCDIR).$*/driver-g++ $(PREFIX)/bin/$*-g++

$(T_CLEAN_GCC): clean-%-gcc:
	rm -rf $(GCCDIR).$* build-$(GCCDIR).$*
