diff options
-rw-r--r-- | misc/launchd/org.nixos.nix-daemon.plist.in | 5 | ||||
-rw-r--r-- | package.nix | 4 | ||||
-rw-r--r-- | src/libstore/globals.cc | 14 | ||||
-rw-r--r-- | tests/functional/bash-profile.sh | 2 | ||||
-rwxr-xr-x | tests/functional/init.sh | 2 |
5 files changed, 15 insertions, 12 deletions
diff --git a/misc/launchd/org.nixos.nix-daemon.plist.in b/misc/launchd/org.nixos.nix-daemon.plist.in index e1470cf99..664608305 100644 --- a/misc/launchd/org.nixos.nix-daemon.plist.in +++ b/misc/launchd/org.nixos.nix-daemon.plist.in @@ -2,11 +2,6 @@ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> - <key>EnvironmentVariables</key> - <dict> - <key>OBJC_DISABLE_INITIALIZE_FORK_SAFETY</key> - <string>YES</string> - </dict> <key>Label</key> <string>org.nixos.nix-daemon</string> <key>KeepAlive</key> diff --git a/package.nix b/package.nix index dbdc66340..4abce3aad 100644 --- a/package.nix +++ b/package.nix @@ -398,10 +398,6 @@ stdenv.mkDerivation (finalAttrs: { mesonInstallCheckFlags = [ "--suite=installcheck" ]; - preInstallCheck = lib.optionalString stdenv.hostPlatform.isDarwin '' - export OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES - ''; - installCheckPhase = lib.optionalString buildWithMeson '' runHook preInstallCheck flagsArray=($mesonInstallCheckFlags "''${mesonInstallCheckFlagsArray[@]}") diff --git a/src/libstore/globals.cc b/src/libstore/globals.cc index b7397da1a..3308cad1f 100644 --- a/src/libstore/globals.cc +++ b/src/libstore/globals.cc @@ -25,6 +25,7 @@ #include "config-impl.hh" #ifdef __APPLE__ +#include <curl/curl.h> #include <sys/sysctl.h> #endif @@ -409,10 +410,21 @@ void initLibStore() { preloadNSS(); +#if __APPLE__ + /* Because of an objc quirk[1], calling curl_global_init for the first time + after fork() will always result in a crash. + Up until now the solution has been to set OBJC_DISABLE_INITIALIZE_FORK_SAFETY + for every nix process to ignore that error. + Instead of working around that error we address it at the core - + by calling curl_global_init here, which should mean curl will already + have been initialized by the time we try to do so in a forked process. + + [1] https://github.com/apple-oss-distributions/objc4/blob/01edf1705fbc3ff78a423cd21e03dfc21eb4d780/runtime/objc-initialize.mm#L614-L636 + */ + curl_global_init(CURL_GLOBAL_ALL); /* On macOS, don't use the per-session TMPDIR (as set e.g. by sshd). This breaks build users because they don't have access to the TMPDIR, in particular in ‘nix-store --serve’. */ -#if __APPLE__ if (getEnv("TMPDIR").value_or("/tmp").starts_with("/var/folders/")) unsetenv("TMPDIR"); #endif diff --git a/tests/functional/bash-profile.sh b/tests/functional/bash-profile.sh index 3faeaaba1..01e869202 100644 --- a/tests/functional/bash-profile.sh +++ b/tests/functional/bash-profile.sh @@ -2,7 +2,7 @@ source common.sh sed -e "s|@localstatedir@|$TEST_ROOT/profile-var|g" -e "s|@coreutils@|$coreutils|g" < ../../scripts/nix-profile.sh.in > $TEST_ROOT/nix-profile.sh -user=$(whoami) +user=$(whoami || echo -n nixbld) rm -rf $TEST_HOME $TEST_ROOT/profile-var mkdir -p $TEST_HOME USER=$user $SHELL -e -c ". $TEST_ROOT/nix-profile.sh; set" diff --git a/tests/functional/init.sh b/tests/functional/init.sh index f5a04f62e..663d04721 100755 --- a/tests/functional/init.sh +++ b/tests/functional/init.sh @@ -28,7 +28,7 @@ substituters = flake-registry = $TEST_ROOT/registry.json show-trace = true include nix.conf.extra -trusted-users = $(whoami) +trusted-users = $(whoami || id -u) EOF cat > "$NIX_CONF_DIR"/nix.conf.extra <<EOF |