[Buildroot] [PATCH 03/14] Improve external toolchain logic to support IA32 Sourcery CodeBench toolchain

Thomas De Schampheleire patrickdepinguin+buildroot at gmail.com
Wed Jan 4 07:48:37 UTC 2012


On Tue, Jan 3, 2012 at 9:22 PM, Thomas Petazzoni <
thomas.petazzoni at free-electrons.com> wrote:

> The IA32 Sourcery CodeBench toolchain has a relatively special
> structure, with the following multilib variants:
>
>  * Intel Pentium 4, 32 bits, the multilib variant is in ./ relative to
>   the main sysroot, with the libraries in the lib/ directory.
>
>  * Intel Xeon Nocona, 64 bits, the multilib variant is in ./ relative
>   to the main sysroot, with the libraries in the lib64/ directory.
>
>  * Intel Atom 32 bits, the multilib variant is in atom/ relative to
>   the main sysroot, with the libraries in the lib/ directory.
>
>  * Intel Core 2 64 bits, the multilib variant is in core2/ relative to
>   the main sysroot, with the libraries in lib64/ directory.
>
> So the first two variants are in the same sysroot, only the name of
> the directory for the libraries is different.
>
> Therefore, we introduce a new ARCH_LIB_DIR variable, which contains
> either 'lib' or 'lib64'. This variable is defined according to the
> location of the libc.a file for the selected multilib variant, and is
> then used when copying the libraries to the target and to the staging
> directory.
>
> In addition to this, we no longer use the -print-multi-directory to
> get the ARCH_SUBDIR, since in the case of the 64 bits variants of this
> toolchain, it returns just '64' and not a real path. Instead, we
> simply compute the difference between the arch-specific sysroot and
> the main sysroot.
>
> We also take that opportunity to expand the documentation on the
> meaning of the different variables.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> ---
>  toolchain/helpers.mk                     |   19 ++++++----
>  toolchain/toolchain-external/ext-tool.mk |   57
> +++++++++++++++++++++++-------
>  2 files changed, 56 insertions(+), 20 deletions(-)
>
> diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
> index 65cc998..4c3f240 100644
> --- a/toolchain/helpers.mk
> +++ b/toolchain/helpers.mk
> @@ -10,19 +10,22 @@
>  # Most toolchains have their libraries either in /lib or /usr/lib
>  # relative to their ARCH_SYSROOT_DIR. Buildroot toolchains, however,
>  # have basic libraries in /lib, and libstdc++/libgcc_s in
> -# /usr/<target-name>/lib(64).
> +# /usr/<target-name>/lib(64). Thanks to ARCH_LIB_DIR we also take into
> +# account toolchains that have the libraries in lib64 and usr/lib64.
>  #
>  # $1: arch specific sysroot directory
> -# $2: library name
> -# $3: destination directory of the libary, relative to $(TARGET_DIR)
> +# $2: library directory ('lib' or 'lib64') from which libraries must be
> copied
> +# $3: library name
> +# $4: destination directory of the libary, relative to $(TARGET_DIR)
>  #
>  copy_toolchain_lib_root = \
>        ARCH_SYSROOT_DIR="$(strip $1)"; \
> -       LIB="$(strip $2)"; \
> -       DESTDIR="$(strip $3)" ; \
> +       ARCH_LIB_DIR="$(strip $2)" ; \
> +       LIB="$(strip $3)"; \
> +       DESTDIR="$(strip $4)" ; \
>  \
>        LIBS=`(cd $${ARCH_SYSROOT_DIR}; \
> -               find -L lib* usr/lib*
> usr/$(TOOLCHAIN_EXTERNAL_PREFIX)/lib* \
> +               find -L $${ARCH_LIB_DIR} usr/$${ARCH_LIB_DIR}
> usr/$(TOOLCHAIN_EXTERNAL_PREFIX)/$${ARCH_LIB_DIR} \
>                        -maxdepth 1 -name "$${LIB}.*" 2>/dev/null \
>                )` ; \
>        for FILE in $${LIBS} ; do \
> @@ -84,12 +87,14 @@ copy_toolchain_lib_root = \
>  # $1: main sysroot directory of the toolchain
>  # $2: arch specific sysroot directory of the toolchain
>  # $3: arch specific subdirectory in the sysroot
> +# $4: directory of libraries ('lib' or 'lib64')
>  #
>  copy_toolchain_sysroot = \
>        SYSROOT_DIR="$(strip $1)"; \
>        ARCH_SYSROOT_DIR="$(strip $2)"; \
>        ARCH_SUBDIR="$(strip $3)"; \
> -       for i in etc lib sbin usr ; do \
> +       ARCH_LIB_DIR="$(strip $4)" ; \
> +       for i in etc $${ARCH_LIB_DIR} sbin usr ; do \
>                if [ -d $${ARCH_SYSROOT_DIR}/$$i ] ; then \
>                        rsync -au --chmod=Du+w --exclude 'usr/lib/locale'
> $${ARCH_SYSROOT_DIR}/$$i $(STAGING_DIR)/ ; \
>                fi ; \
> diff --git a/toolchain/toolchain-external/ext-tool.mkb/toolchain/toolchain-external/
> ext-tool.mk
> index 2ac4973..1e62201 100644
> --- a/toolchain/toolchain-external/ext-tool.mk
> +++ b/toolchain/toolchain-external/ext-tool.mk
> @@ -267,10 +267,8 @@ endif
>  $(STAMP_DIR)/ext-toolchain-checked:
>        @echo "Checking external toolchain settings"
>        $(Q)$(call check_cross_compiler_exists,$(TOOLCHAIN_EXTERNAL_CC))
> -       $(Q)SYSROOT_DIR=`$(TOOLCHAIN_EXTERNAL_CC) -print-sysroot
> 2>/dev/null` ; \
> -       if test -z "$${SYSROOT_DIR}" ; then \
> -               SYSROOT_DIR=`readlink -f $$(LANG=C
> $(TOOLCHAIN_EXTERNAL_CC) -print-file-name=libc.a) |sed -r -e
> 's:usr/lib/libc\.a::;'` ; \
> -       fi ; \
> +       LIBC_A_LOCATION=`readlink -f $$(LANG=C $(TOOLCHAIN_EXTERNAL_CC)
> -print-file-name=libc.a)` ; \
> +       SYSROOT_DIR=`echo $${LIBC_A_LOCATION} | sed -r -e
> 's:usr/lib(64)?/libc\.a::'` ; \
>        if test -z "$${SYSROOT_DIR}" ; then \
>                @echo "External toolchain doesn't support --sysroot. Cannot
> use." ; \
>                exit 1 ; \
>

