因此,要告诉 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
目录,所以这是一种常见的做法。