The Case for an EiffelStudio F_code Runtime SDK

Why a 4.7 MB redistributable runtime is the missing piece for Eiffel library deployment

The deployment problem

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 solution is already almost there

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:

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.

The precedent from other languages

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.

What xpact needs

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:

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 request to Eiffel Software

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.

xpact specifically needs only the base SDK

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.

A tiered SDK approach

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 TierContentsApproximate SizeUse 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.

Creating the SDK is straightforward

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.

EiffelStudio 25.12 — Minimal F_code Compilation SDK

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)

How finish_freezing Works

The finish_freezing shell script performs three steps:

  1. Invokes quick_finalize to process the F_code directory and generate a Makefile from Makefile.SH.
  2. Copies config.sh into the project directory if not already present.
  3. Runs 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

Required SDK Files

Binaries — studio/spec/linux-x86-64/bin/

FileTypePurposeSize
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

Runtime Headers — studio/spec/linux-x86-64/include/

ContentsSize
All eif_*.h headers (garbage collector, exceptions, threads, memory, SCOOP, CECIL, etc.) plus config.sh 580 KB

Runtime Libraries — 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.

FileUseSize
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

Config Templates — studio/config/linux-x86-64/templates/

FilePurposeSize
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

Size Summary

ComponentSize
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

What Can Be Excluded

File / DirectorySizeReason 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
Note on 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.

Directory Structure of 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