From 08d91d41f3c0bceed264a24920b4daa98fa18b9a Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Thu, 17 Mar 2016 22:54:43 -0700 Subject: musl: config is broken for !EXPERIMENTAL If EXPERIMENTAL is not set, the only choice for version is the set of released versions - currently, 1.1.14. But this only option is disabled because it is also marked EXPERIMENTAL; this leaves no available choices in the configuration. Marking MUSL as experimental: it seems to have header issues which prevent, for example, gdbserver from building. musl copied chunks of ptrace.h code from the kernel into its own headers, which now clash with Linux kernel headers. Manifests at least on SH4 target. Also, musl breaks in powerpc builds: GCC balks at it with "unsupported DEFAULT_LIBC" message. Also, 64-bit powerpc and mips are not supported. So, until someone figures out the dependencies for musl in config/, mark it experimental. Signed-off-by: Alexey Neyman diff --git a/config/libc/musl.in b/config/libc/musl.in index 00d98ea..ff84448 100644 --- a/config/libc/musl.in +++ b/config/libc/musl.in @@ -1,6 +1,7 @@ # musl options ## depends on ! WINDOWS && ! BARE_METAL +## depends on EXPERIMENTAL ## ## select LIBC_SUPPORT_THREADS_NATIVE ## select CC_CORE_PASSES_NEEDED -- cgit v0.10.2-6-g49f6 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 diff --git a/scripts/build/arch/sparc.sh b/scripts/build/arch/sparc.sh index e3e7491..1cf2acf 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 v0.10.2-6-g49f6 From a49e13fb4edeefba406d98754fb0ca04b707ff4c Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Sat, 19 Mar 2016 15:56:26 -0700 Subject: sh: require multilib Now that libc backend installs the libraries into the directory reported by gcc as 'multi-os-directory', sh4 libraries are installed into a '!m4' subdirectory. This directory then confuses GNU ld, which assumes the exclamation mark to be a word separator and attempts to link to '/usr/lib' (a directory). However, if multilib is enabled, the default libraries are installed into the [expected] '/usr/lib/./'. This looks like an artifact of SuperH's unique way of specifying the multilibs to be built in GCC (which may list exclusions, starting with '!'). Signed-off-by: Alexey Neyman diff --git a/config/arch/sh.in b/config/arch/sh.in index 68d3120..60de313 100644 --- a/config/arch/sh.in +++ b/config/arch/sh.in @@ -5,6 +5,7 @@ ## select ARCH_USE_MMU ## select ARCH_SUPPORTS_BOTH_ENDIAN ## select ARCH_DEFAULT_LE +## select ARCH_REQUIRES_MULTILIB ## ## help The Super-H architecture, as defined by: ## help http://www.renesas.com/fmwk.jsp?cnt=superh_family_landing.jsp&fp=/products/mpumcu/superh_family/ -- cgit v0.10.2-6-g49f6 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 diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index 013c6eb..f8c970d 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 v0.10.2-6-g49f6 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 diff --git a/scripts/build/cc/100-gcc.sh b/scripts/build/cc/100-gcc.sh index 7085a90..75721db 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 v0.10.2-6-g49f6 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 diff --git a/config/cc/gcc.in.2 b/config/cc/gcc.in.2 index 17b41cc..c200d22 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 75721db..7bb3610 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 v0.10.2-6-g49f6 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 diff --git a/scripts/build/arch/alpha.sh b/scripts/build/arch/alpha.sh index cf6d40d..ffceae3 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 5f6ce2f..338392c 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 bf26d1b..a6eb010 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 456a6e3..93ecc9a 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 4d732be..68ad4fa 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 fbc3120..77bbc8a 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 b4b8078..e303420 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 7780e40..e7f4f1a 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 1cf2acf..2d3baa3 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 69407db..fd7852e 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 v0.10.2-6-g49f6 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 diff --git a/scripts/build/arch/x86.sh b/scripts/build/arch/x86.sh index fd7852e..ca0f08b 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 v0.10.2-6-g49f6 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 diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index f8c970d..192a005 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 70c1ba6..62d264e 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 v0.10.2-6-g49f6 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 diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh index 192a005..472acad 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 v0.10.2-6-g49f6