From ce6099b70402e34dc2b151bd56abf2c251a372e4 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 25 Sep 2017 10:32:41 -0700 Subject: deps: flatten module argument to LLVM dependency So that nested lists can be passed. --- mesonbuild/dependencies/dev.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index f991d3c..fb27721 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -182,7 +182,7 @@ class LLVMDependency(ExternalDependency): raise DependencyException('Could not generate modules for LLVM.') self.modules = shlex.split(out) - modules = mesonlib.stringlistify(kwargs.get('modules', [])) + modules = mesonlib.stringlistify(mesonlib.flatten(kwargs.get('modules', []))) for mod in modules: if mod not in self.modules: mlog.log('LLVM module', mod, 'found:', mlog.red('NO')) -- cgit v1.1 From 95ba1fcab2d4c34b31c70b2ab9b98e4c0c43ad56 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 25 Sep 2017 10:33:13 -0700 Subject: deps: convert LLVM modules to a set before checking for them This allows the logic in a meson.build file to be simplified (ie, some dependencies can add the same module requirements) but meson will only check for them once. Since set is inherently unordered, use sorted to make the output deterministic. --- mesonbuild/dependencies/dev.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index fb27721..f4f4306 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -183,7 +183,7 @@ class LLVMDependency(ExternalDependency): self.modules = shlex.split(out) modules = mesonlib.stringlistify(mesonlib.flatten(kwargs.get('modules', []))) - for mod in modules: + for mod in sorted(set(modules)): if mod not in self.modules: mlog.log('LLVM module', mod, 'found:', mlog.red('NO')) self.is_found = False -- cgit v1.1 From 035bee5c543b9809abc1db8a8b93bf8d8205b5a7 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Tue, 26 Sep 2017 12:15:12 -0700 Subject: deps: demote LLVM config to instance variable Which fixes trying to use multiple versions of LLVM, and allows simplifying the class somewhat. --- mesonbuild/dependencies/dev.py | 71 ++++++++++++++----------------- test cases/frameworks/15 llvm/meson.build | 5 +-- 2 files changed, 35 insertions(+), 41 deletions(-) diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index f4f4306..aba4695 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -129,9 +129,6 @@ class LLVMDependency(ExternalDependency): 'llvm-config-3.5', 'llvm-config35', 'llvm-config-5.0', 'llvm-config-devel', # development snapshot ] - llvmconfig = None - _llvmconfig_found = False - __best_found = None __cpp_blacklist = {'-DNDEBUG'} def __init__(self, environment, kwargs): @@ -139,11 +136,12 @@ class LLVMDependency(ExternalDependency): # the C linker works fine if only using the C API. super().__init__('llvm-config', environment, 'cpp', kwargs) self.modules = [] + self.llvmconfig = None + self.__best_found = None # FIXME: Support multiple version requirements ala PkgConfigDependency req_version = kwargs.get('version', None) + self.check_llvmconfig(req_version) if self.llvmconfig is None: - self.check_llvmconfig(req_version) - if not self._llvmconfig_found: if self.__best_found is not None: mlog.log('found {!r} but need:'.format(self.__best_found), req_version) @@ -159,28 +157,30 @@ class LLVMDependency(ExternalDependency): mlog.debug('stdout: {}\nstderr: {}'.format(out, err)) if self.required: raise DependencyException('Dependency LLVM not found') + mlog.log('Dependency LLVM found:', mlog.red('NO')) return - else: - self.version = out.strip() - mlog.log('Dependency LLVM found:', mlog.green('YES')) - self.is_found = True - p, out = Popen_safe( - [self.llvmconfig, '--libs', '--ldflags', '--system-libs'])[:2] - if p.returncode != 0: - raise DependencyException('Could not generate libs for LLVM.') - self.link_args = shlex.split(out) + mlog.log('Dependency LLVM found:', mlog.green('YES')) + self.is_found = True - p, out = Popen_safe([self.llvmconfig, '--cppflags'])[:2] - if p.returncode != 0: - raise DependencyException('Could not generate includedir for LLVM.') - cargs = mesonlib.OrderedSet(shlex.split(out)) - self.compile_args = list(cargs.difference(self.__cpp_blacklist)) + self.version = out.strip() - p, out = Popen_safe([self.llvmconfig, '--components'])[:2] - if p.returncode != 0: - raise DependencyException('Could not generate modules for LLVM.') - self.modules = shlex.split(out) + p, out = Popen_safe( + [self.llvmconfig, '--libs', '--ldflags', '--system-libs'])[:2] + if p.returncode != 0: + raise DependencyException('Could not generate libs for LLVM.') + self.link_args = shlex.split(out) + + p, out = Popen_safe([self.llvmconfig, '--cppflags'])[:2] + if p.returncode != 0: + raise DependencyException('Could not generate includedir for LLVM.') + cargs = mesonlib.OrderedSet(shlex.split(out)) + self.compile_args = list(cargs.difference(self.__cpp_blacklist)) + + p, out = Popen_safe([self.llvmconfig, '--components'])[:2] + if p.returncode != 0: + raise DependencyException('Could not generate modules for LLVM.') + self.modules = shlex.split(out) modules = mesonlib.stringlistify(mesonlib.flatten(kwargs.get('modules', []))) for mod in sorted(set(modules)): @@ -193,38 +193,33 @@ class LLVMDependency(ExternalDependency): else: mlog.log('LLVM module', mod, 'found:', mlog.green('YES')) - @classmethod - def check_llvmconfig(cls, version_req): + def check_llvmconfig(self, version_req): """Try to find the highest version of llvm-config.""" - for llvmconfig in cls.llvm_config_bins: + for llvmconfig in self.llvm_config_bins: try: p, out = Popen_safe([llvmconfig, '--version'])[0:2] out = out.strip() if p.returncode != 0: continue - # FIXME: As soon as some llvm-config is found, version checks - # in further dependnecy() calls will be ignored if version_req: if version_compare(out, version_req, strict=True): - if cls.__best_found and version_compare(out, '<={}'.format(cls.__best_found), strict=True): + if self.__best_found and version_compare( + out, '<={}'.format(self.__best_found), strict=True): continue - cls.__best_found = out - cls.llvmconfig = llvmconfig + self.__best_found = out + self.llvmconfig = llvmconfig else: # If no specific version is requested use the first version # found, since that should be the best. - cls.__best_found = out - cls.llvmconfig = llvmconfig + self.__best_found = out + self.llvmconfig = llvmconfig break except (FileNotFoundError, PermissionError): pass - if cls.__best_found: + if self.__best_found: mlog.log('Found llvm-config:', - mlog.bold(shutil.which(cls.llvmconfig)), + mlog.bold(shutil.which(self.llvmconfig)), '({})'.format(out.strip())) - cls._llvmconfig_found = True - else: - cls.llvmconfig = False def need_threads(self): return True diff --git a/test cases/frameworks/15 llvm/meson.build b/test cases/frameworks/15 llvm/meson.build index af7f8c6..e1d97cb 100644 --- a/test cases/frameworks/15 llvm/meson.build +++ b/test cases/frameworks/15 llvm/meson.build @@ -10,8 +10,7 @@ llvm_dep = dependency( d = dependency('llvm', modules : 'not-found', required : false) assert(d.found() == false, 'not-found llvm module found') -# XXX: Version checks are broken, see FIXME in LLVMDependency -#d = dependency('llvm', version : '<0.1', required : false) -#assert(d.found() == false, 'ancient llvm module found') +d = dependency('llvm', version : '<0.1', required : false) +assert(d.found() == false, 'ancient llvm module found') executable('sum', 'sum.c', dependencies : llvm_dep) -- cgit v1.1 From 5a8d1b6431c80c53ea9f2de155906f67a9f664bc Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Tue, 26 Sep 2017 13:05:30 -0700 Subject: deps: strip 'svn' from LLVM version --- mesonbuild/dependencies/dev.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index aba4695..d2dd107 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -163,7 +163,10 @@ class LLVMDependency(ExternalDependency): mlog.log('Dependency LLVM found:', mlog.green('YES')) self.is_found = True - self.version = out.strip() + # Currently meson doesn't really atempt to handle pre-release versions, + # so strip the 'svn' off the end, since it will probably cuase problems + # for users who want the patch version. + self.version = out.strip().rstrip('svn') p, out = Popen_safe( [self.llvmconfig, '--libs', '--ldflags', '--system-libs'])[:2] -- cgit v1.1