Re: Who is working on getting FreePascal released?

Thomas Kurz via fpc-pascal <[email protected]> Tue, 21 Apr 2026 09:37:03 +0200
Newsgroups gmane.comp.compilers.free-pascal.general
Message-ID <[email protected]>
Me too.

I'm building the Win32 and Win64 within a Docker container on Linux, keeping the same directory structure which the official Lazarus builds use. 
It builds Lazarus trunk and FPC trunk. I've attached the build script; maybe it can help someone.

It's certainly possible to build other platforms (Linux, DOS, macOS, OS2, whatsoever), but I don't need them. That's why I focused on Windows only.

Thomas


----- Original Message ----- 
From: Graeme Geldenhuys via fpc-pascal <[email protected]>
To: FPC-Pascal users discussions <[email protected]>
Sent: Monday, April 20, 2026, 13:24:51
Subject: [fpc-pascal] Who is working on getting FreePascal released?

On Monday, 20 April 2026 09:40:40 BST Thomas Kurz via fpc-pascal wrote:
> I'm also eagerly waiting for the next release. Not for 3.2.4, but for 3.4.0.
> Imho, it'd be desirable to have yearly releases with only some enhancements
> and new features instead of waiting for big steps for more than 6 years.

What environment and architecture are you on? 

I've started making unofficial releases of FPC 3.3.1 ('main' - aka 'trunk'). I 
started this mainly because I have software that requires features in FPC 
3.3.1 that others wanted to test too - and I simply can't sit around for a few 
more years, waiting for the FPC team.

Think of it as "FPC Community Edition" releases. ;-)  These will come out 
monthly.

I'm considering merging in a few outstanding MRs too for those releases (after 
I did a round of triaging).

https://github.com/graemeg/fpc-opdf-releases

ps: I'll probably rename the project at some point.

Regards,
  Graeme




