# Copyright 2013 The Flutter Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. assert(is_ios) import("//build/config/ios/ios_sdk.gni") import("//flutter/build/darwin/ios_app.gni") import("//flutter/common/config.gni") import("//flutter/shell/gpu/gpu.gni") import("//flutter/shell/platform/darwin/common/framework_shared.gni") import("//flutter/testing/testing.gni") _flutter_framework_dir = "$root_out_dir/Flutter.framework" shell_gpu_configuration("ios_gpu_configuration") { enable_software = true enable_gl = true enable_vulkan = false enable_metal = shell_enable_metal } # The headers that will be copied to the Flutter.framework and be accessed # from outside the Flutter engine source root. _flutter_framework_headers = [ "framework/Headers/Flutter.h", "framework/Headers/FlutterAppDelegate.h", "framework/Headers/FlutterCallbackCache.h", "framework/Headers/FlutterDartProject.h", "framework/Headers/FlutterEngine.h", "framework/Headers/FlutterHeadlessDartRunner.h", "framework/Headers/FlutterPlatformViews.h", "framework/Headers/FlutterPlugin.h", "framework/Headers/FlutterPluginAppLifeCycleDelegate.h", "framework/Headers/FlutterViewController.h", ] _flutter_framework_headers_copy_dir = "$_flutter_framework_dir/Headers" source_set("flutter_framework_source") { visibility = [ ":*" ] cflags_objc = flutter_cflags_objc cflags_objcc = flutter_cflags_objcc sources = [ "framework/Source/FlutterAppDelegate.mm", "framework/Source/FlutterBinaryMessengerRelay.mm", "framework/Source/FlutterCallbackCache.mm", "framework/Source/FlutterCallbackCache_Internal.h", "framework/Source/FlutterDartProject.mm", "framework/Source/FlutterDartProject_Internal.h", "framework/Source/FlutterEngine.mm", "framework/Source/FlutterEngine_Internal.h", "framework/Source/FlutterHeadlessDartRunner.mm", "framework/Source/FlutterObservatoryPublisher.h", "framework/Source/FlutterObservatoryPublisher.mm", "framework/Source/FlutterOverlayView.h", "framework/Source/FlutterOverlayView.mm", "framework/Source/FlutterPlatformPlugin.h", "framework/Source/FlutterPlatformPlugin.mm", "framework/Source/FlutterPlatformViews.mm", "framework/Source/FlutterPlatformViews_Internal.h", "framework/Source/FlutterPlatformViews_Internal.mm", "framework/Source/FlutterPluginAppLifeCycleDelegate.mm", "framework/Source/FlutterTextInputDelegate.h", "framework/Source/FlutterTextInputPlugin.h", "framework/Source/FlutterTextInputPlugin.mm", "framework/Source/FlutterView.h", "framework/Source/FlutterView.mm", "framework/Source/FlutterViewController.mm", "framework/Source/FlutterViewController_Internal.h", "framework/Source/SemanticsObject.h", "framework/Source/SemanticsObject.mm", "framework/Source/accessibility_bridge.h", "framework/Source/accessibility_bridge.mm", "framework/Source/accessibility_text_entry.h", "framework/Source/accessibility_text_entry.mm", "framework/Source/platform_message_response_darwin.h", "framework/Source/platform_message_response_darwin.mm", "framework/Source/platform_message_router.h", "framework/Source/platform_message_router.mm", "framework/Source/profiler_metrics_ios.h", "framework/Source/profiler_metrics_ios.mm", "framework/Source/vsync_waiter_ios.h", "framework/Source/vsync_waiter_ios.mm", "ios_context.h", "ios_context.mm", "ios_context_gl.h", "ios_context_gl.mm", "ios_context_software.h", "ios_context_software.mm", "ios_external_texture_gl.h", "ios_external_texture_gl.mm", "ios_render_target_gl.h", "ios_render_target_gl.mm", "ios_surface.h", "ios_surface.mm", "ios_surface_gl.h", "ios_surface_gl.mm", "ios_surface_software.h", "ios_surface_software.mm", "platform_view_ios.h", "platform_view_ios.mm", "rendering_api_selection.h", "rendering_api_selection.mm", ] sources += _flutter_framework_headers defines = [ "FLUTTER_FRAMEWORK=1" ] if (shell_enable_metal) { defines += [ "FLUTTER_SHELL_ENABLE_METAL=1" ] sources += [ "ios_context_metal.h", "ios_context_metal.mm", "ios_external_texture_metal.h", "ios_external_texture_metal.mm", "ios_surface_metal.h", "ios_surface_metal.mm", ] } deps = [ ":ios_gpu_configuration", "//flutter/common", "//flutter/flow", "//flutter/fml", "//flutter/lib/ui", "//flutter/runtime", "//flutter/runtime:libdart", "//flutter/shell/common", "//flutter/shell/platform/darwin/common", "//flutter/shell/platform/darwin/common:framework_shared", "//flutter/shell/profiling:profiling", "//third_party/skia", ] public_configs = [ "//flutter:config" ] libs = [ "CoreMedia.framework", "CoreVideo.framework", "UIKit.framework", "OpenGLES.framework", "AudioToolbox.framework", "QuartzCore.framework", ] } ios_test_flutter_path = rebase_path("$root_out_dir/libios_test_flutter.dylib") platform_frameworks_path = "$ios_sdk_path/../../Library/Frameworks/" # NOTE: This currently only supports simulator targets because of the install_name. # TODO(54504): Switch the install_name and make the test runner copy the dynamic # library into the testing bundle. shared_library("ios_test_flutter") { visibility = [ ":*" ] cflags = [ "-fvisibility=default", "-F$platform_frameworks_path", "-fobjc-arc", "-mios-simulator-version-min=$ios_testing_deployment_target", ] ldflags = [ "-F$platform_frameworks_path", "-Wl,-framework,XCTest", "-Wl,-install_name,$ios_test_flutter_path", ] configs -= [ "//build/config/gcc:symbol_visibility_hidden", "//build/config:symbol_visibility_hidden", ] sources = [ "framework/Source/FlutterBinaryMessengerRelayTest.mm", "framework/Source/FlutterEngineTest.mm", "framework/Source/FlutterPluginAppLifeCycleDelegateTest.m", "framework/Source/FlutterTextInputPluginTest.m", "framework/Source/FlutterViewControllerTest.mm", "framework/Source/SemanticsObjectTest.mm", ] deps = [ ":flutter_framework_source", "//flutter/shell/platform/darwin/common:framework_shared", "//third_party/ocmock:ocmock", "//third_party/skia", ] public_configs = [ "//flutter:config" ] } shared_library("create_flutter_framework_dylib") { visibility = [ ":*" ] output_name = "Flutter" ldflags = [ "-Wl,-install_name,@rpath/Flutter.framework/Flutter" ] public = _flutter_framework_headers deps = [ ":flutter_framework_source", ] public_configs = [ "//flutter:config" ] } copy("copy_dylib") { visibility = [ ":*" ] sources = [ "$root_out_dir/libFlutter.dylib", ] outputs = [ "$_flutter_framework_dir/Flutter", ] deps = [ ":create_flutter_framework_dylib", ] } action("copy_framework_info_plist") { script = "//flutter/build/copy_info_plist.py" visibility = [ ":*" ] sources = [ "framework/Info.plist", ] outputs = [ "$_flutter_framework_dir/Info.plist", ] args = [ rebase_path(sources[0]), rebase_path(outputs[0]), "--bitcode=$flutter_enable_bitcode", ] } copy("copy_framework_module_map") { visibility = [ ":*" ] sources = [ "framework/module.modulemap", ] outputs = [ "$_flutter_framework_dir/Modules/module.modulemap", ] } action("copy_framework_headers") { script = "//flutter/sky/tools/install_framework_headers.py" visibility = [ ":*" ] sources = get_path_info(_flutter_framework_headers, "abspath") + framework_shared_headers outputs = [] foreach(header, sources) { header_basename = get_path_info(header, "file") outputs += [ "$_flutter_framework_headers_copy_dir/$header_basename" ] } args = [ "--location", rebase_path("$_flutter_framework_headers_copy_dir"), "--headers", ] + rebase_path(sources, "", "//") } copy("copy_framework_icu") { visibility = [ ":*" ] sources = [ "//third_party/icu/flutter/icudtl.dat", ] outputs = [ "$_flutter_framework_dir/{{source_file_part}}", ] } copy("copy_framework_podspec") { visibility = [ ":*" ] sources = [ "framework/Flutter.podspec", ] outputs = [ "$root_out_dir/Flutter.podspec", ] } copy("copy_license") { visibility = [ ":*" ] sources = [ "//LICENSE", ] outputs = [ "$root_out_dir/LICENSE", ] } shared_library("copy_and_verify_framework_headers") { visibility = [ ":*" ] include_dirs = [ "$_flutter_framework_headers_copy_dir" ] sources = [ "framework/Source/FlutterUmbrellaImport.m", ] deps = [ ":copy_framework_headers", ] } test_fixtures("flutter_tests_fixtures") { fixtures = [] } # Note: This currently isn't used, it might be removed. ios_app("FlutterTests") { testonly = true info_plist = "FlutterTestsInfo.plist" sources = [ "flutter_unittests.mm", ] libs = [ "Foundation.framework" ] deps = [ ":flutter_tests_fixtures", "//flutter/runtime:libdart", "//flutter/testing", ] } group("flutter_framework") { deps = [ ":copy_and_verify_framework_headers", ":copy_dylib", ":copy_framework_icu", ":copy_framework_info_plist", ":copy_framework_module_map", ":copy_framework_podspec", ":copy_license", ] }