Add a target (CONFIG_MAKE_CONFIG) that creates an exportable toolchain. The toolchain...
authorFelix Fietkau <nbd@openwrt.org>
Sat, 14 Nov 2009 17:51:32 +0000 (17:51 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Sat, 14 Nov 2009 17:51:32 +0000 (17:51 +0000)
Signed-off-by: Luigi 'Comio' Mantellini <luigi.mantellini@idf-hit.com>
SVN-Revision: 18419

Config.in
target/Makefile
target/toolchain/Config.in [new file with mode: 0644]
target/toolchain/Makefile [new file with mode: 0644]
target/toolchain/files/README.TOOLCHAIN [new file with mode: 0644]
toolchain/gcc/Makefile
toolchain/gcc/files/wrapper.sh [new file with mode: 0755]

index ae1ba9f..3e8475c 100644 (file)
--- a/Config.in
+++ b/Config.in
@@ -329,6 +329,7 @@ source "toolchain/Config.in"
 
 source "target/imagebuilder/Config.in"
 source "target/sdk/Config.in"
+source "target/toolchain/Config.in"
 
 source "tmp/.config-package.in"
 
index 3d36d26..ff547f6 100644 (file)
@@ -6,9 +6,9 @@
 #
 curdir:=target
 
-$(curdir)/builddirs:=linux sdk imagebuilder
+$(curdir)/builddirs:=linux sdk imagebuilder toolchain
 $(curdir)/builddirs-default:=linux
-$(curdir)/builddirs-install:=linux $(if $(CONFIG_SDK),sdk) $(if $(CONFIG_IB),imagebuilder)
+$(curdir)/builddirs-install:=linux $(if $(CONFIG_SDK),sdk) $(if $(CONFIG_IB),imagebuilder) $(if $(CONFIG_MAKE_TOOLCHAIN),toolchain)
 
 $(curdir)/imagebuilder/prepare:=$(curdir)/linux/install
 
diff --git a/target/toolchain/Config.in b/target/toolchain/Config.in
new file mode 100644 (file)
index 0000000..18c3ab5
--- /dev/null
@@ -0,0 +1,6 @@
+config MAKE_TOOLCHAIN
+       bool "Build the OpenWrt based Toolchain"
+       depends !EXTERNAL_TOOLCHAIN
+       help
+         This is essentially the toolchain created by OpenWrt.
+
diff --git a/target/toolchain/Makefile b/target/toolchain/Makefile
new file mode 100644 (file)
index 0000000..e9b452e
--- /dev/null
@@ -0,0 +1,53 @@
+#
+# Copyright (C) 2008-2009 Industrie Dial Face S.p.A.
+#               Luigi 'Comio' Mantellini <luigi.mantellini@idf-hit.com>
+# Copyright (C) 2006-2008 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/kernel.mk
+include $(INCLUDE_DIR)/host.mk
+
+override MAKEFLAGS=
+
+PKG_OS:=$(shell uname -s)
+PKG_CPU:=$(shell uname -m)
+
+TOOLCHAIN_NAME:=OpenWrt-Toolchain-$(BOARD)-for-$(ARCH)-gcc-$(GCCV)_$(LIBC)-$(LIBCV)
+TOOLCHAIN_BUILD_DIR:=$(BUILD_DIR)/$(TOOLCHAIN_NAME)
+EXCLUDE_DIRS:=*/ccache \
+       */stamp \
+       */stampfiles \
+       */man \
+       */info
+
+all: compile
+
+$(BIN_DIR)/$(TOOLCHAIN_NAME).tar.bz2: clean
+       mkdir -p $(TOOLCHAIN_BUILD_DIR)
+       $(TAR) -cf - -C $(TOPDIR)/staging_dir/  \
+              $(foreach exclude,$(EXCLUDE_DIRS),--exclude="$(exclude)") \
+              toolchain-$(ARCH)_gcc-$(GCCV)_$(LIBC)-$(LIBCV) | \
+              $(TAR) -xf - -C $(TOOLCHAIN_BUILD_DIR)
+
+       $(CP)  $(TOPDIR)/LICENSE ./files/README.TOOLCHAIN \
+               $(TOOLCHAIN_BUILD_DIR)/
+
+       echo REVISION:="$(REVISION)" > $(TOOLCHAIN_BUILD_DIR)/version.mk
+       find $(TOOLCHAIN_BUILD_DIR) -name .git | $(XARGS) rm -rf
+       find $(TOOLCHAIN_BUILD_DIR) -name .svn | $(XARGS) rm -rf
+       find $(TOOLCHAIN_BUILD_DIR) -name CVS | $(XARGS) rm -rf
+       (cd $(BUILD_DIR); \
+               tar cfj $@ $(TOOLCHAIN_NAME); \
+       )
+
+download:
+prepare:
+compile: $(BIN_DIR)/$(TOOLCHAIN_NAME).tar.bz2
+install: compile
+
+clean:
+       rm -rf $(TOOLCHAIN_BUILD_DIR) $(BIN_DIR)/$(TOOLCHAIN_NAME).tar.bz2
diff --git a/target/toolchain/files/README.TOOLCHAIN b/target/toolchain/files/README.TOOLCHAIN
new file mode 100644 (file)
index 0000000..40bfccc
--- /dev/null
@@ -0,0 +1,2 @@
+This is the OpenWrt SDK. It contains just the toolchain created 
+by buildroot.
index ea103c4..955248e 100644 (file)
@@ -246,6 +246,8 @@ define Stage2/Install
        $(GCC_MAKE) -C $(HOST_BUILD_DIR2) install
        # Set up the symlinks to enable lying about target name.
        set -e; \
+       $(CP) ./files/wrapper.sh $(TOOLCHAIN_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-wrapper.sh
+       chmod +x $(TOOLCHAIN_DIR)/usr/bin/$(REAL_GNU_TARGET_NAME)-wrapper.sh
        (cd $(TOOLCHAIN_DIR)/usr; \
                ln -sf $(REAL_GNU_TARGET_NAME) $(GNU_TARGET_NAME); \
                cd bin; \
@@ -253,6 +255,10 @@ define Stage2/Install
                        ln -sf $$$${app} \
                        $(GNU_TARGET_NAME)$$$${app##$(REAL_GNU_TARGET_NAME)}; \
                done; \
+               for app in cc gcc g++ c++ cpp ld as ; do \
+                       [ -f $(REAL_GNU_TARGET_NAME)-$$$${app} ] && mv $(REAL_GNU_TARGET_NAME)-$$$${app} $(REAL_GNU_TARGET_NAME)-$$$${app}.bin ; \
+                       ln -sf $(REAL_GNU_TARGET_NAME)-wrapper.sh $(REAL_GNU_TARGET_NAME)-$$$${app} ; \
+               done; \
        );
        $(if $(CONFIG_EXTRA_TARGET_ARCH),$(call SetupExtraArch))
 endef
diff --git a/toolchain/gcc/files/wrapper.sh b/toolchain/gcc/files/wrapper.sh
new file mode 100755 (executable)
index 0000000..19e1863
--- /dev/null
@@ -0,0 +1,91 @@
+#!/bin/bash
+
+# 2009 (C) Copyright Industrie Dial Face S.p.A.
+#          Luigi 'Comio' Mantellini <luigi.mantellini@idf-hit.com>
+#
+# Based on original idea from WindRiver
+#
+# Toolchain wrapper script.
+#
+# This script allows us to use a small number of GCC / binutils cross-tools
+# (one toolchain per instruction set architecture) to implement a larger
+# number of processor- or board-specific tools.  The wrapper script is
+# configured at install time with information covering basic CFLAGS,
+# LD options and the toolchain triplet name.
+#
+
+PROGNAME=$0
+REALNAME=`readlink -f $0`
+
+REALNAME_BASE=`basename $REALNAME`
+REALNAME_DIR=`dirname $REALNAME`
+
+TARGET_FUNDAMENTAL_ASFLAGS=''
+TARGET_FUNDAMENTAL_CFLAGS=''
+TARGET_ROOTFS_CFLAGS=''
+TARGET_FUNDAMENTAL_LDFLAGS=''
+TARGET_TOOLCHAIN_TRIPLET=${REALNAME_BASE%-*}
+
+# Parse our tool name, splitting it at '-' characters.
+BINARY=${PROGNAME##*-}
+
+# Parse our tool name, splitting it at '-' characters.
+IFS=- read TOOLCHAIN_ARCH TOOLCHAIN_BUILDROOT TOOLCHAIN_OS TOOLCHAIN_PLATFORM PROGNAME << EOF
+$REALNAME_BASE
+EOF
+
+#
+# We add the directory this was executed from to the PATH
+# The toolchains (links) should be in this directory or in the users
+# PATH.
+#
+TOOLCHAIN_BIN_DIR="$REALNAME_DIR/"
+
+# Set the PATH so that our run-time location is first
+# (get_feature is run from the path, so this has to be set)
+export PATH="$TOOLCHAIN_BIN_DIR":$PATH
+export GCC_HONOUR_COPTS
+
+TOOLCHAIN_SYSROOT="$TOOLCHAIN_BIN_DIR/../.."
+if [ ! -d "$TOOLCHAIN_SYSROOT" ]; then
+  echo "Error: Unable to determine sysroot (looking for $TOOLCHAIN_SYSROOT)!" >&2
+  exit 1
+fi
+
+# -Wl,--dynamic-linker=$TOOLCHAIN_SYSROOT/lib/ld-uClibc.so.0 
+# --dynamic-linker=$TOOLCHAIN_SYSROOT/lib/ld-uClibc.so.0 
+
+case $TOOLCHAIN_PLATFORM in
+   gnu|glibc|eglibc)
+       GCC_SYSROOT_FLAGS="--sysroot=$TOOLCHAIN_SYSROOT -Wl,-rpath=$TOOLCHAIN_SYSROOT/lib:$TOOLCHAIN_SYSROOT/usr/lib"
+       LD_SYSROOT_FLAGS="-rpath=$TOOLCHAIN_SYSROOT/lib:$TOOLCHAIN_SYSROOT/usr/lib"
+       ;;
+   uclibc)
+       GCC_SYSROOT_FLAGS="--sysroot=$TOOLCHAIN_SYSROOT -Wl,-rpath=$TOOLCHAIN_SYSROOT/lib:$TOOLCHAIN_SYSROOT/usr/lib"
+       LD_SYSROOT_FLAGS="-rpath=$TOOLCHAIN_SYSROOT/lib:$TOOLCHAIN_SYSROOT/usr/lib"
+       ;;
+   *)
+       GCC_SYSROOT_FLAGS=""
+       LD_SYSROOT_FLAGS=""
+       ;;
+esac
+
+#
+# Run the cross-tool.
+#
+case $BINARY in
+       cc|gcc|g++|c++|cpp)
+               exec $TARGET_TOOLCHAIN_TRIPLET-$BINARY.bin $GCC_SYSROOT_FLAGS $TARGET_FUNDAMENTAL_CFLAGS $TARGET_ROOTFS_CFLAGS "$@"
+               ;;
+       ld)
+               exec $TARGET_TOOLCHAIN_TRIPLET-$BINARY.bin $LD_SYSROOT_FLAGS $TARGET_FUNDAMENTAL_LDFLAGS "$@"
+               ;;
+       as)
+               exec $TARGET_TOOLCHAIN_TRIPLET-$BINARY.bin $TARGET_FUNDAMENTAL_ASFLAGS "$@"
+               ;;
+       *)
+               exec $TARGET_TOOLCHAIN_TRIPLET-$BINARY.bin "$@"
+               ;;
+esac
+
+exit 0