Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
5482b32
fix(windows): classify UASP storage as USB
elibosley Aug 5, 2026
e07fd39
perf(extract): coalesce archive blocks into large writes
elibosley Aug 4, 2026
e035beb
fix(zstd): use ZSTD_findDecompressedSize for multi-frame .img.zst sup…
tdewey-rpi Jul 20, 2026
7c038fa
fix(qml): Use bound entity for SSH key row data
tdewey-rpi Jul 20, 2026
ec8cf67
fix(qml): Remove unused ImageOptions enum
tdewey-rpi Jul 20, 2026
20504da
fix(mac): Use blocking DistArbitration calls
tdewey-rpi Jul 20, 2026
62de200
refactor(mac): Break out nested run loop into worker threads
tdewey-rpi Jul 20, 2026
44834a7
fix(windows): Hold volume locks instead of deleting drive letters
tdewey-rpi Jul 20, 2026
540bf17
fix(windows): Take exclusive lock on drive open, only delete removabl…
tdewey-rpi Jul 20, 2026
26e9b58
fix(linux): Take exclusive lock on drive open
tdewey-rpi Jul 20, 2026
300f968
fix(windows): retry exclusive drive open before falling back to shared
tdewey-rpi Jul 21, 2026
e0c2d1e
fix(windows): flush filesystem to media before writing the partition …
tdewey-rpi Jul 21, 2026
fbf8a45
fix(qml): Make customisation steps always centre-middle layout.
tdewey-rpi Jul 21, 2026
0438325
fastboot: Add Erase command for 'Format'
tdewey-rpi Jul 22, 2026
6f9bc13
fix(ui): Allow query parameters on custom manifest URLs
tdewey-rpi Jul 22, 2026
f8d5b03
fastboot: Verify device identity before treating it as a Pi target
tdewey-rpi Jul 22, 2026
ab33422
fastboot: Align stage() tests and docs with the download verb
tdewey-rpi Jul 22, 2026
163f155
packaging: linux: Install Fastboot rule inside .debs
tdewey-rpi Jul 29, 2026
5f40a92
qml: Fixup binding loops for width & height parameters
tdewey-rpi Jul 30, 2026
14336ec
customisation: Verify the device kept the customisation files
tdewey-rpi Jul 30, 2026
1060fd7
deps: vendor third-party libraries as git submodules
tdewey-rpi Jul 3, 2026
1f31ceb
qt: build helper tweaks and 32-bit armhf test-support patch
tdewey-rpi Jul 3, 2026
720b900
debian: rootless multi-arch (amd64/arm64/armhf) release pipeline
tdewey-rpi Jul 3, 2026
4dfb06d
debian: bookworm chroots, self-contained AppImages, drop ICU
tdewey-rpi Aug 4, 2026
f1811af
cloud-init: write `sudo: null` when passwordless sudo is declined
tdewey-rpi Aug 4, 2026
351237c
linux: probe for the liburing 64-bit user_data API before enabling io…
tdewey-rpi Aug 4, 2026
6780441
debian: drop the host-native build path
tdewey-rpi Aug 4, 2026
0ec9803
embedded: assemble via debhelper, drop ICU, fix rpath and font links
tdewey-rpi Aug 5, 2026
cc302c4
embedded: build the app without QtDBus
tdewey-rpi Aug 5, 2026
26d2e3d
qt: dedicated embedded Qt built -no-opengl -no-dbus -no-icu
tdewey-rpi Aug 5, 2026
359ad83
embedded: stop vendoring and declaring the removed libraries
tdewey-rpi Aug 5, 2026
ca98bbb
release: 2.0.11-1
tdewey-rpi Aug 6, 2026
0409769
feat(fastboot): Make enable flag sticky
tdewey-rpi Aug 6, 2026
e5bc232
fix(zstd/libarchive): Use static built zstd
tdewey-rpi Aug 6, 2026
38087f8
fix(ui): Handle control characters across all ImTextFields, Wifi Pass…
tdewey-rpi Aug 12, 2026
a8bcd5b
gitignore: anchor the build-product patterns to the repository root
tdewey-rpi Aug 13, 2026
75a349f
qt: select the Qt version in one place
tdewey-rpi Aug 13, 2026
131de70
doc: document the Linux release pipeline
tdewey-rpi Aug 13, 2026
eeba7f3
doc: correct the stale Linux build instructions
tdewey-rpi Aug 13, 2026
21c43d8
doc: stop quoting Qt versions in the qt build guides
tdewey-rpi Aug 13, 2026
d4f08f7
doc: explain how to build several architectures at once
tdewey-rpi Aug 13, 2026
bbd076d
debian: restore the Debian revision on 2.0.11
tdewey-rpi Aug 13, 2026
0f8433a
fix(telemetry): Gate device identification on actually opening cpuinfo
tdewey-rpi Aug 13, 2026
2aa9677
gitignore: Fixup qt intermediate rejection
tdewey-rpi Aug 13, 2026
8c3b933
fix(ui): Fixup text box autopopulation
tdewey-rpi Aug 17, 2026
04b4c65
version: carry a fourth version component through to packaging
tdewey-rpi Aug 17, 2026
5466715
fix(telemetry): keep the fourth version component in imagerVersion
tdewey-rpi Aug 17, 2026
fff86ec
test(cloud-init): expect no payload when nothing is customised
tdewey-rpi Aug 17, 2026
c21abeb
test: report Catch2 skips to CTest as skipped
tdewey-rpi Aug 17, 2026
e9ddd2a
test(fat): keep pre-main diagnostics off stdout
tdewey-rpi Aug 17, 2026
1f3a477
test(rpiboot): match the current FileServer protocol
tdewey-rpi Aug 17, 2026
04fd342
release: 2.0.11.1-1
tdewey-rpi Aug 17, 2026
8c2f698
github: bring the issue template version lists up to date
tdewey-rpi Aug 17, 2026
f259e1c
packaging: deploy Qt Wayland plugins into AppImages
tdewey-rpi Aug 17, 2026
72ad117
Ensure necessary submodule tags are fetched
roliver-rpi Aug 17, 2026
c7e1cef
chore(repo): merge upstream 2.0.11.1
elibosley Aug 18, 2026
b4e44ea
fix(eject): carry the upstream review fixes into the fork
elibosley Aug 18, 2026
13cffb2
fix(windows): release the drive before the post-format rescan
elibosley Aug 19, 2026
fc26dd9
ci: stop a stalled apt mirror from eating the whole job
elibosley Aug 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/ISSUE_TEMPLATE/bug-report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ body:
label: Version
description: What version of our software are you running?
options:
- 2.0.10 (Default)
- 2.0.11.1 (Default)
- 2.0.11
- 2.0.10
- 2.0.9
- 2.0.8
- 2.0.7
Expand All @@ -33,6 +35,7 @@ body:
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- < 2.0.0
default: 0
Expand Down
5 changes: 4 additions & 1 deletion .github/ISSUE_TEMPLATE/feature-request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ body:
label: Version
description: What version of our software did you last run?
options:
- 2.0.10 (Default)
- 2.0.11.1 (Default)
- 2.0.11
- 2.0.10
- 2.0.9
- 2.0.8
- 2.0.7
Expand All @@ -56,6 +58,7 @@ body:
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- < 2.0.0
default: 0
Expand Down
46 changes: 35 additions & 11 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -306,19 +306,43 @@ jobs:
with:
fetch-depth: 0

