Cargo: لا يشير متغير البيئة `TARGET` إلى الملف عند استخدام ملف JSON هدف

تم إنشاؤها على ٢٤ أغسطس ٢٠٢٠  ·  3تعليقات  ·  مصدر: rust-lang/cargo

خطوات

  1. cargo new repro && cd repro

  2. rustc +nightly -Z unstable-options --print target-spec-json --target x86_64-apple-darwin > x86_64-apple-darwin.json

    يجب أن يتطابق اسم ملف JSON مع الهدف لتجنب بعض الحالات الغريبة في المترجم. يجب أن يحدث هذا على منصات أخرى أيضًا.

  3. أنشئ build.rs

    fn main() {
        dbg!(std::env::var("TARGET"));
    }
    
  4. cargo +nightly build --target $PWD/x86_64-apple-darwin.json -Z build-std --verbose --verbose --verbose

    build-std ليس مهمًا حقًا لهذه المشكلة ، إنه يُستخدم فقط لدعم مواصفات الهدف غير القياسية.

سترى أن المتغير TARGET لم يعد يحتوي على المسار وامتداد .json في المخرجات:

[repro 0.1.0] [build.rs:2] std::env::var("TARGET") = Ok(
[repro 0.1.0]     "x86_64-apple-darwin",
[repro 0.1.0] )

تسبب هذا في مشكلة في مستودع rust-lang / rust بينما كنت أحاول النقل إلى aarch64-apple-darwin باستخدام ملف هدف JSON. على وجه التحديد، indexmap الاستخدامات autocfg الذي يستخدم TARGET للأشياء البناء.

كان هذا فشلًا لأن هدفي لم يكن موجودًا بعد في المترجم ، لذلك قرر autocfg أنه الإصدار الخاطئ من rustc .

الحلول الممكنة)

يبدو أنه يجب أن يتضمن المسار الكامل لملف JSON في متغير البيئة ، لكنني لست متأكدًا من تأثير هذا التغيير.

ملاحظات

% cargo +nightly version
cargo 1.47.0-nightly (51b66125b 2020-08-19)
% rustc +nightly --version
rustc 1.47.0-nightly (5180f3da5 2020-08-23)
A-build-scripts A-environment-variables A-target-spec C-bug

ال 3 كومينتر

أعتقد أن هذا كان تغييرًا بسبب # 7425 ، ربما كان ذلك غير مقصود (أو على الأقل لم ألاحظه في ذلك الوقت). لست متأكدًا مما إذا كان alexcrichton اختار عمدًا short_name هنا ، أم أنه يجب تغييره إلى rustc_target .

بالنظر إلى أن مواصفات JSON غير مستقرة نوعًا ما ، وهذه هي الطريقة التي كان يتصرف بها TARGET قبل 1.40 ، أعتقد أن هناك مجالًا للمناورة لتغييرها.

نظرًا لأنه يمكن الاستدلال على الاسم المختصر من المسار ( file_stem ) ، فأنا أعتقد أن اجتياز المسار الكامل هو الخيار الأفضل على الأرجح. إذا كان هناك شيء يحتاج إلى الاسم المختصر لأي سبب من الأسباب (لا يمكنني التفكير في أي شيء على الفور) ، فيمكن استنتاجه من المسار.

هل يحتاج المسار إلى تحديد العنوان المتعارف عليه؟ على سبيل المثال ، لا يتطابق دليل عمل autocfg من برنامج نصي بالضرورة مع استدعاء البضائع ، أليس كذلك؟ لا أعرف ، ربما تمت تغطية هذا الجانب بالفعل في كيفية انتقاله عادةً إلى الصدأ.

المسار قانوني هنا . أعتقد أن المسار المتعارف عليه هو الخيار الصحيح (باستثناء أن canonicalize لا يعمل دائمًا ، لكن هذه مشكلة منفصلة).

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