################### # 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).$*