посмотреть

приёмы кросскомпиляции qt и pyqt
при кросскомпиляция qt5 добавить


и добавить опции сборки



для кросскомпиляции qt6 нужен qt в чруте
при сборке в чруте добавить опции


добавить опции сборки


кросскомпиляция pyqt
в pyqt 6.6.1
http://gitlab.tmispb/open-source/pyqt-builder/-/blob/master/pyqtbuild/bindings.py?ref_type=heads#L128
run_test = True заменить на False это отключит проверку собранных бинариков и pyqt соберётся


в pyqt 5.15.2
http://gitlab.tmispb/open-source/pyqt/-/blob/master/configure.py?ref_type=heads#L2445
заменить
error("%s failed to create %s. Make sure your Qt installation is correct." % (test, out_file))
на
with open(out_file, "w") as f: f.write("shared")
это отключит проверку собранных бинариков и pyqt соберётся


некоторые переменные sip



dpkg-architecture
DEB_BUILD_ARCH=arm64
DEB_BUILD_ARCH_ABI=base
DEB_BUILD_ARCH_BITS=64
DEB_BUILD_ARCH_CPU=arm64
DEB_BUILD_ARCH_ENDIAN=little
DEB_BUILD_ARCH_LIBC=gnu
DEB_BUILD_ARCH_OS=linux
DEB_BUILD_GNU_CPU=aarch64
DEB_BUILD_GNU_SYSTEM=linux-gnu
DEB_BUILD_GNU_TYPE=aarch64-linux-gnu
DEB_BUILD_MULTIARCH=aarch64-linux-gnu
DEB_HOST_ARCH=arm64
DEB_HOST_ARCH_ABI=base
DEB_HOST_ARCH_BITS=64
DEB_HOST_ARCH_CPU=arm64
DEB_HOST_ARCH_ENDIAN=little
DEB_HOST_ARCH_LIBC=gnu
DEB_HOST_ARCH_OS=linux
DEB_HOST_GNU_CPU=aarch64
DEB_HOST_GNU_SYSTEM=linux-gnu
DEB_HOST_GNU_TYPE=aarch64-linux-gnu
DEB_HOST_MULTIARCH=aarch64-linux-gnu
DEB_TARGET_ARCH=arm64
DEB_TARGET_ARCH_ABI=base
DEB_TARGET_ARCH_BITS=64
DEB_TARGET_ARCH_CPU=arm64
DEB_TARGET_ARCH_ENDIAN=little
DEB_TARGET_ARCH_LIBC=gnu
DEB_TARGET_ARCH_OS=linux
DEB_TARGET_GNU_CPU=aarch64
DEB_TARGET_GNU_SYSTEM=linux-gnu
DEB_TARGET_GNU_TYPE=aarch64-linux-gnu
DEB_TARGET_MULTIARCH=aarch64-linux-gnu


некоторые переменные QMAKE
https://doc.qt.io/qt-6/qmake-environment-reference.html
QMAKE_SPEC — короткое имя хоста mkspec, которое разрешено и сохранено вQMAKESPECпеременная во время сборки хоста
QMAKE_VERSION — текущая версия qmake
QMAKE_XSPEC — короткое имя цели mkspec, которое разрешено и сохранено вQMAKESPECпеременная во время целевой сборки
QT_HOST_BINS — расположение исполняемых файлов хоста.
QT_HOST_DATA — расположение данных для исполняемых файлов хоста, используемых qmake.
QT_HOST_LIBS — расположение хост-библиотек
QT_HOST_LIBEXECS — расположение исполняемых файлов, необходимых хост-библиотекам во время выполнения.
QT_HOST_PREFIX — префикс по умолчанию для всех путей хоста
QT_INSTALL_ARCHDATA — расположение общих данных Qt, зависящих от архитектуры.
QT_INSTALL_BINS — расположение бинарных файлов Qt (инструментов и приложений)
QT_INSTALL_CONFIGURATION — расположение настроек Qt. Не применимо в Windows
QT_INSTALL_DATA — расположение общих данных Qt, не зависящих от архитектуры.
QT_INSTALL_DOCS — расположение документации
QT_INSTALL_EXAMPLES — расположение примеров
QT_INSTALL_HEADERS — расположение всех заголовочных файлов.
QT_INSTALL_LIBEXECS — расположение исполняемых файлов, необходимых библиотекам во время выполнения.
QT_INSTALL_LIBS — расположение библиотек
QT_INSTALL_PLUGINS — расположение плагинов Qt
QT_INSTALL_PREFIX — префикс по умолчанию для всех путей
QT_INSTALL_QML — расположение расширений QML 2.x.
QT_INSTALL_TESTS — расположение тестовых примеров Qt
QT_INSTALL_TRANSLATIONS — расположение информации о переводе строк Qt.
QT_SYSROOT — системный корень, используемый целевой средой сборки.

