1
0
aseprite-flatpak-builder/Dockerfile.fedora
aki d12f0bdf88 refactor: Overhaul build system for reliability and future portability
This commit introduces a major refactoring of the Aseprite build process. It replaces the previous fragile system (prone to dependency fetching failures) with an interim multi-distribution Docker approach, paving the way for a future transition to Flatpak.

**Problems Addressed:**

*   **Build Fragility & Dependency Fetching:** The prior method, compiling dependencies from source within a generic container, frequently failed due to network issues and rate limiting during source/sub-dependency acquisition (e.g., Skia's `git-sync-deps`), often late in the process. Source state inconsistencies could also cause failures.
*   **Complexity of Full Source Builds:** Managing the compilation of the entire dependency tree from source was complex.

**New Architecture & Rationale:**

*   **Host-Side Source Preparation (`prepare_sources.sh`):** Isolates the problematic source fetching and state management to a host-side script run *before* the main build. Key features:
    *   Handles cloning/updating core sources (`depot_tools`, Skia, Aseprite).
    *   Runs Skia `git-sync-deps` with **robust retry logic** to specifically address rate limit errors.
    *   Includes an `--check-integrity` flag which performs **aggressive checks and resets** (fetching, checking out specific tags/commits, resetting state) to ensure the local source directories precisely match the required state for the build, potentially involving significant network activity.
*   **Distribution-Specific Builds (Interim Step):** Introduced `Dockerfile.arch`, `Dockerfile.debian`, `Dockerfile.fedora`. These use native package managers to install pre-built *common* development libraries within the container, simplifying the Docker build stage itself. Requires OS detection or manual selection (`TARGET_DISTRO`).
*   **Clear Build Stages (Makefile):** Orchestrates source preparation, image building, and final binary extraction (`docker cp` to `./output/bin`).
*   **Cleaned Structure:** Removed obsolete scripts/files (`compile.sh`, generic `Dockerfile`, `docker-compose.yml`) and updated `.gitignore`.

**Limitations & Future Direction (Flatpak):**

*   **Fetching Challenges Persist:** While reliability is improved by isolating source prep and adding retries/integrity checks in `prepare_sources.sh`, the core challenge of potential rate limits or network issues during this initial step remains.
*   **Flatpak for Portability:** The current multi-distro Docker setup is an **intermediate solution**. The ultimate goal and **forward-maintained approach** is migrating to **Flatpak (`flatpak-builder`)**. Flatpak will provide a **unified, distribution-agnostic build environment** using standard runtimes and produce a **portable `.flatpak` bundle**, eliminating the need for OS detection/separate Dockerfiles and ensuring consistent builds *after* sources are successfully prepared.
2025-05-05 01:16:07 +08:00

94 lines
2.9 KiB
Docker

# Use Fedora 41 as the base image
FROM fedora:41
# Install necessary dependencies using dnf
# Includes build tools (make, gcc-c++), git, python, cmake, ninja, curl, unzip,
# and development libraries for X11, GL, fontconfig, and Skia dependencies.
RUN dnf install -y \
make \
gcc-c++ \
cmake \
ninja-build \
git \
curl \
unzip \
python3 \
libX11-devel \
libXcursor-devel \
libXi-devel \
mesa-libGL-devel \
fontconfig-devel \
expat-devel \
libicu-devel \
libjpeg-turbo-devel \
libpng-devel \
libwebp-devel \
zlib-devel \
freetype-devel \
harfbuzz-devel \
# Clean up dnf cache
&& dnf clean all
# Set the working directory
WORKDIR /app
# Copy the pre-downloaded source code into the image
# This assumes prepare_sources.sh has been run locally first
COPY ./src /src
# Set PATH for depot_tools
ENV PATH="/src/depot_tools:${PATH}"
# Initialize depot_tools within the container environment
# This ensures gn and other tools are correctly set up
RUN update_depot_tools
# --- Compile Skia ---
WORKDIR /src/skia
# Skia dependencies (including gn) are now synced locally by prepare_sources.sh
# Skia system dependencies are handled by system packages installed via dnf
# Generate Skia build files using Fedora's system libraries
# Note: Changed skia_use_system_* flags to true and enabled AVX
RUN /src/depot_tools/gn gen out/Release-x64 --args='is_debug=false is_official_build=true skia_use_system_expat=true skia_use_system_icu=true skia_use_system_libjpeg_turbo=true skia_use_system_libpng=true skia_use_system_libwebp=true skia_use_system_zlib=true skia_use_sfntly=false skia_use_freetype=true skia_use_harfbuzz=true skia_pdf_subset_harfbuzz=true skia_use_system_freetype2=true skia_use_system_harfbuzz=true extra_cflags=["-mavx"] extra_cxxflags=["-mavx"]'
# Compile Skia
RUN ninja -C out/Release-x64 skia modules
# --- Compile Aseprite ---
WORKDIR /src/aseprite
RUN mkdir -p build
WORKDIR /src/aseprite/build
# Generate Aseprite build files
# Pointing to the Skia build output within the image and enabling AVX
RUN cmake \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_CXX_FLAGS="-mavx" \
-DLAF_BACKEND=skia \
-DSKIA_DIR=/src/skia \
-DSKIA_LIBRARY_DIR=/src/skia/out/Release-x64 \
-DSKIA_LIBRARY=/src/skia/out/Release-x64/libskia.a \
-DLIBJPEG_TURBO_LIBRARY=/usr/lib64/libjpeg.so \
-DCMAKE_EXE_LINKER_FLAGS="-lfreetype" \
-G Ninja \
..
# Compile Aseprite
RUN ninja aseprite
# --- Prepare Output ---
# Create a target directory and copy the final binaries/assets
RUN mkdir -p /target/aseprite/build/bin
RUN cp /src/aseprite/build/bin/aseprite /target/aseprite/build/bin/
# Ensure data directory exists before copying into it
RUN mkdir -p /target/aseprite/build/bin/data
RUN cp /src/aseprite/build/bin/data/* /target/aseprite/build/bin/data/
# Expose a volume for the output (optional, as Makefile will copy)
VOLUME /target
# Set final working directory (optional)
WORKDIR /target