首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Bazel C++ rules(cc_liibrary):为什么目标可以访问其依赖项中未通过hdrs公开的头部?

Bazel C++ rules中的cc_library规则允许目标访问其依赖项中未通过hdrs属性公开的头文件的原因是为了支持更灵活的依赖关系管理和模块化开发。

在Bazel中,cc_library规则用于定义一个C++库。它接受一组源文件、依赖项和其他属性,并生成一个目标(库文件)。通常情况下,依赖项中声明的头文件必须通过hdrs属性公开,以便其他目标可以访问这些头文件并使用库的功能。

然而,在某些情况下,可能存在一些特殊的需求或使用场景,需要目标能够访问未通过hdrs属性公开的头文件。这可能是因为一些头文件只在库的内部使用,不希望被公开;或者是为了避免在Bazel构建过程中生成过多的依赖关系图,提高构建效率。

尽管未通过hdrs公开的头文件在库的依赖项中被隐藏起来,但在目标内部仍然可以访问它们。这样做的优势是可以实现更精细的控制和管理,同时避免公开不必要的接口,提高代码的封装性和安全性。

在应用场景方面,使用Bazel的cc_library规则可以有效管理和构建复杂的C++项目。通过合理设置依赖关系和访问权限,可以实现模块化开发、代码重用和增量构建等优势。

对于Bazel C++ rules的具体使用和更详细的介绍,可以参考腾讯云相关产品中与之相关的文档和示例:

腾讯云Bazel文档链接:https://cloud.tencent.com/document/product/1422/55756

腾讯云Bazel C++ rules产品介绍链接:https://cloud.tencent.com/product/bzlcpp

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

谷歌Bazel构建工具

四、案例分析 为了更直观地展示Bazel在软件开发应用,让我们以一个简单C++项目为例。假设我们有一个简单C++程序,包含多个源文件和头文件,我们需要使用Bazel来构建和测试这个项目。...首先,我们需要创建一个BUILD文件来描述如何构建我们项目。在这个文件,我们可以定义目标及其依赖。...接下来,我们可以使用Bazel命令来构建我们项目: bazel build //:my_program 这个命令告诉Bazel根据BUILD文件定义规则来构建my_program目标。...如果测试通过,我们就可以自信地将软件发布给用户使用。 五、结论与展望 谷歌Bazel构建工具凭借强大功能和灵活性,在软件开发得到了广泛应用。...通过本文对谷歌Bazel构建工具深入探讨,我们了解了基本概念、应用场景以及如何使用它来构建和测试一个简单C++项目。

40810

百度Apollo源码学习之Bazel编译介绍

每个工作空间目录都有一个名为文本文件WORKSPACE,该文件可以为空,或者可以包含 对构建输出所需外部依赖引用。 包含名为文件 WORKSPACE目录被视为工作空间根。...可以看出bazel并不支持名为WORKSPACE.in文件....Sed 主要用来自动编辑一个或多个文件、简化对文件反复操作、编写转换程序等。 文件中大部分描述就是编译过程中所需要外部依赖. 具体语法可以参考官网....BUILD文件 BUILD文件包含了多个不同类型bazel指令。 其中最重要是编译规则(build rule),它告诉bazel怎么编译目标输出,是一个执行文件还是一个库。...BUILD文件每一个编译规则被称为target,指向了一堆源文件和相关依赖,一个target也可以指向其他target。

