summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorMarkus Pettersson <markus.pettersson@mullvad.net>2025-07-04 21:12:51 +0200
committerMarkus Pettersson <markus.pettersson@mullvad.net>2025-07-07 10:02:07 +0200
commitecd6066dabb3ff321bedc2b025ad76bb99622836 (patch)
tree6b8d821513152d9b9f58b7cdec1575e8353fbb42
parentf35064df75f45c9846e6bf2b82bb3c839ee6ba35 (diff)
downloadmullvadvpn-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.rs25
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"),
};
}