это не универсальный скрипт делал по себя, так что под сложный проект нужно будет его чуть править например добавлять свои компоненты.
общий ликбез - собираеться 2 докера с лазарусом 386 и х64 под убунтой (386 убунта 18 чтоб старый libc был, мне это важно) и каждый из может собрать под себя и под венду.
я все запускаю в убунте, но должно работать и в венде, но возможно нужно будет поправить sh файлы.
и так общая структура -
Код: Выделить всё
run_build_docker.sh
docker/
├── build_internal_i386.sh
├── build_internal.sh
├── debs
│ ├── i386
│ │ ├── fpc-laz_3.2.2-210709_i386.deb
│ │ ├── fpc-src_3.2.2-210709_i386.deb
│ │ └── lazarus-project_4.4.0-0_i386.deb
│ └── x64
│ ├── fpc-laz_3.2.2-210709_amd64.deb
│ ├── fpc-src_3.2.2-210709_amd64.deb
│ └── lazarus-project_4.4.0-0_amd64.deb
├── Dockerfile
├── Dockerfile.i386
run_build_docker.sh
Код: Выделить всё
#!/bin/bash
set -e
# Define image names
IMG_MAIN="infopark-builder-main"
IMG_I386="infopark-builder-i386"
# Enable BuildKit
export DOCKER_BUILDKIT=1
MODE=${1:-all} # Default to 'all' if no argument provided
build_x64() {
echo "========================================"
echo " BUILDING x64 (Linux/Windows)"
echo "========================================"
docker build -f docker/Dockerfile -t $IMG_MAIN .
docker run --rm \
-v "$(pwd):/app" \
--user "$(id -u):$(id -g)" \
$IMG_MAIN \
bash docker/build_internal.sh
}
build_i386() {
echo "========================================"
echo " BUILDING i386 (Linux/Windows)"
echo "========================================"
docker build --platform linux/386 -f docker/Dockerfile.i386 -t $IMG_I386 .
docker run --rm --platform linux/386 \
-v "$(pwd):/app" \
--user "$(id -u):$(id -g)" \
$IMG_I386 \
bash docker/build_internal_i386.sh
}
case $MODE in
x64)
build_x64
;;
i386)
build_i386
;;
all)
build_x64
build_i386
;;
*)
echo "Usage: $0 [x64|i386|all]"
exit 1
;;
esac
echo "========================================"
echo " JOB COMPLETED: $MODE"
echo "========================================"
Код: Выделить всё
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
# 1. Install System Dependencies (x64)
RUN apt-get update && apt-get install -y --no-install-recommends \
wget \
curl \
git \
build-essential \
binutils \
# Windows x64 cross-tools
binutils-mingw-w64-x86-64 \
gcc-mingw-w64-x86-64 \
# GUI Libraries (Native x64)
libgtk2.0-dev \
libx11-dev \
libc6-dev \
libgdk-pixbuf2.0-dev \
libpango1.0-dev \
ca-certificates \
libncurses5-dev \
libncurses5 \
gdb \
rpm \
&& rm -rf /var/lib/apt/lists/*
# 2. Install FPC & Lazarus (x64 DEBs)
WORKDIR /tmp/install
# Copy from the x64 folder (we assume they are there)
COPY docker/debs/x64/*.deb ./
RUN echo "Installing Lazarus/FPC (x64)..." && \
apt-get update && \
apt-get install -y ./*.deb && \
rm -rf /tmp/install
# 3. Setup Windows x64 Cross-Compilation
RUN echo "Setting up Windows x64 Cross-Compilation..." && \
FPCVER=$(fpc -iV) && \
# FIX: Find FPC Source manually if needed, but for 3.2.2 DEB it's usually standard
FPCDIR="/usr/share/fpcsrc/$FPCVER" && \
if [ ! -d "$FPCDIR" ]; then FPCDIR=$(find /usr/share/fpcsrc -name "Makefile" -type f -exec dirname {} \; | grep "$FPCVER" | head -n 1); fi && \
cd "$FPCDIR" && \
# Build Windows x64 cross-compiler
make clean crossall crossinstall CPU_TARGET=x86_64 OS_TARGET=win64 INSTALL_PREFIX=/usr && \
# Symlink
ln -sf /usr/lib/fpc/$FPCVER/ppcrossx64 /usr/bin/ppcrossx64 || true && \
# Ensure native compiler is found (ppcx64)
if [ ! -f /usr/bin/ppcx64 ]; then ln -s /usr/lib/fpc/$FPCVER/ppcx64 /usr/bin/ppcx64; fi
# 4. Runtime
ENV HOME=/tmp
RUN chmod 777 /tmp
WORKDIR /app
CMD ["/bin/bash"]
Код: Выделить всё
FROM i386/ubuntu:18.04
ENV DEBIAN_FRONTEND=noninteractive
# 1. Install System Dependencies (Native i386)
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
wget \
curl \
git \
build-essential \
binutils \
# Windows cross-tools
binutils-mingw-w64-i686 \
gcc-mingw-w64-i686 \
# GUI Libraries
libgtk2.0-dev \
libx11-dev \
libc6-dev \
libgdk-pixbuf2.0-dev \
libpango1.0-dev \
libncurses5-dev \
libncurses5 \
gdb \
&& rm -rf /var/lib/apt/lists/*
# 2. Install FPC & Lazarus (i386 DEBs)
WORKDIR /tmp/install
COPY docker/debs/i386/*.deb ./
RUN echo "Installing Lazarus/FPC (i386)..." && \
apt-get update && \
apt-get install -y ./*.deb && \
rm -rf /tmp/install
# 3. Setup Windows i386 Cross-Compilation
RUN echo "Setting up Windows i386 Cross-Compilation..." && \
FPCVER=$(fpc -iV) && \
FPCDIR="/usr/share/fpcsrc/$FPCVER" && \
cd "$FPCDIR" && \
# Build Windows i386 cross-compiler
make clean crossall crossinstall CPU_TARGET=i386 OS_TARGET=win32 INSTALL_PREFIX=/usr && \
# Symlink
ln -sf /usr/lib/fpc/$FPCVER/ppcross386 /usr/bin/ppcross386 || true && \
# Ensure native compiler symlink
if [ ! -f /usr/bin/ppc386 ] && [ -f /usr/lib/fpc/$FPCVER/ppc386 ]; then \
ln -s /usr/lib/fpc/$FPCVER/ppc386 /usr/bin/ppc386; \
fi
# 4. Runtime
ENV HOME=/tmp
RUN chmod 777 /tmp
WORKDIR /app
CMD ["/bin/bash"]
Код: Выделить всё
#!/bin/bash
set -e
# --- BUILD MANIFEST ---
# Format: "Path/To/Project.lpi:targets"
# Targets: lin64, win64
# (lin32 and win32 are handled by the i386 container)
BUILD_LIST=(
"soft/ipTest.lpi:lin64,win64"
"soft/ipAdmin.lpi:lin64,win64"
"soft/ipKernel.lpi:lin64"
)
# --- SETUP ---
echo "=========================================="
echo " INFOPARK BUILDER (x64 CONTAINER)"
echo "=========================================="
build_pkg() {
echo ">>> Registering package: $1"
lazbuild -B "$1" > /dev/null || true
lazbuild --add-package "$1" > /dev/null || true
}
# Register Components
build_pkg "components/synapse/laz_synapse.lpk"
build_pkg "components/uib25/source/uiblaz.lpk"
build_pkg "components/rx/rx.lpk"
echo "=========================================="
echo " PROCESSING BUILD LIST"
echo "=========================================="
for ENTRY in "${BUILD_LIST[@]}"; do
PROJECT="${ENTRY%%:*}"
TARGETS="${ENTRY##*:}"
if [ ! -f "$PROJECT" ]; then
echo "WARNING: Project not found: $PROJECT"
continue
fi
echo "------------------------------------------"
echo "Project: $PROJECT"
echo "Targets requested: $TARGETS"
# Patch Synapse
if ! grep -q "components/synapse" "$PROJECT"; then
sed -i 's|<SearchPaths>|<SearchPaths><OtherUnitFiles Value="../components/synapse"/>|g' "$PROJECT"
fi
# Build Linux x64
if [[ "$TARGETS" == *"lin64"* ]]; then
echo " -> Building Linux x64..."
if ! lazbuild -B "$PROJECT" --os="linux" --cpu="x86_64"; then
echo " [FATAL ERROR] Failed Linux x64: $PROJECT"
exit 1
fi
else
echo " - Skipping Linux x64 (not requested)"
fi
# Build Windows x64
if [[ "$TARGETS" == *"win64"* ]]; then
echo " -> Building Windows x64..."
if ! lazbuild -B "$PROJECT" --os="win64" --cpu="x86_64"; then
echo " [FATAL ERROR] Failed Windows x64: $PROJECT"
exit 1
fi
else
echo " - Skipping Windows x64 (not requested)"
fi
done
echo "=========================================="
echo " x64 BUILD COMPLETED SUCCESSFULLY"
echo "=========================================="
Код: Выделить всё
#!/bin/bash
set -e
# --- BUILD MANIFEST ---
# Must match the x64 script for consistency, but filters for 32-bit targets.
# Targets: lin32, win32
BUILD_LIST=(
"soft/ipAdmin.lpi:lin32,win32"
"soft/ipDesk.lpi:lin32,win32"
)
# --- SETUP ---
echo "=========================================="
echo " INFOPARK BUILDER (i386 CONTAINER)"
echo "=========================================="
build_pkg() {
echo ">>> Registering package: $1"
lazbuild -B "$1" > /dev/null || true
lazbuild --add-package "$1" > /dev/null || true
}
# Register Components
build_pkg "components/synapse/laz_synapse.lpk"
build_pkg "components/uib25/source/uiblaz.lpk"
build_pkg "components/rx/rx.lpk"
echo "=========================================="
echo " PROCESSING BUILD LIST"
echo "=========================================="
for ENTRY in "${BUILD_LIST[@]}"; do
PROJECT="${ENTRY%%:*}"
TARGETS="${ENTRY##*:}"
if [ ! -f "$PROJECT" ]; then
echo "WARNING: Project not found: $PROJECT"
continue
fi
echo "------------------------------------------"
echo "Project: $PROJECT"
echo "Targets requested: $TARGETS"
# Patch Synapse
if ! grep -q "components/synapse" "$PROJECT"; then
sed -i 's|<SearchPaths>|<SearchPaths><OtherUnitFiles Value="../components/synapse"/>|g' "$PROJECT"
fi
# Build Linux i386
if [[ "$TARGETS" == *"lin32"* ]]; then
echo " -> Building Linux i386..."
if ! lazbuild -B "$PROJECT" --os="linux" --cpu="i386"; then
echo " [FATAL ERROR] Failed Linux i386: $PROJECT"
exit 1
fi
else
echo " - Skipping Linux i386 (not requested)"
fi
# Build Windows i386
if [[ "$TARGETS" == *"win32"* ]]; then
echo " -> Building Windows i386..."
if ! lazbuild -B "$PROJECT" --os="win32" --cpu="i386"; then
echo " [FATAL ERROR] Failed Windows i386: $PROJECT"
exit 1
fi
else
echo " - Skipping Windows i386 (not requested)"
fi
done
echo "=========================================="
echo " i386 BUILD COMPLETED SUCCESSFULLY"
echo "=========================================="
запуск - sh run_build_docker.sh
или с параметреми если не все надо sh run_build_docker.sh i386
если кому интересен готовый контейнер то в целом тоже могу залить, он в целом то универсальный, пакеты подключаються при запуске.
