# Copyright (C) 2004 Nokia # Author: lauri.leukkunen@nokia.com # Licenced under GPL, see top level COPYING file for details # # The crosstool (by Dan Kegel) has provided some of the ideas used here. GARNAME = toolchain_glibc GARVERSION = 1.0 CATEGORIES = base include versions BINUTILS = binutils_$(BINUTILS_VER).orig.tar.gz BINUTILS_DEBIAN = binutils_$(BINUTILS_VER)-$(BINUTILS_DEB_PATCH_VER).diff.gz GLIBC = glibc_$(GLIBC_VER).orig.tar.gz GLIBC_DEBIAN = glibc_$(GLIBC_VER)-$(GLIBC_DEB_PATCH_VER).diff.gz GCC = gcc-$(GCC_VER).orig.tar.gz GCC_DEBIAN = gcc-$(GCC_VER)-$(GCC_DEB_PATCH_VER).diff.gz GCC_SRCDIR = gcc-$(shell echo $(GCC_VER) | sed s/_/-/g)-patched NO_EXTRACT = $(BINUTILS_DEBIAN) $(BINUTILS) $(GLIBC_DEBIAN) $(GLIBC) $(GCC_DEBIAN) $(GCC) ARCH = arm SUB_ARCH = #LINUX_ARM_HEADERS=linux-kernel-headers_2.5.999-test7-bk-16_arm.deb #ifeq ($(ARCH),arm) #LINUX_HEADERS = $(LINUX_ARM_HEADERS) #else LINUX_HEADERS = $(LINUX_HEADER_VERSION)_$(ARCH).deb #endif DISTFILES = $(BINUTILS) $(BINUTILS_DEBIAN) $(GLIBC) $(GLIBC_DEBIAN) $(GCC) $(GCC_DEBIAN) $(LINUX_HEADERS) MASTER_SITES += scp://isource.nokia.com:/home/groups/scratchbox/sbox-files/ PREPATH=/scratchbox/tools/autotools/autoconf2.13/bin:/scratchbox/tools/autotools/automake-1.4/bin CCACHE_BIN = /scratchbox/ccache_bin export PATH=$(PREPATH):$(CCACHE_BIN):$(shell echo $$PATH) DEPENDS = DESCRIPTION = toolchain (binutils, glibc, gcc) DEBIAN_PACKAGES = gcc-3.3-base gcc gcc-3.3 g++ g++-3.3 cpp cpp-3.3 libgcc1 libc6 libc6-dev libstdc++5 libstdc++5-3.3-dev binutils define BLURB # FIXME: blurb goes here endef CONFIGURE_SCRIPTS = toolchain BUILD_SCRIPTS = toolchain INSTALL_SCRIPTS = toolchain ifeq ($(ARCH), arm) #USE_SOFTFLOAT=1 endif ifdef USE_SOFTFLOAT BINUTILS_SOFTFLOAT=--nfp GCC_SOFTFLOAT=--nfp --without-fp --with-softfloat-support=internal GLIBC_SOFTFLOAT=--with-fp=no endif # INCLUDE THIS HERE BEFORE OVERRIDING include ../category.mk export CFLAGS = -O2 ifdef COMPILERNAME COMPILER = $(COMPILERNAME) else COMPILER = $(SUB_ARCH)-gcc-$(gcc_version)-glibc-$(glibc_version) endif COMPILERDIR = /scratchbox/compilers/$(COMPILER) unexport DESTDIR = unexport prefix = $(COMPILERDIR) unexport exec_prefix = $(prefix) unexport bindir = $(exec_prefix)/bin unexport sbindir = $(exec_prefix)/sbin unexport libexecdir = $(exec_prefix)/libexec unexport datadir = $(prefix)/share unexport sysconfdir = $(prefix)/etc unexport sharedstatedir = $(prefix)/share unexport localstatedir = $(prefix)/var unexport libdir = $(exec_prefix)/lib unexport infodir = $(prefix)/share/info unexport lispdir = $(prefix)/share/emacs/site-lisp unexport includedir = $(prefix)/include unexport mandir = $(prefix)/share/man unexport docdir = $(prefix)/share/doc unexport sourcedir = $(prefix)/src TOOLCHAIN_ADD_PREFIX=sbox- TOOLCHAIN_PREFIX=$(SUB_ARCH)-linux- ifeq ($(ARCH),i386) SUB_ARCH = i686 GNU_TARGET_PREFIX = GLIBC_CONFIGURE_ARGS = else SUB_ARCH = $(ARCH) GNU_TARGET_PREFIX = $(SUB_ARCH)-linux- GLIBC_CONFIGURE_ARGS = --without-tls endif TARGET = $(SUB_ARCH)-linux ifneq ($(CPU), "") GCC_TARGET_DEFAULT_CPU=--with-cpu=$(CPU) endif GCC_TARGET_FLAGS = GCC_CONFIGURE_ARGS = GCC_WITH_HEADERS = --with-headers=$(COMPILERDIR)/usr/include ADD_FLAGS = GCC_BUILD_TARGET = CROSS_GCC=$(TOOLCHAIN_PREFIX)gcc HOSTCC=host-gcc GLIBC_PREFIX=$(COMPILERDIR)/$(TARGET) BUILD=i386-linux HOST=i386-linux extract-$(GLIBC_LINUXTHREADS): tar jxf $(DOWNLOADDIR)/$(GLIBC_LINUXTHREADS) -C $(EXTRACTDIR)/glibc-$(GLIBC_VER)/ $(MAKECOOKIE) pre-configure: # dpatch hack if [ ! -d /usr/share/dpatch ]; then \ mkdir -p /usr/share/; \ ln -sf /scratchbox/devkits/debian/share/dpatch /usr/share/dpatch; \ fi # put kernel headers into their right place mkdir -p $(COMPILERDIR)/usr/include #ifeq ($(ARCH), arm) ## tar zxf $(DOWNLOADDIR)/$(LINUX_ARM_HEADERS) -C $(COMPILERDIR)/ # patch -p0 -d $(COMPILERDIR)/usr/include < files/patch-2.4-kernel-headers.diff # cd $(COMPILERDIR)/usr/include/asm && \ # ln -fs proc-armv proc && \ # ln -fs arch-ebsa285 arch #else rm -f ./data.tar.gz ar x $(DOWNLOADDIR)/$(LINUX_HEADERS) data.tar.gz tar zxf ./data.tar.gz -C $(COMPILERDIR)/ rm -f ./data.tar.gz #endif # Do DEBIAN patches here ./undeb_binutils $(ARCH) ./undeb_gcc $(ARCH) ./undeb_glibc $(ARCH) patch -d work/glibc-$(GLIBC_VER)-patched -p0 < files/glibc-2.3.2-debian.patch # patch -d work/glibc-$(GLIBC_VER)-patched -p0 < files/glibc_001_a1_clobber.patch # patch -d work/glibc-$(GLIBC_VER)-patched -p1 < files/glibc_002_sscanf.patch # cd work/glibc-$(GLIBC_VER) && cat ../../files/glibc-2.3.2.patch | patch -p0 #ifeq ($(ARCH), arm) # cd work/gcc-$(GCC_VER) && cat ../../files/gcc-3.2.3-PR8896.patch | patch -p0 #endif $(MAKECOOKIE) # Here we prevent the non-functioning testsuite from screwing up the build for i386 configure-toolchain: cat work/$(GCC_SRCDIR)/libstdc++-v3/Makefile.in | sed '/^SUBDIRS/s/testsuite//' > work/$(GCC_SRCDIR)/libstdc++-v3/Makefile.in.new mv work/$(GCC_SRCDIR)/libstdc++-v3/Makefile.in.new work/$(GCC_SRCDIR)/libstdc++-v3/Makefile.in $(MAKECOOKIE) #ifneq ($(ARCH), i386) BUILD_FAKE_BINUTILS = build-fake-native-binutils #endif build-toolchain: $(BUILD_FAKE_BINUTILS) build-binutils build-gcc-pass-1 build-glibc build-gcc-pass-2 $(MAKECOOKIE) build-binutils: $(BUILD_FAKE_BINUTILS) configure-toolchain export CC="$(HOSTCC)" && \ cd work/binutils-$(BINUTILS_VER)-patched && \ ./configure --build=$(BUILD) --host=$(HOST) --target=$(TARGET) --prefix=$(COMPILERDIR) --program-prefix=$(TOOLCHAIN_PREFIX) $(BINUTILS_SOFTFLOAT) && \ $(MAKE) all && \ $(MAKE) install ifdef BUILD_FAKE_BINUTILS mv $(COMPILERDIR)/bin/$(TOOLCHAIN_PREFIX)ld $(COMPILERDIR)/bin/ld_orig && \ mv $(COMPILERDIR)/$(TARGET)/bin/ld $(COMPILERDIR)/$(TARGET)/bin/ld_orig cp -af /scratchbox/tools/bin/sb_ld_wrapper $(COMPILERDIR)/bin/$(TOOLCHAIN_PREFIX)ld cp -af /scratchbox/tools/bin/sb_ld_wrapper $(COMPILERDIR)/$(TARGET)/bin/ld endif $(MAKECOOKIE) build-fake-native-binutils: export CC="$(HOSTCC)" && \ mkdir -p work/fake-binutils && \ cd work/fake-binutils && \ cp -a ../binutils-$(BINUTILS_VER)-patched . && \ cd binutils-$(BINUTILS_VER)-patched && \ cat ../../../files/fake_native.patch | patch -p2 && \ ./configure --build=$(BUILD) --host=$(HOST) --target=$(TARGET) --prefix=$(COMPILERDIR) --program-prefix=$(TOOLCHAIN_PREFIX) $(BINUTILS_SOFTFLOAT) --with-sysroot=/ && \ $(MAKE) all && \ $(MAKE) install && \ mv $(COMPILERDIR)/bin/$(TOOLCHAIN_PREFIX)ld $(COMPILERDIR)/bin/ld_fake_native && \ mv $(COMPILERDIR)/$(TARGET)/bin/ld $(COMPILERDIR)/$(TARGET)/bin/ld_fake_native $(MAKECOOKIE) build-glibc-headers: build-binutils export CC="$(HOSTCC)" && \ export BUILD_CC="$(HOSTCC)" && export CPP="host-cpp" && export ac_preproc_ok=true && export PATH=$(COMPILERDIR)/bin:$$PATH && \ mkdir -p work/build-glibc-headers && \ cd work/build-glibc-headers && \ ../glibc-$(GLIBC_VER)-patched/configure --prefix=/usr --host=$(ARCH)-linux $(GCC_WITH_HEADERS) --disable-sanity-checks --without-cvs $(GLIBC_SOFTFLOAT) $(GLIBC_CONFIGURE_ARGS) && \ make sysdeps/gnu/errlist.c && \ mkdir -p stdio-common && \ touch stdio-common/errlist-compat.c && \ $(MAKE) cross-compiling=yes install-headers install_root=$(COMPILERDIR) && \ mkdir -p $(COMPILERDIR)/usr/include/gnu && \ touch $(COMPILERDIR)/usr/include/gnu/stubs.h && \ cp ../glibc-$(GLIBC_VER)-patched/include/features.h $(COMPILERDIR)/usr/include/features.h && \ cp bits/stdio_lim.h $(COMPILERDIR)/usr/include/bits/stdio_lim.h $(MAKECOOKIE) build-gcc-pass-1: build-glibc-headers export CC="$(HOSTCC)" && \ mkdir -p work/gcc_build_1 && \ cd work/gcc_build_1 && \ export PATH=$(COMPILERDIR)/bin:$$PATH && \ ../$(GCC_SRCDIR)/configure --target=$(TARGET) --host=$(HOST) --build=$(BUILD) --prefix=$(COMPILERDIR) --with-local-prefix=$(COMPILERDIR) --with-sysroot=$(COMPILERDIR) --with-headers=$(COMPILERDIR)/usr/include --enable-languages=c --disable-threads --disable-shared --enable-threads=no --disable-multilib --disable-nls --enable-__cxa_atexit --enable-symvers=gnu $(GCC_TARGET_DEFAULT_CPU) --program-prefix="$(TOOLCHAIN_PREFIX)" $(GCC_SOFTFLOAT) $(GCC_CONFIGURE_ARGS) && \ $(MAKE) $(GCC_BUILD_TARGET) all-gcc && \ $(MAKE) install-gcc $(MAKECOOKIE) build-glibc: build-gcc-pass-1 mkdir -p work/glibc_build && unset prefix ; unset DESTDIR ; \ cd work/glibc_build && \ export CC="$(CROSS_GCC)" && export BUILD_CC="$(HOSTCC)" && export CPP="$(SUB_ARCH)-linux-cpp" && export ac_preproc_ok=true && export PATH=$(COMPILERDIR)/bin:$$PATH && \ ../glibc-$(GLIBC_VER)-patched/configure --prefix=/usr --host=$(SUB_ARCH)-linux --build=$(BUILD) $(GCC_WITH_HEADERS) --enable-add-ons=linuxthreads $(GLIBC_SOFTFLOAT) $(GLIBC_CONFIGURE_ARGS) && \ $(MAKE) all && \ $(MAKE) install install_root=$(COMPILERDIR) mkdir -p $(COMPILERDIR)/$(TARGET)/lib cp -a $(COMPILERDIR)/usr/lib/* $(COMPILERDIR)/$(TARGET)/lib/ cp -a $(COMPILERDIR)/lib/* $(COMPILERDIR)/$(TARGET)/lib/ cp -a $(COMPILERDIR)/usr/include/* $(COMPILERDIR)/$(TARGET)/sys-include/ echo "GROUP ( libc.so.6 libc_nonshared.a )" > $(COMPILERDIR)/$(TARGET)/lib/libc.so echo "GROUP ( libc.so.6 libc_nonshared.a )" > $(COMPILERDIR)/usr/lib/libc.so echo "GROUP ( libpthread.so.0 libpthread_nonshared.a )" > $(COMPILERDIR)/usr/lib/libpthread.so echo "GROUP ( libpthread.so.0 libpthread_nonshared.a )" > $(COMPILERDIR)/$(TARGET)/lib/libpthread.so $(MAKECOOKIE) build-gcc-pass-2: build-glibc export CC="$(HOSTCC)" && \ mkdir -p work/gcc_build_2 && \ cd work/gcc_build_2 && \ export PATH=$(COMPILERDIR)/bin:$$PATH && \ ../$(GCC_SRCDIR)/configure --target=$(TARGET) --host=$(HOST) --build=$(BUILD) --prefix=$(COMPILERDIR) $(GCC_WITH_HEADERS) --enable-languages=c,c++ --program-transform-name='s/^$(GNU_TARGET_NAME)-/$(TOOLCHAIN_PREFIX)/' --program-prefix="$(TOOLCHAIN_PREFIX)" $(GCC_TARGET_DEFAULT_CPU) $(GCC_SOFTFLOAT) $(GCC_CONFIGURE_ARGS) && \ perl -i -p -e "s,ac_cv_prog_cc_cross=no,ac_cv_prog_cc_cross=yes,g;" ./config.cache && \ $(MAKE) $(GCC_BUILD_TARGET) && \ $(MAKE) install $(MAKECOOKIE) install-toolchain: cp -a files/gcc.specs $(COMPILERDIR)/gcc.specs cd $(COMPILERDIR)/bin && \ ln -sf $(TOOLCHAIN_PREFIX)gcc $(TOOLCHAIN_PREFIX)cc && \ ln -sf $(TOOLCHAIN_PREFIX)gcc $(TOOLCHAIN_PREFIX)gcc-$(shell echo $(gcc_version) | cut -d "." --fields=1,2) && \ ln -sf $(TOOLCHAIN_PREFIX)g++ $(TOOLCHAIN_PREFIX)g++-$(shell echo $(gcc_version) | cut -d "." --fields=1,2) && \ for f in $(TOOLCHAIN_PREFIX)*; do n=$$(echo sbox-$$f); ln -sf $$f $$n; done echo "$(COMPILER):$(COMPILERDIR):$(SUB_ARCH):linux:glibc:$(ARCH)" >> $(COMPILERDIR)/compiler-name sed "s/COMPILERDIR/$(subst /,\/,$(COMPILERDIR))/g" files/target_setup.sh.in | sed "s/TARGET/$(TARGET)/g" > $(COMPILERDIR)/target_setup.sh chmod +x $(COMPILERDIR)/target_setup.sh $(MAKECOOKIE) post-install: # remove dpatch hack if [ -L /usr/share/dpatch ]; then \ rm /usr/share/dpatch; \ fi $(MAKECOOKIE) clean-installation: rm -rf $(COMPILERDIR) superclean: clean-installation clean