-DBUILD_qtmultimedia=OFF \ - отключить сборку qtmultimedia, также как configure --skip qtmultimedia

https://src.fedoraproject.org/rpms/qt6-qtbase/blob/rawhide/f/qt6-qtbase.spec
-DQT_QMAKE_TARGET_MKSPEC=%{platform}

https://lists.debian.org/debian-qt-kde/2022/04/msg00365.html
-DQT_HOST_PATH=/usr/lib/qt6
https://martchus.no-ip.biz/doc/qt6/qtcmake/cmake-variable-reference.html
QT_HOST_PATH Местоположение установки хоста Qt, из которого можно использовать инструменты хоста во время другой сборки Qt, обычной или кросс-компиляции.
QT_FORCE_BUILD_TOOLS Принудительно создает инструменты, даже если основные инструменты уже найдены. Полезно при кросс-компиляции Qt, чтобы обеспечить наличие в SDK кросс-компилируемых инструментов.
QT_FORCE_FIND_TOOLS Использует инструменты Qt из предварительно встроенного Qt, QT_HOST_PATHкогда вы не выполняете кросс-компиляцию. Переменная вступает в силу только в том случае, если QT_FORCE_BUILD_TOOLSей присвоено значение ON. В противном случае QT_FORCE_FIND_TOOLS это не влияет на поведение по умолчанию.


некоторые переменные CMAKE
https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
https://man.archlinux.org/man/extra/cmake/cmake-variables.7.en
https://jeremimucha.com/2021/02/cmake-variable-guidelines/
CMAKE_HOST_SYSTEM_PROCESSOR - Имя процессора, на котором работает CMake, uname -m
CMAKE_SYSTEM_PROCESSOR - следует установить переменную в соответствии с целевой архитектурой, которую она указывает
CMAKE_SYSTEM_PROCESSOR=aarch64

CMAKE_PROJECT_NAME – имя, указанное при самом первом вызове проекта.
CMAKE_PROJECT_VERSION – строка полной версии, указанная при самом первом вызове проекта.
CMAKE_PROJECT_VERSION_MAJOR – основной компонент строки версии, передаваемой при самом первом вызове проекта.
CMAKE_PROJECT_VERSION_MINOR – младший компонент строки версии, передаваемой при самом первом вызове проекта.
CMAKE_PROJECT_VERSION_PATCH – компонент исправления строки версии, указанный при самом первом вызове проекта.
PROJECT_NAME – имя, присвоенное последнему вызову проекта.
PROJECT_SOURCE_DIR – каталог последнего вызова проекта.
PROJECT_BINARY_DIR – каталог сборки, соответствующий исходному каталогу самого последнего вызова проекта.
PROJECT_VERSION – строка полной версии, указанная для самого последнего вызова проекта.
PROJECT_VERSION_MAJOR – основной компонент строки версии, указанной при последнем вызове проекта.
PROJECT_VERSION_MINOR – младший компонент строки версии, указанной при последнем вызове проекта.
PROJECT_VERSION_PATCH – компонент исправления строки версии, указанной для самого последнего вызова проекта.

CMAKE_SYSROOT
CMAKE_STAGING_PREFIX - В этой переменной может быть указан путь для установки при кросс-компиляции
CMAKE_PREFIX_PATH - Список каталогов, разделенных точкой с запятой, определяющий установочные префиксы , в которых будет выполняться поиск

https://discourse.cmake.org/t/cmake-staging-prefix-vs-cmake-install-prefix/6485
параметр CMAKE_STAGING_PREFIX не должен устанавливаться проектом, он предназначен для разработчика. В сценариях кросс-компиляции разработчик может смонтировать файловую систему целевого компьютера в файловую систему своего хоста. Возможно, они захотят установить непосредственно в эту смонтированную файловую систему. На хосте путь к базовой точке установки может быть /mnt/raspi/opt/mything, тогда как на целевом компьютере тот же путь будет находиться под /opt/mything. В этом примере вы должны CMAKE_INSTALL_PREFIX установить /opt/mything и CMAKE_STAGING_PREFIX./mnt/raspi/opt/mything


некоторые переменные automake
https://gcc.gnu.org/onlinedocs/gcc/
https://gcc.gnu.org/onlinedocs/gccint/index.html
https://www.protokols.ru/WP/gnu-automake/

CC_FOR_BUILD - на которой собирается
CC_FOR_HOST - для которой собирается
CC_FOR_TARGET - для которой GCC будет создавать код
--build: машина, на которой вы собираете
--host: машина, для которой вы собираете
--target: машина, для которой GCC будет создавать код; флаг --target=TARGET для указания сборки GCC как кросс-компилятора для TARGET

