move UserArrayOption.listify_value to mesonlib

This function is used at 3 different places and it does not justify it
as being a staticmethod instead of being a free function.
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
index bb481ca..1123107 100644
--- a/mesonbuild/coredata.py
+++ b/mesonbuild/coredata.py
@@ -20,7 +20,7 @@
     PerMachineDefaultable, default_libdir, default_libexecdir,
     default_prefix, default_datadir, default_includedir, default_infodir,
     default_localedir, default_mandir, default_sbindir, default_sysconfdir,
-    split_args, OptionKey, OptionType, stringlistify,
+    listify_array_value, OptionKey, OptionType, stringlistify,
     pickle_load
 )
 from .wrap import WrapMode
@@ -268,29 +268,8 @@
         self.allow_dups = allow_dups
         self.set_value(value)
 
-    @staticmethod
-    def listify_value(value: T.Union[str, T.List[str]], shlex_split_args: bool = False) -> T.List[str]:
-        if isinstance(value, str):
-            if value.startswith('['):
-                try:
-                    newvalue = ast.literal_eval(value)
-                except ValueError:
-                    raise MesonException(f'malformed option {value}')
-            elif value == '':
-                newvalue = []
-            else:
-                if shlex_split_args:
-                    newvalue = split_args(value)
-                else:
-                    newvalue = [v.strip() for v in value.split(',')]
-        elif isinstance(value, list):
-            newvalue = value
-        else:
-            raise MesonException(f'"{value}" should be a string array, but it is not')
-        return newvalue
-
     def listify(self, value: T.Any) -> T.List[T.Any]:
-        return self.listify_value(value, self.split_args)
+        return listify_array_value(value, self.split_args)
 
     def validate_value(self, value: T.Union[str, T.List[str]]) -> T.List[str]:
         newvalue = self.listify(value)
@@ -364,7 +343,7 @@
                 self.choices += gnu_stds_map.keys()
 
     def validate_value(self, value: T.Union[str, T.List[str]]) -> str:
-        candidates = UserArrayOption.listify_value(value)
+        candidates = listify_array_value(value)
         unknown = [std for std in candidates if std not in self.all_stds]
         if unknown:
             raise MesonException(f'Unknown {self.lang.upper()} std {unknown}. Possible values are {self.all_stds}.')
diff --git a/mesonbuild/mcompile.py b/mesonbuild/mcompile.py
index 9c2f5e1..b07b60a 100644
--- a/mesonbuild/mcompile.py
+++ b/mesonbuild/mcompile.py
@@ -16,16 +16,15 @@
 
 from . import mlog
 from . import mesonlib
-from .mesonlib import MesonException, RealPathAction, join_args, setup_vsenv
+from .mesonlib import MesonException, RealPathAction, join_args, listify_array_value, setup_vsenv
 from mesonbuild.environment import detect_ninja
-from mesonbuild.coredata import UserArrayOption
 from mesonbuild import build
 
 if T.TYPE_CHECKING:
     import argparse
 
 def array_arg(value: str) -> T.List[str]:
-    return UserArrayOption.listify_value(value)
+    return listify_array_value(value)
 
 def validate_builddir(builddir: Path) -> None:
     if not (builddir / 'meson-private' / 'coredata.dat').is_file():
diff --git a/mesonbuild/utils/universal.py b/mesonbuild/utils/universal.py
index 0fb8607..a538345 100644
--- a/mesonbuild/utils/universal.py
+++ b/mesonbuild/utils/universal.py
@@ -7,6 +7,7 @@
 from __future__ import annotations
 from pathlib import Path
 import argparse
+import ast
 import enum
 import sys
 import stat
@@ -129,6 +130,7 @@
     'iter_regexin_iter',
     'join_args',
     'listify',
+    'listify_array_value',
     'partition',
     'path_is_in_root',
     'pickle_load',
@@ -1435,6 +1437,26 @@
             result.append(i)
     return result
 
+def listify_array_value(value: T.Union[str, T.List[str]], shlex_split_args: bool = False) -> T.List[str]:
+    if isinstance(value, str):
+        if value.startswith('['):
+            try:
+                newvalue = ast.literal_eval(value)
+            except ValueError:
+                raise MesonException(f'malformed value {value}')
+        elif value == '':
+            newvalue = []
+        else:
+            if shlex_split_args:
+                newvalue = split_args(value)
+            else:
+                newvalue = [v.strip() for v in value.split(',')]
+    elif isinstance(value, list):
+        newvalue = value
+    else:
+        raise MesonException(f'"{value}" should be a string array, but it is not')
+    assert isinstance(newvalue, list)
+    return newvalue
 
 def extract_as_list(dict_object: T.Dict[_T, _U], key: _T, pop: bool = False) -> T.List[_U]:
     '''