Is it intentional that you removed $(Q) here?


> @@ -292,27 +290,60 @@ $(STAMP_DIR)/ext-toolchain-checked:
>  # and the variant-specific sysroot, then copy the needed libraries to
>  # the $(TARGET_DIR) and copy the whole sysroot (libraries and headers)
>  # to $(STAGING_DIR).
> +#
> +# Variables are defined as follows:
> +#
> +#  LIBC_A_LOCATION:     location of the libc.a file in the default
> +#                       multilib variant (allows to find the main
> +#                       sysroot directory)
> +#                       Ex:
> /x-tools/mips-2011.03/mips-linux-gnu/libc/usr/lib/libc.a
> +#
> +#  SYSROOT_DIR:         the main sysroot directory, deduced from
> +#                       LIBC_A_LOCATION by removing the
> +#                       usr/lib[64]/libc.a part of the path.
> +#                       Ex: /x-tools/mips-2011.03/mips-linux-gnu/libc/
> +#
> +# ARCH_LIBC_A_LOCATION: location of the libc.a file in the selected
> +#                       multilib variant (taking into account the
> +#                       CFLAGS). Allows to find the sysroot of the
> +#                       selected multilib variant.
> +#                       Ex:
> /x-tools/mips-2011.03/mips-linux-gnu/libc/mips16/soft-float/el/usr/lib/libc.a
> +#
> +# ARCH_SYSROOT_DIR:     the sysroot of the selected multilib variant,
> +#                       deduced from ARCH_LIBC_A_LOCATION by removing
> +#                       usr/lib[64]/libc.a at the end of the path.
> +#                       Ex:
> /x-tools/mips-2011.03/mips-linux-gnu/libc/mips16/soft-float/el/
> +#
> +# ARCH_LIB_DIR:         'lib' or 'lib64' depending on where libraries are
> +#                       stored. Deduced from ARCH_LIBC_A_LOCATION by
> +#                       looking at usr/lib??/libc.a.
> +#                       Ex: lib
> +#
> +# ARCH_SUBDIR:          the relative location of the sysroot of the
> selected
> +#                       multilib variant compared to the main sysroot.
> +#                      Ex: mips16/soft-float/el
> +
>  $(STAMP_DIR)/ext-toolchain-installed: $(TOOLCHAIN_EXTERNAL_DEPENDENCIES)
> -       $(Q)SYSROOT_DIR=`$(TOOLCHAIN_EXTERNAL_CC) -print-sysroot
> 2>/dev/null` ; \
> -       if test -z "$${SYSROOT_DIR}" ; then \
> -               SYSROOT_DIR=`readlink -f $$(LANG=C
> $(TOOLCHAIN_EXTERNAL_CC) -print-file-name=libc.a) |sed -r -e
> 's:usr/lib/libc\.a::;'` ; \
> -       fi ; \
> +       LIBC_A_LOCATION=`readlink -f $$(LANG=C $(TOOLCHAIN_EXTERNAL_CC)
> -print-file-name=libc.a)` ; \
> +       SYSROOT_DIR=`echo $${LIBC_A_LOCATION} | sed -r -e
> 's:usr/lib(64)?/libc\.a::'` ; \
>

