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