xref: /aosp_15_r20/external/skia/gn/ios.gni (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker# Copyright 2019 Google LLC.
2*c8dee2aaSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*c8dee2aaSAndroid Build Coastguard Worker# found in the LICENSE file.
4*c8dee2aaSAndroid Build Coastguard Worker
5*c8dee2aaSAndroid Build Coastguard Workerimport("skia.gni")
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard Workerif (is_ios) {
8*c8dee2aaSAndroid Build Coastguard Worker  # Template to compile .xib and .storyboard files.
9*c8dee2aaSAndroid Build Coastguard Worker  #
10*c8dee2aaSAndroid Build Coastguard Worker  # Arguments
11*c8dee2aaSAndroid Build Coastguard Worker  #
12*c8dee2aaSAndroid Build Coastguard Worker  #     sources:
13*c8dee2aaSAndroid Build Coastguard Worker  #         list of string, sources to compile
14*c8dee2aaSAndroid Build Coastguard Worker  #
15*c8dee2aaSAndroid Build Coastguard Worker  #     ibtool_flags:
16*c8dee2aaSAndroid Build Coastguard Worker  #         (optional) list of string, additional flags to pass to the ibtool
17*c8dee2aaSAndroid Build Coastguard Worker  template("compile_ib_files") {
18*c8dee2aaSAndroid Build Coastguard Worker    action_foreach(target_name) {
19*c8dee2aaSAndroid Build Coastguard Worker      forward_variables_from(invoker,
20*c8dee2aaSAndroid Build Coastguard Worker                             [
21*c8dee2aaSAndroid Build Coastguard Worker                               "testonly",
22*c8dee2aaSAndroid Build Coastguard Worker                               "visibility",
23*c8dee2aaSAndroid Build Coastguard Worker                             ])
24*c8dee2aaSAndroid Build Coastguard Worker      assert(defined(invoker.sources),
25*c8dee2aaSAndroid Build Coastguard Worker             "sources must be specified for $target_name")
26*c8dee2aaSAndroid Build Coastguard Worker      assert(defined(invoker.output_extension),
27*c8dee2aaSAndroid Build Coastguard Worker             "output_extension must be specified for $target_name")
28*c8dee2aaSAndroid Build Coastguard Worker
29*c8dee2aaSAndroid Build Coastguard Worker      ibtool_flags = []
30*c8dee2aaSAndroid Build Coastguard Worker      if (defined(invoker.ibtool_flags)) {
31*c8dee2aaSAndroid Build Coastguard Worker        ibtool_flags = invoker.ibtool_flags
32*c8dee2aaSAndroid Build Coastguard Worker      }
33*c8dee2aaSAndroid Build Coastguard Worker
34*c8dee2aaSAndroid Build Coastguard Worker      _output_extension = invoker.output_extension
35*c8dee2aaSAndroid Build Coastguard Worker
36*c8dee2aaSAndroid Build Coastguard Worker      script = "//gn/compile_ib_files.py"
37*c8dee2aaSAndroid Build Coastguard Worker      sources = invoker.sources
38*c8dee2aaSAndroid Build Coastguard Worker      outputs = [
39*c8dee2aaSAndroid Build Coastguard Worker        "$target_gen_dir/$target_name/{{source_name_part}}.$_output_extension",
40*c8dee2aaSAndroid Build Coastguard Worker      ]
41*c8dee2aaSAndroid Build Coastguard Worker      args = [
42*c8dee2aaSAndroid Build Coastguard Worker        "--input",
43*c8dee2aaSAndroid Build Coastguard Worker        "{{source}}",
44*c8dee2aaSAndroid Build Coastguard Worker        "--output",
45*c8dee2aaSAndroid Build Coastguard Worker        rebase_path(
46*c8dee2aaSAndroid Build Coastguard Worker            "$target_gen_dir/$target_name/{{source_name_part}}.$_output_extension",
47*c8dee2aaSAndroid Build Coastguard Worker            root_build_dir),
48*c8dee2aaSAndroid Build Coastguard Worker      ]
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker      #    if (!use_system_xcode) {
51*c8dee2aaSAndroid Build Coastguard Worker      #      args += [
52*c8dee2aaSAndroid Build Coastguard Worker      #        "--developer_dir",
53*c8dee2aaSAndroid Build Coastguard Worker      #        hermetic_xcode_path,
54*c8dee2aaSAndroid Build Coastguard Worker      #      ]
55*c8dee2aaSAndroid Build Coastguard Worker      #    }
56*c8dee2aaSAndroid Build Coastguard Worker      args += ibtool_flags
57*c8dee2aaSAndroid Build Coastguard Worker    }
58*c8dee2aaSAndroid Build Coastguard Worker  }
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker  template("bundle_data_ib_file") {
61*c8dee2aaSAndroid Build Coastguard Worker    assert(defined(invoker.source),
62*c8dee2aaSAndroid Build Coastguard Worker           "source needs to be defined for $target_name")
63*c8dee2aaSAndroid Build Coastguard Worker
64*c8dee2aaSAndroid Build Coastguard Worker    _source_extension = get_path_info(invoker.source, "extension")
65*c8dee2aaSAndroid Build Coastguard Worker    assert(_source_extension == "xib" || _source_extension == "storyboard",
66*c8dee2aaSAndroid Build Coastguard Worker           "source must be a .xib or .storyboard for $target_name")
67*c8dee2aaSAndroid Build Coastguard Worker
68*c8dee2aaSAndroid Build Coastguard Worker    _target_name = target_name
69*c8dee2aaSAndroid Build Coastguard Worker    if (_source_extension == "xib") {
70*c8dee2aaSAndroid Build Coastguard Worker      _compile_ib_file = target_name + "_compile_xib"
71*c8dee2aaSAndroid Build Coastguard Worker      _output_extension = "nib"
72*c8dee2aaSAndroid Build Coastguard Worker    } else {
73*c8dee2aaSAndroid Build Coastguard Worker      _compile_ib_file = target_name + "_compile_storyboard"
74*c8dee2aaSAndroid Build Coastguard Worker      _output_extension = "storyboardc"
75*c8dee2aaSAndroid Build Coastguard Worker    }
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker    compile_ib_files(_compile_ib_file) {
78*c8dee2aaSAndroid Build Coastguard Worker      sources = [ invoker.source ]
79*c8dee2aaSAndroid Build Coastguard Worker      output_extension = _output_extension
80*c8dee2aaSAndroid Build Coastguard Worker      visibility = [ ":$_target_name" ]
81*c8dee2aaSAndroid Build Coastguard Worker      ibtool_flags = [
82*c8dee2aaSAndroid Build Coastguard Worker        #        "--minimum-deployment-target",
83*c8dee2aaSAndroid Build Coastguard Worker        #        ios_deployment_target,
84*c8dee2aaSAndroid Build Coastguard Worker        "--auto-activate-custom-fonts",
85*c8dee2aaSAndroid Build Coastguard Worker        "--target-device",
86*c8dee2aaSAndroid Build Coastguard Worker        "iphone",
87*c8dee2aaSAndroid Build Coastguard Worker        "--target-device",
88*c8dee2aaSAndroid Build Coastguard Worker        "ipad",
89*c8dee2aaSAndroid Build Coastguard Worker      ]
90*c8dee2aaSAndroid Build Coastguard Worker    }
91*c8dee2aaSAndroid Build Coastguard Worker
92*c8dee2aaSAndroid Build Coastguard Worker    bundle_data(_target_name) {
93*c8dee2aaSAndroid Build Coastguard Worker      forward_variables_from(invoker, "*", [ "source" ])
94*c8dee2aaSAndroid Build Coastguard Worker
95*c8dee2aaSAndroid Build Coastguard Worker      if (!defined(public_deps)) {
96*c8dee2aaSAndroid Build Coastguard Worker        public_deps = []
97*c8dee2aaSAndroid Build Coastguard Worker      }
98*c8dee2aaSAndroid Build Coastguard Worker      public_deps += [ ":$_compile_ib_file" ]
99*c8dee2aaSAndroid Build Coastguard Worker
100*c8dee2aaSAndroid Build Coastguard Worker      sources = get_target_outputs(":$_compile_ib_file")
101*c8dee2aaSAndroid Build Coastguard Worker
102*c8dee2aaSAndroid Build Coastguard Worker      outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
103*c8dee2aaSAndroid Build Coastguard Worker    }
104*c8dee2aaSAndroid Build Coastguard Worker  }
105*c8dee2aaSAndroid Build Coastguard Worker
106*c8dee2aaSAndroid Build Coastguard Worker  template("ios_app_bundle") {
107*c8dee2aaSAndroid Build Coastguard Worker    app_name = target_name
108*c8dee2aaSAndroid Build Coastguard Worker    gen_path = target_gen_dir
109*c8dee2aaSAndroid Build Coastguard Worker    bundle_prefix = "com.google"
110*c8dee2aaSAndroid Build Coastguard Worker    plist_string = string_join(
111*c8dee2aaSAndroid Build Coastguard Worker            "$0x0A",
112*c8dee2aaSAndroid Build Coastguard Worker            [
113*c8dee2aaSAndroid Build Coastguard Worker              "<plist version=\"1.0\">",
114*c8dee2aaSAndroid Build Coastguard Worker              "  <dict>",
115*c8dee2aaSAndroid Build Coastguard Worker              "    <key>CFBundleVersion</key> <string>0.1.0</string>",
116*c8dee2aaSAndroid Build Coastguard Worker              "    <key>CFBundleShortVersionString</key> <string>0.1.0</string>",
117*c8dee2aaSAndroid Build Coastguard Worker              "    <key>CFBundleName</key> <string>${app_name}</string>",
118*c8dee2aaSAndroid Build Coastguard Worker              "    <key>CFBundleExecutable</key> <string>${app_name}</string>",
119*c8dee2aaSAndroid Build Coastguard Worker              "    <key>CFBundleIdentifier</key> <string>${bundle_prefix}.${app_name}</string>",
120*c8dee2aaSAndroid Build Coastguard Worker              "    <key>CFBundlePackageType</key> <string>APPL</string>",
121*c8dee2aaSAndroid Build Coastguard Worker              "    <key>LSRequiresIPhoneOS</key> <true/>",
122*c8dee2aaSAndroid Build Coastguard Worker              "    <key>UILaunchStoryboardName</key> <string>LaunchScreen</string>",
123*c8dee2aaSAndroid Build Coastguard Worker              "  </dict>",
124*c8dee2aaSAndroid Build Coastguard Worker              "</plist>",
125*c8dee2aaSAndroid Build Coastguard Worker            ])
126*c8dee2aaSAndroid Build Coastguard Worker
127*c8dee2aaSAndroid Build Coastguard Worker    write_file("$gen_path/${app_name}_Info.plist", plist_string)
128*c8dee2aaSAndroid Build Coastguard Worker
129*c8dee2aaSAndroid Build Coastguard Worker    bundle_data("${app_name}_bundle_info_plist") {
130*c8dee2aaSAndroid Build Coastguard Worker      sources = [ "$gen_path/${app_name}_Info.plist" ]
131*c8dee2aaSAndroid Build Coastguard Worker      outputs = [ "{{bundle_resources_dir}}/Info.plist" ]
132*c8dee2aaSAndroid Build Coastguard Worker    }
133*c8dee2aaSAndroid Build Coastguard Worker
134*c8dee2aaSAndroid Build Coastguard Worker    if (defined(invoker.data_sources)) {
135*c8dee2aaSAndroid Build Coastguard Worker      bundle_data("${app_name}_bundle_resources_and_skps") {
136*c8dee2aaSAndroid Build Coastguard Worker        sources = invoker.data_sources
137*c8dee2aaSAndroid Build Coastguard Worker
138*c8dee2aaSAndroid Build Coastguard Worker        # iOS reserves the folders 'Resources' and 'resources' so store one level deeper
139*c8dee2aaSAndroid Build Coastguard Worker        outputs = [ "{{bundle_resources_dir}}/data/{{source_file_part}}" ]
140*c8dee2aaSAndroid Build Coastguard Worker      }
141*c8dee2aaSAndroid Build Coastguard Worker    }
142*c8dee2aaSAndroid Build Coastguard Worker
143*c8dee2aaSAndroid Build Coastguard Worker    if (defined(invoker.launchscreen)) {
144*c8dee2aaSAndroid Build Coastguard Worker      bundle_data_ib_file("${app_name}_bundle_launchscreen") {
145*c8dee2aaSAndroid Build Coastguard Worker        source = invoker.launchscreen
146*c8dee2aaSAndroid Build Coastguard Worker      }
147*c8dee2aaSAndroid Build Coastguard Worker    }
148*c8dee2aaSAndroid Build Coastguard Worker
149*c8dee2aaSAndroid Build Coastguard Worker    executable("${app_name}_generate_executable") {
150*c8dee2aaSAndroid Build Coastguard Worker      if (!defined(configs)) {
151*c8dee2aaSAndroid Build Coastguard Worker        configs = []
152*c8dee2aaSAndroid Build Coastguard Worker      }
153*c8dee2aaSAndroid Build Coastguard Worker      forward_variables_from(invoker,
154*c8dee2aaSAndroid Build Coastguard Worker                             "*",
155*c8dee2aaSAndroid Build Coastguard Worker                             [
156*c8dee2aaSAndroid Build Coastguard Worker                               "output_name",
157*c8dee2aaSAndroid Build Coastguard Worker                               "visibility",
158*c8dee2aaSAndroid Build Coastguard Worker                               "is_shared_library",
159*c8dee2aaSAndroid Build Coastguard Worker                               "data_sources",
160*c8dee2aaSAndroid Build Coastguard Worker                               "extra_configs",
161*c8dee2aaSAndroid Build Coastguard Worker                               "configs",
162*c8dee2aaSAndroid Build Coastguard Worker                             ])
163*c8dee2aaSAndroid Build Coastguard Worker      if (defined(invoker.configs)) {
164*c8dee2aaSAndroid Build Coastguard Worker        configs += invoker.configs
165*c8dee2aaSAndroid Build Coastguard Worker      }
166*c8dee2aaSAndroid Build Coastguard Worker      if (defined(invoker.extra_configs)) {
167*c8dee2aaSAndroid Build Coastguard Worker        configs += invoker.extra_configs
168*c8dee2aaSAndroid Build Coastguard Worker      }
169*c8dee2aaSAndroid Build Coastguard Worker      output_name = rebase_path("$gen_path/$app_name", root_build_dir)
170*c8dee2aaSAndroid Build Coastguard Worker    }
171*c8dee2aaSAndroid Build Coastguard Worker
172*c8dee2aaSAndroid Build Coastguard Worker    action("${app_name}_dsymutil") {
173*c8dee2aaSAndroid Build Coastguard Worker      public_deps = [ ":${app_name}_generate_executable" ]
174*c8dee2aaSAndroid Build Coastguard Worker      sources = [ "$gen_path/$app_name" ]
175*c8dee2aaSAndroid Build Coastguard Worker      script = "//gn/call.py"
176*c8dee2aaSAndroid Build Coastguard Worker      args = [
177*c8dee2aaSAndroid Build Coastguard Worker        "dsymutil",
178*c8dee2aaSAndroid Build Coastguard Worker        rebase_path("$gen_path/$app_name"),
179*c8dee2aaSAndroid Build Coastguard Worker      ]
180*c8dee2aaSAndroid Build Coastguard Worker      outputs = [ "$gen_path/${app_name}.dSYM" ]
181*c8dee2aaSAndroid Build Coastguard Worker      testonly = defined(invoker.testonly) && invoker.testonly
182*c8dee2aaSAndroid Build Coastguard Worker      pool = "//gn/toolchain:dsymutil_pool($default_toolchain)"
183*c8dee2aaSAndroid Build Coastguard Worker    }
184*c8dee2aaSAndroid Build Coastguard Worker
185*c8dee2aaSAndroid Build Coastguard Worker    bundle_data("${app_name}_bundle_executable_and_symbols") {
186*c8dee2aaSAndroid Build Coastguard Worker      public_deps = [
187*c8dee2aaSAndroid Build Coastguard Worker        ":${app_name}_dsymutil",
188*c8dee2aaSAndroid Build Coastguard Worker        ":${app_name}_generate_executable",
189*c8dee2aaSAndroid Build Coastguard Worker      ]
190*c8dee2aaSAndroid Build Coastguard Worker      sources = [
191*c8dee2aaSAndroid Build Coastguard Worker        "$gen_path/${app_name}",
192*c8dee2aaSAndroid Build Coastguard Worker        "$gen_path/${app_name}.dSYM",
193*c8dee2aaSAndroid Build Coastguard Worker      ]
194*c8dee2aaSAndroid Build Coastguard Worker      outputs = [ "{{bundle_executable_dir}}/{{source_file_part}}" ]
195*c8dee2aaSAndroid Build Coastguard Worker      testonly = defined(invoker.testonly) && invoker.testonly
196*c8dee2aaSAndroid Build Coastguard Worker    }
197*c8dee2aaSAndroid Build Coastguard Worker
198*c8dee2aaSAndroid Build Coastguard Worker    create_bundle("$app_name") {
199*c8dee2aaSAndroid Build Coastguard Worker      product_type = "com.apple.product-type.application"
200*c8dee2aaSAndroid Build Coastguard Worker      testonly = defined(invoker.testonly) && invoker.testonly
201*c8dee2aaSAndroid Build Coastguard Worker
202*c8dee2aaSAndroid Build Coastguard Worker      bundle_root_dir = "${root_build_dir}/${target_name}.app"
203*c8dee2aaSAndroid Build Coastguard Worker      bundle_resources_dir = bundle_root_dir
204*c8dee2aaSAndroid Build Coastguard Worker      bundle_executable_dir = bundle_root_dir
205*c8dee2aaSAndroid Build Coastguard Worker
206*c8dee2aaSAndroid Build Coastguard Worker      xcode_extra_attributes = {
207*c8dee2aaSAndroid Build Coastguard Worker        PRODUCT_BUNDLE_IDENTIFIER = "${bundle_prefix}.${app_name}"
208*c8dee2aaSAndroid Build Coastguard Worker        if (ios_min_target != "") {
209*c8dee2aaSAndroid Build Coastguard Worker          IPHONEOS_DEPLOYMENT_TARGET = ios_min_target
210*c8dee2aaSAndroid Build Coastguard Worker        }
211*c8dee2aaSAndroid Build Coastguard Worker        INFOPLIST_FILE = rebase_path("${target_gen_dir}/${app_name}_Info.plist")
212*c8dee2aaSAndroid Build Coastguard Worker      }
213*c8dee2aaSAndroid Build Coastguard Worker
214*c8dee2aaSAndroid Build Coastguard Worker      deps = [
215*c8dee2aaSAndroid Build Coastguard Worker        ":${app_name}_bundle_executable_and_symbols",
216*c8dee2aaSAndroid Build Coastguard Worker        ":${app_name}_bundle_info_plist",
217*c8dee2aaSAndroid Build Coastguard Worker      ]
218*c8dee2aaSAndroid Build Coastguard Worker      if (defined(invoker.launchscreen)) {
219*c8dee2aaSAndroid Build Coastguard Worker        deps += [ ":${app_name}_bundle_launchscreen" ]
220*c8dee2aaSAndroid Build Coastguard Worker      }
221*c8dee2aaSAndroid Build Coastguard Worker      if (defined(invoker.data_sources)) {
222*c8dee2aaSAndroid Build Coastguard Worker        deps += [ ":${app_name}_bundle_resources_and_skps" ]
223*c8dee2aaSAndroid Build Coastguard Worker      }
224*c8dee2aaSAndroid Build Coastguard Worker
225*c8dee2aaSAndroid Build Coastguard Worker      if (skia_ios_use_signing) {
226*c8dee2aaSAndroid Build Coastguard Worker        post_processing_script = "//gn/codesign_ios.py"
227*c8dee2aaSAndroid Build Coastguard Worker        post_processing_sources = [ "$target_gen_dir/$app_name" ]
228*c8dee2aaSAndroid Build Coastguard Worker        post_processing_outputs = [
229*c8dee2aaSAndroid Build Coastguard Worker          "$bundle_root_dir/_CodeSignature/CodeResources",
230*c8dee2aaSAndroid Build Coastguard Worker          "$bundle_root_dir/embedded.mobileprovision",
231*c8dee2aaSAndroid Build Coastguard Worker        ]
232*c8dee2aaSAndroid Build Coastguard Worker        post_processing_args = [
233*c8dee2aaSAndroid Build Coastguard Worker          rebase_path("$bundle_root_dir", root_build_dir),
234*c8dee2aaSAndroid Build Coastguard Worker          skia_ios_identity,
235*c8dee2aaSAndroid Build Coastguard Worker          skia_ios_profile,
236*c8dee2aaSAndroid Build Coastguard Worker        ]
237*c8dee2aaSAndroid Build Coastguard Worker      }
238*c8dee2aaSAndroid Build Coastguard Worker    }
239*c8dee2aaSAndroid Build Coastguard Worker  }
240*c8dee2aaSAndroid Build Coastguard Worker}
241