кросскомпиляция
make CC=cross-gcc HOST_CC=gcc

CMAKE_HOST_SYSTEM_PROCESSOR - Имя процессора, на котором работает CMake, uname -m
CMAKE_SYSTEM_PROCESSOR - следует установить переменную в соответствии с целевой архитектурой, которую она указывает
CMAKE_SYSTEM_PROCESSOR=aarch64

В autoconf используется следующая терминология:
build - это система, на которой вы компилируете.
хост — это система, на которой будет работать то, что вы создаете.
target — это то, для чего будет компилироваться создаваемый вами компилятор, и не имеет значения, если компилятор не создается.

Однако в других инструментах, например ptxdist, используется следующая терминология:
хост - это система, на которой вы строите.
цель — это система, на которой будет работать то, что вы создаете.
Таким образом, в зависимости от того, какой инструмент у вас есть, хост означает разные вещи.

Добавляет префикс PREFIX к именам устанавливаемых программ.
--program-prefix=PREFIX
Добавляет суффикс SUFFIX к именам устанавливаемых программ.
--program-suffix=SUFFIX
Запускает команду sed PROGRAM для имен установленных программ.
--program-transform-name=PROGRAM

Не отключать медленное отслеживание зависимостей
–enable-dependency-tracking
Опции, поддерживаемые всеми включенными пакетами можно увидеть по команде configure –help=recursive

Makefile.am — это файл , определяемый программистом, который используется automakeдля создания Makefile.in файла ( .am обозначает автоматическую настройку )

make install может считаться комбинацией make install-exec install-data
install-exec для зависимых от архитектуры файлов и install-data – для остальных
make distcheck


ldconfig библиотеки

ликбез
/opt/mylib/libmy.so
gcc main.o -L/opt/mylib -lmy -lm -o my.out
Параметр -L/opt/mylib сообщает компилятору gcc , что каталог /opt/mylib входит в число тех мест, в которых можно найти статические и разделяемые библиотеки. По умолчанию компоновщик ищет библиотечные файлы в традиционных каталогах, таких как /usr/lib или /usr/local/lib.
Если не указать параметр -L, то компоновщик выполнит поиск только по этим стандартным путям.
Параметр -lmy говорит компилятору gcc, что ему нужно искать файл libmy.a или libmy.so.
Расширение принадлежит разделяемым библиотекам, о которых мы поговорим в следующем разделе.
Обратите внимание на то, по какому принципу выбирается имя. Если, к примеру, передать параметр -lxyz, то компоновщик будет искать в заданных и стандартных каталогах файл libxyz.a или libxyz.so
Параметр -lm сообщает компилятору gcc, что нужно искать еще одну библиотеку с именем libm.a или libm.so.
Параметр -o my.out говорит компилятору gcc, что итоговый исполняемый файл должен называться my.out
Параметр, -fPIC обязателен, если вам нужно создать динамическую библиотеку из набора переносимых объектных файлов
Флаг -static заставляет компоновщик принимать только статические библиотеки, а не общие библиотеки
Параметр -shared нужен чтобы компилятор создал разделяемый объектный файл из переносимых
Для статического связывания необходимо, чтобы в системе существовали архивные версии библиотек .a
разделяемые объектные файлы имеют расширение .so

export LD_LIBRARY_PATH=/opt/mylib - добавить к стандартным поисковым путям каталог /opt/mylib чтобы загрузчик нашел разделяемый объектный файл, а динамический компоновщик загрузил из данного файла все необходимые символы

ar crs libmy.a my1.o my2.o my3.o - архивация переносимых объектных файлов в статическую библиотеку
ar t libmy.a - вывод содержимого статической библиотеки

readelf -s my1.out - Таблица символов исполняемого объектного файла
readelf -hSl my1.out - Содержимое исполняемого объектного файла
objdump -d my1.out - просмотра ассемблерного кода
nm my1.out - Вывод символов, определенных в файле

AST - Дерево абстрактного синтаксиса
clang -c -Xclang -ast-dump filename.c - вывести дерево абстрактного синтаксиса


ldconfig
/lib/ld.so динамический компановщик
/etc/ld.so.conf Файл, содержащий список разделённых двоеточием, пробелом, табуляцией или символом новой строки, каталогов, в которых производится поиск библиотек.
/etc/ld.so.cache Файл, содержащий сортированный список библиотек, найденных в каталогах, заданных в /etc/ld.so.conf.
вызов ldconfig без параметров создаёт /etc/ld.so.cache