# A stalled apt mirror on the hosted runner has hung this step for 40+
# minutes more than once (it normally finishes in well under two), which
# burns the job's whole time budget before a compiler ever runs. Kill an
# attempt that stops making progress and retry instead of waiting it out.
# GitHub's runners point at the azure.archive.ubuntu.com mirrors, which is
# what stalls, so the retry falls back to the canonical archive.
- name: Install build dependencies
timeout-minutes: 20
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential cmake libgnutls28-dev libudev-dev \
libgl1-mesa-dev libfontconfig1-dev libfreetype-dev \
libx11-dev libx11-xcb-dev libxcb-cursor-dev libxcb-glx0-dev \
libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev \
libxcb-randr0-dev libxcb-render-util0-dev libxcb-shape0-dev \
libxcb-shm0-dev libxcb-sync-dev libxcb-util-dev \
libxcb-xfixes0-dev libxcb-xkb-dev libxcb1-dev libxext-dev \
libxfixes-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev \
libxrender-dev fuse libfuse2
set -uo pipefail
packages="build-essential cmake libgnutls28-dev libudev-dev libgl1-mesa-dev libfontconfig1-dev libfreetype-dev libx11-dev libx11-xcb-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-shape0-dev libxcb-shm0-dev libxcb-sync-dev libxcb-util-dev libxcb-xfixes0-dev libxcb-xkb-dev libxcb1-dev libxext-dev libxfixes-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libxrender-dev fuse libfuse2"

