Files
RedBear-OS/local/recipes/qt/qtbase/source/cmake/QtFrameworkHelpers.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

285 lines
14 KiB
CMake

# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
macro(qt_find_apple_system_frameworks)
if(APPLE)
qt_internal_find_apple_system_framework(FWAppKit AppKit)
qt_internal_find_apple_system_framework(FWCFNetwork CFNetwork)
qt_internal_find_apple_system_framework(FWAssetsLibrary AssetsLibrary)
qt_internal_find_apple_system_framework(FWPhotos Photos)
qt_internal_find_apple_system_framework(FWAudioToolbox AudioToolbox)
qt_internal_find_apple_system_framework(FWApplicationServices ApplicationServices)
qt_internal_find_apple_system_framework(FWCarbon Carbon)
qt_internal_find_apple_system_framework(FWCoreFoundation CoreFoundation)
qt_internal_find_apple_system_framework(FWCoreServices CoreServices)
qt_internal_find_apple_system_framework(FWCoreGraphics CoreGraphics)
qt_internal_find_apple_system_framework(FWCoreText CoreText)
qt_internal_find_apple_system_framework(FWCoreVideo CoreVideo)
qt_internal_find_apple_system_framework(FWCryptoTokenKit CryptoTokenKit)
qt_internal_find_apple_system_framework(FWDiskArbitration DiskArbitration)
qt_internal_find_apple_system_framework(FWFoundation Foundation)
qt_internal_find_apple_system_framework(FWIOBluetooth IOBluetooth)
qt_internal_find_apple_system_framework(FWIOKit IOKit)
qt_internal_find_apple_system_framework(FWIOSurface IOSurface)
qt_internal_find_apple_system_framework(FWImageIO ImageIO)
qt_internal_find_apple_system_framework(FWMetal Metal)
qt_internal_find_apple_system_framework(FWMobileCoreServices MobileCoreServices)
qt_internal_find_apple_system_framework(FWQuartzCore QuartzCore)
qt_internal_find_apple_system_framework(FWSecurity Security)
qt_internal_find_apple_system_framework(FWSystemConfiguration SystemConfiguration)
qt_internal_find_apple_system_framework(FWUIKit UIKit)
qt_internal_find_apple_system_framework(FWCoreLocation CoreLocation)
qt_internal_find_apple_system_framework(FWCoreMotion CoreMotion)
qt_internal_find_apple_system_framework(FWWatchKit WatchKit)
qt_internal_find_apple_system_framework(FWGameController GameController)
qt_internal_find_apple_system_framework(FWCoreBluetooth CoreBluetooth)
qt_internal_find_apple_system_framework(FWAVFoundation AVFoundation)
qt_internal_find_apple_system_framework(FWPhotos Photos)
qt_internal_find_apple_system_framework(FWContacts Contacts)
qt_internal_find_apple_system_framework(FWEventKit EventKit)
qt_internal_find_apple_system_framework(FWHealthKit HealthKit)
qt_internal_find_apple_system_framework(FWUniformTypeIdentifiers UniformTypeIdentifiers)
qt_internal_find_apple_system_framework(FWNetwork Network)
qt_internal_find_apple_system_framework(FWOpenGL OpenGL)
qt_internal_find_apple_system_framework(FWAccelerate Accelerate)
endif()
endmacro()
# Given framework_name == 'IOKit', sets non-cache variable 'FWIOKit' to '-framework IOKit' in
# the calling directory scope if the framework is found, or 'IOKit-NOTFOUND'.
function(qt_internal_find_apple_system_framework out_var framework_name)
# To avoid creating many FindFoo.cmake files for each apple system framework, populate each
# FWFoo variable with '-framework Foo' instead of an absolute path to the framework. This makes
# the generated CMake target files relocatable, so that Xcode SDK absolute paths are not
# hardcoded, like with Xcode11.app on the CI.
# We might revisit this later.
set(cache_var_name "${out_var}Internal")
# vcpkg.cmake sets CMAKE_FIND_FRAMEWORK to LAST and this setting will find e.g.
# libnetwork.tbd instead of Network.framework.
# On the other side, homebrew always sets CMAKE_FIND_FRAMEWORK to FIRST.
# Force the default value to FIRST, to ensure we always find the framework file
# and not the tbd file.
# Allow opt outs, as well as not setting it at all if the opt out var is set to an empty
# string.
if(DEFINED QT_FIND_APPLE_SYSTEM_FRAMEWORKS_MODE)
set(valid_values "FIRST" "LAST" "ONLY" "NEVER")
if("${QT_FIND_APPLE_SYSTEM_FRAMEWORKS_MODE}" STREQUAL "")
# Empty on purpose to allow keeping the var empty, and skipping the
# CMAKE_FIND_FRAMEWORK assignment.
set(cmake_find_framework_value "")
elseif(NOT QT_FIND_APPLE_SYSTEM_FRAMEWORKS_MODE IN_LIST valid_values)
message(FATAL_ERROR "QT_FIND_APPLE_SYSTEM_FRAMEWORKS_MODE must be one of: ${valid_values}")
else()
set(cmake_find_framework_value "${QT_FIND_APPLE_SYSTEM_FRAMEWORKS_MODE}")
endif()
else()
set(cmake_find_framework_value "FIRST")
endif()
if(cmake_find_framework_value)
set(CMAKE_FIND_FRAMEWORK "${cmake_find_framework_value}")
endif()
find_library(${cache_var_name} "${framework_name}")
if(${cache_var_name} AND ${cache_var_name} MATCHES ".framework$")
set(${out_var} "-framework ${framework_name}" PARENT_SCOPE)
else()
set(${out_var} "${out_var}-NOTFOUND" PARENT_SCOPE)
endif()
endfunction()
# Copy header files to the framework's Headers directory
# Use this function for header files that
# - are not added as source files to the target
# - are not marked as PUBLIC_HEADER
# - or are private and supposed to end up in the 6.7.8/QtXYZ/private subdir.
function(qt_copy_framework_headers target)
get_target_property(is_fw ${target} FRAMEWORK)
if(NOT "${is_fw}")
return()
endif()
set(options)
set(oneValueArgs)
set(multiValueArgs PUBLIC PRIVATE QPA RHI SSG)
cmake_parse_arguments(arg "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
qt_internal_get_framework_info(fw ${target})
get_target_property(output_dir ${target} LIBRARY_OUTPUT_DIRECTORY)
set(output_dir_PUBLIC "${output_dir}/${fw_versioned_header_dir}")
set(output_dir_PRIVATE "${output_dir}/${fw_private_module_header_dir}/private")
set(output_dir_QPA "${output_dir}/${fw_private_module_header_dir}/qpa")
set(output_dir_RHI "${output_dir}/${fw_private_module_header_dir}/rhi")
set(output_dir_SSG "${output_dir}/${fw_private_module_header_dir}/ssg")
qt_internal_module_info(module "${target}")
set(out_files "")
set(in_files "")
set(out_dirs "")
set(copy_commands "")
foreach(type IN ITEMS PUBLIC PRIVATE QPA RHI SSG)
set(in_files_${type} "")
set(fw_output_header_dir "${output_dir_${type}}")
foreach(hdr IN LISTS arg_${type})
get_filename_component(in_file_path ${hdr} ABSOLUTE)
get_filename_component(in_file_name ${hdr} NAME)
set(out_file_path "${fw_output_header_dir}/${in_file_name}")
list(APPEND out_files ${out_file_path})
list(APPEND in_files_${type} "${in_file_path}")
endforeach()
if(in_files_${type})
list(APPEND out_dirs "${fw_output_header_dir}")
list(APPEND copy_commands
COMMAND ${CMAKE_COMMAND} -E copy ${in_files_${type}} "${fw_output_header_dir}")
list(APPEND in_files ${in_files_${type}})
endif()
endforeach()
list(REMOVE_DUPLICATES out_files)
list(REMOVE_DUPLICATES in_files)
set(copy_fw_sync_headers_command
"${CMAKE_COMMAND}" -E copy_directory
"${module_build_interface_include_dir}/.syncqt_staging"
"${output_dir}/${fw_versioned_header_dir}"
)
set(copy_fw_sync_headers_marker_file
"${CMAKE_CURRENT_BINARY_DIR}/${target}_fw_sync_headers_marker_file"
)
set(copy_fw_sync_headers_marker_file_command
"${CMAKE_COMMAND}" -E touch "${copy_fw_sync_headers_marker_file}"
)
if(NOT UIKIT)
# Create the framework's basic layout at configure time already. This is necessary, because
# we don't rely on the PUBLIC_HEADER property to create the QtFoo.framework/Headers symlink.
# See QTBUG-142119 for details.
file(MAKE_DIRECTORY "${output_dir}/${fw_dir}/Versions/${fw_version}/Headers")
file(CREATE_LINK "${fw_version}" "${output_dir}/${fw_dir}/Versions/Current" SYMBOLIC)
file(CREATE_LINK "Versions/Current/Headers" "${output_dir}/${fw_header_dir}" SYMBOLIC)
# Make "ninja clean" work.
set_property(TARGET ${target} APPEND PROPERTY ADDITIONAL_CLEAN_FILES
"${output_dir}/${fw_dir}/Versions/${fw_version}/Headers"
)
endif()
if(CMAKE_GENERATOR MATCHES "^Ninja")
add_custom_command(
OUTPUT
"${output_dir}/${fw_versioned_header_dir}"
"${copy_fw_sync_headers_marker_file}"
DEPENDS ${target}_sync_headers
COMMAND ${copy_fw_sync_headers_command}
COMMAND ${copy_fw_sync_headers_marker_file_command}
VERBATIM
)
add_custom_target(${target}_copy_fw_sync_headers
DEPENDS "${output_dir}/${fw_versioned_header_dir}")
else()
add_custom_target(${target}_copy_fw_sync_headers
COMMAND ${copy_fw_sync_headers_command}
COMMAND ${copy_fw_sync_headers_marker_file_command}
DEPENDS ${target}_sync_headers
)
endif()
if(out_files)
add_custom_command(
OUTPUT ${out_files}
DEPENDS ${target}_copy_fw_sync_headers ${in_files}
COMMAND
${CMAKE_COMMAND} -E make_directory ${out_dirs}
${copy_commands}
VERBATIM
COMMENT "Copy the ${target} header files to the framework directory"
)
set_property(TARGET ${target} APPEND PROPERTY
QT_COPIED_FRAMEWORK_HEADERS "${out_files}")
endif()
endfunction()
function(qt_finalize_framework_headers_copy target)
get_target_property(target_type ${target} TYPE)
if(${target_type} STREQUAL "INTERFACE_LIBRARY")
return()
endif()
get_target_property(is_fw ${target} FRAMEWORK)
if(NOT "${is_fw}")
return()
endif()
get_target_property(headers ${target} QT_COPIED_FRAMEWORK_HEADERS)
if(headers)
# Add a target, e.g. Core_framework_headers, that triggers the header copy.
add_custom_target(${target}_framework_headers DEPENDS ${headers})
add_dependencies(${target} ${target}_framework_headers)
endif()
endfunction()
# Collects the framework related information and paths from the target properties.
# Output variables:
# <out_var>_name framework base name, e.g. 'QtCore'.
# <out_var>_dir framework base directory, e.g. 'QtCore.framework'.
# <out_var>_version framework version, e.g. 'A', 'B' etc.
# <out_var>_bundle_version framework bundle version, same as the PROJECT_VERSION, e.g. '6.0.0'.
# <out_var>_header_dir top-level header directory, e.g. 'QtCore.framework/Headers'.
# <out_var>_versioned_binary_dir versioned directory that contains the framework binary,
# e.g. 'QtCore.framework/Versions/A'
# <out_var>_versioned_header_dir header directory for specific framework version,
# e.g. 'QtCore.framework/Versions/A/Headers'
# <out_var>_private_header_dir header directory for the specific framework version and
# framework bundle version e.g. 'QtCore.framework/Versions/A/Headers/6.0.0'
# <out_var>_private_module_header_dir private header directory for the specific framework
# version, framework bundle version and tailing module name, e.g.
# 'QtCore.framework/Versions/A/Headers/6.0.0/Core'
function(qt_internal_get_framework_info out_var target)
# Avoid "INTERFACE_LIBRARY targets may only have whitelisted properties" error on CMake < 3.17.
get_target_property(target_type ${target} TYPE)
if("${target_type}" STREQUAL "INTERFACE_LIBRARY")
return()
endif()
get_target_property(${out_var}_version ${target} FRAMEWORK_VERSION)
get_target_property(${out_var}_bundle_version ${target} MACOSX_FRAMEWORK_BUNDLE_VERSION)
# The module name might be different of the actual target name
# and we want to use the Qt'fied module name as a framework identifier.
get_target_property(module_interface_name ${target} _qt_module_interface_name)
if(module_interface_name)
qt_internal_qtfy_target(module ${module_interface_name})
else()
qt_internal_qtfy_target(module ${target})
endif()
set(${out_var}_name "${module}")
set(${out_var}_dir "${${out_var}_name}.framework")
set(${out_var}_header_dir "${${out_var}_dir}/Headers")
if(UIKIT)
# iOS frameworks do not have a Versions sub-directory
set(${out_var}_versioned_binary_dir "${${out_var}_dir}")
set(${out_var}_versioned_header_dir "${${out_var}_header_dir}")
else()
set(${out_var}_versioned_binary_dir "${${out_var}_dir}/Versions/${${out_var}_version}")
set(${out_var}_versioned_header_dir "${${out_var}_versioned_binary_dir}/Headers")
endif()
set(${out_var}_private_header_dir "${${out_var}_versioned_header_dir}/${${out_var}_bundle_version}")
set(${out_var}_private_module_header_dir "${${out_var}_private_header_dir}/${module}")
set(${out_var}_name "${${out_var}_name}" PARENT_SCOPE)
set(${out_var}_dir "${${out_var}_dir}" PARENT_SCOPE)
set(${out_var}_header_dir "${${out_var}_header_dir}" PARENT_SCOPE)
set(${out_var}_version "${${out_var}_version}" PARENT_SCOPE)
set(${out_var}_bundle_version "${${out_var}_bundle_version}" PARENT_SCOPE)
set(${out_var}_versioned_binary_dir "${${out_var}_versioned_binary_dir}" PARENT_SCOPE)
set(${out_var}_versioned_header_dir "${${out_var}_versioned_header_dir}" PARENT_SCOPE)
set(${out_var}_private_header_dir "${${out_var}_private_header_dir}" PARENT_SCOPE)
set(${out_var}_private_module_header_dir "${${out_var}_private_module_header_dir}" PARENT_SCOPE)
endfunction()