https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html#AEN77
https://stackoverflow.com/questions/13428910/how-to-set-the-environmental-variable-ld-library-path-in-linux
LD_LIBRARY_PATH -это предопределенная переменная среды в Linux/Unix, которая задает путь, который компоновщик должен искать при связывании динамических библиотек/общих библиотек.
LD_LIBRARY_PATH содержит разделенный двоеточием список путей, и компоновщик придает этим путям приоритет над стандартными библиотечными путями /lib и /usr/lib . Стандартные пути все равно будут найдены, но только после того, как список путей в LD_LIBRARY_PATH будет исчерпан.
Лучший способ использовать LD_LIBRARY_PATH -это установить его в командной строке или скрипте непосредственно перед выполнением программы. Таким образом, новый LD_LIBRARY_PATH изолирован от rest вашей системы.
export LD_LIBRARY_PATH="/list/of/library/paths:/another/path"
или находясь в той же папке выполнить команду LD_LIBRARY_PATH=. ./service
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/' >> ~/.bashrc
/lib/ld-linux.so.2 --library-path PATH EXECUTABLE
Перейдите в домашнюю папку и отредактируйте .profile Поместите следующую строку в конец
export LD_LIBRARY_PATH=
Сохранить и выйти.Выполните эту команду
sudo ldconfig
sudo vi /etc/bash.bashrc
прокрутите вниз и добавьте:
export LD_LIBRARY_PATH=.
У всех пользователей добавлена переменная среды
ещё вариант
/etc/profile.d.
cd /etc/profile.d
sudo touch myenv_vars.sh
sudo nano myenv_vars.sh
Добавьте это в пустой файл и сохраните.
export LD_LIBRARY_PATH=/usr/local/lib

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/taylor
sudo ldconfig

g++ -L/home/user/myDir -lxyz myprog.cpp -o myprog
Опция -l (в нижнем регистре L) указывает имя библиотеки, а не путь.
Чтобы добавить путь для поиска библиотек, используйте опцию -L

Утилиты для работы с объектными файлами
ar
создаёт статические библиотеки.
objdump
может быть использована для показа всей информации о бинарном объектном файле.
strings
показывает все строковые данные в бинарном файле, содержащие печатные символы.
nm
перечислить символы, определённые в символьной таблице объектного файла.
ldd
перечислить динамические библиотеки, от которых зависит объектный файл.
strip
удалить информацию из таблицы символов.

получить список путей поиска по умолчанию
cpp -v
$(gcc -print-prog-name=cc1) -v
echo | gcc -Wp,-v -x c++ - -fsyntax-only
gcc -xc -E -v -
gcc -xc++ -E -v -
cpp -v /dev/null -o /dev/null
gcc -v -x c -E /dev/null


ссылки
https://github.com/qt
https://download.qt.io/official_releases/qt/
https://riverbankcomputing.com/pypi/simple/
https://pypi.org/project/PyQt6
https://pypi.org/project/PyQt5

https://www.qt.io/blog/qt-6-build-system
https://wiki.qt.io/Cross-Compile_Qt_6_for_Raspberry_Pi
https://wiki.qt.io/Cross-compiling_Qt_6.5_for_both_armhf_and_aarch64_architectures_for_Raspberry_Pi_OS
https://doc.qt.io/qt-6/configure-linux-device.html
https://spec-zone.ru/qt~6.0/configure-linux-device
https://doc.qt.io/qt-6/cmake-variable-qt-host-path.html
https://embeddeduse.com/2022/04/11/building-qt-6-2-for-old-yocto-versions/
https://src.fedoraproject.org/rpms/qt6-qtbase/blob/rawhide/f/qt6-qtbase.spec
https://marssola.github.io/dev/2021/07/22/qt5-qt6-cross-compiled-part3.html
https://github.com/kevin-strobel/qt6pi3b/blob/master/toolchain.cmake
https://jeremimucha.com/2021/02/cmake-variable-guidelines/
https://doc.embedfire.com/linux/rk356x/Qt/zh/latest/lubancat_qt/install/install_arm_3.html
https://git.alpinelinux.org/aports/tree/community/qt6-qtbase/APKBUILD
https://discourse.llvm.org/t/simple-cross-compilation-with-target-fails/65948/7
https://github.com/PhysicsX/QTonRaspberryPi/blob/main/QtRaspberryPi6.6.1/README.md

https://doc.bccnsoft.com/docs/PyQt5/installation.html
https://gitlab.com/dboddie/pyqt5-for-embedded-linux/-/blob/master/build.sh?ref_type=heads

Библиотеки


Библиотека - в языке C, файл содержащий объектный код, который может быть присоединен к использующей библиотеку программе на этапе линковки. Фактически библиотека это набор особым образом скомпонованных объектных файлов.
Read more... )
http://pyviy.blogspot.ru/2010/12/gcc.html



