我如何告诉 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 所在的位置? 的相关文章

随机推荐

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

    我有以下 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