blob: 35603846cabef08f33ef69afacd410e36226e5f6 [file] [log] [blame]
# Copyright 2018 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/config/clang/clang.gni")
import("//build/rust/config.gni")
declare_args() {
# Disables ELF checks for packages.
disable_elf_checks = false
}
# Run a command that verifies that the ELF binaries listed in a given
# FINI manifest. More specifically, this checks that:
#
# - ELF binaries are all unstripped.
# - ELF executables have their dependencies available from the same
# manifest.
#
# On success, this target simply writes a stamp file. On error, it will
# print an error message explaining the issue.
#
# Arguments:
# manifest (required)
# [file path] Path to input manifest to verify.
#
#
#
# check_unstripped_files (optional)
# [boolean] Set to true to verify that all binaries have proper
# unstripped files.
#
# deps (required)
# [list of GN labels] List of dependencies this target depends on.
# It should at the very least list the target that generates
# the manifest.
#
template("verify_manifest_elf_binaries") {
if (defined(invoker.manifest)) {
input_manifest = invoker.manifest
} else if (defined(invoker.partial_manifest)) {
input_manifest = invoker.partial_manifest
} else {
assert(defined(invoker.manifest) || defined(invoker.partial_manifest),
"Missing 'manifest' or 'partial_manifest' argument!")
}
if (disable_elf_checks) {
group(target_name) {
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
deps = invoker.deps
not_needed(invoker,
[
"applicable_licenses",
"check_unstripped_files",
])
not_needed([ "input_manifest" ])
}
} else {
action(target_name) {
forward_variables_from(invoker,
[
"applicable_licenses",
"testonly",
"visibility",
])
script = "//build/dist/verify_manifest_elf_binaries.py"
inputs = [ "//build/images/elfinfo.py" ]
sources = [ input_manifest ]
outputs = [ "$target_gen_dir/${target_name}" ]
depfile = outputs[0] + ".d"
args = [
"--check-stripped",
"--depfile=" + rebase_path(depfile, root_build_dir),
"--stamp=" + rebase_path(outputs[0], root_build_dir),
]
if (defined(invoker.manifest)) {
args += [ "--fini-manifest=" + rebase_path(sources[0], root_build_dir) ]
} else {
args +=
[ "--partial-manifest=" + rebase_path(sources[0], root_build_dir) ]
}
if (defined(invoker.check_unstripped_files) &&
invoker.check_unstripped_files) {
args += [
"--check-unstripped-files",
"--toolchain-lib-dir=${rebased_clang_prefix}/../lib",
"--toolchain-lib-dir=${rebased_rustc_prefix}/lib",
]
}
deps = invoker.deps
}
}
}