From 00eddf0ee63e976e1ecc07ad00e72a02a81ae501 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Thu, 16 Jul 2009 19:37:47 +0200 Subject: external toolchain: fix libraries copy and add ARM ABI check Instead of hardcoding the C library versions, just copy the version available in $SYSROOT_DIR/lib. Add a check on the ARM ABI configured in Buildroot with regard to the ABI of the external toolchain provided. Signed-off-by: Thomas Petazzoni --- toolchain/external-toolchain/ext-tool.mk | 57 +++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/toolchain/external-toolchain/ext-tool.mk b/toolchain/external-toolchain/ext-tool.mk index b904775f4..72bb567ca 100644 --- a/toolchain/external-toolchain/ext-tool.mk +++ b/toolchain/external-toolchain/ext-tool.mk @@ -10,12 +10,8 @@ copy_toolchain_lib_root = \ 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; \ + SYSROOT_DIR=`$(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=`; \ + LIB_DIR="$${SYSROOT_DIR}/lib" ; \ \ LIB="$(strip $1)"; \ for FILE in `find $${LIB_DIR} -maxdepth 1 -type l -name "$${LIB}*"`; do \ @@ -48,20 +44,13 @@ copy_toolchain_sysroot = \ if [ -n "$${SYSROOT_DIR}" ]; then cp -a $${SYSROOT_DIR}/* $(STAGING_DIR)/ ; \ find $(STAGING_DIR) -type d | xargs chmod 755; fi +EXTERNAL_LIBS=libc.so libcrypt.so libdl.so libgcc_s.so libm.so libnsl.so libpthread.so libresolv.so librt.so libutil.so ifeq ($(BR2_TOOLCHAIN_EXTERNAL_UCLIBC),y) -EXTERNAL_LIBC=libc.so.0 -EXTERNAL_LIBS=ld-uClibc.so.0 libcrypt.so.0 libdl.so.0 libgcc_s.so libm.so.0 libnsl.so.0 libpthread.so.0 libresolv.so.0 librt.so.0 libutil.so.0 +EXTERNAL_LIBS+=ld-uClibc.so else -EXTERNAL_LIBC=libc.so.6 -EXTERNAL_LIBS=ld-linux.so.3 libcrypt.so.1 libdl.so.2 libgcc_s.so.1 libm.so.6 libnsl.so.1 libpthread.so.0 libresolv.so.2 librt.so.1 libutil.so.1 libnss_files.so.2 +EXTERNAL_LIBS+=ld-linux.so libnss_files.so endif -check_clibrary = \ - if ! test -f `$(TARGET_CC) -print-file-name=$(EXTERNAL_LIBC)` ; then \ - echo "Incorrect selection of the C library"; \ - exit -1; \ - fi - # 1: Buildroot option name # 2: message check_glibc_feature = \ @@ -71,6 +60,12 @@ check_glibc_feature = \ fi check_glibc = \ + SYSROOT_DIR=`$(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=`; \ + echo $${SYSROOT_DIR}/lib/ld-linux.so.* ; \ + if ! test -f $${SYSROOT_DIR}/lib/ld-linux.so.* ; then \ + echo "Incorrect selection of the C library"; \ + exit -1; \ + fi; \ $(call check_glibc_feature,BR2_LARGEFILE,Large file support) ;\ $(call check_glibc_feature,BR2_INET_IPV6,IPv6 support) ;\ $(call check_glibc_feature,BR2_INET_RPC,RPC support) ;\ @@ -94,6 +89,10 @@ check_uclibc_feature = \ check_uclibc = \ SYSROOT_DIR=`$(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=`; \ + if ! test -f $${SYSROOT_DIR}/lib/ld-uClibc.so.* ; then \ + echo "Incorrect selection of the C library"; \ + exit -1; \ + fi; \ UCLIBC_CONFIG_FILE=$${SYSROOT_DIR}/usr/include/bits/uClibc_config.h ; \ $(call check_uclibc_feature,__UCLIBC_HAS_LFS__,BR2_LARGEFILE,$${UCLIBC_CONFIG_FILE},Large file support) ;\ $(call check_uclibc_feature,__UCLIBC_HAS_IPV6__,BR2_INET_IPV6,$${UCLIBC_CONFIG_FILE},IPv6 support) ;\ @@ -101,11 +100,29 @@ check_uclibc = \ $(call check_uclibc_feature,__UCLIBC_HAS_LOCALE__,BR2_ENABLE_LOCALE,$${UCLIBC_CONFIG_FILE},Locale support) ;\ $(call check_uclibc_feature,__UCLIBC_HAS_WCHAR__,BR2_USE_WCHAR,$${UCLIBC_CONFIG_FILE},Wide char support) ;\ -uclibc: dependencies $(TARGET_DIR)/lib/$(EXTERNAL_LIBC) +check_arm_abi = \ + EXT_TOOLCHAIN_TARGET=`$(TARGET_CC) -v 2>&1 | grep ^Target | cut -f2 -d ' '` ; \ + if echo $${EXT_TOOLCHAIN_TARGET} | grep -q 'eabi$$' ; then \ + EXT_TOOLCHAIN_ABI="eabi" ; \ + else \ + EXT_TOOLCHAIN_ABI="oabi" ; \ + fi ; \ + if [ x$(BR2_ARM_OABI) == x"y" -a $${EXT_TOOLCHAIN_ABI} == "eabi" ] ; then \ + echo "Incorrect ABI setting" ; \ + exit 1 ; \ + fi ; \ + if [ x$(BR2_ARM_EABI) == x"y" -a $${EXT_TOOLCHAIN_ABI} == "oabi" ] ; then \ + echo "Incorrect ABI setting" ; \ + exit 1 ; \ + fi ; \ -$(TARGET_DIR)/lib/$(EXTERNAL_LIBC): +uclibc: dependencies $(STAMP_DIR)/ext-toolchain-installed + +$(STAMP_DIR)/ext-toolchain-installed: @echo "Checking external toolchain settings" - @$(call check_clibrary) +ifeq ($(BR2_arm),y) + @$(call check_arm_abi) +endif ifeq ($(BR2_TOOLCHAIN_EXTERNAL_UCLIBC),y) @$(call check_uclibc) else @@ -113,9 +130,9 @@ else endif mkdir -p $(TARGET_DIR)/lib @echo "Copy external toolchain libraries to target..." - @$(call copy_toolchain_lib_root, $(EXTERNAL_LIBC), /lib, $(BR2_TOOLCHAIN_EXTERNAL_STRIP)) @for libs in $(EXTERNAL_LIBS); do \ $(call copy_toolchain_lib_root, $$libs, /lib, $(BR2_TOOLCHAIN_EXTERNAL_STRIP)); \ done @echo "Copy external toolchain sysroot to staging..." @$(call copy_toolchain_sysroot) + @touch $@ -- cgit v1.2.3 From 57692e2535be4197debe2b1eea4fd50dea8a9c26 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Thu, 16 Jul 2009 23:56:10 +0200 Subject: external-toolchain: better documentation, cleanup, sysroot check * Introduce documentation for each function of ext-tool.mk, and document all parameters of the functions. * Pass SYSROOT_DIR as argument to all functions that require it, instead of computing it manually everywhere * Use $(shell) instead of backquotes * Check that the SYSROOT_DIR variable is not empty, which means that the external toolchain doesn't support --sysroot. In that case, bail out with a nice error message. Signed-off-by: Thomas Petazzoni --- toolchain/external-toolchain/ext-tool.mk | 115 ++++++++++++++++++++++--------- 1 file changed, 81 insertions(+), 34 deletions(-) diff --git a/toolchain/external-toolchain/ext-tool.mk b/toolchain/external-toolchain/ext-tool.mk index 72bb567ca..7a0132ab1 100644 --- a/toolchain/external-toolchain/ext-tool.mk +++ b/toolchain/external-toolchain/ext-tool.mk @@ -1,19 +1,20 @@ # -# copy_toolchain_lib_root +# Copy a toolchain library and its symbolic links from the sysroot +# directory to the target directory. Also optionaly strips the +# library. # -# $1: source -# $2: destination -# $3: strip (y|n) default is to strip +# $1: sysroot directory +# $2: library name +# $3: destination directory +# $4: strip (y|n), default is to strip # copy_toolchain_lib_root = \ - LIB="$(strip $1)"; \ - DST="$(strip $2)"; \ - STRIP="$(strip $3)"; \ + SYSROOT_DIR="$(strip $1)"; \ + LIB="$(strip $2)"; \ + DST="$(strip $3)"; \ + STRIP="$(strip $4)"; \ \ - SYSROOT_DIR=`$(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=`; \ LIB_DIR="$${SYSROOT_DIR}/lib" ; \ - \ - LIB="$(strip $1)"; \ for FILE in `find $${LIB_DIR} -maxdepth 1 -type l -name "$${LIB}*"`; do \ LIB=`basename $${FILE}`; \ while test \! -z "$${LIB}"; do \ @@ -39,29 +40,42 @@ copy_toolchain_lib_root = \ \ echo -n +# +# Copy the full external toolchain sysroot directory to the staging +# dir +# +# $1: sysroot directory +# copy_toolchain_sysroot = \ - SYSROOT_DIR=`$(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=`; \ - if [ -n "$${SYSROOT_DIR}" ]; then cp -a $${SYSROOT_DIR}/* $(STAGING_DIR)/ ; \ - find $(STAGING_DIR) -type d | xargs chmod 755; fi + SYSROOT_DIR="$(strip $1)"; \ + cp -a $${SYSROOT_DIR}/* $(STAGING_DIR)/ ; \ + find $(STAGING_DIR) -type d | xargs chmod 755 -EXTERNAL_LIBS=libc.so libcrypt.so libdl.so libgcc_s.so libm.so libnsl.so libpthread.so libresolv.so librt.so libutil.so -ifeq ($(BR2_TOOLCHAIN_EXTERNAL_UCLIBC),y) -EXTERNAL_LIBS+=ld-uClibc.so -else -EXTERNAL_LIBS+=ld-linux.so libnss_files.so -endif - -# 1: Buildroot option name -# 2: message +# +# Check the availability of a particular glibc feature. We assume that +# all Buildroot toolchain options are supported by glibc, so we just +# check that they are enabled. +# +# $1: Buildroot option name +# $2: feature description +# check_glibc_feature = \ if [ x$($(1)) != x"y" ] ; then \ echo "$(2) available in C library, please enable $(1)" ; \ exit 1 ; \ fi +# +# Check the correctness of a glibc external toolchain configuration. +# 1. Check that the C library selected in Buildroot matches the one +# of the external toolchain +# 2. Check that all the C library-related features are enabled in the +# config, since glibc always supports all of them +# +# $1: sysroot directory +# check_glibc = \ - SYSROOT_DIR=`$(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=`; \ - echo $${SYSROOT_DIR}/lib/ld-linux.so.* ; \ + SYSROOT_DIR="$(strip $1)"; \ if ! test -f $${SYSROOT_DIR}/lib/ld-linux.so.* ; then \ echo "Incorrect selection of the C library"; \ exit -1; \ @@ -72,10 +86,16 @@ check_glibc = \ $(call check_glibc_feature,BR2_ENABLE_LOCALE,Locale support) ;\ $(call check_glibc_feature,BR2_USE_WCHAR,Wide char support) -# 1: uClibc macro name -# 2: Buildroot option name -# 3: uClibc config file -# 4: message +# +# Check the conformity of Buildroot configuration with regard to the +# uClibc configuration of the external toolchain, for a particular +# feature. +# +# $1: uClibc macro name +# $2: Buildroot option name +# $3: uClibc config file +# $4: feature description +# check_uclibc_feature = \ IS_IN_LIBC=`grep -q "\#define $(1) 1" $(3) && echo y` ; \ if [ x$($(2)) != x"y" -a x$${IS_IN_LIBC} == x"y" ] ; then \ @@ -87,8 +107,18 @@ check_uclibc_feature = \ exit 1 ; \ fi +# +# Check the correctness of a uclibc external toolchain configuration +# 1. Check that the C library selected in Buildroot matches the one +# of the external toolchain +# 2. Check that the features enabled in the Buildroot configuration +# match the features available in the uClibc of the external +# toolchain +# +# $1: sysroot directory +# check_uclibc = \ - SYSROOT_DIR=`$(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=`; \ + SYSROOT_DIR="$(strip $1)"; \ if ! test -f $${SYSROOT_DIR}/lib/ld-uClibc.so.* ; then \ echo "Incorrect selection of the C library"; \ exit -1; \ @@ -100,8 +130,12 @@ check_uclibc = \ $(call check_uclibc_feature,__UCLIBC_HAS_LOCALE__,BR2_ENABLE_LOCALE,$${UCLIBC_CONFIG_FILE},Locale support) ;\ $(call check_uclibc_feature,__UCLIBC_HAS_WCHAR__,BR2_USE_WCHAR,$${UCLIBC_CONFIG_FILE},Wide char support) ;\ +# +# Check that the Buildroot configuration of the ABI matches the +# configuration of the external toolchain. +# check_arm_abi = \ - EXT_TOOLCHAIN_TARGET=`$(TARGET_CC) -v 2>&1 | grep ^Target | cut -f2 -d ' '` ; \ + EXT_TOOLCHAIN_TARGET=$(shell $(TARGET_CC) -v 2>&1 | grep ^Target | cut -f2 -d ' ') ; \ if echo $${EXT_TOOLCHAIN_TARGET} | grep -q 'eabi$$' ; then \ EXT_TOOLCHAIN_ABI="eabi" ; \ else \ @@ -118,21 +152,34 @@ check_arm_abi = \ uclibc: dependencies $(STAMP_DIR)/ext-toolchain-installed +EXTERNAL_LIBS=libc.so libcrypt.so libdl.so libgcc_s.so libm.so libnsl.so libpthread.so libresolv.so librt.so libutil.so +ifeq ($(BR2_TOOLCHAIN_EXTERNAL_UCLIBC),y) +EXTERNAL_LIBS+=ld-uClibc.so +else +EXTERNAL_LIBS+=ld-linux.so libnss_files.so +endif + +SYSROOT_DIR=$(shell $(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=) + $(STAMP_DIR)/ext-toolchain-installed: @echo "Checking external toolchain settings" +ifeq ($(strip $(SYSROOT_DIR)),) + @echo "External toolchain doesn't support --sysroot. Cannot use." + exit 1 +endif ifeq ($(BR2_arm),y) @$(call check_arm_abi) endif ifeq ($(BR2_TOOLCHAIN_EXTERNAL_UCLIBC),y) - @$(call check_uclibc) + @$(call check_uclibc,$(SYSROOT_DIR)) else - @$(call check_glibc) + @$(call check_glibc,$(SYSROOT_DIR)) endif mkdir -p $(TARGET_DIR)/lib @echo "Copy external toolchain libraries to target..." @for libs in $(EXTERNAL_LIBS); do \ - $(call copy_toolchain_lib_root, $$libs, /lib, $(BR2_TOOLCHAIN_EXTERNAL_STRIP)); \ + $(call copy_toolchain_lib_root,$(SYSROOT_DIR),$$libs,/lib,$(BR2_TOOLCHAIN_EXTERNAL_STRIP)); \ done @echo "Copy external toolchain sysroot to staging..." - @$(call copy_toolchain_sysroot) + @$(call copy_toolchain_sysroot,$(SYSROOT_DIR)) @touch $@ -- cgit v1.2.3 From fd5570970e1a488815b8ca94b516f92901cefacb Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Fri, 17 Jul 2009 00:07:08 +0200 Subject: external toolchain: use LANG=C when calling gcc -v Lionel Landwerlin reported that using the external toolchain support when LANG=fr_FR.UTF-8 doesn't work, since the messages printed by gcc -v are translated in another language, defeating the grep ^Configured test. Therefore, as per Lionel suggestion, we force LANG=C when calling $(TARGET_CC) -v. Signed-off-by: Thomas Petazzoni --- toolchain/external-toolchain/ext-tool.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/toolchain/external-toolchain/ext-tool.mk b/toolchain/external-toolchain/ext-tool.mk index 7a0132ab1..4cd4f2d4f 100644 --- a/toolchain/external-toolchain/ext-tool.mk +++ b/toolchain/external-toolchain/ext-tool.mk @@ -135,7 +135,7 @@ check_uclibc = \ # configuration of the external toolchain. # check_arm_abi = \ - EXT_TOOLCHAIN_TARGET=$(shell $(TARGET_CC) -v 2>&1 | grep ^Target | cut -f2 -d ' ') ; \ + EXT_TOOLCHAIN_TARGET=$(shell LANG=C $(TARGET_CC) -v 2>&1 | grep ^Target | cut -f2 -d ' ') ; \ if echo $${EXT_TOOLCHAIN_TARGET} | grep -q 'eabi$$' ; then \ EXT_TOOLCHAIN_ABI="eabi" ; \ else \ @@ -159,7 +159,7 @@ else EXTERNAL_LIBS+=ld-linux.so libnss_files.so endif -SYSROOT_DIR=$(shell $(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=) +SYSROOT_DIR=$(shell LANG=C $(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=) $(STAMP_DIR)/ext-toolchain-installed: @echo "Checking external toolchain settings" -- cgit v1.2.3 From 0afd2103f0dab1b86896890446e8999c72cef465 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Fri, 17 Jul 2009 00:20:33 +0200 Subject: external toolchain: more documentation about the principles Signed-off-by: Thomas Petazzoni --- toolchain/external-toolchain/ext-tool.mk | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/toolchain/external-toolchain/ext-tool.mk b/toolchain/external-toolchain/ext-tool.mk index 4cd4f2d4f..0e1deb620 100644 --- a/toolchain/external-toolchain/ext-tool.mk +++ b/toolchain/external-toolchain/ext-tool.mk @@ -1,3 +1,34 @@ +# +# This file implements the support for external toolchains, i.e +# toolchains that have not been produced by Buildroot itself and that +# are already available on the system on which Buildroot runs. +# +# The basic principle is the following +# +# 1. Perform some checks on the conformity between the toolchain +# configuration described in the Buildroot menuconfig system, and the +# real configuration of the external toolchain. This is for example +# important to make sure that the Buildroot configuration system +# knows whether the toolchain supports RPC, IPv6, locales, large +# files, etc. Unfortunately, these things cannot be detected +# automatically, since the value of these options (such as +# BR2_INET_RPC) are needed at configuration time because these +# options are used as dependencies for other options. And at +# configuration time, we are not able to retrieve the external +# toolchain configuration. +# +# 2. Copy the libraries needed at runtime to the target directory, +# $(TARGET_DIR). Obviously, things such as the C library, the dynamic +# loader and a few other utility libraries are needed if dynamic +# applications are to be executed on the target system. +# +# 3. Copy the libraries and headers to the staging directory. This +# will allow all further calls to gcc to be made using --sysroot +# $(STAGING_DIR), which greatly simplifies the compilation of the +# packages when using external toolchains. So in the end, only the +# cross-compiler binaries remains external, all libraries and headers +# are imported into the Buildroot tree. + # # Copy a toolchain library and its symbolic links from the sysroot # directory to the target directory. Also optionaly strips the -- cgit v1.2.3 From 3026e9930eaf9b287aa69c4ed7adfe34913afda3 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Fri, 17 Jul 2009 00:25:35 +0200 Subject: external toolchain: do not copy useless symbolic links Do not copy .so symbolic links to target when not needed. Only copy .so.X symbolic links and the library itself. Signed-off-by: Thomas Petazzoni --- toolchain/external-toolchain/ext-tool.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolchain/external-toolchain/ext-tool.mk b/toolchain/external-toolchain/ext-tool.mk index 0e1deb620..6df48f0b0 100644 --- a/toolchain/external-toolchain/ext-tool.mk +++ b/toolchain/external-toolchain/ext-tool.mk @@ -46,7 +46,7 @@ copy_toolchain_lib_root = \ STRIP="$(strip $4)"; \ \ LIB_DIR="$${SYSROOT_DIR}/lib" ; \ - for FILE in `find $${LIB_DIR} -maxdepth 1 -type l -name "$${LIB}*"`; do \ + for FILE in `find $${LIB_DIR} -maxdepth 1 -name "$${LIB}.*"`; do \ LIB=`basename $${FILE}`; \ while test \! -z "$${LIB}"; do \ rm -fr $(TARGET_DIR)$${DST}/$${LIB}; \ -- cgit v1.2.3 From 28aa0b47fb5bcb46ddcc24fdb5cc5466c094024f Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Fri, 17 Jul 2009 00:26:23 +0200 Subject: external toolchain: copy the C++ standard library if needed Obey the BR2_INSTALL_LIBSTDCPP configuration option to copy the C++ standard library to the target. Suggested by Lionel Landwerlin . Signed-off-by: Thomas Petazzoni --- toolchain/external-toolchain/ext-tool.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/toolchain/external-toolchain/ext-tool.mk b/toolchain/external-toolchain/ext-tool.mk index 6df48f0b0..e772cda7e 100644 --- a/toolchain/external-toolchain/ext-tool.mk +++ b/toolchain/external-toolchain/ext-tool.mk @@ -190,6 +190,10 @@ else EXTERNAL_LIBS+=ld-linux.so libnss_files.so endif +ifeq ($(BR2_INSTALL_LIBSTDCPP),y) +EXTERNAL_LIBS+=libstdc++.so +endif + SYSROOT_DIR=$(shell LANG=C $(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" | grep -- "--with-sysroot" | cut -f2 -d=) $(STAMP_DIR)/ext-toolchain-installed: -- cgit v1.2.3 From 82bf777ed73f449587aea59a6ce5b41164a6819f Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Fri, 17 Jul 2009 08:48:35 +0200 Subject: external toolchain: respect $(Q) Use $(Q) in external toolchain support so that the user can get the full output by passing V=1 to make, and still get a nice and clean output by default. Signed-off-by: Thomas Petazzoni --- toolchain/external-toolchain/ext-tool.mk | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/toolchain/external-toolchain/ext-tool.mk b/toolchain/external-toolchain/ext-tool.mk index e772cda7e..c9692a1ab 100644 --- a/toolchain/external-toolchain/ext-tool.mk +++ b/toolchain/external-toolchain/ext-tool.mk @@ -203,18 +203,18 @@ ifeq ($(strip $(SYSROOT_DIR)),) exit 1 endif ifeq ($(BR2_arm),y) - @$(call check_arm_abi) + $(Q)$(call check_arm_abi) endif ifeq ($(BR2_TOOLCHAIN_EXTERNAL_UCLIBC),y) - @$(call check_uclibc,$(SYSROOT_DIR)) + $(Q)$(call check_uclibc,$(SYSROOT_DIR)) else - @$(call check_glibc,$(SYSROOT_DIR)) + $(Q)$(call check_glibc,$(SYSROOT_DIR)) endif mkdir -p $(TARGET_DIR)/lib @echo "Copy external toolchain libraries to target..." - @for libs in $(EXTERNAL_LIBS); do \ + $(Q)for libs in $(EXTERNAL_LIBS); do \ $(call copy_toolchain_lib_root,$(SYSROOT_DIR),$$libs,/lib,$(BR2_TOOLCHAIN_EXTERNAL_STRIP)); \ done @echo "Copy external toolchain sysroot to staging..." - @$(call copy_toolchain_sysroot,$(SYSROOT_DIR)) + $(Q)$(call copy_toolchain_sysroot,$(SYSROOT_DIR)) @touch $@ -- cgit v1.2.3 From 901b468e24ff546760ffdf6456d731f6388bad00 Mon Sep 17 00:00:00 2001 From: Thomas Petazzoni Date: Fri, 17 Jul 2009 08:53:55 +0200 Subject: external toolchain: check cross-compiler existence As a minimal test to the external toolchain, check that $(TARGET_CC) is actually an existing executable file. That way, if the user misconfigures the toolchain path and/or prefix, a meaningful error message will be shown. Signed-off-by: Thomas Petazzoni --- toolchain/external-toolchain/ext-tool.mk | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/toolchain/external-toolchain/ext-tool.mk b/toolchain/external-toolchain/ext-tool.mk index c9692a1ab..d441a9252 100644 --- a/toolchain/external-toolchain/ext-tool.mk +++ b/toolchain/external-toolchain/ext-tool.mk @@ -181,6 +181,15 @@ check_arm_abi = \ exit 1 ; \ fi ; \ +# +# Check that the cross-compiler given in the configuration exists +# +check_cross_compiler_exists = \ + if ! test -x $(TARGET_CC) ; then \ + echo "Cannot find cross-compiler $(TARGET_CC)" ; \ + exit 1 ; \ + fi ; \ + uclibc: dependencies $(STAMP_DIR)/ext-toolchain-installed EXTERNAL_LIBS=libc.so libcrypt.so libdl.so libgcc_s.so libm.so libnsl.so libpthread.so libresolv.so librt.so libutil.so @@ -198,6 +207,7 @@ SYSROOT_DIR=$(shell LANG=C $(TARGET_CC) -v 2>&1 | grep ^Configured | tr " " "\n" $(STAMP_DIR)/ext-toolchain-installed: @echo "Checking external toolchain settings" + $(Q)$(call check_cross_compiler_exists) ifeq ($(strip $(SYSROOT_DIR)),) @echo "External toolchain doesn't support --sysroot. Cannot use." exit 1 -- cgit v1.2.3