瀏覽代碼

Add support for a wayland variant of Qt for Linux (#266)

- Remove unnecessary wrapper scripts build-linux-aarch64.sh and build-linux-x86.sh
- Update docker_build_qt_linux.sh to support the environment option 'ENABLE_QT_WAYLAND' which is set in the Dockerfile
- Update docker_build_qt_linux.sh to support building the additional qtwayland package from source
---------

Signed-off-by: Steve Pham <[email protected]>
Co-authored-by: Mike Chang <[email protected]>
Steve Pham 1 周之前
父節點
當前提交
2c3e193cb6

+ 18 - 1
.github/workflows/build-container.yaml

@@ -28,7 +28,7 @@ jobs:
           env: |
             GITHUB_WORKFLOW: ${{ github.workflow }} # Sets the docker image to the name of the workflow
           arch: aarch64
-          distro: ubuntu20.04
+          distro: ubuntu22.04
           githubToken: ${{ github.token }}
           shell: /bin/bash
           install: |
@@ -61,6 +61,22 @@ jobs:
               && rm /tmp/cmake-install.sh \
               && ln -s /opt/cmake-${CMAKE_VER}/bin/* /usr/local/bin
             rm -rf /var/lib/apt/lists/*
+            # Add Docker's official GPG key:
+            apt-get update
+            sudo apt-get install ca-certificates curl
+            sudo install -m 0755 -d /etc/apt/keyrings
+            sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
+            sudo chmod a+r /etc/apt/keyrings/docker.asc
+            # Add the repository to Apt sources:
+            echo \
+              "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
+              $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
+               tee /etc/apt/sources.list.d/docker.list > /dev/null
+            apt-get update
+            apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
+            apt-get install -y qemu-user-static binfmt-support
+            update-binfmts --install qemu-aarch64 /usr/bin/qemu-aarch64-static --magic '\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'
+
           run: |
             lsb_release -a
             uname -a
@@ -71,3 +87,4 @@ jobs:
             cmake --version
             git --version
             python3 --version
+            docker --version

+ 0 - 5
.github/workflows/build-package.yaml

@@ -259,11 +259,6 @@ jobs:
         restore-keys:
           ${{ matrix.package }}-${{ matrix.os }}  
 
-    - name: Set up QEMU (aarch64) # Only if the package folder contains a Dockerfile
-      if: ${{ (contains(matrix.package, 'aarch64')) && (matrix.dockerfile == '1') }}
-      run: |
-        sudo apt-get install -y qemu qemu-user-static
-
     - name: Run build command
       env:
         CMAKE_CXX_COMPILER_LAUNCHER: sccache

+ 1 - 1
Scripts/extras/pull_and_build_from_git.py

@@ -940,7 +940,7 @@ class BuildInfo(object):
 
         return False
 
-    def copy_file_or_directory(self, src: pathlib.Path, dst: pathlib.Path, ignore_patterns: list[str]):
+    def copy_file_or_directory(self, src: pathlib.Path, dst: pathlib.Path, ignore_patterns):
         """
         if @src is a directory, makes a deep copy of it into @dst. In this case @ignore_patterns is used.
         if @src is a file, copies it as @dst, and will create all intermediate directories in @dst as needed.

+ 38 - 5
package-system/Qt/Dockerfile

@@ -8,12 +8,35 @@
 # This docker file uses ubuntu 20.04 as the base image to install the dependencies to build Qt from source
 #
 
-FROM public.ecr.aws/ubuntu/ubuntu:20.04_stable
- 
-WORKDIR /data/workspace
+# The cpu architecture to base the docker base script from
+ARG INPUT_ARCHITECTURE=amd64
+
+# The root to base the docker script base from
+ARG INPUT_IMAGE=ubuntu:20.04
+
+# The build subfolder where the final artifacts are built in this container which will be used to copy the results out of
+ARG INPUT_BUILD_FOLDER=build
+
+# The name of the build script to copy to the docker image to execute
+ARG INPUT_DOCKER_BUILD_SCRIPT=build.sh
+
+# The optional environment variable for list of folders in the mapped temp folders that represent additional 3P dependent packages
+ARG INPUT_DEPENDENT_PACKAGE_FOLDERS
+
+FROM ${INPUT_ARCHITECTURE}/${INPUT_IMAGE}
+
+ARG INPUT_DOCKER_BUILD_SCRIPT
+ARG INPUT_BUILD_FOLDER
+ARG INPUT_DEPENDENT_PACKAGE_FOLDERS
+
+ENV WORKSPACE=/data/workspace
+ENV DOCKER_BUILD_PATH=$WORKSPACE/$INPUT_BUILD_FOLDER
+ENV DOWNLOADED_PACKAGE_FOLDERS=$INPUT_DEPENDENT_PACKAGE_FOLDERS
+
+WORKDIR $WORKSPACE
 
 # Initilize apt cache
-RUN apt-get clean && apt-get update
+RUN DEBIAN_FRONTEND="noninteractive" apt-get update
 
 # Setup time zone and locale data (necessary for SSL and HTTPS packages)
 RUN DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata locales keyboard-configuration
@@ -23,6 +46,7 @@ RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
     update-locale LANG=en_US.UTF-8
 
 ENV LANG=en_US.UTF-8
+ENV ENABLE_QT_WAYLAND=0
 
 # Install the development packages needed to build Qt from source
 RUN apt-get install -y qtbase5-dev \ 
@@ -40,10 +64,19 @@ RUN apt-get install -y qtbase5-dev \
                        libgbm-dev \
                        libxext-dev \
                        libfontconfig1-dev \ 
-                       libtiff-dev
+                       libtiff-dev \
+                       libwayland-dev \
+                       libwayland-egl1-mesa \
+                       libwayland-server0 \
+                       libgles2-mesa-dev \
+                       libdrm-dev
 
 # Prepare a target folder within the container to install the build artifacts tp
 RUN mkdir -p /data/workspace/qt
 
+RUN git clone --single-branch --recursive --branch v5.15.1 git://code.qt.io/qt/qtwayland.git && \
+    ln -s /data/workspace/qtwayland/include/QtWaylandCompositor/5.15.1/QtWaylandCompositor/private/qwayland-server-qt-texture-sharing-unstable-v1.h /data/workspace/qtwayland/src/compositor/qwayland-server-qt-texture-sharing-unstable-v1.h && \
+    ln -s /data/workspace/qtwayland/include/QtWaylandCompositor/5.15.1/QtWaylandCompositor/private/wayland-qt-texture-sharing-unstable-v1-server-protocol.h /data/workspace/qtwayland/src/compositor/wayland-qt-texture-sharing-unstable-v1-server-protocol.h
+
 # Copy the build script specific to this Docker script in order to execute the build
 COPY docker_build_qt_linux.sh /data/workspace/

+ 288 - 0
package-system/Qt/FindQt.cmake.wayland

@@ -0,0 +1,288 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+if(TARGET 3rdParty::Qt::Core) # Check we are not called multiple times
+    return()
+endif()
+
+set(QT_PACKAGE_NAME qt)
+
+set(QT_PATH "${CMAKE_CURRENT_LIST_DIR}/qt-wayland" CACHE STRING "The root path to Qt" FORCE)
+mark_as_advanced(QT_PATH)
+if(NOT EXISTS ${QT_PATH})
+    message(FATAL_ERROR "Cannot find 3rdParty library ${QT_PACKAGE_NAME} on path ${QT_PATH}")
+endif()
+
+# Force-set QtCore's version here to ensure CMake detects Qt's existence and allows AUTOMOC to work
+set(Qt5Core_VERSION_MAJOR "5" CACHE STRING "Qt's major version" FORCE)
+set(Qt5Core_VERSION_MINOR "15" CACHE STRING "Qt's minor version" FORCE)
+set(Qt5Core_VERSION_PATCH "2" CACHE STRING "Qt's patch version" FORCE)
+mark_as_advanced(Qt5Core_VERSION_MAJOR)
+mark_as_advanced(Qt5Core_VERSION_MINOR)
+mark_as_advanced(Qt5Core_VERSION_PATCH)
+
+set(QT5_COMPONENTS
+    Core
+    Concurrent
+    Gui
+    LinguistTools
+    Network
+    OpenGL
+    Svg
+    Test
+    Widgets
+    Xml
+)
+
+include(${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}/Qt_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
+
+list(APPEND CMAKE_PREFIX_PATH ${QT_LIB_PATH}/cmake/Qt5)
+
+# Clear the cache for found DIRs
+unset(Qt5_DIR CACHE)
+foreach(component ${QT5_COMPONENTS})
+    unset(Qt5${component}_DIR CACHE)
+endforeach()
+unset(Qt5Positioning_DIR CACHE)
+unset(Qt5PrintSupport_DIR CACHE)
+unset(Qt5Qml_DIR CACHE)
+unset(Qt5QmlModels_DIR CACHE)
+unset(Qt5Quick_DIR CACHE)
+
+# Populate the Qt5 configurations
+find_package(Qt5
+    COMPONENTS ${QT5_COMPONENTS}
+    REQUIRED
+    NO_CMAKE_PACKAGE_REGISTRY 
+)
+
+# Now create libraries that wrap the dependency so we can refer to them in our format
+foreach(component ${QT5_COMPONENTS})
+    if(TARGET Qt5::${component})
+
+        # Convert the includes to system includes
+        get_target_property(system_includes Qt5::${component} INTERFACE_INCLUDE_DIRECTORIES)
+        set_target_properties(Qt5::${component} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "") # Clear it in case someone refers to it
+        ly_target_include_system_directories(TARGET Qt5::${component}
+            INTERFACE ${system_includes}
+        )
+
+        # Alias the target with our prefix
+        add_library(3rdParty::Qt::${component} ALIAS Qt5::${component})
+        mark_as_advanced(Qt5${component}_DIR) # Hiding from GUI
+
+        # Qt only has debug and release, we map the configurations we use in o3de. We map all the configurations 
+        # except debug to release
+        foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES)
+            string(TOUPPER ${conf} UCONF)
+            ly_qt_configuration_mapping(${UCONF} MAPPED_CONF)
+            set_target_properties(Qt5::${component} PROPERTIES
+                MAP_IMPORTED_CONFIG_${UCONF} ${MAPPED_CONF}
+            )
+        endforeach()
+
+    endif()
+endforeach()
+
+# Some extra DIR variables we want to hide from GUI
+mark_as_advanced(Qt5_DIR) # Hiding from GUI
+mark_as_advanced(Qt5LinguistTools_DIR) # Hiding from GUI, this variable comes from the LinguistTools module
+mark_as_advanced(Qt5Positioning_DIR)
+mark_as_advanced(Qt5PrintSupport_DIR)
+mark_as_advanced(Qt5Qml_DIR)
+mark_as_advanced(Qt5QmlModels_DIR)
+mark_as_advanced(Qt5Quick_DIR)
+
+# Special case for Qt::Gui, we are using the private headers...
+ly_target_include_system_directories(TARGET Qt5::Gui
+   INTERFACE "${Qt5Gui_PRIVATE_INCLUDE_DIRS}"
+)
+
+# Another special case: Qt:Widgets, we are also using private headers
+ly_target_include_system_directories(TARGET Qt5::Widgets
+    INTERFACE "${Qt5Widgets_PRIVATE_INCLUDE_DIRS}"
+)
+
+# Qt plugins/translations/aux files. 
+# We create libraries that wraps them so they get deployed properly.
+# This used to be deployed through winqtdeploy/macqtdeploy, however, those tools
+# are old and unmaintaned, macqtdeploy takes long times to run
+add_library(3rdParty::Qt::Core::Translations INTERFACE IMPORTED GLOBAL)
+file(GLOB tranlation_files ${QT_PATH}/translations/qt_*.qm)
+if(tranlation_files)
+    ly_add_target_files(TARGETS 3rdParty::Qt::Core::Translations
+        FILES ${tranlation_files}
+        OUTPUT_SUBDIRECTORY translations
+    )
+endif()
+ly_add_dependencies(Qt5::Core 3rdParty::Qt::Core::Translations)
+
+# plugins, each platform will define the files it has and the OUTPUT_SUBDIRECTORY
+set(QT_PLUGINS
+    Network
+    Gui
+    Widgets
+)
+foreach(plugin ${QT_PLUGINS})
+    add_library(3rdParty::Qt::${plugin}::Plugins INTERFACE IMPORTED GLOBAL)
+    ly_add_dependencies(Qt5::${plugin} 3rdParty::Qt::${plugin}::Plugins)
+endforeach()
+include(${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}/QtPlugin_${PAL_PLATFORM_NAME_LOWERCASE}.cmake)
+
+# UIC executable
+unset(QT_UIC_EXECUTABLE CACHE)
+find_program(QT_UIC_EXECUTABLE uic HINTS "${QT_PATH}/bin")
+mark_as_advanced(QT_UIC_EXECUTABLE) # Hiding from GUI
+
+# RCC executable
+unset(AUTORCC_EXECUTABLE CACHE)
+find_program(AUTORCC_EXECUTABLE rcc HINTS "${QT_PATH}/bin")
+mark_as_advanced(AUTORCC_EXECUTABLE) # Hiding from GUI
+set(Qt5Core_RCC_EXECUTABLE "${AUTORCC_EXECUTABLE}" CACHE FILEPATH "Qt's resource compiler, used by qt5_add_resources" FORCE)
+mark_as_advanced(Qt5Core_RCC_EXECUTABLE) # Hiding from GUI
+
+# LRELEASE executable
+unset(QT_LRELEASE_EXECUTABLE CACHE)
+find_program(QT_LRELEASE_EXECUTABLE lrelease HINTS "${QT_PATH}/bin")
+mark_as_advanced(QT_LRELEASE_EXECUTABLE) # Hiding from GUI
+if(NOT QT_LRELEASE_EXECUTABLE)
+    message(FATAL_ERROR "Qt's lrelease executbale not found")
+endif()
+set(Qt5_LRELEASE_EXECUTABLE "${QT_LRELEASE_EXECUTABLE}" CACHE FILEPATH "Qt's lrelease executable, used by qt5_add_translation" FORCE)
+mark_as_advanced(Qt5_LRELEASE_EXECUTABLE) # Hiding from GUI
+
+#! ly_qt_uic_target: handles qt's ui files by injecting uic generation
+#
+# AUTOUIC has issues to detect changes in UIC files and trigger regeneration:
+# https://gitlab.kitware.com/cmake/cmake/-/issues/18741
+# So instead, we are going to manually wrap the files. We dont use qt5_wrap_ui because
+# it outputs to ${CMAKE_CURRENT_BINARY_DIR}/ui_${outfile}.h and we want to follow the
+# same folder structure that AUTOUIC uses
+#
+function(ly_qt_uic_target TARGET)
+    
+    get_target_property(all_ui_sources ${TARGET} SOURCES)
+    list(FILTER all_ui_sources INCLUDE REGEX "^.*\\.ui$")
+    if(NOT all_ui_sources)
+        message(FATAL_ERROR "Target ${TARGET} contains AUTOUIC but doesnt have any .ui file")
+    endif()
+    
+    if(AUTOGEN_BUILD_DIR)
+        set(gen_dir ${AUTOGEN_BUILD_DIR})
+    else()
+        set(gen_dir ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_autogen/include)
+    endif()
+
+    foreach(ui_source ${all_ui_sources})
+        
+        get_filename_component(filename ${ui_source} NAME_WE)
+        get_filename_component(dir ${ui_source} DIRECTORY)
+        if(IS_ABSOLUTE ${dir})
+            file(RELATIVE_PATH dir ${CMAKE_CURRENT_SOURCE_DIR} ${dir})
+        endif()
+
+        set(outfolder ${gen_dir}/${dir})
+        set(outfile ${outfolder}/ui_${filename}.h)
+        get_filename_component(infile ${ui_source} ABSOLUTE)
+
+        file(MAKE_DIRECTORY ${outfolder})
+        add_custom_command(OUTPUT ${outfile}
+          COMMAND ${QT_UIC_EXECUTABLE} -o ${outfile} ${infile}
+          MAIN_DEPENDENCY ${infile} VERBATIM
+          COMMENT "UIC ${infile}"
+        )
+
+        set_source_files_properties(${infile} PROPERTIES SKIP_AUTOUIC TRUE)
+        set_source_files_properties(${outfile} PROPERTIES 
+            SKIP_AUTOMOC TRUE
+            SKIP_AUTOUIC TRUE
+            GENERATED TRUE
+        )
+        list(APPEND all_ui_wrapped_sources ${outfile})
+
+    endforeach()
+
+    # Add files to the target
+    target_sources(${TARGET} PRIVATE ${all_ui_wrapped_sources})
+    source_group("Generated Files" FILES ${all_ui_wrapped_sources})
+
+    # Add include directories relative to the generated folder
+    # query for the property first to avoid the "NOTFOUND" in a list
+    get_property(has_includes TARGET ${TARGET} PROPERTY INCLUDE_DIRECTORIES SET)
+    if(has_includes)
+        get_property(all_include_directories TARGET ${TARGET} PROPERTY INCLUDE_DIRECTORIES)
+        foreach(dir ${all_include_directories})
+            if(IS_ABSOLUTE ${dir})
+                file(RELATIVE_PATH dir ${CMAKE_CURRENT_SOURCE_DIR} ${dir})
+            endif()
+            list(APPEND new_includes ${gen_dir}/${dir})
+        endforeach()
+    endif()
+    list(APPEND new_includes ${gen_dir})
+    target_include_directories(${TARGET} PRIVATE ${new_includes})
+
+endfunction()
+
+#! ly_add_translations: adds translations (ts) to a target.
+#
+# This wrapper will generate a qrc file with those translations and add the files under "prefix" and add them to
+# the indicated targets. These files will be added under the "Generated Files" filter
+#
+# \arg:TARGETS name of the targets that the translations will be added to
+# \arg:PREFIX prefix where the translation will be located within the qrc file
+# \arg:FILES translation files to add
+#
+function(ly_add_translations)
+
+    set(options)
+    set(oneValueArgs PREFIX)
+    set(multiValueArgs TARGETS FILES)
+
+    cmake_parse_arguments(ly_add_translations "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+    # Validate input arguments
+    if(NOT ly_add_translations_TARGETS)
+        message(FATAL_ERROR "You must provide at least one target")
+    endif()
+    if(NOT ly_add_translations_FILES)
+        message(FATAL_ERROR "You must provide at least a translation file")
+    endif()
+
+    qt5_add_translation(TRANSLATED_FILES ${ly_add_translations_FILES})
+
+    set(qrc_file_contents 
+"<RCC>
+    <qresource prefix=\"/${ly_add_translations_PREFIX}\">
+")
+    foreach(file ${TRANSLATED_FILES})
+        get_filename_component(filename ${file} NAME)
+        string(APPEND qrc_file_contents "        <file>${filename}</file>
+")
+    endforeach()
+    string(APPEND qrc_file_contents "    </qresource>
+</RCC>
+")
+    set(qrc_file_path ${CMAKE_CURRENT_BINARY_DIR}/i18n_${ly_add_translations_PREFIX}.qrc)
+    file(WRITE 
+        ${qrc_file_path}
+        ${qrc_file_contents}
+    )
+    set_source_files_properties(
+            ${TRANSLATED_FILES}
+            ${qrc_file_path}
+        PROPERTIES 
+            GENERATED TRUE
+            SKIP_AUTORCC TRUE
+    )
+    qt5_add_resources(RESOURCE_FILE ${qrc_file_path})
+
+    foreach(target ${ly_add_translations_TARGETS})
+        target_sources(${target} PRIVATE "${TRANSLATED_FILES};${qrc_file_path};${RESOURCE_FILE}")
+    endforeach()
+
+endfunction()

+ 89 - 0
package-system/Qt/README.md

@@ -0,0 +1,89 @@
+# QT O3DE 3rd Party Package
+
+
+
+
+## Prerequisites
+
+1. **Python 3.10+** or higher installed
+1. Python package `boto3`
+1. [3p-package-scripts](https://github.com/o3de/3p-package-scripts) cloned locally at the same directory level as the local [3p-package-source](https://github.com/o3de/3p-package-source)
+
+
+## Updating
+
+When creating updates to the package, the rev number needs to be bumped as a minimum in order to represent a new package. If a new version of Qt is being used as the base source code, then the full version number needs to be updated. 
+
+In `build_config.json`, the following lines control the git url and tag/commit that is used to pull the source code from. 
+```
+    "git_url": "https://github.com/o3de/qt5.git",
+    "git_tag": "5.15.1-o3de",
+    "git_commit": "b3a1a6947422928e8aecb14ad607199e9720d266",
+```
+
+To control the version and rev of the package, the entry for `package_version` is used. For Qt, the package versioning is specific to the target platform, so this key resides inside each target platform's definition block. 
+
+```
+        "Windows": {
+            "Windows": {
+                "package_version": "5.15.2-rev7",
+                ...
+            }
+        },
+        "Darwin": {
+            "Mac": {
+                ...
+                "package_version": "5.15.2-rev8",
+                ...
+            }
+        },
+        "Linux": {
+            "Linux": {
+                "package_version": "5.15.2-rev10",
+                ...
+            },
+	        "Linux-aarch64": {
+                "package_version": "5.15.2-rev10",
+                ...
+            }
+        }
+```
+The package version controls path and filename of the target package. The target file name will be built following the pattern of qt-${package_version}-${platform_lower} where `platform_lower` will be one of the following depending on the target platform/architecture:
+
+1. windows
+1. linux
+1. linux-aarch64
+1. mac
+
+Then, depending on the platform, the package manifest file needs to be updated with this new folder name. Each manifest file is specific to the HOST platform that the package is being built on. (In the case of Linux, if the architecture is aarch64, then the package manifest file has an additional `-aarch64` suffix to the name). 
+
+The values in the corresponding `build_from_source` and `build_from_folder` needs to be updated to reflect the new name of the package if changed.
+
+## Building 
+
+The following build command line examples are based on the current values of the package names by platform. If a new version is being being built, update the command lines below as needed.
+
+### Windows
+
+```
+python ..\3p-package-scripts\o3de_package_scripts\build_package.py --search_path . qt-5.15.2-rev10-windows
+```
+
+## Linux
+
+### amd64
+```
+python3 ../3p-package-scripts/o3de_package_scripts/build_package.py --search_path . qt-5.15.2-rev10-linux
+```
+
+### aarch64
+```
+python3 ../3p-package-scripts/o3de_package_scripts/build_package.py --search_path . qt-5.15.2-rev10-linux-aarch64
+```
+
+## Mac
+
+```
+python3 ../3p-package-scripts/o3de_package_scripts/build_package.py --search_path . qt-5.15.2-rev8-mac
+
+```

+ 0 - 18
package-system/Qt/build-linux-aarch64.sh

@@ -1,18 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright (c) Contributors to the Open 3D Engine Project.
-# For complete copyright and license terms please see the LICENSE at the root of this distribution.
-#
-# SPDX-License-Identifier: Apache-2.0 OR MIT
-#
-
-# TEMP_FOLDER and TARGET_INSTALL_ROOT get set from the pull_and_build_from_git.py script
-
-TIFF_PACKAGE=tiff-4.2.0.15-rev3-linux-aarch64
-ZLIB_PACKAGE=zlib-1.2.11-rev5-linux-aarch64
-OPENSSL_PACKAGE=OpenSSL-1.1.1t-rev1-linux-aarch64
-
-./build-linux.sh $TIFF_PACKAGE $ZLIB_PACKAGE $OPENSSL_PACKAGE
-
-exit $?

+ 0 - 18
package-system/Qt/build-linux-x86.sh

@@ -1,18 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright (c) Contributors to the Open 3D Engine Project.
-# For complete copyright and license terms please see the LICENSE at the root of this distribution.
-#
-# SPDX-License-Identifier: Apache-2.0 OR MIT
-#
-
-# TEMP_FOLDER and TARGET_INSTALL_ROOT get set from the pull_and_build_from_git.py script
-
-TIFF_PACKAGE=tiff-4.2.0.15-rev3-linux
-ZLIB_PACKAGE=zlib-1.2.11-rev5-linux
-OPENSSL_PACKAGE=OpenSSL-1.1.1t-rev1-linux
-
-./build-linux.sh $TIFF_PACKAGE $ZLIB_PACKAGE $OPENSSL_PACKAGE
-
-exit $?

+ 104 - 8
package-system/Qt/build-linux.sh

@@ -18,7 +18,15 @@ ZLIB_FOLDER_NAME=$2
 # Arg 3: The openssl package name
 OPENSSL_FOLDER_NAME=$3
 
+# Determine the host architecture
+CURRENT_HOST_ARCH=$(uname -m)
+
+# Use the host architecture if not supplied
+TARGET_ARCH=${4:-$(uname -m)}
+
+#
 # Make sure docker is installed
+#
 DOCKER_VERSION=$(docker --version)
 if [ $? -ne 0 ]
 then
@@ -28,18 +36,106 @@ then
 fi
 echo "Detected Docker Version $DOCKER_VERSION"
 
+# 
+# Check the target architecture and determine if the necessary cross compilation requirements are met
+#
+
+# If the host and target architecture does not match, make sure the necessary cross compilation packages are installed
+if [ "${CURRENT_HOST_ARCH}" != ${TARGET_ARCH} ]
+then
+    echo "Checking cross compiling requirements."
+    for package_check in docker-ce binfmt-support qemu-user-static
+    do
+        echo "Checking package $package_check"
+        dpkg -s $package_check > /dev/null 2>&1
+        if [ $? -ne 0 ]
+        then
+            echo ""
+            echo "Missing package $package_check. Make sure to install it with your local package manager." 
+            echo ""
+            exit 1
+        fi
+    done
+
+    # Only cross compilation of an ARM64 image on an x86_64 host is supported
+    if [ "${TARGET_ARCH}" = "aarch64" ]
+    then
+        # Make sure qemu-aarch64 is installed properly
+        QEMU_AARCH_COUNT=$(update-binfmts --display | grep qemu-aarch64 | wc -l)
+        if [ $QEMU_AARCH_COUNT -eq 0 ]
+        then
+            echo ""
+            echo "QEMU aarch64 binary format not registered."
+            echo "Run the following command to register"
+            echo ""
+            echo "sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes"
+            echo ""
+            exit 1
+        fi
+        echo ""
+        echo "Cross compiling aarch64 on an amd64 machine validated."
+        echo ""
+    fi
+else
+    echo "Building ${TARGET_ARCH} natively."
+fi
+
+# Setup the docker arguments 
+if [ "${TARGET_ARCH}" = "x86_64" ]
+then
+    echo "Processing Docker for amd64"
+
+    DOCKER_INPUT_ARCHITECTURE=amd64
+    TARGET_DOCKER_PLATFORM_ARG=linux/amd64
+
+elif [ "${TARGET_ARCH}" = "aarch64" ] 
+then
+    echo "Processing Docker for aarch64"
+
+    DOCKER_INPUT_ARCHITECTURE=arm64v8
+    TARGET_DOCKER_PLATFORM_ARG=linux/arm64/v8
+
+else
+    echo "Unsupported architecture ${TARGET_ARCH}"
+    exit 1
+fi
+
+# 
+
 # Prepare the docker file and use the temp folder as the context root
 cp docker_build_qt_linux.sh temp/
 
-pushd temp
-
-# Build the Docker Image
-echo "Building the docker build script"
-DOCKER_IMAGE_NAME=qt_linux_3p
-docker build -f ../Dockerfile -t ${DOCKER_IMAGE_NAME}:latest . 
+DOCKERFILE=Dockerfile
+DOCKER_IMAGE_NAME_BASE=qt
+DOCKER_BUILD_SCRIPT=docker_build_qt_linux.sh
+DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME_BASE}_${DOCKER_INPUT_ARCHITECTURE}_3p
+UBUNTU_BASE=20.04
+
+
+echo "Executing docker-based build from the following arguments"
+echo "    DOCKER_IMAGE_NAME_BASE=${DOCKER_IMAGE_NAME_BASE}"
+echo "    UBUNTU_BASE=${UBUNTU_BASE}"
+echo "    DOCKER_BUILD_SCRIPT=${DOCKER_BUILD_SCRIPT}"
+echo "    TARGET_BUILD_FOLDER=${TARGET_BUILD_FOLDER}"
+echo "    TARGET_ARCH=${TARGET_ARCH}"
+echo "    DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME}"
+echo ""
+
+
+# Build the Docker Image 
+echo "Building the docker build script for ${DOCKER_IMAGE_NAME_BASE} on ${DOCKER_INPUT_ARCHITECTURE} for Ubuntu $1"
+echo ""
+CMD_DOCKER_BUILD="\
+docker build --build-arg INPUT_DOCKER_BUILD_SCRIPT=${DOCKER_BUILD_SCRIPT}\
+ --build-arg INPUT_ARCHITECTURE=${DOCKER_INPUT_ARCHITECTURE}\
+ --build-arg INPUT_IMAGE=ubuntu:${UBUNTU_BASE}\
+ --platform ${TARGET_DOCKER_PLATFORM_ARG}\
+ -f Dockerfile -t ${DOCKER_IMAGE_NAME}:latest temp"
+ echo ${CMD_DOCKER_BUILD}
+ eval ${CMD_DOCKER_BUILD}
 if [ $? -ne 0 ]
 then
-    echo "Error occurred creating Docker image ${DOCKER_IMAGE_NAME}:latest."
+    echo "Error occurred creating Docker image ${DOCKER_IMAGE_NAME}:latest." 
     exit 1
 fi
 
@@ -74,7 +170,7 @@ fi
 
 # Copy the build artifacts from the Docker Container
 echo "Copying the built contents from the docker container for image ${DOCKER_IMAGE_NAME}"
-docker cp $CONTAINER_ID:/data/workspace/qt/. $TARGET_INSTALL_ROOT
+docker cp --follow-link $CONTAINER_ID:/data/workspace/qt/. $TARGET_INSTALL_ROOT
 if [ $? -ne 0 ]
 then
     echo "Error occurred copying build artifacts from Docker image ${DOCKER_IMAGE_NAME}:latest."

+ 12 - 4
package-system/Qt/build_config.json

@@ -49,7 +49,7 @@
         },
         "Linux": {
             "Linux": {
-                "package_version": "5.15.2-rev9",
+                "package_version": "5.15.2-rev10",
                 "patch_file": "qt-linux.patch",
                 "depends_on_packages": [
                     ["OpenSSL-1.1.1t-rev1-linux", "63aea898b7afe8faccd0c7261e62d2f8b7b870f678a4520d5be81e5815542b39", ""],
@@ -57,14 +57,18 @@
                     ["zlib-1.2.11-rev5-linux", "9be5ea85722fc27a8645a9c8a812669d107c68e6baa2ca0740872eaeb6a8b0fc", ""]
                 ],
                 "custom_build_cmd": [
-                    "./build-linux-x86.sh"
+                    "./build-linux.sh",
+                    "tiff-4.2.0.15-rev3-linux",
+                    "zlib-1.2.11-rev5-linux",
+                    "OpenSSL-1.1.1t-rev1-linux",
+                    "x86_64"
                 ],
                 "custom_install_cmd": [
                     "{python}", "copy_platform_cmakes.py"
                 ]
             },
 	    "Linux-aarch64": {
-                "package_version": "5.15.2-rev9",
+                "package_version": "5.15.2-rev10",
                 "patch_file": "qt-linux.patch",
                 "depends_on_packages": [
                     ["OpenSSL-1.1.1t-rev1-linux-aarch64", "f32721bec9c82d1bd7fb244d78d5dc4e2a47e7b808bb36027236ad377e241ea5", ""],
@@ -72,7 +76,11 @@
                     ["zlib-1.2.11-rev5-linux-aarch64", "ce9d1ed2883d77ffc69c7982c078595c1f89ca55ec19d89fe7e6beb05f774775", ""]
                 ],
                 "custom_build_cmd": [
-                    "./build-linux-aarch64.sh"
+                    "./build-linux.sh",
+                    "tiff-4.2.0.15-rev3-linux-aarch64",
+                    "zlib-1.2.11-rev5-linux-aarch64",
+                    "OpenSSL-1.1.1t-rev1-linux-aarch64",
+                    "aarch64"
                 ],
                 "custom_install_cmd": [
                     "{python}", "copy_platform_cmakes.py"

+ 53 - 0
package-system/Qt/build_config_wayland.json

@@ -0,0 +1,53 @@
+{
+    "git_url": "https://github.com/o3de/qt5.git",
+    "git_tag": "5.15.1-o3de",
+    "git_commit": "b3a1a6947422928e8aecb14ad607199e9720d266",
+    "package_name": "qt-wayland",
+    "package_url": "https://www.qt.io/",
+    "package_license": "LGPL-3.0",
+    "package_license_file": "qt/LICENSE.LGPLv3",
+    "cmake_find_source": "FindQt.cmake.wayland",
+    "cmake_find_target": "FindQt.cmake",
+    "Platforms": {
+        "Linux": {
+            "Linux": {
+                "package_version": "5.15.2-rev9",
+                "patch_file": "qt-linux.patch",
+                "depends_on_packages": [
+                    ["OpenSSL-1.1.1t-rev1-linux", "63aea898b7afe8faccd0c7261e62d2f8b7b870f678a4520d5be81e5815542b39", ""],
+                    ["tiff-4.2.0.15-rev3-linux", "2377f48b2ebc2d1628d9f65186c881544c92891312abe478a20d10b85877409a", ""],
+                    ["zlib-1.2.11-rev5-linux", "9be5ea85722fc27a8645a9c8a812669d107c68e6baa2ca0740872eaeb6a8b0fc", ""]
+                ],
+                "custom_build_cmd": [
+                    "./build-linux.sh",
+                    "tiff-4.2.0.15-rev3-linux",
+                    "zlib-1.2.11-rev5-linux",
+                    "OpenSSL-1.1.1t-rev1-linux",
+                    "wayland"
+                ],
+                "custom_install_cmd": [
+                    "{python}", "copy_platform_cmakes.py"
+                ]
+            },
+	    "Linux-aarch64": {
+                "package_version": "5.15.2-rev9",
+                "patch_file": "qt-linux.patch",
+                "depends_on_packages": [
+                    ["OpenSSL-1.1.1t-rev1-linux-aarch64", "f32721bec9c82d1bd7fb244d78d5dc4e2a47e7b808bb36027236ad377e241ea5", ""],
+                    ["tiff-4.2.0.15-rev3-linux-aarch64", "429461014b21a530dcad597c2d91072ae39d937a04b7bbbf5c34491c41767f7f", ""],
+                    ["zlib-1.2.11-rev5-linux-aarch64", "ce9d1ed2883d77ffc69c7982c078595c1f89ca55ec19d89fe7e6beb05f774775", ""]
+                ],
+                "custom_build_cmd": [
+                    "./build-linux.sh",
+                    "tiff-4.2.0.15-rev3-linux-aarch64",
+                    "zlib-1.2.11-rev5-linux-aarch64",
+                    "OpenSSL-1.1.1t-rev1-linux-aarch64",
+                    "wayland"
+                ],
+                "custom_install_cmd": [
+                    "{python}", "copy_platform_cmakes.py"
+                ]
+            }
+        }
+    }
+}

+ 33 - 3
package-system/Qt/docker_build_qt_linux.sh

@@ -23,7 +23,6 @@ echo "    " $TIFF_PACKAGE_DIR
 echo "    " $ZLIB_PACKAGE_DIR
 echo "    " $OPENSSL_PACKAGE_DIR
 
-
 # Base the Tiff of the dependent tiff O3DE package (static)
 TIFF_PREFIX=$TIFF_PACKAGE_DIR/tiff
 TIFF_INCDIR=$TIFF_PREFIX/include
@@ -45,7 +44,8 @@ INSTALL_PATH=/data/workspace/qt
 [[ -d $BUILD_PATH ]] || mkdir $BUILD_PATH
 cd $BUILD_PATH
 
-echo Configuring Qt...
+echo Configuring Qt  ...
+
 ../src/configure -prefix ${INSTALL_PATH} \
                  -opensource \
                  -nomake examples \
@@ -68,8 +68,9 @@ echo Configuring Qt...
                  -no-feature-renameat2 \
                  -no-feature-getentropy \
                  -no-feature-statx \
-                 -no-egl \
+                 -no-feature-wayland-server \
                  -qpa xcb \
+                 -qpa wayland \
                  -xcb-xlib \
                  -openssl \
                  -I $TIFF_INCDIR \
@@ -80,6 +81,7 @@ echo Configuring Qt...
                  -L $OPENSSL_LIBDIR \
                  -c++std c++1z \
                  -fontconfig
+
 if [ $? -ne 0 ]
 then
     echo "Failed to configure Qt"
@@ -117,4 +119,32 @@ for qtlib in "${qtarray[@]}"; do
     echo $qtlib installed.
 done
 
+cd /data/workspace/qtwayland
+
+/data/workspace/build/qtbase/bin/qmake
+if [ $? -ne 0 ]
+then
+    echo "qmake failed for qtwayland"
+    exit 1
+fi
+make
+if [ $? -ne 0 ]
+then
+    echo "make failed for qtwayland"
+    exit 1
+fi
+
+make install
+if [ $? -ne 0 ]
+then
+    echo "make install failed for qtwayland"
+    exit 1
+fi
+
+rm ${INSTALL_PATH}/include/QtWaylandCompositor/5.15.1/QtWaylandCompositor/private/qwayland-server-qt-texture-sharing-unstable-v1.h
+cp /data/workspace/qtwayland/include/QtWaylandCompositor/5.15.1/QtWaylandCompositor/private/qwayland-server-qt-texture-sharing-unstable-v1.h ${INSTALL_PATH}/include/QtWaylandCompositor/5.15.1/QtWaylandCompositor/private/
+rm ${INSTALL_PATH}/include/QtWaylandCompositor/5.15.1/QtWaylandCompositor/private/wayland-qt-texture-sharing-unstable-v1-server-protocol.h
+cp /data/workspace/qtwayland/include/QtWaylandCompositor/5.15.1/QtWaylandCompositor/private/wayland-qt-texture-sharing-unstable-v1-server-protocol.h ${INSTALL_PATH}/include/QtWaylandCompositor/5.15.1/QtWaylandCompositor/private/
+
+
 echo Qt installed successfully!

+ 58 - 0
package-system/SPIRVCross/Dockerfile

@@ -0,0 +1,58 @@
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+
+
+# The cpu architecture to base the docker base script from
+ARG INPUT_ARCHITECTURE=amd64
+
+# The root to base the docker script base from
+ARG INPUT_IMAGE=ubuntu:20.04
+
+# The build subfolder where the final artifacts are built in this container which will be used to copy the results out of
+ARG INPUT_BUILD_FOLDER=build
+
+# The name of the build script to copy to the docker image to execute
+ARG INPUT_DOCKER_BUILD_SCRIPT=build.sh
+
+FROM ${INPUT_ARCHITECTURE}/${INPUT_IMAGE}
+
+ARG INPUT_ARCHITECTURE
+ARG INPUT_DOCKER_BUILD_SCRIPT
+ARG INPUT_BUILD_FOLDER
+
+ENV WORKSPACE=/data/workspace
+ENV DOCKER_BUILD_PATH=$WORKSPACE/$INPUT_BUILD_FOLDER
+ENV BUILD_ARCHITECTURE=$INPUT_ARCHITECTURE
+
+WORKDIR $WORKSPACE
+
+# Initilize apt cache
+RUN apt-get clean && apt-get update
+
+# Setup time zone and locale data (necessary for SSL and HTTPS packages)
+RUN DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata locales keyboard-configuration
+
+RUN apt-get install -y curl zip unzip tar g++ git wget build-essential libssl-dev checkinstall clang tclsh
+
+
+# Build cmake 3.20 from source
+RUN cd /data/workspace && \
+    mkdir -p cmake_src && \
+    cd cmake_src && \
+    wget https://github.com/Kitware/CMake/releases/download/v3.20.0/cmake-3.20.0.tar.gz && \
+    tar -zvxf cmake-3.20.0.tar.gz && \
+    cd cmake-3.20.0 && \
+    ./bootstrap && \
+    make -j8 && \
+    checkinstall --pkgname=cmake --pkgversion="3.20-custom" --default && \
+    hash -r
+
+ARG CACHEBUST=1
+
+COPY src /data/workspace/src
+
+COPY ${INPUT_DOCKER_BUILD_SCRIPT} /data/workspace/

+ 211 - 0
package-system/SPIRVCross/build-linux.sh

@@ -0,0 +1,211 @@
+#!/bin/bash
+
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+
+# This script will utilize Docker to build on either AMD64 or AARCH64 architectures. The script will 
+# also build on both Ubuntu based docker images
+
+DOCKER_BUILD_SCRIPT=docker_build_spirvcross.sh
+TARGET_BUILD_FOLDER=build
+
+#
+# Collect the required arguments for this ubuntu docker-base build script
+#
+
+# Get the base docker image name
+DOCKER_IMAGE_NAME_BASE=$1
+if [ "${DOCKER_IMAGE_NAME_BASE}" == "" ]
+then
+    echo "Missing argument 1: Docker image name for this this process"
+    exit 1
+fi
+
+# Get the ubuntu base version (16.04|18.04|20.04|22.04)
+UBUNTU_BASE=$2
+if [ "${UBUNTU_BASE}" == "" ]
+then
+    echo "Missing argument 2: Ubuntu docker tag"
+    exit 1
+fi
+
+# Determine the host architecture
+CURRENT_HOST_ARCH=$(uname -m)
+
+# Use the host architecture if not supplied
+TARGET_ARCH=${3:-$(uname -m)}
+
+echo "Executing docker-based build from the following arguments"
+echo "    DOCKER_IMAGE_NAME_BASE     = ${DOCKER_IMAGE_NAME_BASE}"
+echo "    UBUNTU_BASE                = ${UBUNTU_BASE}"
+echo "    DOCKER_BUILD_SCRIPT        = ${DOCKER_BUILD_SCRIPT}"
+echo "    TARGET_BUILD_FOLDER        = ${TARGET_BUILD_FOLDER}"
+echo "    TARGET_ARCH                = ${TARGET_ARCH}"
+echo "    TEMP_FOLDER                = ${TEMP_FOLDER}"
+
+#
+# Make sure docker is installed
+#
+DOCKER_VERSION=$(docker --version)
+if [ $? -ne 0 ]
+then
+    echo "Required package docker is not installed"
+    echo "Follow instructions on https://docs.docker.com/engine/install/ubuntu/ to install docker properly"
+    exit 1
+fi
+echo "Detected Docker Version $DOCKER_VERSION"
+
+# 
+# Check the target architecture and determine if the necessary cross compilation requirements are met
+#
+
+# If the host and target architecture does not match, make sure the necessary cross compilation packages are installed
+if [ "${CURRENT_HOST_ARCH}" != ${TARGET_ARCH} ]
+then
+    echo "Checking cross compiling requirements."
+    for package_check in docker-ce qemu binfmt-support qemu-user-static
+    do
+        echo "Checking package $package_check"
+        dpkg -s $package_check > /dev/null 2>&1
+        if [ $? -ne 0 ]
+        then
+            echo ""
+            echo "Missing package $package_check. Make sure to install it with your local package manager." 
+            echo ""
+            exit 1
+        fi
+    done
+
+    # Only cross compilation of an ARM64 image on an x86_64 host is supported
+    if [ "${TARGET_ARCH}" = "aarch64" ]
+    then
+        # Make sure qemu-aarch64 is installed properly
+        QEMU_AARCH_COUNT=$(update-binfmts --display | grep qemu-aarch64 | wc -l)
+        if [ $QEMU_AARCH_COUNT -eq 0 ]
+        then
+            echo ""
+            echo "QEMU aarch64 binary format not registered."
+            echo "Run the following command to register"
+            echo ""
+            echo "sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes"
+            echo ""
+            exit 1
+        fi
+        echo ""
+        echo "Cross compiling aarch64 on an amd64 machine validated."
+        echo ""
+    fi
+else
+    echo "Building ${TARGET_ARCH} natively."
+fi
+
+
+# Setup the docker arguments 
+if [ "${TARGET_ARCH}" = "x86_64" ]
+then
+    echo "Processing Docker for amd64"
+
+    DOCKER_INPUT_ARCHITECTURE=amd64
+    TARGET_DOCKER_PLATFORM_ARG=linux/amd64
+
+elif [ "${TARGET_ARCH}" = "aarch64" ] 
+then
+    echo "Processing Docker for aarch64"
+
+    DOCKER_INPUT_ARCHITECTURE=arm64v8
+    TARGET_DOCKER_PLATFORM_ARG=linux/arm64/v8
+
+else
+    echo "Unsupported architecture ${TARGET_ARCH}"
+    exit 1
+fi
+
+# 
+# Prepare the docker base context based on ${TEMP_FOLDER} 
+mkdir -p ${TEMP_FOLDER}
+cp -f ${DOCKER_BUILD_SCRIPT} ${TEMP_FOLDER}/
+
+echo "Building on ubuntu public.ecr.aws/ubuntu/ubuntu:${UBUNTU_BASE}"
+
+# Build the Docker Image 
+DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME_BASE}_${DOCKER_INPUT_ARCHITECTURE}_3p
+echo DOCKER_IMAGE_NAME=${DOCKER_IMAGE_NAME}
+
+echo "Building the docker build script for ${DOCKER_IMAGE_NAME_BASE} on ${DOCKER_INPUT_ARCHITECTURE} for Ubuntu $1"
+echo ""
+CMD_DOCKER_BUILD="docker build --build-arg INPUT_DOCKER_BUILD_SCRIPT=${DOCKER_BUILD_SCRIPT}\
+ --build-arg INPUT_ARCHITECTURE=${DOCKER_INPUT_ARCHITECTURE} \
+ --build-arg INPUT_IMAGE=ubuntu:${UBUNTU_BASE} \
+ -f Dockerfile -t ${DOCKER_IMAGE_NAME}:latest temp"
+echo ${CMD_DOCKER_BUILD}
+eval ${CMD_DOCKER_BUILD}
+if [ $? -ne 0 ]
+then
+    echo "Error occurred creating Docker image ${DOCKER_IMAGE_NAME}:latest." 
+    exit 1
+fi
+
+# Prepare the target build folder to copy from the docker container on successful run of the docker script
+INSTALL_PACKAGE_PATH=${TEMP_FOLDER}/${TARGET_BUILD_FOLDER}/
+
+# Run the build script in the docker image
+echo "Running build script in the docker image ${DOCKER_IMAGE_NAME}"
+echo ""
+CMD_DOCKER_RUN="docker run --platform ${TARGET_DOCKER_PLATFORM_ARG} \
+ --tty \
+ -v ${TEMP_FOLDER}:/data/workspace/temp:ro \
+ ${DOCKER_IMAGE_NAME}:latest /data/workspace/${DOCKER_BUILD_SCRIPT}"
+echo ${CMD_DOCKER_RUN}
+eval ${CMD_DOCKER_RUN}
+if [ $? -ne 0 ]
+then
+    echo Failed to build from docker image ${DOCKER_IMAGE_NAME}:latest
+    echo "To log into and troubleshoot the docker container, run the following command:"
+    echo ""
+    echo "docker run --platform ${TARGET_DOCKER_PLATFORM_ARG} -it --tty -v ${TEMP_FOLDER}:/data/workspace/temp:ro ${DOCKER_IMAGE_NAME}:latest"
+    echo ""
+    exit 1
+fi
+
+echo "Build Complete"
+
+# Copy the build artifacts from the docker image
+
+# Capture the Docker Image ID
+IMAGE_ID=$(docker images -q ${DOCKER_IMAGE_NAME}:latest)
+if [ -z $IMAGE_ID ]
+then
+    echo "Error: Cannot find Image ID for ${DOCKER_IMAGE_NAME}"
+    exit 1
+fi
+
+# Capture the container ID
+echo "Capturing the Container ID"
+CONTAINER_ID=$(docker container ls -l -q --filter "ancestor=${DOCKER_IMAGE_NAME}:latest")
+if [ -z $CONTAINER_ID ]
+then
+    echo "Error: Cannot find Container ID for Image ${DOCKER_IMAGE_NAME}"
+    exit 1
+fi
+
+DOCKER_BUILD_ROOT=/data/workspace/${TARGET_BUILD_FOLDER}
+
+
+rm -rf ${INSTALL_PACKAGE_PATH}
+mkdir -p ${INSTALL_PACKAGE_PATH}
+
+echo "Copying from $CONTAINER_ID:${DOCKER_BUILD_ROOT} to ${TEMP_FOLDER}/"
+docker cp $CONTAINER_ID:${DOCKER_BUILD_ROOT}  ${TEMP_FOLDER}/ 
+if [ $? -ne 0 ]
+then
+    echo "Error copying build from docker image ${DOCKER_IMAGE_NAME}:latest." 
+    exit 1
+fi
+
+echo "Built ${DOCKER_IMAGE_NAME_BASE} into ${INSTALL_PACKAGE_PATH} successfully"
+
+exit 0

+ 86 - 0
package-system/SPIRVCross/docker_build_spirvcross.sh

@@ -0,0 +1,86 @@
+#!/bin/bash
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+#
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+
+
+# Validate the bld path input
+BUILD_FOLDER=${DOCKER_BUILD_PATH}
+if [ "${BUILD_FOLDER}" == "" ]
+then
+    echo "Missing required build target folder environment"
+    exit 1
+elif [ "${BUILD_FOLDER}" == "temp" ]
+then
+    echo "Build target folder environment cannot be 'temp'"
+    exit 1
+fi
+
+
+# Copy the source folder from the read-only $WORKSPACE/temp/src to $WORKSPACE/src
+# since the build process will write/modify the source path
+echo "Preparing source folder '$WORKSPACE/src'"
+cp -r $WORKSPACE/temp/src $WORKSPACE/ || (echo "Error copying src from $WORKSPACE/temp" && exit 1)
+
+SRC_PATH=$WORKSPACE/src
+
+if [ ! -d ${SRC_PATH} ]
+then
+    echo "Missing expected source path at ${SRC_PATH}"
+    exit 1
+fi
+
+CMAKE_BUILD_PATH=$WORKSPACE/gen
+
+BUILD_PATH=$WORKSPACE/build
+if [ -d ${BUILD_PATH} ]
+then
+    rm -rf ${BUILD_PATH}
+fi
+
+
+
+# Run configure 
+
+
+cmake -S $SRC_PATH -B ${CMAKE_BUILD_PATH}/Debug -G Ninja -DSPIRV_CROSS_CLI=ON \
+      -DSPIRV_CROSS_SHARED=OFF \
+      -DCMAKE_INSTALL_LIBDIR=${BUILD_FOLDER}/lib/Debug \
+      -DCMAKE_INSTALL_BINDIR=${BUILD_FOLDER}/bin/Debug \
+      -DCMAKE_BUILD_TYPE=Debug
+if [ $? -ne 0 ]
+then
+    echo "Unable to generate SPIRVCROSS for debug"
+    exit 1
+fi
+
+cmake --build ${CMAKE_BUILD_PATH}/Debug --target install
+if [ $? -ne 0 ]
+then
+    echo "Failed to build SPIRVCROSS for debug"
+    exit 1
+fi
+
+
+cmake -S $SRC_PATH -B ${CMAKE_BUILD_PATH} -G Ninja -DSPIRV_CROSS_CLI=ON \
+      -DSPIRV_CROSS_SHARED=OFF \
+      -DCMAKE_INSTALL_LIBDIR=${BUILD_FOLDER}/lib/Release \
+      -DCMAKE_INSTALL_BINDIR=${BUILD_FOLDER}/bin/Release \
+      -DCMAKE_BUILD_TYPE=Release
+if [ $? -ne 0 ]
+then
+    echo "Unable to generate SPIRVCROSS for release"
+    exit 1
+fi
+
+cmake --build ${CMAKE_BUILD_PATH}/Release --target install
+if [ $? -ne 0 ]
+then
+    echo "Failed to build SPIRVCROSS for release"
+    exit 1
+fi
+
+exit 1

+ 34 - 0
package-system/SPIRVCross/install_linux.sh

@@ -0,0 +1,34 @@
+#!/bin/bash
+
+#
+# Copyright (c) Contributors to the Open 3D Engine Project.
+# For complete copyright and license terms please see the LICENSE at the root of this distribution.
+# 
+# SPDX-License-Identifier: Apache-2.0 OR MIT
+#
+#
+
+
+PACKAGE_BASE=$TARGET_INSTALL_ROOT
+
+INSTALL_SOURCE=$TEMP_FOLDER/build
+
+cp $TEMP_FOLDER/src/copyright.txt $PACKAGE_BASE/
+
+# Copy extra source files just for reference
+cp $INSTALL_SOURCE/shell.c $PACKAGE_BASE/
+cp $INSTALL_SOURCE/sqlite3.c $PACKAGE_BASE/
+
+# Copy the header files
+cp $INSTALL_SOURCE/sqlite3ext.h $PACKAGE_BASE/
+cp $INSTALL_SOURCE/sqlite3.h $PACKAGE_BASE/
+
+# Copy the debug and release static libraries
+mkdir $PACKAGE_BASE/lib
+
+mkdir $PACKAGE_BASE/lib
+cp $TEMP_FOLDER/install/lib/libsqlite3.a $PACKAGE_BASE/lib/
+cp $TEMP_FOLDER/install/lib/libsqlite3.la $PACKAGE_BASE/lib/
+cp -r $TEMP_FOLDER/install/lib/pkgconfig $PACKAGE_BASE/lib/
+
+exit 0

+ 10 - 7
package-system/squish-ccr/build-linux.sh

@@ -21,7 +21,7 @@ TARGET_ARCH=${1:-$(uname -m)}
 if [ "${CURRENT_HOST_ARCH}" != ${TARGET_ARCH} ]
 then
     echo "Checking cross compiling requirements."
-    for package_check in docker-ce qemu binfmt-support qemu-user-static
+    for package_check in docker-ce binfmt-support qemu-user-static
     do
         echo "Checking package $package_check"
         dpkg -s $package_check > /dev/null 2>&1
@@ -57,24 +57,27 @@ else
     echo "Building ${TARGET_ARCH} natively."
 fi
 
-# Setup the docker arguments for the target architecture
+# Setup the docker arguments 
 if [ "${TARGET_ARCH}" = "x86_64" ]
 then
-    echo "Processing Docker for x86_64"
-    TARGET_DOCKER_FILE=Dockerfile.x86_64
+    echo "Processing Docker for amd64"
+
+    DOCKER_INPUT_ARCHITECTURE=amd64
     TARGET_DOCKER_PLATFORM_ARG=linux/amd64
-    DOCKER_IMAGE_NAME=${LIB_NAME}_linux_3p
+
 elif [ "${TARGET_ARCH}" = "aarch64" ] 
 then
     echo "Processing Docker for aarch64"
-    TARGET_DOCKER_FILE=Dockerfile.aarch64
+
+    DOCKER_INPUT_ARCHITECTURE=arm64v8
     TARGET_DOCKER_PLATFORM_ARG=linux/arm64/v8
-    DOCKER_IMAGE_NAME=${LIB_NAME}_linux_aarch64_3p
+
 else
     echo "Unsupported architecture ${TARGET_ARCH}"
     exit 1
 fi
 
+
 # Make sure docker is installed
 DOCKER_VERSION=$(docker --version)
 if [ $? -ne 0 ]

+ 2 - 2
package_build_list_host_linux-aarch64.json

@@ -34,7 +34,7 @@
         "poly2tri-7f0487a-rev1-linux-aarch64": "package-system/poly2tri/build_package_image.py --platform-name linux-aarch64",
         "pyside2-5.15.2.1-py3.10-rev7-linux-aarch64": "Scripts/extras/pull_and_build_from_git.py ../../package-system/pyside2 --platform-name Linux-aarch64 --clean",
         "python-3.10.13-rev2-linux-aarch64": "Scripts/extras/pull_and_build_from_git.py ../../package-system/python --platform-name Linux-aarch64 --clean",
-        "qt-5.15.2-rev9-linux-aarch64": "Scripts/extras/pull_and_build_from_git.py ../../package-system/Qt --platform-name Linux-aarch64 --clean",
+        "qt-5.15.2-rev10-linux-aarch64": "Scripts/extras/pull_and_build_from_git.py ../../package-system/Qt --platform-name Linux-aarch64 --clean",
         "sdformat-13.5.0-rev2-linux-aarch64": "Scripts/extras/pull_and_build_from_git.py ../../package-system/sdformat --platform-name Linux-aarch64 --clean",
         "SPIRVCross-1.3.275.0-rev1-linux-aarch64": "Scripts/extras/pull_and_build_from_git.py ../../package-system/SPIRVCross --platform-name Linux-aarch64 --clean",
         "SQLite-3.37.2-rev1-linux-aarch64": "Scripts/extras/pull_and_build_from_git.py ../../package-system/sqlite --platform-name Linux-aarch64 --clean",
@@ -75,7 +75,7 @@
         "poly2tri-7f0487a-rev1-linux-aarch64": "package-system/poly2tri-linux-aarch64",
         "pyside2-5.15.2.1-py3.10-rev7-linux-aarch64": "package-system/pyside2/temp/pyside2-linux-aarch64",
         "python-3.10.13-rev2-linux-aarch64": "package-system/python/temp/python-linux-aarch64",
-        "qt-5.15.2-rev9-linux-aarch64": "package-system/Qt/temp/qt-linux-aarch64",
+        "qt-5.15.2-rev10-linux-aarch64": "package-system/Qt/temp/qt-linux-aarch64",
         "sdformat-13.5.0-rev2-linux-aarch64": "package-system/sdformat/temp/sdformat-linux-aarch64",
         "SPIRVCross-1.3.275.0-rev1-linux-aarch64": "package-system/SPIRVCross/temp/SPIRVCross-linux-aarch64",
         "SQLite-3.37.2-rev1-linux-aarch64": "package-system/sqlite/temp/SQLite-linux-aarch64",

+ 4 - 2
package_build_list_host_linux.json

@@ -46,7 +46,8 @@
         "python-3.10.13-rev2-linux": "Scripts/extras/pull_and_build_from_git.py ../../package-system/python --platform-name Linux --clean",
         "python-3.10.13-rev2-linux-aarch64": "Scripts/extras/pull_and_build_from_git.py ../../package-system/python --platform-name Linux-aarch64 --clean",
         "mikkelsen-1.0.0.4-linux": "package-system/mikkelsen/build_package_image.py",
-        "qt-5.15.2-rev9-linux": "Scripts/extras/pull_and_build_from_git.py ../../package-system/Qt --platform-name Linux --package-root ../../package-system/Qt/temp --clean",
+        "qt-5.15.2-rev10-linux": "Scripts/extras/pull_and_build_from_git.py ../../package-system/Qt --platform-name Linux --package-root ../../package-system/Qt/temp --clean",
+        "qt-5.15.2-rev10-linux-aarch64": "Scripts/extras/pull_and_build_from_git.py ../../package-system/Qt --platform-name Linux-aarch64 --package-root ../../package-system/Qt/temp",
         "zlib-1.2.11-rev5-linux": "Scripts/extras/pull_and_build_from_git.py ../../package-system/zlib --platform-name Linux --package-root ../../package-system --clean",
         "lz4-1.9.4-rev2-linux": "Scripts/extras/pull_and_build_from_git.py ../../package-system/lz4 --platform-name Linux --package-root ../../package-system/lz4/temp --clean",
         "expat-2.4.2-rev2-linux": "Scripts/extras/pull_and_build_from_git.py ../../package-system/expat --platform-name Linux --package-root ../../package-system/expat/temp --clean",
@@ -97,7 +98,8 @@
         "unwind-1.2.1-linux": "package-system/unwind-linux",
         "SQLite-3.37.2-rev1-linux": "package-system/SQLite-linux",
         "xxhash-0.7.4-rev1-multiplatform": "package-system/xxhash-multiplatform",
-        "qt-5.15.2-rev9-linux": "package-system/Qt/temp/qt-linux",
+        "qt-5.15.2-rev10-linux": "package-system/Qt/temp/qt-linux",
+        "qt-5.15.2-rev10-linux-aarch64": "package-system/Qt/temp/qt-linux-aarch64",
         "zlib-1.2.11-rev5-linux": "package-system/zlib-linux",
         "lz4-1.9.4-rev2-linux": "package-system/lz4/temp/lz4-linux",
         "expat-2.4.2-rev2-linux": "package-system/expat/temp/expat-linux",