最近使用clang工具构建bazel项目。官方文档给的step较为繁琐,这里暂时记录一下,以便后期可以直接去用。这里具体的规则不进行详细解释,具体看官方文档有关描述。
查看预定义变量列表,使用如下命令:
bazel info --show_make_env
类似效果如下图:
官方配置C++工具链
项目的整体结构为:
build-tool-chain
├── main
│ ├── BUILD
│ └── hello-world.cc
├── toolchain
│ ├── BUILD
│ └── cc_toolchain_config.bzl
│
└── WORKSPACE
│
└── .bazelrc
WORKSPACE里面内容为空,可根据需要填写你项目所需的外部依赖。
.bazelrc内容主要配置--crosstool_top,--cpu, --host_crosstool_top
# Use our custom-configured c++ toolchain.
build:clang_config --crosstool_top=//toolchain:clang_suite
# Use --cpu as a differentiator.
build:clang_config --cpu=k8
# Use the default Bazel C++ toolchain to build the tools used during the
# build.
build:clang_config --host_crosstool_top=@bazel_tools//tools/cpp:toolchain
toolchain/BUILD的内容主要为cc_toolchain_suite,文件组等
package(default_visibility = ["//visibility:public"])
load(":cc_toolchain_config.bzl", "cc_toolchain_config")
# filegroup(name = "clang_suite")
cc_toolchain_suite(
name = "clang_suite",
toolchains = {
"k8": ":k8_toolchain",
},
)
filegroup(name = "empty")
cc_toolchain(
name = "k8_toolchain",
toolchain_identifier = "k8-toolchain",
toolchain_config = ":k8_toolchain_config",
all_files = ":empty",
compiler_files = ":empty",
dwp_files = ":empty",
linker_files = ":empty",
objcopy_files = ":empty",
strip_files = ":empty",
supports_param_files = 0,
)
cc_toolchain_config(name = "k8_toolchain_config")
# filegroup(name = "cc_toolchain_config")
toolchain/cc_toolchain_config.bzl文件的内容,这里需要将对应的clang相关头文件搜索路径配置为你的搜索路径
# NEW
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
# NEW
load(
"@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
"feature",
"flag_group",
"flag_set",
"tool_path",
)
all_link_actions = [ # NEW
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]
def _impl(ctx):
tool_paths = [
tool_path(
name = "gcc",
path = "/home/wzy/app/llvm-build-13.0.1/bin/clang",
),
tool_path(
name = "g++",
path = "/home/wzy/app/llvm-build-13.0.1/bin/clang++",
),
tool_path(
name = "ld",
path = "/usr/bin/ld",
),
tool_path(
name = "ar",
path = "/usr/bin/ar",
),
tool_path(
name = "cpp",
path = "/home/wzy/app/llvm-build-13.0.1/bin/clang++",
),
tool_path(
name = "gcov",
path = "/usr/bin/gcov",
),
tool_path(
name = "nm",
path = "/usr/bin/nm",
),
tool_path(
name = "objdump",
path = "/usr/bin/objdump",
),
tool_path(
name = "strip",
path = "/usr/bin/strip",
),
]
features = [ # NEW
feature(
name = "default_linker_flags",
enabled = True,
flag_sets = [
flag_set(
actions = all_link_actions,
flag_groups = ([
flag_group(
flags = [
"-lstdc++",
"-lpthread",
"-lm",
],
),
]),
),
],
),
]
return cc_common.create_cc_toolchain_config_info(
ctx = ctx,
features = features, # NEW
cxx_builtin_include_directories = [
"/home/wzy/app/llvm-build-13.0.1/lib/clang/15.0.0/include",
"/usr/include",
],
toolchain_identifier = "local",
host_system_name = "local",
target_system_name = "local",
target_cpu = "k8",
target_libc = "unknown",
compiler = "clang",
abi_version = "unknown",
abi_libc_version = "unknown",
tool_paths = tool_paths,
)
cc_toolchain_config = rule(
implementation = _impl,
attrs = {},
provides = [CcToolchainConfigInfo],
)
剩下就是main包里面的示例配置了,这里也给出
main/BUILD
load("@rules_cc//cc:defs.bzl", "cc_binary")
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
)
示例代码hello-world.cc
#include <ctime>
#include <string>
#include <iostream>
std::string get_greet(const std::string& who) {
return "Hello " + who;
}
void print_localtime() {
std::time_t result = std::time(nullptr);
std::cout << std::asctime(std::localtime(&result));
}
int main(int argc, char** argv) {
std::string who = "world";
if (argc > 1) {
who = argv[1];
}
std::cout << get_greet(who) << std::endl;
print_localtime();
return 0;
}
使用配置工具链构建执行
bazel build -s --config=clang_config //main:hello-world --explain "log.txt" --verbose_explanations=true --worker_verbose=true
效果如下:
bazel构建的信息,以及最后可执行文件执行