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

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +24 -22
Dockerfile CHANGED
@@ -1,7 +1,7 @@
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 \
@@ -9,10 +9,9 @@ RUN apt-get update && apt-get install -y \
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 && \
@@ -28,32 +27,36 @@ 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 \
@@ -61,13 +64,12 @@ RUN $CC $CFLAGS \
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"]
 
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 \
 
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 && \
 
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 \
 
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"]