sterepando commited on
Commit
e8d6808
·
verified ·
1 Parent(s): 565d09a

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +56 -97
Dockerfile CHANGED
@@ -1,114 +1,73 @@
1
- FROM python:3.11.10-bookworm
 
2
 
3
- # 1. Системные зависимости
4
- ENV DEBIAN_FRONTEND=noninteractive
5
  RUN apt-get update && apt-get install -y \
6
- wget unzip build-essential git pkg-config \
7
- automake autoconf libtool zip sed \
 
 
8
  && rm -rf /var/lib/apt/lists/*
9
 
10
- # 2. Настройка NDK (r25c / API 30)
11
- ENV ANDROID_NDK_VERSION=r25c
12
- ENV ANDROID_API=30
13
- ENV NDK_ROOT=/opt/android-ndk
14
- ENV ANDROID_NDK_ROOT=/opt/android-ndk
15
- ENV PATH=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
16
 
17
- WORKDIR /opt
18
- RUN wget -q https://dl.google.com/android/repository/android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \
19
- unzip -q android-ndk-${ANDROID_NDK_VERSION}-linux.zip && \
20
- mv android-ndk-${ANDROID_NDK_VERSION} android-ndk && \
21
- rm android-ndk-${ANDROID_NDK_VERSION}-linux.zip
22
 
23
- # Инструменты компиляции
24
- ENV CC="aarch64-linux-android${ANDROID_API}-clang"
25
- ENV CXX="aarch64-linux-android${ANDROID_API}-clang++"
26
- ENV AR="llvm-ar"
27
- ENV RANLIB="llvm-ranlib"
28
- ENV STRIP="llvm-strip"
29
- ENV READELF="llvm-readelf"
30
- ENV PREFIX=/opt/android-libs
31
- RUN mkdir -p $PREFIX
32
 
33
- # 3. ZLIB (Static + fPIC)
34
- WORKDIR /build/zlib
35
- RUN wget -q https://zlib.net/zlib-1.3.1.tar.gz && tar -xf zlib-1.3.1.tar.gz && cd zlib-1.3.1 && \
36
- CFLAGS="-fPIC" ./configure --prefix=$PREFIX --static && make -j4 install
37
 
38
- # 4. OpenSSL (Static + fPIC)
39
- WORKDIR /build/openssl
40
- RUN wget -q https://www.openssl.org/source/openssl-3.2.0.tar.gz && tar -xf openssl-3.2.0.tar.gz && cd openssl-3.2.0 && \
41
- ./Configure android-arm64 -D__ANDROID_API__=${ANDROID_API} --prefix=$PREFIX \
42
- no-shared no-apps no-tests no-docs -fPIC && \
43
- make -j4 && make install_sw
44
 
45
- # 5. LibCurl (Static + fPIC)
46
- WORKDIR /build/curl
47
- RUN wget -q https://curl.se/download/curl-8.5.0.tar.gz && tar -xf curl-8.5.0.tar.gz && cd curl-8.5.0 && \
48
- ./configure --host=aarch64-linux-android --prefix=$PREFIX --disable-shared --enable-static \
49
- --with-openssl=$PREFIX --with-zlib=$PREFIX --disable-ldap \
50
- CFLAGS="-fPIC -I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" && \
51
- make -j4 install
52
 
53
- # 6. ПОДГОТОВКА ЗАГОЛОВКОВ PYTHON 3.11.10
54
- # Нам НЕ нужна собранная либа libpython, только хидеры и pyconfig.h
55
- WORKDIR /opt/python-src
56
- RUN wget -q https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tgz && tar -xf Python-3.11.10.tgz
57
- WORKDIR /opt/python-src/Python-3.11.10
58
- RUN ./configure --host=aarch64-linux-android --build=x86_64-linux-gnu \
59
- --with-build-python=python3 --without-ensurepip --disable-ipv6 \
60
- ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no ac_cv_buggy_getaddrinfo=no \
61
- CC="$CC" READELF="$READELF"
62
 
63
- # 7. СБОРКА ПАКЕТОВ (WHEELS)
64
- WORKDIR /build/wheels
65
- RUN pip install wheel setuptools
66
 
67
- # Fake curl-config
68
- RUN echo '#!/bin/bash\ncase "$1" in --version) echo "libcurl 8.5.0";; --features) echo "SSL libz HTTPS";; --libs|--static-libs) echo "-L'$PREFIX'/lib -lcurl -lssl -lcrypto -lz";; --cflags) echo "-I'$PREFIX'/include -DANDROID";; --prefix) echo "'$PREFIX'";; *) exit 0;; esac' > /usr/bin/curl-config-android && chmod +x /usr/bin/curl-config-android
 
69
 
70
- # Скрипт сборки БЕЗ линковки к libpython
71
- RUN echo '#!/bin/bash\n\
72
- export CC="aarch64-linux-android'${ANDROID_API}'-clang"\n\
73
- export PYTHON_INC="/opt/python-src/Python-3.11.10"\n\
74
- \n\
75
- # LDSHARED: только CC и -shared. НИКАКОГО -lpython3.11\n\
76
- export LDSHARED="'$CC' -shared"\n\
77
- \n\
78
- # CFLAGS: только пути к заголовкам\n\
79
- export CFLAGS="-I$PYTHON_INC/Include -I$PYTHON_INC -I'$PREFIX'/include -fPIC -DANDROID"\n\
80
- \n\
81
- # LDFLAGS: только наши статические либы (curl, ssl, z)\n\
82
- export LDFLAGS="-L'$PREFIX'/lib -lcurl -lssl -lcrypto -lz"\n\
83
- \n\
84
- echo "--- Сборка PyCurl ---"\n\
85
- export PYCURL_CURL_CONFIG=/usr/bin/curl-config-android\n\
86
- export PYCURL_SSL_LIBRARY=openssl\n\
87
- pip wheel pycurl --no-binary :all: --no-deps -w dist/\n\
88
- \n\
89
- echo "--- Сборка wget ---"\n\
90
- pip wheel wget --no-binary :all: --no-deps -w dist/\n\
91
- \n\
92
- echo "--- Сборка PyCryptodome ---"\n\
93
- pip wheel pycryptodome --no-binary :all: --no-deps -w dist/' > build.sh
94
 
95
- RUN chmod +x build.sh && ./build.sh
 
96
 
97
- # 8. ПЕРЕИМЕНОВАНИЕ И ПРОВЕРКА (Readelf)
 
 
98
  WORKDIR /output
99
- RUN cd /build/wheels/dist && \
100
- for file in *.whl; do \
101
- NAME=$(echo $file | cut -d"-" -f1) && \
102
- VER=$(echo $file | cut -d"-" -f2) && \
103
- TAG="cp311-cp311-android_21_30_arm64_v8a" && \
104
- mv "$file" "/output/${NAME}-${VER}-${TAG}.whl"; \
105
- done
106
 
107
- # ПРОВЕРКА: В выводе НЕ должно быть libpython3.11.so
108
- RUN echo "!!! ВАЖНАЯ ПРОВЕРКА !!!" && \
109
- unzip -p /output/pycurl-*.whl *.so > /tmp/pycurl.so && \
110
- echo "Dependencies of pycurl.so (should NOT contain libpython):" && \
111
- llvm-readelf -d /tmp/pycurl.so | grep "NEEDED"
112
-
113
- # 9. Выдача
114
- CMD ["python3", "-m", "http.server", "7860", "--directory", "/output"]
 
1
+ # Ипользуем Python 3.11 как базу, так как Chaquopy 16 использует 3.11
2
+ FROM python:3.11-slim
3
 
4
+ # Установка необходимых инструментов
 
5
  RUN apt-get update && apt-get install -y \
6
+ wget \
7
+ unzip \
8
+ git \
9
+ build-essential \
10
  && rm -rf /var/lib/apt/lists/*
11
 
12
+ # Рабочая директория
13
+ WORKDIR /build
 
 
 
 
14
 
15
+ # 1. Скачивание Android NDK (r26b - подходит для Android 30+)
16
+ ENV NDK_VERSION=r26b
17
+ RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
18
+ unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
19
+ rm android-ndk-${NDK_VERSION}-linux.zip
20
 
21
+ # Настройка переменных окружения для кросс-компиляции
22
+ ENV NDK_ROOT=/build/android-ndk-${NDK_VERSION}
23
+ ENV TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
24
+ ENV API_LEVEL=30
25
+ ENV TARGET=aarch64-linux-android
26
+ ENV CC="$TOOLCHAIN/bin/${TARGET}${API_LEVEL}-clang"
27
+ ENV LD="$TOOLCHAIN/bin/ld"
28
+ ENV AR="$TOOLCHAIN/bin/llvm-ar"
29
+ ENV STRIP="$TOOLCHAIN/bin/llvm-strip"
30
 
31
+ # Флаги компиляции для Chaquopy/Python
32
+ # Важно: -fPIC для shared library, отключение ссылок на системный python хоста
33
+ ENV CFLAGS="-fPIC -O3 -Wall -target ${TARGET}${API_LEVEL}"
34
+ ENV LDFLAGS="-shared -L. -Wl,-soname,MandreLib.so"
35
 
36
+ # 2. Установка Cython
37
+ RUN pip install cython
 
 
 
 
38
 
39
+ # 3. Скачивание MandreLib
40
+ # Мы скачиваем сырой файл
41
+ RUN wget -O MandreLib.py https://github.com/coidarashka/MandreLib/raw/refs/heads/main/MandreLib.py
 
 
 
 
42
 
43
+ # Исправление импортов для Cython (если нужно)
44
+ # Cython иногда ругается на специфичные динамические вещи, но обычно справляется.
45
+ # Мы создаем setup.py для удобства, но скомпилируем вручную для полного контроля.
 
 
 
 
 
 
46
 
47
+ # 4. Транспиляция Python -> C
48
+ RUN cython -3 MandreLib.py -o MandreLib.c
 
49
 
50
+ # 5. Получение заголовков Python 3.11 (нужны для компиляции C части)
51
+ # Используем те, что есть в контейнере, так как версия совпадает (3.11)
52
+ ENV PYTHON_INCLUDE=/usr/local/include/python3.11
53
 
54
+ # 6. Компиляция C -> SO (Shared Object)
55
+ # Мы не линкуем libpython, так как он уже есть в процессе ExteraGram (Chaquopy)
56
+ # Флаг -undefined dynamic_lookup (или эквивалент для ELF) позволяет оставить символы Python неразрешенными до загрузки
57
+ RUN $CC $CFLAGS \
58
+ -I$PYTHON_INCLUDE \
59
+ -o MandreLib.so \
60
+ MandreLib.c \
61
+ $LDFLAGS \
62
+ -Wl,--allow-shlib-undefined
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
+ # Уменьшаем размер файла
65
+ RUN $STRIP --strip-unneeded MandreLib.so
66
 
67
+ # 7. Финальная команда: Вывод файла при запуске контейнера или сохранение
68
+ # Создаем простой HTTP сервер, чтобы можно было скачать файл, если запустить Space
69
+ RUN mkdir /output && mv MandreLib.so /output/MandreLib.so
70
  WORKDIR /output
 
 
 
 
 
 
 
71
 
72
+ # Запуск простого сервера для скачивания файла
73
+ CMD ["python3", "-m", "http.server", "7860"]