comment "boost needs a toolchain w/ C++, threads, wchar"
	depends on !BR2_INSTALL_LIBSTDCPP || !BR2_TOOLCHAIN_HAS_THREADS || !BR2_USE_WCHAR

config BR2_PACKAGE_BOOST
	bool "boost"
	depends on BR2_INSTALL_LIBSTDCPP
	# Boost could theorically be built with threading=single, but
	# that unfortunately doesn't work. Until someone fixes that,
	# let's depend on threads.
	depends on BR2_TOOLCHAIN_HAS_THREADS
	depends on BR2_USE_WCHAR
	help
	  A general purpose C++ library

	  http://www.boost.org/

if BR2_PACKAGE_BOOST

choice
	prompt "Layout"
	default BR2_PACKAGE_BOOST_LAYOUT_SYSTEM
	help
	  Selects the layout of Boost binary names

config BR2_PACKAGE_BOOST_LAYOUT_SYSTEM
	bool "system"
	help
	  Boost binary names do not include the Boost version number
	  or the name and version number of the compiler.

config BR2_PACKAGE_BOOST_LAYOUT_TAGGED
	bool "tagged"
	help
	  Boost binary names include the encoded build properties such
	  as variant and threading, but do not include compiler name
	  and version, or Boost version. This option is useful if you
	  build several variants of Boost, using the same compiler.

config BR2_PACKAGE_BOOST_LAYOUT_VERSIONED
	bool "versioned"
	help
	  Boost binary names include the Boost version number, name
	  and version of the compiler and encoded build properties.

endchoice

config BR2_PACKAGE_BOOST_LAYOUT
	string
	default "system" if BR2_PACKAGE_BOOST_LAYOUT_SYSTEM
	default "tagged" if BR2_PACKAGE_BOOST_LAYOUT_TAGGED
	default "versioned" if BR2_PACKAGE_BOOST_LAYOUT_VERSIONED

config BR2_PACKAGE_BOOST_ATOMIC
	bool "boost-atomic"
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS
	help
	  C++11-style atomic<>.

config BR2_PACKAGE_BOOST_CHRONO
	bool "boost-chrono"
	select BR2_PACKAGE_BOOST_SYSTEM
	help
	  Useful time utilities. C++11.

config BR2_PACKAGE_BOOST_CONTAINER
	bool "boost-container"
	help
	  Standard library containers and extensions.

# see
# http://www.boost.org/doc/libs/1_59_0/libs/context/doc/html/context/architectures.html
# for the list of supported architectures. Sparc pretends to be
# supported, but it doesn't build.
config BR2_PACKAGE_BOOST_CONTEXT_ARCH_SUPPORTS
	bool
	default y if ((BR2_arm || BR2_armeb) && BR2_ARM_CPU_HAS_ARM)
	default y if BR2_i386
	default y if BR2_mips
	default y if BR2_mipsel
	default y if BR2_powerpc
	default y if BR2_x86_64

config BR2_PACKAGE_BOOST_CONTEXT
	bool "boost-context"
	depends on BR2_PACKAGE_BOOST_CONTEXT_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS \
		|| BR2_TOOLCHAIN_GCC_AT_LEAST_6 # boost-thread
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735
	select BR2_PACKAGE_BOOST_THREAD if !BR2_TOOLCHAIN_GCC_AT_LEAST_6
	help
	  C++11 context switching library.

config BR2_PACKAGE_BOOST_CONTRACT
	bool "boost-contract"
	# pthread_condattr_setclock
	depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL
	select BR2_PACKAGE_BOOST_SYSTEM
	help
	  Contract programming for C++.

comment "boost-contract needs a toolchain w/ NPTL"
	depends on !BR2_TOOLCHAIN_HAS_THREADS_NPTL

config BR2_PACKAGE_BOOST_COROUTINE
	bool "boost-coroutine"
	depends on BR2_PACKAGE_BOOST_CONTEXT_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS # boost-thread
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # boost-context, boost-thread
	select BR2_PACKAGE_BOOST_CHRONO
	select BR2_PACKAGE_BOOST_CONTEXT
	select BR2_PACKAGE_BOOST_SYSTEM
	select BR2_PACKAGE_BOOST_THREAD
	help
	  deprecated coroutine library, the non-depricated coroutine2
	  library is a header-only library and does not need to be
	  selected.

comment "boost-coroutine needs a toolchain not affected by GCC bug 64735"
	depends on BR2_PACKAGE_BOOST_CONTEXT_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS
	depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735

config BR2_PACKAGE_BOOST_DATE_TIME
	bool "boost-date_time"
	help
	  A set of date-time libraries based on generic programming
	  concepts.

config BR2_PACKAGE_BOOST_EXCEPTION
	bool "boost-exception"
	help
	  The Boost Exception library supports transporting of arbitrary
	  data in exception objects, and transporting of exceptions
	  between threads.

