2. Кросс компиляция Python 3.5.5 для ПЛК - Rashid-S/ADAM-3600 GitHub Wiki

2.1. Общие сведения

Изложены шаги сборки и кросс-компиляции интерпретатора Python 3.5.5 для работы в составе ПЛК. Кросс-компиляция проводилась на ОС Ubuntu 12.04, смонитированной на виртуальной машине.

2.2. Зависимости

Провести инсталляцию обновлений

$ sudo apt-get install update
$ sudo apt-get install upgrade

Инсталлировать следующие библиотеки

$ sudo apt-get install libssl-dev
$ sudo apt-get install libffi-dev
$ sudo apt-get install gcc-arm-linux-gnueabihf
$ sudo apt-get install dff
$ reboot

Проверить версию arm-linux-gnueabihf-gcc командой arm-linux-gnueabihf-gcc --version. Версия должна быть 4.6.3.

2.3. Кросс-компиляция OpenSSL 1.0.1t

$ cd $HOME
wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1t.tar.gz
tar xvzf openssl-1.0.1t.tar.gz
$ cd openssl-1.0.1t
$ ./Configure linux-generic32 shared --cross-compile-prefix=arm-linux-gnueabihf-
$ make
$ sudo make install
$ mkdir lib
$ cp ./*.{so,so.1.0.0,a,pc} ./lib

2.4. Кросс-компиляция и сборка Python-3.5.5

Выполнить последовательно команды

$ cd $HOME
$ mkdir PythonSrc
$ cd PythonSrc
$ wget https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tgz
$ tar zxf Python-3.5.5.tgz
$ mv Python-3.5.5 Python-3.5.5-host
$ cd Python-3.5.5-host
$ ./configure --prefix=$HOME/PythonSrc/PythonHost
$ make python Parser/pgen
$ make install
$ cd $HOME
$ wget https://www.python.org/ftp/python/3.5.5/Python-3.5.5.tgz
$ tar zxf Python-3.5.5.tgz
$ cd Python-3.5.5
$ export CC=arm-linux-gnueabihf-gcc
$ export CXX=arm-linux-gnueabihf-g++
$ export AR=arm-linux-gnueabihf-ar
$ export RANLIB=arm-linux-gnueabihf-ranlib
$ export ac_cv_file__dev_ptmx=no
$ export ac_cv_file__dev_ptc=no
$ export ac_cv_have_long_long_format=yes
$ export PATH=/home/rashid/PythonSrc/PythonHost/bin:$PATH
$ export OPENSSL_ROOT=/home/rashid/openssl-1.0.1t
$ ./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --build=x86_64-linux-gnu --prefix=$HOME/PythonSrc/PythonTarget --disable-ipv6 --enable-shared
$ export HOSTPYTHON=$HOME/PythonSrc/Python-3.5.5-host/python3
$ export HOSTPGEN=$HOME/Python-3.5.5-host/Parser/pgen
$ export BLDSHARED="arm-linux-gnueabihf-gcc -shared"
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ export CROSS_COMPILE_TARGET=yes
$ export HOSTARCH=arm-linux
$ export BUILDARCH=arm-linux-gnueabihf

Откорректировать файлы /usr/rashid/Python-3.5.5/Modules/Setup.dist и /usr/rashid/Python-3.5.5/setup.py.

Далее

$ make
$ make install

Скомпилированный проект должен появиться в директории $HOME/PythonSrc/PythonTarget/

2.5. Запуск интерпретатора на Adam-3600

В директории $HOME/PythonSrc/PythonTarget/ размещены четыре каталога - /bin, /include, /lib, /share. Я скопировал содержимое каждой директории в одноименные директории на PLC - /usr/bin, /usr/include, /usr/lib, /usr/share соотвественно, за исключением каталога /lib/python3.5/test, ввиду того что на PLC не так много места, да и надобности этого каталога нету.

Войти в директорий /usr/bin. Выполнить в командной строке

chmod +x python3.5

Далее

python3.5

В ответ в командной строке должно появиться приглашение интерпретатора

Python 3.5.5 (default, Apr 28 2019, 20:19:45)
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

2.6. Дополнительные опции

2.6.1 Обмен данными по последовательному интерфейсу 232/485

В PLC предусмотрены 3 последовательных порта (один 232 и два 485). Для работы с этими портами необходимы библиотеки pyserial, future, iso8601, yaml.

2.6.2 Обмен данными по протоколу MODBUS-RTU

Для работы по протоколу MODBUS-RTU я использовал библиотеку minimalmodbus. Необходимо учитывать что должны быть установлены библиотеки из предыдущего пункта.

2.7 Проверка корректности работы модуля SSL

2.7.1 Выполнить действия из раздела 1 "Доступ в Интернет через хост Windows 10". 2.7.2 Запустить интерпретатор Python (у меня он находится в директории /etc/bin):

root@adam3600:~# /usr/bin/python3
Python 3.5.5 (default, Jun  8 2019, 20:28:36)
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

2.7.3 Выполнить последовательно команды:

>>> import smtplib
>>> server = smtplib.SMTP('smtp.gmail.com:587')
>>> server.ehlo()
(250, b'smtp.gmail.com at your service, [188.232.204.204]\nSIZE 35882577\n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES\nPIPELINING\nCHUNKING\nSMTPUTF8')
>>> server.starttls()
(220, b'2.0.0 Ready to start TLS')
>>>