خطوات
cargo new repro && cd repro
rustc +nightly -Z unstable-options --print target-spec-json --target x86_64-apple-darwin > x86_64-apple-darwin.json
يجب أن يتطابق اسم ملف JSON مع الهدف لتجنب بعض الحالات الغريبة في المترجم. يجب أن يحدث هذا على منصات أخرى أيضًا.
أنشئ build.rs
fn main() {
dbg!(std::env::var("TARGET"));
}
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)
أعتقد أن هذا كان تغييرًا بسبب # 7425 ، ربما كان ذلك غير مقصود (أو على الأقل لم ألاحظه في ذلك الوقت). لست متأكدًا مما إذا كان alexcrichton اختار عمدًا short_name
هنا ، أم أنه يجب تغييره إلى rustc_target
.
بالنظر إلى أن مواصفات JSON غير مستقرة نوعًا ما ، وهذه هي الطريقة التي كان يتصرف بها TARGET قبل 1.40 ، أعتقد أن هناك مجالًا للمناورة لتغييرها.
نظرًا لأنه يمكن الاستدلال على الاسم المختصر من المسار ( file_stem
) ، فأنا أعتقد أن اجتياز المسار الكامل هو الخيار الأفضل على الأرجح. إذا كان هناك شيء يحتاج إلى الاسم المختصر لأي سبب من الأسباب (لا يمكنني التفكير في أي شيء على الفور) ، فيمكن استنتاجه من المسار.
هل يحتاج المسار إلى تحديد العنوان المتعارف عليه؟ على سبيل المثال ، لا يتطابق دليل عمل autocfg
من برنامج نصي بالضرورة مع استدعاء البضائع ، أليس كذلك؟ لا أعرف ، ربما تمت تغطية هذا الجانب بالفعل في كيفية انتقاله عادةً إلى الصدأ.
المسار قانوني هنا . أعتقد أن المسار المتعارف عليه هو الخيار الصحيح (باستثناء أن canonicalize
لا يعمل دائمًا ، لكن هذه مشكلة منفصلة).