Files
carbon-lang/toolchain/install/BUILD
T
Jon Ross-Perkins c59faea0e8 Fix up busybox detection for relative symlinks (#4522)
Handling for relative symlinks is new (comment talks about relative
symlinks). Relocated to add tests though, to do extra checking of logic.
2024-11-14 17:13:01 +00:00

204 lines
5.6 KiB
Python

# Part of the Carbon Language project, under the Apache License v2.0 with LLVM
# Exceptions. See /LICENSE for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
load("//bazel/cc_toolchains:defs.bzl", "cc_env")
load("//bazel/manifest:defs.bzl", "manifest")
load("install_filegroups.bzl", "install_busybox_wrapper", "install_filegroup", "install_symlink", "install_target", "make_install_filegroups")
load("pkg_helpers.bzl", "pkg_naming_variables", "pkg_tar_and_test")
load("run_tool.bzl", "run_tool")
package(default_visibility = ["//visibility:public"])
# Build rules supporting the install data tree for the Carbon toolchain.
#
# This populates a synthetic Carbon toolchain installation under the
# `prefix_root` directory. For details on its layout, see `install_dirs` below.
# A library for computing install paths for the toolchain. Note that this
# library does *not* include the data itself, as that would form a dependency
# cycle. Each part of the toolchain should add the narrow data file groups to
# their data dependencies, and then use this library to locate them.
cc_library(
name = "install_paths",
srcs = ["install_paths.cpp"],
hdrs = ["install_paths.h"],
deps = [
"//common:check",
"//common:error",
"@bazel_tools//tools/cpp/runfiles",
"@llvm-project//llvm:Support",
],
)
cc_binary(
name = "test_binary",
testonly = 1,
srcs = ["test_binary.cpp"],
data = [":install_data"],
)
cc_test(
name = "install_paths_test",
size = "small",
srcs = ["install_paths_test.cpp"],
data = [
":install_data",
":test_binary",
],
deps = [
":install_paths",
"//common:check",
"//common:ostream",
"//testing/base:global_exe_path",
"//testing/base:gtest_main",
"@bazel_tools//tools/cpp/runfiles",
"@googletest//:gtest",
"@llvm-project//llvm:Support",
],
)
cc_library(
name = "install_paths_test_helpers",
testonly = 1,
srcs = ["install_paths_test_helpers.cpp"],
hdrs = ["install_paths_test_helpers.h"],
deps = [
":install_paths",
"//testing/base:global_exe_path",
"@llvm-project//llvm:Support",
],
)
cc_library(
name = "busybox_info",
hdrs = ["busybox_info.h"],
deps = [
"//common:error",
"@llvm-project//llvm:Support",
],
)
cc_test(
name = "busybox_info_test",
srcs = ["busybox_info_test.cpp"],
deps = [
":busybox_info",
"//common:check",
"//testing/base:gtest_main",
"@googletest//:gtest",
],
)
# This target doesn't include prelude libraries. To get a target that has the
# prelude available, use //toolchain.
cc_binary(
name = "carbon-busybox",
srcs = ["busybox_main.cpp"],
env = cc_env(),
deps = [
":busybox_info",
":install_paths",
"//common:all_llvm_targets",
"//common:bazel_working_dir",
"//common:error",
"//common:exe_path",
"//common:init_llvm",
"//common:version_stamp",
"//toolchain/driver",
"@llvm-project//llvm:Support",
],
)
lld_aliases = [
"ld.lld",
"ld64.lld",
"lld-link",
"wasm-ld",
]
# Given a root `prefix_root`, the hierarchy looks like:
#
# - prefix_root/bin: Binaries intended for direct use.
# - prefix_root/lib/carbon: Private data and files.
# - prefix_root/lib/carbon/core: The `Core` package files.
# - prefix_root/lib/carbon/llvm/bin: LLVM binaries.
#
# This will be how installs are provided on Unix-y platforms, and is loosely
# based on the FHS (Filesystem Hierarchy Standard).
install_dirs = {
"bin": [
install_busybox_wrapper(
"carbon",
"../lib/carbon/carbon-busybox",
),
],
"lib/carbon": [
install_target("carbon_install.txt", "carbon_install.txt"),
install_target(
"carbon-busybox",
":carbon-busybox",
executable = True,
is_driver = True,
),
install_filegroup("core", "//core:prelude"),
],
"lib/carbon/llvm/bin": [
install_target(
"lld",
"@llvm-project//lld:lld",
executable = True,
),
install_busybox_wrapper(
"clang",
"../../carbon-busybox",
[
"clang",
"--",
],
),
] + [install_symlink(name, "lld") for name in lld_aliases],
}
make_install_filegroups(
name = "install_data",
install_dirs = install_dirs,
no_driver_name = "install_data.no_driver",
pkg_name = "pkg_data",
prefix = "prefix_root",
)
manifest(
name = "install_data_manifest.txt",
srcs = [":install_data"],
)
pkg_naming_variables(
name = "packaging_variables",
)
# We build both a compressed and uncompressed tar file with the same code here.
# This lets us use the tar file in testing as it is fast to create, but ship the
# compressed version as a release.
#
# For manual tests, the tar rules are `carbon_toolchain_tar_rule` and
# `carbon_toolchain_tar_gz_rule`.
pkg_tar_and_test(
srcs = [":pkg_data"],
install_data_manifest = ":install_data_manifest.txt",
name_base = "carbon_toolchain",
package_dir = "carbon_toolchain-$(version)",
package_file_name_base = "carbon_toolchain-$(version)",
package_variables = ":packaging_variables",
stamp = -1, # Allow `--stamp` builds to produce file timestamps.
)
# Support `bazel run` on specific binaries.
run_tool(
name = "run_carbon",
data = [":install_data"],
env = cc_env(),
tool = "prefix_root/bin/carbon",
)