fc0c1e4576
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.
299 lines
12 KiB
TOML
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
|
|
"""
|