首页
学习
活动
专区
工具
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

    27210

    编写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.8K11

    扩展 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.8K10

    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.4K20

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

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

    3.4K40

    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

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

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

    1.7K00

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

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

    81710

    Google Option概要及使用

    读取要采集的数据目录,生成上传任务,上传任务包含一个任务文件,该文件包含了要上传哪些文件到HDFS上。 执行任务,读取要上传的任务文件,挨个将任务文件中的文件上传到HDFS。...这是Bazel Project中的命令行参数解析器。...Bazel:是Google开源的构建工具,它的速度非常快,是Maven的5倍以上。采用了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

    55820

    CentOS7.8下编译muduo库找不到Boost库报错的解决方法

    按照muduo Github官网README中的说法, 只需要编译muduo库根目录下的build.sh可执行文件即可。...从错误信息可以看出找不到Boost库的头文件所在路径,于是我查看了一下muduo源代码根目录下的CMakeLists.txt文件: cmake_minimum_required(VERSION 2.6)...- 首选的Boost安装路径 BOOST_INCLUDEDIR - 首选的头文件搜索路径 e.g....如果开启了,则不会搜索用户指定路径之外的路径 所以可以首先设置BOOST_ROOT、BOOST_INCLUDEDIR、BOOST_LIBRARYDIR这几个变量的值,改成自己的Boost库的目录,比如我的...第三种为例: 注意:不论使用make还是cmake也好,注意:muduo库的路径需要根据自己编译后的路径为准。

    1.9K20
    领券