CrossCompil ie python код для малины пи - PullRequest
0 голосов
/ 07 апреля 2020

Я обнаружил проблемы при установке кросс-компилятора на моей 64-битной машине Ubuntu19.04. Я бы хотел скомпилировать python код в исполняемый файл для моей модели Raspberry Pi 3 b + с Debian Stretch. Я следовал за многими гидами, ни один из них не работал. Я на самом деле следую https://github.com/Yadoms/yadoms/wiki/Cross-compile-for-raspberry-PI

Я следовал шагу вышеупомянутого письменного руководства: - Среда установки - Установка кросс-компилятора - Повышение 1.64 - Python

На последняя часть (Python) не может выполнить последнюю инструкцию.

$ CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ AR=arm-linux-gnueabihf-ar RANLIB=arm-linux-gnueabihf-ranlib ./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --build=x86_64-linux-gnu --prefix=$HOME/Desktop/rapsberry/depsBuild/python --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no ac_cv_have_long_long_format=yes --enable-shared

вывод:

checking build system type... x86_64-pc-linux-gnu
checking host system type... arm-unknown-linux-gnueabihf
checking for python3.7... python3.7
checking for python interpreter for cross build... python3.7
checking for --enable-universalsdk... no
checking for --with-universal-archs... no
checking MACHDEP... checking for --without-gcc... no
checking for --with-icc... no
checking for arm-linux-gnueabihf-gcc... arm-linux-gnueabihf-gcc
checking whether the C compiler works... no
configure: error: in `/home/slr/Desktop/raspberry/boost_1_64_0/Python-3.7.5':
configure: error: C compiler cannot create executables
See `config.log' for more details

и затем:

$ make HOSTPYTHON=$HOME/Desktop/raspberry/depsBuild/pythonhost/python HOSTPGEN=$HOME/Desktop/raspberry/depsBuild/pythonhost/Parser/pgen BLDSHARED="arm-linux-gnueabihf-gcc -shared" CROSS-COMPILE=arm-linux-gnueabihf- CROSS_COMPILE_TARGET=yes HOSTARCH=arm-linux BUILDARCH=arm-linux-gnueabihf 

вывод:

 make: *** No targets specified and no makefile found.  Stop.

Мне нужно python3 для моей цели.

Я действительно застрял в этой проблеме, может кто-то есть идеи? Я пытался также с QEMU и Docker (https://raspberrypi.stackexchange.com/questions/109488/building-a-virtual-machine-with-the-img-file-of-the-raspberry-pi-stretch), и оба они не смогли скомпилировать мой целевой код: gcc: internal compiler error Мой код довольно длинный (несколько тысяч строк), хотя небольшие коды успешно работает. Спасибо за совет.

1 Ответ

0 голосов
/ 07 апреля 2020

Кажется, что-то не так с используемой цепочкой инструментов или с тем, как вы запускаете скрипт конфигурации Python.
В любом случае невозможно выполнить отладку, не увидев точную настройку, поэтому я Здесь я начну с нуля.
Я сейчас документирую похожий проект: Разработка Raspberry Pi C ++ .

Набор инструментов

Набор инструментов в raspberrypi/tools хранилище довольно старое. Обычно я просто создаю новый, используя Crosstool-NG (именно так были построены raspberrypi/tools наборы инструментов, IIR C).
Я использовал armv8-rpi3-linux-gnueabihf образец .

Конечно, вы можете построить его самостоятельно, но это может занять довольно много времени, поэтому вы также можете скачать тот, который я построил из Docker Hub (см. Позже).

Вы можете найти больше информации о том, как это было собрано здесь: Подробная информация о настройке и сборке наборов инструментов .

Компиляция Python для системы сборки

Для кросс-компиляции Модуль Python, вам нужна одна и та же версия Python дважды: один раз для вашей системы сборки (компьютер, на котором вы строите) и один раз для хост-системы (Raspberry Pi, для которого вы собираете).

Оба будут скомпилированы из исходного кода, чтобы гарантировать, что они абсолютно одинаковой версии.

Сборка Python будет просто использоваться для кросс-компиляции хоста Python, поэтому мы не будут включать оптимизации и дополнительные модули.
Это скрипт, который я использовал: python-build.sh
Вам нужны OpenSSL, Zlib и libffi, чтобы pip работал. Я также собрал их из исходного кода, но вы, конечно, можете установить их, используя менеджер пакетов (вам нужны версии -dev).
Опять же, вы можете найти скрипты установки, которые я использовал здесь .

Кросс-компиляция Python для хост-системы

Прежде чем вы сможете кросс-компилировать Python для Raspberry Pi, вам придется кросс-компилировать его зависимости. Подробное объяснение можно найти здесь: Кросс-компиляция зависимостей .
Вы можете найти скрипты в той же папке на GitHub, на который я ссылался ранее, например, python.sh.
Есть некоторые предостережения при кросс-компиляции, вам нужен pkg-config с правильным префиксом , который ищет необходимые библиотеки в sys root вашей кросс-компиляции вместо в папках библиотеки вашей системы сборки. Вы также должны указать каталоги включения и папки библиотеки при вызове скрипта настройки.
Все это обрабатывается этим Dockerfile и скриптами в одной папке.

Crossenv

Самый простой способ кросс-компиляции Python модулей - использовать Crossenv . Инструкции можно найти в README на странице GitHub.

Когда все настроено, вы можете запустить python setup.py bdist_wheel.

Пример

В качестве примера вы можете выполнить следующие шаги, чтобы скомпилировать простой модуль Python, используя Cython:

1. Вытащите набор инструментов и кросс-скомпилированный файл Python из Docker hub

Это изображение, которое содержит набор инструментов кросс-компиляции, собственный и кросс-скомпилированный Python, а также Crossenv.

docker pull tttapa/rpi3-armv8-python-opencv-cross

2. Создайте файл Python для компиляции и setup.py для его сборки

Создайте эти два файла:

helloworld.py

print("Hello, World")

setup.py

from setuptools import setup
from Cython.Build import cythonize
from sys import version_info

setup(
    name='helloworld',
    version='0.0.1',
    ext_modules = cythonize("helloworld.py", language_level=version_info[0])
)

3. Создайте сценарий, который создает модуль Python

Этот сценарий будет выполняться внутри контейнера Docker.

build. sh

#!/usr/bin/env bash

set -e
cd /tmp/workdir
source "$HOME/crossenv/bin/activate"
build-pip install cython
cross-pip install wheel
python setup.py bdist_wheel

4. Запустите контейнер Docker и соберите модуль.

Запустите следующую команду в той же папке, где вы создали три файла.

docker run --rm -v "$PWD:/tmp/workdir" \
    tttapa/rpi3-armv8-python-opencv-cross \
    bash "/tmp/workdir/build.sh"

Когда сборка будет завершена, вы увидите файл dist/helloworld-0.0.1-cp38-cp38-linux_arm.whl, который вы можете установить с помощью pip install helloworld-0.0.1-cp38-cp38-linux_arm.whl на Raspberry Py. Вы также найдете файл helloworld.c, сгенерированный Cython.

Чтобы запустить его, вам, вероятно, придется установить кросс-скомпилированные библиотеки и сам Python на RPi. Вы можете сделать это, скопировав все содержимое ~/RPi-staging (внутри контейнера Docker) в папку root Pi /.

.
...