Same here.


>        if test -z "$${SYSROOT_DIR}" ; then \
>                @echo "External toolchain doesn't support --sysroot. Cannot
> use." ; \
>                exit 1 ; \
>        fi ; \
> -       ARCH_SUBDIR=`$(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS)
> -print-multi-directory` ; \
> -       ARCH_SYSROOT_DIR=$${SYSROOT_DIR}/$${ARCH_SUBDIR} ; \
> +       ARCH_LIBC_A_LOCATION=`readlink -f $$(LANG=C
> $(TOOLCHAIN_EXTERNAL_CC) $(TOOLCHAIN_EXTERNAL_CFLAGS)
> -print-file-name=libc.a)` ; \
> +       ARCH_SYSROOT_DIR=`echo $${ARCH_LIBC_A_LOCATION} | sed -r -e
> 's:usr/lib(64)?/libc\.a::'` ; \
> +       ARCH_LIB_DIR=`echo $${ARCH_LIBC_A_LOCATION} | sed -r -e
> 's:.*/usr/(lib(64)?)/libc.a:\1:'` ; \
> +       ARCH_SUBDIR=`echo $${ARCH_SYSROOT_DIR} | sed -r -e
> "s:^$${SYSROOT_DIR}(.*)/$$:\1:"` ; \
>        mkdir -p $(TARGET_DIR)/lib ; \
>        echo "Copy external toolchain libraries to target..." ; \
>        for libs in $(LIB_EXTERNAL_LIBS); do \
> -               $(call
> copy_toolchain_lib_root,$${ARCH_SYSROOT_DIR},$$libs,/lib); \
> +               $(call
> copy_toolchain_lib_root,$${ARCH_SYSROOT_DIR},$${ARCH_LIB_DIR},$$libs,/lib);
> \
>        done ; \
>        for libs in $(USR_LIB_EXTERNAL_LIBS); do \
> -               $(call
> copy_toolchain_lib_root,$${ARCH_SYSROOT_DIR},$$libs,/usr/lib); \
> +               $(call
> copy_toolchain_lib_root,$${ARCH_SYSROOT_DIR},$${ARCH_LIB_DIR},$$libs,/usr/lib);
> \
>        done ; \
>        echo "Copy external toolchain sysroot to staging..." ; \
> -       $(call
> copy_toolchain_sysroot,$${SYSROOT_DIR},$${ARCH_SYSROOT_DIR},$${ARCH_SUBDIR})
> ; \
> +       $(call
> copy_toolchain_sysroot,$${SYSROOT_DIR},$${ARCH_SYSROOT_DIR},$${ARCH_SUBDIR},$${ARCH_LIB_DIR})
> ; \
>        if [ -L $${ARCH_SYSROOT_DIR}/lib64 ] ; then \
>                $(call create_lib64_symlinks) ; \
>        fi ; \
> --
> 1.7.4.1
>
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20120104/164b6865/attachment-0001.html>


More information about the buildroot mailing list