apt_try() {
# shellcheck disable=SC2086 # $packages must word-split into arguments
sudo timeout 300 apt-get update && \
sudo timeout 600 apt-get install -y --no-install-recommends $packages
}

for attempt in 1 2 3; do
if apt_try; then
echo "apt succeeded on attempt $attempt"
exit 0
fi
echo "::warning::apt attempt $attempt stalled or failed - retrying"
# A killed apt leaves its locks and a half-applied dpkg state behind.
sudo pkill -9 -f 'apt-get|dpkg' || true
sudo rm -f /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock*
sudo dpkg --configure -a || true
if [ "$attempt" = 1 ]; then
echo "Switching off the azure mirrors for the retry"
sudo sed -i 's|//azure.archive.ubuntu.com|//archive.ubuntu.com|g' /etc/apt/sources.list
fi
sleep 15
done

echo "::error::apt-get failed after 3 attempts"
exit 1

- name: Install Qt ${{ env.QT_VERSION }}
run: |
Expand Down
48 changes: 36 additions & 12 deletions .github/workflows/e2e-qemu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,20 +32,44 @@ jobs:
with:
fetch-depth: 0

# A stalled apt mirror on the hosted runner has hung this step for 40+
# minutes more than once (it normally finishes in well under two), which
# burns the job's whole time budget before a compiler ever runs. Kill an
# attempt that stops making progress and retry instead of waiting it out.
# GitHub's runners point at the azure.archive.ubuntu.com mirrors, which is
# what stalls, so the retry falls back to the canonical archive.
- name: Install build and E2E dependencies
timeout-minutes: 20
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential cloud-image-utils cmake curl fuse libfuse2 \
libfontconfig1-dev libfreetype-dev libgl1-mesa-dev libgnutls28-dev \
libudev-dev libx11-dev libx11-xcb-dev libxcb-cursor-dev \
libxcb-glx0-dev libxcb-icccm4-dev libxcb-image0-dev \
libxcb-keysyms1-dev libxcb-randr0-dev libxcb-render-util0-dev \
libxcb-shape0-dev libxcb-shm0-dev libxcb-sync-dev libxcb-util-dev \
libxcb-xfixes0-dev libxcb-xkb-dev libxcb1-dev libxext-dev \
libxfixes-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev \
libxrender-dev mtools parted qemu-system-x86 qemu-utils xz-utils zip
if [ -e /dev/kvm ]; then sudo chmod 666 /dev/kvm; fi
set -uo pipefail
packages="build-essential cloud-image-utils cmake curl fuse libfuse2 libfontconfig1-dev libfreetype-dev libgl1-mesa-dev libgnutls28-dev libudev-dev libx11-dev libx11-xcb-dev libxcb-cursor-dev libxcb-glx0-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-shape0-dev libxcb-shm0-dev libxcb-sync-dev libxcb-util-dev libxcb-xfixes0-dev libxcb-xkb-dev libxcb1-dev libxext-dev libxfixes-dev libxi-dev libxkbcommon-dev libxkbcommon-x11-dev libxrender-dev mtools parted qemu-system-x86 qemu-utils xz-utils zip"

