| # Copyright 2019 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. |
| |
| import("//build/dist/component_manifest_resources.gni") |
| import("//build/test.gni") |
| import("//src/lib/isolated_devmgr/v2_component/isolated_devmgr.gni") |
| import("//src/sys/build/components.gni") |
| |
| declare_args() { |
| # blobfs_maximum_runtime_bytes is an upper bound on the partition size on the device. Partitions |
| # can grow as needed if there are extra slices available in FVM. This limit prevents the blobfs |
| # partition from taking too much space away from other uses. |
| # |
| # Pass the empty string for no limit. |
| blobfs_maximum_runtime_bytes = "" |
| |
| # minfs_maximum_runtime_bytes is an upper bound on the partition size on the device. Partitions |
| # can grow as needed if there are extra slices available in FVM. This limit prevents the minfs |
| # partition from taking too much space away from other uses. |
| # |
| # Pass the empty string for no limit. |
| minfs_maximum_runtime_bytes = "" |
| |
| # If format_minfs_on_corruption is true (the default), fshost formats minfs partition on finding |
| # it corrupted. Set to false to keep the devices in a corrupted state which might be of help to |
| # debug issues. |
| format_minfs_on_corruption = true |
| |
| # If extract_minfs_metadata_on_corruption is true, fshost extracts minfs metadata on finding it |
| # corrupted. Setting this flag to true helps debugging corruptions. |
| extract_minfs_metadata_on_corruption = false |
| } |
| |
| group("tests") { |
| testonly = true |
| deps = [ |
| ":fshost-tests", |
| "//src/lib/isolated_devmgr/v2_component", |
| ] |
| } |
| |
| source_set("launcher") { |
| visibility = [ ":*" ] |
| sources = [ "fdio.cc" ] |
| deps = [ |
| "//sdk/lib/fdio", |
| "//sdk/lib/syslog/cpp", |
| "//zircon/public/lib/fbl", |
| "//zircon/public/lib/fidl", |
| "//zircon/public/lib/zircon-internal", |
| "//zircon/public/lib/zx", |
| ] |
| } |
| |
| source_set("fshost-registry") { |
| configs += [ "//build/unification/config:zircon-migrated" ] |
| sources = [ |
| "admin-server.cc", |
| "deprecated-loader-service.cc", |
| "fs-manager.cc", |
| "fshost-boot-args.cc", |
| "lifecycle.cc", |
| "registry.cc", |
| "registry_vnode.cc", |
| ] |
| public_deps = [ |
| ":inspect", |
| ":launcher", |
| ":metrics", |
| "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp", |
| "//sdk/fidl/fuchsia.device.manager:fuchsia.device.manager_llcpp", |
| "//sdk/fidl/fuchsia.fshost:fuchsia.fshost_llcpp", |
| "//sdk/fidl/fuchsia.process.lifecycle:fuchsia.process.lifecycle_llcpp", |
| "//sdk/lib/vfs/cpp", |
| "//src/lib/loader_service", |
| "//zircon/public/lib/fit", |
| "//zircon/public/lib/zircon-internal", |
| "//zircon/public/lib/zx", |
| "//zircon/system/ulib/async-loop:async-loop-cpp", |
| "//zircon/system/ulib/async-loop:async-loop-default", |
| "//zircon/system/ulib/fs", |
| "//zircon/system/ulib/fs-management", |
| "//zircon/system/ulib/memfs", |
| ] |
| deps = [ |
| "//sdk/lib/fdio", |
| "//src/lib/files", |
| "//zircon/public/lib/fbl", |
| "//zircon/public/lib/zircon-internal", |
| "//zircon/system/ulib/fidl-async:fidl-async-cpp", |
| "//zircon/system/ulib/memfs:memfs-cpp", |
| ] |
| } |
| |
| source_set("inspect") { |
| configs += [ "//build/unification/config:zircon-migrated" ] |
| sources = [ |
| "inspect-manager.cc", |
| "inspect-manager.h", |
| ] |
| public_deps = [ |
| "//sdk/lib/fdio", |
| "//sdk/lib/sys/inspect/cpp", |
| "//src/lib/fsl", |
| "//zircon/public/lib/fbl", |
| "//zircon/system/ulib/fs", |
| "//zircon/system/ulib/memfs", |
| ] |
| } |
| |
| source_set("metrics") { |
| sources = [ |
| "metrics.cc", |
| "metrics.h", |
| ] |
| public_deps = [ |
| "//zircon/public/lib/async-cpp", |
| "//zircon/system/ulib/cobalt-client", |
| "//zircon/system/ulib/fs/metrics:metrics-cobalt", |
| ] |
| deps = [ |
| "//sdk/lib/syslog/cpp", |
| "//zircon/system/ulib/cobalt-client", |
| "//zircon/system/ulib/fs/metrics:metrics-cobalt", |
| "//zircon/system/ulib/fs/metrics:metrics-inspect", |
| ] |
| } |
| |
| source_set("block-watcher") { |
| configs += [ "//build/config:all_source" ] |
| sources = [ |
| "block-device-manager.cc", |
| "block-device.cc", |
| "block-watcher.cc", |
| "config.cc", |
| "encrypted-volume.cc", |
| "filesystem-mounter.cc", |
| "fshost-fs-provider.cc", |
| "pkgfs-launcher.cc", |
| "pkgfs-loader-service.cc", |
| ] |
| public_deps = [ |
| ":fshost-registry", |
| ":launcher", |
| ":metrics", |
| "//sdk/fidl/fuchsia.fshost:fuchsia.fshost_llcpp", |
| "//sdk/fidl/fuchsia.hardware.block.partition:fuchsia.hardware.block.partition_llcpp", |
| "//src/storage/blobfs", |
| "//zircon/public/lib/fit", |
| "//zircon/public/lib/zircon-internal", |
| "//zircon/public/lib/zx", |
| "//zircon/system/ulib/async-loop:async-loop-cpp", |
| "//zircon/system/ulib/async-loop:async-loop-default", |
| "//zircon/system/ulib/fdio-caller", |
| "//zircon/system/ulib/fs", |
| "//zircon/system/ulib/memfs", |
| ] |
| deps = [ |
| "//sdk/fidl/fuchsia.boot:fuchsia.boot_c", |
| "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp", |
| "//sdk/fidl/fuchsia.device:fuchsia.device_c", |
| "//sdk/fidl/fuchsia.device:fuchsia.device_llcpp", |
| "//sdk/fidl/fuchsia.hardware.block:fuchsia.hardware.block_c", |
| "//sdk/fidl/fuchsia.hardware.block.encrypted:fuchsia.hardware.block.encrypted_c", |
| "//sdk/fidl/fuchsia.hardware.block.partition:fuchsia.hardware.block.partition_c", |
| "//sdk/fidl/fuchsia.hardware.block.verified:fuchsia.hardware.block.verified_llcpp", |
| "//sdk/fidl/fuchsia.io:fuchsia.io_llcpp", |
| "//sdk/lib/fdio", |
| "//src/devices/block/drivers/block-verity:verified-volume-client", |
| "//src/lib/digest", |
| "//src/lib/loader_service", |
| "//src/security/zxcrypt:zxcrypt-fdio", |
| "//src/storage/minfs", |
| "//src/sys/pkg/fidl/fuchsia.update.verify:fuchsia.update.verify_llcpp", |
| "//zircon/public/lib/fbl", |
| "//zircon/public/lib/fidl", |
| "//zircon/public/lib/fit", |
| "//zircon/public/lib/zircon-internal", |
| "//zircon/public/lib/zx", |
| "//zircon/system/ulib/fidl-async:fidl-async-cpp", |
| "//zircon/system/ulib/fs", |
| "//zircon/system/ulib/fs-management", |
| "//zircon/system/ulib/gpt", |
| "//zircon/system/ulib/ramdevice-client", |
| "//zircon/system/ulib/trace", |
| "//zircon/system/ulib/trace-engine", |
| ] |
| |
| if (extract_minfs_metadata_on_corruption) { |
| sources += [ "extract-metadata.cc" ] |
| public_deps += [ "//src/storage/extractor/cpp:disk_extractor" ] |
| } else { |
| sources += [ "extract-metadata-noop.cc" ] |
| } |
| } |
| |
| executable("fshost") { |
| if (is_fuchsia) { |
| configs += [ |
| "//build/unification/config:zircon-migrated", |
| "//build/config:all_source", |
| ] |
| } |
| if (is_fuchsia) { |
| fdio_config = [ "//build/config/fuchsia:fdio_config" ] |
| if (configs + fdio_config - fdio_config != configs) { |
| configs -= fdio_config |
| } |
| } |
| sources = [ "main.cc" ] |
| deps = [ |
| ":block-watcher", |
| ":fshost-registry", |
| ":metrics", |
| "//sdk/fidl/fuchsia.boot:fuchsia.boot_c", |
| "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp", |
| "//sdk/fidl/fuchsia.fshost:fuchsia.fshost_c", |
| "//sdk/fidl/fuchsia.fshost:fuchsia.fshost_llcpp", |
| "//sdk/fidl/fuchsia.io:fuchsia.io_llcpp", |
| "//sdk/fidl/fuchsia.ldsvc:fuchsia.ldsvc_c", |
| "//src/storage/lib/utils:use_debug_log", |
| "//zircon/system/ulib/cobalt-client", |
| "//zircon/system/ulib/fidl-async:fidl-async-cpp", |
| "//zircon/system/ulib/fs-management", |
| "//zircon/system/ulib/ramdevice-client", |
| "//zircon/system/ulib/zbi-bootfs", |
| ] |
| } |
| |
| test("fshost_test") { |
| sources = [ |
| "delayed-outdir-test.cc", |
| "fshost-boot-args-test.cc", |
| "fshost-test.cc", |
| ] |
| deps = [ |
| ":block-watcher", |
| ":fshost-registry", |
| ":metrics", |
| "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp", |
| "//sdk/fidl/fuchsia.io:fuchsia.io_llcpp", |
| "//zircon/public/lib/zxtest", |
| "//zircon/system/ulib/cobalt-client", |
| "//zircon/system/ulib/cobalt-client:in-memory-logger", |
| "//zircon/system/ulib/fidl-async", |
| "//zircon/system/ulib/fidl-async:fidl-async-cpp", |
| "//zircon/system/ulib/mock-boot-arguments", |
| ] |
| } |
| |
| # Include this target from a product config if you want to allow authoring |
| # factory partition contents in mutable mode and prevent opening block-verity |
| # volumes in verified read mode. |
| generated_resource("allow-authoring-factory") { |
| outputs = [ "config/allow-authoring-factory" ] |
| contents = "yes" |
| |
| # We should never allow authoring factory from a production, user-facing build. |
| deps = [ "//build/validate:non_production_tag" ] |
| } |
| |
| fuchsia_unittest_component("fshost-test") { |
| deps = [ ":fshost_test" ] |
| } |
| |
| # This is a separate test executable because loader_service_test_fixture uses gtest, but other |
| # tests here use zxtest. |
| test("fshost_loader_service_test") { |
| sources = [ |
| "deprecated-loader-service-test.cc", |
| "pkgfs-loader-service-test.cc", |
| ] |
| deps = [ |
| ":block-watcher", |
| ":fshost-registry", |
| "//src/lib/loader_service:loader_service_test_fixture", |
| "//zircon/system/ulib/mock-boot-arguments", |
| ] |
| } |
| |
| fuchsia_unittest_component("fshost-loader-service-test") { |
| manifest = "meta/fshost-loader-service-test.cmx" |
| deps = [ ":fshost_loader_service_test" ] |
| } |
| |
| test("fshost_inspect_test") { |
| sources = [ "inspect-manager-test.cc" ] |
| deps = [ |
| ":inspect", |
| "//zircon/public/lib/async", |
| "//zircon/public/lib/zxtest", |
| "//zircon/system/ulib/async-loop:async-loop-cpp", |
| "//zircon/system/ulib/async-loop:async-loop-default", |
| "//zircon/system/ulib/inspect", |
| ] |
| } |
| |
| fuchsia_unittest_component("fshost-inspect-test") { |
| deps = [ ":fshost_inspect_test" ] |
| } |
| |
| test("fshost_metrics_test") { |
| sources = [ "metrics-test.cc" ] |
| deps = [ |
| ":metrics", |
| "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp", |
| "//sdk/lib/fdio", |
| "//zircon/public/lib/zxtest", |
| "//zircon/system/ulib/async-testing", |
| "//zircon/system/ulib/cobalt-client:in-memory-logger", |
| "//zircon/system/ulib/fs/metrics:metrics-cobalt", |
| "//zircon/system/ulib/fs/metrics:metrics-inspect", |
| ] |
| } |
| |
| fuchsia_unittest_component("fshost-metrics-test") { |
| deps = [ ":fshost_metrics_test" ] |
| } |
| |
| test("fshost_integration_test") { |
| sources = [ |
| "block-device-manager-test.cc", |
| "block-device-test.cc", |
| "block-watcher-test.cc", |
| "filesystem-mounter-test.cc", |
| "fshost-exposed-dir-test.cc", |
| "fshost_integration_test.cc", |
| "fshost_integration_test.h", |
| "mock-block-device.h", |
| "recovery-test.cc", |
| ] |
| deps = [ |
| ":block-watcher", |
| "//sdk/fidl/fuchsia.boot:fuchsia.boot_llcpp", |
| "//sdk/fidl/fuchsia.device:fuchsia.device_llcpp", |
| "//sdk/fidl/fuchsia.hardware.block.volume:fuchsia.hardware.block.volume_llcpp", |
| "//sdk/fidl/fuchsia.sys2", |
| "//src/lib/files", |
| "//src/lib/fxl/test:gtest_main", |
| "//src/lib/isolated_devmgr/v2_component:client", |
| "//src/storage/blobfs", |
| "//src/storage/minfs", |
| "//src/sys/pkg/fidl/fuchsia.update.verify:fuchsia.update.verify_llcpp", |
| "//third_party/googletest:gmock", |
| "//zircon/system/ulib/cobalt-client:in-memory-logger", |
| "//zircon/system/ulib/fidl-async", |
| "//zircon/system/ulib/fs-management", |
| "//zircon/system/ulib/fs/metrics:metrics-cobalt", |
| "//zircon/system/ulib/ramdevice-client", |
| ] |
| } |
| |
| # This is a test version of fshost, not a component with fshost tests. |
| fuchsia_component("test-fshost") { |
| testonly = true |
| manifest = "meta/fshost.cml" |
| deps = [ |
| ":fshost", |
| "//src/security/policy/zxcrypt:null", |
| ] |
| } |
| |
| isolated_devmgr_unittest_v2_component("fshost-integration-test") { |
| manifest = "meta/fshost_integration_test.cml" |
| deps = [ |
| ":fshost_integration_test", |
| ":integration_test_config", |
| "//src/devices/block/drivers/core", |
| "//src/devices/block/drivers/gpt", |
| "//src/devices/block/drivers/ramdisk", |
| "//src/devices/bus/drivers/platform", |
| "//src/devices/tests/sysdev", |
| ] |
| } |
| |
| fuchsia_test_package("fshost-tests") { |
| test_specs = { |
| log_settings = { |
| max_severity = "ERROR" |
| } |
| } |
| test_components = [ |
| ":fshost-integration-test", |
| ":fshost-test", |
| ":fshost-inspect-test", |
| ":fshost-metrics-test", |
| ":fshost-loader-service-test", |
| ] |
| deps = [ ":test-fshost" ] |
| } |
| |
| component_manifest_resources("meta") { |
| sources = [ "meta/fshost.cml" ] |
| } |
| |
| group("bootfs") { |
| deps = [ |
| ":fshost", |
| ":meta", |
| ] |
| } |
| |
| # Generates an fshost config file that will appear in config/fshost. If no configuration file is |
| # present (i.e. there's no dependency on a target below), a default config is used (see |
| # block-device-manager.cc). |
| # |
| # Some of the configuration settings are build args, and some are parameters passed in to the |
| # template by the invoker. A few allow overriding by the invoker but fall back to the global build |
| # arg. |
| template("fshost_config") { |
| generated_resource(target_name) { |
| contents = [ "default" ] |
| deps = [] |
| if (defined(invoker.no_minfs_zxcrypt) && invoker.no_minfs_zxcrypt) { |
| contents += [ "no-zxcrypt" ] |
| deps += [ "//build/validate:non_production_tag" ] |
| } |
| if (defined(invoker.minfs_ramdisk) && invoker.minfs_ramdisk) { |
| contents += [ |
| "fvm-ramdisk", |
| "zxcrypt-non-ramdisk", |
| ] |
| } |
| if (defined(invoker.gpt_all) && invoker.gpt_all) { |
| contents += [ "gpt-all" ] |
| deps += [ "//build/validate:non_production_tag" ] |
| } |
| if (blobfs_maximum_runtime_bytes != "") { |
| contents += [ "blobfs-max-bytes=$blobfs_maximum_runtime_bytes" ] |
| } |
| |
| if (defined(invoker.minfs_maximum_runtime_bytes)) { |
| # This can be overridden by the invoker but defaults to the file one if undefined. |
| contents += [ "minfs-max-bytes=${invoker.minfs_maximum_runtime_bytes}" ] |
| } else if (minfs_maximum_runtime_bytes != "") { |
| contents += [ "minfs-max-bytes=$minfs_maximum_runtime_bytes" ] |
| } |
| |
| if (!format_minfs_on_corruption) { |
| contents += [ "-format-minfs-on-corruption" ] |
| } |
| if (defined(invoker.use_syslog) && invoker.use_syslog) { |
| contents += [ "use-syslog" ] |
| } |
| if (defined(invoker.use_default_loader) && invoker.use_default_loader) { |
| contents += [ "use-default-loader" ] |
| } |
| if (defined(invoker.sandbox_decompression) && |
| invoker.sandbox_decompression) { |
| contents += [ "sandbox-decompression" ] |
| } |
| |
| if (defined(invoker.apply_limits_to_ramdisk) && |
| invoker.apply_limits_to_ramdisk) { |
| contents += [ "apply-limits-to-ramdisk" ] |
| } |
| |
| output_conversion = "list lines" |
| outputs = [ "config/fshost" ] |
| } |
| } |
| |
| fshost_config("minfs_ramdisk") { |
| minfs_ramdisk = true |
| } |
| |
| fshost_config("no_minfs_zxcrypt") { |
| no_minfs_zxcrypt = true |
| } |
| |
| # A configuration that allows access to multiple devices with GUID partition schemes; the default |
| # will only attach a driver to the first device that appears to have a GUID partition scheme. |
| fshost_config("gpt_all") { |
| gpt_all = true |
| } |
| |
| # Maintains the above semantics for target gpt_all while adding the blobfs decompression sandbox. |
| fshost_config("sandbox_decompression_with_gpt_all") { |
| sandbox_decompression = true |
| gpt_all = true |
| } |
| |
| # Writes default configuration plus any changes to global variables. |
| fshost_config("default_config") { |
| minfs_ramdisk = false |
| gpt_all = false |
| no_minfs_zxcrypt = false |
| } |
| |
| fshost_config("integration_test_config") { |
| # Some of the tests require us to be able to match against multiple GPT devices. |
| gpt_all = true |
| |
| use_syslog = true |
| use_default_loader = true |
| |
| # The test BlockDeviceManagerIntegration.MaxSize verifies that the minfs "max runtime bytes" |
| # gets applied correctly. It checks that the max size in FVM is set to this value. The |
| # "apply_limits_to_ramdisk" flag is required to apply the minfs limit even to a ramdisk which is |
| # used in tests (normally the limits apply only to physical devices). |
| # |
| # This number is chosen to be large because it will apply to all tests in the fshost integration |
| # test. So all minfs partitions created in that test must be smaller than this value. |
| minfs_maximum_runtime_bytes = 1073741824 |
| apply_limits_to_ramdisk = true |
| } |