Перекрестная публикация от https://discourse.nixos.org/t/nix-build-fails-because-python-wants-something-thats-unavailable-without-saying-what-it-wants/5675/2, чтобы помочь людям, которые только находят это, ответ может продолжаться в дискурсе NixOS. Я старался, чтобы это было полезно для общего NixOS, пишущего отладочную деривацию, с некоторыми Python битами
выборкой git
Во-первых, давайте поможем с частью fetchgit
в вашем рецепте
src = fetchgit {
# Once, it seemed to finish, and I don't know how! Then it crashed with:
# Switched to a new branch 'fetchgit'
# removing `.git'...
# hash mismatch in fixed-output derivation '/nix/store/5zj802wfjd0ima92lpzzsqdjqvrnrwf9-serialosc':
# wanted: sha256:1vqcxi32wc4pklbddllflkaigkfvd4ykwrjqccayvrk10dx1sna3
# got: sha256:1zmzjasv21ix7i7s58a31k0025ji32hv2jm2ww6s0xhjmr5ax34j
# This way it [[gets pretty far]].
# The fetchSubmodules value I set again seems to have no effect.
url = https://github.com/monome/serialosc.git;
rev = "v1.4.1";
sha256 = "1zmzjasv21ix7i7s58a31k0025ji32hv2jm2ww6s0xhjmr5ax34j";
Возможно, была сила пу sh? Не уверен, почему он перестал работать с ha sh
Я обнаружил, что fetchSubmodules не работает, если у вас есть ha sh без подмодулей, используйте nix-prefetch-git --fetch-submodules https://github.com/monome/serialosc
, что дает
{
"url": "https://github.com/monome/serialosc",
"rev": "cec0ea76b2d5f69afa74d3ffc14a0950e32a7914",
"date": "2019-06-09T21:46:13+02:00",
"sha256": "03qkzslhih72idwafgfxmkwp5v3x048njh0c682phw2ks11plmbp",
"fetchSubmodules": true
}
, поэтому используйте
fetchgit {
url = https://github.com/monome/serialosc;
rev = "cec0ea76b2d5f69afa74d3ffc14a0950e32a7914";
# or rev = version; but that might break with force pushes
sha256 = "03qkzslhih72idwafgfxmkwp5v3x048njh0c682phw2ks11plmbp";
fetchSubmodules = true;
}
wafHook
Существует (небольшая) wafHook
документация в https://nixos.org/nixpkgs/manual/
Ошибка отладки
Кажется, он хочет что-то сделать git
, вот как я его отлаживал:
$ nix-shell https://github.com/JeffreyBenjaminBrown/nixpkgs/archive/2bbd131811991bec9ae6b296b5cd1441640c306c.tar.gz -A serialosc --pure
nix-shell $ mkdir /tmp/delme-serialosc
nix-shell $ cd !$
# To find out what a build would do
nix-shell $ type genericBuild
...
# Doing the `if [ -z "${phases:-}" ]; then ...` bit gives us `echo $phases`
# unpackPhase patchPhase configurePhase buildPhase checkPhase installPhase fixupPhase installCheckPhase distPhase
nix-shell $ ${unpackPhase:-unpackPhase}
nix-shell $ cd $sourceRoot
nix-shell $ ${patchPhase:-patchPhase}
nix-shell $ ${configurePhase:-configurePhase}
# Error happens here
nix-shell $ type ${configurePhase:-configurePhase}
# Do the steps until you find it stops in `python ...`
# Python debug info: https://docs.python.org/3/library/pdb.html
nix-shell $ python -m pdb "$wafPath" "${flagsArray[@]}";
(Pdb) continue # or cont, or just c
...
(Pdb) break /nix/store/lbrpma3528hq7gwn8ffbnwaxvsqah0bb-python-2.7.17/lib/python2.7/subprocess.py:1047
(Pdb) continue
> /nix/store/lbrpma3528hq7gwn8ffbnwaxvsqah0bb-python-2.7.17/lib/python2.7/subprocess.py(1047)_execute_child()
-> raise child_exception
(Pdb) up
> /nix/store/lbrpma3528hq7gwn8ffbnwaxvsqah0bb-python-2.7.17/lib/python2.7/subprocess.py(394)__init__()
-> errread, errwrite)
(Pdb) # empty is equivalent to do last command, i.e. up in this case
> /nix/store/lbrpma3528hq7gwn8ffbnwaxvsqah0bb-python-2.7.17/lib/python2.7/subprocess.py(216)check_output()
-> process = Popen(stdout=PIPE, *popenargs, **kwargs)
(Pdb) print(popenargs)
(['git', 'rev-parse', '--verify', '--short', 'HEAD'],)
Но вы можете найти способ избежать waf
с использованием git
, так как он не может получить доступ к сети, если он не является производным с фиксированным выходом (например, эти источники выборки). Надеюсь, бит о fetchSubmodules
исправит это!
Редактировать : я не читал в прошлом, что он пытается использовать git, он пытается выяснить, какая это версия, вам следует как-то избежать использования git, например, grep -r 'rev-parse' предлагает отредактировать файл wscript
Edit 2 : например, что-то вроде
--- wscript-old 2020-01-29 15:55:54.100976818 +0000
+++ wscript 2020-01-29 15:55:58.128977024 +0000
@@ -257,7 +257,7 @@
conf.env.GIT_COMMIT = subprocess.check_output(
["git", "rev-parse", "--verify", "--short", "HEAD"],
stderr=devnull).decode().strip()
- except subprocess.CalledProcessError:
+ except (subprocess.CalledProcessError, OSError):
conf.env.GIT_COMMIT = ''
conf.define("VERSION", VERSION)
возможно, это тоже может быть расширено (в этом случае идентификатор фиксации git будет пустым)? Или просто используйте substituteInPlace
или что-то, чтобы ввести фактический идентификатор коммита, равный
--- wscript-old 2020-01-29 15:55:54.100976818 +0000
+++ wscript 2020-01-29 15:57:56.177983054 +0000
@@ -249,16 +249,7 @@
conf.env.VERSION = VERSION
- try:
- import os
-
- devnull = open(os.devnull, 'w')
-
- conf.env.GIT_COMMIT = subprocess.check_output(
- ["git", "rev-parse", "--verify", "--short", "HEAD"],
- stderr=devnull).decode().strip()
- except subprocess.CalledProcessError:
- conf.env.GIT_COMMIT = ''
+ conf.env.GIT_COMMIT = 'cec0ea76b2d5f69afa74d3ffc14a0950e32a7914'
conf.define("VERSION", VERSION)
conf.define("_GNU_SOURCE", 1)