blob: 40e6b3c7762231e10a0d12efebb6e2ba0be8d92f [file] [log] [blame]
# 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("$zx_build/public/gn/config/globals.gni")
import("$zx_build/public/gn/config/standard.gni")
import("$zx_build/public/gn/toolchain/environment.gni")
import("$zx_build/public/gn/toolchain/environment_redirect.gni")
# The vDSO is built in its own special environment because it has special
# constraints. If all the code going into the vDSO were built entirely in
# this BUILD.gn file, then a separate environment would not be necessary.
# But the vDSO needs to be able to use some other library code defined
# elsewhere.
if (current_toolchain == default_toolchain) {
# Define the special toolchain itself only in the default toolchain.
foreach(cpu, standard_fuchsia_cpus) {
environment("user.vdso") {
cpu = cpu
shlib = true
strip = "--strip-sections"
configs += standard_fuchsia_configs
configs += [
# This is mostly like other user code.
"$zx/public/gn/config:user",
# But it can't rely on full Fuchsia ABI like SafeStack/ShadowCallStack.
"$zx/public/gn/config:no_sanitizers",
# And it can't rely on libc.
"$zx/public/gn/config:freestanding",
"$zx/public/gn/config:rodso",
]
# The vDSO can't use instrumentation runtimes.
exclude_variant_tags = [ "instrumented" ]
tags = [ "vdso" ]
}
}
} else if (toolchain.environment != "user.vdso") {
# Even non-user environments can see the headers.
environment_redirect("headers") {
environment_label = ":user.vdso"
direct = true
shlib = true
deps = [ ":headers" ]
}
if (toolchain.base_environment == "user") {
# Other userland environments redirect to pick up the real library.
environment_redirect("zircon") {
environment_label = ":user.vdso"
direct = true
shlib = true
deps = [ ":zircon" ]
}
} else {
# References from other environments only get the headers. This
# makes it easy to have "$zx/system/ulib/zircon" deps in common
# libraries that need to link against it in userland but that in
# other contexts like kernel or userboot are just using the headers.
group("zircon") {
public_deps = [ ":headers" ]
}
}
# Publish headers to the GN build so that they may be used in host binaries.
zx_library("zircon-headers") {
sdk = "source"
sdk_headers = [
"zircon/exception.h",
"zircon/status.h",
]
sources = []
}
} else {
zx_library("zircon") {
shared = true
static = false
# The vDSO is never installed as a file, only baked into the kernel.
install_path = false
sources = [
"data.S",
"syscall-wrappers.cc",
"zx_cache_flush.cc",
"zx_channel_call.cc",
"zx_clock_get_monotonic.cc",
"zx_cprng_draw.cc",
"zx_deadline_after.cc",
"zx_exception_get_string.cc",
"zx_status_get_string.cc",
"zx_system_get_dcache_line_size.cc",
"zx_system_get_features.cc",
"zx_system_get_num_cpus.cc",
"zx_system_get_physmem.cc",
"zx_system_get_version.cc",
"zx_system_get_version_string.cc",
"zx_ticks_get.cc",
"zx_ticks_per_second.cc",
]
deps = [
":syscall-asm",
"$zx/kernel/lib/syscalls:headers",
"$zx/kernel/lib/userabi:headers",
"$zx/system/ulib/affine",
]
public_deps = [ "$zx/vdso:public($default_toolchain)" ]
# Instruct the linker to preserve the hidden alternate entry points.
# Note, "./" makes GN realize this is a file rather than a -l switch.
libs = [ "./alternates.ld" ]
ldflags = [
# Make sure libc++ is not linked into the vDSO. Header-only use is OK.
"-nostdlib++",
# Set e_entry so _zx_process_exit is easy to find without reading .dynsym.
"-Wl,-e,_zx_process_exit",
]
# TODO(BLD-353): The SDK exports this as part of the sysroot rather
# than as an independent library. Legacy integration likewise does not
# use a //zircon/public/lib/zircon buts instead uses libs=["zircon"].
# See //zircon/public/sysroot.
#
# The stripped binary doesn't even have section headers, so the linker
# can't handle it. Eventually we'll have linker stubs. For now, just
# use the unstripped library to link against. (In the case of the vDSO
# we don't really need to strip it in the first place, since its
# segments are embedded in the kernel and the stripped file is never
# put on a device. But there's no reasonable way to disable the
# standard stripping behavior for a single target.) The legacy build
# needs there to be a -L directory where libzircon.so is the name to
# link against so -lzircon works. So mock up such a directory using a
# linker script to redirect to the actual unstripped file name, which
# is not that.
link_file = "$target_gen_dir/libzircon.so"
debug_file = rebase_path("$target_out_dir/libzircon.so.debug")
write_file(link_file, [ "INPUT($debug_file)" ])
gen_include_dir =
get_label_info(public_deps[0], "root_gen_dir") + "/include"
metadata = {
legacy_sysroot = [
{
vdso =
rebase_path("$target_out_dir/libzircon.so.debug", root_build_dir)
},
{
include_dirs = rebase_path([
"include",
gen_include_dir,
],
root_build_dir)
},
{
sdk = {
include_dir = rebase_path(gen_include_dir, root_build_dir)
headers = [
"zircon/syscalls/internal/cdecls.inc",
# Note not included in SDK: "zircon/syscalls/definitions.rs",
]
}
},
{
sdk = {
include_dir = rebase_path("include", root_build_dir)
headers = [ "zircon/status.h" ]
}
},
{
sdk = {
include_dir = rebase_path("include", root_build_dir)
headers = [ "zircon/exception.h" ]
}
},
{
sdk = {
source = rebase_path("$target_out_dir/libzircon.so.debug",
root_build_dir)
link = "lib/libzircon.so"
}
},
{
sdk = {
source = rebase_path("$target_out_dir/libzircon.so.debug",
root_build_dir)
debug = "debug/libzircon.so"
}
},
]
# TODO(BLD-353): This is not actually for the SDK (see above). This
# is special-cased so no //zircon/public/lib/zircon gets made, but
# //build/config/fuchsia:compiler_sysroot can look up the metadata to
# find the right lib_dirs.
legacy_barrier = []
legacy_targets = [
{
_label = get_label_info(":$target_name", "label_with_toolchain")
_zircon_public = "lib"
target_name = "zircon"
libs = []
libs = [ rebase_path(link_file, root_build_dir) ]
},
]
# This library is on the allowlist for driver() shared library deps.
# It doesn't cause driver-denylist-check.sh to fail, and it prunes the
# metadata walk here so our own deps are not subject to the check.
driver_shlib_denylist = []
driver_shlib_denylist_barrier = []
}
}
source_set("syscall-asm") {
sources = [
"syscalls-$zircon_cpu.S",
"zx_futex_wake_handle_close_thread_exit-$zircon_cpu.S",
"zx_vmar_unmap_handle_close_thread_exit-$zircon_cpu.S",
]
deps = [
":headers",
"$zx/kernel/lib/syscalls",
]
if (toolchain.base_environment == "user") {
configs -= [ "$zx/public/gn/config:user" ]
}
}
}