Spaces:
Paused
Paused
Update Dockerfile
Browse files- Dockerfile +17 -11
Dockerfile
CHANGED
|
@@ -17,7 +17,9 @@ ENV OUTPUT_DIR=/app/wheels
|
|
| 17 |
ENV NDK_VERSION=r26b
|
| 18 |
ENV ANDROID_API=24
|
| 19 |
ENV ANDROID_ARCH=aarch64
|
|
|
|
| 20 |
ENV NDK_HOME=/opt/android-ndk
|
|
|
|
| 21 |
ENV PYTHON_VERSION=3.11.9
|
| 22 |
ENV OPENSSL_VERSION=3.3.0
|
| 23 |
ENV RUSTUP_HOME=/opt/rust
|
|
@@ -26,11 +28,12 @@ ENV PATH=$PATH:/opt/rust/bin
|
|
| 26 |
|
| 27 |
RUN mkdir -p ${WORK_DIR} ${OUTPUT_DIR}
|
| 28 |
|
| 29 |
-
# 3. Установка Rust (для pydantic-core/maturin)
|
| 30 |
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
|
| 31 |
RUN rustup target add aarch64-linux-android
|
| 32 |
|
| 33 |
-
# 4. Установка инструментов сборки
|
|
|
|
| 34 |
RUN pip install --upgrade pip && \
|
| 35 |
pip install --no-cache-dir \
|
| 36 |
Cython wheel setuptools setuptools-scm \
|
|
@@ -40,13 +43,13 @@ RUN pip install --upgrade pip && \
|
|
| 40 |
|
| 41 |
WORKDIR ${WORK_DIR}
|
| 42 |
|
| 43 |
-
# 5.
|
| 44 |
RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
|
| 45 |
unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
|
| 46 |
mv android-ndk-${NDK_VERSION} ${NDK_HOME} && \
|
| 47 |
rm android-ndk-${NDK_VERSION}-linux.zip
|
| 48 |
|
| 49 |
-
# Настройка
|
| 50 |
ENV TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
|
| 51 |
ENV PATH=${TOOLCHAIN}/bin:$PATH
|
| 52 |
ENV TARGET=${ANDROID_ARCH}-linux-android${ANDROID_API}
|
|
@@ -62,13 +65,14 @@ ENV CFLAGS="-target ${TARGET} -fPIC -D__ANDROID__"
|
|
| 62 |
ENV CXXFLAGS="-target ${TARGET} -fPIC -D__ANDROID__"
|
| 63 |
ENV LDFLAGS="-target ${TARGET} -fPIC"
|
| 64 |
|
| 65 |
-
# 6. Сборка OpenSSL
|
| 66 |
WORKDIR ${WORK_DIR}
|
| 67 |
RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz && \
|
| 68 |
tar -xf openssl-${OPENSSL_VERSION}.tar.gz
|
| 69 |
|
| 70 |
WORKDIR ${WORK_DIR}/openssl-${OPENSSL_VERSION}
|
| 71 |
-
|
|
|
|
| 72 |
-D__ANDROID_API__=${ANDROID_API} \
|
| 73 |
--prefix=${WORK_DIR}/openssl-install \
|
| 74 |
--openssldir=${WORK_DIR}/openssl-install \
|
|
@@ -80,7 +84,7 @@ ENV OPENSSL_LIB_DIR=${OPENSSL_DIR}/lib64
|
|
| 80 |
ENV OPENSSL_INCLUDE_DIR=${OPENSSL_DIR}/include
|
| 81 |
ENV OPENSSL_STATIC=1
|
| 82 |
|
| 83 |
-
# 7. Сборка Python (для libpython3.11.so)
|
| 84 |
WORKDIR ${WORK_DIR}
|
| 85 |
RUN wget -q https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \
|
| 86 |
tar -xf Python-${PYTHON_VERSION}.tgz
|
|
@@ -105,7 +109,7 @@ RUN CONFIG_SITE=config.site ./configure \
|
|
| 105 |
make -j$(nproc) libpython3.11.so || true && \
|
| 106 |
make install -i
|
| 107 |
|
| 108 |
-
#
|
| 109 |
RUN mkdir -p ${WORK_DIR}/python-install/lib/python3.11
|
| 110 |
RUN find ${WORK_DIR}/Python-${PYTHON_VERSION} -name "_sysconfigdata*.py" -not -name "*x86_64*" \
|
| 111 |
-exec cp {} ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \;
|
|
@@ -137,14 +141,16 @@ RUN echo "#!/bin/bash" > build.sh && \
|
|
| 137 |
echo "export OPENSSL_STATIC=1" >> build.sh && \
|
| 138 |
echo "" >> build.sh && \
|
| 139 |
echo "echo 'Starting Build...'" >> build.sh && \
|
|
|
|
| 140 |
echo "pip wheel ${TARGET_PACKAGE} --wheel-dir=${OUTPUT_DIR} --no-binary=:all: --no-build-isolation -v" >> build.sh && \
|
| 141 |
chmod +x build.sh
|
| 142 |
|
| 143 |
RUN ./build.sh
|
| 144 |
|
| 145 |
-
# 9. Патчинг
|
| 146 |
RUN echo "Patching wheels..." && \
|
| 147 |
for whl in *.whl; do \
|
|
|
|
| 148 |
mkdir -p tmp_wheel; unzip -q "$whl" -d tmp_wheel; \
|
| 149 |
find tmp_wheel -name "*.so" | while read so_file; do \
|
| 150 |
if patchelf --print-needed "$so_file" | grep -q "libpython3.11.so.1.0"; then \
|
|
@@ -154,7 +160,7 @@ RUN echo "Patching wheels..." && \
|
|
| 154 |
cd tmp_wheel; zip -r -q "../$whl" .; cd ..; rm -rf tmp_wheel; \
|
| 155 |
done
|
| 156 |
|
| 157 |
-
# 10. Переименование
|
| 158 |
RUN for f in *.whl; do \
|
| 159 |
if [ -f "$f" ]; then \
|
| 160 |
new_name=$(echo "$f" | sed 's/linux_aarch64/android_24_arm64_v8a/g'); \
|
|
@@ -162,7 +168,7 @@ RUN for f in *.whl; do \
|
|
| 162 |
fi \
|
| 163 |
done
|
| 164 |
|
| 165 |
-
# 11.
|
| 166 |
RUN echo "<html><body><h1>Wheels</h1><ul>" > index.html && \
|
| 167 |
find . -name "*.whl" -printf "<li><a href=\"%P\">%P</a></li>\n" | sort >> index.html && \
|
| 168 |
echo "</ul></body></html>" >> index.html
|
|
|
|
| 17 |
ENV NDK_VERSION=r26b
|
| 18 |
ENV ANDROID_API=24
|
| 19 |
ENV ANDROID_ARCH=aarch64
|
| 20 |
+
# Важно: OpenSSL требует именно ANDROID_NDK_ROOT
|
| 21 |
ENV NDK_HOME=/opt/android-ndk
|
| 22 |
+
ENV ANDROID_NDK_ROOT=/opt/android-ndk
|
| 23 |
ENV PYTHON_VERSION=3.11.9
|
| 24 |
ENV OPENSSL_VERSION=3.3.0
|
| 25 |
ENV RUSTUP_HOME=/opt/rust
|
|
|
|
| 28 |
|
| 29 |
RUN mkdir -p ${WORK_DIR} ${OUTPUT_DIR}
|
| 30 |
|
| 31 |
+
# 3. Установка Rust (нужен для pydantic-core/maturin)
|
| 32 |
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable
|
| 33 |
RUN rustup target add aarch64-linux-android
|
| 34 |
|
| 35 |
+
# 4. Установка инструментов сборки Python
|
| 36 |
+
# Добавлен pdm-backend для сборки проектов, использующих PDM
|
| 37 |
RUN pip install --upgrade pip && \
|
| 38 |
pip install --no-cache-dir \
|
| 39 |
Cython wheel setuptools setuptools-scm \
|
|
|
|
| 43 |
|
| 44 |
WORKDIR ${WORK_DIR}
|
| 45 |
|
| 46 |
+
# 5. Скачивание и установка Android NDK
|
| 47 |
RUN wget -q https://dl.google.com/android/repository/android-ndk-${NDK_VERSION}-linux.zip && \
|
| 48 |
unzip -q android-ndk-${NDK_VERSION}-linux.zip && \
|
| 49 |
mv android-ndk-${NDK_VERSION} ${NDK_HOME} && \
|
| 50 |
rm android-ndk-${NDK_VERSION}-linux.zip
|
| 51 |
|
| 52 |
+
# Настройка путей к тулчейну (компиляторам)
|
| 53 |
ENV TOOLCHAIN=${NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64
|
| 54 |
ENV PATH=${TOOLCHAIN}/bin:$PATH
|
| 55 |
ENV TARGET=${ANDROID_ARCH}-linux-android${ANDROID_API}
|
|
|
|
| 65 |
ENV CXXFLAGS="-target ${TARGET} -fPIC -D__ANDROID__"
|
| 66 |
ENV LDFLAGS="-target ${TARGET} -fPIC"
|
| 67 |
|
| 68 |
+
# 6. Сборка OpenSSL (теперь должна найти ANDROID_NDK_ROOT)
|
| 69 |
WORKDIR ${WORK_DIR}
|
| 70 |
RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz && \
|
| 71 |
tar -xf openssl-${OPENSSL_VERSION}.tar.gz
|
| 72 |
|
| 73 |
WORKDIR ${WORK_DIR}/openssl-${OPENSSL_VERSION}
|
| 74 |
+
# Добавляем PATH к toolchain явно в команду на всякий случай, хотя ENV PATH должен работать
|
| 75 |
+
RUN PATH=$PATH:${TOOLCHAIN}/bin ./Configure android-arm64 \
|
| 76 |
-D__ANDROID_API__=${ANDROID_API} \
|
| 77 |
--prefix=${WORK_DIR}/openssl-install \
|
| 78 |
--openssldir=${WORK_DIR}/openssl-install \
|
|
|
|
| 84 |
ENV OPENSSL_INCLUDE_DIR=${OPENSSL_DIR}/include
|
| 85 |
ENV OPENSSL_STATIC=1
|
| 86 |
|
| 87 |
+
# 7. Сборка Python (для получения libpython3.11.so)
|
| 88 |
WORKDIR ${WORK_DIR}
|
| 89 |
RUN wget -q https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz && \
|
| 90 |
tar -xf Python-${PYTHON_VERSION}.tgz
|
|
|
|
| 109 |
make -j$(nproc) libpython3.11.so || true && \
|
| 110 |
make install -i
|
| 111 |
|
| 112 |
+
# Копируем sysconfig
|
| 113 |
RUN mkdir -p ${WORK_DIR}/python-install/lib/python3.11
|
| 114 |
RUN find ${WORK_DIR}/Python-${PYTHON_VERSION} -name "_sysconfigdata*.py" -not -name "*x86_64*" \
|
| 115 |
-exec cp {} ${WORK_DIR}/python-install/lib/python3.11/_sysconfigdata__linux_aarch64-linux-android.py \;
|
|
|
|
| 141 |
echo "export OPENSSL_STATIC=1" >> build.sh && \
|
| 142 |
echo "" >> build.sh && \
|
| 143 |
echo "echo 'Starting Build...'" >> build.sh && \
|
| 144 |
+
# Используем --no-build-isolation, так как мы сами установили pdm-backend и прочие тулзы
|
| 145 |
echo "pip wheel ${TARGET_PACKAGE} --wheel-dir=${OUTPUT_DIR} --no-binary=:all: --no-build-isolation -v" >> build.sh && \
|
| 146 |
chmod +x build.sh
|
| 147 |
|
| 148 |
RUN ./build.sh
|
| 149 |
|
| 150 |
+
# 9. Патчинг (исправление зависимостей .so файлов)
|
| 151 |
RUN echo "Patching wheels..." && \
|
| 152 |
for whl in *.whl; do \
|
| 153 |
+
echo "Processing $whl..."; \
|
| 154 |
mkdir -p tmp_wheel; unzip -q "$whl" -d tmp_wheel; \
|
| 155 |
find tmp_wheel -name "*.so" | while read so_file; do \
|
| 156 |
if patchelf --print-needed "$so_file" | grep -q "libpython3.11.so.1.0"; then \
|
|
|
|
| 160 |
cd tmp_wheel; zip -r -q "../$whl" .; cd ..; rm -rf tmp_wheel; \
|
| 161 |
done
|
| 162 |
|
| 163 |
+
# 10. Переименование в формат Android
|
| 164 |
RUN for f in *.whl; do \
|
| 165 |
if [ -f "$f" ]; then \
|
| 166 |
new_name=$(echo "$f" | sed 's/linux_aarch64/android_24_arm64_v8a/g'); \
|
|
|
|
| 168 |
fi \
|
| 169 |
done
|
| 170 |
|
| 171 |
+
# 11. HTML индекс
|
| 172 |
RUN echo "<html><body><h1>Wheels</h1><ul>" > index.html && \
|
| 173 |
find . -name "*.whl" -printf "<li><a href=\"%P\">%P</a></li>\n" | sort >> index.html && \
|
| 174 |
echo "</ul></body></html>" >> index.html
|