sterepando commited on
Commit
4dc8ccb
·
verified ·
1 Parent(s): a284dce

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +32 -21
Dockerfile CHANGED
@@ -1,17 +1,16 @@
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 \
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
- # ВАЖНО: OpenSSL требует именно это имя переменной
15
  ENV ANDROID_NDK_ROOT=/opt/android-ndk
16
  ENV PATH=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
17
 
@@ -28,7 +27,6 @@ ENV AR="llvm-ar"
28
  ENV RANLIB="llvm-ranlib"
29
  ENV STRIP="llvm-strip"
30
  ENV PREFIX=/opt/android-libs
31
-
32
  RUN mkdir -p $PREFIX
33
 
34
  # 3. Сборка ZLIB (Static + fPIC)
@@ -36,11 +34,13 @@ WORKDIR /build/zlib
36
  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 && \
37
  CFLAGS="-fPIC" ./configure --prefix=$PREFIX --static && make -j4 install
38
 
39
- # 4. Сборка OpenSSL (Static + fPIC) - ТЕПЕРЬ С ANDROID_NDK_ROOT
 
40
  WORKDIR /build/openssl
41
  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 && \
42
- ./Configure android-arm64 -D__ANDROID_API__=${ANDROID_API} --prefix=$PREFIX no-shared -fPIC && \
43
- make -j4 install_sw
 
44
 
45
  # 5. Сборка LibCurl (Static + fPIC)
46
  WORKDIR /build/curl
@@ -50,7 +50,8 @@ RUN wget -q https://curl.se/download/curl-8.5.0.tar.gz && tar -xf curl-8.5.0.tar
50
  CFLAGS="-fPIC -I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" && \
51
  make -j4 install
52
 
53
- # 6. Подготовка Python 3.11.10 (Headers + Stub libpython)
 
54
  WORKDIR /opt/python-android
55
  RUN wget -q https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tgz && tar -xf Python-3.11.10.tgz
56
  WORKDIR /opt/python-android/Python-3.11.10
@@ -58,43 +59,53 @@ RUN ./configure --host=aarch64-linux-android --build=x86_64-linux-gnu \
58
  --with-build-python=python3 --enable-shared --without-ensurepip \
59
  ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no \
60
  CC="$CC" CXX="$CXX" AR="$AR" RANLIB="$RANLIB"
 
61
  RUN make -j4 libpython3.11.so
62
 
63
- # 7. СБОРКА ПАКЕТОВ
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
- # Скрипт сборки wheels с линковкой libpython
71
- # Флаг -Wl,-undefined,dynamic_lookup или явная линковка с libpython3.11.so решит проблему _Py_NoneStruct
72
  RUN echo '#!/bin/bash\n\
73
  export CC="aarch64-linux-android'${ANDROID_API}'-clang"\n\
74
  export PYTHON_ROOT="/opt/python-android/Python-3.11.10"\n\
 
75
  export LDSHARED="'$CC' -shared -L$PYTHON_ROOT -lpython3.11"\n\
76
  export CFLAGS="-I$PYTHON_ROOT/Include -I$PYTHON_ROOT -I'$PREFIX'/include -fPIC -DANDROID"\n\
77
  export LDFLAGS="-L$PYTHON_ROOT -L'$PREFIX'/lib -lpython3.11 -lcurl -lssl -lcrypto -lz"\n\
78
  \n\
79
- echo "--- Building PyCurl ---"\n\
80
  export PYCURL_CURL_CONFIG=/usr/bin/curl-config-android\n\
81
  export PYCURL_SSL_LIBRARY=openssl\n\
82
  pip wheel pycurl --no-binary :all: --no-deps -w dist/ --plat-name android_arm64\n\
83
  \n\
84
- echo "--- Building wget ---"\n\
85
- pip wheel wget --no-binary :all: --no-deps -w dist/ --plat-name android_arm64' > build.sh
 
 
 
86
 
87
  RUN chmod +x build.sh && ./build.sh
88
 
89
- # 8. Финальное переименование
90
  WORKDIR /output
91
  RUN cd /build/wheels/dist && \
92
  for file in *.whl; do \
93
- # Жестко задаем архитектурный тег для Chaquopy
94
- TAG="cp311-cp311-android_21-30_arm64_v8a" && \
95
- BASE=$(echo $file | cut -d"-" -f1,2) && \
96
- mv "$file" "/output/${BASE}-${TAG}.whl"; \
 
97
  done
98
 
99
- # 9. Выдача
 
 
 
 
 
