From: "Steven J. Hill" Date: Tue, 6 Feb 2007 18:19:38 +0000 (-0000) Subject: Support building using an external toolchain. Questions to the mailing list and all... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=02f71aab47835e7220e2b1039bcda4d0c5657db0;p=buildroot.git Support building using an external toolchain. Questions to the mailing list and all other comments to . --- diff --git a/Makefile b/Makefile index 7a0253b5bc..80e314c6a5 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,11 @@ ifeq ($(strip $(BR2_HAVE_DOT_CONFIG)),y) # along with the packages to build for the target. # ############################################################## +ifeq ($(BR2_TOOLCHAIN_BUILDROOT),y) TARGETS:=uclibc-configured binutils gcc uclibc-target-utils +else +TARGETS:=uclibc +endif include toolchain/Makefile.in include package/Makefile.in diff --git a/package/Makefile.in b/package/Makefile.in index 531f8de1fd..37b3b71fbd 100644 --- a/package/Makefile.in +++ b/package/Makefile.in @@ -19,7 +19,12 @@ TAR_OPTIONS=$(subst ",, $(BR2_TAR_OPTIONS)) -xf #") +ifeq ($(BR2_TOOLCHAIN_BUILDROOT),y) TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) +else +TARGET_CFLAGS=$(TARGET_OPTIMIZATION) $(TARGET_DEBUGGING) -I$(STAGING_DIR)/include -I$(TOOLCHAIN_EXTERNAL_PATH)/$(TOOLCHAIN_EXTERNAL_PREFIX)/include +TARGET_LDFLAGS=-L$(STAGING_DIR)/lib -L$(STAGING_DIR)/usr/lib +endif HOSTCC:=gcc HOSTCXX:=g++ @@ -44,13 +49,14 @@ endif #PATCH_DIR=$(BASE_DIR)/sources/patches BUILD_DIR:=$(BASE_DIR)/$(TOPDIR_PREFIX)build_$(ARCH)$(ARCH_FPU_SUFFIX)$(TOPDIR_SUFFIX) TARGET_DIR:=$(BUILD_DIR)/root -TOOL_BUILD_DIR=$(BASE_DIR)/$(TOPDIR_PREFIX)toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX)$(TOPDIR_SUFFIX) GNU_TARGET_SUFFIX:=-$(strip $(subst ",, $(BR2_GNU_TARGET_SUFFIX))) #")) STAGING_DIR:=$(strip $(subst ",, $(BR2_STAGING_DIR))) #")) +ifeq ($(BR2_TOOLCHAIN_BUILDROOT),y) +TOOL_BUILD_DIR=$(BASE_DIR)/$(TOPDIR_PREFIX)toolchain_build_$(ARCH)$(ARCH_FPU_SUFFIX)$(TOPDIR_SUFFIX) # Quotes are needed for spaces et al in path components. TARGET_PATH="$(STAGING_DIR)/bin:$(TOOL_BUILD_DIR)/bin:$(PATH)" @@ -59,6 +65,19 @@ REAL_GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)$(GNU_TARGET_SUFFIX) GNU_TARGET_NAME=$(OPTIMIZE_FOR_CPU)-linux KERNEL_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)$(GNU_TARGET_SUFFIX)- TARGET_CROSS=$(STAGING_DIR)/bin/$(OPTIMIZE_FOR_CPU)$(GNU_TARGET_SUFFIX)- +else +TOOLCHAIN_EXTERNAL_PREFIX:=$(strip $(subst ",, $(BR2_TOOLCHAIN_EXTERNAL_PREFIX))) +#")) +TOOLCHAIN_EXTERNAL_PATH:=$(strip $(subst ",, $(BR2_TOOLCHAIN_EXTERNAL_PATH))) +#")) +TOOL_BUILD_DIR=$(BASE_DIR)/$(TOPDIR_PREFIX)toolchain_build_$(TOOLCHAIN_EXTERNAL_PREFIX) +TARGET_PATH="$(STAGING_DIR)/bin:$(TOOL_BUILD_DIR)/bin:$(TOOLCHAIN_EXTERNAL_PATH)/bin:$(PATH)" +IMAGE:=$(BASE_DIR)/rootfs.$(TOOLCHAIN_EXTERNAL_PREFIX) +REAL_GNU_TARGET_NAME=$(TOOLCHAIN_EXTERNAL_PREFIX) +GNU_TARGET_NAME=$(TOOLCHAIN_EXTERNAL_PREFIX) +KERNEL_CROSS=$(TOOLCHAIN_EXTERNAL_PATH)/bin/$(TOOLCHAIN_EXTERNAL_PREFIX)- +TARGET_CROSS=$(TOOLCHAIN_EXTERNAL_PATH)/bin/$(TOOLCHAIN_EXTERNAL_PREFIX)- +endif TARGET_CC=$(TARGET_CROSS)gcc TARGET_CXX=$(TARGET_CROSS)g++ TARGET_RANLIB=$(TARGET_CROSS)ranlib diff --git a/target/Makefile.in b/target/Makefile.in index a65b740196..7ec139db98 100644 --- a/target/Makefile.in +++ b/target/Makefile.in @@ -7,4 +7,7 @@ include target/powerpc/Makefile.in # and finally build the filesystems/tarballs include target/*/*.mk # kernel rules +ifeq ($(BR2_PACKAGE_LINUX),y) +TARGETS+=linux26 +endif include target/linux*.mk diff --git a/target/device/Makefile.in b/target/device/Makefile.in index fd9f03f115..c2d04a97a9 100644 --- a/target/device/Makefile.in +++ b/target/device/Makefile.in @@ -1,6 +1,3 @@ TARGET_DEVICE_DEPMOD:=target/device/x86/depmod.pl -include target/device/*/Makefile.in -ifeq ($(BR2_PACKAGE_LINUX),y) -TARGETS+=linux26 -endif diff --git a/toolchain/Config.in b/toolchain/Config.in index 82a3621d05..9b464f2b4b 100644 --- a/toolchain/Config.in +++ b/toolchain/Config.in @@ -1,67 +1,20 @@ # -menu "Toolchain Options" - - -source "toolchain/kernel-headers/Config.in" -source "toolchain/uClibc/Config.in" -source "toolchain/binutils/Config.in" -source "toolchain/gcc/Config.in" -source "toolchain/ccache/Config.in" -source "toolchain/gdb/Config.in" -source "toolchain/elf2flt/Config.in" -source "toolchain/mklibs/Config.in" - -comment "Common Toolchain Options" - -source "toolchain/sstrip/Config.in" - -config BR2_ENABLE_MULTILIB - bool "Enable multilib support?" - default n - help - If you want multilib enabled, enable this... - -config BR2_LARGEFILE - bool "Enable large file (files > 2 GB) support?" - depends on !BR2_cris - default y - help - Enable large file (files > 2 GB) support - -config BR2_SOFT_FLOAT - bool "Use software floating point by default" - default n - depends on BR2_arm || BR2_armeb || BR2_mips || BR2_mipsel || BR2_powerpc - help - If your target CPU does not have a Floating Point Unit (FPU) or a - kernel FPU emulator, but you still wish to support floating point - functions, then everything will need to be compiled with soft - floating point support (-msoft-float). - - Most people will answer N. - -#config BR2_SOFT_FLOAT_FP -# bool "Use softfp" -# default n - -config BR2_TARGET_OPTIMIZATION - string "Target Optimizations" - default "-Os -pipe" - help - Optimizations to use when building for the target host. - -config BR2_CROSS_TOOLCHAIN_TARGET_UTILS - bool "Include target utils in cross toolchain" - default y +choice + prompt "Toolchain type" + default BR2_TOOLCHAIN_BUILDROOT help - When using buildroot to build a deployable cross toolchain, - it is handy to include certain target apps with that toolchain - as a convenience. - Examples include ldd, gdbserver, and strace. + Select whether to use the toolchain built by the buildroot + system or an external pre-built toolchain. - Answer Y if you want these apps (if built) copied into the - cross toolchain dir under -linux-uclibc/target_utils/. +config BR2_TOOLCHAIN_BUILDROOT + bool + prompt "Buildroot toolchain" -endmenu +config BR2_TOOLCHAIN_EXTERNAL + bool + prompt " External toolchain" +endchoice +source "toolchain/Config.in.2" +source "toolchain/external-toolchain/Config.in" diff --git a/toolchain/Config.in.2 b/toolchain/Config.in.2 new file mode 100644 index 0000000000..b9f1c32172 --- /dev/null +++ b/toolchain/Config.in.2 @@ -0,0 +1,66 @@ +# + +menu "Toolchain Options" + depends on BR2_TOOLCHAIN_BUILDROOT + +source "toolchain/kernel-headers/Config.in" +source "toolchain/uClibc/Config.in" +source "toolchain/binutils/Config.in" +source "toolchain/gcc/Config.in" +source "toolchain/ccache/Config.in" +source "toolchain/gdb/Config.in" +source "toolchain/elf2flt/Config.in" +source "toolchain/mklibs/Config.in" + +comment "Common Toolchain Options" + +source "toolchain/sstrip/Config.in" + +config BR2_ENABLE_MULTILIB + bool "Enable multilib support?" + default n + help + If you want multilib enabled, enable this... + +config BR2_LARGEFILE + bool "Enable large file (files > 2 GB) support?" + depends on !BR2_cris + default y + help + Enable large file (files > 2 GB) support + +config BR2_SOFT_FLOAT + bool "Use software floating point by default" + default n + depends on BR2_arm || BR2_armeb || BR2_mips || BR2_mipsel || BR2_powerpc + help + If your target CPU does not have a Floating Point Unit (FPU) or a + kernel FPU emulator, but you still wish to support floating point + functions, then everything will need to be compiled with soft + floating point support (-msoft-float). + + Most people will answer N. + +#config BR2_SOFT_FLOAT_FP +# bool "Use softfp" +# default n + +config BR2_TARGET_OPTIMIZATION + string "Target Optimizations" + default "-Os -pipe" + help + Optimizations to use when building for the target host. + +config BR2_CROSS_TOOLCHAIN_TARGET_UTILS + bool "Include target utils in cross toolchain" + default y + help + When using buildroot to build a deployable cross toolchain, + it is handy to include certain target apps with that toolchain + as a convenience. + Examples include ldd, gdbserver, and strace. + + Answer Y if you want these apps (if built) copied into the + cross toolchain dir under -linux-uclibc/target_utils/. + +endmenu diff --git a/toolchain/external-toolchain/Config.in b/toolchain/external-toolchain/Config.in new file mode 100644 index 0000000000..c004175cd5 --- /dev/null +++ b/toolchain/external-toolchain/Config.in @@ -0,0 +1,72 @@ +# + +menu "Toolchain Options" + depends on BR2_TOOLCHAIN_EXTERNAL + +config BR2_TOOLCHAIN_EXTERNAL_LIB_C + string "The core C library from the external toolchain" + default "libc.so.6" + help + Specify the core C shared library found in the external + toolchain. This is required in addition to any other + libraries to be copied. + +config BR2_TOOLCHAIN_EXTERNAL_LIBS + string "Libraries to copy from the external toolchain" + default "" + help + A space separated list of the shared libraries to be copied + from the external toolchain into the root filesystem. Only + the top-level name is needed, i.e. libc.so, libpthread.so as + the actual shared library symlinked to will be copied also. + +config BR2_TOOLCHAIN_EXTERNAL_STRIP + bool + default y + prompt "Strip shared libraries" + help + Strip shared libraries copied from the external toolchain. + +source "toolchain/gdb/Config.in.2" + +comment "Common Toolchain Options" + +config BR2_TOOLCHAIN_EXTERNAL_PATH + string "External toolchain path" + default "" + help + Path to where the external toolchain is installed. + +config BR2_TOOLCHAIN_EXTERNAL_PREFIX + string "External toolchain prefix" + default "" + help + This the the external toolchain prefix. For example: + armeb-unknown-linux-gnu, mipsel-unknown-linux-gnu, etc. + +config BR2_LARGEFILE + bool "Enable large file (files > 2 GB) support?" + depends on !BR2_cris + default y + help + Enable large file (files > 2 GB) support + +config BR2_SOFT_FLOAT + bool "Use software floating point by default" + default n + depends on BR2_arm || BR2_armeb || BR2_mips || BR2_mipsel || BR2_powerpc + help + If your target CPU does not have a Floating Point Unit (FPU) or a + kernel FPU emulator, but you still wish to support floating point + functions, then everything will need to be compiled with soft + floating point support (-msoft-float). + + Most people will answer N. + +config BR2_TARGET_OPTIMIZATION + string "Target Optimizations" + default "-Os -pipe" + help + Optimizations to use when building for the target host. + +endmenu diff --git a/toolchain/external-toolchain/ext-tool.mk b/toolchain/external-toolchain/ext-tool.mk new file mode 100644 index 0000000000..ab4cbef6c0 --- /dev/null +++ b/toolchain/external-toolchain/ext-tool.mk @@ -0,0 +1,56 @@ +# +# copy_toolchain_lib_root +# +# $1: source +# $2: destination +# $2: strip (y|n) default is to strip +# +copy_toolchain_lib_root = \ + LIB="$(strip $1)"; \ + DST="$(strip $2)"; \ + STRIP="$(strip $3)"; \ + \ + LIB_DIR=`$(TARGET_CC) -print-file-name=$${LIB} | sed -e "s,/$${LIB}\$$,,"`; \ + \ + if test -z "$${LIB_DIR}"; then \ + echo "copy_toolchain_lib_root: lib=$${LIB} not found"; \ + exit -1; \ + fi; \ + \ + LIB="$(strip $1)"; \ + for FILE in `find $${LIB_DIR} -type l -name "$${LIB}*" -maxdepth 1`; do \ + LIB=`basename $${FILE}`; \ + while test \! -z "$${LIB}"; do \ + echo "copy_toolchain_lib_root lib=$${LIB} dst=$${DST}"; \ + rm -fr $(TARGET_DIR)$${DST}/$${LIB}; \ + mkdir -p $(TARGET_DIR)$${DST}; \ + if test -h $${LIB_DIR}/$${LIB}; then \ + cp -d $${LIB_DIR}/$${LIB} $(TARGET_DIR)$${DST}/; \ + elif test -f $${LIB_DIR}/$${LIB}; then \ + cp $${LIB_DIR}/$${LIB} $(TARGET_DIR)$${DST}/$${LIB}; \ + case "$${STRIP}" in \ + (0 | n | no) \ + ;; \ + (*) \ + $(TARGET_CROSS)strip "$(TARGET_DIR)$${DST}/$${LIB}"; \ + ;; \ + esac; \ + else \ + exit -1; \ + fi; \ + LIB="`readlink $${LIB_DIR}/$${LIB}`"; \ + done; \ + done; \ + \ + echo -n + +uclibc: dependencies $(TARGET_DIR)/lib/$(strip $(subst ",, $(BR2_TOOLCHAIN_EXTERNAL_LIB_C))) + +$(TARGET_DIR)/lib/$(strip $(subst ",, $(BR2_TOOLCHAIN_EXTERNAL_LIB_C))): +#")) + mkdir -p $(TARGET_DIR)/lib + @$(call copy_toolchain_lib_root, $(strip $(subst ",, $(BR2_TOOLCHAIN_EXTERNAL_LIB_C))), /lib, $(BR2_TOOLCHAIN_EXTERNAL_STRIP)) +#"))) + for libs in $(strip $(subst ",, $(BR2_TOOLCHAIN_EXTERNAL_LIBS))) ; do \ + $(call copy_toolchain_lib_root, $$libs, /lib, $(BR2_TOOLCHAIN_EXTERNAL_STRIP)) ; \ + done diff --git a/toolchain/gdb/Config.in.2 b/toolchain/gdb/Config.in.2 new file mode 100644 index 0000000000..695c5d5ea4 --- /dev/null +++ b/toolchain/gdb/Config.in.2 @@ -0,0 +1,55 @@ +# Keep this in sync with Config.in + +comment "Gdb Options" + +config BR2_PACKAGE_GDB + bool "Build gdb debugger for the Target" + default n + select BR2_PACKAGE_NCURSES + help + Build the full gdb debugger to run on the target. + +config BR2_PACKAGE_GDB_SERVER + bool "Build gdb server for the Target" + default n + help + Build the gdbserver stub to run on the target. + A full gdb is needed to debug the progam. + +config BR2_PACKAGE_GDB_HOST + bool "Build gdb for the Host" + default n + help + Build gdb to run on the host to debug programs run on the target. + +choice + prompt "GDB debugger Version" + default BR2_GDB_VERSION_6_3 + depends on BR2_PACKAGE_GDB || BR2_PACKAGE_GDB_SERVER || BR2_PACKAGE_GDB_HOST + help + Select the version of gdb you wish to use. + + config BR2_EXT_GDB_VERSION_6_2_1 + bool "gdb 6.2.1" + + config BR2_EXT_GDB_VERSION_6_3 + bool "gdb 6.3" + + config BR2_EXT_GDB_VERSION_6_4 + bool "gdb 6.4" + + config BR2_EXT_GDB_VERSION_6_5 + bool "gdb 6.5" + + config BR2_EXT_GDB_VERSION_SNAPSHOT + bool "gdb snapshot" + +endchoice + +config BR2_EXT_GDB_VERSION + string + default "6.2.1" if BR2_EXT_GDB_VERSION_6_2_1 + default "6.3" if BR2_EXT_GDB_VERSION_6_3 + default "6.4" if BR2_EXT_GDB_VERSION_6_4 + default "6.5" if BR2_EXT_GDB_VERSION_6_5 + default "snapshot" if BR2_EXT_GDB_VERSION_SNAPSHOT diff --git a/toolchain/uClibc/uclibc.mk b/toolchain/uClibc/uclibc.mk index d2bd62c63b..57b0d9a521 100644 --- a/toolchain/uClibc/uclibc.mk +++ b/toolchain/uClibc/uclibc.mk @@ -4,6 +4,7 @@ # ############################################################# +ifeq ($(BR2_TOOLCHAIN_BUILDROOT),y) ifeq ($(BR2_UCLIBC_VERSION_SNAPSHOT),y) # Be aware that this changes daily.... @@ -339,3 +340,4 @@ uclibc_target-clean: uclibc_target-dirclean: rm -rf $(TARGET_DIR)/usr/include +endif