代码之家  ›  专栏  ›  技术社区  ›  Kornel

如何在不使用构建脚本的情况下将可执行文件的完整目标三元组作为编译时常量?

  •  8
  • Kornel  · 技术社区  · 6 年前

    我正在编写一个Cargo-helper命令,该命令需要知道Rust/Cargo使用的默认目标三元组(我假定它与主机的目标三元组相同)。理想情况下,它应该是编译时常量。

    ARCH 常数,但它不是一个完整的三元组。例如,它不区分软浮子和硬浮子臂ABI。

    env!("TARGET") 这很理想,但它只为构建脚本而不是lib/bin目标设置。我可以通过 build.rs 和动态源代码生成(将值写入 .rs 文件位于 OUT_DIR ),但仅仅获得编译器必须知道的一个字符串似乎是一项艰巨的任务。

    有没有一种更直接的方法可以让当前的目标在lib/bin中实现三重目标?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Shepmaster Lukas Kalbertodt    6 年前

    生成脚本打印一些 additional output 无法确保生成脚本只打印 $TARGET .

    相反,在构建中尝试类似的内容。卢比:

    fn main() {
        println!(
            "cargo:rustc-env=TARGET={}",
            std::env::var("TARGET").unwrap()
        );
    }
    

    这将获取 $目标 并将其设置为在程序启动时可以访问。

    在我看来。卢比:

    const TARGET: &str = env!("TARGET");
    

    现在我可以访问程序中的目标三元组。如果使用此技术,则只能读取 TARGET 环境变量而不是其他变量。

        2
  •  2
  •   dtolnay    6 年前

    我认为这不是通过构建脚本公开的。在没有“动态源代码生成”的情况下获得目标三元组的一种简洁方法是 build.rs :

    fn main() {
        print!("{}", std::env::var("TARGET").unwrap());
    }
    

    并且在 src/main.rs :

    const TARGET: &str = include_str!(concat!(env!("OUT_DIR"), "/../output"));
    
    fn main() {
        println!("target = {:?}", TARGET);
    }
    
        3
  •  0
  •   mdmundo    3 年前

    如果您只想知道安装了哪个目标,请运行: rustup target list --installed