blob: ebc715f58a68952e778f310dfeac083bcc39d966 [file] [log] [blame]
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
declare_args() {
# If a package is referenced in monolith and in preinstall, monolith takes
# priority, and the package will be added to OTA images as part of the
# verified boot set of static packages.
# These arguments should be set by the product definition gni file.
# a list of packages included in OTA images, base system images, and the
# distribution repository.
monolith = []
# a list of packages pre-installed on the system (also added to the
# distribution repository)
preinstall = []
# a list of packages only added to the distribution repository)
available = []
# These arguments should be set by the board definition gni file.
# A list of packages included in the monolith from the board definition.
# This list is appended with the list from the product definition and any
# additional specified packages
board_packages = []
# List of packages (a GN list of strings).
# This list of packages is currently added to the set of "monolith" packages,
# see `products` for more information; in the future, these packages will be
# added to the "preinstall".
# If unset, layer will be guessed using //.jiri_manifest and
# //{layer}/products/default.gni will be used.
fuchsia_packages = []
# Legacy product definitions.
fuchsia_products = []
# List of extra packages to synthesize on the fly. This is only for
# things that do not appear normally in the source tree. Synthesized
# packages can contain build artifacts only if they already exist in some
# part of the build. They can contain arbitrary verbatim files.
# Synthesized packages can't express dependencies on other packages.
#
# Each element of this list is a scope that is very much like the body of
# a package() template invocation (see //build/package.gni). That scope
# must set `name` to the string naming the package, as would be the name
# in the package() target written in a GN file. This must be unique
# among all package names.
synthesize_packages = []
}
monolith += board_packages
monolith += fuchsia_packages
# Print a warning message if the legacy fuchsia_products field is set.
# Only print in the default toolchain so the warning only shows up once.
if (fuchsia_products != [] && current_toolchain == default_toolchain) {
print("WARNING! Deprecated fuchsia product specification detected")
print("Please re-run 'fx set' to update your build configuration")
print("See https://fuchsia.googlesource.com/docs/+/master/development/build/")
print("or BLD-240 for more details")
}
if (monolith == [] && preinstall == [] && available == [] &&
fuchsia_packages == []) {
_jiri_manifest = "//.jiri_manifest"
_layers = exec_script("//build/gn/guess_layer.py",
[ rebase_path(_jiri_manifest) ],
"list lines",
[ _jiri_manifest ])
foreach(layer, _layers) {
import("//$layer/products/default.gni")
}
}
# Resolve all the `fuchsia_products` JSON files and their dependencies
# into lists of GN labels:
# monolith - package labels for base system and verified boot image
# preinstall - package labels for preinstall, but not OTA
# available - package labels for the install and update repository
# host_tests - labels for host tests
# data_deps - labels for host tools and non-package build targets
_preprocessed_products = exec_script("preprocess_products.py",
[
# A list of strings in GN syntax is
# valid JSON too.
"--monolith=$monolith",
"--preinstall=$preinstall",
"--available=$available",
"--legacy-products=$fuchsia_products",
],
"json")
# Tell GN that the files preprocess_products.py ran are inputs to the
# generation step, by declaring them as file inputs to a (silly) exec_script
# invocation.
exec_script("/bin/sh",
[
"-c",
":",
],
"",
_preprocessed_products.files_read)
monolith_packages = []
foreach(pkg, _preprocessed_products.monolith) {
monolith_packages += [ get_label_info(pkg, "label_no_toolchain") ]
}
preinstall_packages = []
foreach(pkg, _preprocessed_products.preinstall) {
preinstall_packages += [ get_label_info(pkg, "label_no_toolchain") ]
}
available_packages = []
foreach(pkg, _preprocessed_products.available) {
available_packages += [ get_label_info(pkg, "label_no_toolchain") ]
}
# Every extra GN target the package JSON requests be built on the side.
# This is for things like install_host_tools() targets whose output should
# be on hand for a developer to use in conjuction with a Fuchsia package.
package_data_deps = []
foreach(pkg, _preprocessed_products.data_deps) {
package_data_deps += [ get_label_info(pkg, "label_no_toolchain") ]
}
# Labels of test() targets to be copied into $root_build_dir/host_tests.
package_host_tests = []
foreach(label, _preprocessed_products.host_tests) {
package_host_tests += [ get_label_info(label, "label_no_toolchain") ]
}
# Synthesized packages are instantiated in //build/gn/BUILD.gn,
# so the package() target is //build/gn:package_name.
_synthesized_packages = []
foreach(pkg, synthesize_packages) {
pkg = "//build/gn:${pkg.name}"
_synthesized_packages += [ get_label_info(pkg, "label_no_toolchain") ]
}
# Note: currently the infrastructure recipes require infra synthesized
# packages to become members of the monolith set. The +,-,+ dance is to ensure
# the list contains no duplicates.
monolith_packages += _synthesized_packages
monolith_packages -= _synthesized_packages
monolith_packages += _synthesized_packages