# Flutter includes a vender copy of clang which is mandatory to use for
# compiling. These are the supported architectures.
config BR2_PACKAGE_FLUTTER_ENGINE_ARCH_SUPPORTS
	bool
	default y if BR2_aarch64
	default y if BR2_arm && !BR2_ARM_CPU_ARMV4 && !BR2_ARM_CPU_ARMV5
	default y if BR2_x86_64

config BR2_PACKAGE_FLUTTER_ENGINE
	bool "flutter-engine"
	depends on BR2_PACKAGE_FLUTTER_ENGINE_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_USES_GLIBC
	depends on BR2_TOOLCHAIN_GCC_AT_LEAST_5
	depends on BR2_INSTALL_LIBSTDCPP
	depends on !BR2_TOOLCHAIN_HAS_GCC_BUG_64735 # std::shared_future
	depends on !BR2_STATIC_LIBS
	depends on BR2_USE_WCHAR # std::wstring
	depends on BR2_HOST_GCC_AT_LEAST_5
	depends on BR2_PACKAGE_HAS_LIBGL || BR2_PACKAGE_HAS_LIBGLES
	select BR2_PACKAGE_FREETYPE
	select BR2_PACKAGE_HOST_DEPOT_TOOLS
	select BR2_PACKAGE_ZLIB
	help
	  Flutter is Google's SDK for crafting beautiful, fast user
	  experience for mobile, web, and desktop from a single
	  codebase. Flutter works with existing code, is used by
	  developers and organizations around the world, and is
	  free and open source.

	  The Flutter Engine is a portable runtime for hosting
	  Flutter applications. It implements Flutter's core
	  libraries, including animation and graphics, file and
	  network I/O, accessibility support, plugin architecture,
	  and a Dart runtime and compile toolchain. Most developers
	  will interact with Flutter via the Flutter Framework,
	  which provides a modern, reactive framework, and a rich
	  set of platform, layout and foundation widgets.

	  https://github.com/flutter/engine

if BR2_PACKAGE_FLUTTER_ENGINE

config FLUTTER_ENGINE_RUNTIME_MODE_PROFILE
	bool "enable profiling"
	help
	  Some debugging ability is maintained—enough to profile your
	  apps performance. Profile mode is disabled on the emulator
	  and simulator, because their behavior is not representative
	  of real performance. Profile mode is similar to release mode,
	  with the following differences:

	  - Some service extensions, such as the one that enables the
	    performance overlay, are enabled.

	  - Tracing is enabled, and tools supporting source-level
	    debugging (such as DevTools) can connect to the process.

	  If this option is left unselected, the global option
	  BR2_ENABLE_RUNTIME_DEBUG determines whether to build Flutter
	  in release or debug mode.

	  https://docs.flutter.dev/testing/build-modes#profile

endif

comment "flutter-engine needs an OpenGL or OpenGLES backend"
	depends on BR2_PACKAGE_FLUTTER_ENGINE_ARCH_SUPPORTS
	depends on !BR2_PACKAGE_HAS_LIBGL && !BR2_PACKAGE_HAS_LIBGLES

comment "flutter-engine needs a glibc toolchain w/ wchar, C++, gcc >= 5, dynamic library, host gcc >= 5"
	depends on BR2_PACKAGE_FLUTTER_ENGINE_ARCH_SUPPORTS
	depends on !BR2_TOOLCHAIN_USES_GLIBC || !BR2_INSTALL_LIBSTDCPP \
		|| !BR2_TOOLCHAIN_GCC_AT_LEAST_5 || BR2_STATIC_LIBS \
		|| !BR2_USE_WCHAR || !BR2_HOST_GCC_AT_LEAST_5

comment "flutter-engine needs a toolchain not affected by GCC bug 64735"
	depends on BR2_PACKAGE_FLUTTER_ENGINE_ARCH_SUPPORTS
	depends on BR2_TOOLCHAIN_HAS_GCC_BUG_64735
