From 3bf79057217fa7d980c04a9fa2745beed87ac3bb Mon Sep 17 00:00:00 2001 From: K900 Date: Mon, 28 Jul 2025 14:42:04 +0300 Subject: [PATCH] kdePackages.mkKdeDerivation: qmllint hook v3 --- pkgs/kde/lib/mk-kde-derivation.nix | 12 +++++++ pkgs/kde/lib/qmllint-hook.sh | 57 ++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 pkgs/kde/lib/qmllint-hook.sh diff --git a/pkgs/kde/lib/mk-kde-derivation.nix b/pkgs/kde/lib/mk-kde-derivation.nix index 54f7f922d94e..e013644e6908 100644 --- a/pkgs/kde/lib/mk-kde-derivation.nix +++ b/pkgs/kde/lib/mk-kde-derivation.nix @@ -8,6 +8,7 @@ self: qt6, python3, python3Packages, + jq, }: let dependencies = (lib.importJSON ../generated/dependencies.json).dependencies; @@ -77,6 +78,14 @@ let }; moveOutputsHook = makeSetupHook { name = "kf6-move-outputs-hook"; } ./move-outputs-hook.sh; + + qmllintHook = makeSetupHook { + name = "qmllint-validate-hook"; + substitutions = { + qmllint = "${qt6.qtdeclarative}/bin/qmllint"; + jq = lib.getExe jq; + }; + } ./qmllint-hook.sh; in { pname, @@ -131,6 +140,7 @@ let ninja qt6.wrapQtAppsHook moveOutputsHook + qmllintHook ] ++ lib.optionals hasPythonBindings [ python3Packages.shiboken6 @@ -155,6 +165,8 @@ let cmakeFlags = [ "-DQT_MAJOR_VERSION=6" ] ++ extraCmakeFlags; + doInstallCheck = true; + separateDebugInfo = true; env.LANG = "C.UTF-8"; diff --git a/pkgs/kde/lib/qmllint-hook.sh b/pkgs/kde/lib/qmllint-hook.sh new file mode 100644 index 000000000000..e42dff126edc --- /dev/null +++ b/pkgs/kde/lib/qmllint-hook.sh @@ -0,0 +1,57 @@ +# shellcheck shell=bash +if [[ -z "${__nix_qmllintHook-}" ]]; then + __nix_qmllintHook=1 # Don't run this hook more than once. + + qmlHostPathSeen=() + qmlIncludeDirs=() + + qmlUnseenHostPath() { + for pkg in "${qmlHostPathSeen[@]}"; do + if [ "${pkg:?}" == "$1" ]; then + return 1 + fi + done + + qtHostPathSeen+=("$1") + return 0 + } + + qmlHostPathHook() { + qmlUnseenHostPath "$1" || return 0 + + if ! [ -v qtQmlPrefix ]; then + echo "qmlLintHook: qtQmlPrefix is unset. hint: add qt6.qtbase to buildInputs" + fi + + local qmlDir="$1/${qtQmlPrefix:?}" + if [ -d "$qmlDir" ]; then + qmlIncludeDirs+=("-I" "$qmlDir") + fi + } + addEnvHooks "$targetOffset" qmlHostPathHook + + doQmlLint() { + LANG=C.UTF-8 @qmllint@ --bare "${qmlIncludeDirs[@]}" -I "${out}/${qtQmlPrefix}" "$@" + } + + qmlLintCheck() { + echo "Running qmlLintCheck" + + # intentionally scoped to the default QML prefix, as things in $out/share etc + # can be used in random weird contexts and will cause spurious errors + if [ -d "$out/$qtQmlPrefix" ]; then + find "$out/$qtQmlPrefix" -name '*.qml' | while IFS= read -r i; do + if [ -n "$(doQmlLint "$i" --json - | @jq@ '.files[] | .warnings[] | select(.id == "import") | select(.message | startswith("Failed to import"))')" ]; then + echo "qmllint failed for file $i:" + + doQmlLint "$i" + exit 1 + fi + done + fi + } + + if [ -z "${dontQmlLint-}" ]; then + postInstallCheckHooks+=('qmlLintCheck') + fi +fi