2017-09-10 9 views
3

nanomsgを使用するTensorFlowのプライベートフォークの上にモジュールを作成しました。Bazelプロジェクト内でCMakeライブラリを構築する

私のローカル開発サーバーでは、cmake installを使ってnanomsg(/usr/local)をインストールし、インストールされた場所からヘッダーファイルにアクセスしました。プロジェクトはローカルで正常に動作します。

しかし、今では、TensorFlowワークスペース内にnanomsgをパッケージ化する必要があります。私は、次の2つのアプローチを試みたが、満足どちらも見つけました:

OpenCVのための this answerと同様に
  1. 、私は(tensorflow/workspace.bzl以内)私のワークスペースの中でそれをロードし、プライベートリポジトリにnanomsgをプリコンパイルし、その後含まhttp_archive directiveを使用してヘッダーとライブラリを作成します。これは正常に動作しますが、ポータブルな解決策ではありません。

  2. さらに移植性の高いソリューションとして、cmakeコマンドの特定のシーケンスを実行してnanomsgを構築するためのgenruleコマンドを作成しました。この方法はまれですが、他のプロジェクトのcmakeにはgenruleを再利用することはできません。 (私はthis discussionを参照しました)。

明らかにcmakeは、Bazelビルドの第一級市民としてサポートされていません。あなた自身のプロジェクトでこの問題に直面した人は、cmakeを使ってビルドされたBazelプロジェクト内にライブラリを含めるための一般的な移植可能な方法を作りましたか?もしそうなら、どうやってそれにアプローチしましたか?

+0

あなたはどのように移植したいですか? Linux、MacOS、Windows? 2では、他のプロジェクトに同じジェネラルを使用できないのはなぜですか?私はBazelを研究していますが、これまでのところ、一般的な解決策を思いついた人は誰も聞いていません。 –

答えて

5

Ulfが書いたように、あなたの推奨するオプション2はうまくいくはずです。

「cmakeが失敗したかどうかを確認できますか」については、はい:失敗した場合、cmakeはエラー終了コード(!= 0)とともに返されます。これにより、Bazelはgenruleのアクションを自動的に失敗として認識し、ビルドに失敗します。コマンドを実行する前にBazelが "set -e -o pipefail"を設定しているため(cf:https://docs.bazel.build/versions/master/be/general.html#genrule-environment)、複数のcmakeコマンドをgenrule "cmd"にチェーンしても機能します。

実際にcmakeコマンドを実行する "cmd"属性のシェルスクリプトを呼び出す場合は、スクリプトの最初の行に "set -e -o pipefail"を必ず入れてください。それ以外の場合は、cmakeが失敗してもスクリプトは失敗しません。

あなたが「cmakeが失敗したかどうか確認できますか」という質問を誤解した場合は、教えてください。 :)

関連する問題