`nix-build` терпит неудачу, потому что Python хочет чего-то недоступного, не говоря, чего хочет - PullRequest
0 голосов
/ 28 января 2020

(по крайней мере, я думаю, что это проблема.)

Ошибка

Когда я запускаю nix-build -A serialosc из root из nixpkgs, nix печатает следующее:

[jeff@jbb-dell:~/nix/nixpkgs-fork]$ nix-build -A serialosc
these derivations will be built:
  /nix/store/p40wvn28grb8nrcd6scbxhhjqw4495kk-serialosc.drv
building '/nix/store/p40wvn28grb8nrcd6scbxhhjqw4495kk-serialosc.drv'...
unpacking sources
unpacking source archive /nix/store/5zj802wfjd0ima92lpzzsqdjqvrnrwf9-serialosc
source root is serialosc
patching sources
configuring
configure flags: --prefix=/nix/store/b6qzvzmwjdi29nnzc769904wc0mj1cds-serialosc configure
Setting top to                           : /build/serialosc 
Setting out to                           : /build/serialosc/build 

Checking for 'gcc' (C compiler)          : gcc 

Checking for working poll()              : yes 
Checking for libudev                     : yes 
Checking for libmonome                   : yes 
Checking for liblo                       : yes 
Checking for function strdup             : yes 
Checking for function _strdup            : not found 
Checking for function strndup            : yes 
Checking for function strcasecmp         : yes 
Checking for header unistd.h             : yes 
Checking for header dns_sd.h             : yes 
Checking for library dl                  : yes 

Traceback (most recent call last):
  File "/build/serialosc/.waf-1.8.5-3fc7b0f5070c04bfd3f2489448471a84/waflib/Scripting.py", line 103, in waf_entry_point
    run_commands()
  File "/build/serialosc/.waf-1.8.5-3fc7b0f5070c04bfd3f2489448471a84/waflib/Scripting.py", line 164, in run_commands
    ctx=run_command(cmd_name)
  File "/build/serialosc/.waf-1.8.5-3fc7b0f5070c04bfd3f2489448471a84/waflib/Scripting.py", line 155, in run_command
    ctx.execute()
  File "/build/serialosc/.waf-1.8.5-3fc7b0f5070c04bfd3f2489448471a84/waflib/Configure.py", line 92, in execute
    super(ConfigurationContext,self).execute()
  File "/build/serialosc/.waf-1.8.5-3fc7b0f5070c04bfd3f2489448471a84/waflib/Context.py", line 92, in execute
    self.recurse([os.path.dirname(g_module.root_path)])
  File "/build/serialosc/.waf-1.8.5-3fc7b0f5070c04bfd3f2489448471a84/waflib/Context.py", line 133, in recurse
    user_function(self)
  File "/build/serialosc/wscript", line 259, in configure
    stderr=devnull).decode().strip()
  File "/nix/store/lbrpma3528hq7gwn8ffbnwaxvsqah0bb-python-2.7.17/lib/python2.7/subprocess.py", line 216, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/nix/store/lbrpma3528hq7gwn8ffbnwaxvsqah0bb-python-2.7.17/lib/python2.7/subprocess.py", line 394, in __init__
    errread, errwrite)
  File "/nix/store/lbrpma3528hq7gwn8ffbnwaxvsqah0bb-python-2.7.17/lib/python2.7/subprocess.py", line 1047, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
builder for '/nix/store/p40wvn28grb8nrcd6scbxhhjqw4495kk-serialosc.drv' failed with exit code 2
error: build of '/nix/store/p40wvn28grb8nrcd6scbxhhjqw4495kk-serialosc.drv' failed

[jeff@jbb-dell:~/nix/nixpkgs-fork]$ 

Мое подозрение

Проблема возникает в lib/python2.7/subprocess.py. Я нашел версию этого файла онлайн, и определение _execute_child, кажется, ссылается на некоторые абсолютные пути - например, в этом отрывке:

    if shell:
        args = ["/bin/sh", "-c"] + args
        if executable:
            args[0] = executable

Поэтому я предполагаю, что Nix строит в песочнице, которая не предлагает того, что Python ожидает. Но ошибка не говорит мне, что Python надеялся найти.

Контекст

(Вам может не понадобиться эта информация.)

Я пытаюсь build serialos c в NixOS 19.09. Вот мой форк nixpkgs , включая мой сломанный рецепт для serialosc. В форк также входит мой пакет libmonome, который работает, от которого зависит serialosc, и который еще не является частью официального репо nixpkgs. Я дал жесткие ссылки на указанный c коммит; они не должны меняться при обновлении форка.

1 Ответ

0 голосов
/ 29 января 2020

Перекрестная публикация от 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)
...