blob: e91bf3e0683ded0a96ea09a130287b5876a11ea1 [file] [log] [blame]
# Copyright 2022 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/components.gni")
import("//build/host.gni")
import("//build/test.gni")
import("//build/zircon/c_utils.gni")
import("//build/zircon/migrated_targets.gni")
zx_library("zxdump") {
sdk = "source"
sdk_headers = [
"lib/zxdump/buffer.h",
"lib/zxdump/dump.h",
"lib/zxdump/elf-search.h",
"lib/zxdump/fd-writer.h",
"lib/zxdump/task.h",
"lib/zxdump/types.h",
"lib/zxdump/zstd-writer.h",
]
public_deps = [
# <lib/zxdump/types.h> has #include <zircon/types.h>.
"//zircon/system/public",
# <lib/zxdump/fd-writer.h> has #include <lib/fit/result.h>.
"//zircon/system/ulib/zx",
# <lib/zxdump/dump.h> has #include <lib/fit/function.h>.
"//sdk/lib/fit",
# <lib/zxdump/fd-writer.h> has #include <fbl/unique_fd.h>.
"//zircon/system/ulib/fbl",
# <lib/zxdump/types.h> has #include <lib/stdcompat/span.h>.
"//sdk/lib/stdcompat",
# <lib/zxdump/elf-search.h> has #include <lib/elfldltl/layout.h>.
"//src/lib/elfldltl",
]
if (is_fuchsia) {
public_deps += [
# <lib/zxdump/dump.h> has #include <lib/zx/process.h>.
"//zircon/system/ulib/zx",
]
}
sources = [
"buffer-impl.cc",
"buffer-impl.h",
"core.h",
"dump-file-mmap.cc",
"dump-file-mmap.h",
"dump-file-stdio.cc",
"dump-file-stdio.h",
"dump-file-zstd.cc",
"dump-file-zstd.h",
"dump-file.cc",
"dump-file.h",
"dump.cc",
"elf-search.cc",
"error.cc",
"fd-writer.cc",
"job-archive.h",
"live-memory-cache.h",
"read-memory-string.cc",
"read-memory.cc",
"read.cc",
"rights.h",
"task.cc",
"zstd-writer.cc",
]
# Test code can use private headers from sources.
friend = [ ":*" ]
defines = [ "ZSTD_STATIC_LINKING_ONLY" ]
deps = [
"//src/lib/elfldltl",
"//third_party/rapidjson",
"//third_party/zstd",
"//zircon/system/ulib/fbl",
]
if (is_fuchsia) {
sources += [
"live-memory-cache.cc",
"root.cc",
]
deps += [
"//sdk/fidl/fuchsia.boot:fuchsia.boot_cpp",
"//sdk/fidl/fuchsia.io:fuchsia.io_cpp",
"//sdk/fidl/fuchsia.kernel:fuchsia.kernel_cpp",
"//sdk/lib/component/incoming/cpp",
"//sdk/lib/fdio",
"//sdk/lib/stdcompat",
"//src/zircon/lib/zircon",
"//zircon/system/ulib/zx",
]
} else {
sources += [ "not-fuchsia.cc" ]
}
}
source_set("piped-command") {
visibility = [ ":*" ]
public = [ "piped-command.h" ]
public_deps = [
"//zircon/system/ulib/fbl",
"//zircon/system/ulib/zx",
]
sources = [ "piped-command.cc" ]
if (is_fuchsia) {
sources += [ "piped-command-fuchsia.cc" ]
public_deps += [ "//sdk/lib/fdio" ]
deps = [
"//sdk/lib/fdio",
"//zircon/system/ulib/zx",
]
} else {
sources += [ "piped-command-posix.cc" ]
}
}
source_set("test-data-holder") {
visibility = [ ":*" ]
testonly = true
public = [ "test-data-holder.h" ]
public_deps = [
":zxdump",
"//third_party/googletest:gtest",
]
sources = [ "test-data-holder.cc" ]
}
source_set("test-tool-process") {
visibility = [ ":*" ]
testonly = true
public = [ "test-tool-process.h" ]
public_deps = [
"//sdk/lib/stdcompat",
"//zircon/system/ulib/fbl",
]
sources = [ "test-tool-process.cc" ]
deps = [
":piped-command",
":zxdump",
"//third_party/googletest:gtest",
]
if (is_fuchsia) {
public_deps += [ "//zircon/system/ulib/zx" ]
deps += [
"//sdk/fidl/fuchsia.boot:fuchsia.boot_cpp",
"//sdk/fidl/fuchsia.kernel:fuchsia.kernel_cpp",
"//sdk/lib/component/outgoing/cpp",
"//src/storage/lib/vfs/cpp",
"//zircon/system/ulib/async-loop:async-loop-cpp",
"//zircon/system/ulib/async-loop:async-loop-default",
]
}
data_deps = [ ":zstd-for-test" ]
}
template("test_children_data") {
# Depend on the base toolchain in case both the child and this target use
# the same variant, so that the copy under the expected name can be found
# at runtime.
children = []
foreach(child, invoker.deps) {
children += [ "$child(${toolchain_variant.base})" ]
}
if (is_host) {
host_test_data(target_name) {
visibility = [ ":*" ]
deps = children
sources = []
foreach(child, children) {
# The output_name can't be determined properly from the label, only
# guessed.
child_output_dir = get_label_info(child, "root_out_dir")
child_output_name = get_label_info(child, "name")
if (child_output_name == "zstdcli") {
# This one has output_name different from target_name.
child_output_name = "zstd"
}
sources += [ "$child_output_dir/$child_output_name" ]
}
}
} else {
group(target_name) {
visibility = [ ":*" ]
testonly = true
deps = children
}
}
}
test_children_data("zstd-for-test") {
deps = [ "//third_party/zstd:zstdcli" ]
}
test("zxdump-unittests") {
sources = [
"dump-file-tests.cc",
"error-tests.cc",
"fd-writer-tests.cc",
"gcore-tests.cc",
"piped-command-tests.cc",
"test-file.h",
"writer-tests.h",
"zstd-writer-tests.cc",
]
deps = [
":piped-command",
":test-data-holder",
":test-tool-process",
":zxdump",
"//sdk/lib/fit",
"//src/lib/elfldltl",
"//src/lib/elfldltl/testing",
"//src/lib/fxl/test:gtest_main",
"//third_party/googletest:gmock",
"//zircon/system/ulib/fbl",
]
data_deps = [ ":unittests-children" ]
if (is_fuchsia) {
sources += [
"dump-tests.cc",
"dump-tests.h",
"elf-search-tests.cc",
"read-tests.cc",
"task-tests.cc",
]
include_dirs = [ target_gen_dir ] # For test-child-elf-search.h
deps += [
":test-child-elf-search",
"//sdk/lib/fdio",
"//zircon/system/ulib/zx",
"//zircon/system/ulib/zx",
]
}
}
test_children_data("unittests-children") {
deps = [
":gcore",
":zxdump-test-child",
]
if (is_fuchsia) {
deps += [ "//third_party/sbase:cat_bin" ]
}
}
executable("zxdump-test-child") {
testonly = true
# Don't sanitize the test program in ways that give it too much accessible
# memory to fit into a reasonably-sized dump file.
exclude_toolchain_tags = [ "uses-shadow" ]
sources = [ "test-child.cc" ]
deps = [
"//sdk/lib/stdcompat",
"//zircon/system/ulib/fbl",
]
metadata = {
}
if (is_fuchsia) {
deps += [
":zxdump-test-child-dso",
"//sdk/lib/fdio",
"//src/zircon/lib/zircon",
"//zircon/system/ulib/zx",
]
# Let the rspfile target also collect the DSO name.
metadata.link_output_barrier = [ ":zxdump-test-child-dso" ]
}
if (is_host) {
base_out_dir = get_label_info(":$target_name(${toolchain_variant.base})",
"root_out_dir")
metadata.test_runtime_deps = [ "$base_out_dir/$target_name" ]
}
}
shared_library("zxdump-test-child-dso") {
visibility = [ ":*" ]
testonly = true
public = [ "test-child-dso.h" ]
sources = [ "test-child-dso.cc" ]
}
# This will list the output paths for zxdump-test-child-dso as well.
link_output_rspfile("test-child-elf-search.rsp") {
visibility = [ ":*" ]
testonly = true
outputs = [ "$target_gen_dir/$target_name" ]
deps = [ ":zxdump-test-child($default_toolchain)" ]
}
# Now use the rspfile to extract the build IDs from the test binaries.
# elf-search-tests.cc uses the generated header to match them at runtime.
action("test-child-elf-search") {
visibility = [ ":*" ]
testonly = true
script = "test-child-elf-search.sh"
deps = [ ":test-child-elf-search.rsp" ]
sources = get_target_outputs(deps[0])
outputs = [ "$target_gen_dir/test-child-elf-search.inc" ]
depfile = "$target_gen_dir/test-child-elf-search.d"
args = rebase_path(outputs + sources + [ depfile ], root_build_dir)
}
fuchsia_unittest_package("zxdump-tests") {
deps = [ ":zxdump-unittests" ]
manifest = "meta/zxdump-tests.cml"
test_type = "system"
if (current_cpu == "riscv64") {
# TODO(https://fxbug.dev/42081271): Remove this once ZxdumpTests pass on RISC-V.
test_specs = {
environments = []
}
}
}
group("tests") {
testonly = true
deps = [
":zxdump-tests",
":zxdump-unittests($host_toolchain)",
# TODO(mcgrathr): just to get them built for now
":zxdump-tools",
]
}
group("tools") {
deps = [ ":gcore" ]
data_deps = [ ":host-tools" ]
}
install_host_tools("host-tools") {
outputs = [ "gcore" ]
deps = [ ":gcore" ]
}
# This is not part of the library, but it's shared by the tools.
source_set("cli") {
visibility = [ ":*" ]
sources = [ "cli.cc" ]
public = [ "cli.h" ]
public_deps = [ ":zxdump" ]
}
executable("gcore") {
sources = [ "gcore.cc" ]
deps = [
":cli",
"//sdk/lib/fit",
"//third_party/rapidjson",
"//zircon/system/ulib/fbl",
]
}
fuchsia_shell_package("zxdump-tools") {
deps = [ ":tools" ]
}