summaryrefslogtreecommitdiff
path: root/mesonbuild/compilers
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/compilers')
-rw-r--r--mesonbuild/compilers/__init__.py6
-rw-r--r--mesonbuild/compilers/c.py31
-rw-r--r--mesonbuild/compilers/compilers.py36
-rw-r--r--mesonbuild/compilers/cpp.py24
-rw-r--r--mesonbuild/compilers/fortran.py7
5 files changed, 98 insertions, 6 deletions
diff --git a/mesonbuild/compilers/__init__.py b/mesonbuild/compilers/__init__.py
index 84c87fb09..89b46b558 100644
--- a/mesonbuild/compilers/__init__.py
+++ b/mesonbuild/compilers/__init__.py
@@ -54,10 +54,13 @@ __all__ = [
'FortranCompiler',
'G95FortranCompiler',
'GnuCCompiler',
+ 'ElbrusCCompiler',
'GnuCompiler',
'GnuCPPCompiler',
+ 'ElbrusCPPCompiler',
'GnuDCompiler',
'GnuFortranCompiler',
+ 'ElbrusFortranCompiler',
'GnuObjCCompiler',
'GnuObjCPPCompiler',
'IntelCompiler',
@@ -118,6 +121,7 @@ from .c import (
CCompiler,
ClangCCompiler,
GnuCCompiler,
+ ElbrusCCompiler,
IntelCCompiler,
VisualStudioCCompiler,
)
@@ -125,6 +129,7 @@ from .cpp import (
CPPCompiler,
ClangCPPCompiler,
GnuCPPCompiler,
+ ElbrusCPPCompiler,
IntelCPPCompiler,
VisualStudioCPPCompiler,
)
@@ -139,6 +144,7 @@ from .fortran import (
FortranCompiler,
G95FortranCompiler,
GnuFortranCompiler,
+ ElbrusFortranCompiler,
IntelFortranCompiler,
NAGFortranCompiler,
Open64FortranCompiler,
diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py
index dee5125f4..71fff057a 100644
--- a/mesonbuild/compilers/c.py
+++ b/mesonbuild/compilers/c.py
@@ -36,6 +36,7 @@ from .compilers import (
CompilerArgs,
CrossNoRunException,
GnuCompiler,
+ ElbrusCompiler,
IntelCompiler,
RunResult,
)
@@ -754,7 +755,7 @@ class CCompiler(Compiler):
return False
raise RuntimeError('BUG: {!r} check failed unexpectedly'.format(n))
- def get_library_naming(self, env, libtype):
+ def get_library_naming(self, env, libtype, strict=False):
'''
Get library prefixes and suffixes for the target platform ordered by
priority
@@ -762,7 +763,10 @@ class CCompiler(Compiler):
stlibext = ['a']
# We've always allowed libname to be both `foo` and `libfoo`,
# and now people depend on it
- prefixes = ['lib', '']
+ if strict and self.id != 'msvc': # lib prefix is not usually used with msvc
+ prefixes = ['lib']
+ else:
+ prefixes = ['lib', '']
# Library suffixes and prefixes
if for_darwin(env.is_cross_build(), env):
shlibext = ['dylib']
@@ -916,6 +920,29 @@ class GnuCCompiler(GnuCompiler, CCompiler):
return ['-fpch-preprocess', '-include', os.path.basename(header)]
+class ElbrusCCompiler(GnuCCompiler, ElbrusCompiler):
+ def __init__(self, exelist, version, gcc_type, is_cross, exe_wrapper=None, defines=None, **kwargs):
+ GnuCCompiler.__init__(self, exelist, version, gcc_type, is_cross, exe_wrapper, defines, **kwargs)
+ ElbrusCompiler.__init__(self, gcc_type, defines)
+
+ # It does support some various ISO standards and c/gnu 90, 9x, 1x in addition to those which GNU CC supports.
+ def get_options(self):
+ opts = {'c_std': coredata.UserComboOption('c_std', 'C language standard to use',
+ ['none', 'c89', 'c90', 'c9x', 'c99', 'c1x', 'c11',
+ 'gnu89', 'gnu90', 'gnu9x', 'gnu99', 'gnu1x', 'gnu11',
+ 'iso9899:2011', 'iso9899:1990', 'iso9899:199409', 'iso9899:1999'],
+ 'none')}
+ return opts
+
+ # Elbrus C compiler does not have lchmod, but there is only linker warning, not compiler error.
+ # So we should explicitly fail at this case.
+ def has_function(self, funcname, prefix, env, extra_args=None, dependencies=None):
+ if funcname == 'lchmod':
+ return False
+ else:
+ return super().has_function(funcname, prefix, env, extra_args, dependencies)
+
+
class IntelCCompiler(IntelCompiler, CCompiler):
def __init__(self, exelist, version, icc_type, is_cross, exe_wrapper=None, **kwargs):
CCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwargs)
diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py
index 480baa906..417cbae89 100644
--- a/mesonbuild/compilers/compilers.py
+++ b/mesonbuild/compilers/compilers.py
@@ -55,7 +55,6 @@ for _l in clike_langs:
clike_suffixes += lang_suffixes[_l]
clike_suffixes += ('h', 'll', 's')
-# XXX: Use this in is_library()?
soregex = re.compile(r'.*\.so(\.[0-9]+)?(\.[0-9]+)?(\.[0-9]+)?$')
# All these are only for C-like languages; see `clike_langs` above.
@@ -102,6 +101,10 @@ def is_object(fname):
def is_library(fname):
if hasattr(fname, 'fname'):
fname = fname.fname
+
+ if soregex.match(fname):
+ return True
+
suffix = fname.split('.')[-1]
return suffix in lib_suffixes
@@ -941,9 +944,11 @@ def get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, i
sostr = ''
else:
sostr = '.' + soversion
- if gcc_type in (GCC_STANDARD, GCC_MINGW, GCC_CYGWIN):
- # Might not be correct for mingw but seems to work.
+ if gcc_type == GCC_STANDARD:
return ['-Wl,-soname,%s%s.%s%s' % (prefix, shlib_name, suffix, sostr)]
+ elif gcc_type in (GCC_MINGW, GCC_CYGWIN):
+ # For PE/COFF the soname argument has no effect with GNU LD
+ return []
elif gcc_type == GCC_OSX:
if is_shared_module:
return []
@@ -1007,7 +1012,7 @@ def gnulike_default_include_dirs(compiler, lang):
stdout=subprocess.PIPE,
env=env
)
- stderr = p.stderr.read().decode('utf-8')
+ stderr = p.stderr.read().decode('utf-8', errors='replace')
parse_state = 0
paths = []
for line in stderr.split('\n'):
@@ -1120,6 +1125,29 @@ class GnuCompiler:
return gnulike_default_include_dirs(self.exelist, self.language)
+class ElbrusCompiler(GnuCompiler):
+ # Elbrus compiler is nearly like GCC, but does not support
+ # PCH, LTO, sanitizers and color output as of version 1.21.x.
+ def __init__(self, gcc_type, defines):
+ GnuCompiler.__init__(self, gcc_type, defines)
+ self.id = 'lcc'
+ self.base_options = ['b_pgo', 'b_coverage',
+ 'b_ndebug', 'b_staticpic',
+ 'b_lundef', 'b_asneeded']
+
+ def get_library_dirs(self):
+ env = os.environ.copy()
+ env['LC_ALL'] = 'C'
+ stdo = Popen_safe(self.exelist + ['--print-search-dirs'], env=env)[1]
+ for line in stdo.split('\n'):
+ if line.startswith('libraries:'):
+ # lcc does not include '=' in --print-search-dirs output.
+ libstr = line.split(' ', 1)[1]
+ return libstr.split(':')
+ return []
+
+
+
class ClangCompiler:
def __init__(self, clang_type):
self.id = 'clang'
diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py
index 1fa6f1573..3804059c6 100644
--- a/mesonbuild/compilers/cpp.py
+++ b/mesonbuild/compilers/cpp.py
@@ -25,6 +25,7 @@ from .compilers import (
msvc_winlibs,
ClangCompiler,
GnuCompiler,
+ ElbrusCompiler,
IntelCompiler,
)
@@ -133,6 +134,29 @@ class GnuCPPCompiler(GnuCompiler, CPPCompiler):
return ['-fpch-preprocess', '-include', os.path.basename(header)]
+class ElbrusCPPCompiler(GnuCPPCompiler, ElbrusCompiler):
+ def __init__(self, exelist, version, gcc_type, is_cross, exe_wrapper=None, defines=None, **kwargs):
+ GnuCPPCompiler.__init__(self, exelist, version, gcc_type, is_cross, exe_wrapper, defines, **kwargs)
+ ElbrusCompiler.__init__(self, gcc_type, defines)
+
+ # It does not support c++/gnu++ 17 and 1z, but still does support 0x, 1y, and gnu++98.
+ def get_options(self):
+ opts = super().get_options()
+ opts['cpp_std'] = coredata.UserComboOption('cpp_std', 'C++ language standard to use',
+ ['none', 'c++98', 'c++03', 'c++0x', 'c++11', 'c++14', 'c++1y',
+ 'gnu++98', 'gnu++03', 'gnu++0x', 'gnu++11', 'gnu++14', 'gnu++1y'],
+ 'none')
+ return opts
+
+ # Elbrus C++ compiler does not have lchmod, but there is only linker warning, not compiler error.
+ # So we should explicitly fail at this case.
+ def has_function(self, funcname, prefix, env, extra_args=None, dependencies=None):
+ if funcname == 'lchmod':
+ return False
+ else:
+ return super().has_function(funcname, prefix, env, extra_args, dependencies)
+
+
class IntelCPPCompiler(IntelCompiler, CPPCompiler):
def __init__(self, exelist, version, icc_type, is_cross, exe_wrap, **kwargs):
CPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap, **kwargs)
diff --git a/mesonbuild/compilers/fortran.py b/mesonbuild/compilers/fortran.py
index f9fcc1cd0..e61c97618 100644
--- a/mesonbuild/compilers/fortran.py
+++ b/mesonbuild/compilers/fortran.py
@@ -27,6 +27,7 @@ from .compilers import (
gnulike_buildtype_args,
gnulike_buildtype_linker_args,
Compiler,
+ ElbrusCompiler,
IntelCompiler,
)
@@ -180,6 +181,12 @@ class GnuFortranCompiler(FortranCompiler):
return ['-Wl,--out-implib=' + implibname]
+class ElbrusFortranCompiler(GnuFortranCompiler, ElbrusCompiler):
+ def __init__(self, exelist, version, gcc_type, is_cross, exe_wrapper=None, defines=None, **kwargs):
+ GnuFortranCompiler.__init__(self, exelist, version, gcc_type, is_cross, exe_wrapper, defines, **kwargs)
+ ElbrusCompiler.__init__(self, gcc_type, defines)
+
+
class G95FortranCompiler(FortranCompiler):
def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags):
super().__init__(exelist, version, is_cross, exe_wrapper=None, **kwags)