× К оглавлению На главную Об авторе

   Дата и время публикации:

Проблемы и решение

1. Суть проблем

Во время сборки пакета libxcb-native инструментальной среды сборочной машины yocto-poky (ветви Warrior) была получена ошибка импорта gcd модуля fractions, как показано в дампе 1.1

Дамп 1.1

...
   File "//home/user/yocto-poky.tmp/work/x86_64-linux/libxcb-native/1.13.1-r0/recipe-sysroot-native/usr/lib/pkgconfig/../../../usr/lib/python3.7/site-packages/xcbgen/align.py", line 5, in 
|     from fractions import gcd
| ImportError: cannot import name 'gcd' from 'fractions' (/usr/lib/python3.9/fractions.py)
| make[1]: *** [Makefile:1403: xproto.c] Error 1
| make[1]: *** Waiting for unfinished jobs....
| make[1]: *** [Makefile:1403: composite.c] Error 1
| make[1]: *** [Makefile:1403: dri3.c] Error 1
| make[1]: *** [Makefile:1403: bigreq.c] Error 1
| make[1]: *** [Makefile:1403: dpms.c] Error 1
| make[1]: *** [Makefile:1403: xc_misc.c] Error 1
| make[1]: *** [Makefile:1403: dri2.c] Error 1
| make[1]: *** [Makefile:1403: damage.c] Error 1
| make[1]: Leaving directory '/home/user/yocto-poky.tmp/work/x86_64-linux/libxcb-native/1.13.1-r0/build/src'
| make: *** [Makefile:787: all-recursive] Error 1
| ERROR: oe_runmake failed
| WARNING: exit code 1 from a shell command.
| ERROR: Function failed: do_compile (log file is located at /home/user/yocto-poky.tmp/work/x86_64-linux/libxcb-native/1.13.1-r0/temp/log.do_compile.2130121)
ERROR: Task (virtual:native:/home/user/Build/yocto-poky/poky/meta/recipes-graphics/xorg-lib/libxcb_1.13.1.bb:do_compile) failed with exit code '1'
NOTE: Tasks Summary: Attempted 2206 tasks of which 0 didn't need to be rerun and 1 failed.

2. Решение

Сборочная машина yocto/pokу собирает пакет libxcb-native во время формирования так называемой инструментальной среды, содержащей необходимые утилиты для кросс-компиляции на ARM(toolchain components) и которая собирается, в моем случае, с использованием python-3.9 дистрибутива Debian-11 — о чем сигнализирует выделенный жирным файл модуля /usr/lib/python3.9/fractions.py

Файл модуля /usr/lib/python3.9/fractions.py устанавливается вместе с пакетом libpython3.9-stdlib, как показано в дампе 2.1

Дамп 2.1

$ sudo apt-file search /usr/lib/python3.9/fractions.py
Finding relevant cache files to search ...W: Цель Packages (main/binary-amd64/Packages) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель Packages (main/binary-all/Packages) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель Translations (main/i18n/Translation-ru_RU) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель Translations (main/i18n/Translation-ru) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель Translations (main/i18n/Translation-en) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель DEP-11 (main/dep11/Components-amd64.yml) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель DEP-11 (main/dep11/Components-all.yml) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель DEP-11-icons-small (main/dep11/icons-48x48.tar) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель DEP-11-icons (main/dep11/icons-64x64.tar) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель Contents-deb (main/Contents-amd64) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
W: Цель Contents-deb (main/Contents-all) настроена несколько раз: в /etc/apt/sources.list:11 и в /etc/apt/sources.list.d/google-chrome.list:3
libpython3.9-stdlib: /usr/lib/python3.9/fractions.py

Затем, было выявлено место и получен код, где произошла ошибка, как показано в дампе 2.2

Дамп 2.2

$ egrep -n "gcd" /usr/lib/python3.9/fractions.py
158:            g = math.gcd(numerator, denominator)

И проведена проверка ее выполнения в Python-3.9 среды функционирования Debian-11, которая показана в дампе 2.3

Дамп 2.3

Python 3.9.2 (default, Feb 28 2021, 17:03:44) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> numerator=1; denominator=2; print(math.gcd(numerator, denominator))
1

Таким образом, было выявлено отсутствие обратной совместимости Python-3.9 с среды функционирования Debian-11 с собираемой версии python-3.7, которая вылилась в ошибку импорта в модуле python3.7/site-packages/xcbgen/align.py

Соответственно, для исправления данной ситуации принял решение понизить версию до Python-3.8 [3.1] и сделать соответствующие настройки в Debian-11, которые использует окружение Yocto-poky во время выполнения скрипта Bitbake

Для чего, было необходимо обновить и доустановить недостающие пакеты в среде функционирования Debian-11 для сборки пакета Python3, как показано в дампе 2.4

Дамп 2.4

$ sudo apt-get update
$ sudo apt-get build-dep python3
$ sudo apt-get install pkg-config
$ sudo apt-get install build-essential gdb lcov pkg-config \
      libbz2-dev libffi-dev libgdbm-dev libgdbm-compat-dev liblzma-dev \
      libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev \
      lzma lzma-dev tk-dev uuid-dev zlib1g-dev

После получения и распаковки архива Python-3.8.11.tgz [3.2], с последней версией Python-3.8.11, в корне одноименной корневой директории выполнил сборку в собственноручно назначенную директорию /opt/python-3.8, как показано в дампе 2.5

Дамп 2.5

$./configure --prefix=/opt/python-3.8 && \
make -s -j2
sudo make install

На финишной прямой в директории сборки build-dir, созданный в результате выполнения команды . oe-init-build-env build-dir, добавил скрипт build-dir/python3_8-default.sh [3.3], содержимое которого показан в дампе 2.6

Дамп 2.6

#!/bin/sh

if [ ! -d python-bin ] ; then
   mkdir python-bin
   ln -s /opt/python-3.8/bin/python3 python-bin/python3
   ln -s /opt/python-3.8/bin/python3-config python-bin/python-config
fi
export PATH=$(pwd)/python-bin:${PATH}
/opt/python-3.8/bin/python3 -m pip create ~/.venv

Затем, осталось лишь выполнить команду, которую потом добавил в конец файла ~./bashrc и показанную в дампе 2.7

Дамп 2.7

$ . /opt/python-3.8/bin/python3_8-default.sh 
user@debian11-uni:~$ /bin/env python3
Python 3.8.11 (default, Jan 23 2022, 19:01:14) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

После чего, мне осталось лишь заново собрать целевой образ дистрибутива yocto/poky, перед этим удалив содержимое директорий SSTATE_DIR и TMPDIR в текущей директории сборки build-dir

3. Библиография

3.1 Python Release Python-3.8.0

3.2 Python Release Python-3.8.11

3.3 Stackoverflow. Using Yocto with a distribution using python3 by defaults

3.4 Stackoverflow. How to install Python using source files to a custom directory

3.5 Getting Started. Python Developer's Guide