Module Sources¶
This page will go in depth on each source type with examples.
Sources are copied or downloaded to the source directory before the build
starts. The source directory lives under flatpak-builder’s state
directory, which by default is located at .flatpak-builder
on host,
relative to the manifest root. The source directory for bzr, git and svn
sources is at .flatpak-builder/git, .flatpak-builder/bzr, .flatpak-builder/svn
respectively while .flatpak-builder/downloads/<checksum>
is used
for file and archive sources.
The type
property of a source determines how that source will be
handled before or during build by flatpak
or flatpak-builder
.
Most of the sources support path
and url
property where path
is relative to the root of manifest and url
is a direct url to the
source.
The url
property requires a checksum to be specified after
using sha256
or sha512
.
There are a few properties common to all source types only-arches
,
skip-arches
and dest
.
only-arches
and skip-arches
are used to build the source only
on the specified architecture or skip building it on the specified
architecture respectively. This is often useful for binary packages.
Bemerkung
Note that only-arches
or skip-arches
are used to control if
that particular source is downloaded on the specified architecture(s).
If not specified, the default is to download on all architectures.
modules:
- name: foo
buildsystem: simple
build-commands:
- ...
- ...
sources:
- type: file
url: https://example.org/foo-1.0-x86_64.deb
sha256: 26c9007c655483438d83f17070190fc4b6bccb8ff5efc30fcedbb7d162681a7f
dest-filename: foo.deb
only-arches:
- x86_64
- type: file
url: https://example.org/foo-1.0-aarch64.deb
sha256: 26c9007c655483438d83f17070190fc4b6bccb8ff5efc30fcedbb7d162681a7f
dest-filename: foo.deb
only-arches:
- aarch64
dest
is used to indicate a directory inside the source directory
where the given source will be placed:
modules:
- name: coolapp
buildsystem: simple
build-commands:
- ...
sources:
- type: archive
url: https://example.org/foo.tar.xz
sha256: 834b06e423d360c97197e7abec99b623fdc5ed3a0c39b88d6467e499074585e1
- type: git
url: https://github.com/foo/bar.git
commit: 3f9389edc6cdf3f78a6896d550c236860aed62b2
dest: 'src/deps/bar'
The contents of foo.tar.xz
will be placed under
.flatpak-builder/build/coolapp/
and the contents of the bar.git
repo will go under .flatpak-builder/build/coolapp/src/deps/bar
.
This is often useful to replace bundled dependencies inside sources with custom versions.
Archive sources¶
These are sources of type: archive
. They are downloaded to the
download directory and extracted into the build directory when the build
starts.
A typical example of using this is:
modules:
- name: foo
buildsystem: meson
sources:
- type: archive
url: https://example.org/foo-1.0.tar.xz
mirror-urls:
- https://mirror.example.com/foo-1.0.tar.xz
sha256: 26c9007c655483438d83f17070190fc4b6bccb8ff5efc30fcedbb7d162681a7f
dest-filename: foo.tar.xz
strip-components: 2
mirror-urls
is a list of alternative urls that will be used for downloading, if the mainurl
fails.The
sha256
is the sha256 checksum of the downloaded file, supplied by upstream of the source or calculated usingsha256sum
.dest-filename
is not usually used for this source. It is used to rename the downloaded file. This can be useful if the buildsystem expects a certain name for the archive.strip-components
is the number of pathname components to strip during extraction. This defaults to1
if not specified.
# orginal archive
.
└── a
├── b
│ ├── c
│ │ └── FILE
│ └── FILE
└── FILE
# strip-components: 1
.
├── b
│ ├── c
│ │ └── FILE
│ └── FILE
├── FILE
# strip-components: 2
.
├── c
│ └── FILE
├── FILE
flatpak-builder
supports
the following archive types: "rpm", "tar", "tar-gzip", "tar-compress", "tar-bzip2", "tar-lzip", "tar-lzma", "tar-lzop", "tar-xz", "tar-zst", "zip", "7z"
The archive type is guessed from the suffix of the file basename.
rpm
is extracted with rpm2cpio
, zip
is extracted with unzip
and 7z
is extracted with 7z
. The rest are extracted with
tar
. These should be present on host so that flatpak-builder can
use them.The archive type is calculated from the suffix of the file
basename.
In case the correct archive type cannot be guessed from the filename
archive-type: str
can be used to manually specify the type where
str
is one of the above types.
Git sources¶
These are sources of type: git
and it requires git
to be
available on the host. A typical example of using this is:
modules:
- name: foo
buildsystem: meson
sources:
- type: git
url: https://example.org/repo/foo.git
tag: <git tag>
commit: <commit hash>
url
is url of the git repository. The following schemes are usually usedhttp://
,https://
,git://
,git+ssh://
,ssh://
.
Tipp
To use the file://
scheme for a git repository, do
git config --global protocol.file.allow always
.
A
branch: branch_name
can also be used in place of atag
andcommit
.commit
is the commit to use from the git repository.In case of a tag, this must be the commit, the tag points to (
git rev-list -n 1 $tag
). In case of abranch
, it is verified that the branch points to this specific commit (git show-ref "refs/heads/$branch"
).
Tipp
To ensure reproduciblity and avoid build failures, it is best to avoid
using branch
and always add a commit
to a tag
.
By default flatpak-builder
will do a shallow-clone of the git
repository and checkout submodules if any. disable-shallow-clone: true
and disable-submodules
can be used to override this behaviour.
git
source also supports using a local git repository with the
path
property.
Bemerkung
Currently flatpak-builder
does not support git lfs
. It can
be worked around with using buildsystem: simple
and running
git lfs pull
in the build-commands
.
File sources¶
These are sources of type: file
. They are copied into the source
directory without any modifications.
Any arbitrary file type can be specified here along with
buildsystem: simple
to manually modify, build or install it
within build-commands
. This can be used in place of type: archive
to manually extract an archive, uncompress squashfs filesystems
(like snaps) etc. provided the tool being used is made available inside
the sandbox.
A typical example is:
modules:
- name: foo
buildsystem: simple
build-commands:
- install -Dm0644 org.example.foo.metainfo.xml -t ${FLATPAK_DEST}/share/metainfo/
- bsdtar -Oxf foo.deb 'data.tar.xz' | bsdtar -xf -
- mv opt/ ${FLATPAK_DEST}/
- ln -s ${FLATPAK_DEST}/opt/executable ${FLATPAK_DEST}/bin/executable
sources:
- type: file
dest-filename: foo.deb
url: https://example.org/foo-v1.0.deb
sha256: <sha256 checksum of foo.deb>
- type: file
path: org.example.foo.metainfo.xml
- name: unsquashfs
buildsystem: simple
build-commands:
- XZ_SUPPORT=1 make -C squashfs-tools -j ${FLATPAK_BUILDER_N_JOBS} unsquashfs
- install -Dpm755 -t "${FLATPAK_DEST}/bin" squashfs-tools/unsquashfs
sources:
- type: git
url: https://github.com/plougher/squashfs-tools.git
tag: 4.6.1
commit: d8cb82d9840330f9344ec37b992595b5d7b44184
- name: bar
buildsystem: simple
build-commands:
- unsquashfs -dest bar -quiet -no-progress squashed.snap
- mv bar ${FLATPAK_DEST}
- ln -s ${FLATPAK_DEST}/bar/executable ${FLATPAK_DEST}/bin/executable
sources:
- type: file
dest-filename: squashed.snap
url: https://example.org/squashed-1.0.snap
sha256: <sha256 checksum of squashed-1.0.snap>
dest-filename
is typically used with this source type to make the
filename predictable for the commands in the build-commands
array.
Patch sources¶
These are sources of type: patch
used with patchfiles. This requires
patch
and optionally git
to be available on host. The typical
usage is to create patchfiles and place them somewhere relative to the
manifest root. The path
property is the location of the file relative
to the manifest.
modules:
- name: foo
buildsystem: cmake-ninja
builddir: true
config-opts:
- ...
sources:
- type: git
url: https://example.org/foo.git
tag: v1.0.0
commit: 63c01f14391aef7d7691c7c63a610d47512147ed
- type: patch
path: patches/test-patch.patch
Multiple patches can be specified with paths
:
- type: patch
paths:
- patches/test1-patch.patch
- patches/test2-patch.patch
By default, patch -p 1
is used, but it can be adjusted with
strip-components
and additional options can be passed with
options
.
The default patchfiles generated with git format-patch
or git diff
do not need any additional options.
- type: patch
paths:
- patches/test1-patch.patch
- patches/test2-patch.patch
options:
- -d
- dir1
use-git: true
and use-git-am: true
can be used to use
git apply
and git am
respectively instead of patch
.
Shell and Script sources¶
A shell source with type: shell
is used to modify a source during
extraction. commands
takes in any shell commands.
This is usually used to make quick modifications to sources but a patch should be used for any complex modification to make it fail safe.
modules:
- name: foo
sources:
- type: archive
url: https://example.org/foo.tar.xz
sha256: ea029a2e21d2d6ad0a156f6679bd66836204aa78148a4c5e498fe682e77127ef
- type: shell
commands:
- autoreconf -vfi
A script source with type: script
is used to create self-contained
/bin/sh
scripts. commands
takes in any shell commands and
dest-filename
can be used to specify the name for the resultant
file inside the source directory.
This is often useful if the executable requires custom arguments to be passed before launch.
modules:
- name: foo
buildsystem: simple
build-commands:
- ...
- install -Dm755 run ${FLATPAK_DEST}/bin/run
sources:
- type: archive
url: https://example.org/foo-1.0.tar.xz
sha256: 842ab8e69c94e985ba188cc22848c0515e9fa114380adcc08572d3fb9cfa19db
- type: script
dest-filename: run
commands:
- exec /app/foo/bin/foo_binary "$@"
Extra Data¶
Extra data is often used for proprietary applications to avoid redistribution by downloading the binary package provided by the original distributors during installation by the user. It may also be used for sources with very large file sizes (over several gigabytes) to avoid storing a huge amount of data in the ostree repository.
Since the package is downloaded only when installing, the application metadata such as the desktop file, icon and the MetaInfo file must be installed beforehand so that appstream can compose them to generate catalogue data.
When installing the Flatpak package containing an extra data source,
Flatpak calls the apply_extra
script which executes the command defined
in it. The dependencies needed to run the commands in the script must be
available in the sandbox.
The following properties must be present for an extra-data source:
type: extra-data
indicates that this is an extra-data source. Multiple such sources can exist.url
should be a direct link to the binary source package. This is downloaded by Flatpak when installing the Flatpak package.sha256
should be its SHA-256 checksum of the above package.size
should be the file size of the package in bytes (wc --bytes < file
).filename
can be anything to name the downloaded source package.
The binary source packages are often specific to one architecture, so
only-arches
can be used to make the build specific to that
architecture only.
A typical extra-data manifest may look like:
modules:
- shared-modules/lzo/lzo.json
- shared-modules/squashfs-tools/squashfs-tools.json
- name: dependency1
...
- name: dependency2
...
- name: foo
buildsystem: simple
build-commands:
- install -Dm644 ${FLATPAK_ID}.metainfo.xml ${FLATPAK_DEST}/share/metainfo/${FLATPAK_ID}.metainfo.xml
- install -Dm644 foo.desktop ${FLATPAK_DEST}/share/applications/${FLATPAK_ID}.desktop
- install -Dm644 foo.svg ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/${FLATPAK_ID}.svg
- ln -s ${FLATPAK_DEST}/extra/subdir/foo_binary ${FLATPAK_DEST}/bin/foo_binary
- install -Dm755 apply_extra ${FLATPAK_DEST}/bin/apply_extra
sources:
- type: extra-data
filename: foo.snap
only-arches:
- x86_64
url: https://example.org/foo_v1.2.snap
sha256: 842ab8e69c94e985ba188cc22848c0515e9fa114380adcc08572d3fb9cfa19db
size: 123101184
- type: file
path: com.flatpak.foo.metainfo.xml
- type: file
path: foo.desktop
- type: file
path: foo.svg
- type: script
dest-filename: apply_extra
commands:
- unsquashfs -quiet -no-progress foo.snap
- mv squashfs-root/usr/lib/foo/* .
- rm -r squashfs-root foo.snap
The buildsystem
is simple
as the module is manually installed.
The apply_extra
script here requires
unsquashfs
to run, so that is built and installed.
Bemerkung
Flatpak supports exporting icons, desktop files etc. from
/app/extra/export/share/
however when creating a Flatpak package
for a software store like Flathub or when composing the metadata with
appstreamcli, desktop files and icons must not be placed in
/app/extra/export/
and instead should go to the proper locations
documented in Anforderungen & Konventionen.
The icon, desktop file and Metainfo must be added as sources. The
path
indicates that they reside in the same directory relative to the
manifest. The first three lines of the build-commands
installs them
so that appstream-compose
can compose the metadata.
The last line creates an empty symlink from ${FLATPAK_DEST}/extra/
to ${FLATPAK_DEST}/bin/
so that the executable is found in $PATH
inside the sandbox and can be used in the top-level command: foo_binary
property. Instead of a symlink this also often a script like:
#!/bin/sh
exec /app/extra/subdir/foo_binary "$@"
The subdir
directory comes from the contents of the extracted snap
and how that is installed.
Bemerkung
Note that variables like $FLATPAK_DEST
are not available in the
runtime sandbox or in the sandbox where apply_extra
is executed
when installing the Flatpak.
Please avoid using them when creating the script in the manifest as this will be incorrectly expanded.
The commands needed to extract the snap are specified in the apply_extra
script. These can be any shell commands that run when installing the
Flatpak package but note that it won’t have access to anything outside
/app/extra
. The script is run in a sandbox
(equivalent to flatpak run --sandbox
) and won’t have network, dbus or
any host access. The apply_extra
can itself be a seperate script file
too but must be installed as ${FLATPAK_DEST}/bin/apply_extra
.
unsquashfs -quiet -no-progress foo.snap
extracts the snap package
into a directory called squashfs-root
, then the contents of that
direcory are moved to /app/extra
and lastly squashfs-root
and the
snap package itself is cleaned up to save space.
This is another example that can be used to extract Debian packages (.deb
).
- name: foo
buildsystem: simple
build-commands:
- install -Dm755 apply_extra ${FLATPAK_DEST}/bin/apply_extra
- install -Dm644 -t ${FLATPAK_DEST}/share/metainfo/ ${FLATPAK_ID}.metainfo.xml
- install -Dm644 -t ${FLATPAK_DEST}/share/applications/ ${FLATPAK_ID}.desktop
- install -Dm644 -t ${FLATPAK_DEST}/share/icons/hicolor/scalable/apps/ ${FLATPAK_ID}.svg
- ln -s ${FLATPAK_DEST}/extra/bin/foo_binary ${FLATPAK_DEST}/bin/foo_binary
sources:
- type: script
dest-filename: apply_extra
commands:
- bsdtar --to-stdout -xf foo.deb data.* | bsdtar -xf -
- rm foo.deb
Flatpak extensions can also use extra-data sources in a similar manner. This is an example of an extension manifest utilising an extra-data source.
app-id: com.foo.app.Plugins.audio
runtime: com.foo.app
sdk: org.freedesktop.Sdk//23.08
build-extension: true
separate-locales: false
modules:
- name: foo
buildsystem: simple
build-commands:
- install -Dm755 apply_extra -t $FLATPAK_DEST/bin/
sources:
- type: script
dest-filename: apply_extra
commands:
- bsdtar -xf foo.qdz --strip-components=3
- rm -f foo.qdz
- type: extra-data
filename: foo.qdz
url: http://example.org/foo_v1.qdz
sha256: 2027ed7e5935612a38c3f7b751b6bd23cfb5b06d1a1e5f34907bc021b09de225
size: 523360406
For more information on Flatpak extensions please see Extensions.
Directory source¶
A directory source with type: dir
is best suited for use in CI to
build the latest changes and avoid downloading multiple times. These
don’t support any caching, so it will be rebuilt each time the
application is being built.
When submitting an application to software stores like Flathub, dir
should be avoided altogether.
path
should be the path of the local directory relative to the
manifest root path, whoose contents will be copied during build.
modules:
- name: foo
buildsystem: simple
build-commands:
- ...
sources:
- type: dir
path: icons
Additonally there are bzr, svn and inline sources supported. bzr and svn requires the bzr and svn commandline tools to be installed respectively. Please see Flatpak Builder Command Reference for them.