# C++ configuration options

# Copyright (c) 2018 B. Leforestier
# SPDX-License-Identifier: Apache-2.0

menu "C++ Language Support"

config CPP
	bool "C++ support for the application"
	select NONZERO_SPINLOCK_SIZE
	help
	  This option enables the use of applications built with C++.

if CPP

config STD_CPP_VERSION
	int
	default 199711 if STD_CPP98
	default 201103 if STD_CPP11
	default 201402 if STD_CPP14
	default 201703 if STD_CPP17
	default 202002 if STD_CPP20 || STD_CPP2A
	default 202302 if STD_CPP23 || STD_CPP2B
	help
	  The version number of C++ standard being used (NOTE: this uses the
	  full year and month, and is the same as the __cplusplus macro defined
	  by the compiler). This config can be used to check for a minimum
	  supported version. Example:

	    depends on STD_CPP_VERSION >= 201703

	  Adding this to your library's enablement Kconfig will force a minimum
	  c++17 standard.

	  The full year is used so c++98 can be checked using > and < operators
	  without conflicting with c++11 or higher.

choice STD_CPP
	prompt "C++ Standard"
	default STD_CPP11
	help
	  C++ Standards.

config STD_CPP98
	bool "C++ 98"
	help
	  1998 C++ standard as modified by the 2003 technical corrigendum
	  and some later defect reports.

config STD_CPP11
	bool "C++ 11"
	help
	  2011 C++ standard, previously known as C++0x.

config STD_CPP14
	bool "C++ 14"
	help
	  2014 C++ standard.

config STD_CPP17
	bool "C++ 17"
	help
	  2017 C++ standard, previously known as C++0x.

config STD_CPP2A
	bool "C++ 2a"
	help
	  Next revision of the C++ standard, which is expected to be published in 2020.

config STD_CPP20
	bool "C++ 20"
	help
	  2020 C++ standard, previously known as C++2A.

config STD_CPP2B
	bool "C++ 2b"
	help
	  Next revision of the C++ standard, which is expected to be published in 2023.

config STD_CPP23
	bool "C++ 23"
	help
	  2023 C++ standard, previously known as C++2B.

endchoice

config REQUIRES_FULL_LIBCPP
	bool "Require complete C++ standard library"
	select REQUIRES_FULL_LIBC
	help
	  Indicates that a full C++ standard library is required, either by
	  a subsystem or an application. This will also include a full C
	  library implementation.

config FULL_LIBCPP_SUPPORTED
	bool
	help
	  Selected when the target has at least one C++ library that offers a
	  complete implementation and which would be selected when
	  REQUIRES_FULL_LIBCPP is set.

choice LIBCPP_IMPLEMENTATION
	prompt "C++ Standard Library Implementation"
	default EXTERNAL_LIBCPP if REQUIRES_FULL_LIBCPP && NATIVE_BUILD
	default LIBCXX_LIBCPP if REQUIRES_FULL_LIBCPP && "$(TOOLCHAIN_HAS_LIBCXX)" = "y" && "$(TOOLCHAIN_VARIANT_COMPILER)" = "llvm"
	default GLIBCXX_LIBCPP if REQUIRES_FULL_LIBCPP
	default MINIMAL_LIBCPP

config MINIMAL_LIBCPP
	bool "Minimal C++ Library"
	depends on !REQUIRES_FULL_LIBCPP
	help
	  Build with the minimal C++ library provided by Zephyr.

	  The Zephyr minimal C++ library only provides a very limited subset
	  of the standard C++ library and is mainly intended for use with the
	  applications that do not require the Standard Template Library (STL).

config GLIBCXX_LIBCPP
	bool "GNU C++ Standard Library"
	depends on "$(TOOLCHAIN_HAS_GLIBCXX)" = "y"
	depends on NEWLIB_LIBC || PICOLIBC
	select FULL_LIBCPP_SUPPORTED
	help
	  Build with GNU C++ Standard Library (libstdc++) provided by the GNU
	  Compiler Collection (GCC)-based toolchain.

config LIBCXX_LIBCPP
	bool "LLVM C++ Standard Library"
	depends on "$(TOOLCHAIN_HAS_LIBCXX)" = "y"
	depends on NEWLIB_LIBC || PICOLIBC
	depends on "$(TOOLCHAIN_VARIANT_COMPILER)" = "llvm"
	select FULL_LIBCPP_SUPPORTED
	help
	  Build with LLVM C++ Standard Library (libc++) provided by LLVM
	  toolchain. Information about library can be found at
	  https://libcxx.llvm.org

config ARCMWDT_LIBCPP
	bool "ARC MWDT C++ Library"
	depends on ARCMWDT_LIBC
	help
	  Build with ARC MetaWare C++ Standard Library provided by the ARC
	  MetaWare Development Tools (MWDT) toolchain.

config EXTERNAL_LIBCPP
	bool "External C++ standard library"
	help
	  Build and link with an external/user-provided C++ standard library.

config EXTERNAL_MODULE_LIBCPP
	bool "External C++ standard library module"
	help
	  Build an external/user-provided C++ standard library.

endchoice # LIBCPP_IMPLEMENTATION

if !MINIMAL_LIBCPP

config CPP_EXCEPTIONS
	bool "C++ exceptions support"
	depends on !NEWLIB_LIBC_NANO
	help
	  This option enables support of C++ exceptions.

config CPP_RTTI
	bool "C++ RTTI support"
	help
	  This option enables support of C++ RTTI.

endif # !MINIMAL_LIBCPP

endif # CPP

endmenu