GCC - GNU Compiler Collection - набор компиляторов и сопутствующих утилит, разработанный в рамках движения GNU. GCC один из старейших Open Source проектов, первый релиз состоялся в 1985 году, автор сам Ричард Столлман. В исходном варианте поддерживал только язык C и аббревиатура GCC расшифровывалась как GNU C Compiler. Постепенно набор доступных языков расширялся, были добавлены компиляторы Fortran, C++, Ada. С уверенностью можно сказать, что современный мир Open Source обязан своим рождением GCC (по крайней мере без GCC он был бы другим). В настоящее время проект находиться под крылом Free Software Foundation. GCC выпускается под лицензией GPLv3 и является стандартным компилятором для большинства свободных UNIX-подобных операционных систем. В базовый набор входят компиляторы языков: C, C++, Objective-C, Java, Fortran, Ada. GCC поддерживает все основные процессорные архитектуры. Официальный сайт проекта gcc.gnu.org
Read more... )
http://pyviy.blogspot.ru/2010/12/gcc.html



objcopy myprog myprog_new --add-section my_sect=sectionfile
http://www.linux.org.ru/forum/development/10125467

Практическое применение LD_PRELOAD или замещение функций в Linux
http://habrahabr.ru/post/199090/

Перенаправление функций в разделяемых ELF-библиотеках
http://habrahabr.ru/post/106107/

Обзор «вспомогательных» утилит из GCC
http://we.easyelectronics.ru/CADSoft/obzor-vspomogatelnyh-utilit-iz-gcc-toolchain-chast-1.html
http://we.easyelectronics.ru/CADSoft/obzor-vspomogatelnyh-utilit-iz-gcc-toolchain-chast-2.html

Исследование исполняемых файлов с помощью утилиты readelf
http://code4geeks.blogspot.ru/2012/08/readelf.html

Как запускается функция main() в Linux
http://www.codenet.ru/progr/other/ELF.php




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

углубиться в тему
Во-первых поставляя исходный скрипт нужно позаботится о присутствии интерпретатора нужной версии у пользователя да еще и нужных модулей. 

Во-вторых отдавая пользователю текстовый скрипт он получает возможность изменять его, что для некоторых приложений крайне недопустимо. Этот пункт касается не только python а и других динамических языков с интроспекцией. Безусловно, любой исполняемый файл написанный на компилируемом языке можно дезасемблировать, но это требует от злоумышленника большего опыта и больший усилий. А вот получить даже из байт-кода в .pyc файле текстовый .py может любой кто умеет пользоваться google.

В этой статье мы попробуем разобраться с решением обоих проблем. 

Будем создавать 32-х битный файл для винды, собрать 64-бит версию вы сможете по аналогии, но х32 версия обязательна так как может работать как на 32-битных виндовсах так и на 64-х. Эта инструкция в принципе должена работать и под linux с небольшими изменениями.

Установка cython



У меня уже установлен python версии 3.4.2 (32 бит):


Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:15:05) [MSC v.1600 32 bit (Intel)] on win32


Разработку скрипта я веду в виртуальном окружении, то есть начиная новый проект я выполняю:

c:\Python34\python.exe -m venv project_env

При этом в текущей папке создается папка project_env с копией интерпретатора и туда мы можем ставить любые модули не засоряя системный python. Правда перед началом работы нужно активировать виртуальное окружение выполнив:

project_env\Scripts\activate.bat

При этом в приглашении в командной строке должно быть видно "(project_env)". Если вы используете среду разработке (например eclipse или PyCharm), то в ней нужно задать интерпретатор из папки project_env.

Для компиляции исходных кодов .py в архитектурный код мы должны установить модуль cython. Он позволит собирать наши скрипты в объектный код путем преобразования программ на питоне в язык си. Но для этого нам нужно настроить компилятор С. Тут у нас есть два решения: либо использовать Microsoft Visual C, либо открытый gcc из mingw, совместимый с MVC. Конечно же мы выбираем gcc.

Устанавливая Mingw нужно выбрать пакеты:

mingw_gcc_packssel.jpg

Установив компилятор мы должны прописать к нему путь в PATH добавив туда: C:\MinGW\bin;C:\MinGW\msys\1.0\bin . После этого нужно перезапустить cmd в которой запущено виртуальное окружение и затем проверить прописался ли path, выполнив echo %PATH%. Потом повторно активировать окружение.

Осталось указать компилятор установщику pip. Для этого создаем файл c:\Python34\Lib\distutils\distutils.cfg и в него добавляем:

[build]
compiler=mingw32

Примечание: идеологически файл distutils.cfg мы должны создавать в виртуальном окружении а не в папке Python. Но в силу непонятных причин pip отказался его подхватывать из project_env\Lib\distutils\distutils.cfg либо из project_env\pydistutils.cfg. Если у кого-то получится - пишите в комментариях.

