Files
RedBear-OS/local/recipes/qt/qtbase/source/cmake/QtVcpkgManifestHelpers.cmake
T
vasilito f31522130f 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
2026-05-05 20:20:37 +01:00

355 lines
13 KiB
CMake

# CMake API for generating vcpkg.json manifest files
# Initialize the internal vcpkg manifest data with the given JSON string.
#
# This function is called internally by qt_vcpkg_manifest_init and may be used to set the internal
# JSON data to a JSON string read from a file.
function(qt_vcpkg_set_internal_manifest_data json)
set_property(GLOBAL PROPERTY _QT_VCPKG_MANIFEST_JSON "${json}")
endfunction()
# Initialize a new vcpkg manifest with basic package information.
#
# This function creates the foundation for a vcpkg.json manifest file by setting up
# the basic structure with package name and version. It must be called before any
# other qt_vcpkg_* functions.
#
# Arguments:
# NAME - Required. The package name for the vcpkg manifest
# VERSION - Optional. The package version string
# BUILTIN_BASELINE - Optional. Baseline for version resolution.
function(qt_vcpkg_manifest_init)
set(no_value_options "")
set(single_value_options
BUILTIN_BASELINE
NAME
VERSION
)
set(multi_value_options "")
cmake_parse_arguments(PARSE_ARGV 0 arg
"${no_value_options}" "${single_value_options}" "${multi_value_options}"
)
if(arg_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "Unexpected arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()
if(NOT DEFINED arg_NAME)
message(FATAL_ERROR "qt_vcpkg_manifest_init: NAME is required")
endif()
string(JSON manifest_json SET "{}" name "\"${arg_NAME}\"")
string(JSON manifest_json SET "${manifest_json}" dependencies "[]")
string(JSON manifest_json SET "${manifest_json}" features "{}")
string(JSON manifest_json SET "${manifest_json}" default-features "[]")
if(DEFINED arg_VERSION)
string(JSON manifest_json SET "${manifest_json}" version "\"${arg_VERSION}\"")
endif()
if(DEFINED arg_BUILTIN_BASELINE)
string(JSON manifest_json SET "${manifest_json}" builtin-baseline
"\"${arg_BUILTIN_BASELINE}\""
)
endif()
qt_vcpkg_set_internal_manifest_data("${manifest_json}")
endfunction()
# Add a dependency to the vcpkg manifest.
#
# This function adds either a simple string dependency or a complex dependency object
# to the manifest's dependencies array or to a specific feature's dependencies.
#
# Arguments:
# dependency - Required. The name of the package dependency
# VERSION - Optional. Specific version constraint for the dependency
# PLATFORM - Optional. Platform expression to limit when dependency is used
# FEATURES - Optional. List of features to enable for this dependency
# DEFAULT_FEATURES - Optional. Boolean to set default-features.
# ADD_TO_FEATURE - Optional. Name of feature to add this dependency to. If not specified,
# adds to the manifest's root dependencies array.
#
# If VERSION, PLATFORM, FEATURES, or DEFAULT_FEATURES are specified, a complex dependency object is
# created. When FEATURES is specified, "default-features": false is automatically set. Otherwise, a
# simple string dependency is added.
#
# If ADD_TO_FEATURE is specified but the feature doesn't exist, it will be created with a default
# description.
function(qt_vcpkg_add_dependency name)
set(no_value_options "")
set(single_value_options
ADD_TO_FEATURE
DEFAULT_FEATURES
PLATFORM
VERSION
)
set(multi_value_options
FEATURES
)
cmake_parse_arguments(PARSE_ARGV 1 arg
"${no_value_options}" "${single_value_options}" "${multi_value_options}"
)
if(arg_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "Unexpected arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()
get_property(manifest_json GLOBAL PROPERTY _QT_VCPKG_MANIFEST_JSON)
if(NOT manifest_json)
message(FATAL_ERROR "qt_vcpkg_add_dependency: Must call qt_vcpkg_manifest_init first")
endif()
if(arg_ADD_TO_FEATURE)
# Check if feature exists, create with default description if not
string(JSON feature_obj ERROR_VARIABLE feature_error GET "${manifest_json}" features
${arg_ADD_TO_FEATURE}
)
if(feature_error)
string(JSON feature_obj SET "{}" description "\"Use ${arg_ADD_TO_FEATURE}\"")
endif()
string(JSON deps_exists ERROR_VARIABLE deps_error GET "${feature_obj}" dependencies)
if(deps_error)
string(JSON feature_obj SET "${feature_obj}" dependencies "[]")
endif()
set(target_obj "${feature_obj}")
set(target_path "features" "${arg_ADD_TO_FEATURE}")
else()
set(target_obj "${manifest_json}")
set(target_path "")
endif()
string(JSON deps_length LENGTH "${target_obj}" dependencies)
if(DEFINED arg_VERSION OR DEFINED arg_FEATURES OR DEFINED arg_PLATFORM
OR DEFINED arg_DEFAULT_FEATURES)
string(JSON dep_obj SET "{}" name "\"${name}\"")
if(arg_VERSION)
string(JSON dep_obj SET "${dep_obj}" version>= "\"${arg_VERSION}\"")
endif()
if(arg_FEATURES)
if(NOT DEFINED arg_DEFAULT_FEATURES)
set(arg_DEFAULT_FEATURES OFF)
endif()
string(JSON dep_obj SET "${dep_obj}" features "[]")
set(feature_index 0)
foreach(feature ${arg_FEATURES})
string(JSON dep_obj SET "${dep_obj}" features ${feature_index} "\"${feature}\"")
math(EXPR feature_index "${feature_index} + 1")
endforeach()
endif()
if(DEFINED arg_DEFAULT_FEATURES)
if(arg_DEFAULT_FEATURES)
string(JSON dep_obj SET "${dep_obj}" default-features true)
else()
string(JSON dep_obj SET "${dep_obj}" default-features false)
endif()
endif()
if(arg_PLATFORM)
string(JSON dep_obj SET "${dep_obj}" platform "\"${arg_PLATFORM}\"")
endif()
string(JSON target_obj SET "${target_obj}" dependencies ${deps_length} "${dep_obj}")
else()
string(JSON target_obj SET "${target_obj}" dependencies ${deps_length} "\"${name}\"")
endif()
if(arg_ADD_TO_FEATURE)
string(JSON manifest_json SET "${manifest_json}" features ${arg_ADD_TO_FEATURE}
"${target_obj}"
)
else()
set(manifest_json "${target_obj}")
endif()
set_property(GLOBAL PROPERTY _QT_VCPKG_MANIFEST_JSON "${manifest_json}")
endfunction()
# Add a feature definition to the vcpkg manifest.
#
# This function creates or updates a basic feature in the manifest with the specified
# description and metadata. It does not modify feature dependencies - use the dedicated
# dependency functions for that purpose.
#
# Arguments:
# name - Required. The feature name
# description - Required. Human-readable description of the feature
# DEFAULT - Optional flag. If set, feature is added to default-features
# SUPPORTS - Optional. Platform expression defining where feature is supported
#
# The function preserves existing dependencies when updating an existing feature.
function(qt_vcpkg_feature name description)
set(no_value_options DEFAULT)
set(single_value_options SUPPORTS)
set(multi_value_options "")
cmake_parse_arguments(PARSE_ARGV 2 arg
"${no_value_options}" "${single_value_options}" "${multi_value_options}"
)
if(arg_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "Unexpected arguments: ${arg_UNPARSED_ARGUMENTS}")
endif()
get_property(manifest_json GLOBAL PROPERTY _QT_VCPKG_MANIFEST_JSON)
if(NOT manifest_json)
message(FATAL_ERROR "qt_vcpkg_feature: Must call qt_vcpkg_manifest_init first")
endif()
string(JSON feature_obj ERROR_VARIABLE feature_error GET "${manifest_json}" features ${name})
if(feature_error)
set(feature_obj "{}")
endif()
string(JSON feature_obj SET "${feature_obj}" description "\"${description}\"")
if(arg_SUPPORTS)
string(JSON feature_obj SET "${feature_obj}" supports "\"${arg_SUPPORTS}\"")
endif()
string(JSON manifest_json SET "${manifest_json}" features ${name} "${feature_obj}")
if(arg_DEFAULT)
string(JSON default_features_length LENGTH "${manifest_json}" default-features)
string(JSON manifest_json SET "${manifest_json}" default-features ${default_features_length}
"\"${name}\""
)
endif()
set_property(GLOBAL PROPERTY _QT_VCPKG_MANIFEST_JSON "${manifest_json}")
endfunction()
# Add feature dependencies to an existing feature.
#
# This function creates self-referential dependencies where one feature in a package
# depends on other features in the same package.
#
# Arguments:
# feature_name - Required. Name of the feature to modify
# dependency_features - Required. List of features this feature depends on
#
# Creates a dependency object with the package's own name and the specified features,
# with "default-features": false to only enable the specified features.
function(qt_vcpkg_add_feature_dependencies feature_name)
set(dependency_features ${ARGN})
get_property(manifest_json GLOBAL PROPERTY _QT_VCPKG_MANIFEST_JSON)
if(NOT manifest_json)
message(FATAL_ERROR
"qt_vcpkg_add_feature_dependencies: Must call qt_vcpkg_manifest_init first"
)
endif()
string(JSON package_name GET "${manifest_json}" name)
qt_vcpkg_add_dependency(${package_name} ADD_TO_FEATURE ${feature_name}
FEATURES ${dependency_features}
)
endfunction()
# Write the vcpkg manifest to a file.
#
# This function serializes the current manifest JSON structure to the specified
# output file.
#
# Arguments:
# output_file - Required. Path where the vcpkg.json manifest should be written
#
# The function removes empty top-level elements from the manifest before writing
# to avoid cluttering the output file.
function(qt_vcpkg_write_manifest output_file)
get_property(manifest_json GLOBAL PROPERTY _QT_VCPKG_MANIFEST_JSON)
if(NOT manifest_json)
message(FATAL_ERROR "qt_vcpkg_write_manifest: Must call qt_vcpkg_manifest_init first")
endif()
# Remove empty elements
foreach(element_name IN ITEMS dependencies features default-features)
string(JSON element_length LENGTH "${manifest_json}" "${element_name}")
if(element_length EQUAL 0)
string(JSON manifest_json REMOVE "${manifest_json}" "${element_name}")
endif()
endforeach()
file(CONFIGURE OUTPUT "${output_file}" CONTENT "${manifest_json}")
message(STATUS "Generated vcpkg manifest: ${output_file}")
endfunction()
# Return the default-features of the current manifest in out_var.
#
# This function reads the default-features from the internal manifest data and
# writes their names to out_var.
function(qt_vcpkg_get_default_features out_var)
get_property(manifest_json GLOBAL PROPERTY _QT_VCPKG_MANIFEST_JSON)
if(NOT manifest_json)
message(FATAL_ERROR "qt_vcpkg_get_default_features: Must call qt_vcpkg_manifest_init first")
endif()
set("${out_var}" "" PARENT_SCOPE)
string(JSON default_features ERROR_VARIABLE json_error GET "${manifest_json}" default-features)
if(json_error)
return()
endif()
string(JSON default_features_length ERROR_VARIABLE json_error LENGTH "${default_features}")
if(json_error)
return()
endif()
set(result "")
math(EXPR max_i "${default_features_length} - 1")
foreach(i RANGE 0 ${max_i})
string(JSON element ERROR_VARIABLE json_error GET "${default_features}" "${i}")
if(json_error)
continue()
endif()
string(JSON element_type ERROR_VARIABLE json_error TYPE "${default_features}" "${i}")
if(json_error)
continue()
endif()
set(feature "")
if(element_type STREQUAL "STRING")
set(feature "${element}")
elseif(element_type STREQUAL "OBJECT")
string(JSON feature ERROR_VARIABLE json_error GET "${element}" "name")
if(json_error)
continue()
endif()
endif()
list(APPEND result "${feature}")
endforeach()
set("${out_var}" "${result}" PARENT_SCOPE)
endfunction()
# Return the names of all features in the current manifest in out_var.
#
# This function reads the features map from the current manifest and returns its keys
# (the feature names) in out_var.
function(qt_vcpkg_get_features out_var)
get_property(manifest_json GLOBAL PROPERTY _QT_VCPKG_MANIFEST_JSON)
if(NOT manifest_json)
message(FATAL_ERROR "qt_vcpkg_get_features: Must call qt_vcpkg_manifest_init first")
endif()
set("${out_var}" "" PARENT_SCOPE)
string(JSON features_obj ERROR_VARIABLE json_error GET "${manifest_json}" features)
if(json_error)
return()
endif()
string(JSON features_length ERROR_VARIABLE json_error LENGTH "${features_obj}")
if(json_error)
return()
endif()
set(result "")
math(EXPR max_i "${features_length} - 1")
foreach(i RANGE 0 ${max_i})
string(JSON feature ERROR_VARIABLE json_error MEMBER "${features_obj}" ${i})
if(json_error)
continue()
endif()
list(APPEND result "${feature}")
endforeach()
set("${out_var}" "${result}" PARENT_SCOPE)
endfunction()