2007-08-15 10:14:43 +00:00
|
|
|
# This file adds the function to build the gcc C compiler
|
2007-02-24 11:00:05 +00:00
|
|
|
# Copyright 2007 Yann E. MORIN
|
|
|
|
# Licensed under the GPL v2. See COPYING in the root of this package
|
|
|
|
|
2008-04-30 10:43:41 +00:00
|
|
|
# Download gcc
|
2015-05-29 20:40:54 +00:00
|
|
|
do_gcc_get() {
|
2014-12-09 06:32:19 +00:00
|
|
|
local linaro_version=""
|
|
|
|
local linaro_series=""
|
2012-10-29 23:30:47 +00:00
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
if [ "${CT_CC_GCC_CUSTOM}" = "y" ]; then
|
2015-11-26 13:06:21 +00:00
|
|
|
CT_GetCustom "gcc" "${CT_CC_GCC_CUSTOM_VERSION}" \
|
|
|
|
"${CT_CC_GCC_CUSTOM_LOCATION}"
|
2012-08-22 19:26:10 +00:00
|
|
|
else
|
2017-01-12 06:20:46 +00:00
|
|
|
case "${CT_CC_GCC_VERSION}" in
|
|
|
|
linaro-*)
|
|
|
|
CT_GetLinaro "gcc" "${CT_CC_GCC_VERSION}"
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
# The official gcc hosts put gcc under a gcc/release/ directory,
|
|
|
|
# whereas the mirrors put it in the gcc/ directory.
|
|
|
|
CT_GetFile "gcc-${CT_CC_GCC_VERSION}" \
|
|
|
|
{http,ftp,https}://ftp.gnu.org/gnu/gcc/gcc-${CT_CC_GCC_VERSION} \
|
|
|
|
ftp://{gcc.gnu.org,sourceware.org}/pub/gcc/releases/gcc-${CT_CC_GCC_VERSION}
|
|
|
|
;;
|
|
|
|
esac
|
2012-10-29 23:30:47 +00:00
|
|
|
fi # ! custom location
|
2009-01-06 22:10:17 +00:00
|
|
|
# Starting with GCC 4.3, ecj is used for Java, and will only be
|
|
|
|
# built if the configure script finds ecj.jar at the top of the
|
|
|
|
# GCC source tree, which will not be there unless we get it and
|
|
|
|
# put it there ourselves
|
|
|
|
if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y" ]; then
|
2015-02-02 04:55:45 +00:00
|
|
|
CT_GetFile ecj-latest .jar http://mirrors.kernel.org/sourceware/java/ \
|
|
|
|
http://crosstool-ng.org/pub/java \
|
|
|
|
ftp://gcc.gnu.org/pub/java \
|
2009-01-06 22:10:17 +00:00
|
|
|
ftp://sourceware.org/pub/java
|
|
|
|
fi
|
2007-05-07 09:04:02 +00:00
|
|
|
}
|
|
|
|
|
2008-04-30 10:43:41 +00:00
|
|
|
# Extract gcc
|
2015-05-29 20:40:54 +00:00
|
|
|
do_gcc_extract() {
|
|
|
|
CT_Extract "gcc-${CT_CC_GCC_VERSION}"
|
|
|
|
CT_Patch "gcc" "${CT_CC_GCC_VERSION}"
|
2009-03-26 18:47:34 +00:00
|
|
|
|
2009-01-06 22:10:17 +00:00
|
|
|
# Copy ecj-latest.jar to ecj.jar at the top of the GCC source tree
|
2009-05-25 20:09:17 +00:00
|
|
|
if [ "${CT_CC_LANG_JAVA_USE_ECJ}" = "y" \
|
2015-05-29 20:40:54 +00:00
|
|
|
-a ! -f "${CT_SRC_DIR}/gcc-${CT_CC_GCC_VERSION}/ecj.jar" \
|
2009-03-15 20:08:06 +00:00
|
|
|
]; then
|
2015-05-29 20:40:54 +00:00
|
|
|
CT_DoExecLog ALL cp -v "${CT_TARBALLS_DIR}/ecj-latest.jar" "${CT_SRC_DIR}/gcc-${CT_CC_GCC_VERSION}/ecj.jar"
|
2009-01-06 22:10:17 +00:00
|
|
|
fi
|
2013-07-24 22:10:47 +00:00
|
|
|
|
|
|
|
if [ -n "${CT_ARCH_XTENSA_CUSTOM_NAME}" ]; then
|
|
|
|
CT_ConfigureXtensa "gcc" "${CT_CC_GCC_VERSION}"
|
|
|
|
fi
|
2007-05-07 09:04:02 +00:00
|
|
|
}
|
|
|
|
|
2011-08-15 19:42:28 +00:00
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
# This function builds up the set of languages to enable
|
|
|
|
# No argument expected, returns the comma-separated language list on stdout
|
|
|
|
cc_gcc_lang_list() {
|
|
|
|
local lang_list
|
|
|
|
|
|
|
|
lang_list="c"
|
|
|
|
[ "${CT_CC_LANG_CXX}" = "y" ] && lang_list+=",c++"
|
|
|
|
[ "${CT_CC_LANG_FORTRAN}" = "y" ] && lang_list+=",fortran"
|
|
|
|
[ "${CT_CC_LANG_ADA}" = "y" ] && lang_list+=",ada"
|
|
|
|
[ "${CT_CC_LANG_JAVA}" = "y" ] && lang_list+=",java"
|
|
|
|
[ "${CT_CC_LANG_OBJC}" = "y" ] && lang_list+=",objc"
|
|
|
|
[ "${CT_CC_LANG_OBJCXX}" = "y" ] && lang_list+=",obj-c++"
|
2013-11-08 14:18:09 +00:00
|
|
|
[ "${CT_CC_LANG_GOLANG}" = "y" ] && lang_list+=",go"
|
2011-08-15 19:42:28 +00:00
|
|
|
lang_list+="${CT_CC_LANG_OTHERS:+,${CT_CC_LANG_OTHERS}}"
|
|
|
|
|
|
|
|
printf "%s" "${lang_list}"
|
|
|
|
}
|
|
|
|
|
multilib: Determine which options may pass through.
On some arches (e.g. MIPS) the options like -mabi do not work if
specified more than once (see the comment in 100-gcc.sh). Therefore,
we need to determine which of the options produced by <arch>.sh can
be passed to multilib builds and which must be removed (i.e., which
options vary among the multilibs).
This presents a chicken-and-egg problem. GCC developers, in their
infinite wisdom, do not allow arbitrary multilib specification to be
supplied to GCC's configure. Instead, the target (and sometimes some
extra options) determine the set of multilibs - which may include
different CPUs, different ABIs, different endianness, different FPUs,
different floating-point ABIs, ... That is, we don't know which parts
vary until we build GCC and ask it.
So, the solution implemented here is:
- For multilib builds, start with empty CT_ARCH_TARGET_CFLAGS/LDFLAGS.
- For multilib builds, require core pass 1. Pass 1 does not build any
target binaries, so at that point, our target options have not been
used yet.
- Provide an API to modify the environment variables for the steps that
follow the current one.
- As a part of multilib-related housekeeping, determine the variable
part of multilibs and filter out these options; pass the rest into
CT_TARGET_CFLAGS/LDFLAGS.
This still does not handle extra dependencies between GCC options (like
-ma implying -mcpu=X -mtune=Y, etc.) but I feel that would complicate
matters too much. Let's leave this until there's a compelling case for
it.
Also, query GCC's sysroot suffix for targets that use it (SuperH,
for example) - the default multilib may not work if the command line
specifies the default option explicitly (%sysroot_suffix_spec is not
aware of multilib defaults).
Signed-off-by: Alexey Neyman <stilor@att.net>
2016-03-30 19:15:54 +00:00
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
# Report the type of a GCC option
|
|
|
|
cc_gcc_classify_opt() {
|
|
|
|
# Options present in multiple architectures
|
|
|
|
case "${1}" in
|
|
|
|
-march=*) echo "arch"; return;;
|
|
|
|
-mabi=*) echo "abi"; return;;
|
|
|
|
-mcpu=*|-mmcu=*) echo "cpu"; return;;
|
|
|
|
-mtune=*) echo "tune"; return;;
|
|
|
|
-mfpu=*) echo "fpu"; return;;
|
|
|
|
-mhard-float|-msoft-float|-mno-soft-float|-mno-float|-mfloat-abi=*|\
|
|
|
|
-mfpu|-mno-fpu) echo "float"; return;;
|
|
|
|
-EB|-EL|-mbig-endian|-mlittle-endian|-mbig|-mlittle|-meb|-mel|-mb|-ml) echo "endian"; return;;
|
|
|
|
-mthumb|-marm) echo "mode"; return;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# Arch-specific options and aliases
|
|
|
|
case "${CT_ARCH}" in
|
|
|
|
m68k)
|
|
|
|
case "${1}" in
|
|
|
|
-m68881) echo "float"; return;;
|
|
|
|
-m5[234]*|-mcfv4e) echo "cpu"; return;;
|
|
|
|
-m68*|-mc68*) echo "arch"; return;;
|
|
|
|
esac
|
|
|
|
;;
|
|
|
|
mips)
|
|
|
|
case "${1}" in
|
|
|
|
-mips[1234]|-mips32|-mips32r*|-mips64|-mips64r*) echo "cpu"; return;;
|
|
|
|
esac
|
|
|
|
;;
|
|
|
|
sh)
|
|
|
|
case "${1}" in
|
|
|
|
-m[12345]*) echo "cpu"; return;;
|
|
|
|
esac
|
|
|
|
esac
|
|
|
|
|
|
|
|
# All tried and failed
|
|
|
|
echo "unknown"
|
|
|
|
}
|
|
|
|
|
2017-03-17 07:33:52 +00:00
|
|
|
evaluate_multilib_cflags()
|
|
|
|
{
|
|
|
|
local multi_dir multi_os_dir multi_os_dir_gcc multi_root multi_flags multi_index multi_count
|
|
|
|
local mdir mdir_os dirtop
|
|
|
|
local f
|
|
|
|
|
|
|
|
for arg in "$@"; do
|
|
|
|
eval "${arg// /\\ }"
|
|
|
|
done
|
|
|
|
|
|
|
|
mdir="lib/${multi_dir}"
|
|
|
|
mdir_os="lib/${multi_os_dir_gcc}"
|
|
|
|
CT_SanitizeVarDir mdir mdir_os
|
|
|
|
CT_DoLog EXTRA " '${multi_flags}' --> ${mdir} (gcc) ${mdir_os} (os)"
|
|
|
|
for f in ${multi_flags}; do
|
|
|
|
eval ml_`cc_gcc_classify_opt ${f}`=seen
|
|
|
|
done
|
2017-03-23 16:13:51 +00:00
|
|
|
if [ "${CT_DEMULTILIB}" = "y" -a "${CT_USE_SYSROOT}" = "y" ]; then
|
2017-03-17 07:33:52 +00:00
|
|
|
case "${mdir_os}" in
|
|
|
|
lib/*)
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
dirtop="${mdir_os%%/*}"
|
|
|
|
if [ ! -e "${multi_root}/${mdir_os}" ]; then
|
|
|
|
CT_DoExecLog ALL ln -sfv lib "${multi_root}/${mdir_os}"
|
|
|
|
fi
|
|
|
|
if [ ! -e "${multi_root}/usr/${mdir_os}" ]; then
|
|
|
|
CT_DoExecLog ALL ln -sfv lib "${multi_root}/usr/${mdir_os}"
|
|
|
|
fi
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
multilib: Determine which options may pass through.
On some arches (e.g. MIPS) the options like -mabi do not work if
specified more than once (see the comment in 100-gcc.sh). Therefore,
we need to determine which of the options produced by <arch>.sh can
be passed to multilib builds and which must be removed (i.e., which
options vary among the multilibs).
This presents a chicken-and-egg problem. GCC developers, in their
infinite wisdom, do not allow arbitrary multilib specification to be
supplied to GCC's configure. Instead, the target (and sometimes some
extra options) determine the set of multilibs - which may include
different CPUs, different ABIs, different endianness, different FPUs,
different floating-point ABIs, ... That is, we don't know which parts
vary until we build GCC and ask it.
So, the solution implemented here is:
- For multilib builds, start with empty CT_ARCH_TARGET_CFLAGS/LDFLAGS.
- For multilib builds, require core pass 1. Pass 1 does not build any
target binaries, so at that point, our target options have not been
used yet.
- Provide an API to modify the environment variables for the steps that
follow the current one.
- As a part of multilib-related housekeeping, determine the variable
part of multilibs and filter out these options; pass the rest into
CT_TARGET_CFLAGS/LDFLAGS.
This still does not handle extra dependencies between GCC options (like
-ma implying -mcpu=X -mtune=Y, etc.) but I feel that would complicate
matters too much. Let's leave this until there's a compelling case for
it.
Also, query GCC's sysroot suffix for targets that use it (SuperH,
for example) - the default multilib may not work if the command line
specifies the default option explicitly (%sysroot_suffix_spec is not
aware of multilib defaults).
Signed-off-by: Alexey Neyman <stilor@att.net>
2016-03-30 19:15:54 +00:00
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
# This function lists the multilibs configured in the compiler (even if multilib
|
|
|
|
# is disabled - so that it lists the default GCC/OS directory, which may differ
|
|
|
|
# from the default 'lib'). It then performs a few multilib checks/quirks:
|
|
|
|
#
|
2017-03-27 06:32:27 +00:00
|
|
|
# 1. On MIPS target, gcc (or rather, ld, which it invokes under the hood) chokes
|
multilib: Determine which options may pass through.
On some arches (e.g. MIPS) the options like -mabi do not work if
specified more than once (see the comment in 100-gcc.sh). Therefore,
we need to determine which of the options produced by <arch>.sh can
be passed to multilib builds and which must be removed (i.e., which
options vary among the multilibs).
This presents a chicken-and-egg problem. GCC developers, in their
infinite wisdom, do not allow arbitrary multilib specification to be
supplied to GCC's configure. Instead, the target (and sometimes some
extra options) determine the set of multilibs - which may include
different CPUs, different ABIs, different endianness, different FPUs,
different floating-point ABIs, ... That is, we don't know which parts
vary until we build GCC and ask it.
So, the solution implemented here is:
- For multilib builds, start with empty CT_ARCH_TARGET_CFLAGS/LDFLAGS.
- For multilib builds, require core pass 1. Pass 1 does not build any
target binaries, so at that point, our target options have not been
used yet.
- Provide an API to modify the environment variables for the steps that
follow the current one.
- As a part of multilib-related housekeeping, determine the variable
part of multilibs and filter out these options; pass the rest into
CT_TARGET_CFLAGS/LDFLAGS.
This still does not handle extra dependencies between GCC options (like
-ma implying -mcpu=X -mtune=Y, etc.) but I feel that would complicate
matters too much. Let's leave this until there's a compelling case for
it.
Also, query GCC's sysroot suffix for targets that use it (SuperH,
for example) - the default multilib may not work if the command line
specifies the default option explicitly (%sysroot_suffix_spec is not
aware of multilib defaults).
Signed-off-by: Alexey Neyman <stilor@att.net>
2016-03-30 19:15:54 +00:00
|
|
|
# if supplied with two -mabi=* options. I.e., 'gcc -mabi=n32' and 'gcc -mabi=32' both
|
|
|
|
# work, but 'gcc -mabi=32 -mabi=n32' produces an internal error in ld. Thus we do
|
|
|
|
# not supply target's CFLAGS in multilib builds - and after compiling pass-1 gcc,
|
|
|
|
# attempt to determine which CFLAGS need to be filtered out.
|
2017-03-17 07:33:52 +00:00
|
|
|
#
|
2017-03-27 06:32:27 +00:00
|
|
|
# 2. If "demultilibing" is in effect, create top-level directories for any
|
2017-03-17 07:33:52 +00:00
|
|
|
# multilibs not in lib/ as symlinks to lib.
|
multilib: Determine which options may pass through.
On some arches (e.g. MIPS) the options like -mabi do not work if
specified more than once (see the comment in 100-gcc.sh). Therefore,
we need to determine which of the options produced by <arch>.sh can
be passed to multilib builds and which must be removed (i.e., which
options vary among the multilibs).
This presents a chicken-and-egg problem. GCC developers, in their
infinite wisdom, do not allow arbitrary multilib specification to be
supplied to GCC's configure. Instead, the target (and sometimes some
extra options) determine the set of multilibs - which may include
different CPUs, different ABIs, different endianness, different FPUs,
different floating-point ABIs, ... That is, we don't know which parts
vary until we build GCC and ask it.
So, the solution implemented here is:
- For multilib builds, start with empty CT_ARCH_TARGET_CFLAGS/LDFLAGS.
- For multilib builds, require core pass 1. Pass 1 does not build any
target binaries, so at that point, our target options have not been
used yet.
- Provide an API to modify the environment variables for the steps that
follow the current one.
- As a part of multilib-related housekeeping, determine the variable
part of multilibs and filter out these options; pass the rest into
CT_TARGET_CFLAGS/LDFLAGS.
This still does not handle extra dependencies between GCC options (like
-ma implying -mcpu=X -mtune=Y, etc.) but I feel that would complicate
matters too much. Let's leave this until there's a compelling case for
it.
Also, query GCC's sysroot suffix for targets that use it (SuperH,
for example) - the default multilib may not work if the command line
specifies the default option explicitly (%sysroot_suffix_spec is not
aware of multilib defaults).
Signed-off-by: Alexey Neyman <stilor@att.net>
2016-03-30 19:15:54 +00:00
|
|
|
cc_gcc_multilib_housekeeping() {
|
|
|
|
local cc host
|
|
|
|
local ml_arch ml_abi ml_cpu ml_tune ml_fpu ml_float ml_endian ml_mode ml_unknown ml
|
|
|
|
local new_cflags
|
|
|
|
|
|
|
|
for arg in "$@"; do
|
|
|
|
eval "${arg// /\\ }"
|
|
|
|
done
|
|
|
|
|
|
|
|
if [ \( "${CT_CANADIAN}" = "y" -o "${CT_CROSS_NATIVE}" = "y" \) -a "${host}" = "${CT_HOST}" ]; then
|
|
|
|
CT_DoLog EXTRA "Canadian Cross/Cross-native unable to confirm multilibs configuration "\
|
|
|
|
"directly; will use build-compiler for housekeeping."
|
|
|
|
# Since we cannot run the desired compiler, substitute build-CC with the assumption
|
|
|
|
# that the host-CC is configured in the same way.
|
2017-01-14 05:24:16 +00:00
|
|
|
cc="${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${CT_CC}"
|
multilib: Determine which options may pass through.
On some arches (e.g. MIPS) the options like -mabi do not work if
specified more than once (see the comment in 100-gcc.sh). Therefore,
we need to determine which of the options produced by <arch>.sh can
be passed to multilib builds and which must be removed (i.e., which
options vary among the multilibs).
This presents a chicken-and-egg problem. GCC developers, in their
infinite wisdom, do not allow arbitrary multilib specification to be
supplied to GCC's configure. Instead, the target (and sometimes some
extra options) determine the set of multilibs - which may include
different CPUs, different ABIs, different endianness, different FPUs,
different floating-point ABIs, ... That is, we don't know which parts
vary until we build GCC and ask it.
So, the solution implemented here is:
- For multilib builds, start with empty CT_ARCH_TARGET_CFLAGS/LDFLAGS.
- For multilib builds, require core pass 1. Pass 1 does not build any
target binaries, so at that point, our target options have not been
used yet.
- Provide an API to modify the environment variables for the steps that
follow the current one.
- As a part of multilib-related housekeeping, determine the variable
part of multilibs and filter out these options; pass the rest into
CT_TARGET_CFLAGS/LDFLAGS.
This still does not handle extra dependencies between GCC options (like
-ma implying -mcpu=X -mtune=Y, etc.) but I feel that would complicate
matters too much. Let's leave this until there's a compelling case for
it.
Also, query GCC's sysroot suffix for targets that use it (SuperH,
for example) - the default multilib may not work if the command line
specifies the default option explicitly (%sysroot_suffix_spec is not
aware of multilib defaults).
Signed-off-by: Alexey Neyman <stilor@att.net>
2016-03-30 19:15:54 +00:00
|
|
|
fi
|
|
|
|
|
2017-03-17 07:33:52 +00:00
|
|
|
CT_IterateMultilibs evaluate_multilib_cflags evaluate_cflags
|
multilib: Determine which options may pass through.
On some arches (e.g. MIPS) the options like -mabi do not work if
specified more than once (see the comment in 100-gcc.sh). Therefore,
we need to determine which of the options produced by <arch>.sh can
be passed to multilib builds and which must be removed (i.e., which
options vary among the multilibs).
This presents a chicken-and-egg problem. GCC developers, in their
infinite wisdom, do not allow arbitrary multilib specification to be
supplied to GCC's configure. Instead, the target (and sometimes some
extra options) determine the set of multilibs - which may include
different CPUs, different ABIs, different endianness, different FPUs,
different floating-point ABIs, ... That is, we don't know which parts
vary until we build GCC and ask it.
So, the solution implemented here is:
- For multilib builds, start with empty CT_ARCH_TARGET_CFLAGS/LDFLAGS.
- For multilib builds, require core pass 1. Pass 1 does not build any
target binaries, so at that point, our target options have not been
used yet.
- Provide an API to modify the environment variables for the steps that
follow the current one.
- As a part of multilib-related housekeeping, determine the variable
part of multilibs and filter out these options; pass the rest into
CT_TARGET_CFLAGS/LDFLAGS.
This still does not handle extra dependencies between GCC options (like
-ma implying -mcpu=X -mtune=Y, etc.) but I feel that would complicate
matters too much. Let's leave this until there's a compelling case for
it.
Also, query GCC's sysroot suffix for targets that use it (SuperH,
for example) - the default multilib may not work if the command line
specifies the default option explicitly (%sysroot_suffix_spec is not
aware of multilib defaults).
Signed-off-by: Alexey Neyman <stilor@att.net>
2016-03-30 19:15:54 +00:00
|
|
|
|
|
|
|
# Filtering out some of the options provided in CT-NG config. Then *prepend*
|
|
|
|
# them to CT_TARGET_CFLAGS, like scripts/crosstool-NG.sh does. Zero out
|
|
|
|
# the stashed MULTILIB flags so that we don't process them again in the passes
|
|
|
|
# that follow.
|
|
|
|
CT_DoLog DEBUG "Configured target CFLAGS: '${CT_ARCH_TARGET_CFLAGS_MULTILIB}'"
|
|
|
|
ml_unknown= # Pass through anything we don't know about
|
|
|
|
for f in ${CT_ARCH_TARGET_CFLAGS_MULTILIB}; do
|
|
|
|
eval ml=\$ml_`cc_gcc_classify_opt ${f}`
|
|
|
|
if [ "${ml}" != "seen" ]; then
|
|
|
|
new_cflags="${new_cflags} ${f}"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
CT_DoLog DEBUG "Filtered target CFLAGS: '${new_cflags}'"
|
|
|
|
CT_EnvModify CT_TARGET_CFLAGS "${new_cflags} ${CT_TARGET_CFLAGS}"
|
|
|
|
CT_EnvModify CT_ARCH_TARGET_CFLAGS_MULTILIB ""
|
|
|
|
|
|
|
|
# Currently, the only LDFLAGS are endianness-related
|
|
|
|
CT_DoLog DEBUG "Configured target LDFLAGS: '${CT_ARCH_TARGET_LDFLAGS_MULTILIB}'"
|
|
|
|
if [ "${ml_endian}" != "seen" ]; then
|
|
|
|
CT_EnvModify CT_TARGET_LDFLAGS "${CT_ARCH_TARGET_LDFLAGS_MULTILIB} ${CT_TARGET_LDFLAGS}"
|
|
|
|
CT_EnvModify CT_ARCH_TARGET_LDFLAGS_MULTILIB ""
|
|
|
|
fi
|
|
|
|
CT_DoLog DEBUG "Filtered target LDFLAGS: '${CT_ARCH_TARGET_LDFLAGS_MULTILIB}'"
|
|
|
|
}
|
|
|
|
|
2007-08-15 10:14:43 +00:00
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
# Core gcc pass 1
|
2015-05-29 20:40:54 +00:00
|
|
|
do_gcc_core_pass_1() {
|
2011-07-17 13:48:27 +00:00
|
|
|
local -a core_opts
|
|
|
|
|
2014-05-05 21:24:05 +00:00
|
|
|
if [ "${CT_CC_CORE_PASS_1_NEEDED}" != "y" ]; then
|
2012-11-22 22:56:58 +00:00
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
2012-08-04 21:15:02 +00:00
|
|
|
core_opts+=( "mode=static" )
|
|
|
|
core_opts+=( "host=${CT_BUILD}" )
|
|
|
|
core_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
|
|
|
|
core_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
|
2016-11-29 06:47:42 +00:00
|
|
|
core_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" )
|
|
|
|
core_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" )
|
2012-08-04 21:15:02 +00:00
|
|
|
core_opts+=( "lang_list=c" )
|
2015-09-21 20:37:17 +00:00
|
|
|
core_opts+=( "build_step=core1" )
|
2011-07-17 13:48:27 +00:00
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
CT_DoStep INFO "Installing pass-1 core C gcc compiler"
|
|
|
|
CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-gcc-core-pass-1"
|
2011-07-24 17:35:24 +00:00
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
do_gcc_core_backend "${core_opts[@]}"
|
2011-07-24 17:35:24 +00:00
|
|
|
|
2012-08-01 17:07:37 +00:00
|
|
|
CT_Popd
|
|
|
|
CT_EndStep
|
2007-08-15 10:14:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Core gcc pass 2
|
2015-05-29 20:40:54 +00:00
|
|
|
do_gcc_core_pass_2() {
|
2011-07-17 13:48:27 +00:00
|
|
|
local -a core_opts
|
|
|
|
|
2014-05-05 21:24:05 +00:00
|
|
|
if [ "${CT_CC_CORE_PASS_2_NEEDED}" != "y" ]; then
|
2012-11-22 22:56:58 +00:00
|
|
|
return 0
|
|
|
|
fi
|
|
|
|
|
2011-07-25 17:04:00 +00:00
|
|
|
# Common options:
|
|
|
|
core_opts+=( "host=${CT_BUILD}" )
|
2012-01-01 16:49:44 +00:00
|
|
|
core_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
|
2011-07-25 17:04:17 +00:00
|
|
|
core_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
|
2016-11-29 06:47:42 +00:00
|
|
|
core_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" )
|
|
|
|
core_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" )
|
2011-08-15 20:52:51 +00:00
|
|
|
core_opts+=( "lang_list=c" )
|
2015-09-21 20:37:17 +00:00
|
|
|
core_opts+=( "build_step=core2" )
|
2011-07-25 17:04:00 +00:00
|
|
|
|
|
|
|
# Different conditions are at stake here:
|
|
|
|
# - In case the threading model is NPTL, we need a shared-capable core
|
|
|
|
# gcc; in all other cases, we need a static-only core gcc.
|
|
|
|
# - In case the threading model is NPTL or win32, or gcc is 4.3 or
|
|
|
|
# later, we need to build libgcc
|
2012-01-03 21:57:25 +00:00
|
|
|
case "${CT_THREADS}" in
|
|
|
|
nptl)
|
2011-07-17 13:48:27 +00:00
|
|
|
core_opts+=( "mode=shared" )
|
|
|
|
core_opts+=( "build_libgcc=yes" )
|
2008-09-30 18:19:18 +00:00
|
|
|
;;
|
2012-01-03 21:57:25 +00:00
|
|
|
win32)
|
2011-07-17 13:48:27 +00:00
|
|
|
core_opts+=( "mode=static" )
|
|
|
|
core_opts+=( "build_libgcc=yes" )
|
2010-07-11 19:36:20 +00:00
|
|
|
;;
|
2011-07-17 13:48:27 +00:00
|
|
|
*)
|
|
|
|
core_opts+=( "mode=static" )
|
2015-12-08 17:09:49 +00:00
|
|
|
core_opts+=( "build_libgcc=yes" )
|
2008-09-30 18:19:18 +00:00
|
|
|
;;
|
2007-08-15 10:14:43 +00:00
|
|
|
esac
|
2011-07-17 13:48:27 +00:00
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
CT_DoStep INFO "Installing pass-2 core C gcc compiler"
|
|
|
|
CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-gcc-core-pass-2"
|
2011-07-24 17:35:24 +00:00
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
do_gcc_core_backend "${core_opts[@]}"
|
2011-07-24 17:35:24 +00:00
|
|
|
|
2012-08-01 17:07:37 +00:00
|
|
|
CT_Popd
|
|
|
|
CT_EndStep
|
2007-08-15 10:14:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------
|
2008-08-12 07:47:51 +00:00
|
|
|
# Build core gcc
|
2011-07-24 17:24:02 +00:00
|
|
|
# This function is used to build the core C compiler.
|
2015-05-29 20:40:54 +00:00
|
|
|
# Usage: do_gcc_core_backend param=value [...]
|
2011-07-24 17:24:02 +00:00
|
|
|
# Parameter : Definition : Type : Default
|
|
|
|
# mode : build a 'static', 'shared' or 'baremetal' : string : (none)
|
|
|
|
# host : the machine the core will run on : tuple : (none)
|
|
|
|
# prefix : dir prefix to install into : dir : (none)
|
2015-09-21 20:37:17 +00:00
|
|
|
# complibs : dir where complibs are installed : dir : (none)
|
2011-08-15 20:52:51 +00:00
|
|
|
# lang_list : the list of languages to build : string : (empty)
|
2011-07-24 17:24:02 +00:00
|
|
|
# build_libgcc : build libgcc or not : bool : no
|
|
|
|
# build_libstdcxx : build libstdc++ or not : bool : no
|
2013-11-19 06:44:02 +00:00
|
|
|
# build_libgfortran : build libgfortran or not : bool : no
|
2011-07-24 17:24:02 +00:00
|
|
|
# build_staticlinked : build statically linked or not : bool : no
|
|
|
|
# build_manuals : whether to build manuals or not : bool : no
|
2012-11-16 14:25:57 +00:00
|
|
|
# cflags : cflags to use : string : (empty)
|
|
|
|
# ldflags : ldflags to use : string : (empty)
|
2015-09-21 20:37:17 +00:00
|
|
|
# build_step : build step 'core1', 'core2', 'gcc_build'
|
|
|
|
# or 'gcc_host' : string : (none)
|
2015-05-29 20:40:54 +00:00
|
|
|
# Usage: do_gcc_core_backend mode=[static|shared|baremetal] build_libgcc=[yes|no] build_staticlinked=[yes|no]
|
|
|
|
do_gcc_core_backend() {
|
2008-08-12 07:47:51 +00:00
|
|
|
local mode
|
2010-06-13 18:31:42 +00:00
|
|
|
local build_libgcc=no
|
2010-06-13 21:38:37 +00:00
|
|
|
local build_libstdcxx=no
|
2013-11-19 06:44:02 +00:00
|
|
|
local build_libgfortran=no
|
2010-12-09 17:55:59 +00:00
|
|
|
local build_staticlinked=no
|
2011-11-15 21:06:21 +00:00
|
|
|
local build_manuals=no
|
2011-07-17 16:10:53 +00:00
|
|
|
local host
|
2011-07-17 15:56:22 +00:00
|
|
|
local prefix
|
2011-07-17 15:54:21 +00:00
|
|
|
local complibs
|
2011-08-15 20:52:51 +00:00
|
|
|
local lang_list
|
2011-08-23 19:11:26 +00:00
|
|
|
local cflags
|
2017-03-07 02:41:57 +00:00
|
|
|
local cflags_for_build
|
2012-11-16 14:25:57 +00:00
|
|
|
local ldflags
|
2015-09-21 20:37:17 +00:00
|
|
|
local build_step
|
|
|
|
local log_txt
|
2009-08-19 17:44:42 +00:00
|
|
|
local tmp
|
2011-03-27 23:07:31 +00:00
|
|
|
local -a host_libstdcxx_flags
|
2009-08-19 17:44:42 +00:00
|
|
|
local -a extra_config
|
2010-12-09 17:55:59 +00:00
|
|
|
local -a core_LDFLAGS
|
2010-06-13 18:43:02 +00:00
|
|
|
local -a core_targets
|
2015-09-21 20:37:17 +00:00
|
|
|
local -a core_targets_all
|
|
|
|
local -a core_targets_install
|
2014-05-10 02:13:49 +00:00
|
|
|
local -a extra_user_config
|
2012-02-13 20:51:48 +00:00
|
|
|
local arg
|
2007-08-15 10:14:43 +00:00
|
|
|
|
2012-02-13 20:51:48 +00:00
|
|
|
for arg in "$@"; do
|
|
|
|
eval "${arg// /\\ }"
|
2010-06-13 18:31:42 +00:00
|
|
|
done
|
2008-08-12 07:47:51 +00:00
|
|
|
|
2015-09-21 20:37:17 +00:00
|
|
|
# This function gets called in case of a bare metal compiler for the final gcc, too.
|
|
|
|
case "${build_step}" in
|
|
|
|
core1|core2)
|
|
|
|
CT_DoLog EXTRA "Configuring core C gcc compiler"
|
|
|
|
log_txt="gcc"
|
|
|
|
extra_user_config=( "${CT_CC_GCC_CORE_EXTRA_CONFIG_ARRAY[@]}" )
|
|
|
|
;;
|
|
|
|
gcc_build|gcc_host)
|
|
|
|
CT_DoLog EXTRA "Configuring final gcc compiler"
|
|
|
|
extra_user_config=( "${CT_CC_GCC_EXTRA_CONFIG_ARRAY[@]}" )
|
|
|
|
log_txt="final gcc compiler"
|
2017-05-24 03:54:33 +00:00
|
|
|
# to inhibit the libiberty and libgcc tricks later on
|
|
|
|
build_libgcc=no
|
2015-09-21 20:37:17 +00:00
|
|
|
;;
|
|
|
|
*)
|
|
|
|
CT_Abort "Internal Error: 'build_step' must be one of: 'core1', 'core2', 'gcc_build' or 'gcc_host', not '${build_step:-(empty)}'"
|
|
|
|
;;
|
|
|
|
esac
|
2011-07-24 17:35:24 +00:00
|
|
|
|
2008-08-12 07:47:51 +00:00
|
|
|
case "${mode}" in
|
|
|
|
static)
|
2009-08-19 17:44:42 +00:00
|
|
|
extra_config+=("--with-newlib")
|
|
|
|
extra_config+=("--enable-threads=no")
|
|
|
|
extra_config+=("--disable-shared")
|
2008-08-12 07:47:51 +00:00
|
|
|
;;
|
|
|
|
shared)
|
2009-08-19 17:44:42 +00:00
|
|
|
extra_config+=("--enable-shared")
|
2008-09-14 16:21:07 +00:00
|
|
|
;;
|
|
|
|
baremetal)
|
2009-08-19 17:44:42 +00:00
|
|
|
extra_config+=("--with-newlib")
|
|
|
|
extra_config+=("--enable-threads=no")
|
|
|
|
extra_config+=("--disable-shared")
|
2008-08-12 07:47:51 +00:00
|
|
|
;;
|
2010-06-13 18:31:42 +00:00
|
|
|
*)
|
|
|
|
CT_Abort "Internal Error: 'mode' must be one of: 'static', 'shared' or 'baremetal', not '${mode:-(empty)}'"
|
|
|
|
;;
|
2008-08-12 07:47:51 +00:00
|
|
|
esac
|
2007-08-15 10:14:43 +00:00
|
|
|
|
2017-01-14 22:51:38 +00:00
|
|
|
# This is only needed when building libstdc++ in a canadian environment with
|
|
|
|
# this function being used for final step (i.e., when building for bare metal).
|
|
|
|
if [ "${build_step}" = "gcc_build" ]; then
|
|
|
|
CT_DoLog DEBUG "Copying headers to install area of core C compiler"
|
|
|
|
CT_DoExecLog ALL cp -a "${CT_HEADERS_DIR}" "${prefix}/${CT_TARGET}/include"
|
|
|
|
fi
|
|
|
|
|
2009-08-19 17:44:42 +00:00
|
|
|
for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
|
|
|
|
eval tmp="\${CT_ARCH_WITH_${tmp}}"
|
|
|
|
if [ -n "${tmp}" ]; then
|
|
|
|
extra_config+=("${tmp}")
|
|
|
|
fi
|
|
|
|
done
|
2016-01-06 06:32:25 +00:00
|
|
|
|
2017-02-19 02:16:25 +00:00
|
|
|
extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
|
|
|
|
[ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
|
|
|
|
|
2008-05-22 22:38:37 +00:00
|
|
|
if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
|
2009-08-19 17:44:42 +00:00
|
|
|
extra_config+=("--enable-__cxa_atexit")
|
2008-05-22 22:38:37 +00:00
|
|
|
else
|
2009-08-19 17:44:42 +00:00
|
|
|
extra_config+=("--disable-__cxa_atexit")
|
2008-05-22 22:38:37 +00:00
|
|
|
fi
|
2007-08-15 10:14:43 +00:00
|
|
|
|
2016-01-07 18:42:44 +00:00
|
|
|
if [ -n "${CT_CC_GCC_ENABLE_CXX_FLAGS}" \
|
2016-01-06 19:22:58 +00:00
|
|
|
-a "${mode}" = "baremetal" ]; then
|
|
|
|
extra_config+=("--enable-cxx-flags=${CT_CC_GCC_ENABLE_CXX_FLAGS}")
|
|
|
|
fi
|
|
|
|
|
2016-01-06 06:32:25 +00:00
|
|
|
extra_config+=(--disable-libgomp)
|
|
|
|
extra_config+=(--disable-libmudflap)
|
2016-09-23 00:01:43 +00:00
|
|
|
extra_config+=(--disable-libmpx)
|
2016-01-06 06:32:25 +00:00
|
|
|
|
|
|
|
if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
|
|
|
|
extra_config+=(--enable-libssp)
|
|
|
|
else
|
|
|
|
extra_config+=(--disable-libssp)
|
|
|
|
fi
|
2017-02-19 02:41:04 +00:00
|
|
|
if [ "${CT_CC_GCC_LIBQUADMATH}" = "y" ]; then
|
|
|
|
extra_config+=(--enable-libquadmath)
|
|
|
|
extra_config+=(--enable-libquadmath-support)
|
|
|
|
else
|
|
|
|
extra_config+=(--disable-libquadmath)
|
|
|
|
extra_config+=(--disable-libquadmath-support)
|
2016-01-06 06:32:25 +00:00
|
|
|
fi
|
|
|
|
|
2012-11-16 14:25:57 +00:00
|
|
|
core_LDFLAGS+=("${ldflags}")
|
|
|
|
|
2010-12-09 17:55:59 +00:00
|
|
|
# *** WARNING ! ***
|
|
|
|
# Keep this full if-else-if-elif-fi-fi block in sync
|
2016-01-06 06:32:25 +00:00
|
|
|
# with the same block in do_gcc_backend, below.
|
2010-12-09 17:55:59 +00:00
|
|
|
if [ "${build_staticlinked}" = "yes" ]; then
|
|
|
|
core_LDFLAGS+=("-static")
|
2011-03-27 23:07:31 +00:00
|
|
|
host_libstdcxx_flags+=("-static-libgcc")
|
|
|
|
host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
|
|
|
|
host_libstdcxx_flags+=("-lm")
|
2010-12-09 17:55:59 +00:00
|
|
|
# Companion libraries are build static (eg !shared), so
|
|
|
|
# the libstdc++ is not pulled automatically, although it
|
|
|
|
# is needed. Shoe-horn it in our LDFLAGS
|
|
|
|
# Ditto libm on some Fedora boxen
|
2011-03-26 23:09:42 +00:00
|
|
|
core_LDFLAGS+=("-lstdc++")
|
|
|
|
core_LDFLAGS+=("-lm")
|
2010-12-09 17:55:59 +00:00
|
|
|
else
|
2015-05-29 20:40:54 +00:00
|
|
|
if [ "${CT_CC_GCC_STATIC_LIBSTDCXX}" = "y" ]; then
|
2010-12-09 17:55:59 +00:00
|
|
|
# this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
|
|
|
|
# build script
|
2011-05-30 23:30:54 +00:00
|
|
|
# INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
|
|
|
|
# see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
|
2011-03-27 23:07:31 +00:00
|
|
|
host_libstdcxx_flags+=("-static-libgcc")
|
|
|
|
host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
|
|
|
|
host_libstdcxx_flags+=("-lm")
|
2010-12-09 17:55:59 +00:00
|
|
|
fi
|
2016-12-16 23:52:26 +00:00
|
|
|
# When companion libraries are build static (eg !shared),
|
|
|
|
# the libstdc++ is not pulled automatically, although it
|
|
|
|
# is needed. Shoe-horn it in our LDFLAGS
|
|
|
|
# Ditto libm on some Fedora boxen
|
|
|
|
core_LDFLAGS+=("-lstdc++")
|
|
|
|
core_LDFLAGS+=("-lm")
|
2010-04-10 22:47:23 +00:00
|
|
|
fi
|
2010-12-09 17:55:59 +00:00
|
|
|
|
2017-02-19 07:14:52 +00:00
|
|
|
extra_config+=("--with-gmp=${complibs}")
|
|
|
|
extra_config+=("--with-mpfr=${complibs}")
|
|
|
|
extra_config+=("--with-mpc=${complibs}")
|
2010-09-12 18:54:54 +00:00
|
|
|
if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
|
2013-05-05 15:59:00 +00:00
|
|
|
if [ "${CT_ISL}" = "y" ]; then
|
|
|
|
extra_config+=("--with-isl=${complibs}")
|
2011-03-27 23:07:31 +00:00
|
|
|
fi
|
2015-12-08 17:09:49 +00:00
|
|
|
if [ "${CT_CLOOG}" = "y" ]; then
|
|
|
|
extra_config+=("--with-cloog=${complibs}")
|
|
|
|
fi
|
2017-02-19 02:16:25 +00:00
|
|
|
else
|
2013-05-05 15:59:00 +00:00
|
|
|
extra_config+=("--with-isl=no")
|
2010-09-12 21:51:25 +00:00
|
|
|
extra_config+=("--with-cloog=no")
|
2010-04-11 09:10:06 +00:00
|
|
|
fi
|
2010-09-12 18:54:54 +00:00
|
|
|
if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
|
2010-10-08 21:51:38 +00:00
|
|
|
extra_config+=("--enable-lto")
|
2017-02-19 02:16:25 +00:00
|
|
|
else
|
2010-10-08 21:51:38 +00:00
|
|
|
extra_config+=("--disable-lto")
|
2010-04-15 20:35:18 +00:00
|
|
|
fi
|
2010-04-11 09:10:06 +00:00
|
|
|
|
2011-03-27 23:07:31 +00:00
|
|
|
if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
|
|
|
|
extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
|
|
|
|
fi
|
|
|
|
|
2010-05-24 14:34:55 +00:00
|
|
|
if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
|
|
|
|
extra_config+=("--enable-target-optspace")
|
|
|
|
fi
|
2016-01-06 06:32:25 +00:00
|
|
|
if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
|
|
|
|
extra_config+=("--disable-libstdcxx-pch")
|
|
|
|
fi
|
2010-05-24 14:34:55 +00:00
|
|
|
|
2010-10-09 20:49:28 +00:00
|
|
|
case "${CT_CC_GCC_LDBL_128}" in
|
2010-10-20 13:25:38 +00:00
|
|
|
y) extra_config+=("--with-long-double-128");;
|
|
|
|
m) ;;
|
2010-10-09 20:49:28 +00:00
|
|
|
"") extra_config+=("--without-long-double-128");;
|
|
|
|
esac
|
|
|
|
|
2011-06-27 11:52:15 +00:00
|
|
|
if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
|
|
|
|
extra_config+=( --enable-linker-build-id )
|
|
|
|
fi
|
|
|
|
|
2011-06-27 13:15:00 +00:00
|
|
|
case "${CT_CC_GCC_LNK_HASH_STYLE}" in
|
|
|
|
"") ;;
|
|
|
|
*) extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
|
|
|
|
esac
|
|
|
|
|
2014-01-04 15:17:40 +00:00
|
|
|
case "${CT_CC_GCC_DEC_FLOATS}" in
|
|
|
|
"") ;;
|
|
|
|
*) extra_config+=( "--enable-decimal-float=${CT_CC_GCC_DEC_FLOATS}" );;
|
|
|
|
esac
|
|
|
|
|
2011-07-03 20:32:36 +00:00
|
|
|
case "${CT_ARCH}" in
|
|
|
|
mips)
|
|
|
|
case "${CT_CC_GCC_mips_llsc}" in
|
|
|
|
y) extra_config+=( --with-llsc );;
|
|
|
|
m) ;;
|
|
|
|
*) extra_config+=( --without-llsc );;
|
|
|
|
esac
|
|
|
|
case "${CT_CC_GCC_mips_synci}" in
|
|
|
|
y) extra_config+=( --with-synci );;
|
|
|
|
m) ;;
|
|
|
|
*) extra_config+=( --without-synci );;
|
|
|
|
esac
|
|
|
|
if [ "${CT_CC_GCC_mips_plt}" ]; then
|
|
|
|
extra_config+=( --with-mips-plt )
|
|
|
|
fi
|
|
|
|
;; # ARCH is mips
|
2011-06-27 16:04:50 +00:00
|
|
|
esac
|
|
|
|
|
2016-12-19 03:04:37 +00:00
|
|
|
if [ "${CT_TOOLCHAIN_ENABLE_NLS}" = "y" ]; then
|
|
|
|
extra_config+=("--with-libintl-prefix=${complibs}")
|
|
|
|
else
|
|
|
|
extra_config+=("--disable-nls")
|
|
|
|
fi
|
2011-11-17 10:00:28 +00:00
|
|
|
|
2011-12-31 15:23:27 +00:00
|
|
|
if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
|
|
|
|
extra_config+=("--with-system-zlib")
|
|
|
|
fi
|
|
|
|
|
2016-10-15 17:56:23 +00:00
|
|
|
case "${CT_CC_GCC_CONFIG_TLS}" in
|
|
|
|
y) extra_config+=("--enable-tls");;
|
|
|
|
m) ;;
|
|
|
|
"") extra_config+=("--disable-tls");;
|
|
|
|
esac
|
|
|
|
|
2015-11-11 16:14:53 +00:00
|
|
|
# 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).
|
2014-05-10 02:11:59 +00:00
|
|
|
if [ "${CT_MULTILIB}" != "y" ]; then
|
2011-11-23 22:51:07 +00:00
|
|
|
extra_config+=("--disable-multilib")
|
2015-11-11 16:14:53 +00:00
|
|
|
else
|
|
|
|
extra_config+=("--enable-multiarch")
|
2014-07-11 12:39:24 +00:00
|
|
|
if [ -n "${CT_CC_GCC_MULTILIB_LIST}" ]; then
|
|
|
|
extra_config+=("--with-multilib-list=${CT_CC_GCC_MULTILIB_LIST}")
|
|
|
|
fi
|
2011-11-23 22:51:07 +00:00
|
|
|
fi
|
|
|
|
|
2010-04-11 09:10:06 +00:00
|
|
|
CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
|
2010-04-10 22:47:23 +00:00
|
|
|
|
2017-03-07 02:41:57 +00:00
|
|
|
# We may need to modify host/build CFLAGS separately below
|
|
|
|
cflags_for_build="${cflags}"
|
|
|
|
|
2015-11-22 14:39:23 +00:00
|
|
|
# Clang's default bracket-depth is 256, and building GCC
|
|
|
|
# requires somewhere between 257 and 512.
|
2017-03-07 02:41:57 +00:00
|
|
|
if [ "${host}" = "${CT_BUILD}" ]; then
|
|
|
|
if ${CT_BUILD}-gcc --version 2>&1 | grep clang; then
|
|
|
|
cflags="$cflags "-fbracket-depth=512
|
|
|
|
cflags_for_build="$cflags_for_build "-fbracket-depth=512
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
# FIXME we currently don't support clang as host compiler, only as build
|
|
|
|
if ${CT_BUILD}-gcc --version 2>&1 | grep clang; then
|
|
|
|
cflags_for_build="$cflags_for_build "-fbracket-depth=512
|
|
|
|
fi
|
2015-11-22 14:39:23 +00:00
|
|
|
fi
|
|
|
|
|
2007-08-15 10:14:43 +00:00
|
|
|
# Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
|
2015-05-29 20:40:54 +00:00
|
|
|
CT_DoExecLog CFG \
|
|
|
|
CC_FOR_BUILD="${CT_BUILD}-gcc" \
|
|
|
|
CFLAGS="${cflags}" \
|
2017-03-07 02:41:57 +00:00
|
|
|
CFLAGS_FOR_BUILD="${cflags_for_build}" \
|
2015-05-29 20:40:54 +00:00
|
|
|
CXXFLAGS="${cflags}" \
|
2017-03-07 02:41:57 +00:00
|
|
|
CXXFLAGS_FOR_BUILD="${cflags_for_build}" \
|
2015-05-29 20:40:54 +00:00
|
|
|
LDFLAGS="${core_LDFLAGS[*]}" \
|
2016-03-15 12:05:29 +00:00
|
|
|
CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \
|
|
|
|
CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \
|
|
|
|
LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}" \
|
2017-01-25 08:06:28 +00:00
|
|
|
${CONFIG_SHELL} \
|
2015-05-29 20:40:54 +00:00
|
|
|
"${CT_SRC_DIR}/gcc-${CT_CC_GCC_VERSION}/configure" \
|
|
|
|
--build=${CT_BUILD} \
|
|
|
|
--host=${host} \
|
|
|
|
--target=${CT_TARGET} \
|
|
|
|
--prefix="${prefix}" \
|
|
|
|
--with-local-prefix="${CT_SYSROOT_DIR}" \
|
|
|
|
${CC_CORE_SYSROOT_ARG} \
|
|
|
|
"${extra_config[@]}" \
|
|
|
|
--enable-languages="${lang_list}" \
|
2014-05-10 02:13:49 +00:00
|
|
|
"${extra_user_config[@]}"
|
2007-08-15 10:14:43 +00:00
|
|
|
|
2008-08-07 13:28:02 +00:00
|
|
|
if [ "${build_libgcc}" = "yes" ]; then
|
2008-08-12 07:47:51 +00:00
|
|
|
# HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
|
|
|
|
# gcc/config/t-libunwind so -lc is removed from the link for
|
|
|
|
# libgcc_s.so, as we do not have a target -lc yet.
|
|
|
|
# This is not as ugly as it appears to be ;-) All symbols get resolved
|
|
|
|
# during the glibc build, and we provide a proper libgcc_s.so for the
|
|
|
|
# cross toolchain during the final gcc build.
|
|
|
|
#
|
|
|
|
# As we cannot modify the source tree, nor override SHLIB_LC itself
|
|
|
|
# during configure or make, we have to edit the resultant
|
|
|
|
# gcc/libgcc.mk itself to remove -lc from the link.
|
|
|
|
# This causes us to have to jump through some hoops...
|
|
|
|
#
|
|
|
|
# To produce libgcc.mk to edit we firstly require libiberty.a,
|
|
|
|
# so we configure then build it.
|
|
|
|
# Next we have to configure gcc, create libgcc.mk then edit it...
|
|
|
|
# So much easier if we just edit the source tree, but hey...
|
2015-05-29 20:40:54 +00:00
|
|
|
if [ ! -f "${CT_SRC_DIR}/gcc-${CT_CC_GCC_VERSION}/gcc/BASE-VER" ]; then
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog CFG make ${JOBSFLAGS} configure-libiberty
|
|
|
|
CT_DoExecLog ALL make ${JOBSFLAGS} -C libiberty libiberty.a
|
|
|
|
CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp
|
|
|
|
CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp
|
2008-08-07 13:28:02 +00:00
|
|
|
else
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog CFG make ${JOBSFLAGS} configure-gcc configure-libcpp configure-build-libiberty
|
|
|
|
CT_DoExecLog ALL make ${JOBSFLAGS} all-libcpp all-build-libiberty
|
2008-08-07 13:28:02 +00:00
|
|
|
fi
|
|
|
|
# HACK: gcc-4.2 uses libdecnumber to build libgcc.mk, so build it here.
|
2015-05-29 20:40:54 +00:00
|
|
|
if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_GCC_VERSION}/libdecnumber" ]; then
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog CFG make ${JOBSFLAGS} configure-libdecnumber
|
|
|
|
CT_DoExecLog ALL make ${JOBSFLAGS} -C libdecnumber libdecnumber.a
|
2008-08-07 13:28:02 +00:00
|
|
|
fi
|
2013-05-02 23:31:33 +00:00
|
|
|
# HACK: gcc-4.8 uses libbacktrace to make libgcc.mvars, so make it here.
|
2015-05-29 20:40:54 +00:00
|
|
|
if [ -d "${CT_SRC_DIR}/gcc-${CT_CC_GCC_VERSION}/libbacktrace" ]; then
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog CFG make ${JOBSFLAGS} configure-libbacktrace
|
|
|
|
CT_DoExecLog ALL make ${JOBSFLAGS} -C libbacktrace
|
2013-05-02 23:31:33 +00:00
|
|
|
fi
|
2008-08-07 13:28:02 +00:00
|
|
|
|
2015-12-08 17:09:49 +00:00
|
|
|
libgcc_rule="libgcc.mvars"
|
|
|
|
core_targets=( gcc target-libgcc )
|
2008-08-07 13:28:02 +00:00
|
|
|
|
2010-04-09 19:04:37 +00:00
|
|
|
# On bare metal and canadian build the host-compiler is used when
|
|
|
|
# actually the build-system compiler is required. Choose the correct
|
|
|
|
# compilers for canadian build and use the defaults on other
|
|
|
|
# configurations.
|
|
|
|
if [ "${CT_BARE_METAL},${CT_CANADIAN}" = "y,y" ]; then
|
|
|
|
repair_cc="CC_FOR_BUILD=${CT_BUILD}-gcc \
|
2013-05-13 07:00:56 +00:00
|
|
|
CXX_FOR_BUILD=${CT_BUILD}-g++ \
|
2017-01-14 05:24:16 +00:00
|
|
|
GCC_FOR_TARGET=${CT_TARGET}-${CT_CC}"
|
2010-04-09 19:04:37 +00:00
|
|
|
else
|
|
|
|
repair_cc=""
|
|
|
|
fi
|
|
|
|
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make ${JOBSFLAGS} -C gcc ${libgcc_rule} \
|
2010-04-09 19:04:37 +00:00
|
|
|
${repair_cc}
|
2017-02-27 03:06:35 +00:00
|
|
|
sed -r -i -e 's@-lc@@g' gcc/${libgcc_rule}
|
2008-08-07 13:28:02 +00:00
|
|
|
else # build_libgcc
|
2010-06-13 18:43:02 +00:00
|
|
|
core_targets=( gcc )
|
2008-08-07 13:28:02 +00:00
|
|
|
fi # ! build libgcc
|
2010-06-13 21:38:37 +00:00
|
|
|
if [ "${build_libstdcxx}" = "yes" \
|
|
|
|
-a "${CT_CC_LANG_CXX}" = "y" \
|
|
|
|
]; then
|
|
|
|
core_targets+=( target-libstdc++-v3 )
|
|
|
|
fi
|
2008-08-04 12:38:06 +00:00
|
|
|
|
2013-11-19 06:44:02 +00:00
|
|
|
if [ "${build_libgfortran}" = "yes" \
|
|
|
|
-a "${CT_CC_LANG_FORTRAN}" = "y" \
|
|
|
|
]; then
|
|
|
|
core_targets+=( target-libgfortran )
|
|
|
|
fi
|
|
|
|
|
2015-09-21 20:37:17 +00:00
|
|
|
core_targets_all="${core_targets[@]/#/all-}"
|
|
|
|
core_targets_install="${core_targets[@]/#/install-}"
|
|
|
|
|
|
|
|
case "${build_step}" in
|
|
|
|
gcc_build|gcc_host)
|
2017-05-24 03:54:33 +00:00
|
|
|
core_targets_all=all
|
|
|
|
core_targets_install=install
|
2015-09-21 20:37:17 +00:00
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
CT_DoLog EXTRA "Building ${log_txt}"
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make ${JOBSFLAGS} ${core_targets_all}
|
2007-08-15 10:14:43 +00:00
|
|
|
|
2016-11-10 00:46:01 +00:00
|
|
|
# Do not pass ${JOBSFLAGS} here: recent GCC builds have been failing
|
|
|
|
# in parallel 'make install' at random locations: libitm, libcilk,
|
|
|
|
# always for the files that are installed more than once to the same
|
|
|
|
# location (such as libitm.info).
|
|
|
|
# The symptom is that the install command fails with "File exists"
|
|
|
|
# error; running the same command manually succeeds. It looks like
|
|
|
|
# attempts to remove the destination and re-create it, but another
|
|
|
|
# install gets in the way.
|
2015-09-21 20:37:17 +00:00
|
|
|
CT_DoLog EXTRA "Installing ${log_txt}"
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make ${core_targets_install}
|
2007-08-15 10:14:43 +00:00
|
|
|
|
2015-10-27 01:31:54 +00:00
|
|
|
# Remove the libtool "pseudo-libraries": having them in the installed
|
|
|
|
# tree makes the libtoolized utilities that are built next assume
|
|
|
|
# that, for example, libsupc++ is an "accessory library", and not include
|
|
|
|
# -lsupc++ to the link flags. That breaks ltrace, for example.
|
multilib: Determine which options may pass through.
On some arches (e.g. MIPS) the options like -mabi do not work if
specified more than once (see the comment in 100-gcc.sh). Therefore,
we need to determine which of the options produced by <arch>.sh can
be passed to multilib builds and which must be removed (i.e., which
options vary among the multilibs).
This presents a chicken-and-egg problem. GCC developers, in their
infinite wisdom, do not allow arbitrary multilib specification to be
supplied to GCC's configure. Instead, the target (and sometimes some
extra options) determine the set of multilibs - which may include
different CPUs, different ABIs, different endianness, different FPUs,
different floating-point ABIs, ... That is, we don't know which parts
vary until we build GCC and ask it.
So, the solution implemented here is:
- For multilib builds, start with empty CT_ARCH_TARGET_CFLAGS/LDFLAGS.
- For multilib builds, require core pass 1. Pass 1 does not build any
target binaries, so at that point, our target options have not been
used yet.
- Provide an API to modify the environment variables for the steps that
follow the current one.
- As a part of multilib-related housekeeping, determine the variable
part of multilibs and filter out these options; pass the rest into
CT_TARGET_CFLAGS/LDFLAGS.
This still does not handle extra dependencies between GCC options (like
-ma implying -mcpu=X -mtune=Y, etc.) but I feel that would complicate
matters too much. Let's leave this until there's a compelling case for
it.
Also, query GCC's sysroot suffix for targets that use it (SuperH,
for example) - the default multilib may not work if the command line
specifies the default option explicitly (%sysroot_suffix_spec is not
aware of multilib defaults).
Signed-off-by: Alexey Neyman <stilor@att.net>
2016-03-30 19:15:54 +00:00
|
|
|
CT_DoLog EXTRA "Housekeeping for core gcc compiler"
|
2015-10-27 01:31:54 +00:00
|
|
|
CT_Pushd "${prefix}"
|
|
|
|
find . -type f -name "*.la" -exec rm {} \; |CT_DoLog ALL
|
|
|
|
CT_Popd
|
|
|
|
|
2012-02-13 21:18:02 +00:00
|
|
|
if [ "${build_manuals}" = "yes" ]; then
|
2011-11-15 21:06:21 +00:00
|
|
|
CT_DoLog EXTRA "Building the GCC manuals"
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make pdf html
|
2011-11-15 21:06:21 +00:00
|
|
|
CT_DoLog EXTRA "Installing the GCC manuals"
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make install-{pdf,html}-gcc
|
2011-11-15 21:06:21 +00:00
|
|
|
fi
|
|
|
|
|
2017-01-14 05:24:16 +00:00
|
|
|
# Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-${CT_CC} to always be able
|
2009-03-26 18:58:13 +00:00
|
|
|
# to call the C compiler with the same, somewhat canonical name.
|
2010-04-20 09:39:13 +00:00
|
|
|
# check whether compiler has an extension
|
2017-01-14 05:24:16 +00:00
|
|
|
file="$( ls -1 "${prefix}/bin/${CT_TARGET}-${CT_CC}."* 2>/dev/null || true )"
|
2010-04-20 09:39:13 +00:00
|
|
|
[ -z "${file}" ] || ext=".${file##*.}"
|
2017-01-14 05:24:16 +00:00
|
|
|
if [ -f "${prefix}/bin/${CT_TARGET}-${CT_CC}${ext}" ]; then
|
|
|
|
CT_DoExecLog ALL ln -sfv "${CT_TARGET}-${CT_CC}${ext}" "${prefix}/bin/${CT_TARGET}-cc${ext}"
|
2015-04-03 08:32:16 +00:00
|
|
|
fi
|
2009-03-26 18:58:13 +00:00
|
|
|
|
2017-01-14 05:24:16 +00:00
|
|
|
cc_gcc_multilib_housekeeping cc="${prefix}/bin/${CT_TARGET}-${CT_CC}" \
|
multilib: Determine which options may pass through.
On some arches (e.g. MIPS) the options like -mabi do not work if
specified more than once (see the comment in 100-gcc.sh). Therefore,
we need to determine which of the options produced by <arch>.sh can
be passed to multilib builds and which must be removed (i.e., which
options vary among the multilibs).
This presents a chicken-and-egg problem. GCC developers, in their
infinite wisdom, do not allow arbitrary multilib specification to be
supplied to GCC's configure. Instead, the target (and sometimes some
extra options) determine the set of multilibs - which may include
different CPUs, different ABIs, different endianness, different FPUs,
different floating-point ABIs, ... That is, we don't know which parts
vary until we build GCC and ask it.
So, the solution implemented here is:
- For multilib builds, start with empty CT_ARCH_TARGET_CFLAGS/LDFLAGS.
- For multilib builds, require core pass 1. Pass 1 does not build any
target binaries, so at that point, our target options have not been
used yet.
- Provide an API to modify the environment variables for the steps that
follow the current one.
- As a part of multilib-related housekeeping, determine the variable
part of multilibs and filter out these options; pass the rest into
CT_TARGET_CFLAGS/LDFLAGS.
This still does not handle extra dependencies between GCC options (like
-ma implying -mcpu=X -mtune=Y, etc.) but I feel that would complicate
matters too much. Let's leave this until there's a compelling case for
it.
Also, query GCC's sysroot suffix for targets that use it (SuperH,
for example) - the default multilib may not work if the command line
specifies the default option explicitly (%sysroot_suffix_spec is not
aware of multilib defaults).
Signed-off-by: Alexey Neyman <stilor@att.net>
2016-03-30 19:15:54 +00:00
|
|
|
host="${host}"
|
2007-08-15 10:14:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------
|
2012-04-02 20:54:30 +00:00
|
|
|
# Build complete gcc to run on build
|
2015-05-29 20:40:54 +00:00
|
|
|
do_gcc_for_build() {
|
2012-04-02 20:54:30 +00:00
|
|
|
local -a build_final_opts
|
|
|
|
local build_final_backend
|
|
|
|
|
2016-11-29 06:47:42 +00:00
|
|
|
# If native or simple cross toolchain is being built, then build==host;
|
|
|
|
# nothing to do.
|
2012-04-02 20:54:30 +00:00
|
|
|
case "${CT_TOOLCHAIN_TYPE}" in
|
|
|
|
native|cross) return 0;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
build_final_opts+=( "host=${CT_BUILD}" )
|
|
|
|
build_final_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
|
|
|
|
build_final_opts+=( "complibs=${CT_BUILDTOOLS_PREFIX_DIR}" )
|
2016-11-29 06:47:42 +00:00
|
|
|
build_final_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" )
|
|
|
|
build_final_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" )
|
2012-04-02 20:54:30 +00:00
|
|
|
build_final_opts+=( "lang_list=$( cc_gcc_lang_list )" )
|
2015-09-21 20:37:17 +00:00
|
|
|
build_final_opts+=( "build_step=gcc_build" )
|
2012-04-02 20:54:30 +00:00
|
|
|
if [ "${CT_BARE_METAL}" = "y" ]; then
|
|
|
|
# In the tests I've done, bare-metal was not impacted by the
|
|
|
|
# lack of such a compiler, but better safe than sorry...
|
|
|
|
build_final_opts+=( "mode=baremetal" )
|
|
|
|
build_final_opts+=( "build_libgcc=yes" )
|
|
|
|
build_final_opts+=( "build_libstdcxx=yes" )
|
2013-11-19 06:44:02 +00:00
|
|
|
build_final_opts+=( "build_libgfortran=yes" )
|
2012-04-02 20:54:30 +00:00
|
|
|
if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
|
|
|
|
build_final_opts+=( "build_staticlinked=yes" )
|
|
|
|
fi
|
2015-05-29 20:40:54 +00:00
|
|
|
build_final_backend=do_gcc_core_backend
|
2012-04-02 20:54:30 +00:00
|
|
|
else
|
2015-05-29 20:40:54 +00:00
|
|
|
build_final_backend=do_gcc_backend
|
2012-04-02 20:54:30 +00:00
|
|
|
fi
|
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
CT_DoStep INFO "Installing final gcc compiler for build"
|
|
|
|
CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-gcc-final-build-${CT_BUILD}"
|
2012-04-02 20:54:30 +00:00
|
|
|
|
|
|
|
"${build_final_backend}" "${build_final_opts[@]}"
|
|
|
|
|
|
|
|
CT_Popd
|
|
|
|
CT_EndStep
|
|
|
|
}
|
|
|
|
|
2016-10-02 22:23:53 +00:00
|
|
|
gcc_movelibs() {
|
2017-03-13 06:01:23 +00:00
|
|
|
local multi_flags multi_dir multi_os_dir multi_os_dir_gcc multi_root multi_index multi_count
|
2017-03-10 03:07:21 +00:00
|
|
|
local gcc_dir dst_dir
|
2017-03-29 06:38:55 +00:00
|
|
|
local rel
|
2016-10-02 22:23:53 +00:00
|
|
|
|
|
|
|
for arg in "$@"; do
|
|
|
|
eval "${arg// /\\ }"
|
|
|
|
done
|
|
|
|
|
2016-12-17 19:49:18 +00:00
|
|
|
# Move only files, directories are for other multilibs. We're looking inside
|
|
|
|
# GCC's directory structure, thus use unmangled multi_os_dir that GCC reports.
|
|
|
|
gcc_dir="${CT_PREFIX_DIR}/${CT_TARGET}/lib/${multi_os_dir_gcc}"
|
2016-10-05 19:34:01 +00:00
|
|
|
if [ ! -d "${gcc_dir}" ]; then
|
|
|
|
# GCC didn't install anything outside of sysroot
|
|
|
|
return
|
|
|
|
fi
|
2017-03-10 03:07:21 +00:00
|
|
|
# Depending on the selected libc, we may or may not have the ${multi_os_dir_gcc}
|
|
|
|
# created by libc installation. If we do, use it. If we don't, use ${multi_os_dir}
|
|
|
|
# to avoid creating an otherwise empty directory.
|
|
|
|
dst_dir="${multi_root}/lib/${multi_os_dir_gcc}"
|
|
|
|
if [ ! -d "${dst_dir}" ]; then
|
|
|
|
dst_dir="${multi_root}/lib/${multi_os_dir}"
|
|
|
|
fi
|
|
|
|
CT_SanitizeVarDir dst_dir gcc_dir
|
2017-03-29 06:38:55 +00:00
|
|
|
rel=$( echo "${gcc_dir#${CT_PREFIX_DIR}/}" | sed 's#[^/]\{1,\}#..#g' )
|
2017-03-10 03:07:21 +00:00
|
|
|
|
2016-10-02 22:23:53 +00:00
|
|
|
ls "${gcc_dir}" | while read f; do
|
2016-10-05 19:34:01 +00:00
|
|
|
case "${f}" in
|
|
|
|
*.ld)
|
|
|
|
# Linker scripts remain in GCC's directory; elf2flt insists on
|
|
|
|
# finding them there.
|
|
|
|
continue
|
|
|
|
;;
|
|
|
|
esac
|
2016-10-02 22:23:53 +00:00
|
|
|
if [ -f "${gcc_dir}/${f}" ]; then
|
2017-03-10 03:07:21 +00:00
|
|
|
CT_DoExecLog ALL mkdir -p "${dst_dir}"
|
|
|
|
CT_DoExecLog ALL mv "${gcc_dir}/${f}" "${dst_dir}/${f}"
|
2017-03-29 06:38:55 +00:00
|
|
|
CT_DoExecLog ALL ln -sf "${rel}/${dst_dir#${CT_PREFIX_DIR}/}/${f}" "${gcc_dir}/${f}"
|
2016-10-02 22:23:53 +00:00
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2012-04-02 20:54:30 +00:00
|
|
|
#------------------------------------------------------------------------------
|
|
|
|
# Build final gcc to run on host
|
2015-05-29 20:40:54 +00:00
|
|
|
do_gcc_for_host() {
|
2011-07-17 20:46:47 +00:00
|
|
|
local -a final_opts
|
2011-07-17 20:43:07 +00:00
|
|
|
local final_backend
|
2011-07-17 20:46:47 +00:00
|
|
|
|
|
|
|
final_opts+=( "host=${CT_HOST}" )
|
|
|
|
final_opts+=( "prefix=${CT_PREFIX_DIR}" )
|
2011-07-25 17:04:17 +00:00
|
|
|
final_opts+=( "complibs=${CT_HOST_COMPLIBS_DIR}" )
|
2011-07-17 20:46:47 +00:00
|
|
|
final_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
|
2012-11-16 14:25:57 +00:00
|
|
|
final_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
|
2012-04-01 17:07:11 +00:00
|
|
|
final_opts+=( "lang_list=$( cc_gcc_lang_list )" )
|
2015-09-21 20:37:17 +00:00
|
|
|
final_opts+=( "build_step=gcc_host" )
|
2012-02-13 21:18:02 +00:00
|
|
|
if [ "${CT_BUILD_MANUALS}" = "y" ]; then
|
|
|
|
final_opts+=( "build_manuals=yes" )
|
|
|
|
fi
|
2011-07-17 20:43:07 +00:00
|
|
|
if [ "${CT_BARE_METAL}" = "y" ]; then
|
|
|
|
final_opts+=( "mode=baremetal" )
|
|
|
|
final_opts+=( "build_libgcc=yes" )
|
|
|
|
final_opts+=( "build_libstdcxx=yes" )
|
2013-11-19 06:44:02 +00:00
|
|
|
final_opts+=( "build_libgfortran=yes" )
|
2011-07-17 20:43:07 +00:00
|
|
|
if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
|
|
|
|
final_opts+=( "build_staticlinked=yes" )
|
|
|
|
fi
|
2015-05-29 20:40:54 +00:00
|
|
|
final_backend=do_gcc_core_backend
|
2011-07-17 20:43:07 +00:00
|
|
|
else
|
2015-05-29 20:40:54 +00:00
|
|
|
final_backend=do_gcc_backend
|
2011-07-17 20:43:07 +00:00
|
|
|
fi
|
2011-07-17 20:46:47 +00:00
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
CT_DoStep INFO "Installing final gcc compiler"
|
|
|
|
CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-gcc-final"
|
2011-07-17 20:43:07 +00:00
|
|
|
"${final_backend}" "${final_opts[@]}"
|
2011-07-24 17:35:24 +00:00
|
|
|
CT_Popd
|
2016-10-02 22:23:53 +00:00
|
|
|
|
|
|
|
# GCC installs stuff (including libgcc) into its own /lib dir,
|
|
|
|
# outside of sysroot, breaking linking with -static-libgcc.
|
|
|
|
# Fix up by moving the libraries into the sysroot.
|
|
|
|
if [ "${CT_USE_SYSROOT}" = "y" ]; then
|
|
|
|
CT_mkdir_pushd "${CT_BUILD_DIR}/build-cc-gcc-final-movelibs"
|
|
|
|
CT_IterateMultilibs gcc_movelibs movelibs
|
|
|
|
CT_Popd
|
|
|
|
fi
|
|
|
|
|
2011-07-24 17:35:24 +00:00
|
|
|
CT_EndStep
|
2011-07-17 20:46:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#------------------------------------------------------------------------------
|
2011-07-24 17:24:02 +00:00
|
|
|
# Build the final gcc
|
2015-05-29 20:40:54 +00:00
|
|
|
# Usage: do_gcc_backend param=value [...]
|
2011-07-17 20:46:47 +00:00
|
|
|
# Parameter : Definition : Type : Default
|
|
|
|
# host : the host we run onto : tuple : (none)
|
|
|
|
# prefix : the runtime prefix : dir : (none)
|
|
|
|
# complibs : the companion libraries prefix : dir : (none)
|
2012-11-16 14:25:57 +00:00
|
|
|
# cflags : cflags to use : string : (empty)
|
|
|
|
# ldflags : ldflags to use : string : (empty)
|
2012-04-01 17:07:11 +00:00
|
|
|
# lang_list : the list of languages to build : string : (empty)
|
2012-02-13 21:18:02 +00:00
|
|
|
# build_manuals : whether to build manuals or not : bool : no
|
2015-05-29 20:40:54 +00:00
|
|
|
do_gcc_backend() {
|
2011-07-17 20:46:47 +00:00
|
|
|
local host
|
|
|
|
local prefix
|
|
|
|
local complibs
|
2016-01-06 06:32:25 +00:00
|
|
|
local lang_list
|
2011-07-17 20:46:47 +00:00
|
|
|
local cflags
|
2017-03-07 02:41:57 +00:00
|
|
|
local cflags_for_build
|
2012-11-16 14:25:57 +00:00
|
|
|
local ldflags
|
2012-02-13 21:18:02 +00:00
|
|
|
local build_manuals
|
2011-03-27 23:07:31 +00:00
|
|
|
local -a host_libstdcxx_flags
|
2009-08-19 17:44:42 +00:00
|
|
|
local -a extra_config
|
2010-12-09 17:55:42 +00:00
|
|
|
local -a final_LDFLAGS
|
2009-08-19 17:44:42 +00:00
|
|
|
local tmp
|
2011-07-17 20:46:47 +00:00
|
|
|
local arg
|
2009-08-19 17:44:42 +00:00
|
|
|
|
2011-07-17 20:46:47 +00:00
|
|
|
for arg in "$@"; do
|
|
|
|
eval "${arg// /\\ }"
|
|
|
|
done
|
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
CT_DoLog EXTRA "Configuring final gcc compiler"
|
2007-02-24 11:00:05 +00:00
|
|
|
|
|
|
|
# Enable selected languages
|
2012-04-01 17:07:11 +00:00
|
|
|
extra_config+=("--enable-languages=${lang_list}")
|
2011-08-15 19:42:28 +00:00
|
|
|
|
2009-08-19 17:44:42 +00:00
|
|
|
for tmp in ARCH ABI CPU TUNE FPU FLOAT; do
|
|
|
|
eval tmp="\${CT_ARCH_WITH_${tmp}}"
|
|
|
|
if [ -n "${tmp}" ]; then
|
|
|
|
extra_config+=("${tmp}")
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
2011-05-31 18:12:35 +00:00
|
|
|
[ "${CT_SHARED_LIBS}" = "y" ] || extra_config+=("--disable-shared")
|
2017-02-19 02:16:25 +00:00
|
|
|
extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
|
|
|
|
[ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
|
|
|
|
|
2010-07-28 21:53:09 +00:00
|
|
|
case "${CT_CC_GCC_SJLJ_EXCEPTIONS}" in
|
|
|
|
y) extra_config+=("--enable-sjlj-exceptions");;
|
|
|
|
m) ;;
|
|
|
|
"") extra_config+=("--disable-sjlj-exceptions");;
|
|
|
|
esac
|
2008-05-22 22:38:37 +00:00
|
|
|
if [ "${CT_CC_CXA_ATEXIT}" = "y" ]; then
|
2009-08-19 17:44:42 +00:00
|
|
|
extra_config+=("--enable-__cxa_atexit")
|
2008-05-22 22:38:37 +00:00
|
|
|
else
|
2009-08-19 17:44:42 +00:00
|
|
|
extra_config+=("--disable-__cxa_atexit")
|
2008-05-22 22:38:37 +00:00
|
|
|
fi
|
2016-01-06 06:32:25 +00:00
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
if [ -n "${CT_CC_GCC_ENABLE_CXX_FLAGS}" ]; then
|
|
|
|
extra_config+=("--enable-cxx-flags=${CT_CC_GCC_ENABLE_CXX_FLAGS}")
|
2009-05-27 21:16:01 +00:00
|
|
|
fi
|
2016-01-06 19:22:58 +00:00
|
|
|
|
2015-11-21 10:10:50 +00:00
|
|
|
if [ "${CT_THREADS}" = "none" ]; then
|
2015-12-08 17:09:49 +00:00
|
|
|
extra_config+=(--disable-libatomic)
|
2014-01-03 09:57:48 +00:00
|
|
|
fi
|
2010-07-28 21:55:10 +00:00
|
|
|
if [ "${CT_CC_GCC_LIBMUDFLAP}" = "y" ]; then
|
|
|
|
extra_config+=(--enable-libmudflap)
|
|
|
|
else
|
|
|
|
extra_config+=(--disable-libmudflap)
|
|
|
|
fi
|
2010-10-08 21:58:58 +00:00
|
|
|
if [ "${CT_CC_GCC_LIBGOMP}" = "y" ]; then
|
|
|
|
extra_config+=(--enable-libgomp)
|
|
|
|
else
|
|
|
|
extra_config+=(--disable-libgomp)
|
|
|
|
fi
|
2010-10-09 09:38:04 +00:00
|
|
|
if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
|
|
|
|
extra_config+=(--enable-libssp)
|
|
|
|
else
|
|
|
|
extra_config+=(--disable-libssp)
|
|
|
|
fi
|
2017-02-19 02:41:04 +00:00
|
|
|
if [ "${CT_CC_GCC_LIBQUADMATH}" = "y" ]; then
|
|
|
|
extra_config+=(--enable-libquadmath)
|
|
|
|
extra_config+=(--enable-libquadmath-support)
|
|
|
|
else
|
|
|
|
extra_config+=(--disable-libquadmath)
|
|
|
|
extra_config+=(--disable-libquadmath-support)
|
2012-05-06 13:32:56 +00:00
|
|
|
fi
|
2016-01-06 06:32:25 +00:00
|
|
|
|
2017-02-19 02:41:04 +00:00
|
|
|
if [ "${CT_CC_GCC_LIBSANITIZER}" = "y" ]; then
|
|
|
|
extra_config+=(--enable-libsanitizer)
|
|
|
|
else
|
|
|
|
extra_config+=(--disable-libsanitizer)
|
2014-08-31 15:30:34 +00:00
|
|
|
fi
|
2010-04-11 09:10:06 +00:00
|
|
|
|
2016-09-23 00:01:43 +00:00
|
|
|
if [ "${CT_CC_GCC_HAS_LIBMPX}" = "y" ]; then
|
|
|
|
if [ "${CT_CC_GCC_LIBMPX}" = "y" ]; then
|
|
|
|
extra_config+=(--enable-libmpx)
|
|
|
|
else
|
|
|
|
extra_config+=(--disable-libmpx)
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
2012-11-16 14:25:57 +00:00
|
|
|
final_LDFLAGS+=("${ldflags}")
|
|
|
|
|
2010-12-09 17:55:59 +00:00
|
|
|
# *** WARNING ! ***
|
|
|
|
# Keep this full if-else-if-elif-fi-fi block in sync
|
2016-01-06 06:32:25 +00:00
|
|
|
# with the same block in do_gcc_core_backend, above.
|
2010-12-09 17:55:42 +00:00
|
|
|
if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
|
|
|
|
final_LDFLAGS+=("-static")
|
2011-03-27 23:07:31 +00:00
|
|
|
host_libstdcxx_flags+=("-static-libgcc")
|
|
|
|
host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++")
|
|
|
|
host_libstdcxx_flags+=("-lm")
|
2010-12-09 17:55:42 +00:00
|
|
|
# Companion libraries are build static (eg !shared), so
|
2010-07-29 17:47:16 +00:00
|
|
|
# the libstdc++ is not pulled automatically, although it
|
|
|
|
# is needed. Shoe-horn it in our LDFLAGS
|
2010-08-05 16:19:07 +00:00
|
|
|
# Ditto libm on some Fedora boxen
|
2010-12-09 17:55:42 +00:00
|
|
|
final_LDFLAGS+=("-lstdc++")
|
|
|
|
final_LDFLAGS+=("-lm")
|
|
|
|
else
|
2015-05-29 20:40:54 +00:00
|
|
|
if [ "${CT_CC_GCC_STATIC_LIBSTDCXX}" = "y" ]; then
|
2010-12-09 17:55:42 +00:00
|
|
|
# this is from CodeSourcery arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2
|
|
|
|
# build script
|
2011-05-30 23:30:54 +00:00
|
|
|
# INFO: if the host gcc is gcc-4.5 then presumably we could use -static-libstdc++,
|
|
|
|
# see http://gcc.gnu.org/ml/gcc-patches/2009-06/msg01635.html
|
2011-03-27 23:07:31 +00:00
|
|
|
host_libstdcxx_flags+=("-static-libgcc")
|
|
|
|
host_libstdcxx_flags+=("-Wl,-Bstatic,-lstdc++,-Bdynamic")
|
|
|
|
host_libstdcxx_flags+=("-lm")
|
2010-12-09 17:55:42 +00:00
|
|
|
fi
|
2016-12-16 23:52:26 +00:00
|
|
|
# When companion libraries are build static (eg !shared),
|
|
|
|
# the libstdc++ is not pulled automatically, although it
|
|
|
|
# is needed. Shoe-horn it in our LDFLAGS
|
|
|
|
# Ditto libm on some Fedora boxen
|
|
|
|
final_LDFLAGS+=("-lstdc++")
|
|
|
|
final_LDFLAGS+=("-lm")
|
2010-04-11 09:10:06 +00:00
|
|
|
fi
|
2010-12-09 17:55:42 +00:00
|
|
|
|
2017-02-19 07:14:52 +00:00
|
|
|
extra_config+=("--with-gmp=${complibs}")
|
|
|
|
extra_config+=("--with-mpfr=${complibs}")
|
|
|
|
extra_config+=("--with-mpc=${complibs}")
|
2010-09-12 18:54:54 +00:00
|
|
|
if [ "${CT_CC_GCC_USE_GRAPHITE}" = "y" ]; then
|
2013-05-05 15:59:00 +00:00
|
|
|
if [ "${CT_ISL}" = "y" ]; then
|
|
|
|
extra_config+=("--with-isl=${complibs}")
|
2011-03-27 23:07:31 +00:00
|
|
|
fi
|
2015-12-08 17:09:49 +00:00
|
|
|
if [ "${CT_CLOOG}" = "y" ]; then
|
|
|
|
extra_config+=("--with-cloog=${complibs}")
|
|
|
|
fi
|
2017-02-19 02:16:25 +00:00
|
|
|
else
|
2013-05-05 15:59:00 +00:00
|
|
|
extra_config+=("--with-isl=no")
|
2010-09-12 21:51:25 +00:00
|
|
|
extra_config+=("--with-cloog=no")
|
2010-03-05 17:55:25 +00:00
|
|
|
fi
|
2010-09-12 18:54:54 +00:00
|
|
|
if [ "${CT_CC_GCC_USE_LTO}" = "y" ]; then
|
2015-09-24 23:32:27 +00:00
|
|
|
extra_config+=("--enable-lto")
|
2017-02-19 02:16:25 +00:00
|
|
|
else
|
2015-09-24 23:32:27 +00:00
|
|
|
extra_config+=("--disable-lto")
|
2010-04-15 20:35:18 +00:00
|
|
|
fi
|
2007-02-24 11:00:05 +00:00
|
|
|
|
2011-03-27 23:07:31 +00:00
|
|
|
if [ ${#host_libstdcxx_flags[@]} -ne 0 ]; then
|
|
|
|
extra_config+=("--with-host-libstdcxx=${host_libstdcxx_flags[*]}")
|
|
|
|
fi
|
|
|
|
|
2010-04-07 16:35:22 +00:00
|
|
|
if [ "${CT_THREADS}" = "none" ]; then
|
|
|
|
extra_config+=("--disable-threads")
|
|
|
|
else
|
2010-07-11 19:36:20 +00:00
|
|
|
if [ "${CT_THREADS}" = "win32" ]; then
|
|
|
|
extra_config+=("--enable-threads=win32")
|
|
|
|
extra_config+=("--disable-win32-registry")
|
|
|
|
else
|
|
|
|
extra_config+=("--enable-threads=posix")
|
|
|
|
fi
|
2010-04-07 16:35:22 +00:00
|
|
|
fi
|
|
|
|
|
2010-05-24 14:34:55 +00:00
|
|
|
if [ "${CT_CC_GCC_ENABLE_TARGET_OPTSPACE}" = "y" ]; then
|
|
|
|
extra_config+=("--enable-target-optspace")
|
|
|
|
fi
|
2010-06-17 19:26:23 +00:00
|
|
|
if [ "${CT_CC_GCC_DISABLE_PCH}" = "y" ]; then
|
|
|
|
extra_config+=("--disable-libstdcxx-pch")
|
|
|
|
fi
|
2010-05-24 14:34:55 +00:00
|
|
|
|
2010-10-09 20:49:28 +00:00
|
|
|
case "${CT_CC_GCC_LDBL_128}" in
|
2010-10-20 13:25:38 +00:00
|
|
|
y) extra_config+=("--with-long-double-128");;
|
|
|
|
m) ;;
|
2010-10-09 20:49:28 +00:00
|
|
|
"") extra_config+=("--without-long-double-128");;
|
|
|
|
esac
|
|
|
|
|
2011-06-27 11:52:15 +00:00
|
|
|
if [ "${CT_CC_GCC_BUILD_ID}" = "y" ]; then
|
|
|
|
extra_config+=( --enable-linker-build-id )
|
|
|
|
fi
|
|
|
|
|
2011-06-27 13:15:00 +00:00
|
|
|
case "${CT_CC_GCC_LNK_HASH_STYLE}" in
|
|
|
|
"") ;;
|
|
|
|
*) extra_config+=( "--with-linker-hash-style=${CT_CC_GCC_LNK_HASH_STYLE}" );;
|
|
|
|
esac
|
|
|
|
|
2014-01-04 15:17:40 +00:00
|
|
|
case "${CT_CC_GCC_DEC_FLOATS}" in
|
|
|
|
"") ;;
|
|
|
|
*) extra_config+=( "--enable-decimal-float=${CT_CC_GCC_DEC_FLOATS}" );;
|
|
|
|
esac
|
|
|
|
|
2011-01-28 17:53:37 +00:00
|
|
|
if [ "${CT_CC_GCC_ENABLE_PLUGINS}" = "y" ]; then
|
|
|
|
extra_config+=( --enable-plugin )
|
2017-02-19 03:00:25 +00:00
|
|
|
else
|
|
|
|
extra_config+=( --disable-plugin )
|
2011-01-28 17:53:37 +00:00
|
|
|
fi
|
|
|
|
if [ "${CT_CC_GCC_GOLD}" = "y" ]; then
|
2010-12-29 16:58:35 +00:00
|
|
|
extra_config+=( --enable-gold )
|
|
|
|
fi
|
|
|
|
|
2011-07-03 20:32:36 +00:00
|
|
|
case "${CT_ARCH}" in
|
|
|
|
mips)
|
|
|
|
case "${CT_CC_GCC_mips_llsc}" in
|
|
|
|
y) extra_config+=( --with-llsc );;
|
|
|
|
m) ;;
|
|
|
|
*) extra_config+=( --without-llsc );;
|
|
|
|
esac
|
|
|
|
case "${CT_CC_GCC_mips_synci}" in
|
|
|
|
y) extra_config+=( --with-synci );;
|
|
|
|
m) ;;
|
|
|
|
*) extra_config+=( --without-synci );;
|
|
|
|
esac
|
|
|
|
if [ "${CT_CC_GCC_mips_plt}" ]; then
|
|
|
|
extra_config+=( --with-mips-plt )
|
|
|
|
fi
|
|
|
|
;; # ARCH is mips
|
|
|
|
esac
|
|
|
|
|
2016-12-19 03:04:37 +00:00
|
|
|
if [ "${CT_TOOLCHAIN_ENABLE_NLS}" = "y" ]; then
|
|
|
|
extra_config+=("--with-libintl-prefix=${complibs}")
|
|
|
|
else
|
|
|
|
extra_config+=("--disable-nls")
|
|
|
|
fi
|
2011-11-17 10:00:28 +00:00
|
|
|
|
2011-12-31 15:23:27 +00:00
|
|
|
if [ "${CT_CC_GCC_SYSTEM_ZLIB}" = "y" ]; then
|
|
|
|
extra_config+=("--with-system-zlib")
|
|
|
|
fi
|
|
|
|
|
2016-10-15 17:56:23 +00:00
|
|
|
case "${CT_CC_GCC_CONFIG_TLS}" in
|
|
|
|
y) extra_config+=("--enable-tls");;
|
|
|
|
m) ;;
|
|
|
|
"") extra_config+=("--disable-tls");;
|
|
|
|
esac
|
|
|
|
|
2015-11-11 16:14:53 +00:00
|
|
|
# Some versions of gcc have a defective --enable-multilib.
|
2014-07-19 03:23:11 +00:00
|
|
|
# Since that's the default, only pass --disable-multilib.
|
|
|
|
if [ "${CT_MULTILIB}" != "y" ]; then
|
2011-11-23 22:51:07 +00:00
|
|
|
extra_config+=("--disable-multilib")
|
2015-11-11 16:14:53 +00:00
|
|
|
else
|
|
|
|
extra_config+=("--enable-multiarch")
|
2014-07-11 12:39:24 +00:00
|
|
|
if [ -n "${CT_CC_GCC_MULTILIB_LIST}" ]; then
|
|
|
|
extra_config+=("--with-multilib-list=${CT_CC_GCC_MULTILIB_LIST}")
|
|
|
|
fi
|
2011-11-23 22:51:07 +00:00
|
|
|
fi
|
|
|
|
|
2009-08-19 17:44:42 +00:00
|
|
|
CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
|
2007-02-24 11:00:05 +00:00
|
|
|
|
2017-03-07 02:41:57 +00:00
|
|
|
# We may need to modify host/build CFLAGS separately below
|
|
|
|
cflags_for_build="${cflags}"
|
|
|
|
|
2016-01-06 06:32:25 +00:00
|
|
|
# Clang's default bracket-depth is 256, and building GCC
|
|
|
|
# requires somewhere between 257 and 512.
|
2017-03-07 02:41:57 +00:00
|
|
|
if [ "${host}" = "${CT_BUILD}" ]; then
|
|
|
|
if ${CT_BUILD}-gcc --version 2>&1 | grep clang; then
|
|
|
|
cflags="$cflags "-fbracket-depth=512
|
|
|
|
cflags_for_build="$cflags_for_build "-fbracket-depth=512
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
# FIXME we currently don't support clang as host compiler, only as build
|
|
|
|
if ${CT_BUILD}-gcc --version 2>&1 | grep clang; then
|
|
|
|
cflags_for_build="$cflags_for_build "-fbracket-depth=512
|
|
|
|
fi
|
2015-11-22 14:39:23 +00:00
|
|
|
fi
|
|
|
|
|
2017-01-25 08:06:28 +00:00
|
|
|
CT_DoExecLog CFG \
|
|
|
|
CC_FOR_BUILD="${CT_BUILD}-gcc" \
|
|
|
|
CFLAGS="${cflags}" \
|
2017-03-07 02:41:57 +00:00
|
|
|
CFLAGS_FOR_BUILD="${cflags_for_build}" \
|
2017-01-25 08:06:28 +00:00
|
|
|
CXXFLAGS="${cflags}" \
|
2017-03-07 02:41:57 +00:00
|
|
|
CXXFLAGS_FOR_BUILD="${cflags_for_build}" \
|
2017-01-25 08:06:28 +00:00
|
|
|
LDFLAGS="${final_LDFLAGS[*]}" \
|
|
|
|
CFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \
|
|
|
|
CXXFLAGS_FOR_TARGET="${CT_TARGET_CFLAGS}" \
|
|
|
|
LDFLAGS_FOR_TARGET="${CT_TARGET_LDFLAGS}" \
|
|
|
|
${CONFIG_SHELL} \
|
2015-05-29 20:40:54 +00:00
|
|
|
"${CT_SRC_DIR}/gcc-${CT_CC_GCC_VERSION}/configure" \
|
2017-01-25 08:06:28 +00:00
|
|
|
--build=${CT_BUILD} \
|
|
|
|
--host=${host} \
|
|
|
|
--target=${CT_TARGET} \
|
|
|
|
--prefix="${prefix}" \
|
|
|
|
${CC_SYSROOT_ARG} \
|
|
|
|
"${extra_config[@]}" \
|
|
|
|
--with-local-prefix="${CT_SYSROOT_DIR}" \
|
|
|
|
--enable-long-long \
|
2015-05-29 20:40:54 +00:00
|
|
|
"${CT_CC_GCC_EXTRA_CONFIG_ARRAY[@]}"
|
2007-02-24 11:00:05 +00:00
|
|
|
|
2007-05-24 17:49:24 +00:00
|
|
|
if [ "${CT_CANADIAN}" = "y" ]; then
|
2007-02-24 11:00:05 +00:00
|
|
|
CT_DoLog EXTRA "Building libiberty"
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make ${JOBSFLAGS} all-build-libiberty
|
2007-02-24 11:00:05 +00:00
|
|
|
fi
|
|
|
|
|
2015-05-29 20:40:54 +00:00
|
|
|
CT_DoLog EXTRA "Building final gcc compiler"
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make ${JOBSFLAGS} all
|
2007-02-24 11:00:05 +00:00
|
|
|
|
2016-11-10 00:46:01 +00:00
|
|
|
# See the note on issues with parallel 'make install' in GCC above.
|
2015-05-29 20:40:54 +00:00
|
|
|
CT_DoLog EXTRA "Installing final gcc compiler"
|
2015-11-10 09:59:02 +00:00
|
|
|
if [ "${CT_STRIP_TARGET_TOOLCHAIN_EXECUTABLES}" = "y" ]; then
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make install-strip
|
2015-11-10 09:59:02 +00:00
|
|
|
else
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make install
|
2015-11-10 09:59:02 +00:00
|
|
|
fi
|
2007-02-24 11:00:05 +00:00
|
|
|
|
2015-10-27 01:31:54 +00:00
|
|
|
# Remove the libtool "pseudo-libraries": having them in the installed
|
|
|
|
# tree makes the libtoolized utilities that are built next assume
|
|
|
|
# that, for example, libsupc++ is an "accessory library", and not include
|
|
|
|
# -lsupc++ to the link flags. That breaks ltrace, for example.
|
|
|
|
CT_DoLog EXTRA "Housekeeping for final gcc compiler"
|
|
|
|
CT_Pushd "${prefix}"
|
|
|
|
find . -type f -name "*.la" -exec rm {} \; |CT_DoLog ALL
|
|
|
|
CT_Popd
|
|
|
|
|
2012-02-13 21:18:02 +00:00
|
|
|
if [ "${build_manuals}" = "yes" ]; then
|
2011-11-15 21:06:21 +00:00
|
|
|
CT_DoLog EXTRA "Building the GCC manuals"
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make pdf html
|
2011-11-15 21:06:21 +00:00
|
|
|
CT_DoLog EXTRA "Installing the GCC manuals"
|
2016-11-21 07:50:17 +00:00
|
|
|
CT_DoExecLog ALL make install-{pdf,html}-gcc
|
2011-11-15 21:06:21 +00:00
|
|
|
fi
|
|
|
|
|
2017-01-14 05:24:16 +00:00
|
|
|
# Create a symlink ${CT_TARGET}-cc to ${CT_TARGET}-${CT_CC} to always be able
|
2007-07-08 17:44:59 +00:00
|
|
|
# to call the C compiler with the same, somewhat canonical name.
|
2010-04-20 09:39:13 +00:00
|
|
|
# check whether compiler has an extension
|
2017-01-14 05:24:16 +00:00
|
|
|
file="$( ls -1 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${CT_CC}."* 2>/dev/null || true )"
|
2010-04-20 09:39:13 +00:00
|
|
|
[ -z "${file}" ] || ext=".${file##*.}"
|
2017-01-14 05:24:16 +00:00
|
|
|
if [ -f "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${CT_CC}${ext}" ]; then
|
|
|
|
CT_DoExecLog ALL ln -sfv "${CT_TARGET}-${CT_CC}${ext}" "${prefix}/bin/${CT_TARGET}-cc${ext}"
|
2015-04-03 08:32:16 +00:00
|
|
|
fi
|
2007-07-08 17:44:59 +00:00
|
|
|
|
2017-01-14 05:24:16 +00:00
|
|
|
cc_gcc_multilib_housekeeping cc="${prefix}/bin/${CT_TARGET}-${CT_CC}" \
|
multilib: Determine which options may pass through.
On some arches (e.g. MIPS) the options like -mabi do not work if
specified more than once (see the comment in 100-gcc.sh). Therefore,
we need to determine which of the options produced by <arch>.sh can
be passed to multilib builds and which must be removed (i.e., which
options vary among the multilibs).
This presents a chicken-and-egg problem. GCC developers, in their
infinite wisdom, do not allow arbitrary multilib specification to be
supplied to GCC's configure. Instead, the target (and sometimes some
extra options) determine the set of multilibs - which may include
different CPUs, different ABIs, different endianness, different FPUs,
different floating-point ABIs, ... That is, we don't know which parts
vary until we build GCC and ask it.
So, the solution implemented here is:
- For multilib builds, start with empty CT_ARCH_TARGET_CFLAGS/LDFLAGS.
- For multilib builds, require core pass 1. Pass 1 does not build any
target binaries, so at that point, our target options have not been
used yet.
- Provide an API to modify the environment variables for the steps that
follow the current one.
- As a part of multilib-related housekeeping, determine the variable
part of multilibs and filter out these options; pass the rest into
CT_TARGET_CFLAGS/LDFLAGS.
This still does not handle extra dependencies between GCC options (like
-ma implying -mcpu=X -mtune=Y, etc.) but I feel that would complicate
matters too much. Let's leave this until there's a compelling case for
it.
Also, query GCC's sysroot suffix for targets that use it (SuperH,
for example) - the default multilib may not work if the command line
specifies the default option explicitly (%sysroot_suffix_spec is not
aware of multilib defaults).
Signed-off-by: Alexey Neyman <stilor@att.net>
2016-03-30 19:15:54 +00:00
|
|
|
host="${host}"
|
2007-02-24 11:00:05 +00:00
|
|
|
}
|