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