| # 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/public/gn/toolchain/environment.gni") |
| import("$zx/public/gn/toolchain/environment_redirect.gni") |
| |
| # Gigaboot gets its own toolchains to build EFI code. |
| # TODO(mcgrathr): Put efi into standard.gni? That would require moving |
| # the referenced configs (efi_config + kernel:standalone) int public/gn. |
| # Maybe only worthwhile if lib+include gets turned into an efi-libc |
| # library() that could theoretically be exported. |
| if (current_toolchain == default_toolchain) { |
| foreach(cpu, standard_fuchsia_cpus) { |
| environment("efi") { |
| cpu = cpu |
| os = "win" |
| globals = { |
| is_kernel = true |
| } |
| configs += standard_fuchsia_configs + [ ":efi_config" ] |
| |
| # TODO: harmless, but just to match build.mk |
| configs -= [ "$zx/public/gn/config:default_frame_pointers" ] |
| |
| # TODO: strip = true |
| |
| tags = [ "standalone" ] |
| exclude_variant_tags = [ |
| # There isn't a GCC toolchain that supports the Windows target |
| # directly the way we use it. |
| "gcc", |
| ] |
| } |
| } |
| } else if (toolchain.environment == "efi") { |
| # This is the top config for all code in the efi_toolchain. |
| config("efi_config") { |
| configs = [ |
| "$zx/kernel:standalone", |
| "$zx/public/gn/config:no_sanitizers", |
| |
| # TODO: "$zx/kernel:warnings", |
| ] |
| include_dirs = [ "include" ] |
| cflags = [ |
| "-std=c99", |
| "-fshort-wchar", |
| ] |
| |
| # The compiler predefines _MSC_VER for compatibility with the Windows |
| # compiler. But then some compiler-provided headers like <stddef.h> |
| # test _MSC_VER and expect some Windows API headers to exist if it's |
| # set. We use the "windows-msvc" compiler target for EFI because it's |
| # right wrt calling conventions and object file format, but this EFI |
| # compilation environment does not use a Windows-style API. |
| cflags += [ "-U_MSC_VER" ] |
| } |
| |
| zx_executable("bootloader") { |
| output_dir = root_out_dir |
| if (current_cpu == "arm64") { |
| output_name = "bootaa64" |
| } else { |
| output_name = "boot${current_cpu}" |
| } |
| output_extension = "efi" |
| deps = [ |
| "lib", |
| "src", |
| ] |
| ldflags = [ |
| "-Wl,/subsystem:efi_application", |
| "-Wl,/entry:efi_main", |
| |
| # These only really affect instrumented builds but are always harmless. |
| "-noprofilelib", |
| "-Wl,/nodefaultlib", |
| ] |
| |
| # For the //:images build_api_module(). |
| metadata = { |
| images = [ |
| { |
| label = get_label_info(":$target_name", "label_with_toolchain") |
| name = "bootloader" |
| type = "efi" |
| path = rebase_path("$root_out_dir/$output_name.$output_extension", |
| root_build_dir) |
| cpu = current_cpu |
| }, |
| ] |
| } |
| } |
| } else { |
| # In any other toolchain, just redirect to the proper toolchain. |
| environment_redirect("bootloader") { |
| environment_label = ":efi" |
| direct = true |
| deps = [ |
| ":bootloader", |
| ] |
| } |
| } |