config BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	bool
	default y if BR2_HOSTARCH = "x86_64"

# Taken from make/autoconf/platform.m4
config BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	bool
	default y if BR2_aarch64
	default y if BR2_arm
	default y if BR2_i386 || BR2_x86_64
	default y if BR2_m68k
	default y if BR2_powerpc || BR2_powerpc64 || BR2_powerpc64le
	default y if BR2_sh

config BR2_PACKAGE_OPENJDK
	bool "openjdk"
	depends on BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	depends on BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	depends on !BR2_SOFT_FLOAT
	depends on !BR2_STATIC_LIBS # glibc
	depends on BR2_INSTALL_LIBSTDCPP # cups
	depends on BR2_TOOLCHAIN_HAS_THREADS # alsa-lib, cups, libusb
	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_4_9 # libusb
	depends on BR2_TOOLCHAIN_USES_GLIBC
	depends on BR2_USE_MMU # cups
	depends on BR2_PACKAGE_XORG7
	select BR2_PACKAGE_ALSA_LIB
	select BR2_PACKAGE_ALSA_LIB_MIXER
	select BR2_PACKAGE_ALSA_LIB_PCM
	select BR2_PACKAGE_ALSA_LIB_RAWMIDI
	select BR2_PACKAGE_ALSA_LIB_SEQ
	select BR2_PACKAGE_CUPS
	select BR2_PACKAGE_FONTCONFIG
	select BR2_PACKAGE_GIFLIB
	select BR2_PACKAGE_JPEG
	select BR2_PACKAGE_LCMS2
	select BR2_PACKAGE_LIBPNG
	select BR2_PACKAGE_LIBUSB
	select BR2_PACKAGE_XLIB_LIBXRANDR
	select BR2_PACKAGE_XLIB_LIBXRENDER
	select BR2_PACKAGE_XLIB_LIBXT
	select BR2_PACKAGE_XLIB_LIBXTST
	select BR2_PACKAGE_ZLIB
	help
	  OpenJDK is a free and open-source implementation of the
	  Java Platform.

	  http://openjdk.java.net/

if BR2_PACKAGE_OPENJDK

choice
	prompt "openjdk version"
	default BR2_OPENJDK_VERSION_LATEST
	help
	  Select the version of OpenJDK you wish to use.

config BR2_OPENJDK_VERSION_LTS
	bool "LTS (OpenJDK 11)"

config BR2_OPENJDK_VERSION_LATEST
	bool "latest (OpenJDK 14)"

endchoice

config BR2_PACKAGE_OPENJDK_FULL_JDK
	bool "Build the full JDK"
	help
	  Install the full JDK instead of just the run time.
	  The full JDK includes several packages used for debugging and
	  development. Some useful tools included with the JDK are:
	    - javaws
	      Command line tool for launching Java Web Start and setting
	      various options.

	    - jcmd:
	      JVM Diagnostic Commands tool: Sends diagnostic command
	      requests to a running Java Virtual Machine.

	    - jinfo
	      Configuration Info for Java: Prints configuration
	      information for a given process or core file or a remote
	      debug server.

	    - jmap
	      Memory Map for Java: Prints shared object memory maps or
	      heap memory details of a given process or core file or a
	      remote debug server.

	    - jsadebugd
	      Serviceability Agent Debug Daemon for Java: Attaches to a
	      process or core file and acts as a debug server.

	    - jstack
	      Stack Trace for Java - Prints a stack trace of threads for
	      a given process or core file or remote debug server.

	    - jstat
	      JVM Statistics Monitoring Tool: Attaches to an
	      instrumented HotSpot Java virtual machine and collects and
	      logs performance statistics as specified by the command
	      line options.

	    - jstatd
	      JVM jstat Daemon - Launches an RMI server application that
	      monitors for the creation and termination of instrumented
	      HotSpot Java virtual machines and provides an interface to
	      allow remote monitoring tools to attach to Java virtual
	      machines running on the local system.

	  Note:
	  While the JDK also comes with several tools which can be used
	  for developing java applications on a target, Buildroot does
	  not support development on a target. Building the full JDK is
	  supported for debugging purposes only.

	  Selecting this option increases the file system by
	  approximately 110M.

choice
	prompt "openjdk variant"
	default BR2_PACKAGE_OPENJDK_JVM_VARIANT_SERVER if !BR2_powerpc
	default BR2_PACKAGE_OPENJDK_JVM_VARIANT_ZERO if BR2_powerpc

config BR2_PACKAGE_OPENJDK_JVM_VARIANT_CLIENT
	bool "client"
	depends on !BR2_powerpc
	help
	  Quick loading, but slower run-time performance.

config BR2_PACKAGE_OPENJDK_JVM_VARIANT_SERVER
	bool "server"
	depends on !BR2_powerpc
	help
	  Slower loading, but faster run-time performance.

config BR2_PACKAGE_OPENJDK_JVM_VARIANT_ZERO
	bool "zero"
	select BR2_PACKAGE_LIBFFI
	help
	  A non-assembler variant with wide arch support, however
	  performance is less then client/server.

	  http://openjdk.java.net/projects/zero

endchoice
endif

comment "openjdk needs X.Org"
	depends on BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	depends on BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	depends on BR2_USE_MMU
	depends on !BR2_PACKAGE_XORG7

comment "openjdk needs glibc, and a toolchain w/ wchar, dynamic library, threads, C++, gcc >= 4.9"
	depends on BR2_USE_MMU
	depends on BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	depends on BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	depends on BR2_STATIC_LIBS || !BR2_INSTALL_LIBSTDCPP || \
		!BR2_TOOLCHAIN_HAS_THREADS || \
		!BR2_TOOLCHAIN_USES_GLIBC || \
		!BR2_TOOLCHAIN_GCC_AT_LEAST_4_9

comment "openjdk does not support soft float configurations"
	depends on BR2_PACKAGE_OPENJDK_ARCH_SUPPORTS
	depends on BR2_PACKAGE_HOST_OPENJDK_BIN_ARCH_SUPPORTS
	depends on BR2_USE_MMU
	depends on BR2_SOFT_FLOAT
