sterepando commited on
Commit
4e28415
·
verified ·
1 Parent(s): 01fca51

Update Dockerfile

Browse files
Files changed (1) hide show
  1. 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. Скачивание NDK r26b
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
- # Флаги: -fPIC обязательно для .so, отключаем строгие проверки
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 # Mock for compilation\n class _JavaMock:\n def __getattr__(self, name):\n return _JavaMock()\n def __call__(self, *args, **kwargs):\n 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 && \
47
  cat header_patch.py MandreLib.py > MandreLib_patched.py && \
48
  mv MandreLib_patched.py MandreLib.py
49
 
50
- # 5. Транспиляция Python -> C
51
- # -3: Python 3 syntax
52
- # --embed: НЕ используем, так как нам нужна библиотека, а не исполняемый файл
53
  RUN cython -3 MandreLib.py -o MandreLib.c
54
 
55
- # 6. Получение путей к заголовкам Python
 
 
 
 
 
 
 
 
 
 
 
56
  ENV PYTHON_INCLUDE=/usr/local/include/python3.11
 
57
 
58
- # 7. Компиляция C -> SO
59
- # -Wl,--allow-shlib-undefined: Разрешаем нелинокованные символы (Python API будет предоставлен хост-приложением ExteraGram)
60
  RUN $CC $CFLAGS \
61
  -I$PYTHON_INCLUDE \
 
62
  -o MandreLib.so \
63
  MandreLib.c \
64
- $LDFLAGS \
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"]