首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎么告诉Bazel Python.h住在哪里?

问我怎么告诉Bazel Python.h住在哪里?
EN

Stack Overflow用户
提问于 2017-08-03 05:15:08
回答 1查看 1.8K关注 0票数 5

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

要在Bazel中表示Python.h (以及它包含的各种头文件),我需要知道Python include目录的位置。这个位置在Windows和Linux上是不同的,我想要一个单一的Bazel配置来构建它们。

引用工作空间根目录之外的软件的最佳Bazel实践是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-03 20:17:15

因此,要告诉Bazel有关外部依赖项的信息,您需要使用一个Workspace Rules来指定外部依赖项的位置,以及让Bazel与该外部依赖项一起使用的BUILD文件。

要让某些东西跨平台工作,您需要使用select()函数让Bazel为您的主机操作系统选择合适的库。

下面是实现它的一次尝试:

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

代码语言:javascript
复制
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文件。在这里,您需要定义一些config_settings。这允许我们为我们的构建定义与平台相关的设置。我们使用cpu值来确定主机操作系统。

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

代码语言:javascript
复制
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,用来让它工作。

代码语言:javascript
复制
#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文件即可。如果您查看一下Bazel repo,就会发现它们将许多外部依赖项签入到third_party目录中,因此这是一种常见的做法。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45471120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档