我如何告诉 Bazel Python.h 所在的位置?

2024-03-07

我正在构建一个 C++ 可执行文件,需要从用户的 Python 安装中#include“Python.h”。

为了在 Bazel 中表达 Python.h(及其包含的各种头文件),我需要知道 Python 包含目录在哪里。这个位置在 Windows 和 Linux 上会有所不同,我想要一个 Bazel 配置来构建它们。

引用 WORKSPACE 根目录之外存在的软件的最佳 Bazel 实践是什么?


因此,要告诉 Bazel 有关外部依赖项的信息,您需要使用其中之一工作区规则 https://docs.bazel.build/versions/master/be/workspace.html#new_local_repository.build_file_content指定外部依赖项的位置以及BUILD供 Bazel 与该外部依赖项一起使用的文件。

要让某些东西跨平台工作,您需要使用select() https://docs.bazel.build/versions/master/be/functions.html#select函数让 Bazel 选择正确的库来构建您的主机操作系统。

这是实现这一目标的尝试:

首先我们有WORKSPACE项目根目录中的文件定义了两个库和BUILD文件供他们使用。这里我只是使用build_file_content但如果这变得太复杂,您可以将其放入自己的文件中并引用它。这BUILD这里的文件公开了 Python 附带的预构建库以及所需的头文件。它还为依赖于这些库的任何目标添加了包含路径,以便您可以执行以下操作#include "Python.h"

new_local_repository(
    name = "python_linux",
    path = "/usr",
    build_file_content = """
cc_library(
    name = "python35-lib",
    srcs = ["lib/python3.5/config-3.5m-x86_64-linux-gnu/libpython3.5.so"],
    hdrs = glob(["include/python3.5/*.h"]),
    includes = ["include/python3.5"],
    visibility = ["//visibility:public"]
)
    """
)

new_local_repository(
    name = "python_win",
    path = "C:/Python35",
    build_file_content = """
cc_library(
    name = "python35-lib",
    srcs = ["libs/python35.lib"],
    hdrs = glob(["include/*.h"]),
    includes = ["include/"],
    visibility = ["//visibility:public"]
)
    """
)

接下来是BUILD为您的申请提交文件。这里需要定义一些配置设置 https://docs.bazel.build/versions/master/be/general.html#config_setting。这允许我们为我们的构建定义依赖于平台的设置。我们使用 cpu 值来确定主机操作系统。

In the cc_binary我们使用的规则select()函数根据配置选择要链接的正确主机库。

config_setting(
    name = "linux_x86_64",
    values = {"cpu": "k8"},
    visibility = ["//visibility:public"],
)

config_setting(
    name = "windows",
    values = {"cpu": "x64_windows"},
    visibility = ["//visibility:public"],
)

cc_binary(
    name="python-test",
    srcs = [
        "main.c",
    ],
    deps = select({
        "//:linux_x86_64": [
            "@python_linux//:python35-lib"
        ],
        "//:windows": [
            "@python_win//:python35-lib"
        ]
    })
)

FWIW 这是main.c我正在尝试让这个工作正常进行。

#include "Python.h"

int main(int argc, char *argv[])
{
  Py_SetProgramName(argv[0]);  /* optional but recommended */
  Py_Initialize();
  PyRun_SimpleString("from time import time,ctime\n"
                     "print('Today is',ctime(time()))\n");
  Py_Finalize();
  return 0;
}

