|  | # 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("//build/toolchain/clang.gni") | 
|  | import("//flutter/common/config.gni") | 
|  | import("//flutter/shell/config.gni") | 
|  | import("//flutter/shell/gpu/gpu.gni") | 
|  | import("//flutter/shell/platform/darwin/common/framework_common.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 = false | 
|  | 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/FlutterEngine.h", | 
|  | "framework/Headers/FlutterEngineGroup.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_arc") { | 
|  | visibility = [ ":*" ] | 
|  | cflags_objc = flutter_cflags_objc_arc | 
|  | cflags_objcc = flutter_cflags_objcc_arc | 
|  |  | 
|  | defines = [ "FLUTTER_FRAMEWORK=1" ] | 
|  | if (darwin_extension_safe) { | 
|  | defines += [ "APPLICATION_EXTENSION_API_ONLY=1" ] | 
|  | } | 
|  | allow_circular_includes_from = [ ":flutter_framework_source" ] | 
|  | deps = [ | 
|  | ":flutter_framework_source", | 
|  | "//flutter/fml", | 
|  | "//flutter/shell/platform/common:common_cpp_input", | 
|  | "//flutter/shell/platform/darwin/common:framework_common", | 
|  | "//flutter/third_party/icu", | 
|  | ] | 
|  | public_configs = [ "//flutter:config" ] | 
|  |  | 
|  | sources = [ | 
|  | "framework/Source/FlutterMetalLayer.h", | 
|  | "framework/Source/FlutterMetalLayer.mm", | 
|  | "framework/Source/FlutterTextInputDelegate.h", | 
|  | "framework/Source/FlutterTextInputPlugin.h", | 
|  | "framework/Source/FlutterTextInputPlugin.mm", | 
|  | ] | 
|  |  | 
|  | frameworks = [ | 
|  | "UIKit.framework", | 
|  | "IOSurface.framework", | 
|  | ] | 
|  | } | 
|  |  | 
|  | source_set("flutter_framework_source") { | 
|  | visibility = [ ":*" ] | 
|  | cflags_objc = flutter_cflags_objc | 
|  | cflags_objcc = flutter_cflags_objcc | 
|  |  | 
|  | deps = [] | 
|  |  | 
|  | sources = [ | 
|  | # iOS embedder is migrating to ARC. | 
|  | # New files are highly encouraged to be in ARC. | 
|  | # To add new files in ARC, add them to the `flutter_framework_source_arc` target. | 
|  | "framework/Source/FlutterAppDelegate.mm", | 
|  | "framework/Source/FlutterCallbackCache.mm", | 
|  | "framework/Source/FlutterCallbackCache_Internal.h", | 
|  | "framework/Source/FlutterChannelKeyResponder.h", | 
|  | "framework/Source/FlutterChannelKeyResponder.mm", | 
|  | "framework/Source/FlutterDartProject.mm", | 
|  | "framework/Source/FlutterDartProject_Internal.h", | 
|  | "framework/Source/FlutterDartVMServicePublisher.h", | 
|  | "framework/Source/FlutterDartVMServicePublisher.mm", | 
|  | "framework/Source/FlutterEmbedderKeyResponder.h", | 
|  | "framework/Source/FlutterEmbedderKeyResponder.mm", | 
|  | "framework/Source/FlutterEngine.mm", | 
|  | "framework/Source/FlutterEngineGroup.mm", | 
|  | "framework/Source/FlutterEngine_Internal.h", | 
|  | "framework/Source/FlutterHeadlessDartRunner.mm", | 
|  | "framework/Source/FlutterKeyPrimaryResponder.h", | 
|  | "framework/Source/FlutterKeySecondaryResponder.h", | 
|  | "framework/Source/FlutterKeyboardManager.h", | 
|  | "framework/Source/FlutterKeyboardManager.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/FlutterRestorationPlugin.h", | 
|  | "framework/Source/FlutterRestorationPlugin.mm", | 
|  | "framework/Source/FlutterSemanticsScrollView.h", | 
|  | "framework/Source/FlutterSemanticsScrollView.mm", | 
|  | "framework/Source/FlutterSpellCheckPlugin.h", | 
|  | "framework/Source/FlutterSpellCheckPlugin.mm", | 
|  | "framework/Source/FlutterTextureRegistryRelay.h", | 
|  | "framework/Source/FlutterTextureRegistryRelay.mm", | 
|  | "framework/Source/FlutterUIPressProxy.h", | 
|  | "framework/Source/FlutterUIPressProxy.mm", | 
|  | "framework/Source/FlutterUndoManagerDelegate.h", | 
|  | "framework/Source/FlutterUndoManagerPlugin.h", | 
|  | "framework/Source/FlutterUndoManagerPlugin.mm", | 
|  | "framework/Source/FlutterView.h", | 
|  | "framework/Source/FlutterView.mm", | 
|  | "framework/Source/FlutterViewController.mm", | 
|  | "framework/Source/FlutterViewController_Internal.h", | 
|  | "framework/Source/KeyCodeMap.g.mm", | 
|  | "framework/Source/KeyCodeMap_Internal.h", | 
|  | "framework/Source/SemanticsObject.h", | 
|  | "framework/Source/SemanticsObject.mm", | 
|  | "framework/Source/UIViewController+FlutterScreenAndSceneIfLoaded.h", | 
|  | "framework/Source/UIViewController+FlutterScreenAndSceneIfLoaded.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/connection_collection.h", | 
|  | "framework/Source/connection_collection.mm", | 
|  | "framework/Source/platform_message_response_darwin.h", | 
|  | "framework/Source/platform_message_response_darwin.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_software.h", | 
|  | "ios_context_software.mm", | 
|  | "ios_external_view_embedder.h", | 
|  | "ios_external_view_embedder.mm", | 
|  | "ios_surface.h", | 
|  | "ios_surface.mm", | 
|  | "ios_surface_software.h", | 
|  | "ios_surface_software.mm", | 
|  | "platform_message_handler_ios.h", | 
|  | "platform_message_handler_ios.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 (darwin_extension_safe) { | 
|  | defines += [ "APPLICATION_EXTENSION_API_ONLY=1" ] | 
|  | } | 
|  |  | 
|  | if (shell_enable_metal) { | 
|  | sources += [ | 
|  | "ios_context_metal_impeller.h", | 
|  | "ios_context_metal_impeller.mm", | 
|  | "ios_context_metal_skia.h", | 
|  | "ios_context_metal_skia.mm", | 
|  | "ios_external_texture_metal.h", | 
|  | "ios_external_texture_metal.mm", | 
|  | "ios_surface_metal_impeller.h", | 
|  | "ios_surface_metal_impeller.mm", | 
|  | "ios_surface_metal_skia.h", | 
|  | "ios_surface_metal_skia.mm", | 
|  | ] | 
|  |  | 
|  | deps += [ "//flutter/shell/platform/darwin/graphics" ] | 
|  | } | 
|  |  | 
|  | deps += [ | 
|  | ":ios_gpu_configuration", | 
|  | "//flutter/common", | 
|  | "//flutter/common/graphics", | 
|  | "//flutter/flow", | 
|  | "//flutter/fml", | 
|  | "//flutter/lib/ui", | 
|  | "//flutter/runtime", | 
|  | "//flutter/runtime:libdart", | 
|  | "//flutter/shell/common", | 
|  | "//flutter/shell/platform/common:common_cpp_input", | 
|  | "//flutter/shell/platform/darwin/common", | 
|  | "//flutter/shell/platform/darwin/common:framework_common", | 
|  | "//flutter/shell/platform/embedder:embedder_as_internal_library", | 
|  | "//flutter/shell/profiling:profiling", | 
|  | "//flutter/skia", | 
|  | "//flutter/third_party/spring_animation", | 
|  | ] | 
|  |  | 
|  | public_configs = [ | 
|  | ":ios_gpu_configuration_config", | 
|  | "//flutter:config", | 
|  | ] | 
|  |  | 
|  | frameworks = [ | 
|  | "AudioToolbox.framework", | 
|  | "CoreMedia.framework", | 
|  | "CoreVideo.framework", | 
|  | "QuartzCore.framework", | 
|  | "UIKit.framework", | 
|  | ] | 
|  | if (flutter_runtime_mode == "profile" || flutter_runtime_mode == "debug") { | 
|  | # This is required by the profiler_metrics_ios.mm to get GPU statistics. | 
|  | # Usage in release builds will cause rejection from the App Store. | 
|  | frameworks += [ "IOKit.framework" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | platform_frameworks_path = | 
|  | rebase_path("$ios_sdk_path/../../Library/Frameworks/") | 
|  |  | 
|  | shared_library("ios_test_flutter") { | 
|  | testonly = true | 
|  | visibility = [ "*" ] | 
|  | cflags = [ | 
|  | "-fvisibility=default", | 
|  | "-F$platform_frameworks_path", | 
|  | "-fobjc-arc", | 
|  | "-mios-simulator-version-min=$ios_testing_deployment_target", | 
|  | ] | 
|  |  | 
|  | # XCode 15 beta has a bug where iOS 17 API usage is not guarded. | 
|  | # This bug results engine build failure since the engine treats warnings as errors. | 
|  | # The `-Wno-unguarded-availability-new` can be removed when the XCode bug is fixed. | 
|  | # See details in https://github.com/flutter/flutter/issues/128958. | 
|  | cflags_objcc = [ "-Wno-unguarded-availability-new" ] | 
|  | ldflags = [ | 
|  | "-F$platform_frameworks_path", | 
|  | "-Wl,-install_name,@rpath/Frameworks/libios_test_flutter.dylib", | 
|  | ] | 
|  | frameworks = [ "XCTest.framework" ] | 
|  | configs -= [ | 
|  | "//build/config/gcc:symbol_visibility_hidden", | 
|  | "//build/config:symbol_visibility_hidden", | 
|  | ] | 
|  | sources = [ | 
|  | "framework/Source/FlutterAppDelegateTest.mm", | 
|  | "framework/Source/FlutterChannelKeyResponderTest.mm", | 
|  | "framework/Source/FlutterDartProjectTest.mm", | 
|  | "framework/Source/FlutterEmbedderKeyResponderTest.mm", | 
|  | "framework/Source/FlutterEngineGroupTest.mm", | 
|  | "framework/Source/FlutterEnginePlatformViewTest.mm", | 
|  | "framework/Source/FlutterEngineTest.mm", | 
|  | "framework/Source/FlutterFakeKeyEvents.h", | 
|  | "framework/Source/FlutterFakeKeyEvents.mm", | 
|  | "framework/Source/FlutterKeyboardManagerTest.mm", | 
|  | "framework/Source/FlutterMetalLayerTest.mm", | 
|  | "framework/Source/FlutterPlatformPluginTest.mm", | 
|  | "framework/Source/FlutterPlatformViewsTest.mm", | 
|  | "framework/Source/FlutterPluginAppLifeCycleDelegateTest.mm", | 
|  | "framework/Source/FlutterRestorationPluginTest.mm", | 
|  | "framework/Source/FlutterSpellCheckPluginTest.mm", | 
|  | "framework/Source/FlutterTextInputPluginTest.mm", | 
|  | "framework/Source/FlutterTextureRegistryRelayTest.mm", | 
|  | "framework/Source/FlutterTouchInterceptingView_Test.h", | 
|  | "framework/Source/FlutterUndoManagerPluginTest.mm", | 
|  | "framework/Source/FlutterViewControllerTest.mm", | 
|  | "framework/Source/FlutterViewTest.mm", | 
|  | "framework/Source/SemanticsObjectTest.mm", | 
|  | "framework/Source/SemanticsObjectTestMocks.h", | 
|  | "framework/Source/UIViewController_FlutterScreenAndSceneIfLoadedTest.mm", | 
|  | "framework/Source/VsyncWaiterIosTest.mm", | 
|  | "framework/Source/accessibility_bridge_test.mm", | 
|  | "framework/Source/availability_version_check_test.mm", | 
|  | "framework/Source/connection_collection_test.mm", | 
|  | "platform_message_handler_ios_test.mm", | 
|  | ] | 
|  | deps = [ | 
|  | ":flutter_framework", | 
|  | ":flutter_framework_source", | 
|  | ":flutter_framework_source_arc", | 
|  | ":ios_gpu_configuration", | 
|  | "//flutter/common:common", | 
|  | "//flutter/lib/ui:ui", | 
|  | "//flutter/shell/platform/darwin/common:framework_common", | 
|  | "//flutter/shell/platform/embedder:embedder_as_internal_library", | 
|  | "//flutter/shell/platform/embedder:embedder_test_utils", | 
|  | "//flutter/skia", | 
|  | "//flutter/third_party/ocmock:ocmock_shared", | 
|  | "//flutter/third_party/rapidjson", | 
|  | "//flutter/third_party/spring_animation", | 
|  | "//flutter/third_party/tonic", | 
|  | "//flutter/third_party/txt", | 
|  | ] | 
|  | public_configs = [ | 
|  | ":ios_gpu_configuration_config", | 
|  | "//flutter:config", | 
|  | ] | 
|  |  | 
|  | if (darwin_extension_safe) { | 
|  | defines = [ "APPLICATION_EXTENSION_API_ONLY=1" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | shared_library("create_flutter_framework_dylib") { | 
|  | visibility = [ ":*" ] | 
|  |  | 
|  | output_name = "Flutter" | 
|  |  | 
|  | ldflags = [ "-Wl,-install_name,@rpath/Flutter.framework/Flutter" ] | 
|  |  | 
|  | if (darwin_extension_safe) { | 
|  | ldflags += [ "-fapplication-extension" ] | 
|  | } | 
|  |  | 
|  | public = _flutter_framework_headers | 
|  |  | 
|  | deps = [ | 
|  | ":flutter_framework_source", | 
|  | ":flutter_framework_source_arc", | 
|  | ] | 
|  |  | 
|  | public_configs = [ "//flutter:config" ] | 
|  | } | 
|  |  | 
|  | copy("copy_dylib") { | 
|  | visibility = [ ":*" ] | 
|  |  | 
|  | sources = [ "$root_out_dir/libFlutter.dylib" ] | 
|  | outputs = [ "$_flutter_framework_dir/Flutter" ] | 
|  |  | 
|  | deps = [ ":create_flutter_framework_dylib" ] | 
|  | } | 
|  |  | 
|  | copy("copy_asan_runtime_dylib") { | 
|  | visibility = [ ":*" ] | 
|  |  | 
|  | _libclang_base_path = | 
|  | "//buildtools/mac-x64/clang/lib/clang/13.0.0/lib/darwin/" | 
|  |  | 
|  | if (defined(use_ios_simulator) && use_ios_simulator) { | 
|  | _dylib_name = "libclang_rt.asan_iossim_dynamic.dylib" | 
|  | } else { | 
|  | _dylib_name = "libclang_rt.asan_ios_dynamic.dylib" | 
|  | } | 
|  |  | 
|  | sources = [ "$_libclang_base_path/$_dylib_name" ] | 
|  | outputs = [ "$root_out_dir/$_dylib_name" ] | 
|  |  | 
|  | 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 = [ | 
|  | "--source", | 
|  | rebase_path(sources[0]), | 
|  | "--destination", | 
|  | rebase_path(outputs[0]), | 
|  | "--minversion", | 
|  | ios_deployment_target, | 
|  | ] | 
|  | } | 
|  |  | 
|  | copy("copy_framework_module_map") { | 
|  | visibility = [ ":*" ] | 
|  | sources = [ "framework/module.modulemap" ] | 
|  | outputs = [ "$_flutter_framework_dir/Modules/module.modulemap" ] | 
|  | } | 
|  |  | 
|  | # Copy privacy manifest. This file is required by Apple for third-party SDKs, | 
|  | # and documents engine and third_party usage of timestamps and boot time APIs. | 
|  | # See https://developer.apple.com/documentation/bundleresources/privacy_manifest_files | 
|  | copy("copy_framework_privacy_manifest") { | 
|  | visibility = [ ":*" ] | 
|  | sources = [ "framework/PrivacyInfo.xcprivacy" ] | 
|  | outputs = [ "$_flutter_framework_dir/PrivacyInfo.xcprivacy" ] | 
|  | } | 
|  |  | 
|  | action("copy_framework_headers") { | 
|  | script = "//flutter/sky/tools/install_framework_headers.py" | 
|  | visibility = [ ":*" ] | 
|  | sources = get_path_info(_flutter_framework_headers, "abspath") + | 
|  | framework_common_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 = [ "//flutter/third_party/icu/flutter/icudtl.dat" ] | 
|  | outputs = [ "$_flutter_framework_dir/{{source_file_part}}" ] | 
|  | } | 
|  |  | 
|  | copy("copy_license") { | 
|  | visibility = [ ":*" ] | 
|  | sources = [ "//LICENSE" ] | 
|  | outputs = [ "$root_out_dir/LICENSE" ] | 
|  | } | 
|  |  | 
|  | shared_library("copy_and_verify_framework_module") { | 
|  | framework_search_path = rebase_path("$root_out_dir") | 
|  | visibility = [ ":*" ] | 
|  | cflags_objc = [ | 
|  | "-F$framework_search_path", | 
|  | "-fapplication-extension", | 
|  | ] | 
|  |  | 
|  | sources = [ "framework/Source/FlutterUmbrellaImport.m" ] | 
|  | deps = [ | 
|  | ":copy_framework_headers", | 
|  | ":copy_framework_info_plist", | 
|  | ":copy_framework_module_map", | 
|  | ":copy_framework_privacy_manifest", | 
|  | ] | 
|  |  | 
|  | if (darwin_extension_safe) { | 
|  | ldflags = [ | 
|  | "-F$framework_search_path", | 
|  | "-fapplication-extension", | 
|  | "-Xlinker", | 
|  | "-fatal_warnings", | 
|  | ] | 
|  | deps += [ ":copy_dylib" ] | 
|  | frameworks = [ "Flutter.framework" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | group("universal_flutter_framework") { | 
|  | visibility = [ ":*" ] | 
|  | deps = [ | 
|  | ":copy_and_verify_framework_module", | 
|  | ":copy_dylib", | 
|  | ":copy_framework_icu", | 
|  | ":copy_framework_info_plist", | 
|  | ":copy_framework_module_map", | 
|  | ":copy_framework_privacy_manifest", | 
|  | ":copy_license", | 
|  | ] | 
|  |  | 
|  | if (is_asan) { | 
|  | deps += [ ":copy_asan_runtime_dylib" ] | 
|  | } | 
|  | } | 
|  |  | 
|  | action("flutter_framework") { | 
|  | script = "//flutter/sky/tools/create_xcframework.py" | 
|  | outputs = [ "$root_out_dir/Flutter.xcframework" ] | 
|  | args = [ | 
|  | "--frameworks", | 
|  | rebase_path("$_flutter_framework_dir"), | 
|  | "--name", | 
|  | "Flutter", | 
|  | "--location", | 
|  | rebase_path("$root_out_dir"), | 
|  | ] | 
|  |  | 
|  | deps = [ ":universal_flutter_framework" ] | 
|  | } |