From 62d357d3c0756ec0f220e9cf3a874e591548a65c Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Tue, 15 Mar 2016 11:51:56 -0700 Subject: Unbreak static cross-gdb. GDB's configure mishandles the libexpat.{so,a} libraries when it is given -static in CFLAGS AND --with-libexpat-prefix in configure's args: it checks for /lib/libexpat.so and finding that, attempts to link it as `gcc -static .. conftest.c /lib/libexpat.so`; this obviously fails (.so cannot be statically linked), so configure assumes libexpat is unusable. Thus, --with-libexpat-prefix is dangerous and should be avoided; instead, configure should find the libraries via the supplied CC/LD definitions. --- scripts/build/debug/300-gdb.sh | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'scripts/build') diff --git a/scripts/build/debug/300-gdb.sh b/scripts/build/debug/300-gdb.sh index 418e85c6..02a8f7e0 100644 --- a/scripts/build/debug/300-gdb.sh +++ b/scripts/build/debug/300-gdb.sh @@ -69,7 +69,11 @@ do_debug_gdb_build() { cross_extra_config=("${extra_config[@]}") cross_extra_config+=("--with-expat") - cross_extra_config+=("--with-libexpat-prefix=${CT_HOST_COMPLIBS_DIR}") + # NOTE: DO NOT USE --with-libexpat-prefix (until GDB configure is smarter)!!! + # It conflicts with a static build: GDB's configure script will find the shared + # version of expat and will attempt to link that, despite the -static flag. + # The link will fail, and configure will abort with "expat missing or unusable" + # message. case "${CT_THREADS}" in none) cross_extra_config+=("--disable-threads");; *) cross_extra_config+=("--enable-threads");; @@ -88,11 +92,11 @@ do_debug_gdb_build() { cross_extra_config+=("--disable-nls") fi - CC_for_gdb= - LD_for_gdb= + CC_for_gdb="${CT_HOST}-gcc ${CT_CFLAGS_FOR_HOST} ${CT_LDFLAGS_FOR_HOST}" + LD_for_gdb="${CT_HOST}-ld ${CT_LDFLAGS_FOR_HOST}" if [ "${CT_GDB_CROSS_STATIC}" = "y" ]; then - CC_for_gdb="${CT_HOST}-gcc -static" - LD_for_gdb="${CT_HOST}-ld -static" + CC_for_gdb+=" -static" + LD_for_gdb+=" -static" fi # Disable binutils options when building from the binutils-gdb repo. @@ -162,6 +166,11 @@ do_debug_gdb_build() { fi native_extra_config+=("--with-expat") + # NOTE: DO NOT USE --with-libexpat-prefix (until GDB configure is smarter)!!! + # It conflicts with a static build: GDB's configure script will find the shared + # version of expat and will attempt to link that, despite the -static flag. + # The link will fail, and configure will abort with "expat missing or unusable" + # message. CT_DoLog EXTRA "Configuring native gdb" -- cgit v1.2.3 From 712b617a744aa941b99d32d9ff6d9126c77382fb Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Tue, 15 Mar 2016 12:39:03 -0700 Subject: Unbreak sparc-unknown-linux-gnu. GLIBC 2.23 dropped support for pre-v9 SPARC in pthreads. Pass host triplet with s/sparc/sparcv9/ replacement for 2.23. Signed-off-by: Alexey Neyman --- config/libc/glibc.in | 7 ++++++- scripts/build/libc/glibc.sh | 19 +++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'scripts/build') diff --git a/config/libc/glibc.in b/config/libc/glibc.in index fc7c85b2..96879cce 100644 --- a/config/libc/glibc.in +++ b/config/libc/glibc.in @@ -74,7 +74,7 @@ choice config LIBC_GLIBC_V_2_23 bool prompt "2.23" - select LIBC_GLIBC_2_20_or_later + select LIBC_GLIBC_2_23_or_later config LIBC_GLIBC_V_2_22 bool @@ -109,6 +109,11 @@ endchoice endif # ! LIBC_GLIBC_CUSTOM +# Checked by SPARC build: SPARCv8 is dropped in 2.23. +config LIBC_GLIBC_2_23_or_later + select LIBC_GLIBC_2_20_or_later + bool + # DeMark 2.20 as no longer needs to set NPTL as an addon. # It is no longer possible to build glibc without pthread! config LIBC_GLIBC_2_20_or_later diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index 0a09cbd1..013c6ebd 100644 --- a/scripts/build/libc/glibc.sh +++ b/scripts/build/libc/glibc.sh @@ -73,6 +73,7 @@ do_libc_backend() { local multi_dir local multi_flags local extra_dir + local target local libc_headers libc_startfiles libc_full local hdr local arg @@ -136,11 +137,24 @@ do_libc_backend() { CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}" + target=${CT_TARGET} + case "${target}" in + # SPARC quirk: glibc 2.23 and newer dropped support for SPARCv8 and + # earlier (corresponding pthread barrier code is missing). Until this + # support is reintroduced, configure as sparcv9. + sparc-*) + if [ "${CT_LIBC_GLIBC_2_23_or_later}" = y ]; then + target=${target/#sparc-/sparcv9-} + fi + ;; + esac + do_libc_backend_once extra_dir="${extra_dir}" \ extra_flags="${extra_flags}" \ libc_headers="${libc_headers}" \ libc_startfiles="${libc_startfiles}" \ - libc_full="${libc_full}" + libc_full="${libc_full}" \ + target="${target}" CT_Popd @@ -192,6 +206,7 @@ do_libc_backend_once() { local glibc_cflags local float_extra local endian_extra + local target local arg for arg in "$@"; do @@ -341,7 +356,7 @@ do_libc_backend_once() { "${src_dir}/configure" \ --prefix=/usr \ --build=${CT_BUILD} \ - --host=${CT_TARGET} \ + --host=${target} \ --cache-file="$(pwd)/config.cache" \ --without-cvs \ --disable-profile \ -- cgit v1.2.3 From 2162cbbdb7a425505e66f8b65f134c33302324f4 Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Wed, 16 Mar 2016 11:41:55 -0700 Subject: Work-around another quirk in GDB configure. Previous fix for cross-gdb broke powerpc-unknown_nofpu-linux-gnu which uses an old GDB (6.8a). That GDB's configure chokes on $CC values with multiple consecutive spaces; see the comment in 300-gdb.sh. Signed-off-by: Alexey Neyman --- scripts/build/debug/300-gdb.sh | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'scripts/build') diff --git a/scripts/build/debug/300-gdb.sh b/scripts/build/debug/300-gdb.sh index 02a8f7e0..ee4753ef 100644 --- a/scripts/build/debug/300-gdb.sh +++ b/scripts/build/debug/300-gdb.sh @@ -99,10 +99,17 @@ do_debug_gdb_build() { LD_for_gdb+=" -static" fi - # Disable binutils options when building from the binutils-gdb repo. - cross_extra_config+=("--disable-binutils") - cross_extra_config+=("--disable-ld") - cross_extra_config+=("--disable-gas") + # Fix up whitespace. Some older GDB releases (e.g. 6.8a) get confused if there + # are multiple consecutive spaces: sub-configure scripts replace them with a + # single space and then complain that $CC value changed from that in + # the master directory. + CC_for_gdb=`echo $CC_for_gdb` + LD_for_gdb=`echo $LD_for_gdb` + + # Disable binutils options when building from the binutils-gdb repo. + cross_extra_config+=("--disable-binutils") + cross_extra_config+=("--disable-ld") + cross_extra_config+=("--disable-gas") CT_DoLog DEBUG "Extra config passed: '${cross_extra_config[*]}'" -- cgit v1.2.3 From a60946eb24430a8b43b8fe6027d32ab17be28111 Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Wed, 30 Mar 2016 18:42:30 -0700 Subject: arch/sparc: better default CPU when targetting Linux By default, sparc64-*-linux is configured with -mcpu=v9. However, according to https://sourceware.org/ml/libc-alpha/2005-12/msg00027.html: "There is no Linux sparc64 port that runs on non-UltraSPARC-I+ ISA CPUs." v9 is such a "non-UltraSPARC-I+ ISA CPU", so it makes no sense to default to v9 when targetting Linux. Change the default to ultrasparc, even though it can suboptimally schedule instructions for newer SPARC CPUs. See the pending patch: https://patchwork.ozlabs.org/patch/409424/ Signed-off-by: Alexey Neyman --- scripts/build/arch/sparc.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'scripts/build') diff --git a/scripts/build/arch/sparc.sh b/scripts/build/arch/sparc.sh index e3e74913..1cf2acf3 100644 --- a/scripts/build/arch/sparc.sh +++ b/scripts/build/arch/sparc.sh @@ -2,4 +2,17 @@ CT_DoArchTupleValues() { # That's the only thing to override CT_TARGET_ARCH="sparc${target_bits_64}${CT_ARCH_SUFFIX}" + + # By default, sparc64-*-linux is configured with -mcpu=v9. However, + # according to https://sourceware.org/ml/libc-alpha/2005-12/msg00027.html, + # "There is no Linux sparc64 port that runs on non-UltraSPARC-I+ ISA CPUs." + # There is a patch that would change the default to -mcpu=ultrasparc for + # sparc64-*-linux configuration: https://patchwork.ozlabs.org/patch/409424/ + # but that patch has not been integrated (yet). One concern raised about + # this patch was that -mcpu=ultrasparc can suboptimally schedule instructions + # for newer SPARC CPUs. So, override to -mcpu=ultrasparc and warn the user. + if [ "${CT_KERNEL}" = "linux" -a "${CT_ARCH_64}" = "y" -a -z "${CT_ARCH_CPU}" ]; then + CT_DoLog WARN "Setting CPU to UltraSPARC-I for sparc64-linux. Set CT_ARCH_CPU if a different CPU is desired." + CT_ARCH_WITH_CPU="--with-cpu=ultrasparc" + fi } -- cgit v1.2.3 From 55879ed1d83ebb72f2ab6cbbd892448c731a7163 Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Sat, 19 Mar 2016 00:13:52 -0700 Subject: glibc: do not add bogus options If a multilib configuration contains an endianness option, the ${endian_extra} is set to, for example, 'mb' (note, no dash!). It is then added to CFLAGS, resulting in bogus flags like 'mb -mb'. But it is not even needed, as ${extra_flags} already contains the very same option! Found by experimenting with multilibs with different endianness on SH, which still didn't work, but that's another story... Signed-off-by: Alexey Neyman --- scripts/build/libc/glibc.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'scripts/build') diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index 013c6ebd..f8c970da 100644 --- a/scripts/build/libc/glibc.sh +++ b/scripts/build/libc/glibc.sh @@ -288,12 +288,12 @@ do_libc_backend_once() { |${sed} -r -e '/^(.*[[:space:]])?-(E[BL]|m((big|little)(-endian)?|e?[bl]))([[:space:]].*)?$/!d;' \ -e 's//\2/;' \ )" + # If extra_flags contained an endianness option, no need to add it again. Otherwise, + # add the option from the configuration. case "${endian_extra}" in EB|mbig-endian|mbig|meb|mb) - extra_cc_args="${extra_cc_args} ${endian_extra}" ;; EL|mlittle-endian|mlittle|mel|ml) - extra_cc_args="${extra_cc_args} ${endian_extra}" ;; "") extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}" ;; -- cgit v1.2.3 From a65d8841ec0ceff75a3d5c3795cfb7435a194670 Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Wed, 11 Nov 2015 08:14:53 -0800 Subject: Enable multiarch support in pass-1 GCC. By default, it is 'auto' - which means, it is enabled if there are multilibs directories detected in the installation location for libgcc. Thus, it is not detected for pass-1 GCC: the installation location is empty at this point. Signed-off-by: Alexey Neyman --- scripts/build/cc/100-gcc.sh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'scripts/build') diff --git a/scripts/build/cc/100-gcc.sh b/scripts/build/cc/100-gcc.sh index 7085a904..75721db5 100644 --- a/scripts/build/cc/100-gcc.sh +++ b/scripts/build/cc/100-gcc.sh @@ -403,10 +403,17 @@ do_gcc_core_backend() { extra_config+=("--with-system-zlib") fi - # Some versions of gcc have a deffective --enable-multilib. - # Since that's the default, only pass --disable-multilib. + # Some versions of gcc have a defective --enable-multilib. + # Since that's the default, only pass --disable-multilib. For multilib, + # also enable multiarch. Without explicit --enable-multiarch, pass-1 + # compiler is configured as multilib/no-multiarch and pass-2/final + # are multilib/multiarch (because gcc autodetects multiarch based on + # multiple instances of crt*.o in the install directory - which do + # not exist in pass-1). if [ "${CT_MULTILIB}" != "y" ]; then extra_config+=("--disable-multilib") + else + extra_config+=("--enable-multiarch") fi CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'" @@ -880,10 +887,12 @@ do_gcc_backend() { extra_config+=("--with-system-zlib") fi - # Some versions of gcc have a deffective --enable-multilib. + # Some versions of gcc have a defective --enable-multilib. # Since that's the default, only pass --disable-multilib. if [ "${CT_MULTILIB}" != "y" ]; then extra_config+=("--disable-multilib") + else + extra_config+=("--enable-multiarch") fi CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'" -- cgit v1.2.3 From aa30d0bc4fdf6480a5a24c69e5537f8c41011470 Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Fri, 11 Jul 2014 13:39:24 +0100 Subject: gcc: Add --with-multilib-list option Written by Bryan Hundven. Modified by Alexey Neyman to actually add the option to gcc.in. Signed-off-by: Bryan Hundven Signed-off-by: Ray Donnelly Signed-off-by: Alexey Neyman --- config/cc/gcc.in.2 | 10 ++++++++++ scripts/build/cc/100-gcc.sh | 6 ++++++ 2 files changed, 16 insertions(+) (limited to 'scripts/build') diff --git a/config/cc/gcc.in.2 b/config/cc/gcc.in.2 index 17b41ccf..c200d22c 100644 --- a/config/cc/gcc.in.2 +++ b/config/cc/gcc.in.2 @@ -37,6 +37,16 @@ config CC_GCC_EXTRA_CONFIG_ARRAY if they are properly quoted (or escaped, but prefer quotes). Eg.: --with-foo="1st arg with 4 spaces" --with-bar=2nd-arg-without-space +config CC_GCC_MULTILIB_LIST + string + prompt "List of multilib variants" + depends on MULTILIB + help + Architecture-specific option of expanding or restricting the list of + the multilib variants to be built. Refer to GCC installation manual + for the format of this option for a particular architecture. + Leave empty to use the default list for this architecture. + config CC_GCC_TARGET_FINAL bool prompt "Use the default targets all and install for the final compiler" diff --git a/scripts/build/cc/100-gcc.sh b/scripts/build/cc/100-gcc.sh index 75721db5..7bb3610f 100644 --- a/scripts/build/cc/100-gcc.sh +++ b/scripts/build/cc/100-gcc.sh @@ -414,6 +414,9 @@ do_gcc_core_backend() { extra_config+=("--disable-multilib") else extra_config+=("--enable-multiarch") + if [ -n "${CT_CC_GCC_MULTILIB_LIST}" ]; then + extra_config+=("--with-multilib-list=${CT_CC_GCC_MULTILIB_LIST}") + fi fi CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'" @@ -893,6 +896,9 @@ do_gcc_backend() { extra_config+=("--disable-multilib") else extra_config+=("--enable-multiarch") + if [ -n "${CT_CC_GCC_MULTILIB_LIST}" ]; then + extra_config+=("--with-multilib-list=${CT_CC_GCC_MULTILIB_LIST}") + fi fi CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'" -- cgit v1.2.3 From 34ecc718d9d2ea7d391056733d004c68fe7e4bf3 Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Sat, 21 May 2016 13:16:52 -0700 Subject: arch/all: Add common function to return multilib target This code was abstracted out of Cody P Schafer's multilib patch. It doesn't seem right having architecture dependent code in a specific libc implementation script. So this patch breaks it out into scripts/build/arch/.sh in a function: multilib_target_to_build="$(CT_DoArchMultilibTarget 'multi_flags' 'target-in')" Note that this function gets called on each multilib variant with different sets of compiler flags supplied in 'multi_flags'. The caller will first filter the flags so that there is no conflicting flags (e.g., no '-m32 -m64') supplied. Changed by Alexey Neyman: - make option analysis check specific option rather than match global options string as a whole. Moreover, old code did not handle multiple options in the same multilib, e.g. '-m64 -mlittle'. - fixed substitutions in powerpc.sh (*le variants did not match the pattern in the shell parameter expansion) - make s390.sh actually apply the flags it gathered from the options. - straighten the spaghetti in x86.sh by setting two flags, arch & abi. Also, do not depend on "gnu" being the last part - we can have '*-uclibcx32', for example. Signed-off-by: Bryan Hundven Signed-off-by: Ray Donnelly Signed-off-by: Alexey Neyman --- scripts/build/arch/alpha.sh | 11 +++++++++++ scripts/build/arch/arm.sh | 11 +++++++++++ scripts/build/arch/m68k.sh | 11 +++++++++++ scripts/build/arch/microblaze.sh | 11 +++++++++++ scripts/build/arch/mips.sh | 11 +++++++++++ scripts/build/arch/powerpc.sh | 41 ++++++++++++++++++++++++++++++++++++++++ scripts/build/arch/s390.sh | 27 ++++++++++++++++++++++++++ scripts/build/arch/sh.sh | 11 +++++++++++ scripts/build/arch/sparc.sh | 11 +++++++++++ scripts/build/arch/x86.sh | 36 +++++++++++++++++++++++++++++++++++ 10 files changed, 181 insertions(+) (limited to 'scripts/build') diff --git a/scripts/build/arch/alpha.sh b/scripts/build/arch/alpha.sh index cf6d40d9..ffceae3d 100644 --- a/scripts/build/arch/alpha.sh +++ b/scripts/build/arch/alpha.sh @@ -4,3 +4,14 @@ CT_DoArchTupleValues () { # The architecture part of the tuple: CT_TARGET_ARCH="${CT_ARCH}${CT_ARCH_SUFFIX:-${CT_ARCH_ALPHA_VARIANT}}" } + +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + echo "${target}" +} diff --git a/scripts/build/arch/arm.sh b/scripts/build/arch/arm.sh index 5f6ce2fc..338392c3 100644 --- a/scripts/build/arch/arm.sh +++ b/scripts/build/arch/arm.sh @@ -39,3 +39,14 @@ CT_DoArchTupleValues() { CT_TARGET_SYS="${CT_TARGET_SYS}hf" fi } + +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + echo "${target}" +} diff --git a/scripts/build/arch/m68k.sh b/scripts/build/arch/m68k.sh index bf26d1b2..a6eb010e 100644 --- a/scripts/build/arch/m68k.sh +++ b/scripts/build/arch/m68k.sh @@ -3,3 +3,14 @@ CT_DoArchTupleValues() { : } + +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + echo "${target}" +} diff --git a/scripts/build/arch/microblaze.sh b/scripts/build/arch/microblaze.sh index 456a6e3a..93ecc9a2 100644 --- a/scripts/build/arch/microblaze.sh +++ b/scripts/build/arch/microblaze.sh @@ -19,3 +19,14 @@ CT_DoArchTupleValues () { esac } + +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + echo "${target}" +} diff --git a/scripts/build/arch/mips.sh b/scripts/build/arch/mips.sh index 4d732be9..68ad4faa 100644 --- a/scripts/build/arch/mips.sh +++ b/scripts/build/arch/mips.sh @@ -14,3 +14,14 @@ CT_DoArchTupleValues() { CT_ARCH_ABI_CFLAG="-mabi=${CT_ARCH_mips_ABI}" CT_ARCH_WITH_ABI="--with-abi=${CT_ARCH_mips_ABI}" } + +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + echo "${target}" +} diff --git a/scripts/build/arch/powerpc.sh b/scripts/build/arch/powerpc.sh index fbc3120f..77bbc8a2 100644 --- a/scripts/build/arch/powerpc.sh +++ b/scripts/build/arch/powerpc.sh @@ -26,3 +26,44 @@ CT_DoArchTupleValues () { CT_ARCH_CC_EXTRA_CONFIG="--enable-e500_double" fi } +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + local m32=false + local m64=false + local mlittle=false + local mbig=false + + for m in "${multi_flags[@]}"; do + case "$m" in + -m32) m32=true ;; + -m64) m64=true ;; + -mbig) mbig=true ;; + -mlittle) mlittle=true ;; + esac + done + + # Fix up bitness + case "${target}" in + powerpc-*) $m64 && target=${target/#powerpc-/powerpc64-} ;; + powerpcle-*) $m64 && target=${target/#powerpcle-/powerpc64le-} ;; + powerpc64-*) $m32 && target=${target/#powerpc64-/powerpc-} ;; + powerpc64le-*) $m32 && target=${target/#powerpc64le-/powerpcle-} ;; + esac + + # Fix up endianness + case "${target}" in + powerpc-*) $mlittle && target=${target/#powerpc-/powerpcle-} ;; + powerpcle-*) $mbig && target=${target/#powerpcle-/powerpc-} ;; + powerpc64-*) $mlittle && target=${target/#powerpc64-/powerpc64le-} ;; + powerpc64le-*) $mbig && target=${target/#powerpc64le-/powerpc64-} ;; + esac + + # return the target + echo "${target}" +} diff --git a/scripts/build/arch/s390.sh b/scripts/build/arch/s390.sh index b4b8078c..e303420a 100644 --- a/scripts/build/arch/s390.sh +++ b/scripts/build/arch/s390.sh @@ -6,3 +6,30 @@ CT_DoArchTupleValues() { CT_TARGET_ARCH="s390x${CT_ARCH_SUFFIX}" fi } + +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + local m31=false + local m64=false + + for m in "${multi_flags[@]}"; do + case "${multi_flags}" in + -m64) m64=true ;; + -m31) m31=true ;; + esac + done + + # Fix bitness + case "${target}" in + s390-*) $m64 && target=${target/#s390-/s390x-} ;; + s390x-*) $m31 && target=${target/#s390x-/s390-} ;; + esac + + echo "${target}" +} diff --git a/scripts/build/arch/sh.sh b/scripts/build/arch/sh.sh index 7780e40f..e7f4f1a4 100644 --- a/scripts/build/arch/sh.sh +++ b/scripts/build/arch/sh.sh @@ -35,3 +35,14 @@ CT_DoArchTupleValues () { esac CT_ARCH_FLOAT_CFLAG= } + +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + echo "${target}" +} diff --git a/scripts/build/arch/sparc.sh b/scripts/build/arch/sparc.sh index 1cf2acf3..2d3baa35 100644 --- a/scripts/build/arch/sparc.sh +++ b/scripts/build/arch/sparc.sh @@ -16,3 +16,14 @@ CT_DoArchTupleValues() { CT_ARCH_WITH_CPU="--with-cpu=ultrasparc" fi } + +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + echo "${target}" +} diff --git a/scripts/build/arch/x86.sh b/scripts/build/arch/x86.sh index 69407db9..fd7852e9 100644 --- a/scripts/build/arch/x86.sh +++ b/scripts/build/arch/x86.sh @@ -21,3 +21,39 @@ CT_DoArchTupleValues() { fi CT_TARGET_ARCH="${CT_TARGET_ARCH}${CT_ARCH_SUFFIX}" } + +#------------------------------------------------------------------------------ +# Get multilib architecture-specific target +# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple" +CT_DoArchMultilibTarget () +{ + local target="${1}"; shift + local -a multi_flags=( "$@" ) + + local bit32=false + local bit64=false + local abi_dflt=false + local abi_x32=false + + for m in "${multi_flags[@]}"; do + case "$m" in + -m32) bit32=true; abi_dflt=true;; + -m64) bit64=true; abi_dflt=true;; + -mx32) bit64=true; abi_x32=true;; + esac + done + + # Fix up architecture. + case "${target}" in + x86_64-*) $bit32 && target=${target/#x86_64-/i386-} ;; + i[34567]86-*) $bit64 && target=${target/#i[34567]86-/x86_64-} ;; + esac + + # Fix up the ABI part. + case "${target}" in + *x32) $abi_dflt && target=${target/%x32} ;; + *) $abi_x32 && target=${target}x32 ;; + esac + + echo "${target}" +} -- cgit v1.2.3 From 67b314a05156f9af221b807d543030ef9f0dc842 Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Sat, 21 May 2016 13:19:42 -0700 Subject: arch/x86: add a sanity check i[34567]86-*-gnux32 is not a valid tuple. Signed-off-by: Bryan Hundven Signed-off-by: Ray Donnelly Signed-off-by: Alexey Neyman --- scripts/build/arch/x86.sh | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'scripts/build') diff --git a/scripts/build/arch/x86.sh b/scripts/build/arch/x86.sh index fd7852e9..ca0f08bf 100644 --- a/scripts/build/arch/x86.sh +++ b/scripts/build/arch/x86.sh @@ -20,6 +20,17 @@ CT_DoArchTupleValues() { esac fi CT_TARGET_ARCH="${CT_TARGET_ARCH}${CT_ARCH_SUFFIX}" + + # Shouldn't be possible to specify this (CT_TARGET_SYS is not specified by the user, + # it is computed by scripts/functions from libc choices). But trap if such invalid + # values ever come from the caller: + case "${CT_TARGET_ARCH}-${CT_TARGET_SYS}" in + i[34567]86-gnux32) + CT_DoLog ERROR "Invalid CT_TARGET: i[34567]86---gnux32 is invalid." + CT_DoLog ERROR "CT_TARGET: ${CT_TARGET}" + CT_Abort "Go read: https://wiki.debian.org/Multiarch/Tuples" + ;; + esac } #------------------------------------------------------------------------------ -- cgit v1.2.3 From c7da54edf4c2e3a3eb97eb5fb967143e5071a670 Mon Sep 17 00:00:00 2001 From: Ray Donnelly Date: Sat, 12 Apr 2014 13:16:52 +0100 Subject: glibc: Use common arch call to get multilib targets The previous patch added the function 'CT_DoMultilibTarget()' to scripts/build/arch/*.sh. This patch calls the common function to (currently) get just the target tuple for the current multilib target. This patch was originally by: Cody P Schafer Changed by Alexey Neyman: first, try `gcc -print-multiarch`. If it is supported, use whatever it reports. Otherwise, fall back to our guesswork. Move "i486" quirk into glibc.sh, as it is specific to glibc (e.g. uclibc will need i386, which is what GCC reports). Signed-off-by: Bryan Hundven Signed-off-by: Ray Donnelly Signed-off-by: Alexey Neyman --- scripts/build/libc/glibc.sh | 19 ++++++++++++++++++- scripts/functions | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) (limited to 'scripts/build') diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index f8c970da..192a0055 100644 --- a/scripts/build/libc/glibc.sh +++ b/scripts/build/libc/glibc.sh @@ -137,7 +137,7 @@ do_libc_backend() { CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}" - target=${CT_TARGET} + target=$( CT_DoMultilibTarget "${CT_TARGET}" ${extra_flags} ) case "${target}" in # SPARC quirk: glibc 2.23 and newer dropped support for SPARCv8 and # earlier (corresponding pthread barrier code is missing). Until this @@ -147,6 +147,18 @@ do_libc_backend() { target=${target/#sparc-/sparcv9-} fi ;; + # x86 quirk: architecture name is i386, but glibc expects i[4567]86 - to + # indicate the desired optimization. If it was a multilib variant of x86_64, + # then it targets at least NetBurst a.k.a. i786, but we'll follow arch/x86.sh + # and set the optimization to i686. Otherwise, replace with the most + # conservative choice, i486. + i386-*) + if [ "${CT_TARGET_ARCH}" = "x86_64" ]; then + target=${target/#i386-/i686-} + else + target=${target/#i386-/i486-} + fi + ;; esac do_libc_backend_once extra_dir="${extra_dir}" \ @@ -193,6 +205,7 @@ do_libc_backend() { # libc_full : Build full libc : bool : n # extra_flags : Extra CFLAGS to use (for multilib) : string : (empty) # extra_dir : Extra subdir for multilib : string : (empty) +# target : Build libc using this target (for multilib) : string : ${CT_TARGET} do_libc_backend_once() { local libc_headers local libc_startfiles @@ -213,6 +226,10 @@ do_libc_backend_once() { eval "${arg// /\\ }" done + if [ "${target}" = "" ]; then + target="${CT_TARGET}" + fi + CT_DoLog EXTRA "Configuring C library" case "${CT_LIBC}" in diff --git a/scripts/functions b/scripts/functions index 70c1ba61..62d264e3 100644 --- a/scripts/functions +++ b/scripts/functions @@ -1305,6 +1305,25 @@ CT_DoBuildTargetTuple() { CT_ARCH_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_ARCH_ENDIAN_LDFLAG}" } +# This function determines the target tuple for a given set of compiler +# flags, using either GCC's multiarch feature (if supported; if not, +# GCC prints nothing and exits with status 0), falling back to calling +# the architecture-specific functions. +CT_DoMultilibTarget() { + local target="$1"; shift + local -a multi_flags=( "$@" ) + local gcc_multiarch + + gcc_multiarch=$( "${CT_TARGET}-gcc" -print-multiarch "${multi_flags[@]}" ) + if [ -n "${gcc_multiarch}" ]; then + echo "${gcc_multiarch}" + return + fi + + # Fall back to arch-specific guesswork + CT_DoArchMultilibTarget "${target}" "${multi_flags[@]}" +} + # This function does pause the build until the user strikes "Return" # Usage: CT_DoPause [optional_message] CT_DoPause() { -- cgit v1.2.3 From dc8f2d1c04258069101e913d22c898298b98384c Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Sat, 21 May 2016 16:53:19 -0700 Subject: glibc.sh: build dummy libc.so with correct extra flags Signed-off-by: Alexey Neyman --- scripts/build/libc/glibc.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'scripts/build') diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index 192a0055..472acad4 100644 --- a/scripts/build/libc/glibc.sh +++ b/scripts/build/libc/glibc.sh @@ -475,7 +475,8 @@ do_libc_backend_once() { # However, since we will never actually execute its code, # it doesn't matter what it contains. So, treating '/dev/null' # as a C source file, we produce a dummy 'libc.so' in one step - CT_DoExecLog ALL "${cross_cc}" -nostdlib \ + CT_DoExecLog ALL "${cross_cc}" ${extra_flags} \ + -nostdlib \ -nostartfiles \ -shared \ -x c /dev/null \ -- cgit v1.2.3