diff options
Diffstat (limited to 'scripts/build/arch/x86.sh')
-rw-r--r-- | scripts/build/arch/x86.sh | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/scripts/build/arch/x86.sh b/scripts/build/arch/x86.sh index 69407db9..ca0f08bf 100644 --- a/scripts/build/arch/x86.sh +++ b/scripts/build/arch/x86.sh @@ -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}" } |