Official installer for the fpc-unleashed project. Downloads source, builds FPC Unleashed and Lazarus IDE into a self-contained directory of your choice. No registry side effects, no PATH modification, no overwriting of system FPC.
installer_win64_x86_64.exe-- Windows hostinstaller_linux_x86_64-- Linux host (raw ELF64)installer_linux_x86_64.AppImage-- Linux host (AppImage, self-contained)
All three are published to the nightly release; pick whichever suits your distro / preference.
Pick a target directory, optionally pin commits, tick the cross compilers you want, click Install. The installer then:
- Downloads a bootstrap FPC and the FPC Unleashed + Lazarus source.
- Builds the native FPC for the host OS, then any cross targets you ticked.
- Builds the Lazarus IDE and any optional addons you ticked.
- Drops a desktop shortcut to the IDE, wired to a per-install Lazarus config so the install stays isolated from anything else on the system.
Re-runs are idempotent: unchanged components self-skip, ticked-but-missing targets get filled in, unticked-but-present targets get removed, addon toggles trigger a surgical IDE rebuild. State lives in <install>/installer.ini.
Install dir defaults: C:\fpcunleashed\ on Windows, $HOME/fpcunleashed/ on Linux.
| Target | From win64 host | From linux64 host |
|---|---|---|
x86_64-win64 |
native | cross via FPC internal PE/COFF linker (-Xi) |
x86_64-linux |
cross | native |
i386-win32 |
cross | cross |
i386-linux |
cross | cross; needs i386-win32 as prereq |
wasm32-wasip1 |
cross | cross |
The native compile and Lazarus GTK2 build need a working toolchain on the host:
# Debian / Ubuntu / Mint
sudo apt install -y curl build-essential libgtk2.0-dev xdg-utils
# Fedora
sudo dnf install -y curl make gcc binutils gtk2-devel xdg-utils
# Arch / Manjaro
sudo pacman -S --needed curl base-devel gtk2 xdg-utilsTested baseline: glibc 2.28+ (Ubuntu 18.04+, Debian 10+, Fedora 29+).
A release binary can carry a compact <len><payload> blob in its filename so the installer pre-fills the FPC / Lazarus commit and branch fields on startup -- without baking long commit SHAs or branch names into the binary name.
Layout (4 positional fields, all optional, concatenated with no separators):
| Pos | Meaning |
|---|---|
| 1 | fpc commit / predefined branch |
| 2 | ide commit / predefined branch |
| 3 | fpc branch hash override (optional, hash-only) |
| 4 | ide branch hash override (optional, hash-only) |
Each field is <L><L-hex-chars>:
For pos 1 and 2:
-
0X-- predefined namespace, X selects a built-in branch:0= main1= devel
Commit is "latest of that branch" semantically.
-
<L><L-hex>with L in 1..9 -- L hex chars follow = pinned commit-SHA prefix. Branch is implicitlymain. Override the implicit main via pos 3 if you want a different branch.
For pos 3 and 4 (branch override, hash-only):
<L><L-hex>with L in 1..9 -- L hex chars = murmur3 prefix of the branch name. Picks whichever currently-active branch hashes to that prefix; collisions are resolved by encoding a longer prefix at build time.
The override slot has no predefined namespace -- if you want a predefined branch, write it in pos 1 / 2 instead.
Branch hashes are generated by the branchhash CLI tool sitting next to the installer source:
branchhash <branch-name> [<total-len>]
- 1st arg: branch name (e.g.
feat/composable-records) - 2nd arg (optional): total chars to emit including the length digit, default
3, max9. Sobranchhash feat/composable-recordsoutputs a 3-char token (2xx= len 2 + 2 hex chars).
| Filename token | Pin |
|---|---|
00 |
fpc on main, latest commit. ide defaults to main + latest. |
0000 |
both fpc and ide on main + latest (explicit). |
0101 |
both fpc and ide on devel + latest. |
1a1b |
fpc commit pin a, ide commit pin b, both on main (implicit). |
00011a |
fpc on main, ide on devel, fpc branch overridden to whatever hashes to a. |
0001266 |
fpc on main, ide on devel, fpc branch override hash 66 (3-char field). |
1a2bc266266 |
fpc commit a, ide commit bc, then both branches overridden via hash 66. |
The parser picks the LAST hex+digit run of >= 2 chars in the filename. There is no fallback to an earlier run -- if the chosen run fails to parse, the install just starts at defaults.
You can pass the blob as the first cmdline argument to the installer; it parses with the exact same rules as the filename and overrides whatever the filename encodes:
installer_win64_x86_64.exe 0000366f366f
The Commit edit fields and Branch combos fill in on startup. A benign / non-blob arg (path, flag) falls through to the filename path so launchers that already pass other args still work.
Source published for audit. See LICENSE -- free to run, free to read, free to build yourself, no forks.