Architectures¶
The platforms
and architectures
keywords in a snapcraft.yaml
file
are used to define where snaps are built and where they will execute.
The keywords are base-dependent:
platforms
is used forcore24
snapsarchitectures
is used forcore20
andcore22
snaps
Build-on, build-for, and run-on¶
build-on
, build-for
, and run-on
are used within the
architectures
and platforms
keywords in a snapcraft.yaml
file.
core24
usesbuild-on
andbuild-for
core22
usesbuild-on
andbuild-for
core20
usesbuild-on
andrun-on
build-on¶
The architecture of the machine that the snap is built on (i.e. the machine where snapcraft runs).
build-for¶
The architecture of the machine that the snap is built for (i.e. the machine where the snap will be installed).
run-on¶
This is used for core20
and has the same meaning as build-for
. It has
been replaced with the preferred term build-for
in core22
and newer
bases.
Build plans¶
A build plan is a list of what snaps snapcraft will build. It can be defined
in the snapcraft.yaml
and filtered with command-line arguments and
environment variables.
Snapcraft can create multiple snaps, each built for a different architecture.
Consider the following equivalent snapcraft.yaml
snippets.
base: core24
platforms:
amd64:
arm64:
build-on: [amd64, arm64]
build-for: [arm64]
base: core22
architectures:
- build-on: [amd64]
build-for: [amd64]
- build-on: [amd64, arm64]
build-for: [arm64]
If snapcraft executes on an amd64
machine, then it will create the
following build plan:
Created build plan:
build-on: amd64 build-for: amd64
build-on: amd64 build-for: arm64
Two snap files will be created: my-snap_1.0_amd64.snap
and
my-snap_1.0_arm64.snap
.
If snapcraft executes on an arm64
machine, then it will create the
following build plan:
Created build plan:
build-on: arm64 build-for: arm64
One snap file will be created: my-snap_1.0_arm64.snap
.
core24¶
The build plan can be filtered with one of the following methods:
environment variable
CRAFT_BUILD_FOR=<arch>
environment variable
SNAPCRAFT_BUILD_FOR=<platform>
command-line argument
--build-for=<arch>
command-line argument
--platform=<platform>
The command-line argument takes priority over the environment variable. In the
example above, using --build-for=arm64
would cause snapcraft to build one
snap for arm64
.
Building with a provider¶
When building a snap with LXD or Multipass, each build in the build plan occurs in its own environment.
Destructive mode¶
In destructive mode, snapcraft will only build one snap at a time. If multiple
snaps can be built, snapcraft will fail to run. The build plan must be narrowed
down with the --build-for
or --platform
arguments.
core22¶
This build plan can be filtered with the environment variable
SNAPCRAFT_BUILD_FOR=<arch>
or the command-line argument
--build-for=<arch>
. The command-line argument takes priority over the
environment variable. In the example above, using --build-for=arm64
would
cause snapcraft to only build one snap for arm64
.
Building with a provider¶
When building a snap with LXD or Multipass, each build in the build plan occurs in its own environment.
Destructive mode¶
In destructive mode, all builds in the build plan occur in the same location.
This can cause unintended consequences, such as parts not being re-built for
each architecture
.
To work around this, use --build-for
or SNAPCRAFT_BUILD_FOR
to build
one snap at a time and run snapcraft clean --destructive-mode
when changing
the build-for architecture.
core20¶
Build plans are not supported in core20
so building a core20
snap will
only produce one snap.
Snapcraft does not automatically clean the build environment when the
architecture
keyword is changed. Therefore snapcraft clean
should be
run when changing architectures.
Remote build¶
Launchpad supports building snaps on multiple architectures or platforms.
If architectures
or platforms
are not defined in the snapcraft.yaml
,
then Launchpad will build the snap on amd64
.
When a snap can be built on multiple architectures, Launchpad can choose which
build-on
platform to use. Consider the following equivalent snippets:
base: core24
platforms:
ppc64el:
build-on: [amd64, arm64]
build-for: [ppc64el]
base: core22
architectures:
- build-on: [amd64, arm64]
build-for: [ppc64el]
Launchpad may build the snap on an amd64
or arm64
platform. This choice
is controlled by Launchpad and cannot be influenced by the user.
Architecture errors¶
Could not make build plan¶
Could not make build plan: build-on architectures in snapcraft.yaml does
not match host architecture (amd64).
This core22
error has two common causes.
The first cause is that snapcraft is not able to create a build plan because
the there are no build-on
architectures matching the host’s architecture.
To resolve this, build the snap on an architecture listed in the
snapcraft.yaml
or add the host architecture as a build-on
value.
The second cause is due to not enclosing a list of multiple architectures with brackets. For example:
architectures:
- build-on: amd64, arm64
build-for: [arm64]
should be changed to:
architectures:
- build-on: [amd64, arm64]
build-for: [arm64]
The brackets are required for lists. This problem is described in more detail here.
Unsupported architectures in remote build¶
The following architectures are not supported by the remote builder:
amd64, arm64.
Please remove them from the architecture list and try again.
This error has two common causes. First, the architecture may not be supported by launchpad. See here for a list of architectures supported by Launchpad.
The second cause is the same as above - not enclosing a list of multiple architectures with brackets.