另一种方法(也许更简单)是将 python 头文件和库检查到存储库中。您仍然需要使用select()选择正确的库进行链接,但至少您不需要向您的WORKSPACE文件并且可以依赖另一个BUILD文件在您的存储库中。如果你看一下巴泽尔回购协议 https://github.com/bazelbuild/bazel他们将大量外部依赖项签入third_party目录,所以这是一种常见的做法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我如何告诉 Bazel Python.h 所在的位置? 的相关文章

  • make, cmake, bazel

    整理收集了一些自动化编译链接工具的使用教程 希望可以在之后能更好的理解和使用它们 1 make Linux 下 Make 命令Linux make Command Explained With Examples使用make命令编译项目文件入
  • 【名名的Bazel笔记】自定义规则实现将多个静态库合并为一个动态库或静态库

    文章目录 1 前言2 自定义规则实现2 1 规则功能2 2 实现规则的理论基础2 3 规则代码实现 3 总结4 参考资料 1 前言 为了实现如标题所述的将多个静态库合并为一个动态库 xff0c 内置的 Bazel 规则是没有这个功能的 xf
  • bazel支持测试执行顺序吗?

    我想在运行其他更深入的端到端测试之前运行一定数量的端到端集成测试 只要我不使用 keep going标记第一个测试失败应该退出bazel test 会议 我希望在更深入的测试之前运行更浅的端到端测试 有没有办法从 bazel 管理测试执行顺
  • 如何在bazel规则中获取WORKSPACE目录

    我命令使用 clang 工具 例如clang format clang tidy或生成一个编译数据库 like this 我需要知道 bzl 文件中的 WORKSPACE 目录 我怎样才能获得它 考虑以下示例 我只想打印工作区中所有 src
  • 如何在 bazel 中为 Python 和 pip 选择运行时?

    我正在尝试在 Ubuntu 20 04 上构建一个应用程序 其中 python3 指向 Python3 8 并且我正在构建 aganist Python3 6 我在 WORKSPACE 的同一目录中有以下运行时 cat BUILD baze
  • 如何指定我自己的工具链在“opt”compilation_mode 中使用的编译器标志?

    我有自己的 C C 工具链 并且需要使用一组固定的 gcc 优化标志 即没有 O1 2 3 我想指定这些优化标志由cc binary当我使用compilation mode opt 时 我怎样才能做到这一点 现在我正在 BUILD 文件中执
  • 从 Maven 标准目录映射到 Bazel 以获取测试资源

    我们有测试依赖文件src test resources根据Maven 标准目录布局 当测试类通过以下方式获取这些测试文件时 这些测试文件最终会出现在 JAR 和类路径中 Resources asCharSource Bazel 中依赖测试文
  • .bazelrc 中的用户名

    我想将其添加到我的 bazelrc 但是 whoami 不会像在壳里那样膨胀 startup output user root tmp bazel out whoami 它产生字面结果 tmp bazel out whoami faedb9
  • 无法在 Ubuntu 20.04 上安装 bazel - EXPKEYSIG 无效

    我正在按照以下说明进行操作https docs bazel build versions master install ubuntu html install with installer ubuntu https docs bazel b
  • 替代 bazel 中的“`--whole-archive`”

    我想在我的基于 bazel 的 C 项目之一中链接外部静态库 我需要 whole archive 用于链接库 如 gcc 或 g build 的选项 g main cc Wl whole archive lhttp Wl no whole
  • 构建规则中的 Bazel 环境变量

    我想参考 DirectX SDKBUILD文件 问题是 据我所知 Bazel 仅支持通过 action env DXSDK DIRBazel 的参数 它应该在动作中使用 必须在插件中定义 bzl file 有没有更简单的方法通过将环境变量用
  • 使用bazel构建简单库时包含路径问题

    演示结构如下 demo include func h src BUILD func cc WORKSPACE func h pragma once int square int func cc 从根目录开始包含 include demo i
  • bazel是否支持不同平台上的远程执行?

    具体来说 我想从 Mac 主机对 Windows 工作线程运行测试 评论在不同的机器上运行 bazel 远程执行器测试 https stackoverflow com questions 44354378 running bazel rem
  • 在 macOS 上的 CLion 中导入 Bazel 项目失败

    我在 CLion 上安装了 Bazel 插件 并尝试导入新的 Bazel C 项目 但我不断遇到这些错误 tensorflow gpu 1 8 0lft1 cp27 cp27mu linux x86 64 whl 在此平台上不受支持的轮子
  • 如何升级巴泽尔?

    我成功构建了 bazel 0 4 0 然后我尝试将其升级到最新版本巴泽尔 0 5 1 using compile sh compile bazel 0 4 0 output bazel exe 它给了我一个错误 巴泽尔 0 5 0 巴泽尔
  • Tensorflow 未显示“在本地成功打开某某 CUDA 库”

    我将 TensorFlow 配置为在 GPU GeForce 840M 上支持 CUDA 但程序运行速度相当慢slow与我之前使用的 CPU 相比 还有 我do not收到任何类型的消息某某CUDA库打开成功当我运行程序时 相反 这是我运行
  • 有没有办法限制 Bazel 使用的 CPU 核心数量?

    有没有办法告诉 Bazel 在构建时可以使用多少个 CPU 核心 TL DR 我在 VMware Workstation 上构建 TensorFlow 作为虚拟机 我可以调整虚拟机的处理器和内核数量 在构建 TensorFlow 的过程中
  • Tensorflow构建量化工具-bazel构建错误

    我正在尝试编译量化脚本 如下所述皮特 沃登的博客 https petewarden com 2016 05 03 how to quantize neural networks with tensorflow 但是 在运行以下 bazel
  • 让 Bazel 使用 Python3 运行(语法错误)

    我正在尝试使用 Bazel 运行此代码 https github com google in silico labeling https github com google in silico labeling 这是关联的 Bazel BU
  • 解决bazel中使用gRPC cpp时的依赖问题

    我正在尝试运行一个依赖 gRPC 的简单程序 我尝试了几个示例 但仍然出现以下错误 ERROR home git examples WORKSPACE 1 1 name git repository is not defined ERROR