3.3K40
  • 自定义规则实现将多个静态库合并为一个动态库或静态库

    :将一个字符串写入文件 ctx.actions.expand_template :从模板文件创建一个文件 因此我们可以通过创建一个运行脚本命令 Action 来运行上面所述打包命令,即使用 ctx.actions.run_shell...通常用于从 rules 和 aspects 传递依赖积累数据。depset 成员必须是可散列(hashable),并且所有元素都是相同类型。...具体其他特性和用法这里就不展开了,我们只需要知道这种数据结构保存了 rules目标依赖关系信息。...Depsets 可能包含重复值,但是使用 to_list() 成员函数可以获取一个没有重复元素列表,遍历所以成员。...我们在 _combine_impl 可以用 ctx.attr.deps 获得当前目标依赖列表,每个元素组成为<target //libA:A, keys:[CcInfo, InstrumentedFilesInfo

    5.2K20

    构建Golang项目

    1 rules_go 与 gazelle Bazel 支持很多内置规则,语言相关规则有 Shell、Objective-C、C++ 和 Java,比如 sh_binary、cc_binary、cc_import...cgo,则需要本机上有 C/C++ 工具链,默认 Bazel 会尝试自动配置工具链 Bash、patch、cat 和 PATH 其他一些 Unix 工具 无需安装 Go 工具链,Bazel 会自动为每个项目下载最新版本...Bazel Go 规则集,可以让我们很方便地管理 Go 工具链和外部库,而无需依赖于本地安装库。...且 Bazel 沙箱特性,保证每个开发者构建环境一致。 Go 本身 Go Modules 依赖管理已经变得成熟,我们可以很方便管理我们依赖包和版本。...当然,使用 Bazel Go Rules 同时,我们还可以使用原生 go build,即两种方式不会发生冲突。

    3.9K10

    自定义工具链

    Bazel 还必须淘汰旧 APIs。这不是很容易就完成任务,因为项目的所有语言、工具链、依赖和 select() 都必须支持新 APIs。这需要一个有序迁移顺序来保持项目正常工作。...已经完整支持平台构建方式有: C/C++ Rust Go Java 未来 Bazel 目标是实现 $ bazel build //:all,即一个命令行就可以构建任何项目和目标平台。...当然这里可以进一步去做一些工程上优化: 生成 CcToolchainConfigInfo 规则,可以优化输入配置,使得写一个工具链配置规则即可配置所有主流 C++ 编译器attrs = { "...为了简化 $ bazel build 命令,可以将默认配置写入 .bazelrc 文件: build:compiler_config --crosstool_top=//toolchains/cpp...这样就可以将平台与工具链联合在一起了,原理类似依赖注入。 工具链是使用 toolchain[2] 规则定义目标,该规则将工具链实现与工具链类型相关联。

    4.7K31

    Bazel 7 发布:全新模块化依赖管理、无字节构建与多目标构建性能提升

    作者 | Sergio De Simone 译者 | Sambodhi 策划 | 丁晓昀 最近在 BazelCon 23 上宣布,Bazel 7 推出了多年来一直在开发一系列新功能,其中包括全新模块化外部依赖管理系统...一个 Bazel 模块是一个项目,可以有多个版本,每个版本依赖于一组特定依赖关系,如下所示: module(name = "my-module", version = "1.0") bazel_dep...(name = "rules_cc", version = "0.0.1") bazel_dep(name = "protobuf", version = "3.19.0") Bzlmod,这个新外部依赖子系统...无字节构建(Build without the Bytes,BwoB)通过只下载中间文件子集,有效减少了 Bazel 在远程构建中传输数据量。...最后提到,Bazel 7 现在默认启用了基于平台工具链解析,适用于 Android 和 C++ 规则。

    18110

    Bazel 7 发布:全新模块化依赖管理、无字节构建与多目标构建性能提升

    作者 | Sergio De Simone 译者 | Sambodhi 策划 | 丁晓昀 最近在 BazelCon 23 上宣布,Bazel 7 推出了多年来一直在开发一系列新功能,其中包括全新模块化外部依赖管理系统...一个 Bazel 模块是一个项目,可以有多个版本,每个版本依赖于一组特定依赖关系,如下所示: module(name = "my-module", version = "1.0") bazel_dep...(name = "rules_cc", version = "0.0.1") bazel_dep(name = "protobuf", version = "3.19.0") Bzlmod,这个新外部依赖子系统...无字节构建(Build without the Bytes,BwoB)通过只下载中间文件子集,有效减少了 Bazel 在远程构建中传输数据量。...最后提到,Bazel 7 现在默认启用了基于平台工具链解析,适用于 Android 和 C++ 规则。

    32110

    连1.0版本都没有,Uber为什么会采用这样一新技术?

    Bazel 创建一个封闭式 C++ 工具链是一很大工作(对于我们 Go Monorepo 来说,需要花费数月时间),没有迫切需求,也没有足够痛苦,我们还无法接受做这样一件事。...可以链接到通过命令行参数提供 glibc 版本(例如,-target x86_64-linux-gnu.2.28将以 x86_64 Linux 为编译目标并链接到 glibc 2.28)。...关于这一点,很明显,要想真正搭载 bazel-zig-cc 并编译所有的 C/C++ 代码,需要巨大投入来消除对系统库依赖,并偿还大量技术债务。...2021 年底:回顾 Uber 有很多地方可以从一个封闭式 C++ 交叉编译器受益,但由于需要大量投资,再加上没有足够理由,所以没有获得资助。...合同金额是公开,因为 ZSF 是非营利。 2022 年及以后 2022 年 2 月,该工具链通过一个命令行标志(--config=hermetic-cc)做了限定。

    1.5K20

    重构基于CMake构建工具链

    背景 对大型项目来说,必然会有很多依赖。特别是现代化组件都会尝试去复用社区资源。而对于C/C++而言,依赖管理一直是一个比较头大问题。...有一点 bazel 还比较好是,它依赖包是靠包名来索引。所以当存在依赖包之间互相有依赖时候,父级节点声明包名标准化统一,那么也可以控制子依赖版本。...但是 C/C++ 但大多数包和库都是通过检测环境和功能方式多每个细节做切换,每个功能之间组合配置显然不实际,所以一般 bazel 构建包都只会提供几个典型选项,这对我们希望精确控制功能细节非常不友好...依赖包里有gRPC和protobuf,其中gRPC又依赖abseil-cpp 。...另外就是在不使用 vcpkg 或者 vcpkg 内安装某个依赖时候,我会走自己内部统一编译安装流程,并且预留了可以由上层应用来控制下载源和版本号,甚至是一些编译参数。

    5.1K10

    使用Zig在arm64上引导Uber基础设施

    现在我们已经知道交叉编译器使用了哪些东西,我们可以依赖分为两类: 特定于主机工具(编译器、链接器和其他与目标平台无关程序); 特定于目标平台库和头文件,它们是为目标平台编译最终程序所必需。...Zig 需要依赖与 Clang 一样,我们来看一下: 工具:C 编译器(Clang)和链接器(lld)。 它们被静态地链接到 Zig 二进制文件,对于 macOS,Zig 实现了自己链接器。...Bazel 与 Zig 对于 Bazel 来说,只有一个 C++ 工具链(在本例是 Zig SDK)是不够:它还需要一些粘合代码,一个工具链配置。...到 2022 年 9 月,所有测试都通过了。自 2023 年 1 月起,Zig 工具链可以将 Uber Go 代码库所有 C 和 C++ 代码编译到 Linux 目标平台。...依赖代码,并且如果无法编译就不允许通过

    33930

    Spotify 如何切换到 Bazel 进行 iOS App 构建

    在采用 Bazel 之前,Spotify 使用基于 YAML 自定义 Ruby DSL,开发人员可以声明式地添加新模块,包括构建目标的规范、构建它所需源文件、资源和依赖。...其中有一个配置包含超过 800 个测试目标、近 300 万行代码,使用 Xcode 构建花费时间在 45 分钟以上。迁移到 Bazel 之后不到 10 分钟就可以构建完成。...相反,它会涉及到一个严谨过程,即使用 BuildBuddy 提供遥测洞察来识别性能问题和瓶颈(BuildBuddy 是一个旨在通过图形用户界面和命令行界面解锁 Bazel 功能工具)。...为了改善 Xcode 构建(开发人员在本地运行)和 Bazel 构建(在 CI 基础设施中使用)之间共存,Spotify 采用了 rules-xcodeproj。...这使得他们可以直接从 Bazel 构建文件生成 Xcode 项目,而不是使用遗留 Ruby/YAML 构建系统,这样就可以减少在本地构建成功但在 CI 失败情况,从而降低维护和故障排除成本。

    23320

    扩展 Bazel 构建语言

    宏和规则(Macros and rules)。 BUILD 三个阶段 了解如何在两个 BUILD 文件之间共享变量。...它可以访问 Bazel 内部信息,并完全掌控将要处理内容。例如,它可以将信息传递给其他规则。 如果您想重复使用简单逻辑,请从宏开始。如果宏变得复杂,通常最好使其成为规则。...对新语言支持通常通过规则来实现,例如 rules_go( https://github.com/bazelbuild/rules_go )。...BUILD 三个阶段 加载阶段。规则实例化,将其添加到图表。 分析阶段。执行规则代码( implementation 函数),并将操作实例化。...写入: COPTS = ["-DVERSION=5"] 然后,可以在 BUILD 文件以访问变量: load("//path/to:variables.bzl", "COPTS")cc_library(

    1.7K10

    Istio实战系列-Envoy Proxy构建分析

    Bazel是一种高层构建语言,类似Make,Maven和Gradle。特点是可读性较好,支持跨语言,跨平台编译;并且可以定义代码库之间依赖关系,支持跨代码库联合构建。...target是一个构建规则(build rule)实例,一般包含构建所需源文件,构建目标的名称。rule还可以嵌套,一个rule输出文件可以作为另一个rule输入文件。...另外target还可以依赖外部Repository另一个target,这个外部Repository可以是文件系统上另一个文件夹下项目,github项目或者http下载代码。...) build $(BAZEL_BUILD_ARGS) //src/envoy:envoy @bazel shutdown 从中可以看到,调用了bazel进行构建,构建target为...c++二进制rule,其中deps部分是依赖其他target。

    1.7K10

    Rust + Android 集成开发设计

    无需嵌套(nested)构建系统 Rust 提供了 Cargo 作为默认构建系统和包管理器,收集依赖并调用 rustc(Rust 编译器)来构建目标 crate(Rust 语言包)。...Soong 在 Android 扮演了这个角色,并直接调用 rustc。这是基于如下原因: 在 Cargo ,C 语言依赖通过 build.rs 脚本,以 ad-hoc 模式处理。...通过 Soong 直接调用编译器,可以为 Android 支持各种构建配置提供所需稳定性和控制能力(例如,指定特定于目标依赖位置,以及要使用编译标记)。...因为每个模块输出都放在自己 out/directory 目录;在依赖输出其生成源代码地方,没有单独目录。...C/C++ 模块可以依赖于 Rust cdylib 或者 staticlib 生成,它们与 C/C++方式相同。

    2.2K10

    自定义命令行编译标志

    规则设计者可以利用它,例如使规则在其依赖上设置隐式属性。 transition 表示跨依赖边缘配置转换。即可以实现读入一组构建设置,并输出一组构建设置。...=(-c) 等方式,是 Bazel 版本内置,而用户自定义编译设置可以在 .bzl 文件实现,不需要重新编译 Bazel 源码就可以实现 我们最终实现: $ bazel build //my:binary...我们可以在 _string_impl 函数通过 ctx.build_setting_value 获取构建标志值: def _string_impl(ctx): # do something....string_flag 构建设置规则在实际工程我们也不需要自己去实现,可以通过 `bazel-skylib`[3] 加载:load("@bazel_skylib//rules:common_settings.bzl...同时 _today 属性绑定 :week 目标,从而在 date 规则实现可以获得 _today 属性值。

    2.6K40

    gRPC 1.23.0 发布,Google高性能 RPC 框架

    gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上多复用请求等特性。这些特性使得在移动设备上表现更好,更省电且节省空间占用。.... (#19935) 为自定义 iomgr 添加缺少 APP 回调上下文 (#19687) 将 DNS 重新解析期间下限提高到 30 秒 (#19661) 确保在 H2 框架至少有一个标题 (#19657...) C# 将主要版本提升为 2.x (#19796) 添加 ChannelBase,更改 ClientBase 构造函数参数 (#19599) 删除 System.Interactive.Async 依赖...上双框 (#19525) C#:添加 System.Memory 依赖并在内部对所有目标框架使用 Span (#19569) csharp 在 UTF8 编码/解码期间删除 byte[] 分配...(#19511) csharp:删除 AuthContext Lazy 用法 (#19533) csharp 避免 HandleNewServerRpc=>HandleCallAsync capture-context

    92500

    AI运行环境搭建

    /contrib/download_prerequisites #这步是下载一些需要组件,我直接下载成功了,如果不成功可以安装上面参考教程方法手动下载 组件都下载完成后就可以configure了。...命令依赖于 python2.6 所以需要将 /usr/bin/yum 解释器指向 /usr/bin/python.old 安装pip并使用pip安装numpy(这步操作我不确定是不是编译tensorflow...安装bazel需要java1.8环境,我服务器上之前用rpm方式安装了jdk-8u40可以直接使用。...如果服务器上没有java1.8也可以下载一个tat.gz方式java包,解压并正确配置环境变量 这里安装bazel0.4.5与0.4.0安装方法有些不同,参考这里 之前尝试了使用0.4.0版本bazel...安装方法如下: cd ~/tensorflow-1.2.0 bazel build //tensorflow:libtensorflow_cc.so #下面是为C++所需编译准备环境 #我在安装时候把这个

    1.7K20
    领券