Bazel Cross Compile
Basics of Bazel
- Target:
- Bazel ๋น๋ ํ๋ก์ธ์ค์ ๊ธฐ๋ณธ ๋จ์๋ก, ๋น๋ํ ์ ์๋ ๊ฐ๋ณ ํญ๋ชฉ.
- Label:
- ํน์ Target์ ์ฐธ์กฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ณ ์ ์๋ณ์.
- Rule:
- ์ด๋ค ์ก์ ์ ์์ ํ๋ ๊ท์น.
- Package:
- ๋น๋ ํ์ผ(BUILD)์ด ์์นํ ๋๋ ํฐ๋ฆฌ. ์์ค ์ฝ๋์ ๋น๋ ๊ท์น(rule)์ ๋ชจ์ ๋์ ๋ ผ๋ฆฌ์ ๋จ์.
- Workspace:
- Bazel ๋น๋์ ์ต์์ ๋๋ ํฐ๋ฆฌ๋ก, ํ๋ก์ ํธ์ ์์ ์ง์ .
- Starlark:
- Bazel์ ๋น๋ ๋ฐ ์ค์ ํ์ผ์ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ด์ฅํ ์คํฌ๋ฆฝํ ์ธ์ด.
- Python๊ณผ ์ ์ฌํ ๋ฌธ๋ฒ์ ๊ฐ์ง๊ณ ์์ง๋ง, ๋น๋ ์์คํ ์ ์ต์ ํ๋์ด ์๊ณ , ๊ฒฐ์ ์ (deterministic)์ผ๋ก ๋์ํ๋๋ก ์ค๊ณ.
Getting Started with Cross Compilation in Bazel
ํฌ๋ก์ค ์ปดํ์ผ๋ฌ ์ค๋น
ํ๊ฒ ํ๋ซํผ์ ์ํ ์๋ง์ ํด์ฒด์ธ ์ค๋น
- ํด์ฒด์ธ(Toolchain)์ด๋?
- ํ๊ฒ ํ๋ซํผ(์: CPU ์ํคํ ์ฒ๋ ์ด์์ฒด์ )์ด ํ์ฌ ๊ฐ๋ฐ ์ค์ธ ํธ์คํธ ํ๋ซํผ๊ณผ ๋ค๋ฅผ ๋, ํ๊ฒ ํ๊ฒฝ์ ๋ง๋ ์คํ ํ์ผ์ ์์ฑํ๊ธฐ ์ํ ๋๊ตฌ๋ค์ ๋ชจ์์ ์๋ฏธ.
Platform
Bazel์์ Platform์ ํน์ ๋น๋ ํ๊ฒฝ์ ๋ง๋ ํ๋์จ์ด ๋ฐ ์ํํธ์จ์ด ์๊ตฌ ์ฌํญ์ ์ ์ํ๋ ๊ฐ๋ ์ ๋๋ค. ํ๋ซํผ์ ์ ์ํจ์ผ๋ก์จ Bazel์ ์ฌ๋ฌ ํ๊ฒฝ์์ ๋น๋ ์์ ์ ๋ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ผ๋ฉฐ, ๊ฐ ํ๋ซํผ์ ๋ง๋ ํด์ฒด์ธ์ ์๋์ผ๋ก ์ ํํ์ฌ ๋น๋๋ฅผ ์ํํ ์ ์์ต๋๋ค.
Bazel์์ Platform์ ๋ค์ ๋ ๊ฐ์ง ๊ธฐ๋ณธ ์์๋ฅผ ์ฌ์ฉํด ์ ์ํฉ๋๋ค.
- ์ ์ฝ ์กฐ๊ฑด ์ค์ (constraint_setting)
- Platform์์ ์ฌ์ฉํ ์ ์๋ ์ ์ฝ ์กฐ๊ฑด์ ์ ํ์ ์ ์ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ์ด์์ฒด์ ์ ํ, CPU ์ํคํ ์ฒ, C++ ABI ๋ฑ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
- ์ ์ฝ ์กฐ๊ฑด ๊ฐ (constraint_value)
- ๊ฐ ์ ์ฝ ์กฐ๊ฑด์ ๋ํด ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ์ง์ ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ์ด์์ฒด์ ์ ํ์ ๋ํ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก linux, windows, macos ๋ฑ์ ๊ฐ์ ์ ์ํ ์ ์์ต๋๋ค.
constraint_value(
name = "bare_metal",
constraint_setting = "@platforms//os",
visibility = ["//visibility:public"],
)
platform(
name = "riscv64_bare_metal",
constraint_values = [
":bare_metal",
"@platforms//cpu:riscv64",
],
)
Toolchain
Bazel์์ ํฌ๋ก์ค ์ปดํ์ผ์ ์ํํ๋ ค๋ฉด ์ปดํ์ผ ํ๊ฒ์ ๋ง๋ ๋๊ตฌ ์ฒด์ธ(toolchain)์ ์ค์ ํด์ผ ํฉ๋๋ค. ์ด๋ CPU ์ํคํ ์ฒ๋ ์ด์์ฒด์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฏ๋ก, ๋ณดํต CROSSTOOL ํ์ผ์ด๋ .bazelrc ํ์ผ์ ์ฌ์ฉํ์ฌ ์ค์ ํฉ๋๋ค. Bazel์ ๊ธฐ๋ณธ ํด์ฒด์ธ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ฑฐ๋, ์๋ก์ด ํด์ฒด์ธ์ ์ง์ ํ ์ ์์ต๋๋ค.
- ์ปค์คํ ๋ฃฐ์ ์๋ก ์์ฑํ๋ฉด์ ํด์ฒด์ธ์ ์ ์ํ๋ ๋ฐฉ๋ฒ
- ๊ธฐ์กด์ ๋ฃฐ์ ์ฌ์ฌ์ฉํ์ฌ ํด์ฒด์ธ์ ์ ์ํ๋ ๋ฐฉ๋ฒ
์ฌ๊ธฐ์๋ ๊ธฐ์กด์ ๋ฃฐ์ ์ฌ์ฌ์ฉํ์ฌ ํด์ฒด์ธ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
Toolchain config ์ ์ํ๊ธฐ
toolchain_config๋ Bazel์์ ํน์ ํด์ฒด์ธ(toolchain)์ ๋์์ ๊ตฌ์ฑํ๊ณ ์ค์ ํ๋ ์ญํ ์ ํ๋ ๊ตฌ์ฑ ํ์ผ. ์ด ์ค์ ์ ์ปดํ์ผ๋ฌ์ ๋ง์ปค๊ฐ ํน์ ์์ ์ ์ํํ ๋ ์ด๋ค ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ ์ง, ์ด๋ค ๊ฒฝ๋ก์์ ์คํ ํ์ผ์ ์ฐพ์์ง ๋ฑ ์ธ๋ถ ์ฌํญ์ ๋ค๋ฃน๋๋ค.
load("@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", "feature", "tool_path", ... )
toolchain_tools = ["gcc", "ld", "ar", "cpp", "gcov", "nm", "objdump", "strip"]
tool_paths = [tool_path(name = tool, path = "/usr/bin/riscv64-linux-gnu-{}".format(tool)) for tool in toolchain_tools]
feature๋?
- Bazel์์ feature ๊ท์น์ ํน์ ์ปดํ์ผ/๋น๋ ์ค์ ์ ์ ์ํ์ฌ ๋น๋ ํ๋ก์ธ์ค ์ค์ ํ์ํ ํ๋๊ทธ๋ ๋์์ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
# rv64_bare_metal_toolchain.bzl
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
ASSEMBLE_ACTIONS = [
ACTION_NAMES.assemble,
ACTION_NAMES.preprocess_assemble,
]
COMPILE_ACTIONS = [
ACTION_NAMES.cpp_compile,
ACTION_NAMES.c_compile
]
ASSEMBLE_AND_COMPILE_ACTIONS = ASSEMBLE_ACTIONS + COMPILE_ACTIONS
arch_abi = feature(
name = "arch_and_abi",
enabled = True,
flag_sets = [
flag_set(
actions = ASSEMBLE_AND_COMPILE_ACTIONS,
flag_groups = [
flag_group(
flags = ["-march=rv64i", "-mabi=lp64"],
),
],
)
],
)
...
features = [arch_abi, link_static_no_stdlib, no_build_id]
...
return cc_common.create_cc_toolchain_config_info(
ctx = ctx,
toolchain_identifier = "local",
host_system_name = "local",
target_system_name = "local",
target_cpu = "riscv64",
target_libc = "unknown",
compiler = "clang",
abi_version = "unknown",
abi_libc_version = "unknown",
tool_paths = tool_paths,
cxx_builtin_include_directories = [
"/usr/riscv64-linux-gnu/include/",
"/usr/lib/gcc-cross/riscv64-linux-gnu/10/include/",
],
features = features,
)
CcToolchainConfigInfo?
- CcToolchainConfigInfo๋ Bazel์ C/C++ ๋น๋์์ ํด์ฒด์ธ์ ๊ตฌ์ฑ์ ๋ํ๋ด๋ ์ ๊ณต์(Provider).
- ์ด ์ ๊ณต์๋ Bazel์ด C/C++ ๋น๋์ ํน์ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๊ธฐ ์ํด ํด์ฒด์ธ์ ๋ํ ์ธ๋ถ ์ค์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ.
rv64_bare_metal_toolchain_config = rule(
implementation = _impl,
attrs = {},
provides = [CcToolchainConfigInfo],
)
load(":rv64_bare_metal_toolchain.bzl", "rv64_bare_metal_toolchain_config")
rv64_bare_metal_toolchain_config(
name = "rv64_bare_metal_config"
);
Toolchain ์ ์ํ๊ธฐ
load(":rv64_bare_metal_toolchain.bzl", "rv64_bare_metal_toolchain_config")
rv64_bare_metal_toolchain_config(
name = "rv64_bare_metal_config"
);
cc_toolchain(
name = "rv64_bare_metal_toolchain",
toolchain_identifier = "local",
toolchain_config = ":rv64_bare_metal_config",
...
)
toolchain(
name = "riscv64_bare_metal_toolchain_from_linux_x86_64",
exec_compatible_with = [
"@platforms//os:linux",
"@platforms//cpu:x86_64",
],
target_compatible_with = [
"//platform:bare_metal",
"@platforms//cpu:riscv64",
],
toolchain = ":rv64_bare_metal_toolchain",
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
)
Toolchain ์ฌ์ฉํ๊ธฐ
์ด์ ์ผ๋ฐ์ ์ธ cc_library์ cc_binary ํ๊ฒ์ ์์ฑํ ์ ์์ต๋๋ค!
BARE_METAL_RISCV64_CONSTRAINTS = [
"//platform:bare_metal",
"@platforms//cpu:riscv64",
]
cc_binary(
name = "program",
srcs = [
"program.c",
"boot.S",
],
additional_linker_inputs = [
"link_script.ld",
],
linkopts = ["-Wl,-T $(location :link_script.ld)"],
target_compatible_with = BARE_METAL_RISCV64_CONSTRAINTS,
)
๋น๋ ๋ช ๋ น์ด
ํฌ๋ก์ค ์ปดํ์ผ์ ์คํํ ๋๋ โplatforms ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฒ ํ๋ซํผ์ ์ง์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด: bazel build -s โplatforms=//platform:riscv64_bare_metal //program
Leave a comment