Наконец запускаем в нашем окружении project_env:

pip install cython

В конечном итоге все должно закончится фразой типа:

Successfully installed cython-0.22

Кроме cython нам опционально понадобится пакет pywin32. Он понадобится для включения в exe-файл информации о версии. Для python 2.7 его можно установить через pip, однако для 3.4 пока поддерживается только отдельный инсталлятор, который можна найти тут:
http://sourceforge.net/projects/pywin32/files/pywin32/
Так как мы используем venv, устанавливать нужно при помощи easy_install -N, например:

easy_install -N "Downloads\pywin32-219.win32-py3.4.exe"

Работа над проектом



Наконец можем приступать к компиляции рабочего проекта. Смысл состоит в том чтобы вынести весь код который мы хотим скрыть в пакеты и оставить в рабочем каталоге только основной файл, например main.py, в котором будет минимум вашего кода. Выбор имени главного модуля повлияет на название исполняемого файла (например main.exe), так что выбирайте его согласно названию вашей программы. Пакетом в питоне как известно считается папка в которой присутствует файл __init__.py (желательно что бы он был пустой, так как он не будет компилироваться).

Например мы можем разместить файлы проекта в такую структуру:
каталог_проекта
  |
  |-- gui
  |      |
  |      |-- __init__.py
  |      |-- login_window.py
  |      |-- main_window.py
  |
  |-- logic
  |      |
  |      |-- __init__.py
  |      |-- program_logic.py
  |
  |-- defs
  |      |
  |      |-- __init__.py
  |      |-- program_logic.py
  |
  |-- res
  |      |
  |      |--appicon.ico
  |      |--applogo.png
  |
  |-- main.py


В проекте у меня три пакета: 

  1. gui - пакет с файлами определения графических интерфейсов. Например я использую кросс-платформенный открытый PySide основный на Qt.

  2. logic - пакет со всякими модулями определяющими логику работы программы

  3. defs - пакет с константами и определениями.


Кроме того у меня есть папка res для всяких ресурсов (иконок картинок и т.д.), которые нужно будет поставлять вместе с программой.

Для сборки релиза я предлагаю создать ряд скриптов, которые позволят автоматизировать процесс.

Генерация файла версии



Начнем со скрипта генерирующего версию программы gen_version.py. Его нужно создать в каталоге проекта(рядом с main.py) Этот скрипт не есть обязательным но очень полезным с точки зрения сопровождения программы. Скрипт достает номер ревизии и хеш коммита из репозитория системы контроля версий git, находящегося в папке проекта. Если вы используете другую СКВ, например svn, вам не составит труда адаптировать скрипт. Если вы не используете системы контроля версий вообще, но все же хотите генерировать файл версии, то простым решением будет обычный инкримент номера (до открытия файла на записать нужно открыть его для  чтения вычитать текущий номер, если удалось сделать +1, иначе присвоить ноль). Кроме этого gen_version.py подсчитывает CRC32 всех исходников .py и записывает время запуска этого скрипта (типа время и дата сборки). Вот его код:



Выполнив функцию create_version_file(путь_к_файлу_версии), мы получаем файл вроде такого:

COMMIT_REVISION = 3
COMMIT_HASH = 0x11b38900
SOURCES_CRC = 0xac699a53
BUILD_TIME = 1425129933.589303

COMMIT_REVISION можно использовать как версию программы (он будет увеличиваться от коммита к комиту при условии что мы будем делать релизы из одной ветки), COMMIT_HASH поможет нам найти коммит, из которого создавалась версия, например мы сможем на него вернутся и протестировать багу. SOURCES_CRC покажит реальное сотояние исходников, что позволит определить был ли реально сделан коммит или нет, а BUILD_TIME содержит timestamp указывающий на дату и время сборки.

Компиляция пакетов при помощи cython



Создаем файл compile.py в каталоге проекта.



Создание исполняемого файла



Создаем в папке проекта скрипт makebin.py



Если вы не используете генерацию версии замените строку COMMIT_REVISION на свое значение. Также укажите свои "имя_программы", "Короткое описание программы", путь к иконке res/appicon.ico. Также обратите внимание что в packages нужно перечислить используемые в импортах пакеты, в том числе внешние, например "os", "Crypto" и т.д.

Скрипт сборки



Ну и последнее что осталось сделать, это создать наконец окончательный скрипт который будет вызывать другие скрипты. В папке проекта создаем  build_release.py:



Тут мы выполняем генерацию версии в файл defs/version.py а затем копируем рекурсивно все содержимое папки проекта в под-папку building, переходя в нее мы и начинаем сборку. Это позволяет нам не изменять основную папку и не создавать в ней всякого мусор. Папка building при каждой новой сборке полностью удаляется что позволяет избавиться от конфликтующих или просто ненужных файлов в процессе сборки.

