Cargo: أضف طريقة لتعريف المسارات النسبية في البحث عن رابط rustc

تم إنشاؤها على ٧ مارس ٢٠١٩  ·  3تعليقات  ·  مصدر: rust-lang/cargo

صِف المشكلة التي تحاول حلها

أنا أكتب مشروعًا يستخدم 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 .

حل آخر يمكن أن يكون وسيلة لتحديد متغيرات البيئة لكل هدف.

C-feature-request

التعليق الأكثر فائدة

لذلك لدي حل بديل لهذه المشكلة. أنا أعمل على تجميع 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 وتعيين المسارات وفقًا له.

ال 3 كومينتر

أنا مرتبك قليلاً بشأن طلب المسارات النسبية. يجب أن تدعم المسارات كونها ذات صلة بجذر الحزمة. هل هذا لا يعمل من أجلك؟

أنت على صواب ، لذا دعني أعيد الصياغة: هل هناك طريقة لتوفير المسارات المتعلقة بجذر مشروعي ( /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 وتعيين المسارات وفقًا له.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات