2017-08-02 8 views
2

私は、ユーザーのPythonインストールから#include "Python.h"を必要とするC++実行可能ファイルをビルドしています。Python.hがどこにあるのかBazelに伝えるにはどうすればいいですか?

Python.h(およびそれに含まれるさまざまなヘッダファイル)をBazelで表現するには、Pythonのインクルードディレクトリの場所を知る必要があります。この場所はWindowsとLinuxでは異なりますが、Bazelの単一の設定で両方を構築したいと思います。

WORKSPACEルートの外に存在するソフトウェアを参照するには、Bazelのベストプラクティスは何ですか?

答えて

3

外部依存関係について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ディレクトリにチェックインされているので、よくあることです。

関連する問題