diff options
| author | Markus Pettersson <markus.pettersson@mullvad.net> | 2025-07-04 21:12:51 +0200 |
|---|---|---|
| committer | Markus Pettersson <markus.pettersson@mullvad.net> | 2025-07-07 10:02:07 +0200 |
| commit | ecd6066dabb3ff321bedc2b025ad76bb99622836 (patch) | |
| tree | 6b8d821513152d9b9f58b7cdec1575e8353fbb42 | |
| parent | f35064df75f45c9846e6bf2b82bb3c839ee6ba35 (diff) | |
| download | mullvadvpn-ecd6066dabb3ff321bedc2b025ad76bb99622836.tar.xz mullvadvpn-ecd6066dabb3ff321bedc2b025ad76bb99622836.zip | |
Add musl as a target ABI for wireguard-go-rs
Do not assume target ABI to be glibc. The current solution is not
directly extensible by the user, but it easily could be if we really
wanted to. At least we don't break cross-compilation to musl targets
though.
| -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"), }; } |
