2016-07-17 11 views
1

C++ライブラリcryptominisatのRustバインディングを作成しようとしています。実際のコードは動作しますが、カーゴを適切にパッケージ化する方法がわかりません。Cargoでプロジェクトディレクトリの外部からソースコードをパッケージ化するには?

gitリポジトリが

src/ 
    c++ code here 
.gitignore 
readme, etc. 

のように見える私はrustディレクトリを追加し、そう

rust/ 
    cryptominisat/ 
     Cargo.toml 
     build.rs 
      src/ 
       rust code here 
src/ 
    c++ code here 
.gitignore 
readme, etc. 

残念ながら、cargo packageをパッケージ化するとは思われないように、その中に私の貨物プロジェクトを作成しましたrust/cryptominisatディレクトリの外側にあるものは、ライブラリを実際にビルドするために必要なC++コードは含まれていません。私に何ができる?私は避けることができれば、リポジトリ全体をrustディレクトリに移動したくないのです。上流にマージすることができなくなるからです。

+1

シンボリックリンクはどうですか?または、Rustバインディングを別のプロジェクトに配置し、gitサブモジュールを使用してC++コードを参照することもできます。 – Shepmaster

+0

自分自身でリモートリポジトリを管理しやすくする 'git submodule'と' git subtee'ツールがあります。それがあなたにとって役に立つ方向であるかどうかを私は詳しく説明することができます。 –

+0

rust-lua53プロジェクトは別のアプローチをとり、ビルド時に 'build.rs'からLuaソースをダウンロードします。 –

答えて

2

それは一般的に解決の道:

  • (例えばrust/cryptominisat/vendor/中)錆レポの内側にC++レポのコピーを埋め込むためにgitのサブモジュール(または公開する前に実行するスクリプト)を使用してください。開発時には、代わりにシンボリックリンクを使用してC++コードの2つのコピーを避けることができます。

  • build.rsを使用すると、ビルド時にtarball/clone/rsyncコードをダウンロードできます。 Cargoで指定されたenv varにOUT_DIR env varにダンプして、ユーザーが参照可能なディレクトリを汚染しないようにすることができます。

  • C++コードをシステムレベルのライブラリにします。 Rustパッケージはビルドされませんが、既にインストールされていることを期待し、それを検索してリンクフラグを指定するだけです。それはほとんどの*-sys箱が働く方法です。