# Copyright 2024 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/zip.gni") if (is_ios) { import("//build/config/ios/ios_sdk_overrides.gni") } # Compile a xib or storyboard file and add it to a bundle_data so that it is # available at runtime in the bundle. # # Arguments # # source: # string, path of the xib or storyboard to compile. # # extension: # string, extension of the generated file or bundle. # # bundle_files: # list of string, name of the files in the generated bundle; # if empty, the output is expected to be a single file. # # Forwards all variables to the bundle_data target. template("bundle_data_ib_file") { assert(defined(invoker.source), "source needs to be defined for $target_name") assert(defined(invoker.extension), "extension needs to be defined for $target_name") assert(defined(invoker.bundle_files), "bundle_files needs to be defined for $target_name") _target_name = target_name _compile_target = target_name + "_compile_" + get_path_info(invoker.source, "extension") _output_path = "$target_gen_dir/$_target_name/" _output_name = get_path_info(invoker.source, "name") + ".${invoker.extension}" if (is_ios) { _deployment_target = ios_deployment_target _target_devices = [ "iphone", "ipad", ] } else { assert(false, "Unsupported platform: " + current_os) } action(_compile_target) { forward_variables_from(invoker, "*", [ "source", "bundle_files", ]) script = "//build/config/apple/compile_ib_files.py" args = [ "--input", rebase_path(invoker.source, root_build_dir), "--output", rebase_path("$_output_path/$_output_name", root_build_dir), "--minimum-deployment-target", _deployment_target, "--auto-activate-custom-fonts", ] foreach(target_device, _target_devices) { args += [ "--target-device", target_device, ] } sources = [ invoker.source ] if (invoker.bundle_files == []) { outputs = [ "$_output_path/$_output_name" ] } else { outputs = [] foreach(_bundle_file, invoker.bundle_files) { outputs += [ "$_output_path/$_output_name/$_bundle_file" ] } } } bundle_data(_target_name) { forward_variables_from(invoker, "*", [ "source" ]) if (!defined(public_deps)) { public_deps = [] } public_deps += [ ":$_compile_target" ] sources = get_target_outputs(":$_compile_target") if (invoker.bundle_files == []) { outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ] } else { outputs = [ "{{bundle_resources_dir}}/$_output_name/{{source_file_part}}" ] } } } # Compile a xib file and add it to a bundle_data so that it is available at # runtime in the bundle. # # Arguments # # source: # string, path of the xib or storyboard to compile. # # Forwards all variables to the bundle_data target. template("bundle_data_xib_file") { assert(defined(invoker.source), "source needs to be defined for $target_name") _extension = get_path_info(invoker.source, "extension") assert(_extension == "xib", "source must have the .xib extension for $target_name") bundle_data_ib_file(target_name) { forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) extension = "nib" bundle_files = [] } } # Compile a storyboard file and add it to a bundle_data so that it is available # at runtime in the bundle. # # Arguments # # source: # string, path of the xib or storyboard to compile. # # bundle_files # list of strings, name of the individual files in the generated bundle # # Forwards all variables to the bundle_data target. template("bundle_data_storyboard_file") { assert(defined(invoker.source), "source needs to be defined for $target_name") assert(defined(invoker.bundle_files) && invoker.bundle_files != [], "bundle_files needs to be defined for $target_name") _extension = get_path_info(invoker.source, "extension") assert(_extension == "storyboard", "source must have the .storyboard extension for $target_name") bundle_data_ib_file(target_name) { forward_variables_from(invoker, "*", TESTONLY_AND_VISIBILITY) forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) extension = "storyboardc" } } # Compile a strings file and add it to a bundle_data so that it is available # at runtime in the bundle. # # Arguments # # source: # string, path of the strings file to compile. # # output: # string, path of the compiled file in the final bundle. # # Forwards all variables to the bundle_data target. template("bundle_data_strings") { assert(defined(invoker.source), "source needs to be defined for $target_name") assert(defined(invoker.output), "output needs to be defined for $target_name") _source_extension = get_path_info(invoker.source, "extension") assert(_source_extension == "strings", "source must be a .strings for $target_name") _target_name = target_name _convert_target = target_name + "_compile_strings" convert_plist(_convert_target) { visibility = [ ":$_target_name" ] source = invoker.source output = "$target_gen_dir/$_target_name/" + get_path_info(invoker.source, "file") format = "binary1" } bundle_data(_target_name) { forward_variables_from(invoker, "*", [ "source", "output", ]) if (!defined(public_deps)) { public_deps = [] } public_deps += [ ":$_convert_target" ] sources = get_target_outputs(":$_convert_target") outputs = [ invoker.output ] } } # This template declares a bundle_data target that reference an assets # catalog so that is is compiled to the asset catalog of the generated # bundle. # # The target will ensure that only the files explicitly listed will be # compiled into the final application (i.e. it allow listing some of # the assets catalog content conditionally). # # The target requires that the files are located in a .xcassets bundle # in the repository (or generated via a script). This ensures that the # assets catalog is correctly visible in Xcode (though as usual, using # Xcode to make change to the .xcassets bundle will not be reflected in # the final build unless the target is updated in the gn configuration). # # Arguments # # sources: # required, list of strings, path to the files contained in the # .xcassets bundle; this may contains a sub-set of the files on # disk if some assets are only compiled conditionally # # catalog: # required, string, path to the .xcassets bundle; all path in # sources must be relative to this path or the compilation will # fail # # Example # # bundle_data_xcassets("assets") { # catalog = "Assets.xcassets" # sources = [ # "Assets.xcassets/Color.colorset/Contents.json", # "Assets.xcassets/Contents.json", # ] # if (includes_images) { # sources += [ # "Assets.xcassets/Image.imageset/Contents.json", # "Assets.xcassets/Image.imageset/Image.svg", # ] # } # } template("bundle_data_xcassets") { assert(defined(invoker.sources), "sources must be defined for $target_name") assert(defined(invoker.catalog), "catalog must be defined for $target_name") _target_name = target_name _target_zip = target_name + "_zip" zip(_target_zip) { _catalog_name = get_path_info(invoker.catalog, "file") _catalog_path = get_path_info(invoker.catalog, "dir") inputs = invoker.sources output = "$target_out_dir/$target_name/$_catalog_name" base_dir = _catalog_path } bundle_data(_target_name) { forward_variables_from(invoker, "*", [ "sources", "deps", "public_deps", ]) public_deps = [ ":$_target_zip" ] sources = get_target_outputs(":$_target_zip") outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ] } }