Spaces:
Paused
Paused
Update Dockerfile
Browse files- Dockerfile +8 -12
Dockerfile
CHANGED
|
@@ -29,6 +29,8 @@ ENV ANDROID_API=24
|
|
| 29 |
ENV ANDROID_ARCH=aarch64
|
| 30 |
ENV ANDROID_HOME=${HOME}/android-sdk
|
| 31 |
ENV NDK_HOME=${HOME}/android-ndk
|
|
|
|
|
|
|
| 32 |
ENV PYTHON_VERSION=3.11.9
|
| 33 |
ENV OPENSSL_VERSION=3.3.0
|
| 34 |
ENV RUSTUP_HOME=${HOME}/.rustup
|
|
@@ -45,6 +47,7 @@ RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-
|
|
| 45 |
mv android-ndk-${NDK_VERSION} ${NDK_HOME} && \
|
| 46 |
rm android-ndk-${NDK_VERSION}-linux.zip
|
| 47 |
|
|
|
|
| 48 |
ENV TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
|
| 49 |
ENV PATH=${TOOLCHAIN}/bin:$PATH
|
| 50 |
ENV TARGET=${ANDROID_ARCH}-linux-android${ANDROID_API}
|
|
@@ -67,6 +70,8 @@ RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz &&
|
|
| 67 |
tar -xf openssl-${OPENSSL_VERSION}.tar.gz
|
| 68 |
|
| 69 |
WORKDIR ${WORK_DIR}/openssl-${OPENSSL_VERSION}
|
|
|
|
|
|
|
| 70 |
RUN ./Configure android-arm64 \
|
| 71 |
-D__ANDROID_API__=${ANDROID_API} \
|
| 72 |
--prefix=${WORK_DIR}/openssl-install \
|
|
@@ -123,7 +128,6 @@ RUN cp ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-l
|
|
| 123 |
USER user
|
| 124 |
|
| 125 |
# 7. УСТАНОВКА ИНСТРУМЕНТОВ СБОРКИ (Build Backends)
|
| 126 |
-
# Это исправляет ошибки "Cannot import mesonpy", "maturin not found" и т.д.
|
| 127 |
RUN pip install --upgrade pip && \
|
| 128 |
pip install --user --no-cache-dir \
|
| 129 |
Cython wheel setuptools \
|
|
@@ -155,7 +159,6 @@ WORKDIR ${OUTPUT_DIR}
|
|
| 155 |
# 9. Скрипт сборки
|
| 156 |
RUN echo "#!/bin/bash" > build.sh && \
|
| 157 |
echo "set -e" >> build.sh && \
|
| 158 |
-
# Специфичные настройки для Llama.cpp
|
| 159 |
echo "export CMAKE_ARGS=\"-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-${ANDROID_API} -DCMAKE_TOOLCHAIN_FILE=${NDK_HOME}/build/cmake/android.toolchain.cmake -DGGML_OPENCL=OFF -DGGML_VULKAN=OFF\"" >> build.sh && \
|
| 160 |
echo "" >> build.sh && \
|
| 161 |
echo "build_pkg() {" >> build.sh && \
|
|
@@ -163,20 +166,14 @@ RUN echo "#!/bin/bash" > build.sh && \
|
|
| 163 |
echo " echo \"--------------------------------------------------\"" >> build.sh && \
|
| 164 |
echo " echo \"BUILDING: \$PKG\"" >> build.sh && \
|
| 165 |
echo " echo \"--------------------------------------------------\"" >> build.sh && \
|
| 166 |
-
# Используем --no-build-isolation и --no-deps, так как мы сами контролируем окружение
|
| 167 |
-
# и не хотим, чтобы pip пытался создать изолированное окружение без наших CFLAGS
|
| 168 |
echo " python3 -m pip wheel \"\$PKG\" --wheel-dir=${OUTPUT_DIR} --no-binary=:all: --no-build-isolation --no-deps -v || echo \"FAILED: \$PKG\"" >> build.sh && \
|
| 169 |
echo "}" >> build.sh && \
|
| 170 |
echo "" >> build.sh && \
|
| 171 |
-
#
|
| 172 |
-
# 1. Сначала Numpy (версия 1.26.4 стабильнее для Android чем 2.0)
|
| 173 |
echo "build_pkg 'numpy<2.0'" >> build.sh && \
|
| 174 |
-
# 2. Простые пакеты
|
| 175 |
echo "build_pkg 'flask'" >> build.sh && \
|
| 176 |
echo "build_pkg 'flask_compress'" >> build.sh && \
|
| 177 |
-
# 3. Rust-зависимые
|
| 178 |
echo "build_pkg 'tokenizers'" >> build.sh && \
|
| 179 |
-
# 4. Тяжелые зависимости
|
| 180 |
echo "build_pkg 'transformers'" >> build.sh && \
|
| 181 |
echo "build_pkg 'llama-cpp-python'" >> build.sh && \
|
| 182 |
echo "build_pkg 'soundfile'" >> build.sh && \
|
|
@@ -186,7 +183,7 @@ RUN echo "#!/bin/bash" > build.sh && \
|
|
| 186 |
# Запуск сборки
|
| 187 |
RUN ./build.sh
|
| 188 |
|
| 189 |
-
# 10. Патчинг (исправление имени библиотеки Python
|
| 190 |
RUN echo "Patching wheels..." && \
|
| 191 |
for whl in *.whl; do \
|
| 192 |
if [ -f "$whl" ]; then \
|
|
@@ -194,7 +191,6 @@ RUN echo "Patching wheels..." && \
|
|
| 194 |
mkdir -p tmp_wheel; \
|
| 195 |
unzip -q "$whl" -d tmp_wheel; \
|
| 196 |
find tmp_wheel -name "*.so" | while read so_file; do \
|
| 197 |
-
# Если библиотека ссылается на libpython3.11.so.1.0, меняем на libpython3.11.so (стандарт Android)
|
| 198 |
if patchelf --print-needed "$so_file" | grep -q "libpython3.11.so.1.0"; then \
|
| 199 |
echo "Patching $so_file"; \
|
| 200 |
patchelf --replace-needed "libpython3.11.so.1.0" "libpython3.11.so" "$so_file"; \
|
|
@@ -204,7 +200,7 @@ RUN echo "Patching wheels..." && \
|
|
| 204 |
fi; \
|
| 205 |
done
|
| 206 |
|
| 207 |
-
# 11. Переименование
|
| 208 |
RUN for f in *.whl; do \
|
| 209 |
if [ -f "$f" ]; then \
|
| 210 |
new_name=$(echo "$f" | sed 's/linux_aarch64/android_24_arm64_v8a/g'); \
|
|
|
|
| 29 |
ENV ANDROID_ARCH=aarch64
|
| 30 |
ENV ANDROID_HOME=${HOME}/android-sdk
|
| 31 |
ENV NDK_HOME=${HOME}/android-ndk
|
| 32 |
+
# !!! ВАЖНО: Дублируем переменную, так как OpenSSL и некоторые тулы ищут именно её
|
| 33 |
+
ENV ANDROID_NDK_ROOT=${HOME}/android-ndk
|
| 34 |
ENV PYTHON_VERSION=3.11.9
|
| 35 |
ENV OPENSSL_VERSION=3.3.0
|
| 36 |
ENV RUSTUP_HOME=${HOME}/.rustup
|
|
|
|
| 47 |
mv android-ndk-${NDK_VERSION} ${NDK_HOME} && \
|
| 48 |
rm android-ndk-${NDK_VERSION}-linux.zip
|
| 49 |
|
| 50 |
+
# Настройка путей тулчейна
|
| 51 |
ENV TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
|
| 52 |
ENV PATH=${TOOLCHAIN}/bin:$PATH
|
| 53 |
ENV TARGET=${ANDROID_ARCH}-linux-android${ANDROID_API}
|
|
|
|
| 70 |
tar -xf openssl-${OPENSSL_VERSION}.tar.gz
|
| 71 |
|
| 72 |
WORKDIR ${WORK_DIR}/openssl-${OPENSSL_VERSION}
|
| 73 |
+
# Явно добавляем PATH к тулчейну в начало, чтобы perl-скрипт Configure нашел clang
|
| 74 |
+
ENV PATH=${TOOLCHAIN}/bin:$PATH
|
| 75 |
RUN ./Configure android-arm64 \
|
| 76 |
-D__ANDROID_API__=${ANDROID_API} \
|
| 77 |
--prefix=${WORK_DIR}/openssl-install \
|
|
|
|
| 128 |
USER user
|
| 129 |
|
| 130 |
# 7. УСТАНОВКА ИНСТРУМЕНТОВ СБОРКИ (Build Backends)
|
|
|
|
| 131 |
RUN pip install --upgrade pip && \
|
| 132 |
pip install --user --no-cache-dir \
|
| 133 |
Cython wheel setuptools \
|
|
|
|
| 159 |
# 9. Скрипт сборки
|
| 160 |
RUN echo "#!/bin/bash" > build.sh && \
|
| 161 |
echo "set -e" >> build.sh && \
|
|
|
|
| 162 |
echo "export CMAKE_ARGS=\"-DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-${ANDROID_API} -DCMAKE_TOOLCHAIN_FILE=${NDK_HOME}/build/cmake/android.toolchain.cmake -DGGML_OPENCL=OFF -DGGML_VULKAN=OFF\"" >> build.sh && \
|
| 163 |
echo "" >> build.sh && \
|
| 164 |
echo "build_pkg() {" >> build.sh && \
|
|
|
|
| 166 |
echo " echo \"--------------------------------------------------\"" >> build.sh && \
|
| 167 |
echo " echo \"BUILDING: \$PKG\"" >> build.sh && \
|
| 168 |
echo " echo \"--------------------------------------------------\"" >> build.sh && \
|
|
|
|
|
|
|
| 169 |
echo " python3 -m pip wheel \"\$PKG\" --wheel-dir=${OUTPUT_DIR} --no-binary=:all: --no-build-isolation --no-deps -v || echo \"FAILED: \$PKG\"" >> build.sh && \
|
| 170 |
echo "}" >> build.sh && \
|
| 171 |
echo "" >> build.sh && \
|
| 172 |
+
# Сборка пакетов (порядок важен)
|
|
|
|
| 173 |
echo "build_pkg 'numpy<2.0'" >> build.sh && \
|
|
|
|
| 174 |
echo "build_pkg 'flask'" >> build.sh && \
|
| 175 |
echo "build_pkg 'flask_compress'" >> build.sh && \
|
|
|
|
| 176 |
echo "build_pkg 'tokenizers'" >> build.sh && \
|
|
|
|
| 177 |
echo "build_pkg 'transformers'" >> build.sh && \
|
| 178 |
echo "build_pkg 'llama-cpp-python'" >> build.sh && \
|
| 179 |
echo "build_pkg 'soundfile'" >> build.sh && \
|
|
|
|
| 183 |
# Запуск сборки
|
| 184 |
RUN ./build.sh
|
| 185 |
|
| 186 |
+
# 10. Патчинг (исправление имени библиотеки Python)
|
| 187 |
RUN echo "Patching wheels..." && \
|
| 188 |
for whl in *.whl; do \
|
| 189 |
if [ -f "$whl" ]; then \
|
|
|
|
| 191 |
mkdir -p tmp_wheel; \
|
| 192 |
unzip -q "$whl" -d tmp_wheel; \
|
| 193 |
find tmp_wheel -name "*.so" | while read so_file; do \
|
|
|
|
| 194 |
if patchelf --print-needed "$so_file" | grep -q "libpython3.11.so.1.0"; then \
|
| 195 |
echo "Patching $so_file"; \
|
| 196 |
patchelf --replace-needed "libpython3.11.so.1.0" "libpython3.11.so" "$so_file"; \
|
|
|
|
| 200 |
fi; \
|
| 201 |
done
|
| 202 |
|
| 203 |
+
# 11. Переименование
|
| 204 |
RUN for f in *.whl; do \
|
| 205 |
if [ -f "$f" ]; then \
|
| 206 |
new_name=$(echo "$f" | sed 's/linux_aarch64/android_24_arm64_v8a/g'); \
|