解決しようとしている問題を説明してください
zmq
とzmq-sys
を使用するプロジェクトを作成していますが、これらはarm-unknown-linux-gnueabi
用にクロスコンパイルする必要があります。
zmq-sys
はそれ自体ではlibzmqをコンパイルしませんが、 LIBZMQ_LIB_DIR
とLIBZMQ_INCLUDE_DIR
を使用して、libを指定し、ディレクトリを含めることができます。 ただしzmq
のbuild.rsにはzmq-sys
が必要です。つまり、 x86_64-unknown-linux-gnu
ターゲットにもコンパイル済みのバイナリが必要です。 したがって、 LIBZMQ_LIB_DIR
が間違ったディレクトリを指しているため、 zmq-sys
の環境変数を使用することはできません。
次の回避策を実行しました。
[target.arm-unknown-linux-gnueabi]
linker = "arm-none-linux-gnueabi-gcc"
[target.arm-unknown-linux-gnueabi.zmq]
rustc-link-search = ["native=/home/user/zmq-example/vendor/libzmq/lib/arm"]
rustc-link-lib = ["static=zmq", "dylib=stdc++"]
[target.x86_64-unknown-linux-gnu.zmq]
rustc-link-search = ["native=/home/user/zmq-example/vendor/libzmq/lib/x86_64"]
rustc-link-lib = ["static=zmq", "dylib=stdc++"]
上記の回避策の問題は、すべての開発者がコンパイルされたバイナリへの同じ絶対パスを持っている必要があることです。
希望するソリューションを説明してください
rustc-link-search
で相対パスを定義する方法が欲しいのですが。
別の解決策は、ターゲットごとに環境変数を定義する方法である可能性があります。
相対パスのリクエストについて少し混乱しています。 パスは、パッケージルートからの相対パスをサポートする必要があります。 それはあなたのために働いていませんか?
正解です。言い換えると、 zmq-sys
パッケージのルート( /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/zmq-sys-0.9.0
$)ではなく、プロジェクトのルート( /home/user/zmq-example
)に相対的なパスを提供する方法はありますか。
他の開発者を制限するため、プロジェクトのルートの絶対パスを.cargo/config
に含めたくありません。
したがって、この問題の回避策があります。 私はDBusをクロスコンパイルしていて、あなたと同じ問題を抱えています。Cargoがパッケージを抽出した場所ではなく、リポジトリのルートを基準にして、リポジトリ内のどこかにrustc-link-search
を指定する必要があります。
つまり、 build.rs
ビルドスクリプトを使用してrustc-link-search
を設定する必要があります。
これは私の貨物config
ファイルです:
[build]
target = "armv7-unknown-linux-gnueabihf"
[target.armv7-unknown-linux-gnueabihf.dbus]
rustc-link-search = [
# Provided by the build script.
]
rustc-link-lib = [
"dbus-1",
"gcrypt",
"gpg-error",
"lz4",
"lzma",
"pcre",
"selinux",
"systemd",
]
そして、これは私のbuild.rs
ビルドスクリプトです。
use std::env::var;
fn main() {
let manifest_dir = var("CARGO_MANIFEST_DIR").unwrap();
println!("cargo:rustc-link-search={}/libraries/lib/arm-linux-gnueabihf", manifest_dir);
println!("cargo:rustc-link-search={}/libraries/usr/lib/arm-linux-gnueabihf", manifest_dir);
}
CARGO_MANIFEST_DIR
環境変数は、ビルドスクリプトを含むクレートを指し、外部ライブラリをそこのlibraries
フォルダーに配置しました。 これを行った後、ビルドは再び機能し、ハードコーディングされた絶対パスはなくなります。
さらに、あなたの場合、 TARGET
環境変数を読み取り、それに応じてパスを設定する必要があります。
最も参考になるコメント
したがって、この問題の回避策があります。 私はDBusをクロスコンパイルしていて、あなたと同じ問題を抱えています。Cargoがパッケージを抽出した場所ではなく、リポジトリのルートを基準にして、リポジトリ内のどこかに
rustc-link-search
を指定する必要があります。つまり、
build.rs
ビルドスクリプトを使用してrustc-link-search
を設定する必要があります。これは私の貨物
config
ファイルです:そして、これは私の
build.rs
ビルドスクリプトです。CARGO_MANIFEST_DIR
環境変数は、ビルドスクリプトを含むクレートを指し、外部ライブラリをそこのlibraries
フォルダーに配置しました。 これを行った後、ビルドは再び機能し、ハードコーディングされた絶対パスはなくなります。さらに、あなたの場合、
TARGET
環境変数を読み取り、それに応じてパスを設定する必要があります。