Why a 4.7 MB redistributable runtime is the missing piece for Eiffel library deployment
EiffelStudio is an exceptionally capable development environment. Its command-line compiler
ec can build a complete Eiffel application without the IDE, and the finalized
C output in the F_code folder is portable, auditable C that any C compiler can
process. For developers building applications this workflow is well understood and well
supported.
For library deployment the situation is different and more difficult. A project like xpact — a proposed Eiffel reimplementation of the widely-deployed libexpat XML parser with full Design by Contract annotations — needs to be consumable by developers who have no Eiffel knowledge and no EiffelStudio installation. A C developer linking against xpact should see a standard shared library and a C header. A Python developer should be able to install it via pip. A CI pipeline should be able to build it from source with nothing more than a C compiler and make.
Currently none of this is straightforward. Compiling the F_code output of an
EiffelStudio finalization requires the Eiffel runtime headers and libraries, which are
embedded inside the full EiffelStudio installation. A downstream builder who wants to compile
xpact from source must install several hundred megabytes of EiffelStudio toolchain to access
a few megabytes of runtime support files. This is a significant and unnecessary barrier to
adoption.
The good news is that EiffelStudio already decouples the compiler from the IDE —
ec is a standalone command-line tool that works without EiffelStudio the
application. The remaining step is to decouple the runtime from the compiler.
As the technical analysis below documents in detail, the complete set of files needed to
compile F_code output on a target machine without ec or the IDE
amounts to approximately 4.7 MB. This consists of:
finish_freezing build driver and supporting binaries — 2.1 MB
A developer with this 4.7 MB SDK, a C compiler, and make can compile any finalized
Eiffel project from its F_code archive without any further Eiffel tooling.
No ec. No EiffelStudio. No Eiffel knowledge required.
This pattern — separating the compiler from the runtime for deployment purposes —
is well established across systems languages. The D language ships druntime as
a separately packageable library available in apt and rpm repositories independently of the
DMD compiler. OCaml's libcamlrun is separately installable on all major Linux
distributions. Go embeds its runtime entirely within the output binary, requiring nothing on
the target machine at all.
In each case the motivation was the same: enabling library and application deployment in contexts where requiring a full compiler installation is impractical — CI pipelines, embedded build environments, package manager distribution, and third-party consumption of generated artifacts. xpact is precisely such a context for Eiffel.
xpact is a proposed Eiffel streaming XML parser with a libexpat-compatible C API, full Design by Contract annotations, and a Python binding. Its deployment story requires:
F_code output plus the libexpat-compatible header, compilable by any downstream
builder with a C compiler and the 4.7 MB runtime SDK.
libxpact.so /
xpact.dll for direct linking by C and C++ applications.
The C source distribution and Python package paths both require the runtime SDK to be available as a standalone artifact. Without it, xpact cannot be distributed in source form to non-Eiffel developers — which is precisely the audience the project is designed to reach.
The technical work required from ISE is bounded and well-defined: extract the 4.7 MB subset documented below from the EiffelStudio installation, package it as a standalone archive or installable package, and make it available under a licence that permits redistribution alongside projects built with EiffelStudio.
A formal EiffelStudio F_code Runtime SDK — versioned to match EiffelStudio releases, available as a standalone download and ideally as packages in major Linux distribution repositories — would remove the last practical obstacle to Eiffel-generated libraries being treated as first-class artifacts in standard software distribution workflows.
For projects like xpact whose entire purpose is to demonstrate that Eiffel can deliver production-quality, widely-deployable systems software, this SDK is not a convenience feature. It is a prerequisite.
For a pure parsing library like xpact — no GUI, no network, no image processing
dependencies — the minimal 4.7 MB runtime SDK is entirely sufficient. The
C_library/ subset of EiffelStudio, which contains third-party C libraries
such as cURL, zlib, libpng, and OpenSSL, is only needed for projects that explicitly link
against those libraries. xpact is not one of them. Its dependency profile is as clean as
a C library can be: Eiffel runtime plus the standard C library.
This is a deliberate architectural advantage. A parser library that requires no GUI toolkit, no network stack, and no image codec has no reason to carry those dependencies into its distribution. xpact can be distributed as a standard C source archive buildable anywhere with a C compiler and 4.7 MB of runtime support — a distribution story as clean as any C library.
Not all Eiffel projects have xpact's minimal dependency profile. EiffelVision2 applications require graphics support. Network-enabled libraries need cURL. The 4.7 MB base SDK serves pure Eiffel projects but would need augmentation for more complex cases.
This suggests a natural tiered packaging model that ISE could offer:
| SDK Tier | Contents | Approximate Size | Use case |
|---|---|---|---|
| Base runtime SDK | Runtime headers, libfinalized, build tools |
~4.7 MB | Pure Eiffel projects, parsers, algorithms — always required |
| Network SDK | Base + cURL subset from C_library/ |
~4.7 MB + curl | Network-enabled libraries and services |
| Graphics SDK | Base + libpng + relevant vision2 dependencies | ~4.7 MB + graphics | EiffelVision2 applications, image processing |
| Full SDK | Base + complete C_library/ |
~63 MB | Projects with complex or mixed third-party dependencies |
This model follows the precedent of Linux distribution packaging, where a library's runtime package and its development headers are separated, and optional dependency packages are installed only when needed. It keeps the common case small and the uncommon case possible.
The technical specification in this document is precise enough that creating the SDK from an existing EiffelStudio installation requires nothing more than copying a defined set of files into a new directory and packaging the result. This is a task well suited to automation.
A Claude Code agent — Anthropic's agentic coding tool — is capable of
generating a shell script that reads the file list documented below, extracts the relevant
subset from a full EiffelStudio installation at a specified path, and produces a
redistributable SDK archive. Such a script would also verify that the resulting SDK
correctly builds a test F_code project before packaging, providing an
automated correctness check. The script itself would serve as an executable specification
of the SDK's contents — version-controllable, reproducible, and easily updated when
new EiffelStudio versions are released.
The barrier to ISE creating and maintaining this SDK is therefore low. The specification exists. The automation is straightforward. The benefit to projects like xpact and to the broader Eiffel ecosystem is substantial.
The remainder of this document provides the precise technical specification of what the
SDK must contain, derived from analysis of the EiffelStudio 25.12 installation on
linux-x86-64.
This document identifies the minimal set of files required from a full EiffelStudio 25.12
installation to compile an archived F_code project using the
finish_freezing command. The C code is already generated, so the Eiffel
compiler (ec), EiffelStudio IDE, and Eiffel source libraries are not needed.
Total SDK size: ~4.7 MB (vs ~360 MB for the full installation)
Platform: linux-x86-64 | Version: 25.12
Prerequisite on build host: gcc and make (GNU make recommended)
finish_freezing WorksThe finish_freezing shell script performs three steps:
quick_finalize to process the F_code directory and generate a Makefile from Makefile.SH.config.sh into the project directory if not already present.sh Makefile.SH (which expands shell variables using config.sh), then calls make to compile and link the final executable.
The script resolves paths via the environment variable ISE_EIFFEL (pointing to the
installation root) or, for a Unix-layout install, via ISE_PREFIX + ISE_VERSION.
# Typical usage (ISE_EIFFEL layout): export ISE_EIFFEL=/path/to/sdk export ISE_PLATFORM=linux-x86-64 cd /path/to/project/EIFGENs/my_app/F_code $ISE_EIFFEL/studio/spec/$ISE_PLATFORM/bin/finish_freezing
studio/spec/linux-x86-64/bin/| File | Type | Purpose | Size |
|---|---|---|---|
| finish_freezing | Shell script | Top-level compilation driver | 4 KB |
| quick_finalize | ELF binary | Generates Makefile from F_code directory; reads emain.template and egc_dynlib.template |
2.1 MB |
| x2c | ELF binary | Converts extended-C (.x) files to standard C; referenced from config.sh and generated Makefiles |
20 KB |
| prelink | Shell script | Symlink helper used during make phase | 4 KB |
studio/spec/linux-x86-64/include/| Contents | Size |
|---|---|
All eif_*.h headers (garbage collector, exceptions, threads, memory, SCOOP, CECIL, etc.) plus config.sh |
580 KB |
studio/spec/linux-x86-64/lib/
F_code (finalized mode) links against libfinalized. The mt variants
are required for multi-threaded / SCOOP applications. The wkbench libraries are
only for workbench (W_code) builds and can be omitted.
| File | Use | Size |
|---|---|---|
| libfinalized.a | Single-threaded finalized runtime (static) | 612 KB |
| libfinalized.so | Single-threaded finalized runtime (shared) | 396 KB |
| libmtfinalized.a | Multi-threaded finalized runtime (static) | 764 KB |
| libmtfinalized.so | Multi-threaded finalized runtime (shared) | 488 KB |
studio/config/linux-x86-64/templates/| File | Purpose | Size |
|---|---|---|
| emain.template | Template for the generated application entry-point C file | 16 KB (combined) |
| egc_dynlib.template | Template for dynamic library entry-point C file |
| Component | Size |
|---|---|
Binaries (finish_freezing, quick_finalize, x2c, prelink) | ~2.1 MB |
Headers (include/) | ~580 KB |
Runtime libraries (libfinalized + libmtfinalized) | ~2.2 MB |
| Config templates | ~16 KB |
| Total | ~4.7 MB |
| File / Directory | Size | Reason not needed |
|---|---|---|
| studio/spec/linux-x86-64/bin/ec | 86 MB | Eiffel compiler — C code is already generated |
| studio/spec/linux-x86-64/bin/ecb | 26 MB | Batch Eiffel compiler — not needed for C compilation |
| studio/spec/linux-x86-64/bin/estudio | 6.2 MB | EiffelStudio IDE |
| studio/spec/linux-x86-64/bin/netcore/ | 70 MB | .NET Core runtime support |
| studio/spec/linux-x86-64/lib/libwkbench.{a,so} | ~1.4 MB | Workbench (W_code) runtime only — F_code uses libfinalized |
| studio/spec/linux-x86-64/lib/libmtwkbench.{a,so} | ~1.7 MB | MT workbench (W_code) runtime only |
| library/ | — | Eiffel source libraries — not compiled at this stage |
| C_library/ | 58 MB | Third-party C libraries (curl, zlib, libpng, openssl) — only needed if the project explicitly links them |
| contrib/, eweasel/, examples/ | — | Examples and contributed libraries |
C_library/: If the project being compiled depends on
EiffelStudio-bundled C libraries (e.g. cURL, vision2 with PNG support),
the relevant sub-directories from C_library/ will also be needed and their size
should be added to the SDK.
$ISE_EIFFEL/
studio/
spec/
linux-x86-64/
bin/
finish_freezing (shell script)
quick_finalize (ELF binary, 2.1 MB)
x2c (ELF binary, 20 KB)
prelink (shell script)
include/
config.sh
eif_*.h ... (all Eiffel runtime headers)
lib/
libfinalized.a
libfinalized.so
libmtfinalized.a
libmtfinalized.so
config/
linux-x86-64/
templates/
emain.template
egc_dynlib.template