config BR2_PACKAGE_BOOST_FIBER
	bool "boost-fiber"
	depends on BR2_PACKAGE_BOOST_CONTEXT_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL
	# mips support uses the "pause" instruction, only available
	# since mips32r2/mips64r2.
	depends on !BR2_MIPS_CPU_MIPS32 && !BR2_MIPS_CPU_MIPS64
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS \
		|| BR2_TOOLCHAIN_GCC_AT_LEAST_6 # boost-context -> boost-thread
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # boost-context
	select BR2_PACKAGE_BOOST_CONTEXT
	select BR2_PACKAGE_BOOST_FILESYSTEM
	select BR2_PACKAGE_BOOST_SYSTEM
	help
	  C++11 userland threads library.

comment "boost-fiber needs a toolchain w/ NPTL"
	depends on BR2_PACKAGE_BOOST_CONTEXT_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS \
		|| BR2_TOOLCHAIN_GCC_AT_LEAST_6
	depends on !BR2_TOOLCHAIN_HAS_THREADS_NPTL

comment "boost-fiber needs a toolchain not affected by GCC bug 64735"
	depends on BR2_PACKAGE_BOOST_CONTEXT_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS \
		|| BR2_TOOLCHAIN_GCC_AT_LEAST_6
	depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735

config BR2_PACKAGE_BOOST_FILESYSTEM
	bool "boost-filesystem"
	select BR2_PACKAGE_BOOST_SYSTEM
	help
	  The Boost Filesystem Library provides portable facilities to
	  query and manipulate paths, files, and directories.

config BR2_PACKAGE_BOOST_GRAPH
	bool "boost-graph"
	select BR2_PACKAGE_BOOST_REGEX
	help
	  The BGL graph interface and graph components are generic, in
	  the same sense as the the Standard Template Library (STL).

config BR2_PACKAGE_BOOST_GRAPH_PARALLEL
	bool "boost-graph_parallel"
	help
	  The PBGL graph interface and graph components are generic, in
	  the same sense as the the Standard Template Library (STL).

config BR2_PACKAGE_BOOST_IOSTREAMS
	bool "boost-iostreams"
	select BR2_PACKAGE_BZIP2
	select BR2_PACKAGE_ZLIB
	help
	  Boost.IOStreams provides a framework for defining streams,
	  stream buffers and i/o filters.

config BR2_PACKAGE_BOOST_JSON
	bool "boost-json"
	select BR2_PACKAGE_BOOST_CONTAINER
	help
	  Boost.JSON is a portable C++ library which provides containers
	  and algorithms that implement JavaScript Object Notation, or
	  simply "JSON", a lightweight data-interchange format.

	  To use the library "header-only" this option is not needed.

config BR2_PACKAGE_BOOST_LOCALE
	bool "boost-locale"
	# When boost-locale is enabled with icu support, Boost no
	# longer supports building the libboost_* libraries as static
	# libraries, causing build failures when other boost features
	# than boost-locale are enabled. To work around this, we
	# prevent using boost-locale on static linking configurations
	# with icu enabled. See
	# https://svn.boost.org/trac/boost/ticket/9685 for more
	# details.
	depends on !(BR2_STATIC_LIBS && BR2_PACKAGE_ICU)
	depends on !(BR2_TOOLCHAIN_HAS_GCC_BUG_64735 && BR2_PACKAGE_ICU) # boost-thread
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS \
		|| !BR2_PACKAGE_ICU # boost-thread
	select BR2_PACKAGE_BOOST_SYSTEM
	select BR2_PACKAGE_BOOST_THREAD if BR2_PACKAGE_ICU
	select BR2_PACKAGE_LIBICONV if !BR2_ENABLE_LOCALE
	help
	  Provide localization and Unicode handling tools for C++.

comment "boost-locale needs a toolchain w/ dynamic library"
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS
	depends on BR2_PACKAGE_ICU
	depends on BR2_STATIC_LIBS

comment "boost-locale needs a toolchain not affected by GCC bug 64735"
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS
	depends on BR2_PACKAGE_ICU
	depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735

config BR2_PACKAGE_BOOST_LOG
	bool "boost-log"
	depends on !BR2_RISCV_32
	depends on BR2_TOOLCHAIN_HAS_THREADS_NPTL
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS # boost-atomic
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # boost-thread
	select BR2_PACKAGE_BOOST_ATOMIC
	select BR2_PACKAGE_BOOST_DATE_TIME
	select BR2_PACKAGE_BOOST_FILESYSTEM
	select BR2_PACKAGE_BOOST_REGEX
	select BR2_PACKAGE_BOOST_SYSTEM
	select BR2_PACKAGE_BOOST_THREAD
	help
	  Logging library.

comment "boost-log needs a toolchain w/ NPTL"
	depends on !BR2_RISCV_32
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS
	depends on !BR2_TOOLCHAIN_HAS_THREADS_NPTL

comment "boost-log needs a toolchain not affected by GCC bug 64735"
	depends on !BR2_RISCV_32
	depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735

