From 59e130a18bed9b356d64d7acb6927184c3bbb098 Mon Sep 17 00:00:00 2001
From: System-Arch <33330183+System-Arch@users.noreply.github.com>
Date: Sun, 11 Dec 2022 15:34:49 -0500
Subject: [PATCH 1/7] msys2: Conan 2.0 compatibility tweaks

---
 recipes/msys2/all/conanfile.py              | 31 +++++++++++----------
 recipes/msys2/all/test_package/conanfile.py |  2 +-
 2 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/recipes/msys2/all/conanfile.py b/recipes/msys2/all/conanfile.py
index 335f7da9b6296..c936f20112634 100644
--- a/recipes/msys2/all/conanfile.py
+++ b/recipes/msys2/all/conanfile.py
@@ -1,6 +1,7 @@
 from conan import ConanFile
 from conan.errors import ConanInvalidConfiguration, ConanException
-from conan.tools.files import chdir, get, replace_in_file
+from conan.tools.files import chdir, get, replace_in_file, copy
+from conan.tools.layout import basic_layout
 import fnmatch
 import os
 import shutil
@@ -52,7 +53,7 @@ class MSYS2Conan(ConanFile):
     options = {
         "exclude_files": ["ANY"],
         "packages": ["ANY"],
-        "additional_packages": ["ANY"],
+        "additional_packages": [None, "ANY"],
     }
     default_options = {
         "exclude_files": "*/link.exe",
@@ -72,12 +73,15 @@ def validate(self):
         if self.info.settings.arch != "x86_64":
             raise ConanInvalidConfiguration("Only Windows x64 supported")
 
+    def layout(self):
+        basic_layout(self, src_folder="src")
+
     def source(self):
-        # sources are different per configuration - do download in build
-        pass
+        get(self, **self.conan_data["sources"][self.version],
+            destination=self.source_folder, strip_root=True)
 
     def _update_pacman(self):
-        with chdir(self, os.path.join(self._msys_dir, "usr", "bin")):
+        with chdir(self, os.path.join(self.source_folder, "usr", "bin")):
             try:
                 self._kill_pacman()
 
@@ -122,12 +126,9 @@ def _kill_pacman(self):
 
     @property
     def _msys_dir(self):
-        subdir = "msys64"
-        return os.path.join(self.package_folder, "bin", subdir)
+        return "msys64"
 
     def build(self):
-        get(self, **self.conan_data["sources"][self.version],
-            destination=os.path.join(self.package_folder, "bin"))
         with lock():
             self._do_build()
 
@@ -140,7 +141,7 @@ def _do_build(self):
 
         self._update_pacman()
 
-        with chdir(self, os.path.join(self._msys_dir, "usr", "bin")):
+        with chdir(self, os.path.join(self.source_folder, "usr", "bin")):
             for package in packages:
                 self.run(f'bash -l -c "pacman -S {package} --noconfirm"')
             for package in ['pkgconf']:
@@ -150,7 +151,7 @@ def _do_build(self):
 
         # create /tmp dir in order to avoid
         # bash.exe: warning: could not find /tmp, please create!
-        tmp_dir = os.path.join(self._msys_dir, 'tmp')
+        tmp_dir = os.path.join(self.source_folder, 'tmp')
         if not os.path.isdir(tmp_dir):
             os.makedirs(tmp_dir)
         tmp_name = os.path.join(tmp_dir, 'dummy')
@@ -158,21 +159,21 @@ def _do_build(self):
             os.utime(tmp_name, None)
 
         # Prepend the PKG_CONFIG_PATH environment variable with an eventual PKG_CONFIG_PATH environment variable
-        replace_in_file(self, os.path.join(self._msys_dir, "etc", "profile"),
+        replace_in_file(self, os.path.join(self.source_folder, "etc", "profile"),
                               'PKG_CONFIG_PATH="', 'PKG_CONFIG_PATH="$PKG_CONFIG_PATH:')
 
     def package(self):
         excludes = None
         if self.options.exclude_files:
             excludes = tuple(str(self.options.exclude_files).split(","))
-        #self.copy("*", dst="bin", src=self._msys_dir, excludes=excludes)
         for exclude in excludes:
             for root, _, filenames in os.walk(self._msys_dir):
                 for filename in filenames:
                     fullname = os.path.join(root, filename)
                     if fnmatch.fnmatch(fullname, exclude):
                         os.unlink(fullname)
-        shutil.copytree(os.path.join(self._msys_dir, "usr", "share", "licenses"),
+        copy(self, "*", dst=os.path.join(self.package_folder, self._msys_dir), src=self.source_folder, excludes=excludes)
+        shutil.copytree(os.path.join(self.source_folder, "usr", "share", "licenses"),
                         os.path.join(self.package_folder, "licenses"))
 
     def package_info(self):
@@ -180,7 +181,7 @@ def package_info(self):
         self.cpp_info.includedirs = []
         self.cpp_info.resdirs = []
 
-        msys_root = self._msys_dir
+        msys_root = os.path.join(self.package_folder, self._msys_dir)
         msys_bin = os.path.join(msys_root, "usr", "bin")
         self.cpp_info.bindirs.append(msys_bin)
 
diff --git a/recipes/msys2/all/test_package/conanfile.py b/recipes/msys2/all/test_package/conanfile.py
index 93ee00629e591..f38adaaee318d 100644
--- a/recipes/msys2/all/test_package/conanfile.py
+++ b/recipes/msys2/all/test_package/conanfile.py
@@ -30,6 +30,6 @@ def test(self):
         self.run('bash.exe -c ^"! test -f /usr/bin/link^"')
 
         output = StringIO()
-        self.run('bash.exe -c "echo $PKG_CONFIG_PATH"', output=output)
+        self.run('bash.exe -c "echo $PKG_CONFIG_PATH"', output)
         print(output.getvalue())
         assert self._secret_value in output.getvalue()

From cb4c332f1bb8ca08c82f534f336653785dc173de Mon Sep 17 00:00:00 2001
From: System-Arch <33330183+System-Arch@users.noreply.github.com>
Date: Sun, 11 Dec 2022 16:05:33 -0500
Subject: [PATCH 2/7] Remove C++ settings in configure() method

---
 recipes/msys2/all/conanfile.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/recipes/msys2/all/conanfile.py b/recipes/msys2/all/conanfile.py
index c936f20112634..4c9311278c671 100644
--- a/recipes/msys2/all/conanfile.py
+++ b/recipes/msys2/all/conanfile.py
@@ -73,6 +73,10 @@ def validate(self):
         if self.info.settings.arch != "x86_64":
             raise ConanInvalidConfiguration("Only Windows x64 supported")
 
+    def configure(self):
+        self.settings.rm_safe("compiler.libcxx")
+        self.settings.rm_safe("compiler.cppstd")
+
     def layout(self):
         basic_layout(self, src_folder="src")
 

From 66de1e801d0d54606d4b8abd581012db0cc6d3e0 Mon Sep 17 00:00:00 2001
From: System-Arch <33330183+System-Arch@users.noreply.github.com>
Date: Sun, 11 Dec 2022 18:50:01 -0500
Subject: [PATCH 3/7] Revamped packaging per #KB-H013: "DEFAULT PACKAGE LAYOUT"

---
 recipes/msys2/all/conanfile.py | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/recipes/msys2/all/conanfile.py b/recipes/msys2/all/conanfile.py
index 4c9311278c671..6a615c77948b2 100644
--- a/recipes/msys2/all/conanfile.py
+++ b/recipes/msys2/all/conanfile.py
@@ -54,11 +54,13 @@ class MSYS2Conan(ConanFile):
         "exclude_files": ["ANY"],
         "packages": ["ANY"],
         "additional_packages": [None, "ANY"],
+        "no_kill": [True, False]
     }
     default_options = {
         "exclude_files": "*/link.exe",
         "packages": "base-devel,binutils,gcc",
         "additional_packages": None,
+        "no_kill": False,
     }
 
     short_paths = True
@@ -82,10 +84,10 @@ def layout(self):
 
     def source(self):
         get(self, **self.conan_data["sources"][self.version],
-            destination=self.source_folder, strip_root=True)
+            destination=self.source_folder, strip_root=False) # Preserve tarball root dir (msys64/)
 
     def _update_pacman(self):
-        with chdir(self, os.path.join(self.source_folder, "usr", "bin")):
+        with chdir(self, os.path.join(self._msys_dir, "usr", "bin")):
             try:
                 self._kill_pacman()
 
@@ -102,6 +104,8 @@ def _update_pacman(self):
 
     # https://github.com/msys2/MSYS2-packages/issues/1966
     def _kill_pacman(self):
+        if self.options.no_kill:
+            return
         if (self.settings.os == "Windows"):
             taskkill_exe = os.path.join(os.environ.get('SystemRoot'), 'system32', 'taskkill.exe')
 
@@ -110,7 +114,7 @@ def _kill_pacman(self):
                 out = subprocess.PIPE
                 err = subprocess.STDOUT
             else:
-                out = open(os.devnull, 'w')
+                out = open(os.devnull, 'w', encoding='UTF-8')
                 err = subprocess.PIPE
 
             if os.path.exists(taskkill_exe):
@@ -126,11 +130,12 @@ def _kill_pacman(self):
                         proc.wait()
                     except OSError as e:
                         if e.errno == errno.ENOENT:
-                            raise ConanException("Cannot kill pacman")
+                            raise ConanException("Cannot kill pacman") from e
 
     @property
     def _msys_dir(self):
-        return "msys64"
+        subdir = "msys64" # top-level directoy in tarball
+        return os.path.join(self.source_folder, subdir)
 
     def build(self):
         with lock():
@@ -145,7 +150,7 @@ def _do_build(self):
 
         self._update_pacman()
 
-        with chdir(self, os.path.join(self.source_folder, "usr", "bin")):
+        with chdir(self, os.path.join(self._msys_dir, "usr", "bin")):
             for package in packages:
                 self.run(f'bash -l -c "pacman -S {package} --noconfirm"')
             for package in ['pkgconf']:
@@ -155,15 +160,15 @@ def _do_build(self):
 
         # create /tmp dir in order to avoid
         # bash.exe: warning: could not find /tmp, please create!
-        tmp_dir = os.path.join(self.source_folder, 'tmp')
+        tmp_dir = os.path.join(self._msys_dir, 'tmp')
         if not os.path.isdir(tmp_dir):
             os.makedirs(tmp_dir)
         tmp_name = os.path.join(tmp_dir, 'dummy')
-        with open(tmp_name, 'a'):
+        with open(tmp_name, 'a', encoding='UTF-8'):
             os.utime(tmp_name, None)
 
         # Prepend the PKG_CONFIG_PATH environment variable with an eventual PKG_CONFIG_PATH environment variable
-        replace_in_file(self, os.path.join(self.source_folder, "etc", "profile"),
+        replace_in_file(self, os.path.join(self._msys_dir, "etc", "profile"),
                               'PKG_CONFIG_PATH="', 'PKG_CONFIG_PATH="$PKG_CONFIG_PATH:')
 
     def package(self):
@@ -176,8 +181,9 @@ def package(self):
                     fullname = os.path.join(root, filename)
                     if fnmatch.fnmatch(fullname, exclude):
                         os.unlink(fullname)
-        copy(self, "*", dst=os.path.join(self.package_folder, self._msys_dir), src=self.source_folder, excludes=excludes)
-        shutil.copytree(os.path.join(self.source_folder, "usr", "share", "licenses"),
+        # See https://github.com/conan-io/conan-center-index/blob/master/docs/error_knowledge_base.md#kb-h013-default-package-layout
+        copy(self, "*", dst=os.path.join(self.package_folder, "bin", "msys64"), src=self._msys_dir, excludes=excludes)
+        shutil.copytree(os.path.join(self._msys_dir, "usr", "share", "licenses"),
                         os.path.join(self.package_folder, "licenses"))
 
     def package_info(self):
@@ -185,7 +191,7 @@ def package_info(self):
         self.cpp_info.includedirs = []
         self.cpp_info.resdirs = []
 
-        msys_root = os.path.join(self.package_folder, self._msys_dir)
+        msys_root = os.path.join(self.package_folder, "bin", "msys64")
         msys_bin = os.path.join(msys_root, "usr", "bin")
         self.cpp_info.bindirs.append(msys_bin)
 

From 656d687cedc297869b79b465ac618ebde8411db8 Mon Sep 17 00:00:00 2001
From: System-Arch <33330183+System-Arch@users.noreply.github.com>
Date: Thu, 22 Dec 2022 18:54:03 -0500
Subject: [PATCH 4/7] Drop Python 2 support

---
 recipes/msys2/all/conanfile.py | 12 ++----------
 1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/recipes/msys2/all/conanfile.py b/recipes/msys2/all/conanfile.py
index b2a4401bf9c66..27d8a46ab4cf2 100644
--- a/recipes/msys2/all/conanfile.py
+++ b/recipes/msys2/all/conanfile.py
@@ -7,16 +7,9 @@
 import shutil
 import subprocess
 import errno
+import ctypes
 
-try:
-    import ctypes
-except ImportError:
-    pass
-except ValueError:
-    pass
-
-required_conan_version = ">=1.47.0"
-
+required_conan_version = ">=1.49.0"
 
 class lock:
     def __init__(self):
@@ -39,7 +32,6 @@ def close(self):
 
     __del__ = close
 
-
 class MSYS2Conan(ConanFile):
     name = "msys2"
     description = "MSYS2 is a software distro and building platform for Windows"

From 95c39807519f094ce1ec9a67a35d4dbcc5c215b0 Mon Sep 17 00:00:00 2001
From: System-Arch <33330183+System-Arch@users.noreply.github.com>
Date: Fri, 13 Jan 2023 00:13:06 -0500
Subject: [PATCH 5/7] Bumped required_conan_version to clear "failed" label

---
 recipes/msys2/all/conanfile.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/recipes/msys2/all/conanfile.py b/recipes/msys2/all/conanfile.py
index 27d8a46ab4cf2..2b2c35b0746fd 100644
--- a/recipes/msys2/all/conanfile.py
+++ b/recipes/msys2/all/conanfile.py
@@ -9,7 +9,7 @@
 import errno
 import ctypes
 
-required_conan_version = ">=1.49.0"
+required_conan_version = ">=1.55.0"
 
 class lock:
     def __init__(self):

From ecd8e49a0ae224893157bb4473f7d50f04ecadea Mon Sep 17 00:00:00 2001
From: System-Arch <33330183+System-Arch@users.noreply.github.com>
Date: Fri, 20 Jan 2023 19:08:30 -0500
Subject: [PATCH 6/7] Added objdump to system_libs

---
 recipes/msys2/all/conanfile.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/recipes/msys2/all/conanfile.py b/recipes/msys2/all/conanfile.py
index 2b2c35b0746fd..f4d847b4f9782 100644
--- a/recipes/msys2/all/conanfile.py
+++ b/recipes/msys2/all/conanfile.py
@@ -178,6 +178,7 @@ def package_info(self):
         self.cpp_info.libdirs = []
         self.cpp_info.includedirs = []
         self.cpp_info.resdirs = []
+        self.cpp_info.system_libs = ["objdump"]
 
         msys_root = os.path.join(self.package_folder, "bin", "msys64")
         msys_bin = os.path.join(msys_root, "usr", "bin")

From 5640aa43df9a0d53163b6940bccb6c6aa0d3d703 Mon Sep 17 00:00:00 2001
From: System-Arch <33330183+System-Arch@users.noreply.github.com>
Date: Sun, 22 Jan 2023 18:01:07 -0500
Subject: [PATCH 7/7] @Spacelm says to ignore objdump hooks issue

Co-authored-by: SpaceIm <30052553+SpaceIm@users.noreply.github.com>
---
 recipes/msys2/all/conanfile.py | 1 -
 1 file changed, 1 deletion(-)

diff --git a/recipes/msys2/all/conanfile.py b/recipes/msys2/all/conanfile.py
index f4d847b4f9782..2b2c35b0746fd 100644
--- a/recipes/msys2/all/conanfile.py
+++ b/recipes/msys2/all/conanfile.py
@@ -178,7 +178,6 @@ def package_info(self):
         self.cpp_info.libdirs = []
         self.cpp_info.includedirs = []
         self.cpp_info.resdirs = []
-        self.cpp_info.system_libs = ["objdump"]
 
         msys_root = os.path.join(self.package_folder, "bin", "msys64")
         msys_bin = os.path.join(msys_root, "usr", "bin")