Merge pull request #7256 from peterh/openmp

Fix OpenMP on Visual Studio
pull/3865/merge
Jussi Pakkanen 5 years ago committed by GitHub
commit 508a0d6073
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 34
      mesonbuild/backend/vs2010backend.py
  2. 3
      mesonbuild/compilers/compilers.py
  3. 3
      mesonbuild/compilers/mixins/visualstudio.py
  4. 3
      mesonbuild/dependencies/misc.py

@ -992,23 +992,23 @@ class Vs2010Backend(backends.Backend):
# Cflags required by external deps might have UNIX-specific flags, # Cflags required by external deps might have UNIX-specific flags,
# so filter them out if needed # so filter them out if needed
if isinstance(d, dependencies.OpenMPDependency): if isinstance(d, dependencies.OpenMPDependency):
d_compile_args = compiler.openmp_flags() ET.SubElement(clconf, 'OpenMPSupport').text = 'true'
else: else:
d_compile_args = compiler.unix_args_to_native(d.get_compile_args()) d_compile_args = compiler.unix_args_to_native(d.get_compile_args())
for arg in d_compile_args: for arg in d_compile_args:
if arg.startswith(('-D', '/D')): if arg.startswith(('-D', '/D')):
define = arg[2:] define = arg[2:]
# De-dup # De-dup
if define in target_defines: if define in target_defines:
target_defines.remove(define) target_defines.remove(define)
target_defines.append(define) target_defines.append(define)
elif arg.startswith(('-I', '/I')): elif arg.startswith(('-I', '/I')):
inc_dir = arg[2:] inc_dir = arg[2:]
# De-dup # De-dup
if inc_dir not in target_inc_dirs: if inc_dir not in target_inc_dirs:
target_inc_dirs.append(inc_dir) target_inc_dirs.append(inc_dir)
else: else:
target_args.append(arg) target_args.append(arg)
languages += gen_langs languages += gen_langs
if len(target_args) > 0: if len(target_args) > 0:
@ -1100,14 +1100,14 @@ class Vs2010Backend(backends.Backend):
# Extend without reordering or de-dup to preserve `-L -l` sets # Extend without reordering or de-dup to preserve `-L -l` sets
# https://github.com/mesonbuild/meson/issues/1718 # https://github.com/mesonbuild/meson/issues/1718
if isinstance(dep, dependencies.OpenMPDependency): if isinstance(dep, dependencies.OpenMPDependency):
extra_link_args.extend_direct(compiler.openmp_flags()) ET.SubElement(clconf, 'OpenMPSuppport').text = 'true'
else: else:
extra_link_args.extend_direct(dep.get_link_args()) extra_link_args.extend_direct(dep.get_link_args())
for d in target.get_dependencies(): for d in target.get_dependencies():
if isinstance(d, build.StaticLibrary): if isinstance(d, build.StaticLibrary):
for dep in d.get_external_deps(): for dep in d.get_external_deps():
if isinstance(dep, dependencies.OpenMPDependency): if isinstance(dep, dependencies.OpenMPDependency):
extra_link_args.extend_direct(compiler.openmp_flags()) ET.SubElement(clconf, 'OpenMPSuppport').text = 'true'
else: else:
extra_link_args.extend_direct(dep.get_link_args()) extra_link_args.extend_direct(dep.get_link_args())
# Add link args for c_* or cpp_* build options. Currently this only # Add link args for c_* or cpp_* build options. Currently this only

@ -1087,6 +1087,9 @@ class Compiler:
def openmp_flags(self): def openmp_flags(self):
raise EnvironmentException('Language %s does not support OpenMP flags.' % self.get_display_language()) raise EnvironmentException('Language %s does not support OpenMP flags.' % self.get_display_language())
def openmp_link_flags(self):
return self.openmp_flags()
def language_stdlib_only_link_flags(self): def language_stdlib_only_link_flags(self):
return [] return []

@ -208,6 +208,9 @@ class VisualStudioLikeCompiler(metaclass=abc.ABCMeta):
def openmp_flags(self) -> T.List[str]: def openmp_flags(self) -> T.List[str]:
return ['/openmp'] return ['/openmp']
def openmp_link_flags(self) -> T.List[str]:
return []
# FIXME, no idea what these should be. # FIXME, no idea what these should be.
def thread_flags(self, env: 'Environment') -> T.List[str]: def thread_flags(self, env: 'Environment') -> T.List[str]:
return [] return []

@ -97,7 +97,8 @@ class OpenMPDependency(ExternalDependency):
for name in header_names: for name in header_names:
if self.clib_compiler.has_header(name, '', self.env, dependencies=[self], disable_cache=True)[0]: if self.clib_compiler.has_header(name, '', self.env, dependencies=[self], disable_cache=True)[0]:
self.is_found = True self.is_found = True
self.compile_args = self.link_args = self.clib_compiler.openmp_flags() self.compile_args = self.clib_compiler.openmp_flags()
self.link_args = self.clib_compiler.openmp_link_flags()
break break
if not self.is_found: if not self.is_found:
mlog.log(mlog.yellow('WARNING:'), 'OpenMP found but omp.h missing.') mlog.log(mlog.yellow('WARNING:'), 'OpenMP found but omp.h missing.')

Loading…
Cancel
Save