diff options
| author | Markus Pettersson <markus.pettersson@mullvad.net> | 2025-07-07 10:02:28 +0200 |
|---|---|---|
| committer | Markus Pettersson <markus.pettersson@mullvad.net> | 2025-07-07 10:02:28 +0200 |
| commit | da9b70071c8eac573e2ff585589ac4589176c002 (patch) | |
| tree | 6b8d821513152d9b9f58b7cdec1575e8353fbb42 | |
| parent | f35064df75f45c9846e6bf2b82bb3c839ee6ba35 (diff) | |
| parent | ecd6066dabb3ff321bedc2b025ad76bb99622836 (diff) | |
| download | mullvadvpn-da9b70071c8eac573e2ff585589ac4589176c002.tar.xz mullvadvpn-da9b70071c8eac573e2ff585589ac4589176c002.zip | |
Merge branch 'fix-cross-compilation-musl'
| -rw-r--r-- | wireguard-go-rs/build.rs | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/wireguard-go-rs/build.rs b/wireguard-go-rs/build.rs index a544e4e161..8978bef7b5 100644 --- a/wireguard-go-rs/build.rs +++ b/wireguard-go-rs/build.rs @@ -53,6 +53,14 @@ enum AndroidTarget { I686, // "i686" } +#[derive(PartialEq, Eq, Clone, Copy)] +enum Libc { + /// glibc + Gnu, + /// musl libc + Musl, +} + impl AndroidTarget { fn from_str(input: &str) -> anyhow::Result<Self> { use AndroidTarget::*; @@ -113,6 +121,16 @@ fn target_arch() -> anyhow::Result<Arch> { } } +// https://doc.rust-lang.org/reference/conditional-compilation.html#target_env +fn target_libc() -> anyhow::Result<Libc> { + let target_arch = env::var("CARGO_CFG_TARGET_ENV").context("Missing 'CARGO_CFG_TARGET_ENV")?; + match target_arch.as_str() { + "gnu" => Ok(Libc::Gnu), + "musl" => Ok(Libc::Musl), + _ => bail!("Unsupported target ABI/libc: {target_arch}"), + } +} + /// Compile libwg and maybenot and place them in the target dir relative to `OUT_DIR`. fn build_windows_dynamic_lib(out_dir: &str) -> anyhow::Result<()> { let target_dir = Path::new(out_dir) @@ -179,9 +197,10 @@ fn build_linux_static_lib(out_dir: &str) -> anyhow::Result<()> { }; if is_cross_compiling()? { - match target_arch { - Arch::Arm64 => go_build.env("CC", "aarch64-linux-gnu-gcc"), - Arch::Amd64 => bail!("cross-compiling to linux x86_64 is not implemented"), + match (target_arch, target_libc()?) { + (Arch::Arm64, Libc::Gnu) => go_build.env("CC", "aarch64-linux-gnu-gcc"), + (Arch::Arm64, Libc::Musl) => go_build.env("CC", "aarch64-linux-musl-gcc"), + (Arch::Amd64, _) => bail!("cross-compiling to linux x86_64 is not implemented"), }; } |
