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