config BR2_PACKAGE_BOOST_MATH
	bool "boost-math"
	help
	  Boost.Math includes several contributions in the domain of
	  mathematics:

	  The Greatest Common Divisor and Least Common
	  Multiple library provides run-time and compile-time evaluation
	  of the greatest common divisor (GCD) or least common multiple
	  (LCM) of two integers.

	  The Special Functions library currently provides eight
	  templated special functions, in namespace boost.

	  The Complex Number Inverse Trigonometric Functions are the
	  inverses of trigonometric functions currently present in the
	  C++ standard.

	  Quaternions are a relative of complex numbers often used to
	  parameterise rotations in three dimentional space.

	  Octonions, like quaternions, are a relative of complex
	  numbers.

config BR2_PACKAGE_BOOST_MPI
	bool "boost-mpi"
	help
	  Message Passing Interface library, for use in
	  distributed-memory parallel application programming.

config BR2_PACKAGE_BOOST_NOWIDE
	bool "boost-nowide"
	help
	  Library for cross-platform, unicode aware programming.

config BR2_PACKAGE_BOOST_PROGRAM_OPTIONS
	bool "boost-program_options"
	help
	  The program_options library allows program developers to
	  obtain program options, that is (name, value) pairs from the
	  user, via conventional methods such as command line and config
	  file.

config BR2_PACKAGE_BOOST_PYTHON
	bool "boost-python"
	depends on BR2_PACKAGE_PYTHON || BR2_PACKAGE_PYTHON3
	help
	  The Boost Python Library is a framework for interfacing Python
	  and C++. It allows you to quickly and seamlessly expose C++
	  classes functions and objects to Python, and vice-versa,
	  using no special tools -- just your C++ compiler.

config BR2_PACKAGE_BOOST_RANDOM
	bool "boost-random"
	select BR2_PACKAGE_BOOST_SYSTEM
	help
	  A complete system for random number generation.

config BR2_PACKAGE_BOOST_REGEX
	bool "boost-regex"
	help
	  A new infrastructure for generic algorithms that builds on top
	  of the new iterator concepts.

config BR2_PACKAGE_BOOST_SERIALIZATION
	bool "boost-serialization"
	help
	  Serialization for persistence and marshalling.

config BR2_PACKAGE_BOOST_STACKTRACE
	bool "boost-stacktrace"
	depends on !BR2_STATIC_LIBS
	help
	  Gather, store, copy and print backtraces.

comment "boost-stacktrace needs a toolchain w/ dynamic library"
	depends on BR2_STATIC_LIBS

config BR2_PACKAGE_BOOST_SYSTEM
	bool "boost-system"
	help
	  Operating system support, including the diagnostics support
	  that will be part of the C++0x standard library.

config BR2_PACKAGE_BOOST_TEST
	bool "boost-test"
	depends on BR2_USE_MMU # fork()
	select BR2_PACKAGE_BOOST_SYSTEM
	select BR2_PACKAGE_BOOST_TIMER
	help
	  Support for simple program testing, full unit testing, and for
	  program execution monitoring.

config BR2_PACKAGE_BOOST_THREAD
	bool "boost-thread"
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # std::current_exception
	select BR2_PACKAGE_BOOST_CHRONO
	select BR2_PACKAGE_BOOST_SYSTEM
	help
	  Portable C++ multi-threading. C++11, C++14.

comment "boost-thread needs a toolchain not affected by GCC bug 64735"
	depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735

config BR2_PACKAGE_BOOST_TIMER
	bool "boost-timer"
	select BR2_PACKAGE_BOOST_CHRONO
	select BR2_PACKAGE_BOOST_SYSTEM
	help
	  Event timer, progress timer, and progress display classes.

config BR2_PACKAGE_BOOST_TYPE_ERASURE
	bool "boost-type_erasure"
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS # boost-thread
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # boost-thread
	select BR2_PACKAGE_BOOST_SYSTEM
	select BR2_PACKAGE_BOOST_THREAD
	help
	  Runtime polymorphism based on concepts.

comment "boost-type_erasure needs a toolchain not affected by GCC bug 64735"
	depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735

config BR2_PACKAGE_BOOST_WAVE
	bool "boost-wave"
	# limitation of assembler for coldfire
	# error: Tried to convert PC relative branch to absolute jump
	depends on !BR2_m68k_cf
	depends on BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS # boost-thread
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # boost-thread
	select BR2_PACKAGE_BOOST_DATE_TIME
	select BR2_PACKAGE_BOOST_FILESYSTEM
	select BR2_PACKAGE_BOOST_SYSTEM
	select BR2_PACKAGE_BOOST_THREAD
	help
	  The Boost.Wave library is a Standards conformant, and highly
	  configurable implementation of the mandated C99/C++
	  preprocessor functionality packed behind an easy to use
	  iterator interface.

comment "boost-wave needs a toolchain not affected by GCC bug 64735"
	depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735

endif
