صِف المشكلة التي تحاول حلها
أنا أكتب مشروعًا يستخدم zmq
و zmq-sys
والذي يجب أن يتم تجميعه بشكل متقاطع مقابل arm-unknown-linux-gnueabi
.
لا يقوم zmq-sys
بتجميع libzmq من تلقاء نفسه ولكن يمكننا تحديد lib وتضمين الأدلة باستخدام LIBZMQ_LIB_DIR
و LIBZMQ_INCLUDE_DIR
. ومع ذلك ، تتطلب أجهزة إنشاءات $ # $ zmq
zmq-sys
، مما يعني أنني بحاجة أيضًا إلى ثنائي مجمع لهدف x86_64-unknown-linux-gnu
أيضًا. لذلك لا يمكنني فقط استخدام متغيرات البيئة البالغة zmq-sys
لأن LIBZMQ_LIB_DIR
سيشير إلى دليل خاطئ.
لقد أجريت الحل البديل التالي:
[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
.
حل آخر يمكن أن يكون وسيلة لتحديد متغيرات البيئة لكل هدف.
أنا مرتبك قليلاً بشأن طلب المسارات النسبية. يجب أن تدعم المسارات كونها ذات صلة بجذر الحزمة. هل هذا لا يعمل من أجلك؟
أنت على صواب ، لذا دعني أعيد الصياغة: هل هناك طريقة لتوفير المسارات المتعلقة بجذر مشروعي ( /home/user/zmq-example
) بدلاً من جذر الحزمة zmq-sys
( /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/zmq-sys-0.9.0
).
لا أريد أن يكون لدي مسارات مطلقة لجذر مشروعي في .cargo/config
لأنه يقيد المطورين الآخرين.
لذلك لدي حل بديل لهذه المشكلة. أنا أعمل على تجميع DBus ولدي نفس المشكلة التي تواجهها: يجب أن أشير rustc-link-search
إلى مكان ما داخل المستودع الخاص بي ، بالنسبة إلى جذر المستودع ، وليس بالنسبة إلى المكان الذي استخرجت فيه Cargo الحزمة.
باختصار ، يجب عليك استخدام برنامج نصي لإنشاء 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 ولدي نفس المشكلة التي تواجهها: يجب أن أشير
rustc-link-search
إلى مكان ما داخل المستودع الخاص بي ، بالنسبة إلى جذر المستودع ، وليس بالنسبة إلى المكان الذي استخرجت فيه Cargo الحزمة.باختصار ، يجب عليك استخدام برنامج نصي لإنشاء
build.rs
لتعيينrustc-link-search
.هذا هو ملف الشحن الخاص بي
config
:وهذا نصي
build.rs
بناء:يشير متغير البيئة
CARGO_MANIFEST_DIR
إلى الصندوق الذي يحتوي على البرنامج النصي للبناء ، وقد وضعت المكتبات الخارجية في مجلدlibraries
هناك. بعد القيام بذلك ، يعمل الإصدار مرة أخرى ، لا مزيد من المسارات المطلقة المشفرة.علاوة على ذلك ، في حالتك ، سيتعين عليك أيضًا قراءة متغير البيئة
TARGET
وتعيين المسارات وفقًا له.