From 5564662027e4f8d543f395c599ad7238a4393cce Mon Sep 17 00:00:00 2001 From: Fernando Date: Mon, 26 Jan 2026 14:51:20 +0100 Subject: [PATCH 1/3] Fix macOS app crash due to missing Qt frameworks The app was failing to launch with "Library not loaded: QtQuickWidgets.framework" because the deployment script only bundled 4 Qt frameworks but the app requires QtQuick/QML components for the Material Editor. Changes: - Add missing Qt frameworks: QtQuickWidgets, QtQuick, QtQml, QtQmlModels, QtQmlMeta, QtNetwork, QtOpenGL, QtQuickControls2, QtQuickDialogs2, QtQuickTemplates2, QtLabsPlatform, QtQmlCore, QtQmlWorkerScript - Copy QML plugins (QtQuick, QtQml, Qt labs) to PlugIns/qml directory - Create qt.conf to configure plugin paths within the app bundle - Update code signing to sign all bundled frameworks Co-Authored-By: Claude Opus 4.5 --- .github/workflows/deploy.yml | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c7d5239..5045a87 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1155,10 +1155,29 @@ jobs: sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtCore.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtGui.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtDBus.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQuickWidgets.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQuick.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQml.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQmlModels.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQmlMeta.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtNetwork.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtOpenGL.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQuickControls2.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ || echo "QtQuickControls2 not found, continuing..." + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQuickDialogs2.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ || echo "QtQuickDialogs2 not found, continuing..." + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQuickTemplates2.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ || echo "QtQuickTemplates2 not found, continuing..." + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtLabsPlatform.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ || echo "QtLabsPlatform not found, continuing..." + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQmlCore.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ || echo "QtQmlCore not found, continuing..." + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/lib/QtQmlWorkerScript.framework ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/ || echo "QtQmlWorkerScript not found, continuing..." # Copy plugins to proper PlugIns directory sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/plugins/platforms/* ${{github.workspace}}/bin/QtMeshEditor.app/Contents/PlugIns/platforms/ - + + # Copy QML plugins for QtQuick components + sudo mkdir -p ${{github.workspace}}/bin/QtMeshEditor.app/Contents/PlugIns/qml + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/qml/QtQuick ${{github.workspace}}/bin/QtMeshEditor.app/Contents/PlugIns/qml/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/qml/QtQml ${{github.workspace}}/bin/QtMeshEditor.app/Contents/PlugIns/qml/ + sudo cp -R /Users/runner/work/QtMeshEditor/Qt/${{ env.QT_VERSION }}/$QT_ARCH_DIR/qml/Qt ${{github.workspace}}/bin/QtMeshEditor.app/Contents/PlugIns/qml/ || echo "Qt labs plugins not found, continuing..." + # Copy Assimp libraries to MacOS directory sudo cp -R /usr/local/lib/libassimp* ${{github.workspace}}/bin/QtMeshEditor.app/Contents/MacOS/ || echo "Assimp libraries not found, continuing..." @@ -1168,6 +1187,13 @@ jobs: sudo cp -R ${{github.workspace}}/bin/cfg ${{github.workspace}}/bin/QtMeshEditor.app/Contents/MacOS/cfg sudo cp -R ${{github.workspace}}/resources/icon.icns ${{github.workspace}}/bin/QtMeshEditor.app/Contents/MacOS/media sudo mkdir -p ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Resources + + # Create qt.conf to help Qt find plugins in the bundle + cat << 'EOF' | sudo tee ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Resources/qt.conf +[Paths] +Plugins = PlugIns +Qml2Imports = PlugIns/qml +EOF sudo cp -R ${{github.workspace}}/resources/icon.icns ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Resources sudo cp -R ${{github.workspace}}/bin/Info.plist ${{github.workspace}}/bin/QtMeshEditor.app/Contents/ @@ -1192,7 +1218,7 @@ jobs: # Sign Qt frameworks - try both versioned and direct paths echo "Signing Qt frameworks..." - for framework in QtCore QtGui QtWidgets QtDBus; do + for framework in QtCore QtGui QtWidgets QtDBus QtQuickWidgets QtQuick QtQml QtQmlModels QtQmlMeta QtNetwork QtOpenGL QtQuickControls2 QtQuickDialogs2 QtQuickTemplates2 QtLabsPlatform QtQmlCore QtQmlWorkerScript; do framework_path="${{github.workspace}}/bin/QtMeshEditor.app/Contents/Frameworks/${framework}.framework" if [ -d "$framework_path" ]; then echo "Processing $framework framework..." From 44e92d613b3c12f4f6534b326b1c2872293d5f2c Mon Sep 17 00:00:00 2001 From: Fernando Date: Mon, 26 Jan 2026 15:12:29 +0100 Subject: [PATCH 2/3] Fix YAML syntax error in deploy workflow Replace heredoc with echo command to avoid YAML indentation issues. Co-Authored-By: Claude Opus 4.5 --- .github/workflows/deploy.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5045a87..370e402 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1189,11 +1189,7 @@ jobs: sudo mkdir -p ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Resources # Create qt.conf to help Qt find plugins in the bundle - cat << 'EOF' | sudo tee ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Resources/qt.conf -[Paths] -Plugins = PlugIns -Qml2Imports = PlugIns/qml -EOF + echo -e "[Paths]\nPlugins = PlugIns\nQml2Imports = PlugIns/qml" | sudo tee ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Resources/qt.conf sudo cp -R ${{github.workspace}}/resources/icon.icns ${{github.workspace}}/bin/QtMeshEditor.app/Contents/Resources sudo cp -R ${{github.workspace}}/bin/Info.plist ${{github.workspace}}/bin/QtMeshEditor.app/Contents/ From 65e3f4cbf944e689ec8e0a9cacce3fb68d1f4e41 Mon Sep 17 00:00:00 2001 From: Fernando Date: Mon, 26 Jan 2026 15:57:02 +0100 Subject: [PATCH 3/3] Fix unit tests: migrate from deprecated SonarSource action The sonarcloud-github-c-cpp action has been removed by SonarSource. Migrate to the new sonarqube-scan-action: - Use install-build-wrapper@v4 sub-action for build wrapper - Install sonar-scanner via npm - Update build-wrapper path (now added to PATH automatically) Co-Authored-By: Claude Opus 4.5 --- .github/workflows/deploy.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 370e402..c0c2ff1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -594,8 +594,14 @@ jobs: /usr/local/lib/pkgconfig/ key: ${{ runner.os }}-build-${{ env.cache-name }} - - name: Install sonar-scanner and build-wrapper - uses: SonarSource/sonarcloud-github-c-cpp@v2 + - name: Install Build Wrapper + uses: SonarSource/sonarqube-scan-action/install-build-wrapper@v4 + env: + SONAR_HOST_URL: https://sonarcloud.io + + - name: Install sonar-scanner + run: | + npm install -g sonar-scanner - name: Configure CMake for Tests run: | @@ -620,7 +626,7 @@ jobs: make -C build clean 2>/dev/null || echo "No previous build to clean" # Run build-wrapper to capture compilation - ./.sonar/build-wrapper-linux-x86/build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} make -C build -j$(nproc) + build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} make -C build -j$(nproc) echo "=== Build wrapper completed ===" ls -la ${{ env.BUILD_WRAPPER_OUT_DIR }} || echo "Build wrapper output directory not created"