随机推荐

  • 合并两个具有相同键的字典

    我有以下 2 本字典想要合并 我想合并相同的键 并且我想保留两个字典的值 我用了dict1 update dict2 但这替换了第二个到第一个字典中的值 u dict1 160 u na u na 162 u test u qq u wds
  • Kitkat (API 19) 中使用 setGroup() 的堆栈通知不起作用

    我有一个问题找不到答案 我已经尝试过 AndroidDeveloper 教程 我已经在 stackoverflow 和 google 上进行了搜索 但要么我的搜索技能太棒了 要么没有答案 我认为可以回答我的问题 当有多条消息时 我想将所有新
  • 当计时器触发作业时,如何在 Jenkins 中获取 BUILD_USER?

    我想在工作后电子邮件中向触发 Jenkins 工作的用户显示 这可以通过使用插件来实现构建用户变量插件和环境变量BUILD USER 但是当调度程序触发作业时 该变量不会被初始化 我们怎样才能做到这一点 我知道我们有一个名为 EnvInje
  • 如何使用opengl函数在c中制作用于绘制3D点的3D窗口?

    我可以制作 2D 窗口并绘制点 线等 我想制作 3D 窗口 以便可以通过绘制 3D 点 线来绘制 3D 对象 例如 glVertex3d x y z 如 2D glVertex2d x y 但我无法制作 3D 窗口 我只想制作一个 3D 窗
  • String.indexOf 函数出现意外结果?

    我真的对这个感到抓狂 情况是这样的 我有两个 JavaScript 字符串 如下所示 dsName Test 1 replacementString Test 我正在尝试查看 dsName 是否以 replacementString 开头
  • 防止在线棋牌游戏作弊? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在许多在线国际象棋大厅中 我见过 引擎 的实例 其中作弊者会在主游戏窗口的同时打开国际象棋程序 然后他会进行设置 以便将对手的动作传送
  • 使用正则表达式的 jQuery 验证插件自定义方法

    我需要为 jQuery Validator 创建一个新方法 但不知道从哪里开始 我希望它检查输入的电子邮件是否包括 specifieddomain com 但这也是输入的最后一部分 例如 specificdomain comChris 就不
  • ISO 8601 格式的当前时间

    出于记录目的 R 脚本如何获取 UTC 时区中的当前日期和时间 作为以下格式的 ISO 8601 字符串 2015 12 31T14 26 56 600374 00 00 as POSIXlt似乎是解决方案 并且文档声称它接受格式参数 但我
  • 访问 SQL 创建一对多关系,无需强制引用完整性

    我有这个关系 我必须暂时销毁它才能使用 SQL 命令更改 salID 字段的大小 ALTER TABLE Adressen DROP CONSTRAINT ChildTableMainTable 如何使用 SQL 命令重新创建相同的关系类型
  • 如何快速验证区分大小写的文件名是否确实存在

    我必须制作一个与unix兼容的windows delphi例程 以确认文件系统中是否存在文件名与想要的完全相同的情况 例如 John txt 在那里 而不是 john txt 如果我检查 FileExists john txt 由于 win
  • 在连接之间共享事务

    我有一个 FileShare 爬虫 获取权限并将其放在某处以供以后审核 目前 它正在启动多个线程来抓取同一文件夹 以加快进程 在 C 中 每个SqlConnection对象有自己的SqlTransaction 由SqlConnection
  • Inno Setup - 检查目标中是否存在文件,否则不会中止安装

    我需要我的安装程序检查目标位置中是否存在文件 如果不存在 则安装将中止 我的项目是一个更新补丁 因此我希望安装程序在应用程序的主 exe 不在目标中时避免安装更新文件 我怎样才能做到这一点 有人可以给出一个通过 Windows 注册表检查文
  • Spring JdbcTemplate批量更新处理异常

    目前我们的代码使用JdbcTemplate的batchUpdate方法来进行批量插入 我的问题是 如果其中一个更新出现任何异常 如何处理它 假设仅通过添加日志 并继续下一个更新 sql 语句 另外 JdbcTemplate 的 batchU
  • 多租户隔离数据库上的 DAL 和配置最佳实践

    我的公司拥有十几个网站和独立的数据库 相同的模式 每个客户都有自己的网站 不同的应用程序池 和数据库 每个网站都有自己的配置 多个连接字符串 但它们都有相同的配置架构 cust1 domain com cust2 domain com cu
  • Flutter NSException:配置失败。可能是GoogleService-Info.plist中的GOOGLE_APP_ID无效或自定义选项中设置的无效造成的

    GoogleService Info plist文件是通过添加的将文件添加到 Runner 选项 所以 它位于 Runner 目录中 我已经检查了很多堆栈溢出答案 但无法找出问题所在 我还重新检查 GoogleService Info pl
  • 重叠标签ggmap

    我有谷歌地图和带有文本标签的坐标列表 当我预览时 标签重叠 因此变得不可读 library ggmap WPmap lt qmap c lon 4 80324 lat 52 40738 zoom 12 source google 表kaar
  • Java:乘以通用数字而不改变其类型

    Java中有没有办法实现这个方法 public static
  • Android Studio 1.5.1 中的 Lint 不适用于缺失权限检测

    目前 我正在将我的应用程序迁移到目标 API 23 我花了一段时间才弄清楚原因accountManager getAccountsByType com google 不再工作了 这是由于新的 Marshmallow 权限模型 http de
  • 哪些编程语言功能非常适合开发实时编码框架?

    我想建立一个 实时编码框架 我应该解释一下 实时编码框架 的含义 我将通过比较实时编码与传统编码来做到这一点 一般来说 在传统编程中 您编写代码 有时编译它 然后启动可执行文件或在某种解释器中打开脚本 如果您想修改您的申请 则必须重复此过程
  • 我如何告诉 Bazel Python.h 所在的位置?

    我正在构建一个 C 可执行文件 需要从用户的 Python 安装中 include Python h 为了在 Bazel 中表达 Python h 及其包含的各种头文件 我需要知道 Python 包含目录在哪里 这个位置在 Windows