545ca6a0f2
We used to exclude GCC's test-suite for quite some time now mostly for the sake of space reduction. But: 1. On each GCC version bump we need to revise that functionality as we need to accommodate changes in GCC sources and this couldn't be automated 2. The space reduction is significant, but not huge. The two test suites together take up 290MB, out of 660MB total for GCC (each of them times two because there is the -initial and -final copy). However, whenever we build GCC, we also have kernel headers (about 900MB) and a libc (e.g. glibc is 250MB). So at best, it saves less than 20%. 3. It doesn't really save on build time either. Below are timings of 2 runs on my laptop: a) Vanilla master: --------------------->8--------------------- time make host-gcc-final real 7m15.114s user 19m36.611s sys 2m26.927s --------------------->8--------------------- b) master + testsuite: --------------------->8--------------------- time make host-gcc-final real 7m59.860s user 20m21.668s sys 2m36.618s --------------------->8--------------------- From figures above it's seen that difference is ~45 seconds or ~10%. On both host-gcc-initial and -final we may save ~1.5 minutes... but these are not the only components we build and compared to a total toolchain build time IMHO it is not that much time to care especially traded for maintenance costs on GCC version bumps. Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> Cc: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Cc: Bernd Kuhls <bernd.kuhls@t-online.de> Cc: Romain Naour <romain.naour@gmail.com> Cc: Peter Korsgaard <peter@korsgaard.com> Cc: Arnout Vandecappelle <arnout@mind.be> [Arnout: add explanation about size impact.] Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
329 lines
10 KiB
Makefile
329 lines
10 KiB
Makefile
################################################################################
|
|
#
|
|
# Common variables for the gcc-initial and gcc-final packages.
|
|
#
|
|
################################################################################
|
|
|
|
#
|
|
# Version, site and source
|
|
#
|
|
|
|
GCC_VERSION = $(call qstrip,$(BR2_GCC_VERSION))
|
|
|
|
ifeq ($(BR2_GCC_VERSION_ARC),y)
|
|
GCC_SITE = $(call github,foss-for-synopsys-dwc-arc-processors,gcc,$(GCC_VERSION))
|
|
GCC_SOURCE = gcc-$(GCC_VERSION).tar.gz
|
|
else ifeq ($(BR2_or1k),y)
|
|
GCC_SITE = $(call github,openrisc,or1k-gcc,$(GCC_VERSION))
|
|
GCC_SOURCE = gcc-$(GCC_VERSION).tar.gz
|
|
else
|
|
GCC_SITE = $(BR2_GNU_MIRROR:/=)/gcc/gcc-$(GCC_VERSION)
|
|
# From version 5.5.0, 6.4.0, 7.2.0 and 8.1.0 a bz2 release tarball is not
|
|
# provided anymore. Use the xz tarball instead.
|
|
ifeq ($(BR2_GCC_VERSION_4_9_X),y)
|
|
GCC_SOURCE = gcc-$(GCC_VERSION).tar.bz2
|
|
else
|
|
GCC_SOURCE = gcc-$(GCC_VERSION).tar.xz
|
|
endif
|
|
endif
|
|
|
|
#
|
|
# Xtensa special hook
|
|
#
|
|
define HOST_GCC_XTENSA_OVERLAY_EXTRACT
|
|
$(call arch-xtensa-overlay-extract,$(@D),gcc)
|
|
endef
|
|
|
|
#
|
|
# Apply patches
|
|
#
|
|
|
|
ifeq ($(ARCH),powerpc)
|
|
ifneq ($(BR2_SOFT_FLOAT),)
|
|
define HOST_GCC_APPLY_POWERPC_PATCH
|
|
$(APPLY_PATCHES) $(@D) package/gcc/$(GCC_VERSION) 1000-powerpc-link-with-math-lib.patch.conditional
|
|
endef
|
|
endif
|
|
endif
|
|
|
|
# gcc is a special package, not named gcc, but gcc-initial and
|
|
# gcc-final, but patches are nonetheless stored in package/gcc in the
|
|
# tree, and potentially in BR2_GLOBAL_PATCH_DIR directories as well.
|
|
define HOST_GCC_APPLY_PATCHES
|
|
for patchdir in \
|
|
package/gcc/$(GCC_VERSION) \
|
|
$(addsuffix /gcc/$(GCC_VERSION),$(call qstrip,$(BR2_GLOBAL_PATCH_DIR))) \
|
|
$(addsuffix /gcc,$(call qstrip,$(BR2_GLOBAL_PATCH_DIR))) ; do \
|
|
if test -d $${patchdir}; then \
|
|
$(APPLY_PATCHES) $(@D) $${patchdir} \*.patch || exit 1; \
|
|
fi; \
|
|
done
|
|
$(HOST_GCC_APPLY_POWERPC_PATCH)
|
|
endef
|
|
|
|
HOST_GCC_EXCLUDES = \
|
|
libjava/* libgo/*
|
|
|
|
#
|
|
# Create 'build' directory and configure symlink
|
|
#
|
|
|
|
define HOST_GCC_CONFIGURE_SYMLINK
|
|
mkdir -p $(@D)/build
|
|
ln -sf ../configure $(@D)/build/configure
|
|
endef
|
|
|
|
#
|
|
# Common configuration options
|
|
#
|
|
|
|
HOST_GCC_COMMON_DEPENDENCIES = \
|
|
host-binutils \
|
|
host-gmp \
|
|
host-mpc \
|
|
host-mpfr \
|
|
$(if $(BR2_BINFMT_FLAT),host-elf2flt)
|
|
|
|
HOST_GCC_COMMON_CONF_OPTS = \
|
|
--target=$(GNU_TARGET_NAME) \
|
|
--with-sysroot=$(STAGING_DIR) \
|
|
--disable-__cxa_atexit \
|
|
--with-gnu-ld \
|
|
--disable-libssp \
|
|
--disable-multilib \
|
|
--disable-decimal-float \
|
|
--with-gmp=$(HOST_DIR) \
|
|
--with-mpc=$(HOST_DIR) \
|
|
--with-mpfr=$(HOST_DIR) \
|
|
--with-pkgversion="Buildroot $(BR2_VERSION_FULL)" \
|
|
--with-bugurl="http://bugs.buildroot.net/"
|
|
|
|
# Don't build documentation. It takes up extra space / build time,
|
|
# and sometimes needs specific makeinfo versions to work
|
|
HOST_GCC_COMMON_CONF_ENV = \
|
|
MAKEINFO=missing
|
|
|
|
GCC_COMMON_TARGET_CFLAGS = $(TARGET_CFLAGS)
|
|
GCC_COMMON_TARGET_CXXFLAGS = $(TARGET_CXXFLAGS)
|
|
|
|
# Propagate options used for target software building to GCC target libs
|
|
HOST_GCC_COMMON_CONF_ENV += CFLAGS_FOR_TARGET="$(GCC_COMMON_TARGET_CFLAGS)"
|
|
HOST_GCC_COMMON_CONF_ENV += CXXFLAGS_FOR_TARGET="$(GCC_COMMON_TARGET_CXXFLAGS)"
|
|
|
|
# libitm needs sparc V9+
|
|
ifeq ($(BR2_sparc_v8)$(BR2_sparc_leon3),y)
|
|
HOST_GCC_COMMON_CONF_OPTS += --disable-libitm
|
|
endif
|
|
|
|
# libmpx uses secure_getenv and struct _libc_fpstate not present in musl
|
|
ifeq ($(BR2_TOOLCHAIN_BUILDROOT_MUSL)$(BR2_TOOLCHAIN_GCC_AT_LEAST_6),yy)
|
|
HOST_GCC_COMMON_CONF_OPTS += --disable-libmpx
|
|
endif
|
|
|
|
# quadmath support requires wchar
|
|
ifeq ($(BR2_USE_WCHAR)$(BR2_TOOLCHAIN_HAS_LIBQUADMATH),yy)
|
|
HOST_GCC_COMMON_CONF_OPTS += --enable-libquadmath
|
|
else
|
|
HOST_GCC_COMMON_CONF_OPTS += --disable-libquadmath
|
|
endif
|
|
|
|
# libsanitizer requires wordexp, not in default uClibc config. Also
|
|
# doesn't build properly with musl.
|
|
ifeq ($(BR2_TOOLCHAIN_BUILDROOT_UCLIBC)$(BR2_TOOLCHAIN_BUILDROOT_MUSL),y)
|
|
HOST_GCC_COMMON_CONF_OPTS += --disable-libsanitizer
|
|
endif
|
|
|
|
# libsanitizer is broken for SPARC
|
|
# https://bugs.busybox.net/show_bug.cgi?id=7951
|
|
ifeq ($(BR2_sparc)$(BR2_sparc64),y)
|
|
HOST_GCC_COMMON_CONF_OPTS += --disable-libsanitizer
|
|
endif
|
|
|
|
# TLS support is not needed on uClibc/no-thread and
|
|
# uClibc/linux-threads, otherwise, for all other situations (glibc,
|
|
# musl and uClibc/NPTL), we need it.
|
|
ifeq ($(BR2_TOOLCHAIN_BUILDROOT_UCLIBC)$(BR2_PTHREADS)$(BR2_PTHREADS_NONE),yy)
|
|
HOST_GCC_COMMON_CONF_OPTS += --disable-tls
|
|
else
|
|
HOST_GCC_COMMON_CONF_OPTS += --enable-tls
|
|
endif
|
|
|
|
ifeq ($(BR2_GCC_ENABLE_LTO),y)
|
|
HOST_GCC_COMMON_CONF_OPTS += --enable-plugins --enable-lto
|
|
endif
|
|
|
|
ifeq ($(BR2_GCC_ENABLE_LIBMUDFLAP),y)
|
|
HOST_GCC_COMMON_CONF_OPTS += --enable-libmudflap
|
|
else
|
|
HOST_GCC_COMMON_CONF_OPTS += --disable-libmudflap
|
|
endif
|
|
|
|
ifeq ($(BR2_PTHREADS_NONE),y)
|
|
HOST_GCC_COMMON_CONF_OPTS += \
|
|
--disable-threads \
|
|
--disable-libitm \
|
|
--disable-libatomic
|
|
else
|
|
HOST_GCC_COMMON_CONF_OPTS += --enable-threads
|
|
endif
|
|
|
|
# gcc 5 doesn't need cloog any more, see
|
|
# https://gcc.gnu.org/gcc-5/changes.html and we don't support graphite
|
|
# on GCC 4.9.x, so only isl is needed.
|
|
ifeq ($(BR2_GCC_ENABLE_GRAPHITE),y)
|
|
HOST_GCC_COMMON_DEPENDENCIES += host-isl
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-isl=$(HOST_DIR)
|
|
else
|
|
HOST_GCC_COMMON_CONF_OPTS += --without-isl --without-cloog
|
|
endif
|
|
|
|
ifeq ($(BR2_arc)$(BR2_or1k),y)
|
|
HOST_GCC_COMMON_DEPENDENCIES += host-flex host-bison
|
|
endif
|
|
|
|
ifeq ($(BR2_SOFT_FLOAT),y)
|
|
# only mips*-*-*, arm*-*-* and sparc*-*-* accept --with-float
|
|
# powerpc seems to be needing it as well
|
|
ifeq ($(BR2_arm)$(BR2_armeb)$(BR2_mips)$(BR2_mipsel)$(BR2_mips64)$(BR2_mips64el)$(BR2_powerpc)$(BR2_sparc),y)
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-float=soft
|
|
endif
|
|
endif
|
|
|
|
# Determine arch/tune/abi/cpu options
|
|
ifneq ($(GCC_TARGET_ARCH),)
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-arch="$(GCC_TARGET_ARCH)"
|
|
endif
|
|
ifneq ($(GCC_TARGET_ABI),)
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-abi="$(GCC_TARGET_ABI)"
|
|
endif
|
|
ifeq ($(BR2_TOOLCHAIN_HAS_MNAN_OPTION),y)
|
|
ifneq ($(GCC_TARGET_NAN),)
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-nan="$(GCC_TARGET_NAN)"
|
|
endif
|
|
endif
|
|
ifneq ($(GCC_TARGET_FP32_MODE),)
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-fp-32="$(GCC_TARGET_FP32_MODE)"
|
|
endif
|
|
ifneq ($(GCC_TARGET_CPU),)
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-cpu=$(GCC_TARGET_CPU)
|
|
endif
|
|
|
|
ifneq ($(GCC_TARGET_FPU),)
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-fpu=$(GCC_TARGET_FPU)
|
|
endif
|
|
|
|
ifneq ($(GCC_TARGET_FLOAT_ABI),)
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-float=$(GCC_TARGET_FLOAT_ABI)
|
|
endif
|
|
|
|
ifneq ($(GCC_TARGET_MODE),)
|
|
HOST_GCC_COMMON_CONF_OPTS += --with-mode=$(GCC_TARGET_MODE)
|
|
endif
|
|
|
|
# Enable proper double/long double for SPE ABI
|
|
ifeq ($(BR2_powerpc_SPE),y)
|
|
HOST_GCC_COMMON_CONF_OPTS += \
|
|
--enable-e500_double \
|
|
--with-long-double-128
|
|
endif
|
|
|
|
# PowerPC64 big endian by default uses the elfv1 ABI, and PowerPC 64
|
|
# little endian by default uses the elfv2 ABI. However, musl has
|
|
# decided to use the elfv2 ABI for both, so we force the elfv2 ABI for
|
|
# Power64 big endian when the selected C library is musl.
|
|
ifeq ($(BR2_TOOLCHAIN_USES_MUSL)$(BR2_powerpc64),yy)
|
|
HOST_GCC_COMMON_CONF_OPTS += \
|
|
--with-abi=elfv2 \
|
|
--without-long-double-128
|
|
endif
|
|
|
|
# Since glibc >= 2.26, poerpc64le requires double/long double which
|
|
# requires at least gcc 6.2.
|
|
# See sysdeps/powerpc/powerpc64le/configure.ac
|
|
ifeq ($(BR2_TOOLCHAIN_USES_GLIBC)$(BR2_TOOLCHAIN_GCC_AT_LEAST_6)$(BR2_powerpc64le),yyy)
|
|
HOST_GCC_COMMON_CONF_OPTS += \
|
|
--with-long-double-128
|
|
endif
|
|
|
|
HOST_GCC_COMMON_TOOLCHAIN_WRAPPER_ARGS += -DBR_CROSS_PATH_SUFFIX='".br_real"'
|
|
|
|
# For gcc-initial, we need to tell gcc that the C library will be
|
|
# providing the ssp support, as it can't guess it since the C library
|
|
# hasn't been built yet.
|
|
#
|
|
# For gcc-final, the gcc logic to detect whether SSP support is
|
|
# available or not in the C library is not working properly for
|
|
# uClibc, so let's be explicit as well.
|
|
HOST_GCC_COMMON_MAKE_OPTS = \
|
|
gcc_cv_libc_provides_ssp=$(if $(BR2_TOOLCHAIN_HAS_SSP),yes,no)
|
|
|
|
ifeq ($(BR2_CCACHE),y)
|
|
HOST_GCC_COMMON_CCACHE_HASH_FILES += $(GCC_DL_DIR)/$(GCC_SOURCE)
|
|
|
|
# Cfr. PATCH_BASE_DIRS in .stamp_patched, but we catch both versioned
|
|
# and unversioned patches unconditionally. Moreover, to facilitate the
|
|
# addition of gcc patches in BR2_GLOBAL_PATCH_DIR, we allow them to be
|
|
# stored in a sub-directory called 'gcc' even if it's not technically
|
|
# the name of the package.
|
|
HOST_GCC_COMMON_CCACHE_HASH_FILES += \
|
|
$(sort $(wildcard \
|
|
package/gcc/$(GCC_VERSION)/*.patch \
|
|
$(addsuffix /$($(PKG)_RAWNAME)/$(GCC_VERSION)/*.patch,$(call qstrip,$(BR2_GLOBAL_PATCH_DIR))) \
|
|
$(addsuffix /$($(PKG)_RAWNAME)/*.patch,$(call qstrip,$(BR2_GLOBAL_PATCH_DIR))) \
|
|
$(addsuffix /gcc/$(GCC_VERSION)/*.patch,$(call qstrip,$(BR2_GLOBAL_PATCH_DIR))) \
|
|
$(addsuffix /gcc/*.patch,$(call qstrip,$(BR2_GLOBAL_PATCH_DIR)))))
|
|
ifeq ($(BR2_xtensa),y)
|
|
HOST_GCC_COMMON_CCACHE_HASH_FILES += $(ARCH_XTENSA_OVERLAY_TAR)
|
|
endif
|
|
ifeq ($(ARCH),powerpc)
|
|
ifneq ($(BR2_SOFT_FLOAT),)
|
|
HOST_GCC_COMMON_CCACHE_HASH_FILES += package/gcc/$(GCC_VERSION)/1000-powerpc-link-with-math-lib.patch.conditional
|
|
endif
|
|
endif
|
|
|
|
# _CONF_OPTS contains some references to the absolute path of $(HOST_DIR)
|
|
# and a reference to the Buildroot git revision (BR2_VERSION_FULL),
|
|
# so substitute those away.
|
|
HOST_GCC_COMMON_TOOLCHAIN_WRAPPER_ARGS += -DBR_CCACHE_HASH=\"`\
|
|
printf '%s\n' $(subst $(HOST_DIR),@HOST_DIR@,\
|
|
$(subst --with-pkgversion="Buildroot $(BR2_VERSION_FULL)",,$($(PKG)_CONF_OPTS))) \
|
|
| sha256sum - $(HOST_GCC_COMMON_CCACHE_HASH_FILES) \
|
|
| cut -c -64 | tr -d '\n'`\"
|
|
endif # BR2_CCACHE
|
|
|
|
# The LTO support in gcc creates wrappers for ar, ranlib and nm which load
|
|
# the lto plugin. These wrappers are called *-gcc-ar, *-gcc-ranlib, and
|
|
# *-gcc-nm and should be used instead of the real programs when -flto is
|
|
# used. However, we should not add the toolchain wrapper for them, and they
|
|
# match the *cc-* pattern. Therefore, an additional case is added for *-ar,
|
|
# *-ranlib and *-nm.
|
|
# According to gfortran manpage, it supports all options supported by gcc, so
|
|
# add gfortran to the list of the program called via the Buildroot wrapper.
|
|
# Avoid that a .br_real is symlinked a second time.
|
|
# Also create <arch>-linux-<tool> symlinks.
|
|
define HOST_GCC_INSTALL_WRAPPER_AND_SIMPLE_SYMLINKS
|
|
$(Q)cd $(HOST_DIR)/bin; \
|
|
for i in $(GNU_TARGET_NAME)-*; do \
|
|
case "$$i" in \
|
|
*.br_real) \
|
|
;; \
|
|
*-ar|*-ranlib|*-nm) \
|
|
ln -snf $$i $(ARCH)-linux$${i##$(GNU_TARGET_NAME)}; \
|
|
;; \
|
|
*cc|*cc-*|*++|*++-*|*cpp|*-gfortran) \
|
|
rm -f $$i.br_real; \
|
|
mv $$i $$i.br_real; \
|
|
ln -sf toolchain-wrapper $$i; \
|
|
ln -sf toolchain-wrapper $(ARCH)-linux$${i##$(GNU_TARGET_NAME)}; \
|
|
ln -snf $$i.br_real $(ARCH)-linux$${i##$(GNU_TARGET_NAME)}.br_real; \
|
|
;; \
|
|
*) \
|
|
ln -snf $$i $(ARCH)-linux$${i##$(GNU_TARGET_NAME)}; \
|
|
;; \
|
|
esac; \
|
|
done
|
|
|
|
endef
|
|
|
|
include $(sort $(wildcard package/gcc/*/*.mk))
|