blob: beaacfc1e2cd03c369c8de41876d8366fa6443be [file] [log] [blame]
Hal Canary3388c1a2019-09-16 12:53:17 -04001# 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) {
Mike Klein96f64012020-04-03 10:59:37 -050078 sources = [ invoker.source ]
Hal Canary3388c1a2019-09-16 12:53:17 -040079 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
Mike Klein96f64012020-04-03 10:59:37 -0500102 outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]
Hal Canary3388c1a2019-09-16 12:53:17 -0400103 }
104 }
105
106 template("ios_app_bundle") {
107 app_name = target_name
108 gen_path = target_gen_dir
Jim Van Verthb50e5cf2020-11-16 10:24:30 -0500109 bundle_prefix = "com.google"
Hal Canary3388c1a2019-09-16 12:53:17 -0400110
111 action("${app_name}_generate_info_plist") {
112 script = "//gn/gen_plist_ios.py"
Mike Klein96f64012020-04-03 10:59:37 -0500113 outputs = [ "$gen_path/${app_name}_Info.plist" ]
Jim Van Verthb50e5cf2020-11-16 10:24:30 -0500114 args = [
115 rebase_path("$gen_path/$app_name", root_build_dir),
116 "$bundle_prefix",
117 ]
Hal Canary3388c1a2019-09-16 12:53:17 -0400118 }
119
120 bundle_data("${app_name}_bundle_info_plist") {
Mike Klein96f64012020-04-03 10:59:37 -0500121 public_deps = [ ":${app_name}_generate_info_plist" ]
122 sources = [ "$gen_path/${app_name}_Info.plist" ]
123 outputs = [ "{{bundle_resources_dir}}/Info.plist" ]
Hal Canary3388c1a2019-09-16 12:53:17 -0400124 }
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
Mike Klein96f64012020-04-03 10:59:37 -0500131 outputs = [ "{{bundle_resources_dir}}/data/{{source_file_part}}" ]
Hal Canary3388c1a2019-09-16 12:53:17 -0400132 }
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 ])
Jim Van Verth421ee3a2020-11-18 15:27:13 -0500151 if (defined(invoker.extra_configs)) {
Hal Canary3388c1a2019-09-16 12:53:17 -0400152 configs += invoker.extra_configs
153 }
154 output_name = rebase_path("$gen_path/$app_name", root_build_dir)
155 }
156
157 action("${app_name}_dsymutil") {
Mike Klein96f64012020-04-03 10:59:37 -0500158 public_deps = [ ":${app_name}_generate_executable" ]
159 sources = [ "$gen_path/$app_name" ]
Hal Canary3388c1a2019-09-16 12:53:17 -0400160 script = "//gn/call.py"
161 args = [
162 "dsymutil",
163 rebase_path("$gen_path/$app_name"),
164 ]
Mike Klein96f64012020-04-03 10:59:37 -0500165 outputs = [ "$gen_path/${app_name}.dSYM" ]
Hal Canary3388c1a2019-09-16 12:53:17 -0400166 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 ]
Mike Klein96f64012020-04-03 10:59:37 -0500179 outputs = [ "{{bundle_executable_dir}}/{{source_file_part}}" ]
Hal Canary3388c1a2019-09-16 12:53:17 -0400180 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
Jim Van Verthb50e5cf2020-11-16 10:24:30 -0500191 xcode_extra_attributes = {
192 PRODUCT_BUNDLE_IDENTIFIER = "${bundle_prefix}.${app_name}"
193 }
194
Hal Canary3388c1a2019-09-16 12:53:17 -0400195 deps = [
196 ":${app_name}_bundle_executable_and_symbols",
197 ":${app_name}_bundle_info_plist",
198 ]
199 if (defined(invoker.launchscreen)) {
200 deps += [ ":${app_name}_bundle_launchscreen" ]
201 }
202 if (defined(invoker.data_sources)) {
203 deps += [ ":${app_name}_bundle_resources_and_skps" ]
204 }
205
206 # should only code sign when running on a device, not the simulator
207 if (target_cpu != "x64") {
208 code_signing_script = "//gn/codesign_ios.py"
209 code_signing_sources = [ "$target_gen_dir/$app_name" ]
210 code_signing_outputs = [
211 "$bundle_root_dir/_CodeSignature/CodeResources",
212 "$bundle_root_dir/embedded.mobileprovision",
213 ]
214 code_signing_args = [
215 rebase_path("$bundle_root_dir", root_build_dir),
216 skia_ios_identity,
217 skia_ios_profile,
218 ]
219 }
220 }
221 }
222}