Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Backport staging-23.11] nix: fix installCheckPhase crashes on Darwin #283264

Merged
merged 1 commit into from
Jan 23, 2024

Conversation

github-actions[bot]
Copy link
Contributor

Bot-based backport to staging-23.11, triggered by a label in #283182.

  • Before merging, ensure that this backport is acceptable for the release.
    • Even as a non-commiter, if you find that it is not acceptable, leave a comment.

While building nix on Darwin, I encountered an error in the `installCheckPhase`:

```
nix>     building '/private/tmp/nix-build-nix-2.17.1.drv-1/nix-test/tests/fetchurl/store/mkc9z3arar02wi5jii655cjhdinx4npy-fetchurl.sh.drv'...
nix>     waiting for children
nix>     building of '/private/tmp/nix-build-nix-2.17.1.drv-1/nix-test/tests/fetchurl/store/mkc9z3arar02wi5jii655cjhdinx4npy-fetchurl.sh.drv^out' from .drv file: read 377 bytes
nix>     objc[70707]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called.
nix>     objc[70707]: +[__NSCFConstantString initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
nix>     waiting for children
```

I noticed that #278802 should have addressed this problem, but it didn't.
The solution for me was to replace `yes` with `YES`.

As it turns out, most of the references to `OBJC_DISABLE_INITIALIZE_FORK_SAFETY` use `YES` instead of `yes`.

https://airflow.apache.org/blog/airflow-1.10.10/#running-airflow-on-macos
http://sealiesoftware.com/blog/archive/2017/6/5/Objective-C_and_fork_in_macOS_1013.html

The objective C code that parses the environment variable is defined in
the function `environ_init` in [here](https://github.com/opensource-apple/objc4/blob/cd5e62a5597ea7a31dccef089317abb3a661c154/runtime/objc-runtime.mm#L265) and it does
`*opt->var = (0 == strcmp(value, "YES"));`.

```
% nix-info -m
 - system: `"aarch64-darwin"`
 - host os: `Darwin 21.3.0, macOS 12.2.1`
 - multi-user?: `yes`
 - sandbox: `yes`
 - version: `nix-env (Nix) 2.19.2`
 - channels(hetzner): `"darwin, nixpkgs-22.05-darwin"`
 - channels(root): `"darwin, nixpkgs-23.05-darwin"`
 - nixpkgs: `/Users/hetzner/git/nixpkgs`
```

(cherry picked from commit 4844b99)
@lovesegfault lovesegfault merged commit a016726 into staging-23.11 Jan 23, 2024
@lovesegfault lovesegfault deleted the backport-283182-to-staging-23.11 branch January 23, 2024 17:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants