From 352bc9340fa266e98246671c0f0b2b0bd6079f72 Mon Sep 17 00:00:00 2001 From: Vasilito Date: Fri, 17 Apr 2026 13:34:18 +0100 Subject: [PATCH] Update Qt6 recipes and add remaining module stubs Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus --- recipes/wip/qt/qt3d/recipe.toml | 141 ++++++++++++++ recipes/wip/qt/qtbase/recipe.toml | 38 +++- recipes/wip/qt/qtcharts/recipe.toml | 112 +++++++++++ recipes/wip/qt/qtdatavis3d/recipe.toml | 139 +++++++++++++ recipes/wip/qt/qtdeclarative/recipe.toml | 65 ++++++- recipes/wip/qt/qtgraphs/recipe.toml | 171 ++++++++++++++++ recipes/wip/qt/qtlottie/recipe.toml | 133 +++++++++++++ recipes/wip/qt/qtquick3d/recipe.toml | 194 +++++++++++++++++++ recipes/wip/qt/qtserialport/recipe.toml | 171 ++++++++++++++++ recipes/wip/qt/qtshadertools/recipe.toml | 43 ++-- recipes/wip/qt/qtvirtualkeyboard/recipe.toml | 156 +++++++++++++++ 11 files changed, 1323 insertions(+), 40 deletions(-) create mode 100644 recipes/wip/qt/qt3d/recipe.toml create mode 100644 recipes/wip/qt/qtcharts/recipe.toml create mode 100644 recipes/wip/qt/qtdatavis3d/recipe.toml create mode 100644 recipes/wip/qt/qtgraphs/recipe.toml create mode 100644 recipes/wip/qt/qtlottie/recipe.toml create mode 100644 recipes/wip/qt/qtquick3d/recipe.toml create mode 100644 recipes/wip/qt/qtvirtualkeyboard/recipe.toml diff --git a/recipes/wip/qt/qt3d/recipe.toml b/recipes/wip/qt/qt3d/recipe.toml new file mode 100644 index 00000000..44ab2959 --- /dev/null +++ b/recipes/wip/qt/qt3d/recipe.toml @@ -0,0 +1,141 @@ +#TODO: Qt6 3D module — cross-compiled for Redox on top of the verified Qt Quick/QML + shader substrate. Runtime validation of the renderer plugins and Qt3D QML imports is still pending. +# Provides: libQt63DAnimation, libQt63DCore, libQt63DExtras, libQt63DInput, libQt63DLogic, +# libQt63DQuick, libQt63DQuickAnimation, libQt63DQuickExtras, libQt63DQuickInput, +# libQt63DQuickRender, libQt63DRender, and the Qt3D QML/plugin surface. + +[source] +tar = "https://download.qt.io/official_releases/qt/6.11/6.11.0/submodules/qt3d-everywhere-src-6.11.0.tar.xz" + +[build] +template = "custom" +dependencies = [ + "qtdeclarative", +] +script = """ +DYNAMIC_INIT + +HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" + +# Sysroot path fix: the cookbook only symlinks sysroot/{bin,include,lib,share} -> usr/ +# but Qt6 cmake targets reference ${_IMPORT_PREFIX}/{plugins,mkspecs,metatypes,modules}. +for qtdir in plugins mkspecs metatypes modules; do + if [ -d "${COOKBOOK_SYSROOT}/usr/${qtdir}" ] && [ ! -e "${COOKBOOK_SYSROOT}/${qtdir}" ]; then + ln -s "usr/${qtdir}" "${COOKBOOK_SYSROOT}/${qtdir}" + fi +done + +if [ ! -d "${COOKBOOK_SYSROOT}/lib/cmake/Qt6Quick" ] \ + && [ ! -d "${COOKBOOK_SYSROOT}/usr/lib/cmake/Qt6Quick" ]; then + printf '%s\n' \ + 'qt3d requires a Qt Quick/QML-enabled qtdeclarative sysroot (missing Qt6Quick).' >&2 + printf '%s\n' \ + 'Rebuild the verified Qt Quick/QML substrate before cooking qt3d.' >&2 + exit 1 +fi + +if [ ! -f "${HOST_BUILD}/bin/qsb" ] \ + && [ ! -f "${HOST_BUILD}/libexec/qsb" ]; then + printf '%s\n' \ + 'qt3d requires the qsb host tool from qtshadertools in the shared QT_HOST_PATH.' >&2 + printf '%s\n' \ + 'Rebuild the verified shader substrate before cooking qt3d.' >&2 + exit 1 +fi + +rm -f CMakeCache.txt +rm -rf CMakeFiles + +cmake "${COOKBOOK_SOURCE}" \ + -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ + -DQT_HOST_PATH="${HOST_BUILD}" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ + -DQt6ShaderToolsTools_DIR="${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools" \ + -DQT_BUILD_EXAMPLES=OFF \ + -DQT_BUILD_TESTS=OFF \ + -DQT_GENERATE_SBOM=OFF \ + -Wno-dev + +cmake --build . -j"${COOKBOOK_MAKE_JOBS}" + +cmake --install . --prefix "${COOKBOOK_STAGE}/usr" + +mkdir -p "${COOKBOOK_STAGE}/usr/lib" +for lib in lib/libQt6*.so*; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done +for lib in lib/libQt6*.a; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done + +if [ -d "lib/cmake" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/cmake" + cp -a lib/cmake/Qt6* "${COOKBOOK_STAGE}/usr/lib/cmake/" 2>/dev/null || true +fi +if [ -d "lib/pkgconfig" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/pkgconfig" + cp -a lib/pkgconfig/*.pc "${COOKBOOK_STAGE}/usr/lib/pkgconfig/" 2>/dev/null || true +fi +if [ -d "include" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/include" + cp -a include/* "${COOKBOOK_STAGE}/usr/include/" 2>/dev/null || true +fi +if [ -d "plugins" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/plugins" + cp -a plugins/* "${COOKBOOK_STAGE}/usr/plugins/" 2>/dev/null || true +fi +if [ -d "qml" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/qml" + cp -a qml/* "${COOKBOOK_STAGE}/usr/qml/" 2>/dev/null || true +fi +mkdir -p "${COOKBOOK_STAGE}/usr/metatypes" +find . -path '*/meta_types/*.json' -type f -exec cp -an {} "${COOKBOOK_STAGE}/usr/metatypes/" \\; 2>/dev/null || true + +for lib in "${COOKBOOK_STAGE}/usr/lib/libQt6"*.so.*; do + [ -f "${lib}" ] || continue + patchelf --remove-rpath "${lib}" 2>/dev/null || true +done +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + find "${COOKBOOK_STAGE}/usr/plugins" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + find "${COOKBOOK_STAGE}/usr/qml" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi + +BUILD_DIR="${COOKBOOK_BUILD}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${BUILD_DIR}|/usr|g" {} + 2>/dev/null || true +fi + +SYSROOT="${COOKBOOK_SYSROOT}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/include|${SYSROOT}/include|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${COOKBOOK_SOURCE}/src/.*/meta_types/|${SYSROOT}/metatypes/|g" {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/include" ]; then + mkdir -p "${SYSROOT}/include" + cp -a "${COOKBOOK_STAGE}/usr/include/"* "${SYSROOT}/include/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + mkdir -p "${SYSROOT}/lib/cmake" + cp -a "${COOKBOOK_STAGE}/usr/lib/cmake/Qt6"* "${SYSROOT}/lib/cmake/" 2>/dev/null || true +fi +mkdir -p "${SYSROOT}/lib" +cp -a "${COOKBOOK_STAGE}/usr/lib/libQt6"* "${SYSROOT}/lib/" 2>/dev/null || true +if [ -d "${COOKBOOK_STAGE}/usr/metatypes" ]; then + mkdir -p "${SYSROOT}/metatypes" + cp -a "${COOKBOOK_STAGE}/usr/metatypes/"* "${SYSROOT}/metatypes/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + mkdir -p "${SYSROOT}/plugins" + cp -a "${COOKBOOK_STAGE}/usr/plugins/"* "${SYSROOT}/plugins/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + mkdir -p "${SYSROOT}/qml" + cp -a "${COOKBOOK_STAGE}/usr/qml/"* "${SYSROOT}/qml/" 2>/dev/null || true +fi +""" diff --git a/recipes/wip/qt/qtbase/recipe.toml b/recipes/wip/qt/qtbase/recipe.toml index 6f6a189d..182360ea 100644 --- a/recipes/wip/qt/qtbase/recipe.toml +++ b/recipes/wip/qt/qtbase/recipe.toml @@ -59,7 +59,8 @@ done # with these tools during the target build. # ============================================================ HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" -HOST_PROFILE="qtbase-host-6.11.0-gui-xml-wayland-no-qdbus-tools" +HOST_QTBASE_BUILD="${COOKBOOK_ROOT}/build/qtbase-host-build" +HOST_PROFILE="qtbase-host-6.11.0-gui-xml-wayland-no-qdbus-host" HOST_STAMP="${HOST_BUILD}/.redbear-host-profile" HOST_PATH="/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl" python - <<'PY' @@ -74,14 +75,17 @@ path.write_text(text) PY if [ -d "${HOST_BUILD}" ] && { [ ! -f "${HOST_STAMP}" ] || [ "$(cat "${HOST_STAMP}" 2>/dev/null)" != "${HOST_PROFILE}" ]; }; then rm -rf "${HOST_BUILD}" + rm -rf "${HOST_QTBASE_BUILD}" fi if [ ! -f "${HOST_BUILD}/bin/moc" ] || [ ! -f "${HOST_STAMP}" ]; then echo "=== Building Qt host tools ===" mkdir -p "${HOST_BUILD}" + rm -rf "${HOST_QTBASE_BUILD}" env -i \ HOME="${HOME}" \ PATH="${HOST_PATH}" \ - cmake -S "${COOKBOOK_SOURCE}" -B "${HOST_BUILD}" \ + cmake -S "${COOKBOOK_SOURCE}" -B "${HOST_QTBASE_BUILD}" \ + -GNinja \ -DCMAKE_C_COMPILER=/usr/bin/cc \ -DCMAKE_CXX_COMPILER=/usr/bin/c++ \ -DCMAKE_ASM_COMPILER=/usr/bin/cc \ @@ -97,7 +101,7 @@ if [ ! -f "${HOST_BUILD}/bin/moc" ] || [ ! -f "${HOST_STAMP}" ]; then -DFEATURE_widgets=OFF \ -DFEATURE_opengl=OFF \ -DFEATURE_network=OFF \ - -DFEATURE_dbus=ON \ + -DFEATURE_dbus=OFF \ -DFEATURE_openssl=OFF \ -DFEATURE_sql=OFF \ -DFEATURE_testlib=OFF \ @@ -108,9 +112,11 @@ if [ ! -f "${HOST_BUILD}/bin/moc" ] || [ ! -f "${HOST_STAMP}" ]; then env -i \ HOME="${HOME}" \ PATH="${HOST_PATH}" \ - cmake --build "${HOST_BUILD}" --target host_tools -j"${COOKBOOK_MAKE_JOBS}" - mkdir -p "${HOST_BUILD}/include/QtGui/6.11.0/QtGui" - mkdir -p "${HOST_BUILD}/include/QtDBus/6.11.0/QtDBus" + cmake --build "${HOST_QTBASE_BUILD}" -j"${COOKBOOK_MAKE_JOBS}" + env -i \ + HOME="${HOME}" \ + PATH="${HOST_PATH}" \ + cmake --install "${HOST_QTBASE_BUILD}" --prefix "${HOST_BUILD}" printf '%s\n' "${HOST_PROFILE}" > "${HOST_STAMP}" fi @@ -195,9 +201,22 @@ mv "${HWI_CMAKE}.tmp" "${HWI_CMAKE}" # QtGui needs the float16 shims — copy to gui dir and append to first SOURCES line cp "${COOKBOOK_SOURCE}/src/corelib/global/qt_float16_shims.c" \ "${COOKBOOK_SOURCE}/src/gui/painting/qt_float16_shims.c" -awk '/^ SOURCES$/ && !done { print; print " painting/qt_float16_shims.c"; done=1; next } { print }' \ - "${COOKBOOK_SOURCE}/src/gui/CMakeLists.txt" > "${COOKBOOK_SOURCE}/src/gui/CMakeLists.txt.tmp" -mv "${COOKBOOK_SOURCE}/src/gui/CMakeLists.txt.tmp" "${COOKBOOK_SOURCE}/src/gui/CMakeLists.txt" +python - <<'PY' +import os +from pathlib import Path +path = Path(os.environ["COOKBOOK_SOURCE"]) / "src/gui/CMakeLists.txt" +lines = path.read_text().splitlines() +out = [] +inserted = False +for line in lines: + if line.strip() == "painting/qt_float16_shims.c": + continue + out.append(line) + if not inserted and line.strip() == "SOURCES": + out.append(" painting/qt_float16_shims.c") + inserted = True +path.write_text("\\n".join(out) + "\\n") +PY # relibc's elf.h defines ELFMAG0-3 and SELFMAG but not ELFMAG string constant. # Patch qelfparser_p.cpp (the only file using ELFMAG) to define it. @@ -379,6 +398,7 @@ path.write_text(text) PY cmake "${COOKBOOK_SOURCE}" \ + -GNinja \ -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ -DQT_HOST_PATH="${HOST_BUILD}" \ -DCMAKE_INSTALL_PREFIX=/usr \ diff --git a/recipes/wip/qt/qtcharts/recipe.toml b/recipes/wip/qt/qtcharts/recipe.toml new file mode 100644 index 00000000..f8bb8f59 --- /dev/null +++ b/recipes/wip/qt/qtcharts/recipe.toml @@ -0,0 +1,112 @@ +#TODO: Qt6 Charts — cross-compiled for Redox against the Qt 6.11 base stack. The widgets-based charting library should be buildable now; the optional QML/QtQuick charts import only builds when that substrate is already present in the sysroot, and runtime validation is still pending. +# Provides: libQt6Charts and, when QtQuick is available, the Qt Charts QML module. + +[source] +tar = "https://download.qt.io/official_releases/qt/6.11/6.11.0/submodules/qtcharts-everywhere-src-6.11.0.tar.xz" + +[build] +template = "custom" +dependencies = [ + "qtbase", +] +script = """ +DYNAMIC_INIT + +HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" + +# Sysroot path fix: the cookbook only symlinks sysroot/{bin,include,lib,share} -> usr/ +# but Qt6 cmake targets reference ${_IMPORT_PREFIX}/{plugins,mkspecs,metatypes,modules}. +for qtdir in plugins mkspecs metatypes modules; do + if [ -d "${COOKBOOK_SYSROOT}/usr/${qtdir}" ] && [ ! -e "${COOKBOOK_SYSROOT}/${qtdir}" ]; then + ln -s "usr/${qtdir}" "${COOKBOOK_SYSROOT}/${qtdir}" + fi +done + +rm -f CMakeCache.txt +rm -rf CMakeFiles + +cmake "${COOKBOOK_SOURCE}" \ + -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ + -DQT_HOST_PATH="${HOST_BUILD}" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ + -DQT_BUILD_EXAMPLES=OFF \ + -DQT_BUILD_TESTS=OFF \ + -DQT_GENERATE_SBOM=OFF \ + -Wno-dev + +cmake --build . -j"${COOKBOOK_MAKE_JOBS}" + +cmake --install . --prefix "${COOKBOOK_STAGE}/usr" + +mkdir -p "${COOKBOOK_STAGE}/usr/lib" +for lib in lib/libQt6*.so*; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done +for lib in lib/libQt6*.a; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done + +if [ -d "lib/cmake" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/cmake" + cp -a lib/cmake/Qt6* "${COOKBOOK_STAGE}/usr/lib/cmake/" 2>/dev/null || true +fi +if [ -d "lib/pkgconfig" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/pkgconfig" + cp -a lib/pkgconfig/*.pc "${COOKBOOK_STAGE}/usr/lib/pkgconfig/" 2>/dev/null || true +fi +if [ -d "include" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/include" + cp -a include/* "${COOKBOOK_STAGE}/usr/include/" 2>/dev/null || true +fi +if [ -d "plugins" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/plugins" + cp -a plugins/* "${COOKBOOK_STAGE}/usr/plugins/" 2>/dev/null || true +fi +if [ -d "qml" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/qml" + cp -a qml/* "${COOKBOOK_STAGE}/usr/qml/" 2>/dev/null || true +fi + +for lib in "${COOKBOOK_STAGE}/usr/lib/libQt6"*.so.*; do + [ -f "${lib}" ] || continue + patchelf --remove-rpath "${lib}" 2>/dev/null || true +done +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + find "${COOKBOOK_STAGE}/usr/plugins" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + find "${COOKBOOK_STAGE}/usr/qml" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi + +BUILD_DIR="${COOKBOOK_BUILD}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${BUILD_DIR}|/usr|g" {} + 2>/dev/null || true +fi + +SYSROOT="${COOKBOOK_SYSROOT}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/include|${SYSROOT}/include|g" {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/include" ]; then + mkdir -p "${SYSROOT}/include" + cp -a "${COOKBOOK_STAGE}/usr/include/"* "${SYSROOT}/include/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + mkdir -p "${SYSROOT}/lib/cmake" + cp -a "${COOKBOOK_STAGE}/usr/lib/cmake/Qt6"* "${SYSROOT}/lib/cmake/" 2>/dev/null || true +fi +mkdir -p "${SYSROOT}/lib" +cp -a "${COOKBOOK_STAGE}/usr/lib/libQt6"* "${SYSROOT}/lib/" 2>/dev/null || true +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + mkdir -p "${SYSROOT}/plugins" + cp -a "${COOKBOOK_STAGE}/usr/plugins/"* "${SYSROOT}/plugins/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + mkdir -p "${SYSROOT}/qml" + cp -a "${COOKBOOK_STAGE}/usr/qml/"* "${SYSROOT}/qml/" 2>/dev/null || true +fi +""" diff --git a/recipes/wip/qt/qtdatavis3d/recipe.toml b/recipes/wip/qt/qtdatavis3d/recipe.toml new file mode 100644 index 00000000..420fa56f --- /dev/null +++ b/recipes/wip/qt/qtdatavis3d/recipe.toml @@ -0,0 +1,139 @@ +#TODO: Qt6 Data Visualization module — cross-compiled for Redox on top of the verified Qt Quick/QML substrate. Runtime validation of the 3D graph rendering path and QtDataVisualization QML import is still pending. +# Provides: libQt6DataVisualization and the QtDataVisualization QML/plugin surface. + +[source] +tar = "https://download.qt.io/official_releases/qt/6.11/6.11.0/submodules/qtdatavis3d-everywhere-src-6.11.0.tar.xz" + +[build] +template = "custom" +dependencies = [ + "qtdeclarative", +] +script = """ +DYNAMIC_INIT + +HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" + +# Sysroot path fix: the cookbook only symlinks sysroot/{bin,include,lib,share} -> usr/ +# but Qt6 cmake targets reference ${_IMPORT_PREFIX}/{plugins,mkspecs,metatypes,modules}. +for qtdir in plugins mkspecs metatypes modules; do + if [ -d "${COOKBOOK_SYSROOT}/usr/${qtdir}" ] && [ ! -e "${COOKBOOK_SYSROOT}/${qtdir}" ]; then + ln -s "usr/${qtdir}" "${COOKBOOK_SYSROOT}/${qtdir}" + fi +done + +if [ ! -d "${COOKBOOK_SYSROOT}/lib/cmake/Qt6Quick" ] \ + && [ ! -d "${COOKBOOK_SYSROOT}/usr/lib/cmake/Qt6Quick" ]; then + printf '%s\n' \ + 'qtdatavis3d requires a Qt Quick/QML-enabled qtdeclarative sysroot (missing Qt6Quick).' >&2 + printf '%s\n' \ + 'Rebuild the verified Qt Quick/QML substrate before cooking qtdatavis3d.' >&2 + exit 1 +fi + +if [ ! -f "${HOST_BUILD}/bin/qsb" ] \ + && [ ! -f "${HOST_BUILD}/libexec/qsb" ]; then + printf '%s\n' \ + 'qtdatavis3d requires the qsb host tool from qtshadertools in the shared QT_HOST_PATH.' >&2 + printf '%s\n' \ + 'Rebuild the verified shader substrate before cooking qtdatavis3d.' >&2 + exit 1 +fi + +rm -f CMakeCache.txt +rm -rf CMakeFiles + +cmake "${COOKBOOK_SOURCE}" \ + -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ + -DQT_HOST_PATH="${HOST_BUILD}" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ + -DQt6ShaderToolsTools_DIR="${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools" \ + -DQT_BUILD_EXAMPLES=OFF \ + -DQT_BUILD_TESTS=OFF \ + -DQT_GENERATE_SBOM=OFF \ + -Wno-dev + +cmake --build . -j"${COOKBOOK_MAKE_JOBS}" + +cmake --install . --prefix "${COOKBOOK_STAGE}/usr" + +mkdir -p "${COOKBOOK_STAGE}/usr/lib" +for lib in lib/libQt6*.so*; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done +for lib in lib/libQt6*.a; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done + +if [ -d "lib/cmake" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/cmake" + cp -a lib/cmake/Qt6* "${COOKBOOK_STAGE}/usr/lib/cmake/" 2>/dev/null || true +fi +if [ -d "lib/pkgconfig" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/pkgconfig" + cp -a lib/pkgconfig/*.pc "${COOKBOOK_STAGE}/usr/lib/pkgconfig/" 2>/dev/null || true +fi +if [ -d "include" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/include" + cp -a include/* "${COOKBOOK_STAGE}/usr/include/" 2>/dev/null || true +fi +if [ -d "plugins" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/plugins" + cp -a plugins/* "${COOKBOOK_STAGE}/usr/plugins/" 2>/dev/null || true +fi +if [ -d "qml" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/qml" + cp -a qml/* "${COOKBOOK_STAGE}/usr/qml/" 2>/dev/null || true +fi +mkdir -p "${COOKBOOK_STAGE}/usr/metatypes" +find . -path '*/meta_types/*.json' -type f -exec cp -an {} "${COOKBOOK_STAGE}/usr/metatypes/" \\; 2>/dev/null || true + +for lib in "${COOKBOOK_STAGE}/usr/lib/libQt6"*.so.*; do + [ -f "${lib}" ] || continue + patchelf --remove-rpath "${lib}" 2>/dev/null || true +done +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + find "${COOKBOOK_STAGE}/usr/plugins" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + find "${COOKBOOK_STAGE}/usr/qml" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi + +BUILD_DIR="${COOKBOOK_BUILD}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${BUILD_DIR}|/usr|g" {} + 2>/dev/null || true +fi + +SYSROOT="${COOKBOOK_SYSROOT}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/include|${SYSROOT}/include|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${COOKBOOK_SOURCE}/src/.*/meta_types/|${SYSROOT}/metatypes/|g" {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/include" ]; then + mkdir -p "${SYSROOT}/include" + cp -a "${COOKBOOK_STAGE}/usr/include/"* "${SYSROOT}/include/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + mkdir -p "${SYSROOT}/lib/cmake" + cp -a "${COOKBOOK_STAGE}/usr/lib/cmake/Qt6"* "${SYSROOT}/lib/cmake/" 2>/dev/null || true +fi +mkdir -p "${SYSROOT}/lib" +cp -a "${COOKBOOK_STAGE}/usr/lib/libQt6"* "${SYSROOT}/lib/" 2>/dev/null || true +if [ -d "${COOKBOOK_STAGE}/usr/metatypes" ]; then + mkdir -p "${SYSROOT}/metatypes" + cp -a "${COOKBOOK_STAGE}/usr/metatypes/"* "${SYSROOT}/metatypes/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + mkdir -p "${SYSROOT}/plugins" + cp -a "${COOKBOOK_STAGE}/usr/plugins/"* "${SYSROOT}/plugins/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + mkdir -p "${SYSROOT}/qml" + cp -a "${COOKBOOK_STAGE}/usr/qml/"* "${SYSROOT}/qml/" 2>/dev/null || true +fi +""" diff --git a/recipes/wip/qt/qtdeclarative/recipe.toml b/recipes/wip/qt/qtdeclarative/recipe.toml index 572c583f..df1cc357 100644 --- a/recipes/wip/qt/qtdeclarative/recipe.toml +++ b/recipes/wip/qt/qtdeclarative/recipe.toml @@ -8,6 +8,7 @@ tar = "https://download.qt.io/official_releases/qt/6.11/6.11.0/submodules/qtdecl template = "custom" dependencies = [ "qtbase", + "qtshadertools", ] script = """ DYNAMIC_INIT @@ -16,12 +17,13 @@ HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" DECL_HOST="${COOKBOOK_ROOT}/build/qt-declarative-host" # ============================================================ -# Step 1: Build qtdeclarative host tools (qmlcachegen, qmllint) -# These link against qtbase's host Qt6Core. -# Install into the same prefix as qtbase host tools so +# Step 1: Build only the qtdeclarative host tools actually needed for cross-builds. +# We intentionally avoid building the full host tool surface (`qml`, quicktooling, etc.) +# because the shared host prefix is not a full host QtGui install. +# Install/copy the minimal host tools into the same prefix as qtbase host tools so # QT_HOST_PATH finds both qtbase and qtdeclarative tools. # ============================================================ -if [ ! -f "${HOST_BUILD}/bin/qmlcachegen" ]; then +if [ ! -f "${HOST_BUILD}/bin/qmlcachegen" ] || [ ! -f "${HOST_BUILD}/bin/qmlaotstats" ] || [ ! -d "${HOST_BUILD}/lib/cmake/Qt6QmlTools" ]; then echo "=== Building qtdeclarative host tools ===" mkdir -p "${DECL_HOST}" env \ @@ -40,12 +42,24 @@ if [ ! -f "${HOST_BUILD}/bin/qmlcachegen" ]; then -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX="${HOST_BUILD}" \ -DCMAKE_PREFIX_PATH="${HOST_BUILD}" \ + -DQt6ShaderToolsTools_DIR="${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools" \ -DQT_BUILD_EXAMPLES=OFF \ -DQT_BUILD_TESTS=OFF \ -DQT_GENERATE_SBOM=OFF \ -Wno-dev - cmake --build "${DECL_HOST}" -j"${COOKBOOK_MAKE_JOBS}" - cmake --install "${DECL_HOST}" --prefix "${HOST_BUILD}" + cmake --build "${DECL_HOST}" --target qmlcachegen qmllint qmlimportscanner qmltyperegistrar qmlaotstats -j"${COOKBOOK_MAKE_JOBS}" + + mkdir -p "${HOST_BUILD}/bin" "${HOST_BUILD}/libexec" "${HOST_BUILD}/lib/cmake" + for tool in qmlcachegen qmllint qmlimportscanner qmltyperegistrar qmlaotstats; do + if [ -f "${DECL_HOST}/bin/${tool}" ]; then + cp -a "${DECL_HOST}/bin/${tool}" "${HOST_BUILD}/bin/" + elif [ -f "${DECL_HOST}/libexec/${tool}" ]; then + cp -a "${DECL_HOST}/libexec/${tool}" "${HOST_BUILD}/libexec/" + cp -a "${DECL_HOST}/libexec/${tool}" "${HOST_BUILD}/bin/${tool}" + fi + done + cp -a "${DECL_HOST}/lib/cmake/Qt6QmlTools" "${HOST_BUILD}/lib/cmake/" 2>/dev/null || true + cp -a "${DECL_HOST}/lib/cmake/Qt6QmlCompiler" "${HOST_BUILD}/lib/cmake/" 2>/dev/null || true fi # ============================================================ @@ -106,12 +120,22 @@ INSERT=$((LINE + 3)) sed -i "${INSERT}r ${PATCHF}" "${CHECKED}" fi +python - <<'PY' +import os +from pathlib import Path +path = Path(os.environ["COOKBOOK_SOURCE"]) / "src/CMakeLists.txt" +text = path.read_text() +text = text.replace('if(TARGET Qt::Gui AND TARGET Qt::qsb AND QT_FEATURE_qml_animation)', 'if(TARGET Qt::Gui AND QT_FEATURE_qml_animation)') +path.write_text(text) +PY + cmake "${COOKBOOK_SOURCE}" \ -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ -DQT_HOST_PATH="${HOST_BUILD}" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ + -DQt6ShaderToolsTools_DIR="${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools" \ -DQT_BUILD_EXAMPLES=OFF \ -DQT_BUILD_TESTS=OFF \ -DQT_GENERATE_SBOM=OFF \ @@ -161,6 +185,8 @@ if [ -d "qml" ]; then mkdir -p "${COOKBOOK_STAGE}/usr/qml" cp -a qml/* "${COOKBOOK_STAGE}/usr/qml/" 2>/dev/null || true fi +mkdir -p "${COOKBOOK_STAGE}/usr/metatypes" +find . -path '*/meta_types/*.json' -type f -exec cp -an {} "${COOKBOOK_STAGE}/usr/metatypes/" \\; 2>/dev/null || true # RPATH cleanup for lib in "${COOKBOOK_STAGE}/usr/lib/libQt6"*.so.*; do @@ -173,4 +199,31 @@ find "${COOKBOOK_STAGE}/usr/plugins" -name '*.so' -exec patchelf --remove-rpath BUILD_DIR="${COOKBOOK_BUILD}" find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ "s|${BUILD_DIR}|/usr|g" {} + 2>/dev/null || true + +SYSROOT="${COOKBOOK_SYSROOT}" +find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/include|${SYSROOT}/include|g" {} + 2>/dev/null || true +find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/lib|${SYSROOT}/lib|g" {} + 2>/dev/null || true +find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/src|${COOKBOOK_SOURCE}/src|g" {} + 2>/dev/null || true +find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${COOKBOOK_SOURCE}/src/.*/meta_types/|${SYSROOT}/metatypes/|g" {} + 2>/dev/null || true + +mkdir -p "${SYSROOT}/include" "${SYSROOT}/lib/cmake" "${SYSROOT}/lib" +cp -a "${COOKBOOK_STAGE}/usr/include/"* "${SYSROOT}/include/" 2>/dev/null || true +cp -a "${COOKBOOK_STAGE}/usr/lib/cmake/Qt6"* "${SYSROOT}/lib/cmake/" 2>/dev/null || true +cp -a "${COOKBOOK_STAGE}/usr/lib/libQt6"* "${SYSROOT}/lib/" 2>/dev/null || true +if [ -d "${COOKBOOK_STAGE}/usr/metatypes" ]; then + mkdir -p "${SYSROOT}/metatypes" + cp -a "${COOKBOOK_STAGE}/usr/metatypes/"* "${SYSROOT}/metatypes/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + mkdir -p "${SYSROOT}/plugins" + cp -a "${COOKBOOK_STAGE}/usr/plugins/"* "${SYSROOT}/plugins/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + mkdir -p "${SYSROOT}/qml" + cp -a "${COOKBOOK_STAGE}/usr/qml/"* "${SYSROOT}/qml/" 2>/dev/null || true +fi """ diff --git a/recipes/wip/qt/qtgraphs/recipe.toml b/recipes/wip/qt/qtgraphs/recipe.toml new file mode 100644 index 00000000..aef29308 --- /dev/null +++ b/recipes/wip/qt/qtgraphs/recipe.toml @@ -0,0 +1,171 @@ +#TODO: Qt6 Graphs — cross-compiled for Redox against the Qt 6.11 Qt Quick/QML substrate. This recipe intentionally builds the validated 2D graphs surface first; the 3D graphs path stays disabled until the Qt Quick 3D substrate is ready in-tree. +# Provides: libQt6Graphs and the QtGraphs QML module for 2D graph types. + +[source] +tar = "https://download.qt.io/official_releases/qt/6.11/6.11.0/submodules/qtgraphs-everywhere-src-6.11.0.tar.xz" + +[build] +template = "custom" +dependencies = [ + "qtdeclarative", + "qtshadertools", +] +script = """ +DYNAMIC_INIT + +HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" + +# Sysroot path fix: the cookbook only symlinks sysroot/{bin,include,lib,share} -> usr/ +# but Qt6 cmake targets reference ${_IMPORT_PREFIX}/{plugins,mkspecs,metatypes,modules}. +for qtdir in plugins mkspecs metatypes modules; do + if [ -d "${COOKBOOK_SYSROOT}/usr/${qtdir}" ] && [ ! -e "${COOKBOOK_SYSROOT}/${qtdir}" ]; then + ln -s "usr/${qtdir}" "${COOKBOOK_SYSROOT}/${qtdir}" + fi +done + +if [ ! -d "${COOKBOOK_SYSROOT}/lib/cmake/Qt6Quick" ] \ + && [ ! -d "${COOKBOOK_SYSROOT}/usr/lib/cmake/Qt6Quick" ]; then + printf '%s\n' \ + 'qtgraphs requires a Qt Quick/QML-enabled qtdeclarative sysroot (missing Qt6Quick).' >&2 + printf '%s\n' \ + 'Rebuild qtdeclarative before cooking qtgraphs.' >&2 + exit 1 +fi + +if [ ! -d "${COOKBOOK_SYSROOT}/lib/cmake/Qt6QuickWidgets" ] \ + && [ ! -d "${COOKBOOK_SYSROOT}/usr/lib/cmake/Qt6QuickWidgets" ]; then + printf '%s\n' \ + 'qtgraphs requires Qt Quick Widgets from qtdeclarative (missing Qt6QuickWidgets).' >&2 + printf '%s\n' \ + 'Rebuild qtdeclarative before cooking qtgraphs.' >&2 + exit 1 +fi + +if [ ! -f "${HOST_BUILD}/bin/qsb" ] \ + && [ ! -f "${HOST_BUILD}/libexec/qsb" ]; then + printf '%s\n' \ + 'qtgraphs requires the qsb host tool from qtshadertools in the shared QT_HOST_PATH.' >&2 + printf '%s\n' \ + 'Rebuild qtshadertools before cooking qtgraphs.' >&2 + exit 1 +fi + +if [ ! -d "${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools" ]; then + printf '%s\n' \ + 'qtgraphs requires Qt6ShaderToolsTools metadata in the shared QT_HOST_PATH.' >&2 + printf '%s\n' \ + 'Rebuild qtshadertools before cooking qtgraphs.' >&2 + exit 1 +fi + +python - <<'PY' +import os +from pathlib import Path + +path = Path(os.environ["COOKBOOK_SOURCE"]) / "CMakeLists.txt" +text = path.read_text() +needle = "qt_internal_project_setup()\\n\\n" +insertion = "qt_internal_project_setup()\\n\\nfind_package(Qt6ShaderToolsTools CONFIG REQUIRED)\\n\\n" +if "find_package(Qt6ShaderToolsTools CONFIG REQUIRED)" not in text: + text = text.replace(needle, insertion, 1) + path.write_text(text) +PY + +rm -f CMakeCache.txt +rm -rf CMakeFiles + +cmake "${COOKBOOK_SOURCE}" \ + -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ + -DQT_HOST_PATH="${HOST_BUILD}" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ + -DQt6ShaderToolsTools_DIR="${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools" \ + -DQT_BUILD_EXAMPLES=OFF \ + -DQT_BUILD_TESTS=OFF \ + -DQT_GENERATE_SBOM=OFF \ + -DFEATURE_graphs_3d=OFF \ + -Wno-dev + +cmake --build . -j"${COOKBOOK_MAKE_JOBS}" + +cmake --install . --prefix "${COOKBOOK_STAGE}/usr" + +mkdir -p "${COOKBOOK_STAGE}/usr/lib" +for lib in lib/libQt6*.so*; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done +for lib in lib/libQt6*.a; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done + +if [ -d "lib/cmake" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/cmake" + cp -a lib/cmake/Qt6* "${COOKBOOK_STAGE}/usr/lib/cmake/" 2>/dev/null || true +fi +if [ -d "lib/pkgconfig" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/pkgconfig" + cp -a lib/pkgconfig/*.pc "${COOKBOOK_STAGE}/usr/lib/pkgconfig/" 2>/dev/null || true +fi +if [ -d "include" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/include" + cp -a include/* "${COOKBOOK_STAGE}/usr/include/" 2>/dev/null || true +fi +if [ -d "plugins" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/plugins" + cp -a plugins/* "${COOKBOOK_STAGE}/usr/plugins/" 2>/dev/null || true +fi +if [ -d "qml" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/qml" + cp -a qml/* "${COOKBOOK_STAGE}/usr/qml/" 2>/dev/null || true +fi +mkdir -p "${COOKBOOK_STAGE}/usr/metatypes" +find . -path '*/meta_types/*.json' -type f -exec cp -an {} "${COOKBOOK_STAGE}/usr/metatypes/" \\; 2>/dev/null || true + +for lib in "${COOKBOOK_STAGE}/usr/lib/libQt6"*.so.*; do + [ -f "${lib}" ] || continue + patchelf --remove-rpath "${lib}" 2>/dev/null || true +done +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + find "${COOKBOOK_STAGE}/usr/plugins" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + find "${COOKBOOK_STAGE}/usr/qml" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi + +BUILD_DIR="${COOKBOOK_BUILD}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${BUILD_DIR}|/usr|g" {} + 2>/dev/null || true +fi + +SYSROOT="${COOKBOOK_SYSROOT}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/include|${SYSROOT}/include|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${COOKBOOK_SOURCE}/src/.*/meta_types/|${SYSROOT}/metatypes/|g" {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/include" ]; then + mkdir -p "${SYSROOT}/include" + cp -a "${COOKBOOK_STAGE}/usr/include/"* "${SYSROOT}/include/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + mkdir -p "${SYSROOT}/lib/cmake" + cp -a "${COOKBOOK_STAGE}/usr/lib/cmake/Qt6"* "${SYSROOT}/lib/cmake/" 2>/dev/null || true +fi +mkdir -p "${SYSROOT}/lib" +cp -a "${COOKBOOK_STAGE}/usr/lib/libQt6"* "${SYSROOT}/lib/" 2>/dev/null || true +if [ -d "${COOKBOOK_STAGE}/usr/metatypes" ]; then + mkdir -p "${SYSROOT}/metatypes" + cp -a "${COOKBOOK_STAGE}/usr/metatypes/"* "${SYSROOT}/metatypes/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + mkdir -p "${SYSROOT}/plugins" + cp -a "${COOKBOOK_STAGE}/usr/plugins/"* "${SYSROOT}/plugins/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + mkdir -p "${SYSROOT}/qml" + cp -a "${COOKBOOK_STAGE}/usr/qml/"* "${SYSROOT}/qml/" 2>/dev/null || true +fi +""" diff --git a/recipes/wip/qt/qtlottie/recipe.toml b/recipes/wip/qt/qtlottie/recipe.toml new file mode 100644 index 00000000..0187888f --- /dev/null +++ b/recipes/wip/qt/qtlottie/recipe.toml @@ -0,0 +1,133 @@ +#TODO: Qt6 Lottie — cross-compiled for Redox on top of the verified QML/Qt Quick substrate. Runtime validation of the staged Lottie QML import is still pending. +# Provides: the Qt Lottie runtime library and QML import for Bodymovin/Lottie animations in Qt Quick. + +[source] +tar = "https://download.qt.io/official_releases/qt/6.11/6.11.0/submodules/qtlottie-everywhere-src-6.11.0.tar.xz" + +[build] +template = "custom" +dependencies = [ + "qtdeclarative", +] +script = """ +DYNAMIC_INIT + +HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" + +# Sysroot path fix: the cookbook only symlinks sysroot/{bin,include,lib,share} -> usr/ +# but Qt6 cmake targets reference ${_IMPORT_PREFIX}/{plugins,mkspecs,metatypes,modules}. +for qtdir in plugins mkspecs metatypes modules; do + if [ -d "${COOKBOOK_SYSROOT}/usr/${qtdir}" ] && [ ! -e "${COOKBOOK_SYSROOT}/${qtdir}" ]; then + ln -s "usr/${qtdir}" "${COOKBOOK_SYSROOT}/${qtdir}" + fi +done + +if [ ! -d "${COOKBOOK_SYSROOT}/lib/cmake/Qt6Quick" ] \ + && [ ! -d "${COOKBOOK_SYSROOT}/usr/lib/cmake/Qt6Quick" ]; then + printf '%s\n' \ + 'qtlottie requires a Qt Quick-enabled qtdeclarative sysroot (missing Qt6Quick).' >&2 + printf '%s\n' \ + 'Rebuild the verified QtQuick/QML substrate before cooking qtlottie.' >&2 + exit 1 +fi + +rm -f CMakeCache.txt +rm -rf CMakeFiles + +cmake "${COOKBOOK_SOURCE}" \ + -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ + -DQT_HOST_PATH="${HOST_BUILD}" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ + -DQT_BUILD_EXAMPLES=OFF \ + -DQT_BUILD_TESTS=OFF \ + -DQT_GENERATE_SBOM=OFF \ + -Wno-dev + +cmake --build . -j"${COOKBOOK_MAKE_JOBS}" + +cmake --install . --prefix "${COOKBOOK_STAGE}/usr" + +mkdir -p "${COOKBOOK_STAGE}/usr/lib" +for lib in lib/libQt6*.so*; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done +for lib in lib/libQt6*.a; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done + +if [ -d "lib/cmake" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/cmake" + cp -a lib/cmake/Qt6* "${COOKBOOK_STAGE}/usr/lib/cmake/" 2>/dev/null || true +fi +if [ -d "lib/pkgconfig" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/pkgconfig" + cp -a lib/pkgconfig/*.pc "${COOKBOOK_STAGE}/usr/lib/pkgconfig/" 2>/dev/null || true +fi +if [ -d "include" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/include" + cp -a include/* "${COOKBOOK_STAGE}/usr/include/" 2>/dev/null || true +fi +if [ -d "plugins" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/plugins" + cp -a plugins/* "${COOKBOOK_STAGE}/usr/plugins/" 2>/dev/null || true +fi +if [ -d "qml" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/qml" + cp -a qml/* "${COOKBOOK_STAGE}/usr/qml/" 2>/dev/null || true +fi +mkdir -p "${COOKBOOK_STAGE}/usr/metatypes" +find . -path '*/meta_types/*.json' -type f -exec cp -an {} "${COOKBOOK_STAGE}/usr/metatypes/" \\; 2>/dev/null || true + +for lib in "${COOKBOOK_STAGE}/usr/lib/libQt6"*.so.*; do + [ -f "${lib}" ] || continue + patchelf --remove-rpath "${lib}" 2>/dev/null || true +done +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + find "${COOKBOOK_STAGE}/usr/plugins" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + find "${COOKBOOK_STAGE}/usr/qml" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi + +BUILD_DIR="${COOKBOOK_BUILD}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${BUILD_DIR}|/usr|g" {} + 2>/dev/null || true +fi + +SYSROOT="${COOKBOOK_SYSROOT}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/include|${SYSROOT}/include|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/lib|${SYSROOT}/lib|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/src/.*/meta_types/|${SYSROOT}/metatypes/|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${COOKBOOK_SOURCE}/src/.*/meta_types/|${SYSROOT}/metatypes/|g" {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/include" ]; then + mkdir -p "${SYSROOT}/include" + cp -a "${COOKBOOK_STAGE}/usr/include/"* "${SYSROOT}/include/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + mkdir -p "${SYSROOT}/lib/cmake" + cp -a "${COOKBOOK_STAGE}/usr/lib/cmake/Qt6"* "${SYSROOT}/lib/cmake/" 2>/dev/null || true +fi +mkdir -p "${SYSROOT}/lib" +cp -a "${COOKBOOK_STAGE}/usr/lib/libQt6"* "${SYSROOT}/lib/" 2>/dev/null || true +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + mkdir -p "${SYSROOT}/plugins" + cp -a "${COOKBOOK_STAGE}/usr/plugins/"* "${SYSROOT}/plugins/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + mkdir -p "${SYSROOT}/qml" + cp -a "${COOKBOOK_STAGE}/usr/qml/"* "${SYSROOT}/qml/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/metatypes" ]; then + mkdir -p "${SYSROOT}/metatypes" + cp -a "${COOKBOOK_STAGE}/usr/metatypes/"* "${SYSROOT}/metatypes/" 2>/dev/null || true +fi +""" diff --git a/recipes/wip/qt/qtquick3d/recipe.toml b/recipes/wip/qt/qtquick3d/recipe.toml new file mode 100644 index 00000000..679dead0 --- /dev/null +++ b/recipes/wip/qt/qtquick3d/recipe.toml @@ -0,0 +1,194 @@ +#TODO: Qt6 Quick 3D module — cross-compiled for Redox on top of the verified Qt Quick/QML, shader, and timeline substrate. Runtime validation of the renderer plugins and QtQuick3D QML imports is still pending. +# Provides: libQt6Quick3D, libQt6Quick3DAssetImport, libQt6Quick3DAssetUtils, libQt6Quick3DEffects, +# libQt6Quick3DHelpers, libQt6Quick3DIblBaker, libQt6Quick3DParticleEffects, libQt6Quick3DParticles, +# libQt6Quick3DRuntimeRender, and the QtQuick3D QML/plugin surface. + +[source] +tar = "https://download.qt.io/official_releases/qt/6.11/6.11.0/submodules/qtquick3d-everywhere-src-6.11.0.tar.xz" + +[build] +template = "custom" +dependencies = [ + "qtdeclarative", + "qtquicktimeline", +] +script = """ +DYNAMIC_INIT + +HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" +QUICK3D_HOST="${COOKBOOK_ROOT}/build/qt-quick3d-host" + +# Sysroot path fix: the cookbook only symlinks sysroot/{bin,include,lib,share} -> usr/ +# but Qt6 cmake targets reference ${_IMPORT_PREFIX}/{plugins,mkspecs,metatypes,modules}. +for qtdir in plugins mkspecs metatypes modules; do + if [ -d "${COOKBOOK_SYSROOT}/usr/${qtdir}" ] && [ ! -e "${COOKBOOK_SYSROOT}/${qtdir}" ]; then + ln -s "usr/${qtdir}" "${COOKBOOK_SYSROOT}/${qtdir}" + fi +done + +if [ ! -d "${COOKBOOK_SYSROOT}/lib/cmake/Qt6Quick" ] \ + && [ ! -d "${COOKBOOK_SYSROOT}/usr/lib/cmake/Qt6Quick" ]; then + printf '%s\n' \ + 'qtquick3d requires a Qt Quick/QML-enabled qtdeclarative sysroot (missing Qt6Quick).' >&2 + printf '%s\n' \ + 'Rebuild the verified Qt Quick/QML substrate before cooking qtquick3d.' >&2 + exit 1 +fi + +if [ ! -d "${COOKBOOK_SYSROOT}/lib/cmake/Qt6QuickTimeline" ] \ + && [ ! -d "${COOKBOOK_SYSROOT}/usr/lib/cmake/Qt6QuickTimeline" ]; then + printf '%s\n' \ + 'qtquick3d requires the Qt Quick Timeline module in the sysroot (missing Qt6QuickTimeline).' >&2 + printf '%s\n' \ + 'Rebuild qtquicktimeline before cooking qtquick3d.' >&2 + exit 1 +fi + +if [ ! -f "${HOST_BUILD}/bin/qsb" ] \ + && [ ! -f "${HOST_BUILD}/libexec/qsb" ]; then + printf '%s\n' \ + 'qtquick3d requires the qsb host tool from qtshadertools in the shared QT_HOST_PATH.' >&2 + printf '%s\n' \ + 'Rebuild the verified shader substrate before cooking qtquick3d.' >&2 + exit 1 +fi + +if [ ! -d "${HOST_BUILD}/lib/cmake/Qt6Quick3DTools" ] \ + || [ ! -f "${HOST_BUILD}/bin/balsam" -a ! -f "${HOST_BUILD}/libexec/balsam" ]; then + rm -rf "${QUICK3D_HOST}" + mkdir -p "${QUICK3D_HOST}" + env \ + -u CPPFLAGS \ + -u LDFLAGS \ + -u PKG_CONFIG_ALLOW_CROSS \ + -u PKG_CONFIG_PATH \ + -u PKG_CONFIG_LIBDIR \ + -u PKG_CONFIG_SYSROOT_DIR \ + -u CFLAGS \ + -u CXXFLAGS \ + -u CFLAGS_x86_64_unknown_redox \ + -u CXXFLAGS_x86_64_unknown_redox \ + -u LDFLAGS_x86_64_unknown_redox \ + cmake -S "${COOKBOOK_SOURCE}" -B "${QUICK3D_HOST}" \ + -DCMAKE_C_COMPILER=/usr/bin/cc \ + -DCMAKE_CXX_COMPILER=/usr/bin/c++ \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX="${HOST_BUILD}" \ + -DCMAKE_PREFIX_PATH="${HOST_BUILD}" \ + -DQt6ShaderToolsTools_DIR="${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools" \ + -DQT_BUILD_EXAMPLES=OFF \ + -DQT_BUILD_TESTS=OFF \ + -DQT_GENERATE_SBOM=OFF \ + -Wno-dev + cmake --build "${QUICK3D_HOST}" --target balsam -j"${COOKBOOK_MAKE_JOBS}" + + mkdir -p "${HOST_BUILD}/bin" "${HOST_BUILD}/libexec" "${HOST_BUILD}/lib/cmake" + if [ -f "${QUICK3D_HOST}/bin/balsam" ]; then + cp -a "${QUICK3D_HOST}/bin/balsam" "${HOST_BUILD}/bin/" + elif [ -f "${QUICK3D_HOST}/libexec/balsam" ]; then + cp -a "${QUICK3D_HOST}/libexec/balsam" "${HOST_BUILD}/libexec/" + cp -a "${QUICK3D_HOST}/libexec/balsam" "${HOST_BUILD}/bin/balsam" + fi + cp -a "${QUICK3D_HOST}/lib/cmake/Qt6Quick3D" "${HOST_BUILD}/lib/cmake/" 2>/dev/null || true + cp -a "${QUICK3D_HOST}/lib/cmake/Qt6Quick3DPrivate" "${HOST_BUILD}/lib/cmake/" 2>/dev/null || true + cp -a "${QUICK3D_HOST}/lib/cmake/Qt6Quick3DTools" "${HOST_BUILD}/lib/cmake/" 2>/dev/null || true +fi + +rm -f CMakeCache.txt +rm -rf CMakeFiles + +cmake "${COOKBOOK_SOURCE}" \ + -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ + -DQT_HOST_PATH="${HOST_BUILD}" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ + -DQt6ShaderToolsTools_DIR="${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools" \ + -DQt6Quick3DTools_DIR="${HOST_BUILD}/lib/cmake/Qt6Quick3DTools" \ + -DQT_BUILD_EXAMPLES=OFF \ + -DQT_BUILD_TESTS=OFF \ + -DQT_GENERATE_SBOM=OFF \ + -Wno-dev + +cmake --build . -j"${COOKBOOK_MAKE_JOBS}" + +cmake --install . --prefix "${COOKBOOK_STAGE}/usr" + +mkdir -p "${COOKBOOK_STAGE}/usr/lib" +for lib in lib/libQt6*.so*; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done +for lib in lib/libQt6*.a; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done + +if [ -d "lib/cmake" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/cmake" + cp -a lib/cmake/Qt6* "${COOKBOOK_STAGE}/usr/lib/cmake/" 2>/dev/null || true +fi +if [ -d "lib/pkgconfig" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/pkgconfig" + cp -a lib/pkgconfig/*.pc "${COOKBOOK_STAGE}/usr/lib/pkgconfig/" 2>/dev/null || true +fi +if [ -d "include" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/include" + cp -a include/* "${COOKBOOK_STAGE}/usr/include/" 2>/dev/null || true +fi +if [ -d "plugins" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/plugins" + cp -a plugins/* "${COOKBOOK_STAGE}/usr/plugins/" 2>/dev/null || true +fi +if [ -d "qml" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/qml" + cp -a qml/* "${COOKBOOK_STAGE}/usr/qml/" 2>/dev/null || true +fi +mkdir -p "${COOKBOOK_STAGE}/usr/metatypes" +find . -path '*/meta_types/*.json' -type f -exec cp -an {} "${COOKBOOK_STAGE}/usr/metatypes/" \\; 2>/dev/null || true + +for lib in "${COOKBOOK_STAGE}/usr/lib/libQt6"*.so.*; do + [ -f "${lib}" ] || continue + patchelf --remove-rpath "${lib}" 2>/dev/null || true +done +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + find "${COOKBOOK_STAGE}/usr/plugins" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + find "${COOKBOOK_STAGE}/usr/qml" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi + +BUILD_DIR="${COOKBOOK_BUILD}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${BUILD_DIR}|/usr|g" {} + 2>/dev/null || true +fi + +SYSROOT="${COOKBOOK_SYSROOT}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/include|${SYSROOT}/include|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${COOKBOOK_SOURCE}/src/.*/meta_types/|${SYSROOT}/metatypes/|g" {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/include" ]; then + mkdir -p "${SYSROOT}/include" + cp -a "${COOKBOOK_STAGE}/usr/include/"* "${SYSROOT}/include/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + mkdir -p "${SYSROOT}/lib/cmake" + cp -a "${COOKBOOK_STAGE}/usr/lib/cmake/Qt6"* "${SYSROOT}/lib/cmake/" 2>/dev/null || true +fi +mkdir -p "${SYSROOT}/lib" +cp -a "${COOKBOOK_STAGE}/usr/lib/libQt6"* "${SYSROOT}/lib/" 2>/dev/null || true +if [ -d "${COOKBOOK_STAGE}/usr/metatypes" ]; then + mkdir -p "${SYSROOT}/metatypes" + cp -a "${COOKBOOK_STAGE}/usr/metatypes/"* "${SYSROOT}/metatypes/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + mkdir -p "${SYSROOT}/plugins" + cp -a "${COOKBOOK_STAGE}/usr/plugins/"* "${SYSROOT}/plugins/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + mkdir -p "${SYSROOT}/qml" + cp -a "${COOKBOOK_STAGE}/usr/qml/"* "${SYSROOT}/qml/" 2>/dev/null || true +fi +""" diff --git a/recipes/wip/qt/qtserialport/recipe.toml b/recipes/wip/qt/qtserialport/recipe.toml index fa3a5107..cb3e458e 100644 --- a/recipes/wip/qt/qtserialport/recipe.toml +++ b/recipes/wip/qt/qtserialport/recipe.toml @@ -14,6 +14,177 @@ DYNAMIC_INIT HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" +python - <<'PY' +import os +from pathlib import Path +path = Path(os.environ["COOKBOOK_SOURCE"]) / "src/serialport/qserialport_unix.cpp" +text = path.read_text() +text = text.replace( +'''static inline void qt_set_flowcontrol(termios *tio, QSerialPort::FlowControl flowcontrol) +{ + switch (flowcontrol) { + case QSerialPort::NoFlowControl: + tio->c_cflag &= ~CRTSCTS; + tio->c_iflag &= ~(IXON | IXOFF | IXANY); + break; + case QSerialPort::HardwareControl: + tio->c_cflag |= CRTSCTS; + tio->c_iflag &= ~(IXON | IXOFF | IXANY); + break; + case QSerialPort::SoftwareControl: + tio->c_cflag &= ~CRTSCTS; + tio->c_iflag |= IXON | IXOFF | IXANY; + break; + default: + tio->c_cflag &= ~CRTSCTS; + tio->c_iflag &= ~(IXON | IXOFF | IXANY); + break; + } +} +''', +'''static inline void qt_set_flowcontrol(termios *tio, QSerialPort::FlowControl flowcontrol) +{ +#ifdef CRTSCTS + switch (flowcontrol) { + case QSerialPort::NoFlowControl: + tio->c_cflag &= ~CRTSCTS; + tio->c_iflag &= ~(IXON | IXOFF | IXANY); + break; + case QSerialPort::HardwareControl: + tio->c_cflag |= CRTSCTS; + tio->c_iflag &= ~(IXON | IXOFF | IXANY); + break; + case QSerialPort::SoftwareControl: + tio->c_cflag &= ~CRTSCTS; + tio->c_iflag |= IXON | IXOFF | IXANY; + break; + default: + tio->c_cflag &= ~CRTSCTS; + tio->c_iflag &= ~(IXON | IXOFF | IXANY); + break; + } +#else + Q_UNUSED(flowcontrol); + tio->c_iflag &= ~(IXON | IXOFF | IXANY); +#endif +} +''') +text = text.replace( +'''QSerialPort::PinoutSignals QSerialPortPrivate::pinoutSignals() +{ + int arg = 0; + + if (::ioctl(descriptor, TIOCMGET, &arg) == -1) { + setError(getSystemError()); + return QSerialPort::NoSignal; + } +''', +'''QSerialPort::PinoutSignals QSerialPortPrivate::pinoutSignals() +{ +#ifndef TIOCMGET + setError(QSerialPortErrorInfo(QSerialPort::UnsupportedOperationError, + QSerialPort::tr("Pinout signal query is not supported on this platform"))); + return QSerialPort::NoSignal; +#else + int arg = 0; + + if (::ioctl(descriptor, TIOCMGET, &arg) == -1) { + setError(getSystemError()); + return QSerialPort::NoSignal; + } +#endif +''') +text = text.replace( +'''bool QSerialPortPrivate::setDataTerminalReady(bool set) +{ + int status = TIOCM_DTR; + if (::ioctl(descriptor, set ? TIOCMBIS : TIOCMBIC, &status) == -1) { + setError(getSystemError()); + return false; + } + + return true; +} +''', +'''bool QSerialPortPrivate::setDataTerminalReady(bool set) +{ +#if !defined(TIOCM_DTR) || !defined(TIOCMBIS) || !defined(TIOCMBIC) + Q_UNUSED(set); + setError(QSerialPortErrorInfo(QSerialPort::UnsupportedOperationError, + QSerialPort::tr("Data terminal ready is not supported on this platform"))); + return false; +#else + int status = TIOCM_DTR; + if (::ioctl(descriptor, set ? TIOCMBIS : TIOCMBIC, &status) == -1) { + setError(getSystemError()); + return false; + } + + return true; +#endif +} +''') +text = text.replace( +'''bool QSerialPortPrivate::setRequestToSend(bool set) +{ + int status = TIOCM_RTS; + if (::ioctl(descriptor, set ? TIOCMBIS : TIOCMBIC, &status) == -1) { + setError(getSystemError()); + return false; + } + + return true; +} +''', +'''bool QSerialPortPrivate::setRequestToSend(bool set) +{ +#if !defined(TIOCM_RTS) || !defined(TIOCMBIS) || !defined(TIOCMBIC) + Q_UNUSED(set); + setError(QSerialPortErrorInfo(QSerialPort::UnsupportedOperationError, + QSerialPort::tr("Request-to-send is not supported on this platform"))); + return false; +#else + int status = TIOCM_RTS; + if (::ioctl(descriptor, set ? TIOCMBIS : TIOCMBIC, &status) == -1) { + setError(getSystemError()); + return false; + } + + return true; +#endif +} +''') +text = text.replace( +'''bool QSerialPortPrivate::setBreakEnabled(bool set) +{ + if (::ioctl(descriptor, set ? TIOCSBRK : TIOCCBRK) == -1) { + setError(getSystemError()); + return false; + } + + return true; +} +''', +'''bool QSerialPortPrivate::setBreakEnabled(bool set) +{ +#if !defined(TIOCSBRK) || !defined(TIOCCBRK) + Q_UNUSED(set); + setError(QSerialPortErrorInfo(QSerialPort::UnsupportedOperationError, + QSerialPort::tr("Break signaling is not supported on this platform"))); + return false; +#else + if (::ioctl(descriptor, set ? TIOCSBRK : TIOCCBRK) == -1) { + setError(getSystemError()); + return false; + } + + return true; +#endif +} +''') +path.write_text(text) +PY + # Sysroot path fix: same as other Qt6 modules — cookbook only symlinks # sysroot/{bin,include,lib,share} but Qt6 cmake targets reference # ${_IMPORT_PREFIX}/{plugins,mkspecs,metatypes,modules}. diff --git a/recipes/wip/qt/qtshadertools/recipe.toml b/recipes/wip/qt/qtshadertools/recipe.toml index 9f2571c8..f2758880 100644 --- a/recipes/wip/qt/qtshadertools/recipe.toml +++ b/recipes/wip/qt/qtshadertools/recipe.toml @@ -12,6 +12,7 @@ DYNAMIC_INIT HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" SHADER_HOST="${COOKBOOK_ROOT}/build/qt-shadertools-host" +SHADER_HOST_SRC="${COOKBOOK_ROOT}/build/qt-shadertools-host-src" mkdir -p "${HOST_BUILD}/include/QtGui/6.11.0/QtGui" @@ -20,11 +21,6 @@ if [ -d "${QTBASE_STAGE}/include/QtGui" ] && [ ! -d "${COOKBOOK_SYSROOT}/include mkdir -p "${COOKBOOK_SYSROOT}/include" cp -a "${QTBASE_STAGE}/include/QtGui" "${COOKBOOK_SYSROOT}/include/" fi -if [ -d "${QTBASE_STAGE}/lib" ]; then - mkdir -p "${HOST_BUILD}/lib" - cp -a "${QTBASE_STAGE}/lib/libQt6Gui.so"* "${HOST_BUILD}/lib/" 2>/dev/null || true - cp -a "${QTBASE_STAGE}/lib/libQt6Gui.prl" "${HOST_BUILD}/lib/" 2>/dev/null || true -fi QTBASE_BUILD_INCLUDE="${COOKBOOK_ROOT}/recipes/wip/qt/qtbase/target/${TARGET}/build/include/QtGui" if [ -d "${QTBASE_BUILD_INCLUDE}/6.11.0/QtGui/rhi" ]; then mkdir -p "${COOKBOOK_SYSROOT}/include/QtGui/6.11.0" @@ -121,8 +117,9 @@ qsb_cpp.write_text(text) tools_cmake = Path(os.environ["COOKBOOK_SOURCE"]) / "tools/CMakeLists.txt" text = tools_cmake.read_text() -text = text.replace('add_subdirectory(qsb)', '# add_subdirectory(qsb) # disabled in Red Bear target build; host qsb is built separately') +text = text.replace('# add_subdirectory(qsb) # disabled in Red Bear target build; host qsb is built separately', 'add_subdirectory(qsb)') tools_cmake.write_text(text) + PY # ============================================================ @@ -131,7 +128,10 @@ PY if [ ! -f "${HOST_BUILD}/bin/qsb" ]; then echo "=== Building qsb host tool ===" rm -rf "${SHADER_HOST}" + rm -rf "${SHADER_HOST_SRC}" mkdir -p "${SHADER_HOST}" + mkdir -p "${SHADER_HOST_SRC}" + tar -xf "${COOKBOOK_RECIPE}/source.tar" -C "${SHADER_HOST_SRC}" --strip-components=1 env \ -u CPPFLAGS \ -u LDFLAGS \ @@ -144,7 +144,7 @@ if [ ! -f "${HOST_BUILD}/bin/qsb" ]; then -u CFLAGS_x86_64_unknown_redox \ -u CXXFLAGS_x86_64_unknown_redox \ -u LDFLAGS_x86_64_unknown_redox \ - cmake -S "${COOKBOOK_SOURCE}" -B "${SHADER_HOST}" \ + cmake -S "${SHADER_HOST_SRC}" -B "${SHADER_HOST}" \ -DCMAKE_C_COMPILER=/usr/bin/cc \ -DCMAKE_CXX_COMPILER=/usr/bin/c++ \ -DCMAKE_BUILD_TYPE=Release \ @@ -154,26 +154,19 @@ if [ ! -f "${HOST_BUILD}/bin/qsb" ]; then -DQT_BUILD_TESTS=OFF \ -DQT_GENERATE_SBOM=OFF \ -Wno-dev - cmake --build "${SHADER_HOST}" -j"${COOKBOOK_MAKE_JOBS}" - - mkdir -p "${HOST_BUILD}/lib/cmake" - cp -a "${SHADER_HOST}/lib/cmake/Qt6ShaderTools" "${HOST_BUILD}/lib/cmake/" 2>/dev/null || true - cp -a "${SHADER_HOST}/lib/cmake/Qt6ShaderToolsPrivate" "${HOST_BUILD}/lib/cmake/" 2>/dev/null || true - cp -a "${SHADER_HOST}/lib/cmake/Qt6ShaderToolsTools" "${HOST_BUILD}/lib/cmake/" 2>/dev/null || true - if [ -d "${SHADER_HOST}/libexec" ]; then - mkdir -p "${HOST_BUILD}/libexec" - cp -a "${SHADER_HOST}/libexec/." "${HOST_BUILD}/libexec/" 2>/dev/null || true - fi - if [ -f "${SHADER_HOST}/bin/qsb" ]; then - mkdir -p "${HOST_BUILD}/bin" - cp -a "${SHADER_HOST}/bin/qsb" "${HOST_BUILD}/bin/" - elif [ -f "${SHADER_HOST}/libexec/qsb" ]; then - mkdir -p "${HOST_BUILD}/bin" "${HOST_BUILD}/libexec" - cp -a "${SHADER_HOST}/libexec/qsb" "${HOST_BUILD}/libexec/" - cp -a "${SHADER_HOST}/libexec/qsb" "${HOST_BUILD}/bin/qsb" - fi + cmake --build "${SHADER_HOST}" --target qsb -j"${COOKBOOK_MAKE_JOBS}" + cmake --install "${SHADER_HOST}" --prefix "${HOST_BUILD}" fi +python - <<'PY' +import os +from pathlib import Path +tools_cmake = Path(os.environ["COOKBOOK_SOURCE"]) / "tools/CMakeLists.txt" +text = tools_cmake.read_text() +text = text.replace('add_subdirectory(qsb)', '# add_subdirectory(qsb) # disabled in Red Bear target build; host qsb is built separately') +tools_cmake.write_text(text) +PY + # ============================================================ # Step 2: Cross-compile libQt6ShaderTools for Redox # ============================================================ diff --git a/recipes/wip/qt/qtvirtualkeyboard/recipe.toml b/recipes/wip/qt/qtvirtualkeyboard/recipe.toml new file mode 100644 index 00000000..5473f1da --- /dev/null +++ b/recipes/wip/qt/qtvirtualkeyboard/recipe.toml @@ -0,0 +1,156 @@ +#TODO: Qt6 Virtual Keyboard — cross-compiled for Redox on top of the verified QML/Qt Quick substrate. Runtime validation of the staged input method plugin and QML imports is still pending. +# Provides: libQt6VirtualKeyboard, the QtQuick.VirtualKeyboard QML import, and the platform input context plugin. + +[source] +tar = "https://download.qt.io/official_releases/qt/6.11/6.11.0/submodules/qtvirtualkeyboard-everywhere-src-6.11.0.tar.xz" + +[build] +template = "custom" +dependencies = [ + "qtdeclarative", + "qtsvg", +] +script = """ +DYNAMIC_INIT + +HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build" + +# Sysroot path fix: the cookbook only symlinks sysroot/{bin,include,lib,share} -> usr/ +# but Qt6 cmake targets reference ${_IMPORT_PREFIX}/{plugins,mkspecs,metatypes,modules}. +for qtdir in plugins mkspecs metatypes modules; do + if [ -d "${COOKBOOK_SYSROOT}/usr/${qtdir}" ] && [ ! -e "${COOKBOOK_SYSROOT}/${qtdir}" ]; then + ln -s "usr/${qtdir}" "${COOKBOOK_SYSROOT}/${qtdir}" + fi +done + +if [ -d "${COOKBOOK_SYSROOT}/lib/cmake" ]; then + find "${COOKBOOK_SYSROOT}/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/include|${COOKBOOK_SYSROOT}/include|g" {} + 2>/dev/null || true + find "${COOKBOOK_SYSROOT}/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/lib|${COOKBOOK_SYSROOT}/lib|g" {} + 2>/dev/null || true + find "${COOKBOOK_SYSROOT}/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/src/.*/meta_types/|${COOKBOOK_SYSROOT}/metatypes/|g" {} + 2>/dev/null || true +fi + +if [ ! -d "${COOKBOOK_SYSROOT}/lib/cmake/Qt6Quick" ] \ + && [ ! -d "${COOKBOOK_SYSROOT}/usr/lib/cmake/Qt6Quick" ]; then + printf '%s\n' \ + 'qtvirtualkeyboard requires a Qt Quick-enabled qtdeclarative sysroot (missing Qt6Quick).' >&2 + printf '%s\n' \ + 'Rebuild the verified QtQuick/QML substrate before cooking qtvirtualkeyboard.' >&2 + exit 1 +fi + +if [ ! -d "${COOKBOOK_SYSROOT}/lib/cmake/Qt6Svg" ] \ + && [ ! -d "${COOKBOOK_SYSROOT}/usr/lib/cmake/Qt6Svg" ]; then + printf '%s\n' \ + 'qtvirtualkeyboard requires qtsvg in the sysroot (missing Qt6Svg).' >&2 + printf '%s\n' \ + 'Cook qtsvg before cooking qtvirtualkeyboard.' >&2 + exit 1 +fi + +rm -f CMakeCache.txt +rm -rf CMakeFiles + +cmake "${COOKBOOK_SOURCE}" \ + -DCMAKE_TOOLCHAIN_FILE="${COOKBOOK_ROOT}/local/recipes/qt/redox-toolchain.cmake" \ + -DQT_HOST_PATH="${HOST_BUILD}" \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_PREFIX_PATH="${COOKBOOK_SYSROOT}" \ + -DQT_BUILD_EXAMPLES=OFF \ + -DQT_BUILD_TESTS=OFF \ + -DQT_GENERATE_SBOM=OFF \ + -Wno-dev + +cmake --build . -j"${COOKBOOK_MAKE_JOBS}" + +cmake --install . --prefix "${COOKBOOK_STAGE}/usr" + +mkdir -p "${COOKBOOK_STAGE}/usr/lib" +for lib in lib/libQt6*.so*; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done +for lib in lib/libQt6*.a; do + [ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/" +done + +if [ -d "lib/cmake" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/cmake" + cp -a lib/cmake/Qt6* "${COOKBOOK_STAGE}/usr/lib/cmake/" 2>/dev/null || true +fi +if [ -d "lib/pkgconfig" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/lib/pkgconfig" + cp -a lib/pkgconfig/*.pc "${COOKBOOK_STAGE}/usr/lib/pkgconfig/" 2>/dev/null || true +fi +if [ -d "include" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/include" + cp -a include/* "${COOKBOOK_STAGE}/usr/include/" 2>/dev/null || true +fi +if [ -d "plugins" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/plugins" + cp -a plugins/* "${COOKBOOK_STAGE}/usr/plugins/" 2>/dev/null || true +fi +if [ -d "qml" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/qml" + cp -a qml/* "${COOKBOOK_STAGE}/usr/qml/" 2>/dev/null || true +fi +if [ -d "translations" ]; then + mkdir -p "${COOKBOOK_STAGE}/usr/translations" + cp -a translations/* "${COOKBOOK_STAGE}/usr/translations/" 2>/dev/null || true +fi +mkdir -p "${COOKBOOK_STAGE}/usr/metatypes" +find . -path '*/meta_types/*.json' -type f -exec cp -an {} "${COOKBOOK_STAGE}/usr/metatypes/" \\; 2>/dev/null || true + +for lib in "${COOKBOOK_STAGE}/usr/lib/libQt6"*.so.*; do + [ -f "${lib}" ] || continue + patchelf --remove-rpath "${lib}" 2>/dev/null || true +done +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + find "${COOKBOOK_STAGE}/usr/plugins" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + find "${COOKBOOK_STAGE}/usr/qml" -name '*.so' -exec patchelf --remove-rpath {} + 2>/dev/null || true +fi + +BUILD_DIR="${COOKBOOK_BUILD}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${BUILD_DIR}|/usr|g" {} + 2>/dev/null || true +fi + +SYSROOT="${COOKBOOK_SYSROOT}" +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/include|${SYSROOT}/include|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/lib|${SYSROOT}/lib|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|/usr/src/.*/meta_types/|${SYSROOT}/metatypes/|g" {} + 2>/dev/null || true + find "${COOKBOOK_STAGE}/usr/lib/cmake" -name '*.cmake' -exec sed -i \ + "s|${COOKBOOK_SOURCE}/src/.*/meta_types/|${SYSROOT}/metatypes/|g" {} + 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/include" ]; then + mkdir -p "${SYSROOT}/include" + cp -a "${COOKBOOK_STAGE}/usr/include/"* "${SYSROOT}/include/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/lib/cmake" ]; then + mkdir -p "${SYSROOT}/lib/cmake" + cp -a "${COOKBOOK_STAGE}/usr/lib/cmake/Qt6"* "${SYSROOT}/lib/cmake/" 2>/dev/null || true +fi +mkdir -p "${SYSROOT}/lib" +cp -a "${COOKBOOK_STAGE}/usr/lib/libQt6"* "${SYSROOT}/lib/" 2>/dev/null || true +if [ -d "${COOKBOOK_STAGE}/usr/plugins" ]; then + mkdir -p "${SYSROOT}/plugins" + cp -a "${COOKBOOK_STAGE}/usr/plugins/"* "${SYSROOT}/plugins/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/qml" ]; then + mkdir -p "${SYSROOT}/qml" + cp -a "${COOKBOOK_STAGE}/usr/qml/"* "${SYSROOT}/qml/" 2>/dev/null || true +fi +if [ -d "${COOKBOOK_STAGE}/usr/metatypes" ]; then + mkdir -p "${SYSROOT}/metatypes" + cp -a "${COOKBOOK_STAGE}/usr/metatypes/"* "${SYSROOT}/metatypes/" 2>/dev/null || true +fi +"""