.ceagle-flight is a TOML file at the root of a repository, or at the manifest path
of a project in a repository that backs several. It carries two things: the listing
people see on Roost, and the instructions for building the program.
It is read from the commit being built, so changing it is a commit like any other.
Shape#
[program]
# the listing, and the version this build publishes
[build]
# how to make the artifact
[library]
# LibLoad libraries onlyThe program table#
Everything a reader sees on Roost, plus the version.
namestringRequiredThe program title on Roost. One to 64 characters. This is the listing title, not the calculator variable name, which comes from the built file.
versionstringRequiredThe version this build publishes. At most 24 characters. No format is enforced, so
1.2.0,2026.03andbeta-4are all accepted, but pick one convention and keep it.summarystringdefaults toemptyOne line, shown in listings and search results. Truncated at 140 characters rather than rejected.
descriptionstringdefaults toemptyThe long text on the program page. Truncated at 4000 characters. A TOML multi-line string is the comfortable way to write it.
authorstringdefaults tothe project ownerWho to credit. Truncated at 64 characters.
categoriesarray of stringdefaults to["other"], or ["libs"] for a libraryOne to four category keys. An unknown key fails the build. Some categories are restricted to administrators.
tagsarray of stringdefaults to[]Up to twelve free-form tags, each at most 32 characters.
hiddenbooleandefaults tofalseA hidden program is downloadable at its address but left out of listings, search and category counts.
dependsarray of stringdefaults to[]Addresses of the libraries this build links against and that have to be on the calculator first. At most eight, each optionally pinned as
address@version. See dependencies.
Categories#
Fetch the live list rather than guessing:
curl -s https://roost.ceagle.cc/api/v1/categoriesEach entry has a key, which is what goes in the manifest, a name, a description and a restricted
flag. A manifest that claims a restricted category from a non-administrator account fails with
only administrators may publish into the CEagle Apps category.
The build table#
commandstringdefaults tomakeThe shell command that produces the artifact. Run through
bash -lcin the directory holding this manifest, as an unprivileged user, with no network. At most 512 characters.For a libify library this key must be absent: Flight writes the command itself, and setting one is an error rather than a silent no-op.
outputstringdefaults tobin/*.8xpWhere the artifact lands, relative to the directory holding this manifest. A glob is allowed, but it has to match exactly one regular file. At most 200 characters.
Not read for a library: the appvar path comes from the library table instead.
submodulesbooleandefaults tofalseClone git submodules. They resolve over HTTPS only.
timeoutdurationdefaults to10mWall clock for the build command. Between
30sand30m. Go duration syntax, so90s,5mand1m30sall parse.
What the output path may not be#
absolute pathsAnything beginning with a slash.
backslashesRejected outright, so a Windows-style path fails rather than being reinterpreted.
parent segmentsAny
..anywhere in the path, before or after cleaning.shell metacharactersEvery manifest path reaches a shell, so quotes, backticks, dollar signs, semicolons, pipes, redirects and newlines are all refused.
The library table#
Only read when the project language is LibLoad library. See LibLoad libraries for what the two modes mean.
namestringRequiredThe LibLoad name. One to eight characters, starting with a letter, capitals and digits only. This is what other programs link against and what LibLoad resolves at runtime.
modelibify | customdefaults tolibifyWho builds it.
libifylets CEagle generate the build command from the keys below;customruns your own command and collects the files you name.ce-libifyandmanagedare accepted as spellings oflibify;ownandcommandas spellings ofcustom.headersarray of stringdefaults to[]Public headers to ship in the developer archive. At most twelve. The archive is flat, so two headers whose base names collide are rejected.
versionintegerdefaults tounsetThe library version passed to ce-libify. Omitted when zero or absent.
srcstringdefaults tosrcThe directory holding the C sources.
includestringdefaults to.Where the headers live.
exportsstringdefaults toexports.txtThe export table. It is an ABI: see the export table.
optimizestringdefaults to-OzThe optimisation flag. Must start with
-Oand be at most eight characters.
appvarstringdefaults tobin/NAME.8xvWhere your build leaves the appvar.
stubstringdefaults tobin/NAME.libWhere your build leaves the linker stub. An explicit empty string says the build ships none: the library still loads on the calculator, but nothing else can link against it.
Complete examples#
[program]
name = "Snake"
version = "1.0.0"
summary = "The classic, on your calculator."
description = """
Eat the pixels.
Do not eat yourself.
"""
categories = ["games"]
tags = ["arcade", "classic"]
author = "Ada Lovelace"
depends = ["my-graphics-library"]
[build]
command = "make"
output = "bin/SNAKE.8xp"
submodules = false
timeout = "10m"[program]
name = "Demo Library"
version = "1.0.0"
summary = "Two functions other programs can call."
description = """
A LibLoad library built from ordinary C sources.
Programs list it under depends and Swoop sends it along.
"""
categories = ["libs"]
tags = ["libload"]
author = "Ada Lovelace"
[library]
mode = "libify"
name = "DEMO"
version = 1
src = "src"
include = "."
exports = "exports.txt"
headers = ["demo.h"]
optimize = "-Oz"
[build]
timeout = "10m"[program]
name = "Demo Library"
version = "1.0.0"
summary = "Two functions other programs can call."
description = """
A LibLoad library this repository builds itself.
Flight runs the command below and collects what it names.
"""
categories = ["libs"]
tags = ["libload"]
author = "Ada Lovelace"
[library]
mode = "custom"
name = "DEMO"
appvar = "bin/DEMO.8xv"
stub = "bin/DEMO.lib"
headers = ["include/demo.h"]
[build]
command = "make lib"
submodules = false
timeout = "10m"The console serves these same examples live:
curl -s "https://roost.ceagle.cc/api/v1/manifest?language=lib&mode=custom"Every manifest error#
| Status | Code | Means |
|---|---|---|
| build | no .ceagle-flight file | Not where this project expects it, or you pushed a branch that is not tracked. The Flight page shows the manifest the project builds. |
| build | not valid TOML | A syntax error. Check quoting and multi-line strings. |
| build | name is required | Missing, empty, or longer than 64 characters. |
| build | version is required | Missing, empty, or longer than 24 characters. |
| build | command is required | Empty in custom library mode, or longer than 512 characters. |
| build | output must be a relative path | Absolute, contains a backslash, or escapes the repository. |
| build | timeout is outside the allowed range | Under 30 seconds, over 30 minutes, or unparseable. |
| build | categories names a category that does not exist | Check the live catalog. |
| build | only administrators may publish into the CEagle Apps category | A restricted category. |
| build | needs a [library] section with a name | A library project with no library name. |
| build | mode is either libify or custom | An unrecognised mode. |
| build | a libify library build writes its own command | Remove the build command. |
| build | appvar and stub are only read for a custom build | Remove them, or switch to custom mode. |
| build | two [library] headers share a file name | The archive is flat; rename one. |
| build | headers names too many files | At most twelve. |
| build | a [library] path must stay inside the repository | Same rules as the output path. |
Errors that come from the build itself rather than the manifest.