From 1cb13f33c1ac0f22a54e2d8bc3d4052e0952186a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20=22sp1rit=22=E2=80=8B?= Date: Sat, 16 Nov 2024 13:43:48 +0100 Subject: [PATCH] vulkan system dep: determine version on cross builds Currently, the vulkan system dep detects its vulkan version by building and running: int main() { printf("%i.%i.%i", VK_VERSION_MAJOR(VK_HEADER_VERSION_COMPLETE), VK_VERSION_MINOR(VK_HEADER_VERSION_COMPLETE), VK_VERSION_PATCH(VK_HEADER_VERSION_COMPLETE)); return 0; } this causes cross builds that do not have the possibility of running on the build machine to evaluate the vulkan dependency with an 'Unknown' version. Instead of evaluating beforementioned piece of C code, the new implementation will instead use cc.compute_int to evaluate the three preprocessor macros. This is relativly expensive for cross builds right now but further optimizations can be made. See #13910 for more details. --- mesonbuild/dependencies/ui.py | 45 ++++++++++++++++------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/mesonbuild/dependencies/ui.py b/mesonbuild/dependencies/ui.py index d88af7945c7c..0cb2237653e5 100644 --- a/mesonbuild/dependencies/ui.py +++ b/mesonbuild/dependencies/ui.py @@ -12,7 +12,6 @@ from .. import mlog from .. import mesonlib -from ..compilers.compilers import CrossNoRunException from ..mesonlib import ( Popen_safe, extract_as_list, version_compare_many ) @@ -235,31 +234,27 @@ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T. self.link_args.append(lib) if self.is_found: - get_version = '''\ -#include -#include - -int main() { - printf("%i.%i.%i", VK_VERSION_MAJOR(VK_HEADER_VERSION_COMPLETE), - VK_VERSION_MINOR(VK_HEADER_VERSION_COMPLETE), - VK_VERSION_PATCH(VK_HEADER_VERSION_COMPLETE)); - return 0; -} -''' try: - run = self.clib_compiler.run(get_version, environment, extra_args=self.compile_args) - except CrossNoRunException: - run = None - if run and run.compiled and run.returncode == 0: - self.version = run.stdout - elif self.vulkan_sdk: - # fall back to heuristics: detect version number in path - # matches the default install path on Windows - match = re.search(rf'VulkanSDK{re.escape(os.path.sep)}([0-9]+(?:\.[0-9]+)+)', self.vulkan_sdk) - if match: - self.version = match.group(1) - else: - mlog.warning(f'Environment variable VULKAN_SDK={self.vulkan_sdk} is present, but Vulkan version could not be extracted.') + # VK_VERSION_* is deprecated and replaced by VK_API_VERSION_*. We'll continue to use the old one in + # order to support older Vulkan versions that don't have the new one yet, but we might have to update + # this code to also check VK_API_VERSION in the future if they decide to drop the old one at some point. + components = map(lambda c: str(self.clib_compiler.compute_int(f'VK_VERSION_{c[0]}(VK_HEADER_VERSION_COMPLETE)', + low=0, high=None, guess=c[1], + prefix='#include ', + env=environment, + extra_args=None)), + # list containing vulkan version components and their expected value + [('MAJOR', 1), ('MINOR', 3), ('PATCH', None)]) + self.version = '.'.join(components) + except mesonlib.EnvironmentException: + if self.vulkan_sdk: + # fall back to heuristics: detect version number in path + # matches the default install path on Windows + match = re.search(rf'VulkanSDK{re.escape(os.path.sep)}([0-9]+(?:\.[0-9]+)+)', self.vulkan_sdk) + if match: + self.version = match.group(1) + else: + mlog.warning(f'Environment variable VULKAN_SDK={self.vulkan_sdk} is present, but Vulkan version could not be extracted.') packages['gl'] = gl_factory = DependencyFactory( 'gl',