Затем мы выполняем компиляцию модулей в пакете, и после этого удаляем все .py, .c, .pyc файлы в пакетах (кроме пустых __init__.py, которые по прежнему определят пакет). Так мы гарантируем, что исходных файлов не осталось в пакетах, а остались только скомпилированные cython-ом.

Ну и напоследок мы собираем все в .exe файл, и копируем папку с релизом, в которую войдут папка ресурсов res и необходимые библиотеки. Все это будет находится в building\build\exe.win32-3.4\. Эту папку можно завернуть в SFX архив, или в какой-нибудь инсталлятор (например InnoSetup).

Запуск скрипта нужно выполнять в виртуальном окружении при помощи:

python build_release.py

Бонус: создание инсталлятора для Windows при помощи Inno Setup



Скачать Inno Setup, тут: http://www.jrsoftware.org/isdl.php

В папке проекта создаем папку inno_setup, в нее помещаем два bmp-файла:

  • WizModernImage-IS.bmp


  • WizModernSmallImage-IS.bmp


Скопировать их можно из "c:\Program Files (x86)\Inno Setup 5\"  (или без x86) и по желанию подредактировать под свои нужды, например используя GIMP (Формат bmp должен быть 24 разряда на цвет пикселя).

Также создаем скрипт формирования иснталлятора proj.iss (кодировка ANSI cp1251):



Первые 4-5 срок скрипта измените под свой проект.
Теперь в build_release.py можем добавить:


print(">> Building installer")
os.system('"c:\Program Files (x86)\Inno Setup 5\ISCC.exe" inno_setup\proj.iss')


После запуска "python build_release" в папке \building\inno_setup\installer забирайте свежий инсталлятор!
____________________________________________________
____________________________________________________

ещё способы, для простых вещей:
cython --embed my_script.py -o my_script.c
gcc -g -O2 -o my_script.exe my_script.c `python-config --includes --ldflags`


Ставится Cython через pip:
pip install Cython

Cython → C:
cython -2 pi_approximater.pyx -o pi_approximater.c

Компилируем С-шный код:
gcc -g -O2 -shared -o pi_approximater.so pi_approximater.c python-config --includes --ldflags -fPIC


http://nuitka.net/doc/user-manual.html
pip install -U nuitka
nuitka --module some_package --recurse-directory=some_package
nuitka --recurse-all my_proga.py

Ставится через pip:
pip install nuitka

Для генерации исполняемого файла достаточно выполнить команду:
python -m nuitka --follow-import some_program.py

Для компиляции модуля:
python -m nuitka --module some_module.py

Для компиляции пакета:
python -m nuitka --module some_package --include-package = some_package



либо

http://www.pyinstaller.org/
PyInstallerGUI How to create Python executables
python drag and drop explorer files to tkinter entry widget
Convert Python application to exe file
Python для Начинающих - Конвертирование .py в .exe


ссылки
Компиляция Python
https://web.archive.org/web/20161108064748/http://bovs.org/post/144/sborka-ispolnyaemogo-faila-iz-skriptov-python
http://nuitka.net/doc/user-manual.html
Компиляция Windows программы в Ubuntu Linux
http://blog.golovin.in/portable-mingw-and-msys/
https://cygwin.com/index.html
https://msys2.github.io/
https://habrahabr.ru/post/282359/ cx_Freeze + virtualenv
Python Tools для Visual Studio, о новинках из первых рук
https://github.com/Microsoft/PTVS/wiki/PTVS-Installation
Параметры компилятора, упорядоченные по категориям
Python 3. Компиляция в EXE и MSI
Python компилятор - Бета-тестирование ??
Tutorial: Compile Python to EXE
как сделать единый файл exe из скрипта python используя py2exe
Как защитить Python-код от модификации?
Компилятор GCC
Использование GCC
С++ для начинающих MinGW командная строка. Работа из консоли Windows
MXE (M кросс-среда) - это GNU Makefile, компилирует кросс-компилятор и кросс-компилирует множество библиотек
О GCC, компиляции и библиотеках
GCC online documentation



открыть, глянуть
1. скачать и установить свежую версию Python тут, не забыть добавить Python в переменные среды
https://www.python.org/downloads/

2. установить py2exe
в командной строке переходим в папку с установленным питоном
cd C:\Python34

и устанавливаем py2exe
pip install py2exe

3. создать файл setup.py с таким содержимым

from distutils.core import setup
import py2exe
setup(console=['myscript.py'], zipfile=None)
# myscript.py - скрипт из которого будет exe

4. собираем экзешник
setup.py py2exe -b 0

5. экзешник находится в каталоге dist
C:\Python34\dist

