mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2025-04-10 20:59:56 +00:00
Merge pull request #403 from stilor/multilib-1
First chunk of multilib changes for merging
This commit is contained in:
commit
6e7c61650a
@ -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/
|
||||
|
@ -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"
|
||||
|
@ -1,6 +1,7 @@
|
||||
# musl options
|
||||
|
||||
## depends on ! WINDOWS && ! BARE_METAL
|
||||
## depends on EXPERIMENTAL
|
||||
##
|
||||
## select LIBC_SUPPORT_THREADS_NATIVE
|
||||
## select CC_CORE_PASSES_NEEDED
|
||||
|
@ -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}"
|
||||
}
|
||||
|
@ -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}"
|
||||
}
|
||||
|
@ -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}"
|
||||
}
|
||||
|
@ -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}"
|
||||
}
|
||||
|
@ -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}"
|
||||
}
|
||||
|
@ -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}"
|
||||
}
|
||||
|
@ -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}"
|
||||
}
|
||||
|
@ -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}"
|
||||
}
|
||||
|
@ -2,4 +2,28 @@
|
||||
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
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Get multilib architecture-specific target
|
||||
# Usage: CT_DoArchMultilibTarget "multilib flags" "target tuple"
|
||||
CT_DoArchMultilibTarget ()
|
||||
{
|
||||
local target="${1}"; shift
|
||||
local -a multi_flags=( "$@" )
|
||||
|
||||
echo "${target}"
|
||||
}
|
||||
|
@ -20,4 +20,51 @@ 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-<vendor>-<os>-gnux32 is invalid."
|
||||
CT_DoLog ERROR "CT_TARGET: ${CT_TARGET}"
|
||||
CT_Abort "Go read: https://wiki.debian.org/Multiarch/Tuples"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# 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}"
|
||||
}
|
||||
|
@ -403,10 +403,20 @@ 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")
|
||||
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[*]}'"
|
||||
@ -880,10 +890,15 @@ 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")
|
||||
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[*]}'"
|
||||
|
@ -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
|
||||
@ -288,12 +305,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}"
|
||||
;;
|
||||
@ -458,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 \
|
||||
|
@ -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() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user