Files
RedBear-OS/local/recipes/qt/qtshadertools/recipe.toml
T
vasilito fc0c1e4576 qtshadertools(0.2.5): wire ShaderToolsMacros into Config.cmake
The cmake-generated Qt6ShaderToolsConfig.cmake has an empty
extra_cmake_include list. Patch it to include Qt6ShaderToolsMacros.cmake
so qt_internal_add_shaders is defined for downstream modules.
2026-07-02 18:38:45 +03:00

299 lines
12 KiB
TOML

#TODO: Qt6 ShaderTools — Qt shader translation/compilation pipeline (qsb, spirv-cross).
# Provides libQt6ShaderTools which qtdeclarative depends on for shader pipeline.
# Builds only required tools/libraries; test/example code disabled for cross-compile.
# Source mirrored from upstream Qt 6.11.1.
[source]
tar = "https://download.qt.io/official_releases/qt/6.11/6.11.1/submodules/qtshadertools-everywhere-src-6.11.1.tar.xz"
blake3 = "24dcd88b9e752a380067182687032b2139d2f6220d64e4193428434970102ae2"
patches = []
[build]
template = "custom"
dependencies = [
"qtbase",
]
script = """
DYNAMIC_INIT
HOST_BUILD="${COOKBOOK_ROOT}/build/qt-host-build"
HOST_QST_BUILD="${COOKBOOK_ROOT}/build/qtshadertools-host-build"
HOST_QST_STAMP="${HOST_BUILD}/.redbear-host-qsb-6.11.1"
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"
source "${COOKBOOK_ROOT}/local/scripts/lib/qt-sysroot.sh"
redbear_qt_link_sysroot_dirs "${COOKBOOK_SYSROOT}" plugins mkspecs metatypes modules
if [ -f "${COOKBOOK_SYSROOT}/lib/libredbear-qt-strtold-compat.so" ]; then
mkdir -p "${COOKBOOK_SYSROOT}/usr/lib"
cp -f "${COOKBOOK_SYSROOT}/lib/libredbear-qt-strtold-compat.so" "${COOKBOOK_SYSROOT}/usr/lib/" 2>/dev/null || true
fi
# ============================================================
# Step 1: Build qtshadertools host tools (qsb) on the host
# ============================================================
if [ ! -f "${HOST_BUILD}/bin/qsb" ] || [ ! -f "${HOST_QST_STAMP}" ]; then
echo "=== Building qtshadertools host tools (qsb) ==="
rm -rf "${HOST_QST_BUILD}"
env -i \
HOME="${HOME}" \
PATH="${HOST_PATH}" \
cmake -S "${COOKBOOK_SOURCE}" -B "${HOST_QST_BUILD}" \
-GNinja \
-DCMAKE_C_COMPILER=/usr/bin/cc \
-DCMAKE_CXX_COMPILER=/usr/bin/c++ \
-DCMAKE_ASM_COMPILER=/usr/bin/cc \
-DCMAKE_AR=/usr/bin/ar \
-DCMAKE_RANLIB=/usr/bin/ranlib \
-DCMAKE_STRIP=/usr/bin/strip \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH="${HOST_BUILD}" \
-DQT_HOST_PATH="${HOST_BUILD}" \
-DQT_BUILD_TOOLS_BY_DEFAULT=ON \
-DBUILD_TESTING=OFF \
-DBUILD_EXAMPLES=OFF \
-Wno-dev
(
cd "${HOST_QST_BUILD}"
env -i HOME="${HOME}" PATH="${HOST_PATH}" cmake --build . -j"${COOKBOOK_MAKE_JOBS}"
)
(
cd "${HOST_QST_BUILD}"
env -i HOME="${HOME}" PATH="${HOST_PATH}" cmake --install . --prefix "${HOST_BUILD}"
)
printf '%s\n' "6.11.1" > "${HOST_QST_STAMP}"
fi
# ============================================================
# Step 1b: Generate Qt6ShaderToolsTools cmake package
# Qt6's standalone module build does not generate this tools wrapper.
# Cross-compile needs find_package(Qt6ShaderToolsTools) -> Qt6::qsb.
# Pattern follows Qt6WaylandScannerTools from qtbase host build.
# ============================================================
QST_CMAKE_DIR="${HOST_BUILD}/lib/cmake/Qt6ShaderToolsTools"
if [ ! -f "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsConfig.cmake" ]; then
mkdir -p "${QST_CMAKE_DIR}"
QSB_PATH="${HOST_BUILD}/bin/qsb"
cat > "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsConfig.cmake" << 'EOF_CFG'
get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
macro(set_and_check _var _file)
set(${_var} "${_file}")
if(NOT EXISTS "${_file}")
message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
endif()
endmacro()
macro(check_required_components _NAME)
foreach(comp ${${_NAME}_FIND_COMPONENTS})
if(NOT ${_NAME}_${comp}_FOUND)
if(${_NAME}_FIND_REQUIRED_${comp})
set(${_NAME}_FOUND FALSE)
endif()
endif()
endforeach()
endmacro()
cmake_minimum_required(VERSION 3.16...3.21)
include(CMakeFindDependencyMacro)
if(EXISTS "${CMAKE_CURRENT_LIST_DIR}/Qt6ShaderToolsToolsDependencies.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/Qt6ShaderToolsToolsDependencies.cmake")
endif()
if(NOT DEFINED "Qt6ShaderToolsTools_FOUND")
set("Qt6ShaderToolsTools_FOUND" TRUE)
endif()
set(__qt_ShaderToolsTools_should_include_targets_code "TRUE")
if(__qt_ShaderToolsTools_should_include_targets_code)
include("${CMAKE_CURRENT_LIST_DIR}/Qt6ShaderToolsToolsTargetsPrecheck.cmake")
endif()
if(NOT __qt_ShaderToolsTools_skip_include_targets_file
AND Qt6ShaderToolsTools_FOUND
AND __qt_ShaderToolsTools_should_include_targets_code)
include("${CMAKE_CURRENT_LIST_DIR}/Qt6ShaderToolsToolsTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/Qt6ShaderToolsToolsAdditionalTargetInfo.cmake")
if(NOT QT_NO_CREATE_VERSIONLESS_TARGETS)
include("${CMAKE_CURRENT_LIST_DIR}/Qt6ShaderToolsToolsVersionlessTargets.cmake")
endif()
set(__qt_ShaderToolsTools_targets_file_included ON)
endif()
if(__qt_ShaderToolsTools_targets_file_included AND Qt6ShaderToolsTools_FOUND)
__qt_internal_promote_target_to_global(Qt6::qsb)
endif()
set(Qt6ShaderToolsTools_TARGETS "Qt6::qsb")
EOF_CFG
cat > "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsTargets.cmake" << 'EOF_TGT'
cmake_policy(PUSH)
cmake_policy(VERSION 2.8.3...4.1)
set(CMAKE_IMPORT_FILE_VERSION 1)
set(_targets_defined "")
set(_targets_not_defined "")
set(_expected_targets "")
foreach(_expected IN ITEMS Qt6::qsb)
list(APPEND _expected_targets "${_expected}")
if(TARGET "${_expected}")
list(APPEND _targets_defined "${_expected}")
else()
list(APPEND _targets_not_defined "${_expected}")
endif()
endforeach()
unset(_expected)
if(_targets_defined STREQUAL _expected_targets)
cmake_policy(POP)
return()
endif()
unset(_targets_defined)
unset(_targets_not_defined)
unset(_expected_targets)
get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
if(_IMPORT_PREFIX STREQUAL "/")
set(_IMPORT_PREFIX "")
endif()
add_executable(Qt6::qsb IMPORTED)
set_target_properties(Qt6::qsb PROPERTIES
COMPATIBLE_INTERFACE_STRING "QT_MAJOR_VERSION"
INTERFACE_QT_MAJOR_VERSION "6"
)
file(GLOB _cfg_files "${CMAKE_CURRENT_LIST_DIR}/Qt6ShaderToolsToolsTargets-*.cmake")
foreach(_cfg IN LISTS _cfg_files)
include("${_cfg}")
endforeach()
unset(_cfg)
unset(_cfg_files)
unset(_IMPORT_PREFIX)
unset(CMAKE_IMPORT_FILE_VERSION)
cmake_policy(POP)
EOF_TGT
cat > "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsTargets-release.cmake" << EOF_REL
set_property(TARGET Qt6::qsb APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
set_target_properties(Qt6::qsb PROPERTIES
IMPORTED_LOCATION_RELEASE "${QSB_PATH}"
)
set(_cmake_import_check_targets "Qt6::qsb")
set(_cmake_import_check_files_for_Qt6::qsb "${QSB_PATH}")
EOF_REL
cat > "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsTargetsPrecheck.cmake" << 'EOF_PRE'
_qt_internal_should_include_targets(
TARGETS qsb
NAMESPACE Qt6::
OUT_VAR_SHOULD_SKIP __qt_ShaderToolsTools_skip_include_targets_file
)
EOF_PRE
cat > "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsAdditionalTargetInfo.cmake" << 'EOF_ADD'
if(NOT DEFINED QT_DEFAULT_IMPORT_CONFIGURATION)
set(QT_DEFAULT_IMPORT_CONFIGURATION RELEASE)
endif()
get_target_property(_qt_loc Qt6::qsb IMPORTED_LOCATION_RELEASE)
get_target_property(_qt_loc_def Qt6::qsb IMPORTED_LOCATION_${QT_DEFAULT_IMPORT_CONFIGURATION})
set_property(TARGET Qt6::qsb APPEND PROPERTY IMPORTED_CONFIGURATIONS RELWITHDEBINFO)
if(_qt_loc)
set_property(TARGET Qt6::qsb PROPERTY IMPORTED_LOCATION_RELWITHDEBINFO "${_qt_loc}")
endif()
set_property(TARGET Qt6::qsb APPEND PROPERTY IMPORTED_CONFIGURATIONS MINSIZEREL)
if(_qt_loc)
set_property(TARGET Qt6::qsb PROPERTY IMPORTED_LOCATION_MINSIZEREL "${_qt_loc}")
endif()
if(_qt_loc_def)
set_property(TARGET Qt6::qsb PROPERTY IMPORTED_LOCATION "${_qt_loc_def}")
endif()
EOF_ADD
cat > "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsVersionlessTargets.cmake" << 'EOF_VER'
foreach(__qt_tool qsb)
if(NOT TARGET Qt::${__qt_tool} AND TARGET Qt6::${__qt_tool})
add_executable(Qt::${__qt_tool} IMPORTED GLOBAL)
foreach(__qt_cfg IMPORTED_LOCATION IMPORTED_LOCATION_RELEASE IMPORTED_LOCATION_RELWITHDEBINFO IMPORTED_LOCATION_MINSIZEREL IMPORTED_LOCATION_DEBUG)
get_target_property(__qt_loc Qt6::${__qt_tool} ${__qt_cfg})
if(__qt_loc AND EXISTS "${__qt_loc}")
break()
endif()
endforeach()
set_target_properties(Qt::${__qt_tool} PROPERTIES IMPORTED_LOCATION "${__qt_loc}")
endif()
endforeach()
EOF_VER
printf 'set(Qt6ShaderToolsTools_FOUND TRUE)\n' \
> "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsDependencies.cmake"
cat > "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsConfigVersionImpl.cmake" << 'EOF_VIMPL'
set(PACKAGE_VERSION "6.11.1")
if(PACKAGE_FIND_VERSION VERSION_LESS_EQUAL PACKAGE_VERSION)
set(PACKAGE_VERSION_COMPATIBLE TRUE)
else()
set(PACKAGE_VERSION_COMPATIBLE FALSE)
endif()
if(NOT PACKAGE_VERSION_COMPATIBLE)
set(PACKAGE_VERSION_UNSUITABLE TRUE)
endif()
EOF_VIMPL
cat > "${QST_CMAKE_DIR}/Qt6ShaderToolsToolsConfigVersion.cmake" << 'EOF_VER2'
include("${CMAKE_CURRENT_LIST_DIR}/Qt6ShaderToolsToolsConfigVersionImpl.cmake")
EOF_VER2
echo "Generated Qt6ShaderToolsTools cmake package"
fi
# ============================================================
# Step 2: Cross-compile qtshadertools for Redox
# ============================================================
redbear_qt_reset_cmake_cache_dir
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}" \
-DCMAKE_DISABLE_PRECOMPILE_HEADERS=ON \
-DQT_BUILD_TOOLS_BY_DEFAULT=OFF \
-DQT_GENERATE_SBOM=OFF \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_TESTING=OFF \
-DBUILD_EXAMPLES=OFF \
-Wno-dev
cmake --build . -j"${COOKBOOK_MAKE_JOBS}"
python3 - <<'PY'
from pathlib import Path
import shutil
install_script = Path("cmake_install.cmake")
generated = Path("lib/cmake/Qt6ShaderTools/Qt6ShaderToolsTargets.cmake")
if install_script.exists() and generated.exists():
for line in install_script.read_text().splitlines():
marker = 'CMakeFiles/Export/'
suffix = '/Qt6ShaderToolsTargets.cmake'
if marker in line and suffix in line and 'FILES "' in line:
expected = Path(line.split('FILES "', 1)[1].rsplit('"', 1)[0])
expected.parent.mkdir(parents=True, exist_ok=True)
if not expected.exists():
shutil.copy2(generated, expected)
break
PY
cmake --install . --prefix "${COOKBOOK_STAGE}/usr"
cp -f "${COOKBOOK_SOURCE}/tools/qsb/Qt6ShaderToolsMacros.cmake" \
"${COOKBOOK_STAGE}/usr/lib/cmake/Qt6ShaderTools/Qt6ShaderToolsMacros.cmake" 2>/dev/null || true
cp -f "${COOKBOOK_SOURCE}/tools/qsb/Qt6ShaderToolsMacros.cmake" \
"${HOST_BUILD}/lib/cmake/Qt6ShaderTools/Qt6ShaderToolsMacros.cmake" 2>/dev/null || true
QST_CFG="${COOKBOOK_STAGE}/usr/lib/cmake/Qt6ShaderTools/Qt6ShaderToolsConfig.cmake"
if [ -f "${QST_CFG}" ] && ! grep -q "ShaderToolsMacros" "${QST_CFG}"; then
sed -i 's/foreach(extra_cmake_include )/foreach(extra_cmake_include Qt6ShaderToolsMacros.cmake)/' "${QST_CFG}"
fi
QST_CFG_HOST="${HOST_BUILD}/lib/cmake/Qt6ShaderTools/Qt6ShaderToolsConfig.cmake"
if [ -f "${QST_CFG_HOST}" ] && ! grep -q "ShaderToolsMacros" "${QST_CFG_HOST}"; then
sed -i 's/foreach(extra_cmake_include )/foreach(extra_cmake_include Qt6ShaderToolsMacros.cmake)/' "${QST_CFG_HOST}"
fi
for lib in lib/libQt6*.so*; do
[ -f "${lib}" ] && cp -an "${lib}" "${COOKBOOK_STAGE}/usr/lib/"
done
"""