comment "GCC Options"

choice
	prompt "GCC compiler Version"
	default BR2_GCC_VERSION_ARC if BR2_arc
	default BR2_GCC_VERSION_OR1K if BR2_or1k
	default BR2_GCC_VERSION_6_X
	help
	  Select the version of gcc you wish to use.

config BR2_GCC_VERSION_ARC
	bool "gcc arc (7.x)"
	# Only supported architecture
	depends on BR2_arc
	select BR2_TOOLCHAIN_GCC_AT_LEAST_7

config BR2_GCC_VERSION_OR1K
	bool "gcc or1k (5.x)"
	# Only supported architecture
	depends on BR2_or1k
	select BR2_TOOLCHAIN_GCC_AT_LEAST_5

config BR2_GCC_VERSION_4_9_X
	bool "gcc 4.9.x"
	depends on !BR2_ARCH_NEEDS_GCC_AT_LEAST_5
	# Broken or unsupported architectures
	depends on !BR2_arc
	depends on !BR2_or1k
	# musl on microblaze, ppc64 and mips64 unsupported
	depends on !(BR2_TOOLCHAIN_USES_MUSL && (BR2_microblazeel || BR2_microblazebe))
	depends on !(BR2_TOOLCHAIN_USES_MUSL && (BR2_powerpc64 || BR2_powerpc64le))
	depends on !(BR2_TOOLCHAIN_USES_MUSL && (BR2_mips64 || BR2_mips64el))
	# glibc >= 2.26 needs gcc >= 6.2
	depends on !(BR2_TOOLCHAIN_USES_GLIBC && BR2_powerpc64le)
	# glibc >= 2.27 needs gcc >= 5
	depends on !(BR2_TOOLCHAIN_USES_GLIBC && (BR2_aarch64 || BR2_aarch64_be))
	select BR2_TOOLCHAIN_GCC_AT_LEAST_4_9

config BR2_GCC_VERSION_5_X
	bool "gcc 5.x"
	depends on !BR2_ARCH_NEEDS_GCC_AT_LEAST_6
	# Broken or unsupported architectures
	depends on !BR2_arc
	depends on !BR2_or1k
	# musl on ppc64 and mips64 unsupported
	depends on !(BR2_TOOLCHAIN_USES_MUSL && (BR2_powerpc64 || BR2_powerpc64le))
	depends on !(BR2_TOOLCHAIN_USES_MUSL && (BR2_mips64 || BR2_mips64el))
	# glibc >= 2.26 needs gcc >= 6.2
	depends on !(BR2_TOOLCHAIN_USES_GLIBC && BR2_powerpc64le)
	select BR2_TOOLCHAIN_GCC_AT_LEAST_5

config BR2_GCC_VERSION_6_X
	bool "gcc 6.x"
	depends on !BR2_ARCH_NEEDS_GCC_AT_LEAST_7
	# Broken or unsupported architectures
	depends on !BR2_arc
	depends on !BR2_or1k
	select BR2_TOOLCHAIN_GCC_AT_LEAST_6

config BR2_GCC_VERSION_7_X
	bool "gcc 7.x"
	# Broken or unsupported architectures
	depends on !BR2_or1k
	select BR2_TOOLCHAIN_GCC_AT_LEAST_7

endchoice

config BR2_GCC_SUPPORTS_FINEGRAINEDMTUNE
	bool
	default y

config BR2_GCC_VERSION
	string
	default "4.9.4"     if BR2_GCC_VERSION_4_9_X
	default "5.5.0"     if BR2_GCC_VERSION_5_X
	default "6.4.0"     if BR2_GCC_VERSION_6_X
	default "7.3.0"     if BR2_GCC_VERSION_7_X
	default "arc-2018.03" if BR2_GCC_VERSION_ARC
	default "or1k-musl-5.4.0-20170218" if BR2_GCC_VERSION_OR1K

config BR2_EXTRA_GCC_CONFIG_OPTIONS
	string "Additional gcc options"
	default ""
	help
	  Any additional gcc configure options you may want to
	  include. Those options are applied for all of the gcc
	  initial, gcc intermediate and gcc final passes.

config BR2_TOOLCHAIN_BUILDROOT_CXX
	bool "Enable C++ support"
	select BR2_INSTALL_LIBSTDCPP
	help
	  Enable this option if you want your toolchain to support the
	  C++ language and you want C++ libraries to be installed on
	  your target system.

comment "Fortran support needs a toolchain w/ wchar"
	depends on BR2_TOOLCHAIN_HAS_LIBQUADMATH
	depends on !BR2_USE_WCHAR # libquadmath

config BR2_TOOLCHAIN_BUILDROOT_FORTRAN
	bool "Enable Fortran support"
	# on architecture building libquadmath, wchar is required
	depends on !BR2_TOOLCHAIN_HAS_LIBQUADMATH || \
		(BR2_TOOLCHAIN_HAS_LIBQUADMATH && BR2_USE_WCHAR)
	select BR2_TOOLCHAIN_HAS_FORTRAN
	help
	  Enable this option if you want your toolchain to support the
	  Fortran language and you want Fortran libraries to be
	  installed on your target system.

config BR2_GCC_ENABLE_LTO
	bool "Enable compiler link-time-optimization support"
	select BR2_BINUTILS_ENABLE_LTO
	help
	  This option enables link-time optimization (LTO) support in
	  gcc.

config BR2_GCC_ENABLE_OPENMP
	bool "Enable compiler OpenMP support"
	depends on !BR2_PTHREADS_NONE && !BR2_arc && !BR2_microblaze
	help
	  Enable OpenMP support for the compiler

config BR2_GCC_ENABLE_LIBMUDFLAP
	bool "Enable libmudflap support"
	# There are architectures, or specific configurations for
	# which mudflap is not supported.
	depends on !BR2_ARM_INSTRUCTIONS_THUMB && !BR2_powerpc_SPE
	depends on !BR2_TOOLCHAIN_GCC_AT_LEAST_4_9
	help
	  libmudflap is a gcc library used for the mudflap pointer
	  debugging functionality. It is only needed if you intend to
	  use the -fmudflap gcc flag.

	  See http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging and
	  the help of the gcc -fmudflap option for more details.

	  If you're unsure, leave this option disabled.

config BR2_GCC_ENABLE_GRAPHITE
	bool "Enable graphite support"
	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_5
	help
	  This option enables the graphite optimizations in the
	  compiler.

comment "graphite support needs gcc >= 5.x"
	depends on !BR2_TOOLCHAIN_GCC_AT_LEAST_5
