Skip to content

Commit

Permalink
vulkan system dep: determine version on cross builds
Browse files Browse the repository at this point in the history
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 mesonbuild#13910 for more details.
  • Loading branch information
sp1ritCS committed Nov 19, 2024
1 parent 6f67b10 commit be2af61
Showing 1 changed file with 21 additions and 25 deletions.
46 changes: 21 additions & 25 deletions mesonbuild/dependencies/ui.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Expand Down Expand Up @@ -235,31 +234,28 @@ def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.
self.link_args.append(lib)

if self.is_found:
get_version = '''\
#include <stdio.h>
#include <vulkan/vulkan.h>
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 <vulkan/vulkan.h>',
env=environment,
extra_args=None,
dependencies=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',
Expand Down

0 comments on commit be2af61

Please sign in to comment.