about summary refs log tree commit diff
path: root/pkgs/tools/networking/zerotierone/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/tools/networking/zerotierone/default.nix')
-rw-r--r--pkgs/tools/networking/zerotierone/default.nix53
1 files changed, 46 insertions, 7 deletions
diff --git a/pkgs/tools/networking/zerotierone/default.nix b/pkgs/tools/networking/zerotierone/default.nix
index fa2c86d6f83a9..6f34be09b871f 100644
--- a/pkgs/tools/networking/zerotierone/default.nix
+++ b/pkgs/tools/networking/zerotierone/default.nix
@@ -10,6 +10,9 @@
 , ronn
 , rustc
 , zlib
+, libiconv
+, darwin
+, fetchpatch
 }:
 
 let
@@ -33,8 +36,17 @@ in stdenv.mkDerivation {
       "rustfsm-0.1.0" = "sha256-q7J9QgN67iuoNhQC8SDVzUkjCNRXGiNCkE8OsQc5+oI=";
     };
   };
+  patches = [
+    # https://github.com/zerotier/ZeroTierOne/pull/2314
+    (fetchpatch {
+      url = "https://github.com/zerotier/ZeroTierOne/commit/f9c6ee0181acb1b77605d9a4e4106ac79aaacca3.patch";
+      hash = "sha256-zw7KmaxiCH99Y0wQtOQM4u0ruxiePhvv/birxMQioJU=";
+    })
+    ./0001-darwin-disable-link-time-optimization.patch
+  ];
   postPatch = "cp ${./Cargo.lock} Cargo.lock";
 
+
   preConfigure = ''
     cmp ./Cargo.lock ./rustybits/Cargo.lock || {
       echo 1>&2 "Please make sure that the derivation's Cargo.lock is identical to ./rustybits/Cargo.lock!"
@@ -57,10 +69,15 @@ in stdenv.mkDerivation {
     cargo
     rustc
   ];
+
   buildInputs = [
     lzo
     openssl
     zlib
+  ] ++ lib.optionals stdenv.isDarwin [
+    libiconv
+    darwin.apple_sdk.frameworks.SystemConfiguration
+    darwin.apple_sdk.frameworks.CoreServices
   ];
 
   enableParallelBuilding = true;
@@ -68,10 +85,25 @@ in stdenv.mkDerivation {
   # Ensure Rust compiles for the right target
   env.CARGO_BUILD_TARGET = stdenv.hostPlatform.rust.rustcTarget;
 
-  # Cargo won't compile to target/release but to target/<RUST_TARGET>/release when a target is
-  # explicitly defined. The build-system however expects target/release. Hence we just symlink from
-  # the latter to the former.
-  preBuild = ''
+  preBuild = if stdenv.isDarwin then ''
+    makeFlagsArray+=("ARCH_FLAGS=") # disable multi-arch build
+    if ! grep -q MACOS_VERSION_MIN=10.13 make-mac.mk; then
+      echo "You may need to update MACOSX_DEPLOYMENT_TARGET to match the value in make-mac.mk"
+      exit 1
+    fi
+    (cd rustybits && MACOSX_DEPLOYMENT_TARGET=10.13 cargo build -p zeroidc --release)
+
+    cp \
+      ./rustybits/target/${stdenv.hostPlatform.rust.rustcTarget}/release/libzeroidc.a \
+      ./rustybits/target
+
+    # zerotier uses the "FORCE" target as a phony target to force rebuilds.
+    # We don't want to rebuild libzeroidc.a as we build want to build this library ourself for a single architecture
+    touch FORCE
+  '' else ''
+    # Cargo won't compile to target/release but to target/<RUST_TARGET>/release when a target is
+    # explicitly defined. The build-system however expects target/release. Hence we just symlink from
+    # the latter to the former.
     mkdir -p rustybits/target/release
     ln -rs \
       ./rustybits/target/${stdenv.hostPlatform.rust.rustcTarget}/release/libzeroidc.a \
@@ -87,7 +119,11 @@ in stdenv.mkDerivation {
     runHook postCheck
   '';
 
-  installFlags = [ "DESTDIR=$$out/upstream" ];
+  installFlags = [
+    # only linux has an install target, we borrow this for macOS as well
+    "-f" "make-linux.mk"
+    "DESTDIR=$$out/upstream"
+  ];
 
   postInstall = ''
     mv $out/upstream/usr/sbin $out/bin
@@ -106,7 +142,10 @@ in stdenv.mkDerivation {
     description = "Create flat virtual Ethernet networks of almost unlimited size";
     homepage = "https://www.zerotier.com";
     license = licenses.bsl11;
-    maintainers = with maintainers; [ sjmackenzie zimbatm ehmry obadz danielfullmer ];
-    platforms = platforms.linux;
+    maintainers = with maintainers; [
+      sjmackenzie zimbatm ehmry obadz danielfullmer
+      mic92 # also can test darwin
+    ];
+    platforms = platforms.unix;
   };
 }