Platform grammar¶
Platform grammar describes statements that select a project file’s key values based on the build’s target platform. This allows for an image to be catered to the needs of each platform declared in its project file.
for statements¶
The for statement selects key values based on the build’s target platform, and
accepts a single platform as its argument.
<key>:
- for <platform-1>: <value-1>
[...]
- for <platform-n>: <value-n>
If a for statement matches against the build’s target platform, its value is
assigned.
Similar logic applies when assigning values to lists.
<key>:
- for <platform-1>:
- <value-1>
[...]
- for <platform-n>:
- <value-n>
- <default>
If a for statement matches against the build’s target platform, its values are
appended to the list. Values that aren’t nested in a for statement are appended
regardless of the target platform.
any platform¶
any is a platform that, when included in a for statement, will always match
against the build’s target platform.
<key>:
- for <platform-1>: <value-1>
- for any: <default>
If no other for statements match against the build’s target platform, the for
any statement’s value is assigned. If the key expects a single value and multiple
for statements match against the build’s target platform, the value of the first
match is assigned. If a for any statement is included in a list, its items will
always be appended.
else clauses¶
A for statement can be followed by an optional else clause.
<key>:
- for <platform-1>: <value-1>
- else: <default>
The body of the else clause is only assigned if the preceding for statement
doesn’t match against the build’s target platform.
An else clause only considers the outcome of the for statement that comes
immediately before it.
platforms:
laptop:
build-on: amd64
build-for: amd64
dev-board:
build-on: [amd64, arm64]
build-for: arm64
[...]
build-packages:
- for laptop:
- git
- for dev-board:
- python3-dev
- else:
- make
For a build targeting the laptop platform, the build-packages key would include
both git and make. Despite for laptop matching, the else statement’s
values are still appended, as the for dev-board statement didn’t match.
else clauses can be placed after any for statement, regardless of its position.
The following build-packages declaration yields the same results as the previous
example:
[...]
build-packages:
- for dev-board:
- python3-dev
- else:
- make
- for laptop:
- git
Example¶
The following project file snippet declares two platforms, laptop and dev-board,
and platform-specific values for the source and build-environment keys in the
ffmpeg part.
platforms:
laptop:
build-on: amd64
build-for: amd64
dev-board:
build-on: [amd64, arm64]
build-for: arm64
[...]
parts:
ffmpeg:
plugin: dump
source:
- for laptop: https://github.com/ffbinaries/ffbinaries-prebuilt/releases/download/v6.1/ffmpeg-6.1-linux-64.zip
- for dev-board: https://github.com/ffbinaries/ffbinaries-prebuilt/releases/download/v6.1/ffmpeg-6.1-linux-arm-64.zip
build-environment:
- for laptop:
- DISPLAY: Idle
- for dev-board:
- BOARD_STATUS: Ready
- NAME: FFmpeg part
[...]
The build for the laptop platform pulls the x64 source for the ffmpeg part and
sets the DISPLAY build environment variable to Idle. The build for the
dev-board platform pulls the ARM64 source and sets the BOARD_STATUS build
environment variable to Ready. The builds for both platforms set the NAME
environment variable to FFmpeg part.
After the grammar is resolved, the two builds are equivalent to those produced by the following single-platform project files:
laptop project file after grammar resolution
platforms:
laptop:
build-on: amd64
build-for: amd64
[...]
parts:
ffmpeg:
plugin: dump
source: https://github.com/ffbinaries/ffbinaries-prebuilt/releases/download/v6.1/ffmpeg-6.1-linux-64.zip
build-environment:
- DISPLAY: Idle
- NAME: FFmpeg part
[...]
dev-board project file after grammar resolution
platforms:
dev-board:
build-on: [amd64, arm64]
build-for: arm64
[...]
parts:
ffmpeg:
plugin: dump
source: https://github.com/ffbinaries/ffbinaries-prebuilt/releases/download/v6.1/ffmpeg-6.1-linux-arm-64.zip
build-environment:
- BOARD_STATUS: Ready
- NAME: FFmpeg part
[...]