6. проверяем как работает
cd C:\Python34\dist
myscript.exe


PS. альтенатива:

cython --embed my_script.py -o my_script.c
gcc -g -O2 -o my_script.exe my_script.c `python-config --includes --ldflags`


ещё:

pyinstaller -D -F -n=ExeFileName -w PythonModule.py
Аргументы:
-D собрать в одну директорию
-F собрать в один файл
-n= имя выходного исполняемого файла
-w оконный режим


http://nuitka.net/doc/user-manual.html
pip install -U nuitka
nuitka --module some_package --recurse-directory=some_package
nuitka --recurse-all my_proga.py

http://www.pyinstaller.org/
PyInstallerGUI How to create Python executables
python drag and drop explorer files to tkinter entry widget
Convert Python application to exe file
Python для Начинающих - Конвертирование .py в .exe

PyInstaller компиляция в единый файл
https://www.youtube.com/watch?v=9bK5JJFVMbk
Хауди Хо™ - Просто о мире IT! Учим Python Kivy #5 - Компиляция под Windows

spec файл из ролика





Как преобразовать скрипт Python в .exe файл
Как создать exe файл для Python кода с помощью PyInstaller
https://pypi.org/project/auto-py-to-exe/
https://github.com/brentvollebregt/auto-py-to-exe
http://pythonworld.ru/osnovy/program-compilation-with-cx-freeze.html
Компиляция модулей Python - Python
Tutorial: Compile Python to EXE
Делаем standalone exe на IronPython
Создаём окружение для PyQt5 в Linux MInt (Ubuntu) tutorial
pyqtdeploy, или упаковываем Python-программу в exe'шник… the hard way
PyQt5 GUI-тулза которая конвертирует из .py в .exe

Как защитить Python-код от модификации?
Сборка испольняемого файла из скриптов Python
Основы написания переносимого кода (port gcc )



Введение
---------

В UNIX сообществе ходила крылатая фраза "Весь мир - VAX". Её
вспоминали каждый раз, когда сталкивались с кодом или техническими
решениями, не имеющими под собой сколько-нибудь простого и
рационального объяснения.
Read more... )
http://www.opennet.ru/base/dev/porting_code.txt.html
http://lex.iki.rssi.ru/~serj/docs/lemmings_ru/lemmings_ru.html
http://pyviy.blogspot.ru/2010/12/gcc.html

Сборка в Ubuntu приложений для Windows


Представим себе ситуацию. Вы дома работаете только в Ubuntu и не
используете Windows, разработку приложений осуществляете с помощью
Qt Creator и библиотеки Qt. Требуется собрать приложение для
Windows (чтобы использовать его, например, на работе). Qt Creator
– кроссплатформенная среда разработки и позволяет выполнить
эту задачу, т.е. собрать приложение для Windows в Ubuntu. Для этого
необходимо один раз настроить свою среду для выполнения такой задачи,
а затем пользоваться.

Read more... )
http://qtlinux.narod.ru/make_for_win.htm
http://habrahabr.ru/post/98131/

Наверное, многие разработчики сталкивались с проблемой выбора или создания окружения для программирования. На мой взгляд, бесплатное окружение на основе порта компилятора gcc (MinGW) и какая-нибудь IDE, совместимая с ним – наиболее приемлемый выбор.
Read more... )


http://exlmoto.ru/mingw-development-environment/
http://www.linux.org.ru/forum/desktop/10819573
https://msys2.github.io/

1.5. Установка Subversion (svn)


Официальный сайт svn: http://subversion.apache.org/

Subversion или svn, это свободная централизованная система управления версиями, официально выпущенная в 2004 году компанией CollabNet Inc.

Read more... )
http://exlmoto.ru/mingw-development-environment/

2.3. Компиляция и установка библиотек SDL-окружения


По своей структуре библиотека SDL не является полноценным SDK (Software Development Kit) для разработчиков игр, так как не включает в себя высокоуровневые функции для работы с графикой, звуком и внешними устройствами. Read more... )


http://exlmoto.ru/mingw-development-environment/

2.14. Компиляция и установка библиотеки OpenAL


Описание:

Официальный сайт: http://connect.creativelabs.com/openal/

OpenAL или Open Audio Library, это свободно распространяемая кроссплатформенная библиотека API для работы с аудиоданными. Ключевая особенность – работа со звуком в 3D пространстве и использование эффектов EAX. Библиотека разработана фирмой Loki Software и в настоящий поддерживается компанией Creative.

Read more... )
http://exlmoto.ru/mingw-development-environment/

Profile

uzverss: (Default)
uzverss

December 2024

S M T W T F S
12345 67
891011121314
15161718192021
22232425262728
293031    

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 19th, 2025 03:29 pm
Powered by Dreamwidth Studios