_______________________________________________
fpc-pascal maillist  -  [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

_______________________________________________
fpc-pascal maillist  -  [email protected]
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
build-win64-trunk.sh (application/octet-stream, 6.4 KB)
#!/bin/bash
set -e

FPC_VER=3.3.1
LAZ_OPT="-v0e -g-"
FPC_OPT="-v0e"
SRCDIR="$PWD/src"
OUTDIR="$PWD/release"

mkdir -p "$OUTDIR"
mkdir -p "$SRCDIR/lazarus" "$SRCDIR/fpc"

docker build --pull \
  -t lazarus-buildenv:stable \
  --build-arg FPC_OLDSTABLE_VER=3.2.0 \
  --build-arg FPC_STABLE_VER=3.2.2 \
  --build-arg FPC_FIXES_VER=3.2.3 \
  --build-arg FPC_MAIN_VER=3.3.1 \
  -f buildenv.Dockerfile \
  https://gitlab.com/freepascal.org/lazarus/lazarus.git#main

docker run --rm -it \
  -v "$OUTDIR":/output \
  -v "$SRCDIR/lazarus":/opt/lazarus \
  -v "$SRCDIR/fpc":/opt/fpcsrc \
  --name lazarus-trunk-win64 \
  lazarus-buildenv:stable bash -c "
    set -e

    echo '๐Ÿ“ฆ Installing rsync and zip...'
    apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y rsync zip

    echo '๐Ÿ“ฅ Cloning Lazarus trunk...'
    if [ -d /opt/lazarus/.git ]; then
      cd /opt/lazarus
      git reset --hard
      git clean -xdff
      git checkout main
      git pull
    else
      git clone -c core.autocrlf=true --branch main --depth=1 https://gitlab.com/freepascal.org/lazarus/lazarus.git /opt/lazarus
    fi

    cd /opt/lazarus

    echo '๐Ÿ”จ Building lazbuild...'
    make lazbuild FPC=/usr/lib/fpc/3.2.2/ppcx64 OPT=\"$LAZ_OPT\"

    echo '๐Ÿงฉ Regenerating makefiles under components/...'
    find /opt/lazarus/components -name Makefile.fpc -print0 \
      | xargs -0 -n1 dirname \
      | sort -u \
      | while IFS= read -r dir; do
          echo \"   -> \$dir\"
          ( cd \"\$dir\" && rm -f Makefile && fpcmake -T x86_64-win64 ) || exit 1
        done
 
    echo '๐Ÿ”จ Building bigide for Win64...'
    make bigide FPC=/usr/lib/fpc/$FPC_VER/ppcrossx64 OS_TARGET=win64 CPU_TARGET=x86_64 LCL_PLATFORM=win32 OPT=\"$LAZ_OPT\"

    echo '๐Ÿ”จ Building LCL, LazUtils, IdeIntf, SynEdit for Win32...'
    /opt/lazarus/lazbuild \
      lcl lazutils ideintf synedit \
      --cpu=i386 --os=win32 \
      --compiler=/usr/lib/fpc/$FPC_VER/ppcross386 \
      --lazarusdir=/opt/lazarus \
      --opt=\"$LAZ_OPT\"

    echo '๐Ÿ“ฅ Cloning FPC trunk source...'
    if [ -d /opt/fpcsrc/.git ]; then
      cd /opt/fpcsrc
      git reset --hard
      git clean -xdff
      git checkout main
      git pull
    else
      git clone -c core.autocrlf=true --branch main --depth=1 https://gitlab.com/freepascal.org/fpc/source.git /opt/fpcsrc
    fi

    echo '๐Ÿงผ Cleaning any previous FPC builds...'
    cd /opt/fpcsrc
    make distclean || true

    echo '๐Ÿ”จ Building full FPC compiler toolchain for Win64...'
    make distclean all zipinstall \
      PREFIX=\"P:\\Lazarus\\FPC\\\$FPC_VER\" \
      FPC=/usr/lib/fpc/$FPC_VER/ppcx64 \
      OS_TARGET=win64 CPU_TARGET=x86_64 \
      OPT=\"$FPC_OPT\" \
      BINDIR=/dev/null MANDIR=/dev/null SHAREDIR=/dev/null DOCDIR=/dev/null

    echo '๐Ÿ“ฆ Preparing portable ZIP directory...'
    INSTALLDIR=/tmp/lazarus-win64
    mkdir -p \$INSTALLDIR
    rsync -a --exclude=.git* --exclude=*.bak /opt/lazarus/ \$INSTALLDIR/

    echo '๐Ÿ“ Assembling FPC runtime layout...'
    FPCBASE=\$INSTALLDIR/fpc/$FPC_VER
    mkdir -p \$FPCBASE/
    mkdir -p \$FPCBASE/source

    echo '๐Ÿ“„ Copying Windows-native FPC binaries...'
    HOST_PLATFORM=\$(fpc -iTP)-\$(fpc -iTO)
    tar -xzf /opt/fpcsrc/fpc-${FPC_VER}.x86_64-win64.built.on.\${HOST_PLATFORM}.tar.gz --directory=\"\$FPCBASE\"

    echo '๐Ÿงน Removing all example directories from FPC docs...'
    find \$FPCBASE/share/doc -type d -name examples -exec rm -rfv {} +
    find \$FPCBASE/share/doc -type d -empty -delete
    mkdir -p \$FPCBASE/doc
    mv -t \$FPCBASE/doc \$FPCBASE/share/doc/fpc-$FPC_VER/*
    rm -rfv \$FPCBASE/share

    echo '๐Ÿ”จ Building FPC tools for Win64...'
    for tooldir in \
      utils/fpcres \
      utils/fpdoc \
      utils/fppkg \
      utils/fpcmkcfg \
      utils/fpcm \
      utils/h2pas \
      utils/instantfpc \
      utils/pas2fpm \
      utils
    do
      echo \"๐Ÿ”ง Building tool: \$tooldir\"
      cd /opt/fpcsrc/\$tooldir
      make clean all zipinstall \
        PREFIX=\"P:\\Lazarus\\FPC\\\$FPC_VER\" \
        FPC=/usr/lib/fpc/$FPC_VER/ppcrossx64 \
        OS_TARGET=win64 CPU_TARGET=x86_64 \
        BINDIR=/dev/null MANDIR=/dev/null SHAREDIR=/dev/null DOCDIR=/dev/null \
        OPT=\"$FPC_OPT\" || {
          echo \"โŒ Failed building \$tooldir\"
          exit 1
        }
      tar -xzf *.x86_64-win64.tar.gz --directory=\"\$FPCBASE\"
    done

    echo '๐Ÿงน Removing build artifacts from FPC tree...'
    cd /opt/fpcsrc
    make distclean || true

    echo '๐Ÿ“ Copying FPC source (rtl + packages)...'
    cp -r /opt/fpcsrc/rtl \"\$FPCBASE/source/\"
    cp -r /opt/fpcsrc/packages \"\$FPCBASE/source/\"

    echo '๐Ÿงฉ Generating fpc.cfg using fpcmkcfg...'
    /usr/bin/fpcmkcfg -d basepath=\"P:\\\\Lazarus\\\\fpc\\\\\\\$fpcversion\" -o \$FPCBASE/bin/x86_64-win64/fpc.cfg

    echo '๐Ÿ”จ Building full FPC compiler toolchain for Win32...'
    make distclean crosszipinstall \
      PREFIX=\"P:\\Lazarus\\FPC\\\$FPC_VER\" \
      FPC=/usr/lib/fpc/$FPC_VER/ppcx64 \
      OS_TARGET=win32 CPU_TARGET=i386 \
      OPT=\"$FPC_OPT\" \
      BINDIR=/dev/null MANDIR=/dev/null SHAREDIR=/dev/null DOCDIR=/dev/null

    echo '๐Ÿ“„ Copying Windows-native FPC cross-compiler Win32...'
    tar -xzf /opt/fpcsrc/fpc-${FPC_VER}.i386-win32.built.on.\${HOST_PLATFORM}.tar.gz --directory=\"\$FPCBASE\"

    echo '๐Ÿงน Cleaning up...'
    find \$FPCBASE/bin -maxdepth 1 -type f -exec mv {} \$FPCBASE/bin/x86_64-win64/ \\;
    rsync -a --remove-source-files \$FPCBASE/lib/fpc/$FPC_VER/ \$FPCBASE/
    rm -rf \$FPCBASE/lib

    echo '๐Ÿ”จ Building documentation...'
    cd /opt/lazarus/docs/html
    unzip -j /doc-chm.zip -d \$INSTALLDIR/docs/chm
    /opt/lazarus/lazbuild \
      --lazarusdir=/opt/lazarus \
      --compiler=/usr/lib/fpc/3.2.2/ppcx64 \
      build_lcl_docs.lpi
    ./build_lcl_docs --fpdoc=/usr/bin/fpdoc --fpcdocs=\$INSTALLDIR/docs/chm --outfmt=chm --footer locallclfooter.xml --warnings

    echo '๐Ÿงน Removing build artifacts from Lazarus tree...'
    find \$INSTALLDIR -type d -name \"\$HOST_PLATFORM\" -exec rm -rfv {} +

    echo '๐Ÿงผ Removing all ELF binaries from Lazarus ZIP tree...'
    find \$INSTALLDIR -type f -exec file {} + | grep ELF | cut -d: -f1 | xargs rm -fv || true

    echo '๐Ÿ“ฆ Creating zip archive...'
    ZIPFILE=lazarus-${LAZ_VER}-fpc-${FPC_VER}-win64.zip
    rm -f /output/\$ZIPFILE || true
    zip -9 -r /output/\$ZIPFILE \$INSTALLDIR

    echo \"โœ… ZIP created: \$ZIPFILE\"
    ls -lh /output/\$ZIPFILE
  "

echo "๐ŸŽ‰ Done. Check your '$OUTDIR' directory for the ZIP."