apt_try() {
# shellcheck disable=SC2086 # $packages must word-split into arguments
sudo timeout 300 apt-get update && \
sudo timeout 600 apt-get install -y --no-install-recommends $packages
}

for attempt in 1 2 3; do
if apt_try; then
echo "apt succeeded on attempt $attempt"
if [ -e /dev/kvm ]; then sudo chmod 666 /dev/kvm; fi
exit 0
fi
echo "::warning::apt attempt $attempt stalled or failed - retrying"
# A killed apt leaves its locks and a half-applied dpkg state behind.
sudo pkill -9 -f 'apt-get|dpkg' || true
sudo rm -f /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock*
sudo dpkg --configure -a || true
if [ "$attempt" = 1 ]; then
echo "Switching off the azure mirrors for the retry"
sudo sed -i 's|//azure.archive.ubuntu.com|//archive.ubuntu.com|g' /etc/apt/sources.list
fi
sleep 15
done

echo "::error::apt-get failed after 3 attempts"
exit 1

- name: Install Qt 6.11.1
run: |
Expand Down
36 changes: 22 additions & 14 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ src/build/*
src/build/**
compile_commands.json
src/.cache/clangd
obj-**
/obj-**

# IDE Configurations
.vscode
.zed
.idea

# Debian packaging
debian/release.conf
debian/rpi-imager/**
debian/rpi-imager-amd64/**
debian/rpi-imager-embedded/**
Expand All @@ -30,28 +31,31 @@ debian/com.raspberrypi.rpi-imager.metainfo.xml
*.*swp*

# AppImage related
# Patterns for build products at the repository root are anchored with a leading
# slash: unanchored patterns match by basename at every depth, which silently
# swallowed debian/appimage-pack.sh, qt/build-qt*.sh and src/timezones.txt.
*.AppImage*
*.appimagecraft*
AppDir-*
appimage-*
/AppDir-*
/appimage-tools/

# Embedded .deb build tree (created by create-embedded.sh)
debroot-embedded-*
rpi-imager-embedded*.deb
screenshot.png
/debroot-embedded-*
/rpi-imager-embedded*.deb

# Qt related
qt-build**
qt-src**
# build-qt*.sh creates these as $PWD/qt-src and $PWD/qt-build[-suffix], so they
# land wherever the script was run from -- usually qt/, per the READMEs. Hence
# no leading slash. The trailing slash restricts each to directories, which is
# what keeps qt-build* from swallowing the tracked qt/qt-build-common.sh.
qt-src/
qt-build/
qt-build-*/
qt/language_filters.json
build
build-**

# IANA Timezone database generated as part of build
timezones.txt
/build-**

# build-cli-only related
test-cli-**
/test-cli-**

# clangd related
.cache/clangd
Expand All @@ -62,3 +66,7 @@ test-cli-**

# UNRAID: local build output
/build/

# Debian release tooling (local paths; see debian/release.conf.example)
/.debian/
/out/
21 changes: 21 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
[submodule "src/dependencies/vendor/xz"]
path = src/dependencies/vendor/xz
url = https://github.com/tukaani-project/xz.git
[submodule "src/dependencies/vendor/zstd"]
path = src/dependencies/vendor/zstd
url = https://github.com/facebook/zstd.git
[submodule "src/dependencies/vendor/zlib"]
path = src/dependencies/vendor/zlib
url = https://github.com/madler/zlib.git
[submodule "src/dependencies/vendor/nghttp2"]
path = src/dependencies/vendor/nghttp2
url = https://github.com/nghttp2/nghttp2.git
[submodule "src/dependencies/vendor/libarchive"]
path = src/dependencies/vendor/libarchive
url = https://github.com/libarchive/libarchive.git
[submodule "src/dependencies/vendor/curl"]
path = src/dependencies/vendor/curl
url = https://github.com/curl/curl.git
[submodule "src/dependencies/vendor/libusb"]
path = src/dependencies/vendor/libusb
url = https://github.com/libusb/libusb.git
89 changes: 66 additions & 23 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,74 @@

