Merge pull request #5823 from scivision/linker-pgi-linux

PGI compiler fixes
pull/5799/head
Jussi Pakkanen 5 years ago committed by GitHub
commit d67d5411bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      mesonbuild/backend/ninjabackend.py
  2. 6
      mesonbuild/compilers/mixins/pgi.py
  3. 5
      mesonbuild/environment.py
  4. 16
      mesonbuild/linkers.py
  5. 3
      run_project_tests.py

@ -28,7 +28,8 @@ from .. import build
from .. import mlog from .. import mlog
from .. import dependencies from .. import dependencies
from .. import compilers from .. import compilers
from ..compilers import Compiler, CompilerArgs, CCompiler, VisualStudioLikeCompiler, FortranCompiler from ..compilers import (Compiler, CompilerArgs, CCompiler, FortranCompiler,
PGICCompiler, VisualStudioLikeCompiler)
from ..linkers import ArLinker from ..linkers import ArLinker
from ..mesonlib import ( from ..mesonlib import (
File, LibType, MachineChoice, MesonException, OrderedSet, PerMachine, ProgressBar, quote_arg File, LibType, MachineChoice, MesonException, OrderedSet, PerMachine, ProgressBar, quote_arg
@ -234,6 +235,9 @@ class NinjaBackend(backends.Backend):
# IFort on windows is MSVC like, but doesn't have /showincludes # IFort on windows is MSVC like, but doesn't have /showincludes
if isinstance(compiler, FortranCompiler): if isinstance(compiler, FortranCompiler):
continue continue
if isinstance(compiler, PGICCompiler) and mesonlib.is_windows():
# for the purpose of this function, PGI doesn't act enough like MSVC
return open(tempfilename, 'a', encoding='utf-8')
if isinstance(compiler, VisualStudioLikeCompiler): if isinstance(compiler, VisualStudioLikeCompiler):
break break
else: else:

@ -56,7 +56,7 @@ class PGICompiler:
def get_pic_args(self) -> typing.List[str]: def get_pic_args(self) -> typing.List[str]:
# PGI -fPIC is Linux only. # PGI -fPIC is Linux only.
if self.compiler_type.is_linux_compiler(): if self.compiler_type.is_standard_compiler:
return ['-fPIC'] return ['-fPIC']
return [] return []
@ -97,3 +97,7 @@ class PGICompiler:
'-I{}'.format(hdr.parent)] '-I{}'.format(hdr.parent)]
else: else:
return [] return []
def thread_flags(self, env):
# PGI cannot accept -pthread, it's already threaded
return []

@ -51,6 +51,7 @@ from .linkers import (
MSVCDynamicLinker, MSVCDynamicLinker,
OptlinkDynamicLinker, OptlinkDynamicLinker,
PGIDynamicLinker, PGIDynamicLinker,
PGIStaticLinker,
SolarisDynamicLinker, SolarisDynamicLinker,
XildAppleDynamicLinker, XildAppleDynamicLinker,
XildLinuxDynamicLinker, XildLinuxDynamicLinker,
@ -1340,6 +1341,8 @@ class Environment:
elif isinstance(compiler, IntelClCCompiler): elif isinstance(compiler, IntelClCCompiler):
# Intel has it's own linker that acts like microsoft's lib # Intel has it's own linker that acts like microsoft's lib
linkers = ['xilib'] linkers = ['xilib']
elif isinstance(compiler, (PGICCompiler, PGIFortranCompiler)) and mesonlib.is_windows():
linkers = [self.default_static_linker] # this is just a wrapper calling link/lib on Windows, keeping things simple.
else: else:
linkers = [self.default_static_linker] linkers = [self.default_static_linker]
popen_exceptions = {} popen_exceptions = {}
@ -1357,6 +1360,8 @@ class Environment:
return IntelVisualStudioLinker(linker, getattr(compiler, 'machine', None)) return IntelVisualStudioLinker(linker, getattr(compiler, 'machine', None))
if '/OUT:' in out.upper() or '/OUT:' in err.upper(): if '/OUT:' in out.upper() or '/OUT:' in err.upper():
return VisualStudioLinker(linker, getattr(compiler, 'machine', None)) return VisualStudioLinker(linker, getattr(compiler, 'machine', None))
if 'ar-Error-Unknown switch: --version' in err:
return PGIStaticLinker(linker)
if p.returncode == 0 and ('armar' in linker or 'armar.exe' in linker): if p.returncode == 0 and ('armar' in linker or 'armar.exe' in linker):
return ArmarLinker(linker) return ArmarLinker(linker)
if 'DMD32 D Compiler' in out or 'DMD64 D Compiler' in out: if 'DMD32 D Compiler' in out or 'DMD64 D Compiler' in out:

@ -739,18 +739,30 @@ class PGIDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):
# PGI -shared is Linux only. # PGI -shared is Linux only.
if mesonlib.is_windows(): if mesonlib.is_windows():
return ['-Bdynamic', '-Mmakedll'] return ['-Bdynamic', '-Mmakedll']
elif mesonlib.is_linux: elif mesonlib.is_linux():
return ['-shared'] return ['-shared']
return [] return []
def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str, def build_rpath_args(self, env: 'Environment', build_dir: str, from_dir: str,
rpath_paths: str, build_rpath: str, rpath_paths: str, build_rpath: str,
install_rpath: str) -> typing.List[str]: install_rpath: str) -> typing.List[str]:
if env.machines[self.for_machine].is_windows(): if not env.machines[self.for_machine].is_windows():
return ['-R' + os.path.join(build_dir, p) for p in rpath_paths] return ['-R' + os.path.join(build_dir, p) for p in rpath_paths]
return [] return []
class PGIStaticLinker(StaticLinker):
def __init__(self, exelist: typing.List[str]):
super().__init__(exelist)
self.id = 'ar'
self.std_args = ['-r']
def get_std_link_args(self) -> typing.List[str]:
return self.std_args
def get_output_args(self, target: str) -> typing.List[str]:
return [target]
class VisualStudioLikeLinkerMixin: class VisualStudioLikeLinkerMixin:
_BUILDTYPE_ARGS = { _BUILDTYPE_ARGS = {

@ -114,7 +114,8 @@ def get_relative_files_list_from_dir(fromdir: Path) -> typing.List[Path]:
def platform_fix_name(fname: str, compiler, env) -> str: def platform_fix_name(fname: str, compiler, env) -> str:
# canonicalize compiler # canonicalize compiler
if compiler in {'clang-cl', 'intel-cl'}: if (compiler in {'clang-cl', 'intel-cl'} or
(env.machines.host.is_windows() and compiler == 'pgi')):
canonical_compiler = 'msvc' canonical_compiler = 'msvc'
else: else:
canonical_compiler = compiler canonical_compiler = compiler

Loading…
Cancel
Save