From b9b93ce272d41e8960ba5443563d4059e5805c1b Mon Sep 17 00:00:00 2001
From: Wouter Deconinck <wdconinc@gmail.com>
Date: Sun, 20 Nov 2022 19:03:52 -0600
Subject: qt6: new packages (#29555)

* qt6: initial commit of several basic qt6 packages

* Qt6: fix style issues

* [qt6] fix style issues, trailing spaces

* [qt6] rename to qt-* ecosystem; remove imports

* [qt6] rename dependencies; change version strings

* [qt6] list_urls

* [qt6] homepage links

* [qt6] missing closing quotes failed style check

* qt-declarative: use private _versions

Co-authored-by: Seth R. Johnson <johnsonsr@ornl.gov>

* qt-quick3d, qt-quicktimeline, qt-shadertools: use private _versions

* qt-base: rework feature defines and use run_tests

* qt: new version 6.2.4

* flake8 whitespace before comma

* qt-base: variant opengl when +gui

Co-authored-by: Seth R. Johnson <johnsonsr@ornl.gov>

* qt6: rebase and apply new black style

* qt6: apply style isort fixes

* qt6: new version 6.3.0 and 6.3.1

* qt6: add 6.3.0 and 6.3.1 to versions list

* qt6: multi-argument join_path

Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com>

* qt-base: fix isort

* qt-shadertools: no cmake_args needed

* qt-declarative: imports up front

* qt-quick3d: fix import

* qt-declarative: remove useless cmake_args

* qt-shadertools: imports and join_path fixes

* qt-quick3d: join_path fixes

* qt-declarative: join_path fixes

* Update features based on gui usage

* Update dependencies, cmake args, mac support

* Update features based on linux

* More updates

* qt-base: fix style

* qt-base: archive_files join_path

* qt-base: new version 6.3.2

* qt-{declarative,quick3d,quicktimeline,shadertools}@6.3.2

* qt-base: require libxcb@1.13: and use system xcb_xinput when on linux

Co-authored-by: Seth R. Johnson <johnsonsr@ornl.gov>
Co-authored-by: Adam J. Stewart <ajstewart426@gmail.com>
---
 .../repos/builtin/packages/qt-base/package.py      | 193 +++++++++++++++++++++
 .../builtin/packages/qt-declarative/package.py     |  55 ++++++
 .../repos/builtin/packages/qt-quick3d/package.py   |  67 +++++++
 .../builtin/packages/qt-quicktimeline/package.py   |  42 +++++
 .../builtin/packages/qt-shadertools/package.py     |  56 ++++++
 5 files changed, 413 insertions(+)
 create mode 100644 var/spack/repos/builtin/packages/qt-base/package.py
 create mode 100644 var/spack/repos/builtin/packages/qt-declarative/package.py
 create mode 100644 var/spack/repos/builtin/packages/qt-quick3d/package.py
 create mode 100644 var/spack/repos/builtin/packages/qt-quicktimeline/package.py
 create mode 100644 var/spack/repos/builtin/packages/qt-shadertools/package.py

diff --git a/var/spack/repos/builtin/packages/qt-base/package.py b/var/spack/repos/builtin/packages/qt-base/package.py
new file mode 100644
index 0000000000..18fb27b14d
--- /dev/null
+++ b/var/spack/repos/builtin/packages/qt-base/package.py
@@ -0,0 +1,193 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+import os
+import shutil
+import sys
+
+from spack.operating_systems.mac_os import macos_version
+from spack.package import *
+
+MACOS_VERSION = macos_version() if sys.platform == "darwin" else None
+
+
+class QtBase(CMakePackage):
+    """Qt Base (Core, Gui, Widgets, Network, ...)"""
+
+    homepage = "https://www.qt.io"
+    url = "https://github.com/qt/qtbase/archive/refs/tags/v6.3.1.tar.gz"
+    list_url = "https://github.com/qt/qtbase/tags"
+
+    maintainers = ["wdconinc", "sethrj"]
+
+    version("6.3.2", sha256="95b78830a99f417ff34ee784ab78f5eeb7bb12adb16d137c3026434c44a904dd")
+    version("6.3.1", sha256="4393e8cea0c58b1e0e901735fcffad141261576a0fa414ed6309910ac3d49df9")
+    version("6.3.0", sha256="c50dc73f633e6c0f6ee3f51980c698800f1a0cadb423679bcef18e446ac72138")
+    version("6.2.4", sha256="657d1405b5e15afcf322cc75b881f62d6a56f16383707742a99eb87f53cb63de")
+    version("6.2.3", sha256="2dd095fa82bff9e0feb7a9004c1b2fb910f79ecc6111aa64637c95a02b7a8abb")
+
+    variant("dbus", default=False, description="Build with D-Bus support.")
+    variant(
+        "framework", default=bool(MACOS_VERSION), description="Build as a macOS Framework package."
+    )
+    variant("gui", default=True, description="Build the Qt GUI module and dependencies.")
+    variant("shared", default=True, description="Build shared libraries.")
+    variant("sql", default=True, description="Build with SQL support.")
+    variant("network", default=True, description="Build with SSL support.")
+
+    # GUI-only dependencies
+    variant(
+        "accessibility", default=True, when="+gui", description="Build with accessibility support."
+    )
+    variant("gtk", default=False, when="+gui", description="Build with gtkplus.")
+    variant("opengl", default=False, when="+gui", description="Build with OpenGL support.")
+    variant("widgets", default=True, when="+gui", description="Build with widgets.")
+
+    generator = "Ninja"
+
+    depends_on("cmake@3.16:", type="build")
+    depends_on("ninja", type="build")
+    depends_on("pkgconfig", type="build")
+    depends_on("python", type="build")
+
+    # Dependencies, then variant- and version-specific dependencies
+    depends_on("double-conversion")
+    depends_on("icu4c")
+    depends_on("libxml2")
+    depends_on("pcre2+multibyte")
+    depends_on("zlib")
+    depends_on("zstd")
+    with when("platform=linux"):
+        depends_on("libdrm")
+
+    depends_on("at-spi2-core", when="+accessibility")
+    depends_on("dbus", when="+dbus")
+    depends_on("gl", when="+opengl")
+    depends_on("sqlite", when="+sql")
+
+    with when("+gui"):
+        depends_on("fontconfig")
+        depends_on("freetype")
+        depends_on("harfbuzz")
+        depends_on("jpeg")
+        depends_on("libpng")
+        with when("platform=linux"):
+            depends_on("libxkbcommon")
+            depends_on("libxcb@1.13:")  # requires xinput
+            depends_on("libxrender")
+
+    with when("+network"):
+        depends_on("libproxy")
+        depends_on("openssl")
+
+    @property
+    def archive_files(self):
+        """Save both the CMakeCache and the config summary."""
+        return [
+            join_path(self.build_directory, filename)
+            for filename in ["CMakeCache.txt", "config.summary"]
+        ]
+
+    def patch(self):
+        vendor_dir = join_path(self.stage.source_path, "src", "3rdparty")
+        vendor_deps_to_keep = [
+            "blake2",
+            "easing",
+            "forkfd",
+            "freebsd",
+            "icc",
+            "md4",
+            "md4c",
+            "md5",
+            "rfc6234",
+            "sha1",
+            "sha3",
+            "tinycbor",
+            "VulkanMemoryAllocator",
+        ]
+        with working_dir(vendor_dir):
+            for dep in os.listdir():
+                if os.path.isdir(dep):
+                    if dep not in vendor_deps_to_keep:
+                        shutil.rmtree(dep)
+
+    def cmake_args(self):
+        spec = self.spec
+        args = []
+
+        def define(cmake_var, value):
+            args.append(self.define(cmake_var, value))
+
+        def define_from_variant(cmake_var, variant=None):
+            result = self.define_from_variant(cmake_var, variant)
+            if result:
+                # Not a conditional variant
+                args.append(result)
+
+        def define_feature(key, variant=None):
+            if variant is None:
+                variant = key
+            define_from_variant("FEATURE_" + key, variant)
+
+        define_from_variant("BUILD_SHARED_LIBS", "shared")
+        define("FEATURE_optimize_size", spec.satisfies("build_type=MinSizeRel"))
+
+        # Top-level features
+        define_feature("accessibility")
+        # concurrent: default to on
+        define_feature("dbus")
+        define_feature("framework")
+        define_feature("gui")
+        define_feature("network")  # note: private feature
+        # testlib: default to on
+        # thread: default to on
+        define_feature("widgets")  # note: private feature
+        define_feature("sql")  # note: private feature
+        # xml: default to on
+
+        # Extra FEATURE_ toggles
+        features = []
+        if "+dbus" in spec:
+            features.append("dbus_linked")
+        if "+network" in spec:
+            features += ["openssl_linked", "openssl", "libproxy"]
+        for k in features:
+            define("FEATURE_" + k, True)
+
+        # INPUT_* arguments: undefined/no/qt/system
+        sys_inputs = ["doubleconversion"]
+        if "+sql" in spec:
+            sys_inputs.append("sqlite")
+        for k in sys_inputs:
+            define("INPUT_" + k, "system")
+
+        # FEATURE_system_* arguments: on/off
+        sys_features = [
+            ("doubleconversion", True),
+            ("pcre2", True),
+            ("zlib", True),
+            ("libb2", False),
+        ]
+        if "+gui" in spec:
+            sys_features += [
+                ("jpeg", True),
+                ("png", True),
+                ("sqlite", True),
+                ("freetype", True),
+                ("harfbuzz", True),
+                ("textmarkdownreader", False),
+            ]
+            with when("platform=linux"):
+                sys_features += [
+                    ("xcb_xinput", True),
+                ]
+        if "+network" in spec:
+            sys_features += [
+                ("proxies", True),
+            ]
+        for k, v in sys_features:
+            define("FEATURE_system_" + k, v)
+
+        return args
diff --git a/var/spack/repos/builtin/packages/qt-declarative/package.py b/var/spack/repos/builtin/packages/qt-declarative/package.py
new file mode 100644
index 0000000000..ec3a06bcbf
--- /dev/null
+++ b/var/spack/repos/builtin/packages/qt-declarative/package.py
@@ -0,0 +1,55 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+import os
+import shutil
+
+from spack.package import *
+
+
+class QtDeclarative(CMakePackage):
+    """Qt Declarative (Quick 2)."""
+
+    homepage = "https://www.qt.io"
+    url = "https://github.com/qt/qtdeclarative/archive/refs/tags/v6.2.3.tar.gz"
+    list_url = "https://github.com/qt/qtdeclarative/tags"
+
+    maintainers = ["wdconinc", "sethrj"]
+
+    version("6.3.2", sha256="140a3c4973d56d79abf5fea9ae5cf13b3ef7693ed1d826b263802926a4ba84b6")
+    version("6.3.1", sha256="1606723c2cc150c9b7339fd33ca5e2ca00d6e738e119c52a1d37ca12d3329ba9")
+    version("6.3.0", sha256="b7316d6c195fdc31ecbf5ca2acf2888737539919a02ff8f11a911432d50c17ac")
+    version("6.2.4", sha256="cd939d99c37e7723268804b9516e32f8dd64b985d847469c78b66b5f4481c548")
+    version("6.2.3", sha256="eda82abfe685a6ab5664e4268954622ccd05cc9ec8fb16eaa453c54900591baf")
+
+    generator = "Ninja"
+
+    # Changing default to Release for typical use in HPC contexts
+    variant(
+        "build_type",
+        default="Release",
+        values=("Release", "Debug", "RelWithDebInfo", "MinSizeRel"),
+        description="CMake build type",
+    )
+
+    depends_on("cmake@3.16:", type="build")
+    depends_on("ninja", type="build")
+    depends_on("pkgconfig", type="build")
+    depends_on("python", when="@5.7.0:", type="build")
+
+    _versions = ["6.3.2", "6.3.1", "6.3.0", "6.2.4", "6.2.3"]
+    for v in _versions:
+        depends_on("qt-base@" + v, when="@" + v)
+        depends_on("qt-shadertools@" + v, when="@" + v)
+
+    def patch(self):
+        vendor_dir = join_path(self.stage.source_path, "src", "3rdparty")
+        vendor_deps_to_keep = ["masm"]
+        with working_dir(vendor_dir):
+            for dep in os.listdir():
+                if os.path.isdir(dep):
+                    if dep not in vendor_deps_to_keep:
+                        shutil.rmtree(dep)
diff --git a/var/spack/repos/builtin/packages/qt-quick3d/package.py b/var/spack/repos/builtin/packages/qt-quick3d/package.py
new file mode 100644
index 0000000000..6f621201f5
--- /dev/null
+++ b/var/spack/repos/builtin/packages/qt-quick3d/package.py
@@ -0,0 +1,67 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+import os
+import shutil
+
+from spack.package import *
+
+
+class QtQuick3d(CMakePackage):
+    """A new module and API for defining 3D content in Qt Quick."""
+
+    homepage = "https://www.qt.io"
+    url = "https://github.com/qt/qtquick3d/archive/refs/tags/v6.2.3.tar.gz"
+    list_url = "https://github.com/qt/qtquick3d/tags"
+
+    maintainers = ["wdconinc", "sethrj"]
+
+    version("6.3.2", sha256="a3ec81393f1cd45eb18ee3d47582998679eef141b856bdd2baa2d41f019a0eea")
+    version("6.3.1", sha256="79f0813ff776dc2aa07a8513ecd9d550dd8d449dc8fcd834fb0c9b22ea4a1893")
+    version("6.3.0", sha256="413dec87828155ea0c0424e6b40c777bf0710f1ffaf98969c5d8b19ad3992823")
+    version("6.2.4", sha256="7292ed4373a92913c6811f2faa5191f0426f84bd93a3f6eb7d54b62626b56db5")
+    version("6.2.3", sha256="35d06edbdd83b7d781b70e0bada18911fa9b774b6403589d5b21813a73584d80")
+
+    generator = "Ninja"
+
+    # Changing default to Release for typical use in HPC contexts
+    variant(
+        "build_type",
+        default="Release",
+        values=("Release", "Debug", "RelWithDebInfo", "MinSizeRel"),
+        description="CMake build type",
+    )
+
+    depends_on("cmake@3.16:", type="build")
+    depends_on("ninja", type="build")
+    depends_on("pkgconfig", type="build")
+    depends_on("python", when="@5.7.0:", type="build")
+
+    depends_on("assimp@5.0.1:")
+
+    _versions = ["6.3.2", "6.3.1", "6.3.0", "6.2.4", "6.2.3"]
+    for v in _versions:
+        depends_on("qt-base@" + v, when="@" + v)
+        depends_on("qt-declarative@" + v, when="@" + v)
+        depends_on("qt-quicktimeline@" + v, when="@" + v)
+
+    def patch(self):
+        vendor_dir = join_path(self.stage.source_path, "src", "3rdparty")
+        vendor_deps_to_keep = ["xatlas"]
+        with working_dir(vendor_dir):
+            for dep in os.listdir():
+                if os.path.isdir(dep):
+                    if dep not in vendor_deps_to_keep:
+                        shutil.rmtree(dep)
+
+    def cmake_args(self):
+        args = [
+            # Qt components typically install cmake config files in a single prefix
+            self.define("QT_ADDITIONAL_PACKAGES_PREFIX_PATH", self.spec["qt-declarative"].prefix),
+            self.define("FEATURE_quick3d_assimp", True),
+            self.define("FEATURE_system_assimp", True),
+        ]
+        return args
diff --git a/var/spack/repos/builtin/packages/qt-quicktimeline/package.py b/var/spack/repos/builtin/packages/qt-quicktimeline/package.py
new file mode 100644
index 0000000000..e727bd1dda
--- /dev/null
+++ b/var/spack/repos/builtin/packages/qt-quicktimeline/package.py
@@ -0,0 +1,42 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+from spack.package import *
+
+
+class QtQuicktimeline(CMakePackage):
+    """Module for keyframe-based timeline construction."""
+
+    homepage = "https://www.qt.io"
+    url = "https://github.com/qt/qtquicktimeline/archive/refs/tags/v6.2.3.tar.gz"
+    list_url = "https://github.com/qt/qtquicktimeline/tags"
+
+    maintainers = ["wdconinc", "sethrj"]
+
+    version("6.3.2", sha256="ca6e53a92b022b49098c15f2cc5897953644de8477310696542a03bbbe5666aa")
+    version("6.3.1", sha256="ba1e808d4c0fce899c235942df34ae5d349632f61a302d14feeae7465cf1f197")
+    version("6.3.0", sha256="09e27bbdefbbf50d15525d26119a00d86eba76d2d1bc9421557d1ed86edcacdf")
+    version("6.2.4", sha256="d73cb33e33f0b7a1825b863c22e6b552ae86aa841bcb805a41aca02526a4e8bc")
+    version("6.2.3", sha256="bbb913398d8fb6b5b20993b5e02317de5c1e4b23a5357dd5d08a237ada6cc7e2")
+
+    generator = "Ninja"
+
+    depends_on("cmake@3.16:", type="build")
+    depends_on("ninja", type="build")
+    depends_on("pkgconfig", type="build")
+    depends_on("python", when="@5.7.0:", type="build")
+
+    _versions = ["6.3.2", "6.3.1", "6.3.0", "6.2.4", "6.2.3"]
+    for v in _versions:
+        depends_on("qt-base@" + v, when="@" + v)
+        depends_on("qt-declarative@" + v, when="@" + v)
+
+    def cmake_args(self):
+        args = [
+            # Qt components typically install cmake config files in a single prefix
+            self.define("QT_ADDITIONAL_PACKAGES_PREFIX_PATH", self.spec["qt-declarative"].prefix)
+        ]
+        return args
diff --git a/var/spack/repos/builtin/packages/qt-shadertools/package.py b/var/spack/repos/builtin/packages/qt-shadertools/package.py
new file mode 100644
index 0000000000..7c45b37672
--- /dev/null
+++ b/var/spack/repos/builtin/packages/qt-shadertools/package.py
@@ -0,0 +1,56 @@
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+
+import os
+import shutil
+
+from spack.package import *
+
+
+class QtShadertools(CMakePackage):
+    """APIs and tools in this module provide the producer functionality for the
+    shader pipeline that allows Qt Quick to operate on Vulkan, Metal, and
+    Direct3D, in addition to OpenGL."""
+
+    homepage = "https://www.qt.io"
+    url = "https://github.com/qt/qtshadertools/archive/refs/tags/v6.2.3.tar.gz"
+    list_url = "https://github.com/qt/qtshadertools/tags"
+
+    maintainers = ["wdconinc", "sethrj"]
+
+    version("6.3.2", sha256="ec73303e6c91cddae402b1ac0d18a0d35619f348785514be30cec2791cd63faa")
+    version("6.3.1", sha256="1b8b18b6ece4d92d0bf60a3b2a9924b45c369968cc77217796434ac7c5c6628f")
+    version("6.3.0", sha256="3c36d83fc036a144722ce056b2840260005dcbd338e11b9c527d7266a54afd45")
+    version("6.2.4", sha256="c3332d91e0894086634d5f8d40638439e6e3653a3a185e1b5f5d23ae3b9f51a1")
+    version("6.2.3", sha256="658c4acc2925e57d35bbd38cdf49c08297555ed7d632f9e86bfef76e6d861562")
+
+    generator = "Ninja"
+
+    # Changing default to Release for typical use in HPC contexts
+    variant(
+        "build_type",
+        default="Release",
+        values=("Release", "Debug", "RelWithDebInfo", "MinSizeRel"),
+        description="CMake build type",
+    )
+
+    depends_on("cmake@3.16:", type="build")
+    depends_on("ninja", type="build")
+    depends_on("pkgconfig", type="build")
+    depends_on("python", when="@5.7.0:", type="build")
+
+    _versions = ["6.3.2", "6.3.1", "6.3.0", "6.2.4", "6.2.3"]
+    for v in _versions:
+        depends_on("qt-base@" + v, when="@" + v)
+
+    def patch(self):
+        vendor_dir = join_path(self.stage.source_path, "src", "3rdparty")
+        vendor_deps_to_keep = ["glslang", "patches", "SPIRV-Cross"]
+        with working_dir(vendor_dir):
+            for dep in os.listdir():
+                if os.path.isdir(dep):
+                    if dep not in vendor_deps_to_keep:
+                        shutil.rmtree(dep)
-- 
cgit v1.2.3-70-g09d2