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

如何将生成的源代码放在Bazel中的私有包含路径中?

在Bazel构建系统中,如果你想要将生成的源代码放在私有包含路径中,你需要定义一个自定义的构建规则来处理这个过程。以下是实现这一目标的基础概念、步骤和相关优势:

基础概念

Bazel是一个开源的构建和测试工具,它使用高级构建语言来允许用户定义复杂的构建依赖关系。在Bazel中,你可以通过BUILD文件来描述你的构建规则,这些规则定义了如何从源代码生成目标文件。

相关优势

  • 依赖管理:Bazel能够精确地跟踪依赖关系,确保只有当依赖项发生变化时才会重新构建。
  • 可扩展性:Bazel允许用户定义自己的构建规则,以适应特定的构建需求。
  • 跨平台:Bazel支持多种编程语言和平台,可以轻松地在不同的环境中构建项目。

类型

  • 自定义构建规则:通过Starlark(Bazel的构建语言)定义自己的规则。
  • :一种可以重用的构建逻辑块,可以用来简化BUILD文件。

应用场景

当你需要将生成的源代码放在特定的私有包含路径中时,例如,当你想要隐藏源代码的结构或者保护某些敏感的头文件不被外部访问时。

解决问题的步骤

  1. 定义自定义构建规则:使用Starlark编写一个自定义规则,该规则将生成的源代码复制到指定的私有包含路径。
  2. 更新BUILD文件:在你的项目的BUILD文件中使用这个自定义规则来处理生成的源代码。

示例代码

以下是一个简单的Starlark脚本示例,用于定义一个自定义构建规则,该规则将生成的源代码复制到私有包含路径:

代码语言:txt
复制
def _copy_generated_code_impl(ctx):
    source = ctx.file.source
    output = ctx.actions.declare_file(ctx.attr.dest)
    ctx.actions.run(
        inputs = [source],
        outputs = [output],
        executable = ctx.executable._copy_script,
        arguments = [source.path, output.path],
    )
    return [DefaultInfo(files = depset([output]))]

copy_generated_code = rule(
    implementation = _copy_generated_code_impl,
    attrs = {
        "source": attr.label(allow_single_file = True),
        "dest": attr.string(),
        "_copy_script": attr.label(executable = True, cfg = "host"),
    },
)

在你的BUILD文件中使用这个规则:

代码语言:txt
复制
load(":custom_rules.bzl", "copy_generated_code")

genrule(
    name = "generate_source",
    srcs = ["input.txt"],
    outs = ["generated_source.c"],
    cmd = "echo 'int main() { return 0; }' > $@",
)

copy_generated_code(
    name = "private_include",
    source = ":generate_source",
    dest = "private/include",
)

参考链接

通过上述步骤和示例代码,你可以将生成的源代码放在Bazel中的私有包含路径中。记得在实际应用中根据你的具体需求调整脚本和BUILD文件。

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

相关·内容

都是权限惹祸 | 安卓恶意APP如何将其他APP私有数据搞到手

前言 下面要介绍恶意软件可以读取Android手机其他app文件元数据,例如文件名称、大小、以及最后修改日期等等。...,在整个目录结构,每一个文件目录都给设备用户提供了完整执行权限(+x)。...在默认情况下,该App会在“/data/data/com.google.android.youtube/” 目录下“shared_prefs”文件夹中生成一个名为“youtube.xml”文件。...通过“ls”命令来查看其他App某些私有文件是否存在于文件系统,但前提是要知道目标文件文件名称; 2....值得注意是,Instagram还包含有一个ContentProvider(com.instagram.contentprovider.CurrentUserProvider),可以用来查询用户注册账号

2.5K100

C++核心准则:SF.12:使用双引号形式#include语句包含相对路径文件,用角括号形式包含所有其他位置文件​

include语句包含相对路径文件,用角括号形式包含所有其他位置文件 Reason(原因) The standard provides flexibility for compilers to implement...尽管如此,原则是用引号形式引入存在于使用#include语句文件相对路径(属于相同组件或项目的)文件,而使用角括号引入任何其他场所文件(如果可能)。...这鼓励明确被包含文件和包含文件相对位置,或者在需要不同检索算法时过程。这么做结果是可以很容易快速判明头文件是引自相对路径还是标准库,亦或是可选检索路径(例如来自其他库或通用集合)。...例如一个典型场景是当#include""检索算法首先检索本地相对路径时,使用这种形式参照一个非本地相对路径文件可能就意味着如果一个文件出现在在本地相对路径(例如包含文件被移动到新位置),它将在期待包含文件之前被发现...folder and have clients include those files using the relative path #include 库生成者应该将它们头文件放到一个目录并让使用者使用相对路径

