blob: 16db01168ba512bca3fc982331e808027601ef26 [file] [log] [blame]
# Copyright 2019 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT
# TODO(fxbug.dev/54160): Keep this in sync with BUILD.zircon.gn
import("//build/config/zircon/standard.gni")
import("//build/toolchain/zircon/zircon_toolchain_suite.gni")
import("//build/unification/global_variables.gni")
import("//zircon/kernel/params.gni")
# Define an empty kernel-specific toolchain suite for now.
# This is needed for the benefit of vdso-code-header but
# it not actually used to build anything yet due to redirections.
if (current_toolchain == default_toolchain) {
# In the default toolchain, just define the kernel toolchains.
foreach(cpu, standard_fuchsia_cpus) {
zircon_toolchain_suite("kernel_$cpu") {
cpu = cpu
os = "fuchsia"
environment = "kernel"
toolchain_variant_args = {
# IMPORTANT: This definition currently lacks the appropriate
# `remove_common_configs` and `configs` to really build anything
# for the Zircon kernel per se. This will be addressed in the
# near future.
tags = [
"kernel",
"standalone",
]
}
# NOTE: kernel artifacts currently do not build under fuzzer
# variants. This was also true with the Zircon build, but
# the Fuchsia build never invoked it with corresponding
# variant selectors. Using an exclude_variant_tag is
# enough to fix the issue.
exclude_variant_tags = [ "fuzzer" ]
}
}
}
if (is_kernel) {
config("headers") {
include_dirs = [
"include",
"lib/libc/include",
]
configs = [ "lib/libc:limits-dummy" ]
}
# For any standalone static binary.
config("standalone") {
ldflags = [
"-nostdlib",
"-static",
]
cflags = [
"-ffreestanding",
"-include",
rebase_path("include/hidden.h", root_build_dir),
# We want `.debug_frame` for the kernel (fxbug.dev/30023). And we still want
# asynchronous unwind tables. Alas there's (currently) no way to
# achieve this with our GCC. At the moment we compile with
# `-fno-omit-frame-pointer`, which is good because we link with
# `--gc-sections`, which means `.eh_frame` gets discarded so GCC-built
# kernels don't have any unwind info (except for assembly)! Assembler
# code has its own way of requesting `.debug_frame` vs `.eh_frame` with
# the `.cfi_sections` directive.
"-fno-unwind-tables",
]
cflags_cc = [
# Underlying kernel heap only has default alignment of 8 bytes, so pass
# this to the compiler as the default new alignment.
"-faligned-new=8",
]
if (current_cpu == "x64") {
# This only matters in an environment where interrupt handlers might
# push trap frames in the same privilege level, like the kernel.
# e.g. Multiboot probably doesn't actually need it, but it doesn't hurt.
cflags += [ "-mno-red-zone" ]
} else if (current_cpu == "arm64") {
# This matters if vector registers are not available, e.g. in the kernel
# since the they hold unsaved user state, or in the physmem environment
# because they might not be enabled in hardware yet.
if (!is_gcc) {
cflags += [ "-mgeneral-regs-only" ]
} else {
# TODO(mcgrathr): To work around a GCC bug we have to sneak
# -mgeneral-regs-only in through an arcane mechanism. See
# //zircon/kernel/lib/arch/arm64/include/lib/arch/intrin.h for details.
cflags += [
"-include",
rebase_path("arch/arm64/general-regs-only.h", root_build_dir),
]
}
}
if (is_gcc && current_os == "fuchsia") {
cflags += [ "-fpie" ]
}
if (!is_gcc && current_os == "fuchsia") {
# In the Fuchsia-target toolchains there's no way to prevent the
# compiler driver from passing -pie, so negate it. BFD ld doesn't
# have --no-pie, but arm64-elf-gcc doesn't pass -pie either.
ldflags += [ "-Wl,--no-pie" ]
}
if (!is_gcc) {
# Disable the implicit addition of toolchain-provided libraries to
# the link by the compiler driver. No toolchain-provided library is
# compatible with the kernel's internal ABI.
#
# TODO(fxbug.dev/27356): Clang doesn't have a single straightforward switch to
# disable all such libraries, though it certainly should. It
# provides separate switches to disable the profiling/coverage
# runtime and to disable all the flavors of runtime implied by
# -fsanitize=... switches (including any such defaults). It will
# still provide other incompatible libraries to the link, but they
# won't have any effect since they don't define any symbols the link
# needs. However, this is a fragile situation that could easily
# break.
ldflags += [
"-noprofilelib",
"-fno-sanitize-link-runtime",
]
}
configs = [ "$zx_build_config:no_exceptions" ]
}
config("warnings") {
cflags = [
"-Wformat=2",
"-Wvla",
]
# GCC supports `-Wformat-signedness` but Clang currently does not.
if (is_gcc) {
cflags += [ "-Wformat-signedness" ]
}
cflags_c = [ "-Wmissing-prototypes" ]
}
} else { # is_kernel
group("tests") {
testonly = true
deps = [
"dev/coresight/tests($host_toolchain)",
"lib/acpi_lite:tests",
"lib/arch/test:tests",
"lib/boot-options/tests",
"lib/devicetree/tests",
"lib/heap/cmpctmalloc/tests($host_toolchain)",
"phys/lib:tests",
"phys/test",
]
}
}