summaryrefslogtreecommitdiff
path: root/gbl/efi/BUILD
blob: 7224db6ce0f6a60c89a303b2baab06ca4cc8682f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# Copyright (C) 2023 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

load("@gbl//toolchain:gbl_toolchain.bzl", "build_with_platform")
load("@gbl_llvm_prebuilts//:info.bzl", "gbl_llvm_tool_path")
load("@rules_rust//rust:defs.bzl", "rust_binary")

package(
    default_visibility = ["//visibility:public"],
)

rust_binary(
    name = "main",
    srcs = [
        "src/main.rs",
        "src/riscv64.rs",
        "src/utils.rs",
    ],
    linker_script = select({
        "@gbl//toolchain:gbl_rust_elf_riscv64": "@gbl//efi/arch/riscv64:riscv64_efi.lds",
        "//conditions:default": None,
    }),
    rustc_flags = [
        "-C",
        "panic=abort",
    ],
    deps = [
        "@gbl//libboot",
        "@gbl//libbootimg",
        "@gbl//libefi",
        "@gbl//libfdt",
        "@gbl//libstorage",
        "@gbl//third_party/libzbi",
    ] + select({
        "@gbl//toolchain:gbl_rust_elf_riscv64": ["@gbl//efi/arch/riscv64:efi_arch_deps_riscv64"],
        "//conditions:default": [],
    }),
)

genrule(
    name = "gbl_efi",
    srcs = [":main"],
    outs = ["gbl.efi"],
    cmd = select({
        # For RISCV target, existing toolchain can only generate ELF format image.
        # The current solution is to manually add a PE/COFF header at image
        # start and use objcopy to remove the ELF header to make it a PE/COFF image.
        # Also use `elf_static_relocation_checker` to check that our relocation library
        # can handle all the generated relocation types. The following expands to two commands:
        #
        # 1. `llvm-objcopy <elf image> -O binary <efi image>`
        # 2. `elf_static_relocation_checker <elf image> <efi image>`
        "@gbl//toolchain:gbl_rust_elf_riscv64": """
            {} -O binary $(location @gbl//efi:main) $(OUTS) && \\
            $(location @gbl//libelf:elf_static_relocation_checker) $(SRCS) $(OUTS)
        """.format(gbl_llvm_tool_path("llvm-objcopy")),
        "//conditions:default": "cp $(SRCS) $(OUTS)",
    }),
    tools = select({
        "@gbl//toolchain:gbl_rust_elf_riscv64": ["@gbl//libelf:elf_static_relocation_checker"],
        "//conditions:default": [],
    }),
)

build_with_platform(
    name = "x86_64",
    platform = "@gbl//toolchain:gbl_uefi_x86_64",
    deps = [":gbl_efi"],
)

build_with_platform(
    name = "x86_32",
    platform = "@gbl//toolchain:gbl_uefi_x86_32",
    deps = [":gbl_efi"],
)

build_with_platform(
    name = "aarch64",
    platform = "@gbl//toolchain:gbl_uefi_aarch64",
    deps = [":gbl_efi"],
)

build_with_platform(
    name = "riscv64",
    platform = "@gbl//toolchain:gbl_elf_riscv64",
    deps = [":gbl_efi"],
)

filegroup(
    name = "all_platforms",
    srcs = [
        ":aarch64",
        ":riscv64",
        ":x86_32",
        ":x86_64",
    ],
)