#sel4 #configuration #toml-config #format #build #managed #user

bin+lib selfe-config

A seL4 configuration format, managed by a library

1 unstable release

0.2.1 Jan 21, 2022

#859 in Configuration


Used in 3 crates

Custom license

81KB
2K SLoC

selfe-config

A seL4 configuration format, managed by a library.

Usage

Direct use of this library is largely not necessary. End users will usually just deal with the toml format when they need to tweak the version or compilation-options of the seL4 they wish to build against when using selfe-sys

Library Contents

model module

In addition to handling deserialization, serialization, and in-memory representation of a full::Full configuration model, the model module provides a contextualized::Contextualized type that narrows the configuration options to those applicable to a specific contextualized::Context.

compilation module

The compilation module provides the build_sel4 function for compiling either the seL4 client library or a seL4 kernel (and optionally-distinct root task artifact)

build_helpers module

build_helpers provides utilities for use in the build.rs files of libraries or applications that want to standardize on a shared configuration. End users may consider using this module to apply their sel4.toml configuration as Rust compile-time feature flags to improve portability.

In build.rs:

use selfe_config::build_helpers::*;

fn main() {
    /// Rerun this build script if any of the config-driving environment variables change
    BuildEnv::request_reruns();

    /// Like it says on the tin, paying particular attention to the SEL4_CONFIG_PATH env-var
    let config = load_config_from_env_or_default();

    /// Tells cargo to build the current library with feature-flags set
    /// based on the content of the selected-or-default sel4.toml configuration
    config.print_boolean_feature_flags();
}

Toml Format

See default_config.toml for a minimal example of the format materialized as toml, or consider the following commented walkthrough.

# Location of the required source repositories: seL4 (kernel), seL4_tools (tools), and util_libs
# Any of these three may be specified using the `git` or `path` approach.
[sel4]
kernel = { git = "https://github.com/seL4/seL4" , tag = "10.1.1" }
tools = { git = "https://github.com/seL4/seL4_tools" , branch = "10.1.x-compatible" }
util_libs  = { path = "../misc/util_libs" }
util_libs  = { path = "../misc/util_libs" }

# seL4 kernel and library configuration properties go in [sel4.config.*] tables.
# These properties are ultimately passed to seL4's CMake build system.
# Such tables must only contain string, integer, or boolean properties.
#
# This table corresponds to seL4's notion of an 'arch', matching `model::Arch`
# for the in-memory representation. "x86" would be another reasonable table name.
[sel4.config.arm]
KernelArch = 'arm'

# This table corresponds to seL4's notion of a 'sel4_arch', matching `model::SeL4Arch`
# for the in-memory representation. "aarch64" or "x86_64" would be other comparable names.
[sel4.config.aarch32]
KernelSel4Arch = 'aarch32'
KernelArmSel4Arch = 'aarch32'


# This table corresponds to seL4's notion of a 'platform', matching `model::Platform`
# for the in-memory representation. Platform names are largely unrestricted.
[sel4.config.sabre]
KernelARMPlatform = 'imx6'
KernelHaveFPU = true

# The toml may contain tables for multiple arch/sel4_arch/platform options.
# The precise set of properties is settled through explicit contextualization.
[sel4.config.some-other-platform]
KernelARMPlatform = 'whatever'

# The [sel4.config.debug] and [sel4.config.release] tables correspond to the
# project's expected compilation profile
[sel4.config.debug]
KernelPrinting = true
KernelDebugBuild = true

[sel4.config.release]
KernelPrinting = false
KernelDebugBuild = false

# The [build.*] tables have names corresponding to seL4 platforms,
# and contain an optional `cross_compiler_prefix`, used when
# building libsel4 or seL4 kernels / root tasks.
[build.sabre]
cross_compiler_prefix = "arm-linux-gnueabihf-"

# For application/root task builds, please also supply the command
# necessary to create the project's root task, and the
# expected output location of that task, scoped to the
# platform and build profile  like [build.PLATFORM.debug]
# and [build.PLATFORM.release]
#
# These properties are used by the selfe build tool in particular,
# and are not relevant for libraries.
[build.sabre.debug]
make_root_task = "cargo xbuild --target=armv7-unknown-linux-gnueabihf"
root_task_image = "target/armv7-unknown-linux-gnueabihf/debug/example"

# Note that the `make_root_task` property is technically optional
# if the creation of the root task image is managed at a different
# level of the toolchain.
[build.sabre.release]
make_root_task = "cargo xbuild --target=armv7-unknown-linux-gnueabihf --release"
root_task_image = "target/armv7-unknown-linux-gnueabihf/release/example"

selfe

A build and simulation tool for seL4 applications.

The selfe tool's job is to orchestrate the construction of seL4 applications.

It uses a sel4.toml file sitting in a project's root dir to establish a canonical configuration source and pipes that configuration, along with explicit output platform expectations down through the application's build steps.

Dependencies

~235–600KB
~12K SLoC