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

时间:2018-02-24 21:03:37

标签: rust cross-compiling rust-cargo

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

ARCH {{3}}不变,但不是完整三联。例如,它没有区分软浮动和硬浮动ARM ABI。

env!("TARGET")是理想的,但它仅适用于构建脚本,而不是lib / bin目标。我可以使用build.rs和动态源代码生成(将值写入.rs中的OUT_DIR文件)传递给lib,但是看起来只是为了得到一个无论如何编译器必须知道的字符串。

是否有更简单的方法来获取使用Cargo构建的lib / bin目标中的当前目标三元组?

2 个答案:

答案 0 :(得分:2)

除了通过构建脚本之外,我认为这不是暴露的。如果没有“动态源代码生成”,那么在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);
}

答案 1 :(得分:1)

构建脚本将一些additional output打印到文件中,因此您不能确定构建脚本仅将 Sub ReRunMacro() Dim xMin As String Dim lastRow As Long, i As Long Dim ws As Worksheet Dim validSheets() As Variant Set ws = ActiveSheet validSheets = Array("CNC Machining Cell 2", "CNC Grinding Cell", "CNC Turning Cell 1 & 3", "CNC Turning Cell 2") If UBound(Filter(validSheets, ws.Name)) = -1 Then Exit Sub End If lastRow = Range("A" & Rows.Count).End(xlUp).Row Do For i = 1 To 14 Step 2 Cells(i, 1).Select ActiveWindow.SmallScroll down:=1 Application.Wait (Now + TimeValue("0:00:02")) If i = lastRow - 2 Or i = lastRow - 1 Then i = 0 Cells(1, 1).Select End If Next i Range("A1").Activate Loop End Sub 的输出打印出来。

相反,请在build.rs中尝试以下方法:

$TARGET

这将在构建脚本中获取fn main() { println!( "cargo:rustc-env=TARGET={}", std::env::var("TARGET").unwrap() ); } 环境变量的值并进行设置,以便在程序启动时可以访问它。

在我的main.rs中:

$TARGET

现在,我可以在程序中访问目标三元组了。如果您使用的是这种技术,则只会读取const TARGET: &str = env!("TARGET"); 环境变量的值,而不会读取其他任何内容。