2.3K41
  • 【C++】基础:代码编译与构建工具介绍

    知识介绍 C++ 编译与构建工具主要用于将 C++ 源代码转换为可执行程序。它们可以分为以下几类: 1.编译器: 将 C++ 源代码转换为机器代码。...gcc hello.c gcc hello.c -include /root/pianopan.h //包含include gcc hello.c -lcurses //包含lib g++ hello.cpp...如果要自己编译很多源文件时候就需要cmake工具,可以更加方便地生成makefile文件给make用。cmake还可以跨平台生成对应平台可用makefile,无需自己根据每个平台不同特性修改。...,其中包含项目名称、源文件列表、目标类型、依赖项等信息。...:CMakeLists.txt 完整路径 CMAKE_CURRENT_LIST_LINE:当前所在行 CMAKE_MODULE_PATH:定义自己 cmake 模块所在路径,SET(CMAKE_MODULE_PATH

    20010

    编写TensorFlow文档

    例如,TensorFlow安装指南全部在 docs_src/install目录。 C ++文档是通过doxygen生成XML文件生成; 但是,这些工具目前在开放源代码不可用。...此URL命名方案确保tensorflow.org可以将链接转发到与您正在查看文档版本相对应代码分支。不要在源代码URL包含url参数。...文档生成器将该模块docstring放在为模块生成Markdown文件开始处,在这种情况下为tf.image。 它曾经是一个要求,列出模块文件@@每个成员开头,放在每个成员之前。...私人符号和进口 符合API密封期望最简单方法是使非公开符号为私有(通过前缀下划线_)。文档生成器尊重私有符号。这也适用于模块。...在Python显示代码示例通常是有帮助。不要将它们放在C ++ Ops文件,并避免将它们放在Python Ops文档。如果可能,我们建议将代码示例放在 API指南中。

    1.1K70

    ​从微信后端仓库发展史谈谈单仓和多仓

    (对应下文一致性 ) 代码仓库所使用工具链应该不和代码组织结构强相关,甚至不应该和版本管理工具强耦合 小仓应该是一个完整包含代码完整构建单元,包括但不限于实现代码、单元测试用例、自动生成代码报告...,而是软链到与开源仓库对应 Fork 仓库路径,这样保持代码兼容性问题; 对于不同项目团队会分配不同工蜂(腾讯内部 git 管理平台,类似于 gitlab 私有化定制版)项目组。...; 超级大仓在远端编译时拉取仓时间会非常长,因为分支数目众多,使得非常小改动就会要更新整个仓库,大多数情况下这样会导致 bazel 计算依赖路径失效,频繁切换不同分支源代码。...一个领域(例如微信支付系统)可以包含不同类型仓库。...另外类似这样第三方库似乎只和生成产物构建系统强相关,也不适合将其放在代码仓库

    2.6K11

    扩展 Bazel 构建语言

    本篇介绍何使用宏和规则扩展 Bazel 构建语言。 在学习更高级概念之前,先了解以下几个知识点: 了解 BUILD 和 .bzl 文件中使用 Starlark 语言。...BUILD 三个阶段 加载阶段。规则实例化,将其添加到图表。 分析阶段。执行规则代码(其 implementation 函数),并将操作实例化。...一个操作描述了如何从一组输入生成一组输出,如“在 hello.c 上运行 gcc 和获取 hello.o”。分析阶段接受由加载阶段生成图并生成操作图。 执行阶段。...成功执行bazel build,没有报错,并且包含一个target。...路径生成了个小号图片 上面的代码放在: https://github.com/backendcloud/example/blob/master/bazel-extension-demo 官方example

    1.7K10

    Rust + Android 集成开发设计

    这意味着生成源文件需要放在源码树,或者通过 include 指令提供: include!...在构建时,cargo 命令会设置一个 OUT_DIR 环境变量,build.rs 脚本需要将生成源代码放入该环境变量。然后可通过以下方式包含该源文件: include!(concat!(env!...因为每个模块输出都放在自己 out/directory 目录;在依赖项输出其生成源代码地方,没有单独目录。...对于 Android 平台代码,我们更喜欢将生成源代码打包到可以引入 crate 。这是因为: 防止生成源文件名发生冲突。 减少在整个源码树中签入(并需要维护)模板代码。...使生成源代码编译成一个 crate,其所需任何模板代码都可以集中维护。 避免生成代码和其它 crate 之间有隐式交互。 通过动态地生成源代码,来减少对内存和磁盘压力。

    2.2K10

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

    但这个库并不包含Envoy自身源代码,因此这个库在构建时会从Github上下载Envoy源码进行联合编译。 编译工具 Envoy采用了Bazel进行构建。...Bazel定义构建依赖关系和规则,并管理构建生成临时文件及二进制文件,具体编译工作是调用各个语言编译工具如GCC, JAVAC等完成。...为了理解Envoy编译过程,我们需要先了解Bazel几个基础概念 workspace: 文件系统一个目录,该目录包含了用于编译软件所需所有源文件。...Package: 是一组用于相关文件集合,该目录包含一个BUILD文件,此文件描述了该程序包构建方式。 target: 生成目标,一般是一个lib或者二进制文件。...如果一切顺利,bazel会在proxy目录下创建一个目录链接bazel-bin,指向生成二进制文件。 编译过程分析 源码目录结构如下,主要构建逻辑在引号包含文件

    1.7K10

    TensorFlow固化模型实现操作

    前言 TensorFlow目前在移动端是无法training,只能跑已经训练好模型,但一般保存方式只有单一保存参数或者graph如何将参数、graph同时保存呢?...生成模型 主要有两种方法生成模型,一种是通过freeze_graph把tf.train.write_graph()生成pb文件与tf.train.saver()生成chkp文件固化之后重新生成一个pb...另一种是把变量转成常量之后写入PB文件。我们简单介绍下freeze_graph方法。...freeze_graph工具进行固化操作: 首先需要build freeze_graph 工具( 需要 bazel ): bazel build tensorflow/python/tools:freeze_graph...然后使用这个工具进行固化(/path/to/表示文件路径): bazel-bin/tensorflow/python/tools/freeze_graph –input_graph=/path/

    1.2K20

    repository_rule() vs rule()

    从构建阶段来看,rule() 规则可以依赖 repository_rule() 生成 BUILD 文件目标或者 bzl 文件等。...则功能等同于拷贝文件,类似的还有 ctx.actions.expand_template 函数 path repository_ctx.which(program) :返回一个程序路径 更多参见:https...这里 os 和 arch 用于生成 BUILD 文件时使用 _build_tpl 是用于生成构建文件模板标签。这是一个隐藏属性(它名字以_开头),这意味着它必须有一个默认值。...最后 ctx.template() 同上一节所述,实现将参数传入模板文件,然后复制生成 BUILD.bazel 文件。...这里简单实现了文件下载、校验和解压,进一步我们还可以实现对私有服务器进行身份验证或者通过自定义协议进行通信,当然这个实现就更复杂了。 下载并解压工具链后,如果去使用这些工具链呢?

    2.4K20

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

    生成动/静态库 cc_proto_library :从 .proto 文件生成 C++ 代码 fdo_prefetch_hints :表示位于工作区或位于指定绝对路径 FDO 预取提示配置文件...在编写规则我们就需要获取当前编译器,我们不能直接使用固定路径,比如 Linux 下 /usr/bin/gcc,因为可能是交叉编译器,路径就不一样了。...另外我们还需要传入 gcc 将多个静态库合并成一个动态库相关参数、待合成静态库列表、最后要生成动态库名称和路径。这样就是一个比较完善自定义规则了。...2 自定义规则实现 2.1 规则功能 将多个静态库合并成一个动态库 将多个静态库合并成一个静态库 可以设置生成名称和生成路径 静态库作为规则依赖 2.2 实现规则理论基础 将多个静态库合并成一个动态库...$ libtool --mode=link gcc -o libcombined.a libA.a libB.a libC.a # 这样可以指定生成路径,但是 *.o 生成还是需要 ar -x 来生成

    5.3K20

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

    workspace workspace存放了所有源代码Bazel编译输出文件目录,也就是整个项目的根目录。...(如果工作区一个目录包含BUILD文件,那么它就是一个package) 要指定一个目录为Bazel工作区,就只要在该目录下创建一个空WORKSPACE文件即可。...: 一个工作区是在文件系统包含源文件要构建软件,以及符号链接到包含生成输出目录目录。...因此,Bazel会忽略工作空间中任何目录树,这些工作树植根于包含WORKSPACE文件子目录(因为它们形成另一个工作空间)。...BUILD文件 BUILD文件包含了多个不同类型bazel指令。 其中最重要是编译规则(build rule),它告诉bazel怎么编译目标输出,是一个执行文件还是一个库。

    3.3K40

    在Android Studio配置Gradle做到 “根据命令行提示符生成指定versionCode, versionName,指定apk打包输出路径

    在实际开发,我们需要使用jenkins进行打包。就需要配置我们 gradle 脚本以支持参数化方式。   3....想获得一个可配置打包脚本方法,允许 配置人员根据需要修改 服务器地址,versionCode, versionName 等   4. 隔离源代码配置,使用者在 jenkins里进行配置。...,有 versionName,versionCode ,输入文件路径,和 指定服务器地址。...实现: 修改versionCode和 versionName 上面的演示,我们传入了gradle参数,如何在gradle中使用呢?... 名称和存放路径 我们继续配置 apk 输出 目录配置,这就需要获得 编译完成后文件名称配置,如何获得和设置输入路径呢?

    1.7K00

    DeepMind开源Sonnet:可在TensorFlow快速构建神经网络

    事实证明这是一个明智选择——较之以往,我们很多模型学习速度变得更快,而分布式训练嵌入式特征极大地简化了我们代码。...在各类文献,很多模型都可以被视为分层形式,如可微分神经计算机可能包含 LSTM 控制器,可以实现为包含标准线性层。...构建和运行安装程序 运行安装脚本,在临时目录创建一个 wheel file: $ mkdir /tmp/sonnet $ bazel build --config=opt :install $ ..../bazel-bin/install /tmp/sonnet pip install 生成 wheel file: $ pip install /tmp/sonnet/*.whl 如果已安装 Sonnet...,请确保你没有导入复制源代码(即在复制资源库外调用 Python),并在安装 wheel file 前卸载 Sonnet。

    1.3K70

    我们如何将 Pinterest iOS 应用大小减少 30% 以上

    加入你不熟悉 Bazel,这篇文章值得一读。 要创建本地化文件,我们有一个 CI 作业,它在应用程序(通过 Bazel 查询)自动扫描所有源代码,并将其发送给 Mojito 进行翻译。...每个扩展都是具有自己 BUILD 文件模块。在 Bazel 构建后,它将本地化字符串从主应用包复制到每个扩展包。...在进一步研究之后,我们发现这些宏都使用 +[NSBundle mainBundle],但是 [NSBundle mainBundle] 实际上会返回一个包含“当前应用程序可执行文件”包,当从扩展调用该包时...为了使 NSLocalizedStringWithDefaultValue 能够从主应用包读取本地化字符串,我们进行了更改来对路径进行设置。...长远规划 接下来,我们计划将本地化资源放入各自 SDK/ 扩展,而非依赖于应用包,这样做有以下好处: 每个包都将是自包含,所以它不需要主应用程序包就能运行或测试本地化,并且可以被绑定到一个单独应用程序

    81110

    Google Option概要及使用

    读取要采集数据目录,生成上传任务,上传任务包含一个任务文件,该文件包含了要上传哪些文件到HDFS上。 执行任务,读取要上传任务文件,挨个将任务文件文件上传到HDFS。...这是Bazel Project命令行参数解析器。...Bazel:是Google开源构建工具,它速度非常快,是Maven5倍以上。采用了Cache和增量构建。修改一行代码,Bazel只需要0.5s,但Maven需要重新构建一次。...help h 默认参数 (2) 要采集数据位置 source s (3) 生成待上传临时目录 temp_dir t “/tmp/sentiment” (4) 生成要上传到HDFS路径 output...HDFS路径", defaultValue = "" ) public String output; } 1.2.4.2 在 main方法解析参数 import

    55220

    Ubuntu配置TensorFlow使用环境方法

    二、安装Anaconda Anaconda指的是一个开源Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。...因为包含了大量科学包,Anaconda 下载文件比较大(约 531 MB),如果只需要某些包,或者需要节省带宽或存储空间,也可以使用Miniconda这个较小发行版(仅包含conda和 Python...,输入yes然后回车继续 接下来会询问咱们要把Anaconda安装到哪个路径,若有指定,输入路径并回车继续,若无指定,将会安装到默认目录家目录,回车继续。...CUDA™是一种由NVIDIA推出通用并行计算架构,该架构使GPU能够解决复杂计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部并行计算引擎。...NVIDIA cuDNN可以集成到更高级别的机器学习框架,如加州大学伯克利分校流行caffe软件。

    1.1K10
    领券