ARCH=arm BUILD=i686-linux TARGET=$(ARCH)-linux-gnu SYSROOT=/usr/$(TARGET) ESC_SYSROOT=$(shell echo -n $(SYSROOT) | sed 's/\//\\\//g') VER_BINUTILS=2.20.1 VER_LINUX=2.6.36 VER_GLIBC=2.11.2 VER_GLIBC_PORTS=2.11 VER_GCC=4.4.5 PATH := $(SYSROOT)/usr/bin:$(PATH) STAMP=stamp BINUTILS=binutils-$(VER_BINUTILS) KERNEL=linux-$(VER_LINUX) GLIBC=glibc-$(VER_GLIBC) GLIBC_PORTS=glibc-ports-$(VER_GLIBC_PORTS) GCC=gcc-$(VER_GCC) STAGES += $(STAMP)/binutils-configure STAGES += $(STAMP)/binutils-build STAGES += $(STAMP)/binutils-install STAGES += $(STAMP)/kernel-headers-install STAGES += $(STAMP)/glibc-headers STAGES += $(STAMP)/gcc-stage1-configure STAGES += $(STAMP)/gcc-stage1-build STAGES += $(STAMP)/gcc-stage1-install STAGES += $(STAMP)/glibc-configure STAGES += $(STAMP)/glibc-build STAGES += $(STAMP)/glibc-install STAGES += $(STAMP)/gcc-configure STAGES += $(STAMP)/gcc-build STAGES += $(STAMP)/gcc-install all: mkdir -p $(SYSROOT) build sources stamp for S in $(STAGES); do $(MAKE) $$S || break; done $(STAMP)/binutils-configure: sources/$(BINUTILS) mkdir -p build/$(BINUTILS) cd build/$(BINUTILS) && ../../sources/$(BINUTILS)/configure \ --build=$(BUILD) \ --target=$(TARGET) \ --with-sysroot=$(SYSROOT) \ --prefix=/usr \ --disable-werror \ --disable-nls touch $@ $(STAMP)/binutils-build: $(MAKE) -C build/$(BINUTILS) touch $@ $(STAMP)/binutils-install: $(MAKE) -C build/$(BINUTILS) install DESTDIR=$(SYSROOT) rm -Rf $(SYSROOT)/usr/info rm -Rf $(SYSROOT)/usr/lib rm -Rf $(SYSROOT)/usr/man rm -Rf $(SYSROOT)/usr/share touch $@ $(STAMP)/kernel-headers-install: sources/$(KERNEL) $(MAKE) -C sources/$(KERNEL) headers_install ARCH=$(ARCH) INSTALL_HDR_PATH=$(SYSROOT)/usr touch $@ #this generates lots of errors, but they can be ignored since we just want the headers $(STAMP)/glibc-headers: sources/$(GLIBC) mkdir -p build/$(GLIBC)-headers cd build/$(GLIBC)-headers && ../../sources/$(GLIBC)/configure \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes \ --build=$(BUILD) \ --host=$(TARGET) \ --prefix= \ --includedir=/usr/include \ --with-headers=$(SYSROOT)/usr/include \ --disable-sanity-checks -$(MAKE) -C build/$(GLIBC)-headers -k install-headers install_root=$(SYSROOT) touch $@ $(STAMP)/gcc-stage1-configure: sources/$(GCC) mkdir -p build/$(GCC)-stage1 cd build/$(GCC)-stage1 && ../../sources/$(GCC)/configure \ --build=$(BUILD) \ --target=$(TARGET) \ --with-sysroot=$(SYSROOT) \ --with-build-sysroot=$(SYSROOT) \ --prefix=/usr \ --enable-languages=c \ --disable-multilib \ --with-newlib \ --disable-nls \ --enable-threads=no \ --disable-shared \ --disable-checking \ --disable-werror \ --disable-libmudflap \ --disable-libssp \ --disable-libgomp touch $@ $(STAMP)/gcc-stage1-build: $(MAKE) -C build/$(GCC)-stage1 $(MAKE) -C build/$(GCC)-stage1/$(TARGET)/libgcc libgcc_eh.a touch $@ $(STAMP)/gcc-stage1-install: $(MAKE) -C build/$(GCC)-stage1 install DESTDIR=$(PWD)/gcc-stage1-install-temp rm -Rf $(PWD)/gcc-stage1-install-temp/usr/info rm -Rf $(PWD)/gcc-stage1-install-temp/usr/include rm -Rf $(PWD)/gcc-stage1-install-temp/usr/lib/libiberty.a rm -Rf $(PWD)/gcc-stage1-install-temp/usr/man rm -Rf $(PWD)/gcc-stage1-install-temp/usr/share cp -a $(PWD)/gcc-stage1-install-temp/* $(SYSROOT)/ rm -Rf $(PWD)/gcc-stage1-install-temp cp build/$(GCC)-stage1/$(TARGET)/libgcc/libgcc_eh.a $(SYSROOT)/usr/lib/gcc/$(TARGET)/$(VER_GCC) touch $@ $(STAMP)/glibc-configure: mkdir -p build/$(GLIBC) cd build/$(GLIBC) && ../../sources/$(GLIBC)/configure \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes \ --build=$(BUILD) \ --host=$(TARGET) \ --prefix= \ --includedir=/usr/include \ --with-headers=$(SYSROOT)/usr/include touch $@ $(STAMP)/glibc-build: $(MAKE) -C build/$(GLIBC) touch $@ $(STAMP)/glibc-install: $(MAKE) -C build/$(GLIBC) install install_root=$(SYSROOT) $(MAKE) -C build/$(GLIBC) install-headers install_root=$(SYSROOT) $(MAKE) -C build/$(GLIBC) install-others install_root=$(SYSROOT) touch $@ $(STAMP)/gcc-configure: mkdir -p build/$(GCC) cd build/$(GCC) && ../../sources/$(GCC)/configure \ --build=$(BUILD) \ --target=$(TARGET) \ --with-sysroot=$(SYSROOT) \ --with-build-sysroot=$(SYSROOT) \ --prefix=/usr \ --enable-languages=c,c++ \ --enable-shared $(MAKE) -C build/$(GCC) configure-host $(MAKE) -C build/$(GCC) configure-target #patches to fix GCCs crappy inability to pass --sysroot to the libraries sed -i 's/^CC="\(.*\)"$$/CC="\1 --sysroot=$(ESC_SYSROOT)"/' build/$(GCC)/$(TARGET)/libmudflap/libtool sed -i 's/^CC="\(.*\)"$$/CC="\1 --sysroot=$(ESC_SYSROOT)"/' build/$(GCC)/$(TARGET)/libssp/libtool sed -i 's/^CC="\(.*\)"$$/CC="\1 --sysroot=$(ESC_SYSROOT)"/' build/$(GCC)/$(TARGET)/libgomp/libtool sed -i 's/^CC="\(.*\)"$$/CC="\1 --sysroot=$(ESC_SYSROOT)"/' build/$(GCC)/$(TARGET)/libstdc++-v3/libtool touch $@ $(STAMP)/gcc-build: if [ ! -s $(SYSROOT)/sys-include ]; then \ ln -s usr/include $(SYSROOT)/sys-include; \ fi $(MAKE) -C build/$(GCC) touch $@ $(STAMP)/gcc-install: $(MAKE) -C build/$(GCC) install DESTDIR=$(SYSROOT) touch $@ #glibc needs glibc-ports for the arm target (and possibly others) sources/$(GLIBC): mkdir -p $@ && tar -C sources -xjf downloads/$(GLIBC).* || rm -Rf sources/$(GLIBC) tar -C sources/$(GLIBC) -xjf downloads/$(GLIBC_PORTS).* || rm -Rf sources/$(GLIBC) sources/%: mkdir -p $@ && tar -C sources -xjf $(shell echo downloads/`basename downloads/$@`.*)