fix: comprehensive boot warnings and exceptions — fixable silenced, unfixable diagnosed

Build system (5 gaps hardened):
- COOKBOOK_OFFLINE defaults to true (fork-mode)
- normalize_patch handles diff -ruN format
- New 'repo validate-patches' command (25/25 relibc patches)
- 14 patched Qt/Wayland/display recipes added to protected list
- relibc archive regenerated with current patch chain

Boot fixes (fixable):
- Full ISO EFI partition: 16 MiB → 1 MiB (matches mini, BIOS hardcoded 2 MiB offset)
- D-Bus system bus: absolute /usr/bin/dbus-daemon path (was skipped)
- redbear-sessiond: absolute /usr/bin/redbear-sessiond path (was skipped)
- daemon framework: silenced spurious INIT_NOTIFY warnings for oneshot_async services (P0-daemon-silence-init-notify.patch)
- udev-shim: demoted INIT_NOTIFY warning to INFO (expected for oneshot_async)
- relibc: comprehensive named semaphores (sem_open/close/unlink) replacing upstream todo!() stubs
- greeterd: Wayland socket timeout 15s → 30s (compositor DRM wait)
- greeter-ui: built and linked (header guard unification, sem_compat stubs removed)
- mc: un-ignored in both configs, fixed glib/libiconv/pcre2 transitive deps
- greeter config: removed stale keymapd dependency from display/greeter services
- prefix toolchain: relibc headers synced, _RELIBC_STDLIB_H guard unified

