| # 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", |
| "//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 = [ "//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" ] |
| } |