# riscv64 has no upstream UEFI target. We compile for
# `riscv64gc-unknown-none-elf`, drive lld in GNU flavor via a linker script to
# produce a position-independent ELF shared object, then `//build/riscv-elf2efi`
# converts it to PE so UEFI can load it.

load(":defs.bzl", "elf_to_efi")

export_file(
    name = "linker-script-riscv64",
    src = "linkers/riscv64-unknown-uefi.ld",
)

_DEPS = [
    "//sys/loader-common:loader-common",
    "//sys/loader-api:loader-api",
    "//lib/abort:abort",
    "//lib/mem-core:mem-core",
    "//lib/fdt:fdt",
    # third-party dependencies
    "//third-party:uefi",
    "//third-party:log",
]

_RUSTC_FLAGS = [
    "-Clink-arg=-shared",
    "-Clink-arg=-Bsymbolic",
    "-Clink-arg=--entry=efi_main",
    "-Clink-arg=-zmax-page-size=0x1000",
    "-Clink-arg=-znocombreloc",
    "-Clink-arg=-znorelro",
    "-Clink-arg=-T",
    "-Clink-arg=$(location :linker-script-riscv64)",
]

rust_binary(
    name = "_loader-efi-raw",
    srcs = glob(["src/**/*.rs"]),
    crate_root = "src/main.rs",
    rustc_flags = _RUSTC_FLAGS,
    deps = _DEPS,
    target_compatible_with = ["prelude//cpu/constraints:riscv64"],
    incoming_transition = "//build:loader",
    visibility = ["PUBLIC"],
)

elf_to_efi(
    name = "_loader-efi",
    src = ":_loader-efi-raw",
    visibility = [":loader"],
)

alias(
    name = "loader-efi",
    actual = ":_loader-efi",
    visibility = ["PUBLIC"],
)