Unfixable (diagnosed, upstream):
- i2c-hidd: abort on no-I2C-hardware (QEMU) — process::exit → relibc abort
- kded6/greeter-ui: page fault 0x8 — Qt library null deref
- Thread panics fd != -1 — Rust std library on Redox
- DHCP timeout / eth0 MAC — QEMU user-mode networking
- hwrngd/thermald — no hardware RNG/thermal in VM
- live preload allocation — BIOS memory fragmentation, continues on demand
This commit is contained in:
2026-05-05 20:20:37 +01:00
parent a5f97b6632
commit f31522130f
81834 changed files with 11051982 additions and 108 deletions
@@ -0,0 +1,48 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
cmake_minimum_required(VERSION 3.16)
project(minimal-qml LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/wayland/minimal-qml")
find_package(Qt6 REQUIRED COMPONENTS Core Gui Qml)
qt_add_executable(minimal-qml
main.cpp
)
set_target_properties(minimal-qml PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(minimal-qml PUBLIC
Qt::Core
Qt::Gui
Qt::Qml
)
# Resources:
set(minimal-qml_resource_files
"main.qml"
)
qt6_add_resources(minimal-qml "minimal-qml"
PREFIX
"/"
FILES
${minimal-qml_resource_files}
)
install(TARGETS minimal-qml
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)
Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

@@ -0,0 +1,93 @@
// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
* \title Minimal QML
* \example minimal-qml
* \examplecategory {Embedded}
* \brief Minimal QML is a simple example that demonstrates how to write a Wayland compositor in QML.
* \ingroup qtwaylandcompositor-examples
*
* Minimal QML is a desktop-style Wayland compositor example implementing a
* complete Qt Wayland Compositor with as little code as possible. The compositor is implemented
* with Qt Quick and QML.
*
* \image minimal-qml.png
*
* \section1 The WaylandCompositor Object
*
* The top-level item of the compositor is a \l WaylandCompositor. This represents the Wayland
* server itself and manages the connections to clients as they come in.
*
* \snippet minimal-qml/main.qml compositor
*
* By default, the server supports the core Wayland protocol for communicating with clients.
* Usually, though, you will also want to support one or more extensions to the protocol. This
* gives the client more tools to influence its role in the windowing system.
*
* Qt supports several standard and common extensions. In addition, it is easy to create and support
* custom extensions, as long as support can be added in both the client and server code.
*
* \section1 Shell Extensions
*
* Typically, a compositor will support at least one
* \l{Shell Extensions - Qt Wayland Compositor}{shell extension}. Extensions are added to
* the compositor by instantiating them as direct children of the \l WaylandCompositor object. They
* will automatically be added to its \c extensions property and broadcast to clients when they
* connect.
*
* \snippet minimal-qml/main.qml shells
*
* The \e{Minimal QML} example supports three different shells: \l{WlShell}, \l{XdgShell} and
* \l{IviApplication}.
*
* A client can connect to either of these and it will be used as a channel for communicating
* about certain things between the client and compositor, such as creating new windows,
* negotiating size, and so on.
*
* When a client creates a new surface, its active extension will receive a signal of this. The
* signal contains a \l ShellSurface argument. Depending on which extension received the signal,
* this argument will be of a subclass of \l{ShellSurface}: \l{WlShellSurface}, \l{XdgSurface}
* or \l{IviSurface} respectively.
*
* The \l ShellSurface can be used to access features of the shell extension for the specific
* surface. In the \e{Minimal QML} example, we simply want to add the client to our scene. To
* record existence of the new window, we add it to a simple \l ListModel for safe-keeping.
*
* \snippet minimal-qml/main.qml model
*
* \section1 Creating the Scene
*
* Most of the necessary compositor code is already ready. The final step is to make sure
* applications are actually visible on the screen.
*
* For all compositors, we have to define at least one output. This is done by instantiating
* a \l WaylandOutput object as the direct child of the \l WaylandCompositor. If there is only
* a single output, this will represent the primary screen on the system. (You may also create
* multiple \l WaylandOutput objects to address multiple screens if they are available. See
* the \l{Multi Screen}{Multi Screen example} for more details
* about this.)
*
* \snippet minimal-qml/main.qml output
*
* Inside the \l{WaylandOutput}, we create a \l Window that serves as the container for
* our scene. In the example, we give this a size. The size used if the compositor is running as
* an application inside another windowing system which supports custom-sized windows. In a
* typical use case on an embedded device, where the compositor is the only display server running,
* it will probably be running on a full-screen platform plugin (such as \c{eglfs}) and the size
* set here will not matter.
*
* The final step is to create items for each of the \l ShellSurface objects that have been created.
* For this, we can use the \l ShellSurfaceItem class.
*
* \snippet minimal-qml/main.qml shell surface item
*
* We create a \l ShellSurfaceItem for each of the shell surfaces in our model, and assign them
* to the \c shellSurface property. In addition, we make sure the model is updated when the shell
* surface is destroyed. This can happen when a client manually closes a window, and if it exits
* or crashes.
*
* And this is all the code needed to create a functional Wayland compositor using Qt Quick and
* QML. For another example of a compositor written in QML but which has a few more features, take
* a look at the \l{Fancy Compositor}{Fancy Compositor example}.
*/
@@ -0,0 +1,21 @@
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QtCore/QUrl>
#include <QtCore/QDebug>
#include <QtGui/QGuiApplication>
#include <QtQml/QQmlApplicationEngine>
int main(int argc, char *argv[])
{
// ShareOpenGLContexts is needed for using the threaded renderer
// on Nvidia EGLStreams
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true);
QGuiApplication app(argc, argv);
QQmlApplicationEngine appEngine(QUrl("qrc:///main.qml"));
return app.exec();
}
@@ -0,0 +1,62 @@
// Copyright (C) 2017 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick.Window
import QtWayland.Compositor
import QtWayland.Compositor.XdgShell
import QtWayland.Compositor.WlShell
import QtWayland.Compositor.IviApplication
//! [compositor]
WaylandCompositor {
//! [compositor]
// The output defines the screen.
//! [output]
WaylandOutput {
sizeFollowsWindow: true
window: Window {
width: 1024
height: 768
visible: true
//! [output]
//! [shell surface item]
Repeater {
model: shellSurfaces
// ShellSurfaceItem handles displaying a shell surface.
// It has implementations for things like interactive
// resize/move, and forwarding of mouse and keyboard
// events to the client process.
ShellSurfaceItem {
shellSurface: modelData
onSurfaceDestroyed: shellSurfaces.remove(index)
}
}
//! [shell surface item]
}
}
// Extensions are additions to the core Wayland
// protocol. We choose to support three different
// shells (window management protocols). When the
// client creates a new shell surface (i.e. a window)
// we append it to our list of shellSurfaces.
//! [shells]
WlShell {
onWlShellSurfaceCreated: (shellSurface) => shellSurfaces.append({shellSurface: shellSurface});
}
XdgShell {
onToplevelCreated: (toplevel, xdgSurface) => shellSurfaces.append({shellSurface: xdgSurface});
}
IviApplication {
onIviSurfaceCreated: (iviSurface) => shellSurfaces.append({shellSurface: iviSurface});
}
//! [shells]
//! [model]
ListModel { id: shellSurfaces }
//! [model]
}
@@ -0,0 +1,14 @@
QT += gui qml
SOURCES += \
main.cpp
OTHER_FILES = \
main.qml
RESOURCES += minimal-qml.qrc
target.path = $$[QT_INSTALL_EXAMPLES]/wayland/minimal-qml
sources.files = $$SOURCES $$HEADERS $$RESOURCES $$FORMS minimal-qml.pro
sources.path = $$[QT_INSTALL_EXAMPLES]/wayland/minimal-qml
INSTALLS += target sources
@@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>main.qml</file>
</qresource>
</RCC>