Spaces:
Paused
Paused
Update Dockerfile
Browse files- Dockerfile +26 -30
Dockerfile
CHANGED
|
@@ -1,23 +1,19 @@
|
|
| 1 |
# Используем Python 3.11 (как в Chaquopy 16.1)
|
| 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 |
WORKDIR /build
|
| 13 |
|
| 14 |
-
# 1.
|
| 15 |
ENV NDK_VERSION=r26b
|
| 16 |
RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
|
| 17 |
unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
|
| 18 |
rm android-ndk-${NDK_VERSION}-linux.zip
|
| 19 |
|
| 20 |
-
# Настройка
|
| 21 |
ENV NDK_ROOT=/build/android-ndk-${NDK_VERSION}
|
| 22 |
ENV TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
|
| 23 |
ENV API_LEVEL=30
|
|
@@ -27,49 +23,49 @@ ENV LD="$TOOLCHAIN/bin/ld"
|
|
| 27 |
ENV AR="$TOOLCHAIN/bin/llvm-ar"
|
| 28 |
ENV STRIP="$TOOLCHAIN/bin/llvm-strip"
|
| 29 |
|
| 30 |
-
#
|
| 31 |
-
ENV CFLAGS="-fPIC -O3 -Wall -target ${TARGET}${API_LEVEL} -Wno-unused-command-line-argument"
|
| 32 |
-
ENV LDFLAGS="-shared -L. -Wl,-soname,MandreLib.so"
|
| 33 |
-
|
| 34 |
-
# 2. Установка Cython
|
| 35 |
RUN pip install cython
|
| 36 |
|
| 37 |
-
# 3.
|
| 38 |
RUN wget -O MandreLib.py https://github.com/coidarashka/MandreLib/raw/refs/heads/main/MandreLib.py
|
| 39 |
|
| 40 |
-
#
|
| 41 |
-
# 4. ПАТЧИНГ ДЛЯ CYTHON (FIX ОШИБОК)
|
| 42 |
-
# ==========================================
|
| 43 |
-
# Мы добавляем заглушки для 'java' и 'OutOfMemoryError', чтобы Cython не ругался при компиляции.
|
| 44 |
-
# При запуске на Android try/except блоки позволят работать реальным модулям.
|
| 45 |
RUN echo "Creating compile-time mocks..." && \
|
| 46 |
-
printf "try:\n import java\nexcept ImportError:\n
|
| 47 |
cat header_patch.py MandreLib.py > MandreLib_patched.py && \
|
| 48 |
mv MandreLib_patched.py MandreLib.py
|
| 49 |
|
| 50 |
-
# 5.
|
| 51 |
-
# -3: Python 3 syntax
|
| 52 |
-
# --embed: НЕ используем, так как нам нужна библиотека, а не исполняемый файл
|
| 53 |
RUN cython -3 MandreLib.py -o MandreLib.c
|
| 54 |
|
| 55 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 56 |
ENV PYTHON_INCLUDE=/usr/local/include/python3.11
|
|
|
|
| 57 |
|
| 58 |
-
#
|
| 59 |
-
# -Wl,--allow-shlib-undefined: Разрешаем нелинокованные символы (Python API будет предоставлен хост-приложением ExteraGram)
|
| 60 |
RUN $CC $CFLAGS \
|
| 61 |
-I$PYTHON_INCLUDE \
|
|
|
|
| 62 |
-o MandreLib.so \
|
| 63 |
MandreLib.c \
|
| 64 |
-
|
| 65 |
-Wl,--allow-shlib-undefined
|
| 66 |
|
| 67 |
-
# 8.
|
| 68 |
RUN $STRIP --strip-unneeded MandreLib.so
|
| 69 |
|
| 70 |
-
# 9.
|
| 71 |
RUN mkdir /output && mv MandreLib.so /output/MandreLib.so
|
| 72 |
WORKDIR /output
|
| 73 |
-
|
| 74 |
-
# Запускаем сервер, чтобы можно было скачать файл из Space
|
| 75 |
CMD ["python3", "-m", "http.server", "7860"]
|
|
|
|
| 1 |
# Используем Python 3.11 (как в Chaquopy 16.1)
|
| 2 |
FROM python:3.11-slim
|
| 3 |
|
|
|
|
| 4 |
RUN apt-get update && apt-get install -y \
|
| 5 |
+
wget unzip git build-essential \
|
|
|
|
|
|
|
|
|
|
| 6 |
&& rm -rf /var/lib/apt/lists/*
|
| 7 |
|
| 8 |
WORKDIR /build
|
| 9 |
|
| 10 |
+
# 1. NDK
|
| 11 |
ENV NDK_VERSION=r26b
|
| 12 |
RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
|
| 13 |
unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
|
| 14 |
rm android-ndk-${NDK_VERSION}-linux.zip
|
| 15 |
|
| 16 |
+
# Настройка Toolchain
|
| 17 |
ENV NDK_ROOT=/build/android-ndk-${NDK_VERSION}
|
| 18 |
ENV TOOLCHAIN=$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64
|
| 19 |
ENV API_LEVEL=30
|
|
|
|
| 23 |
ENV AR="$TOOLCHAIN/bin/llvm-ar"
|
| 24 |
ENV STRIP="$TOOLCHAIN/bin/llvm-strip"
|
| 25 |
|
| 26 |
+
# 2. Cython
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
RUN pip install cython
|
| 28 |
|
| 29 |
+
# 3. Скачиваем библиотеку
|
| 30 |
RUN wget -O MandreLib.py https://github.com/coidarashka/MandreLib/raw/refs/heads/main/MandreLib.py
|
| 31 |
|
| 32 |
+
# 4. ПАТЧ (Mocks для компиляции)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
RUN echo "Creating compile-time mocks..." && \
|
| 34 |
+
printf "try:\n import java\nexcept ImportError:\n class _JavaMock:\n def __getattr__(self, name): return _JavaMock()\n def __call__(self, *args, **kwargs): return _JavaMock()\n @property\n def lang(self): return _JavaMock()\n java = _JavaMock()\n\ntry:\n OutOfMemoryError\nexcept NameError:\n class OutOfMemoryError(MemoryError): pass\n\n" > header_patch.py && \
|
| 35 |
cat header_patch.py MandreLib.py > MandreLib_patched.py && \
|
| 36 |
mv MandreLib_patched.py MandreLib.py
|
| 37 |
|
| 38 |
+
# 5. Генерация C кода
|
|
|
|
|
|
|
| 39 |
RUN cython -3 MandreLib.py -o MandreLib.c
|
| 40 |
|
| 41 |
+
# =======================================================
|
| 42 |
+
# 6. TRICK: Создаем фейковую libpython3.11.so (Stub)
|
| 43 |
+
# =======================================================
|
| 44 |
+
# Мы создаем пустую библиотеку под ARM64. Это нужно, чтобы линковщик (ld)
|
| 45 |
+
# согласился прописать зависимость "NEEDED libpython3.11.so" в наш файл.
|
| 46 |
+
RUN echo "int Py_Main(void){return 0;}" > stub.c && \
|
| 47 |
+
$CC -shared -o libpython3.11.so stub.c
|
| 48 |
+
|
| 49 |
+
# 7. Компиляция MandreLib.so
|
| 50 |
+
# -L. : Искать библиотеки в текущей папке
|
| 51 |
+
# -lpython3.11 : Слинковать с нашей фейковой библиотекой
|
| 52 |
+
# -Wl,--allow-shlib-undefined : Игнорировать, что в фейковой либе нет реальных символов (Py_None и т.д.)
|
| 53 |
ENV PYTHON_INCLUDE=/usr/local/include/python3.11
|
| 54 |
+
ENV CFLAGS="-fPIC -O3 -Wall -target ${TARGET}${API_LEVEL} -Wno-unused-command-line-argument"
|
| 55 |
|
| 56 |
+
# Важно: Мы НЕ используем -undefined dynamic_lookup, мы делаем явную линковку
|
|
|
|
| 57 |
RUN $CC $CFLAGS \
|
| 58 |
-I$PYTHON_INCLUDE \
|
| 59 |
+
-L. -lpython3.11 \
|
| 60 |
-o MandreLib.so \
|
| 61 |
MandreLib.c \
|
| 62 |
+
-shared \
|
| 63 |
-Wl,--allow-shlib-undefined
|
| 64 |
|
| 65 |
+
# 8. Чистка
|
| 66 |
RUN $STRIP --strip-unneeded MandreLib.so
|
| 67 |
|
| 68 |
+
# 9. Финал
|
| 69 |
RUN mkdir /output && mv MandreLib.so /output/MandreLib.so
|
| 70 |
WORKDIR /output
|
|
|
|
|
|
|
| 71 |
CMD ["python3", "-m", "http.server", "7860"]
|