Update Qt6 recipes and add remaining module stubs

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
2026-04-17 13:34:18 +01:00
parent 83b77dbbea
commit 352bc9340f
11 changed files with 1323 additions and 40 deletions
+141
View File
@@ -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
"""
+29 -9
View File
@@ -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 \
+112
View File
@@ -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
"""
+139
View File
@@ -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
"""
+59 -6
View File
@@ -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
"""
+171
View File
@@ -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
"""
+133
View File
@@ -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
"""
+194
View File
@@ -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
"""
+171
View File
@@ -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}.
+18 -25
View File
@@ -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
# ============================================================
@@ -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
"""