Fix
Forester
Nix
flake on x86_64-darwin [jsr-0005]
- May 1, 2024
- Jinser Kafka
Fix
Forester
Nix
flake on x86_64-darwin [jsr-0005]
- May 1, 2024
- Jinser Kafka
从
Forester
3.0 开始增加了
Nix
flake 支持,遗憾的是,jon 和 kento 都不使用 x86_64-darwin。作为二等公民 nix-darwin 的二等公民 x86_64-darwin 不幸运地 broken 了。
1. Fix
Forester
opam-nix ocaml-cf broken [fst-0002]
- May 1, 2024
- Jinser Kafka
1. Fix Forester opam-nix ocaml-cf broken [fst-0002]
- May 1, 2024
- Jinser Kafka
ocaml-cf 的 lib_gen/dune
文件疑似写错了,导致
Forester
在 x86_64-darwin 上构建失败。
(rule (targets detect.exe) (enabled_if (= %{system} macosx)) (deps detect.c (package ctypes)) (action (run %{cc} -I %{ocaml_where} -I %{lib:ctypes:} -o %{targets} %{deps})))
Done: 31% (18/58, 40 left) (jobs: 0)^M ^MFile "lib_gen/dune", line 27, characters 0-185: 27 | (rule 28 | (targets detect.exe) 29 | (enabled_if 30 | (= %{system} macosx)) 31 | (deps 32 | detect.c 33 | (package ctypes)) 34 | (action 35 | (run %{cc} -I %{ocaml_where} -I %{lib:ctypes:} -o %{targets} %{deps}))) Error: File unavailable: /nix/store/xb81cf7qgnyvsyvp9nfj15dmqchc24gk-ctypes-0.22.0/doc/ctypes/CHANGES.md
我不懂 dune 是如何工作的,但我猜测 (deps detect.c (package ctypes))
是将 ctypes 当作源代码依赖来构建了。我将 (package ctypes)
直接删去,一切都正常工作了。
我在 GitHub 提了一个 PR。
2. Fix forster nix flake on x86_64-darwin link error [fst-0003]
- May 1, 2024
- Jinser Kafka
2. Fix forster nix flake on x86_64-darwin link error [fst-0003]
- May 1, 2024
- Jinser Kafka
使用 forster 原先的 nix flake 在 x86_64-darwin 上 build 到最后 link 的阶段会遇到 ld 报错:Unresolved Symbol(s): `_preadv`
和 Unresolved Symbol(s): `_pwritev`
。
好吧,是因为 nixpkgs 中的 x86_64-darwin 默认用的 apple sdk 是 10.12 的,是个非常老的版本,确实没有这两个符号。解决方案就是用更高的版本 override 掉默认的 10.12 sdk,一般是 11。
Opam-nix override stdenv [nix-0008]
- May 1, 2024
- Jinser Kafka
Opam-nix override stdenv [nix-0008]
- May 1, 2024
- Jinser Kafka
/startverb pkgs = import nixpkgs { inherit system; config.replaceStdenv = { pkgs }: if pkgs.stdenv.isDarwin then pkgs.overrideSDK pkgs.stdenv "11.0" else pkgs.stdenv; }; ... scope = on.buildOpamProject' { repos = [ "${opam-repository}" ]; inherit pkgs; } ./. query; /stopverb
这里有一个完整的 example