aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/compilers
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/compilers')
-rw-r--r--mesonbuild/compilers/compilers.py2
-rw-r--r--mesonbuild/compilers/cpp.py37
-rw-r--r--mesonbuild/compilers/fortran.py33
3 files changed, 60 insertions, 12 deletions
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index de5e472..6896b76 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -893,7 +893,7 @@ class Compiler(HoldableObject, metaclass=abc.ABCMeta):
def openmp_link_flags(self) -> T.List[str]:
return self.openmp_flags()
- def language_stdlib_only_link_flags(self) -> T.List[str]:
+ def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
return []
def gnu_symbol_visibility_args(self, vistype: str) -> T.List[str]:
diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py
index ecc911d..6cbc265 100644
--- a/mesonbuild/compilers/cpp.py
+++ b/mesonbuild/compilers/cpp.py
@@ -246,13 +246,31 @@ class ClangCPPCompiler(ClangCompiler, CPPCompiler):
return libs
return []
- def language_stdlib_only_link_flags(self) -> T.List[str]:
- return ['-lstdc++']
+ def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
+ # We need to apply the search prefix here, as these link arguments may
+ # be passed to a differen compiler with a different set of default
+ # search paths, such as when using Clang for C/C++ and gfortran for
+ # fortran,
+ search_dir = self._get_search_dirs(env)
+ search_dirs: T.List[str] = []
+ if search_dir is not None:
+ for d in search_dir.split()[-1][len('libraries: ='):].split(':'):
+ search_dirs.append(f'-L{d}')
+ return search_dirs + ['-lstdc++']
class AppleClangCPPCompiler(ClangCPPCompiler):
- def language_stdlib_only_link_flags(self) -> T.List[str]:
- return ['-lc++']
+ def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
+ # We need to apply the search prefix here, as these link arguments may
+ # be passed to a differen compiler with a different set of default
+ # search paths, such as when using Clang for C/C++ and gfortran for
+ # fortran,
+ search_dir = self._get_search_dirs(env)
+ search_dirs: T.List[str] = []
+ if search_dir is not None:
+ for d in search_dir.split()[-1][len('libraries: ='):].split(':'):
+ search_dirs.append(f'-L{d}')
+ return search_dirs + ['-lc++']
class EmscriptenCPPCompiler(EmscriptenMixin, ClangCPPCompiler):
@@ -396,7 +414,16 @@ class GnuCPPCompiler(GnuCompiler, CPPCompiler):
def get_pch_use_args(self, pch_dir: str, header: str) -> T.List[str]:
return ['-fpch-preprocess', '-include', os.path.basename(header)]
- def language_stdlib_only_link_flags(self) -> T.List[str]:
+ def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
+ # We need to apply the search prefix here, as these link arguments may
+ # be passed to a differen compiler with a different set of default
+ # search paths, such as when using Clang for C/C++ and gfortran for
+ # fortran,
+ search_dir = self._get_search_dirs(env)
+ search_dirs: T.List[str] = []
+ if search_dir is not None:
+ for d in search_dir.split()[-1][len('libraries: ='):].split(':'):
+ search_dirs.append(f'-L{d}')
return ['-lstdc++']
diff --git a/mesonbuild/compilers/fortran.py b/mesonbuild/compilers/fortran.py
index 639c40f..5d72f4b 100644
--- a/mesonbuild/compilers/fortran.py
+++ b/mesonbuild/compilers/fortran.py
@@ -211,8 +211,17 @@ class GnuFortranCompiler(GnuCompiler, FortranCompiler):
def get_module_outdir_args(self, path: str) -> T.List[str]:
return ['-J' + path]
- def language_stdlib_only_link_flags(self) -> T.List[str]:
- return ['-lgfortran', '-lm']
+ def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
+ # We need to apply the search prefix here, as these link arguments may
+ # be passed to a differen compiler with a different set of default
+ # search paths, such as when using Clang for C/C++ and gfortran for
+ # fortran,
+ search_dir = self._get_search_dirs(env)
+ search_dirs: T.List[str] = []
+ if search_dir is not None:
+ for d in search_dir.split()[-1][len('libraries: ='):].split(':'):
+ search_dirs.append(f'-L{d}')
+ return search_dirs + ['-lgfortran', '-lm']
def has_header(self, hname: str, prefix: str, env: 'Environment', *,
extra_args: T.Union[None, T.List[str], T.Callable[['CompileCheckMode'], T.List[str]]] = None,
@@ -336,7 +345,8 @@ class IntelFortranCompiler(IntelGnuLikeCompiler, FortranCompiler):
def get_preprocess_only_args(self) -> T.List[str]:
return ['-cpp', '-EP']
- def language_stdlib_only_link_flags(self) -> T.List[str]:
+ def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
+ # TODO: needs default search path added
return ['-lifcore', '-limf']
def get_dependency_gen_args(self, outtarget: str, outfile: str) -> T.List[str]:
@@ -420,7 +430,8 @@ class PGIFortranCompiler(PGICompiler, FortranCompiler):
'2': default_warn_args,
'3': default_warn_args + ['-Mdclchk']}
- def language_stdlib_only_link_flags(self) -> T.List[str]:
+ def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
+ # TODO: needs default search path added
return ['-lpgf90rtl', '-lpgf90', '-lpgf90_rpm1', '-lpgf902',
'-lpgf90rtl', '-lpgftnrtl', '-lrt']
@@ -461,8 +472,18 @@ class FlangFortranCompiler(ClangCompiler, FortranCompiler):
'2': default_warn_args,
'3': default_warn_args}
- def language_stdlib_only_link_flags(self) -> T.List[str]:
- return ['-lflang', '-lpgmath']
+ def language_stdlib_only_link_flags(self, env: 'Environment') -> T.List[str]:
+ # We need to apply the search prefix here, as these link arguments may
+ # be passed to a differen compiler with a different set of default
+ # search paths, such as when using Clang for C/C++ and gfortran for
+ # fortran,
+ # XXX: Untested....
+ search_dir = self._get_search_dirs(env)
+ search_dirs: T.List[str] = []
+ if search_dir is not None:
+ for d in search_dir.split()[-1][len('libraries: ='):].split(':'):
+ search_dirs.append(f'-L{d}')
+ return search_dirs + ['-lflang', '-lpgmath']
class Open64FortranCompiler(FortranCompiler):