sterepando commited on
Commit
a284dce
·
verified ·
1 Parent(s): 908ec85

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +28 -24
Dockerfile CHANGED
@@ -7,10 +7,12 @@ RUN apt-get update && apt-get install -y \
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
  ENV PATH=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH
15
 
16
  WORKDIR /opt
@@ -24,29 +26,31 @@ ENV CC="aarch64-linux-android${ANDROID_API}-clang"
24
  ENV CXX="aarch64-linux-android${ANDROID_API}-clang++"
25
  ENV AR="llvm-ar"
26
  ENV RANLIB="llvm-ranlib"
 
27
  ENV PREFIX=/opt/android-libs
28
 
29
- # 3. Сборка статических зависимостей (fPIC обязательно)
30
- WORKDIR /build/deps
31
 
32
- # ZLIB
 
33
  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 && \
34
  CFLAGS="-fPIC" ./configure --prefix=$PREFIX --static && make -j4 install
35
 
36
- # OPENSSL
 
37
  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 && \
38
  ./Configure android-arm64 -D__ANDROID_API__=${ANDROID_API} --prefix=$PREFIX no-shared -fPIC && \
39
  make -j4 install_sw
40
 
41
- # CURL
 
42
  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 && \
43
  ./configure --host=aarch64-linux-android --prefix=$PREFIX --disable-shared --enable-static \
44
  --with-openssl=$PREFIX --with-zlib=$PREFIX --disable-ldap \
45
  CFLAGS="-fPIC -I$PREFIX/include" LDFLAGS="-L$PREFIX/lib" && \
46
  make -j4 install
47
 
48
- # 4. ПОДГОТОВКА PYTHON 3.11.10 ДЛЯ АНДРОИД
49
- # Нам нужно собрать "заготовку" питона, чтобы получить libpython3.11.so и правильные хидеры
50
  WORKDIR /opt/python-android
51
  RUN wget -q https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tgz && tar -xf Python-3.11.10.tgz
52
  WORKDIR /opt/python-android/Python-3.11.10
@@ -54,43 +58,43 @@ RUN ./configure --host=aarch64-linux-android --build=x86_64-linux-gnu \
54
  --with-build-python=python3 --enable-shared --without-ensurepip \
55
  ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no \
56
  CC="$CC" CXX="$CXX" AR="$AR" RANLIB="$RANLIB"
57
- # Нам нужна только библиотека и конфиг
58
  RUN make -j4 libpython3.11.so
59
 
60
- # 5. СБОРКА WHEELS (PyCurl & Wget)
61
  WORKDIR /build/wheels
62
  RUN pip install wheel setuptools
63
 
64
- # Создаем скрипт-обманку curl-config
65
  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
66
 
67
- # Сборка
 
68
  RUN echo '#!/bin/bash\n\
69
  export CC="aarch64-linux-android'${ANDROID_API}'-clang"\n\
70
- export LDSHARED="'$CC' -shared -L/opt/python-android/Python-3.11.10 -lpython3.11"\n\
71
- export CFLAGS="-I/opt/python-android/Python-3.11.10/Include -I/opt/python-android/Python-3.11.10 -I'$PREFIX'/include -fPIC -DANDROID"\n\
72
- export LDFLAGS="-L/opt/python-android/Python-3.11.10 -L'$PREFIX'/lib -lpython3.11 -lcurl -lssl -lcrypto -lz"\n\
 
73
  \n\
74
- echo "--- Сборка PyCurl ---"\n\
75
  export PYCURL_CURL_CONFIG=/usr/bin/curl-config-android\n\
76
  export PYCURL_SSL_LIBRARY=openssl\n\
77
- # Мы используем --plat-name, чтобы заставить pip поставить правильный тег\n\
78
  pip wheel pycurl --no-binary :all: --no-deps -w dist/ --plat-name android_arm64\n\
79
  \n\
80
- echo "--- Сборка wget ---"\n\
81
  pip wheel wget --no-binary :all: --no-deps -w dist/ --plat-name android_arm64' > build.sh
82
 
83
  RUN chmod +x build.sh && ./build.sh
84
 
85
- # 6. ПЕРЕИМЕНОВАНИЕ И ВЫДАЧА
86
  WORKDIR /output
87
  RUN cd /build/wheels/dist && \
88
  for file in *.whl; do \
89
- # Меняем linux_x86_64 на твой сп��цифичный тег
90
- NEW_NAME=$(echo $file | sed "s/linux_x86_64/android_21_30_arm64_v8a/g" | sed "s/any/android_21_30_arm64_v8a/g"); \
91
- # Если в имени всё еще нет нужного формата, форсируем его
92
- FINAL_NAME=$(echo $NEW_NAME | cut -d"-" -f1,2)"-cp311-cp311-android_21-30_arm64_v8a.whl"; \
93
- mv "$file" "/output/$FINAL_NAME"; \
94
  done
95
 
 
96
  CMD ["python3", "-m", "http.server", "7860", "--directory", "/output"]
 
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
 
18
  WORKDIR /opt
 
26
  ENV CXX="aarch64-linux-android${ANDROID_API}-clang++"
27
  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)
35
+ 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
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 (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
  --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"]