### Linux

Linux artifacts are built by one pipeline, driven from `debian/release.sh`. It
builds every architecture — amd64, arm64 and armhf — inside its own rootless
`mmdebstrap` chroot, from a machine of any of those architectures, and needs no
`sudo`. [doc/linux-build.md](./doc/linux-build.md) is the full reference; this is
the short version.

#### Get dependencies

- Install the build dependencies (Debian used as an example):
Only what is needed to drive the pipeline; the actual build dependencies are
installed inside the chroot:

```sh
sudo apt install --no-install-recommends build-essential cmake git libgnutls28-dev
sudo apt install mmdebstrap dpkg-dev git curl file xz-utils
```

To build an architecture other than your own, also install `qemu-user-static`
and `binfmt-support`.

#### Get the source

```sh
git clone --depth 1 https://github.com/raspberrypi/rpi-imager
git clone https://github.com/raspberrypi/rpi-imager
```

#### Build Qt
Clone with full history: version strings come from `git describe --tags`, and
the vendored third-party dependencies are git submodules (initialised for you by
`debian/fetch-vendor-deps.sh`). A `--depth 1` clone will not build.

#### Build the release artifacts

```sh
sudo ./qt/build-qt.sh
debian/release.sh status # what exists, what doesn't — check this first
debian/release.sh appimages amd64 # desktop + CLI AppImages for one architecture
debian/release.sh arch amd64 # ...and the .deb packages that wrap them

# All three architectures, plus the source package. RELEASE_ARCHES defaults to
# your own architecture alone, so pass it explicitly (or set it in release.conf).
RELEASE_ARCHES="amd64 arm64 armhf" debian/release.sh repo
```

This will build and install the version of Qt preferred for Raspberry Pi Imager into /opt/Qt/<version>. You must use `sudo` for the installation step to complete.
`repo` is the only command that builds more than one architecture; the others
take exactly one.

The first run bootstraps a chroot and builds Qt, so it takes a while; both are
cached under `.debian/` afterwards. Finished AppImages land in
`.debian/appimages/<arch>/` and packages in `out/debian/`.

#### Build quickly while developing

#### Build the AppImage
To iterate on the app itself, skip the packaging and build against a Qt tree
directly:

```sh
./create-appimage.sh
./Raspberry_Pi_Imager-*.AppImage
debian/ensure-qt.sh amd64 # populates .debian/qt/, or use system qt6-base-dev
cmake -B build -G Ninja src -DQt6_ROOT=$PWD/.debian/qt/amd64/<version>/gcc_64
cmake --build build
```

`<version>` is whatever `QT_VERSION_DEFAULT` in
[qt/qt-build-common.sh](./qt/qt-build-common.sh) says — the single place the Qt
version is selected.

### Windows

#### Get dependencies

