外部依存関係についてBazelに伝えるには、Workspace Rulesのいずれかを使用して外部依存関係の場所を指定する必要があります。BUILD
ファイルはBazelがその外部依存関係で使用するために必要です。
クロスプラットフォームで作業するには、select()関数を使用して、Bazelにホストオペレーティングシステム用の適切なライブラリを選択させる必要があります。
は、ここでそれを達成するために刺します:
まず、我々は彼らのために使用する2つのライブラリとBUILD
ファイルを定義して、プロジェクトのルートでWORKSPACE
ファイルを持っています。ここで私はちょうど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
ファイルを行うことができますので、それはまた、これらのライブラリに依存するすべてのターゲットのためのインクルードパスを追加します。ここでは、config_settingsを定義する必要があります。これにより、ビルドにプラットフォーム依存の設定を定義することができます。 cpu値を使用してホストOSを決定します。
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"
]
})
)
ここでは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
ファイルに依存することができます。 Bazel repoを見ると、多くの外部依存関係がthird_party
ディレクトリにチェックインされているので、よくあることです。