|
|
@@ -1,5 +1,8 @@
|
|
|
use std::{
|
|
|
- env, fs,
|
|
|
+ borrow::Cow,
|
|
|
+ env,
|
|
|
+ ffi::OsString,
|
|
|
+ fs,
|
|
|
io::{BufRead as _, BufReader},
|
|
|
path::PathBuf,
|
|
|
process::{Child, Command, Stdio},
|
|
|
@@ -13,6 +16,19 @@ pub struct Package<'a> {
|
|
|
pub root_dir: &'a str,
|
|
|
}
|
|
|
|
|
|
+fn target_arch() -> Cow<'static, str> {
|
|
|
+ const TARGET_ARCH: &str = "CARGO_CFG_TARGET_ARCH";
|
|
|
+ let target_arch = env::var_os(TARGET_ARCH).unwrap_or_else(|| panic!("{TARGET_ARCH} not set"));
|
|
|
+ let target_arch = target_arch.into_encoded_bytes();
|
|
|
+ let target_arch = String::from_utf8(target_arch)
|
|
|
+ .unwrap_or_else(|err| panic!("String::from_utf8({TARGET_ARCH}): {err:?}"));
|
|
|
+ if target_arch.starts_with("riscv64") {
|
|
|
+ "riscv64".into()
|
|
|
+ } else {
|
|
|
+ target_arch.into()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/// Build binary artifacts produced by `packages`.
|
|
|
///
|
|
|
/// This would be better expressed as one or more [artifact-dependencies][bindeps] but issues such
|
|
|
@@ -42,9 +58,7 @@ pub fn build_ebpf<'a>(
|
|
|
return Err(anyhow!("unsupported endian={endian:?}"));
|
|
|
};
|
|
|
|
|
|
- let arch =
|
|
|
- env::var_os("CARGO_CFG_TARGET_ARCH").ok_or(anyhow!("CARGO_CFG_TARGET_ARCH not set"))?;
|
|
|
-
|
|
|
+ let arch = target_arch();
|
|
|
let target = format!("{target}-unknown-none");
|
|
|
|
|
|
for Package { name, root_dir } in packages {
|
|
|
@@ -71,20 +85,25 @@ pub fn build_ebpf<'a>(
|
|
|
&target,
|
|
|
]);
|
|
|
|
|
|
- cmd.env("CARGO_CFG_BPF_TARGET_ARCH", &arch);
|
|
|
- cmd.env(
|
|
|
- "CARGO_ENCODED_RUSTFLAGS",
|
|
|
- ["debuginfo=2", "link-arg=--btf"]
|
|
|
- .into_iter()
|
|
|
- .flat_map(|flag| ["-C", flag])
|
|
|
- .fold(String::new(), |mut acc, flag| {
|
|
|
- if !acc.is_empty() {
|
|
|
- acc.push('\x1f');
|
|
|
- }
|
|
|
- acc.push_str(flag);
|
|
|
- acc
|
|
|
- }),
|
|
|
- );
|
|
|
+ {
|
|
|
+ const SEPARATOR: &str = "\x1f";
|
|
|
+
|
|
|
+ let mut rustflags = OsString::new();
|
|
|
+
|
|
|
+ for s in [
|
|
|
+ "--cfg=bpf_target_arch=\"",
|
|
|
+ &arch,
|
|
|
+ "\"",
|
|
|
+ SEPARATOR,
|
|
|
+ "-Cdebuginfo=2",
|
|
|
+ SEPARATOR,
|
|
|
+ "-Clink-arg=--btf",
|
|
|
+ ] {
|
|
|
+ rustflags.push(s);
|
|
|
+ }
|
|
|
+
|
|
|
+ cmd.env("CARGO_ENCODED_RUSTFLAGS", rustflags);
|
|
|
+ }
|
|
|
|
|
|
// Workaround to make sure that the correct toolchain is used.
|
|
|
for key in ["RUSTC", "RUSTC_WORKSPACE_WRAPPER"] {
|
|
|
@@ -183,20 +202,17 @@ impl<'a> Toolchain<'a> {
|
|
|
|
|
|
/// Emit cfg flags that describe the desired BPF target architecture.
|
|
|
pub fn emit_bpf_target_arch_cfg() {
|
|
|
- println!("cargo:rerun-if-env-changed=CARGO_CFG_BPF_TARGET_ARCH");
|
|
|
- let bpf_target_arch = env::var_os("CARGO_CFG_BPF_TARGET_ARCH");
|
|
|
- let target_arch = env::var_os("CARGO_CFG_TARGET_ARCH");
|
|
|
- let arch = if let Some(bpf_target_arch) = bpf_target_arch.as_ref() {
|
|
|
- bpf_target_arch.to_str().unwrap()
|
|
|
- } else {
|
|
|
- let target_arch = target_arch.as_ref().unwrap().to_str().unwrap();
|
|
|
- if target_arch.starts_with("riscv64") {
|
|
|
- "riscv64"
|
|
|
- } else {
|
|
|
- target_arch
|
|
|
- }
|
|
|
- };
|
|
|
- println!("cargo:rustc-cfg=bpf_target_arch=\"{arch}\"");
|
|
|
+ const RUSTFLAGS: &str = "CARGO_ENCODED_RUSTFLAGS";
|
|
|
+
|
|
|
+ println!("cargo:rerun-if-env-changed={RUSTFLAGS}");
|
|
|
+ let rustc_cfgs = std::env::var_os(RUSTFLAGS).unwrap_or_else(|| panic!("{RUSTFLAGS} not set"));
|
|
|
+ let rustc_cfgs = rustc_cfgs
|
|
|
+ .to_str()
|
|
|
+ .unwrap_or_else(|| panic!("{RUSTFLAGS}={rustc_cfgs:?} not unicode"));
|
|
|
+ if !rustc_cfgs.contains("bpf_target_arch") {
|
|
|
+ let arch = target_arch();
|
|
|
+ println!("cargo:rustc-cfg=bpf_target_arch=\"{arch}\"");
|
|
|
+ }
|
|
|
|
|
|
print!("cargo::rustc-check-cfg=cfg(bpf_target_arch, values(");
|
|
|
for value in [
|