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 if (!defined(configs)) { 143 configs = [] 144 } 145 forward_variables_from(invoker, 146 "*", 147 [ 148 "output_name", 149 "visibility", 150 "is_shared_library", 151 "data_sources", 152 "extra_configs", 153 "configs", 154 ]) 155 if (defined(invoker.configs)) { 156 configs += invoker.configs 157 } 158 if (defined(invoker.extra_configs)) { 159 configs += invoker.extra_configs 160 } 161 output_name = rebase_path("$gen_path/$app_name", root_build_dir) 162 } 163 164 action("${app_name}_dsymutil") { 165 public_deps = [ ":${app_name}_generate_executable" ] 166 sources = [ "$gen_path/$app_name" ] 167 script = "//gn/call.py" 168 args = [ 169 "dsymutil", 170 rebase_path("$gen_path/$app_name"), 171 ] 172 outputs = [ "$gen_path/${app_name}.dSYM" ] 173 testonly = defined(invoker.testonly) && invoker.testonly 174 pool = "//gn/toolchain:dsymutil_pool($default_toolchain)" 175 } 176 177 bundle_data("${app_name}_bundle_executable_and_symbols") { 178 public_deps = [ 179 ":${app_name}_dsymutil", 180 ":${app_name}_generate_executable", 181 ] 182 sources = [ 183 "$gen_path/${app_name}", 184 "$gen_path/${app_name}.dSYM", 185 ] 186 outputs = [ "{{bundle_executable_dir}}/{{source_file_part}}" ] 187 testonly = defined(invoker.testonly) && invoker.testonly 188 } 189 190 create_bundle("$app_name") { 191 product_type = "com.apple.product-type.application" 192 testonly = defined(invoker.testonly) && invoker.testonly 193 194 bundle_root_dir = "${root_build_dir}/${target_name}.app" 195 bundle_resources_dir = bundle_root_dir 196 bundle_executable_dir = bundle_root_dir 197 198 xcode_extra_attributes = { 199 PRODUCT_BUNDLE_IDENTIFIER = "${bundle_prefix}.${app_name}" 200 if (ios_min_target != "") { 201 IPHONEOS_DEPLOYMENT_TARGET = ios_min_target 202 } 203 } 204 205 deps = [ 206 ":${app_name}_bundle_executable_and_symbols", 207 ":${app_name}_bundle_info_plist", 208 ] 209 if (defined(invoker.launchscreen)) { 210 deps += [ ":${app_name}_bundle_launchscreen" ] 211 } 212 if (defined(invoker.data_sources)) { 213 deps += [ ":${app_name}_bundle_resources_and_skps" ] 214 } 215 216 # should only code sign when running on a device, not the simulator 217 if (!ios_use_simulator) { 218 code_signing_script = "//gn/codesign_ios.py" 219 code_signing_sources = [ "$target_gen_dir/$app_name" ] 220 code_signing_outputs = [ 221 "$bundle_root_dir/_CodeSignature/CodeResources", 222 "$bundle_root_dir/embedded.mobileprovision", 223 ] 224 code_signing_args = [ 225 rebase_path("$bundle_root_dir", root_build_dir), 226 skia_ios_identity, 227 skia_ios_profile, 228 ] 229 } 230 } 231 } 232} 233