Cargo: La variable d'environnement `TARGET` ne pointe pas vers le fichier lorsqu'un fichier JSON cible est utilisé

Créé le 24 août 2020  ·  3Commentaires  ·  Source: rust-lang/cargo

Pas

  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

    Le nom de fichier JSON doit correspondre à la cible pour éviter certains cas étranges dans le compilateur. Cela devrait également se produire sur d'autres plates-formes.

  3. Créer 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

    Le build-std n'est pas vraiment important pour ce problème, il n'est utilisé que pour prendre en charge la spécification cible non standard.

Vous verrez que la variable TARGET n'a plus le chemin et l'extension .json dans la sortie:

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

Cela a causé un problème dans le référentiel rust-lang / rust pendant que j'essayais de porter vers aarch64-apple-darwin en utilisant un fichier cible JSON. Plus précisément, indexmap utilise autocfg qui utilise TARGET pour construire des choses.

Cela échouait car ma cible n'existait pas encore dans le compilateur, donc autocfg a décidé que c'était la mauvaise version de rustc .

Solutions possibles)

Il semble qu'il devrait inclure le chemin complet du fichier JSON dans la variable d'environnement, mais je ne suis pas sûr de l'impact d'un tel changement.

Remarques

% 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

Tous les 3 commentaires

Je pense que c'était un changement causé par # 7425, qui était peut-être involontaire (ou du moins inaperçu par moi à l'époque). Je ne sais pas si @alexcrichton a choisi intentionnellement short_name ici , ou s'il doit être changé en rustc_target .

Étant donné que les spécifications JSON sont un peu instables, et c'est ainsi que TARGET se comportait avant la 1.40, je pense qu'il y a une marge de manœuvre pour le changer.

Puisque le nom court peut être déduit du chemin ( file_stem ), alors je pense que passer le chemin complet est probablement la meilleure option. Si quelque chose a besoin du nom court pour une raison quelconque (je ne peux pas immédiatement penser à aucun), alors il peut être déduit du chemin.

Le chemin a-t-il besoin d'une canonisation? Par exemple, le répertoire de travail de autocfg partir d'un script de construction ne correspond pas nécessairement à l'invocation de la cargaison, n'est-ce pas? Je ne sais pas, peut-être que cet aspect est déjà couvert dans la façon dont il est normalement transmis à rustc.

Le chemin est ici canonisé. Je pense que le chemin canonisé est le bon choix (sauf que canonicalize ne fonctionne pas toujours, mais c'est un problème distinct).

Cette page vous a été utile?
0 / 5 - 0 notes