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