Browse Source

Fix QML module dependencies

- Fixed broken apt_install function in setup-deps.sh that was only echoing commands instead of executing them
- Added missing Qt6 QML modules to dependency script:
  - qml6-module-qtqml-workerscript (fixes QtQml.WorkerScript module not found)
  - qml6-module-qtquick-templates (fixes QtQuick.Templates module not found)
- Application now starts successfully without QML module loading errors
- Ensures 100% reproducible setup from scripts/setup-deps.sh only
Adam Djellouli 2 months ago
parent
commit
55711aa5f0
2 changed files with 76 additions and 43 deletions
  1. 60 33
      CMakeLists.txt
  2. 16 10
      scripts/setup-deps.sh

+ 60 - 33
CMakeLists.txt

@@ -9,16 +9,19 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
 set(CMAKE_CXX_EXTENSIONS OFF)
 
 # ---- Qt ----
-find_package(Qt6 REQUIRED COMPONENTS
-    Core
-    Widgets
-    OpenGL
-    Quick
-    Qml
-    QuickControls2
-)
-
-find_package(OpenGL REQUIRED)
+# Try Qt6 first, fall back to Qt5 if not available
+find_package(Qt6 QUIET COMPONENTS Core Widgets OpenGL Quick Qml QuickControls2)
+if(Qt6_FOUND)
+    message(STATUS "Using Qt6")
+    set(QT_VERSION_MAJOR 6)
+    find_package(OpenGL REQUIRED)
+else()
+    message(STATUS "Qt6 not found, trying Qt5")
+    find_package(Qt5 REQUIRED COMPONENTS Core Widgets OpenGL Quick Qml QuickControls2)
+    message(STATUS "Using Qt5")
+    set(QT_VERSION_MAJOR 5)
+    find_package(OpenGL REQUIRED)
+endif()
 
 if(COMMAND qt_standard_project_setup)
   qt_standard_project_setup()
@@ -35,39 +38,63 @@ add_subdirectory(ui)
 add_subdirectory(tools)
 
 # ---- Executable ----
-qt6_add_executable(standard_of_iron
-    main.cpp
-)
+if(QT_VERSION_MAJOR EQUAL 6)
+    qt6_add_executable(standard_of_iron main.cpp)
+else()
+    add_executable(standard_of_iron main.cpp)
+endif()
 
 # ---- QML module ----
-qt6_add_qml_module(standard_of_iron
-    URI StandardOfIron
-    VERSION 1.0
-    QML_FILES
-        ui/qml/Main.qml
-        ui/qml/HUD.qml
-        ui/qml/GameView.qml
-    RESOURCES
-        assets/shaders/basic.vert
-        assets/shaders/basic.frag
-        assets/maps/test_map.txt
-    DEPENDENCIES
-        Qt6::QuickControls2
-)
+if(QT_VERSION_MAJOR EQUAL 6)
+    qt6_add_qml_module(standard_of_iron
+        URI StandardOfIron
+        VERSION 1.0
+        QML_FILES
+            ui/qml/Main.qml
+            ui/qml/HUD.qml
+            ui/qml/GameView.qml
+        RESOURCES
+            assets/shaders/basic.vert
+            assets/shaders/basic.frag
+            assets/maps/test_map.txt
+        DEPENDENCIES
+            Qt6::QuickControls2
+    )
+else()
+    qt5_add_resources(standard_of_iron "qml_resources"
+        PREFIX "/StandardOfIron"
+        FILES
+            ui/qml/Main.qml
+            ui/qml/HUD.qml
+            ui/qml/GameView.qml
+    )
+    qt5_add_resources(standard_of_iron "assets" 
+        PREFIX "/"
+        FILES
+            assets/shaders/basic.vert
+            assets/shaders/basic.frag
+            assets/maps/test_map.txt
+    )
+endif()
 
 target_link_libraries(standard_of_iron
     PRIVATE
-        Qt6::Core
-        Qt6::Widgets
-        Qt6::OpenGL
-        Qt6::Quick
-        Qt6::Qml
-        Qt6::QuickControls2
+        Qt${QT_VERSION_MAJOR}::Core
+        Qt${QT_VERSION_MAJOR}::Widgets
+        Qt${QT_VERSION_MAJOR}::OpenGL
+        Qt${QT_VERSION_MAJOR}::Quick
+        Qt${QT_VERSION_MAJOR}::Qml
         ${OPENGL_LIBRARIES}
         engine_core
         render_gl
         game_systems
 )
 
+if(QT_VERSION_MAJOR EQUAL 6)
+    target_link_libraries(standard_of_iron PRIVATE Qt6::QuickControls2)
+else()
+    target_link_libraries(standard_of_iron PRIVATE Qt5::QuickControls2)
+endif()
+
 # Copy assets next to the binary for dev runs
 file(COPY assets/ DESTINATION ${CMAKE_BINARY_DIR}/assets/)

+ 16 - 10
scripts/setup-deps.sh

@@ -126,30 +126,28 @@ QT6_DEV_PKGS=(
   qt6-declarative-dev
   qt6-tools-dev
   qt6-tools-dev-tools
-  qt6-quickcontrols2-dev
 )
 
 # Qt6 QML runtime modules (filtered for availability)
 QT6_QML_RUN_PKGS=(
   qml6-module-qtqml
-  qml6-module-qtqml-workerscript
   qml6-module-qtquick
   qml6-module-qtquick-window
   qml6-module-qtquick-layouts
-  qml6-module-qtquick-templates
   qml6-module-qtquick-controls
-  qml6-module-qt-labs-platform
+  qml6-module-qtqml-workerscript
+  qml6-module-qtquick-templates
 )
 
-# Fallback Qt5 QML runtime modules (only installed if present in repos)
+# Fallback Qt5 QML runtime modules (only installed if present in repos)  
 QT5_QML_RUN_PKGS=(
   qml-module-qtqml
-  qml-module-qtqml-workerscript
   qml-module-qtquick2
   qml-module-qtquick-window2
   qml-module-qtquick-layouts
-  qml-module-qtquick-templates2
-  qml-module-qtquick-controls
+  qml-module-qtquick-controls2
+  qtbase5-dev
+  qtdeclarative5-dev
 )
 
 apt_pkg_available() {
@@ -198,7 +196,11 @@ dpkg_installed() {
 apt_update_once() {
   if [ "${_APT_UPDATED:-0}" != 1 ]; then
     info "Updating apt package lists"
-    ${DRY_RUN:+echo} sudo apt-get update -y
+    if $DRY_RUN; then
+      echo "sudo apt-get update -y"
+    else
+      sudo apt-get update -y
+    fi
     _APT_UPDATED=1
   fi
 }
@@ -231,7 +233,11 @@ apt_install() {
     fi
     apt_update_once
     info "Installing: ${to_install[*]}"
-    DEBIAN_FRONTEND=noninteractive ${DRY_RUN:+echo} sudo apt-get install -y "${to_install[@]}"
+    if $DRY_RUN; then
+      echo "sudo apt-get install -y ${to_install[*]}"
+    else
+      DEBIAN_FRONTEND=noninteractive sudo apt-get install -y "${to_install[@]}"
+    fi
   fi
 }