100
  CMD ["python3", "-m", "http.server", "7860", "--directory", "/output"]
 
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
 
 
27
  ENV RANLIB="llvm-ranlib"
28
  ENV STRIP="llvm-strip"
29
  ENV PREFIX=/opt/android-libs
 
30
  RUN mkdir -p $PREFIX
31
 
32
  # 3. Сборка ZLIB (Static + fPIC)
 
34
  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 && \
35
  CFLAGS="-fPIC" ./configure --prefix=$PREFIX --static && make -j4 install
36
 
37
+ # 4. Сборка OpenSSL (Static + fPIC)
38
+ # no-apps и no-tests критичны для кросс-компиляции
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
 
50
  CFLAGS="-fPIC -I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" && \
51
  make -j4 install
52
 
53
+ # 6. СБОРКА РЕАЛЬНОГО PYTHON 3.11.10 ДЛЯ ANDROID
54
+ # Это НЕ заглушка. Нам нужна libpython3.11.so для линковки расширений.
55
  WORKDIR /opt/python-android
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-android/Python-3.11.10
 
59
  --with-build-python=python3 --enable-shared --without-ensurepip \
60
  ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no \
61
  CC="$CC" CXX="$CXX" AR="$AR" RANLIB="$RANLIB"
62
+ # Собираем библиотеку
63
  RUN make -j4 libpython3.11.so
64
 
65
+ # 7. СБОРКА WHEELS
66
  WORKDIR /build/wheels
67
  RUN pip install wheel setuptools
68
 
69
+ # Fake curl-config (нужен для парсинга версий в setup.py)
70
  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
71
 
72
+ # Скрипт сборки
 
73
  RUN echo '#!/bin/bash\n\
74
  export CC="aarch64-linux-android'${ANDROID_API}'-clang"\n\
75
  export PYTHON_ROOT="/opt/python-android/Python-3.11.10"\n\
76
+ # СУПЕР ВАЖНО: Линкуем pycurl с реальной либой питона, которую мы только что собрали\n\
77
  export LDSHARED="'$CC' -shared -L$PYTHON_ROOT -lpython3.11"\n\
78
  export CFLAGS="-I$PYTHON_ROOT/Include -I$PYTHON_ROOT -I'$PREFIX'/include -fPIC -DANDROID"\n\
79
  export LDFLAGS="-L$PYTHON_ROOT -L'$PREFIX'/lib -lpython3.11 -lcurl -lssl -lcrypto -lz"\n\
80
  \n\
81
+ echo "--- Сборка PyCurl ---"\n\
82
  export PYCURL_CURL_CONFIG=/usr/bin/curl-config-android\n\
83
  export PYCURL_SSL_LIBRARY=openssl\n\
84
  pip wheel pycurl --no-binary :all: --no-deps -w dist/ --plat-name android_arm64\n\
85
  \n\
86
+ echo "--- Сборка wget ---"\n\
87
+ pip wheel wget --no-binary :all: --no-deps -w dist/ --plat-name android_arm64\n\
88
+ \n\
89
+ echo "--- Сборка PyCryptodome ---"\n\
90
+ pip wheel pycryptodome --no-binary :all: --no-deps -w dist/ --plat-name android_arm64' > build.sh
91
 
92
  RUN chmod +x build.sh && ./build.sh
93
 
94
+ # 8. ПЕРЕИМЕНОВАНИЕ И ПРОВЕРКА
95
  WORKDIR /output
96
  RUN cd /build/wheels/dist && \
97
  for file in *.whl; do \
98
+ NAME=$(echo $file | cut -d"-" -f1) && \
99
+ VER=$(echo $file | cut -d"-" -f2) && \
100
+ # Финальный формат: имя-версия-cp311-cp311-android_21_30_arm64_v8a.whl\n\
101
+ FINAL_NAME="${NAME}-${VER}-cp311-cp311-android_21_30_arm64_v8a.whl" && \
102
+ mv "$file" "/output/$FINAL_NAME"; \
103
  done
104
 
105
+ # Дополнительно: выведем инфу о линковке в логи для проверки (readelf)
106
+ RUN echo "Checking pycurl.so linkage:" && \
107
+ unzip -p /output/pycurl-*.whl *.so > /tmp/pycurl.so && \
108
+ llvm-readelf -d /tmp/pycurl.so | grep "NEEDED"
109
+
110
+ # 9. Запуск сервера
111
  CMD ["python3", "-m", "http.server", "7860", "--directory", "/output"]