- Get the Qt online installer from: https://www.qt.io/download-open-source
- During installation, choose Qt 6.9 with Mingw64 64-bit toolchain.
- During installation, choose the Qt version named by `QT_VERSION_DEFAULT` in [qt/qt-build-common.sh](./qt/qt-build-common.sh), with the Mingw64 64-bit toolchain. Any newer Qt 6 that satisfies the `find_package(Qt6 ...)` minimum in `src/CMakeLists.txt` will also configure.
- For building the installer, install Inno Setup scriptable install system: https://jrsoftware.org/isdl.php
- Install Visual Studio Code (or a derivative) and the Qt Extension Pack.
- It is assumed you already have a valid code signing certificate, and the Windows 10 Kit (SDK) installed.
Expand All @@ -47,7 +80,7 @@ Building Raspberry Pi Imager on Windows is best done with Visual Studio Code (or

- Open Visual Studio Code, and select 'Clone repo'. Give it the git url of this project.
- Open the CMake plugin settings, and set the following Configure Args:
- `-DQt6_ROOT=C:\Qt\6.9.0\mingw_64` - or the equivalent path you installed Qt 6.9 to.
- `-DQt6_ROOT=C:\Qt\<version>\mingw_64` - or the equivalent path you installed Qt to.
- `-DMINGW64_ROOT=C:\Qt\Tools\mingw1310_64` - or the equivalent path you installed mingw64 to.
- `-DENABLE_INNO_INSTALLER=ON` - to enable the Inno Setup installer, rather than the legacy NSIS installer.
- `-DIMAGER_SIGNED_APP=ON` - to enable code signing for redistribution.
Expand All @@ -74,7 +107,7 @@ Building Raspberry Pi Imager on macOS is best done with Visual Studio Code (or a

- Open Visual Studio Code, and select 'Clone repo'. Give it the git url of this project.
- Open the CMake plugin settings, and set the following Configure Args:
- `-DQt6_ROOT=/opt/Qt/6.9.1/macos` - or the equivalent path you installed Qt 6.9 to.
- `-DQt6_ROOT=/opt/Qt/<version>/macos` - or the equivalent path `build-qt-macos.sh` installed Qt to.
- `-DIMAGER_SIGNED_APP=ON` - to enable code signing.
- `-DIMAGER_SIGNING_IDENTITY=$cn` - to specify the Developer ID Certificate Common Name.
- `-DIMAGER_NOTARIZE_APP=ON` - to enable automatic notarization for distribution to others.
Expand All @@ -87,28 +120,38 @@ Building Raspberry Pi Imager on macOS is best done with Visual Studio Code (or a

The Raspberry Pi Network installer (embedded imager) runs inside an operating system created by [pi-gen-micro](https://github.com/raspberrypi/pi-gen-micro/tree/main/configurations/rpi-imager-embedded).

To build the entire system, you must first build our customised embedded qt:
It uses a **dedicated** Qt, distinct from the desktop and CLI release Qt: built
`-no-opengl -no-dbus -qpa linuxfb` by `qt/build-qt-embedded.sh` into its own
cache variant (`gcc_arm64_embedded`). The netboot target image carries no
Mesa/GL, no X11 and no session bus — far too large for a network-loaded image —
so the embedded Qt must not link `libEGL`/`libGL`/`libX11` at all. The build
below produces it automatically on a cache miss.

```sh
./qt/build-qt-embedded.sh
```

Then build the embedded AppImage:
The canonical build goes through the release pipeline, which builds inside the
arm64 mmdebstrap chroot:

```sh
./create-embedded.sh
debian/release.sh embedded arm64
```

Package the appImage for use with pi-gen-micro and other Debian systems:
This produces `out/debian/rpi-imager-embedded_<version>_arm64.deb`. It stages the
vendored `/opt` tree with `create-embedded.sh`, then assembles the `.deb` with
debhelper so that `debian/control` is the single source of the package's
dependencies and metadata (`dh_shlibdeps` is deliberately not used — the package
vendors its libraries, so the external `Depends` are maintained explicitly in
the `rpi-imager-embedded` stanza of `debian/control`).

To build against a Qt tree you resolved yourself, `create-embedded.sh` can be
run directly:

```sh
dpkg-buildpackage -uc -us --profile=embedded
./create-embedded.sh --arch=aarch64 --qt-root=/path/to/qt
```

And finally, import your new embedded imager into pi-gen-micro for packaging:
Finally, import the package into pi-gen-micro:

```sh
rm ${pi-gen-micro-root}/packages/rpi-imager-embedded*.deb
cp ../rpi-imager-embedded*.deb ${pi-gen-micro-root}/packages/
cp out/debian/rpi-imager-embedded*.deb ${pi-gen-micro-root}/packages/
pushd ${pi-gen-micro-root}/packages/ && dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz && popd
```
Loading
Loading