我正在构建一个C++可执行文件,需要从用户的Python安装中#include"Python.h".
要在Bazel中表达Python.h(以及它包含的各种头文件),我需要知道Python包含目录的位置.这个位置在Windows和Linux上会有所不同,我想要一个Bazel配置来构建它们.
用于引用WORKSPACE根目录之外的软件的最佳Bazel实践是什么?
小智 5
因此,要告诉Bazel有关外部依赖关系的信息,您需要使用其中一个工作区规则来指定外部依赖关系的位置,以及BUILDBazel用于该外部依赖关系的文件.
要让某些东西跨平台工作,您需要使用select()函数让Bazel为您的主机操作系统选择适当的库.
这是实现它的一个方面:
首先,我们WORKSPACE在项目的根目录中有文件,它定义了两个库以及BUILD用于它们的文件.在这里我只是使用,build_file_content但如果它变得太复杂,你可以把它放在它自己的文件中,然后引用它.BUILD这里的文件公开了Python附带的prebuild库以及所需的头文件.它还为依赖于这些库的任何目标添加了一个包含路径,以便您可以执行此操作#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"]
)
"""
)
Run Code Online (Sandbox Code Playgroud)
接下来是BUILD您的应用程序的文件.在这里,您需要定义一些config_settings.这允许我们为构建定义平台相关设置.我们使用cpu值来确定主机操作系统.
在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"
]
})
)
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
另一种方式(也许更简单)是将python标头和库检入存储库.您仍然需要使用select()选择要链接的正确库,但至少您不需要在WORKSPACE文件中添加任何内容,只需依赖BUILD存储库中的其他文件即可.如果您查看Bazel repo,他们会在third_party目录中检查许多外部依赖项,因此这是一种常见做法.
| 归档时间: |
|
| 查看次数: |
988 次 |
| 最近记录: |