From 484fca9866f6b477a2ca30bb75be8a15de598e66 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 8 Oct 2018 15:40:15 -0700 Subject: compilers: Fix the set of features that ICC exposes --- mesonbuild/compilers/compilers.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index 85a8480..ca8c09c 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -1731,10 +1731,17 @@ class ArmclangCompiler: return ['--symdefs=' + implibname] -# Tested on linux for ICC 14.0.3, 15.0.6, 16.0.4, 17.0.1 +# Tested on linux for ICC 14.0.3, 15.0.6, 16.0.4, 17.0.1, 19.0.0 class IntelCompiler(GnuLikeCompiler): def __init__(self, compiler_type): super().__init__(compiler_type) + # As of 19.0.0 ICC doesn't have sanitizer, color, or lto support. + # + # It does have IPO, which serves much the same purpose as LOT, but + # there is an unfortunate rule for using IPO (you can't control the + # name of the output file) which break assumptions meson makes + self.base_options = ['b_pch', 'b_lundef', 'b_asneeded', 'b_pgo', + 'b_coverage', 'b_ndebug', 'b_staticpic', 'b_pie'] self.id = 'intel' self.lang_header = 'none' -- cgit v1.1 From 21a7528b2fe3176445d918e921fe374acafb6de2 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Fri, 28 Sep 2018 10:08:14 -0700 Subject: compilers/c_function_attributes: fix for ICC ICC doesn't like the extra set of parens, GCC 8.2.1 and Clang 6.0.1 don't have a problem with this. --- mesonbuild/compilers/c_function_attributes.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/c_function_attributes.py b/mesonbuild/compilers/c_function_attributes.py index 9aeaaf2..a522a1a 100644 --- a/mesonbuild/compilers/c_function_attributes.py +++ b/mesonbuild/compilers/c_function_attributes.py @@ -91,10 +91,10 @@ C_FUNC_ATTRIBUTES = { 'used': 'int foo(void) __attribute__((used));', 'visibility': ''' - int foo_def(void) __attribute__((visibility(("default")))); - int foo_hid(void) __attribute__((visibility(("hidden")))); - int foo_int(void) __attribute__((visibility(("internal")))); - int foo_pro(void) __attribute__((visibility(("protected"))));''', + int foo_def(void) __attribute__((visibility("default"))); + int foo_hid(void) __attribute__((visibility("hidden"))); + int foo_int(void) __attribute__((visibility("internal"))); + int foo_pro(void) __attribute__((visibility("protected")));''', 'warning': 'int foo(void) __attribute__((warning("")));', 'warn_unused_result': -- cgit v1.1 From 28fd725d61bec363d9bcc403e78b38312dfeb276 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Tue, 9 Oct 2018 11:04:27 -0700 Subject: compilers: fix compiler.compile for Intel Compilers has_arguments is the wrong thing to fix, since all checks that require compiler options are based on compiles, it's the right thing to modify. --- mesonbuild/compilers/c.py | 8 ++++---- mesonbuild/compilers/compilers.py | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index 1b198b6..240d424 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -410,12 +410,12 @@ class CCompiler(Compiler): dependencies=dependencies) def _get_compiler_check_args(self, env, extra_args, dependencies, mode='compile'): - if callable(extra_args): - extra_args = extra_args(mode) if extra_args is None: extra_args = [] - elif isinstance(extra_args, str): - extra_args = [extra_args] + else: + extra_args = listify(extra_args) + extra_args = listify([e(mode) if callable(e) else e for e in extra_args]) + if dependencies is None: dependencies = [] elif not isinstance(dependencies, list): diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index ca8c09c..306e5d6 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -19,7 +19,10 @@ from ..linkers import StaticLinker from .. import coredata from .. import mlog from .. import mesonlib -from ..mesonlib import EnvironmentException, MesonException, OrderedSet, version_compare, Popen_safe +from ..mesonlib import ( + EnvironmentException, MesonException, OrderedSet, version_compare, + Popen_safe +) """This file contains the data files of all compilers Meson knows about. To support a new compiler, add its information below. @@ -1733,6 +1736,7 @@ class ArmclangCompiler: # Tested on linux for ICC 14.0.3, 15.0.6, 16.0.4, 17.0.1, 19.0.0 class IntelCompiler(GnuLikeCompiler): + def __init__(self, compiler_type): super().__init__(compiler_type) # As of 19.0.0 ICC doesn't have sanitizer, color, or lto support. @@ -1764,9 +1768,16 @@ class IntelCompiler(GnuLikeCompiler): else: return ['-openmp'] - def has_arguments(self, args, env, code, mode): - # -diag-error 10148 is required to catch invalid -W options - return super().has_arguments(args + ['-diag-error', '10006', '-diag-error', '10148'], env, code, mode) + def compiles(self, *args, **kwargs): + # This covers a case that .get('foo', []) doesn't, that extra_args is + # defined and is None + extra_args = kwargs.get('extra_args') or [] + kwargs['extra_args'] = [ + extra_args, + '-diag-error', '10006', # ignoring unknown option + '-diag-error', '10148', # Option not supported + ] + return super().compiles(*args, **kwargs) class ArmCompiler: -- cgit v1.1 From 7329ae3ce62ef525ea269adbfd95aad07d484abb Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Wed, 10 Oct 2018 09:42:20 -0700 Subject: fortran: ifort doesn't have -pipe --- mesonbuild/compilers/fortran.py | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/fortran.py b/mesonbuild/compilers/fortran.py index 23c4892..8eea4e7 100644 --- a/mesonbuild/compilers/fortran.py +++ b/mesonbuild/compilers/fortran.py @@ -342,6 +342,12 @@ class IntelFortranCompiler(IntelCompiler, FortranCompiler): def get_preprocess_only_args(self): return ['-cpp', '-EP'] + def get_always_args(self): + """Ifort doesn't have -pipe.""" + val = super().get_always_args() + val.remove('-pipe') + return val + class PathScaleFortranCompiler(FortranCompiler): def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags): -- cgit v1.1 From f46adb44bf7eeeb15ddaed81f73433b5e7a3bff6 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Wed, 10 Oct 2018 10:17:55 -0700 Subject: compilers: Enable PGO for ICC ICC doesn't use the same -fprofile-generate/-fprofile-use that GCC and Clang use, instead it has -prof-gen and -prof-use. I've gone ahead and added the threadsafe option to -prof-gen, as meson currently doesn't have a way to specify that level of granularity and GCC and Clang's profiles are threadsafe. --- mesonbuild/compilers/compilers.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index 306e5d6..755bd46 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -457,9 +457,9 @@ def get_base_compile_args(options, compiler): try: pgo_val = options['b_pgo'].value if pgo_val == 'generate': - args.append('-fprofile-generate') + args.extend(compiler.get_profile_generate_args()) elif pgo_val == 'use': - args.extend(['-fprofile-use', '-fprofile-correction']) + args.extend(compiler.get_profile_use_args()) except KeyError: pass try: @@ -503,9 +503,9 @@ def get_base_link_args(options, linker, is_shared_module): try: pgo_val = options['b_pgo'].value if pgo_val == 'generate': - args.append('-fprofile-generate') + args.extend(linker.get_profile_generate_args()) elif pgo_val == 'use': - args.extend(['-fprofile-use', '-fprofile-correction']) + args.extend(linker.get_profile_use_args()) except KeyError: pass try: @@ -674,7 +674,6 @@ class CompilerArgs(list): to recursively search for symbols in the libraries. This is not needed with other linkers. ''' - # A standalone argument must never be deduplicated because it is # defined by what comes _after_ it. Thus dedupping this: # -D FOO -D BAR @@ -1258,6 +1257,14 @@ class Compiler: """ return 'other' + def get_profile_generate_args(self): + raise EnvironmentException( + '%s does not support get_profile_generate_args ' % self.get_id()) + + def get_profile_use_args(self): + raise EnvironmentException( + '%s does not support get_profile_use_args ' % self.get_id()) + @enum.unique class CompilerType(enum.Enum): @@ -1498,6 +1505,12 @@ class GnuLikeCompiler(abc.ABC): def get_argument_syntax(self): return 'gcc' + def get_profile_generate_args(self): + return ['-fprofile-generate'] + + def get_profile_use_args(self): + return ['-fprofile-use', '-fprofile-correction'] + class GnuCompiler(GnuLikeCompiler): """ @@ -1779,6 +1792,12 @@ class IntelCompiler(GnuLikeCompiler): ] return super().compiles(*args, **kwargs) + def get_profile_generate_args(self): + return ['-prof-gen=threadsafe'] + + def get_profile_use_args(self): + return ['-prof-use'] + class ArmCompiler: # Functionality that is common to all ARM family compilers. -- cgit v1.1 From 3ab9620180b1f6506a7a3486044db236afbfafba Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Wed, 10 Oct 2018 11:42:35 -0700 Subject: compilers: Add ICC setting for get_allow_undefined_link_args --- mesonbuild/compilers/c.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index 240d424..393354d 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -174,6 +174,8 @@ class CCompiler(Compiler): elif isinstance(self, VisualStudioCCompiler): # link.exe return ['/FORCE:UNRESOLVED'] + elif self.id == 'intel': + return ['-Wl,--allow-shlib-undefined'] # FIXME: implement other linkers return [] -- cgit v1.1 From 315d07d3062718b270ee90f0970d66715716fdb6 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Wed, 10 Oct 2018 12:50:54 -0700 Subject: compilers: Set the correct values for undefined modules on apple with icc --- mesonbuild/compilers/c.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index 393354d..bc90381 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -175,7 +175,11 @@ class CCompiler(Compiler): # link.exe return ['/FORCE:UNRESOLVED'] elif self.id == 'intel': - return ['-Wl,--allow-shlib-undefined'] + if self.compiler_type.is_osx_compiler: + # Apple ld + return ['-Wl,-undefined,dynamic_lookup'] + else: + return ['-Wl,--allow-shlib-undefined'] # FIXME: implement other linkers return [] -- cgit v1.1 From a480de1cb55c9efa88a9a520d0d776743b4e5664 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Wed, 10 Oct 2018 13:36:23 -0700 Subject: compilers: ICC should error when an unknown __attribute__ is tested --- mesonbuild/compilers/compilers.py | 1 + 1 file changed, 1 insertion(+) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index 755bd46..3d53f27 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -1789,6 +1789,7 @@ class IntelCompiler(GnuLikeCompiler): extra_args, '-diag-error', '10006', # ignoring unknown option '-diag-error', '10148', # Option not supported + '-diag-error', '1292', # unknown __attribute__ ] return super().compiles(*args, **kwargs) -- cgit v1.1 From 9f9cfd21396db5cd5eb1711916c8b0c6e433c702 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Sat, 13 Oct 2018 20:00:38 -0700 Subject: compilers: Move get_allow_undefined_link_args to Compiler This allows each implementation (gnu-like) and msvc to be implemented in their respective classes rather than through an if tree in the CCompiler class. This is cleaner abstraction and allows us to clean up the Fortran compiler, which was calling CCompiler bound methods without an instance. --- mesonbuild/compilers/c.py | 32 ++++++-------------------------- mesonbuild/compilers/compilers.py | 14 ++++++++++++++ mesonbuild/compilers/fortran.py | 3 --- 3 files changed, 20 insertions(+), 29 deletions(-) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index bc90381..9a2d7db 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -157,32 +157,6 @@ class CCompiler(Compiler): ''' return self.get_no_optimization_args() - def get_allow_undefined_link_args(self): - ''' - Get args for allowing undefined symbols when linking to a shared library - ''' - if self.id in ('clang', 'gcc'): - if self.compiler_type.is_osx_compiler: - # Apple ld - return ['-Wl,-undefined,dynamic_lookup'] - elif self.compiler_type.is_windows_compiler: - # For PE/COFF this is impossible - return [] - else: - # GNU ld and LLVM lld - return ['-Wl,--allow-shlib-undefined'] - elif isinstance(self, VisualStudioCCompiler): - # link.exe - return ['/FORCE:UNRESOLVED'] - elif self.id == 'intel': - if self.compiler_type.is_osx_compiler: - # Apple ld - return ['-Wl,-undefined,dynamic_lookup'] - else: - return ['-Wl,--allow-shlib-undefined'] - # FIXME: implement other linkers - return [] - def get_output_args(self, target): return ['-o', target] @@ -1600,11 +1574,17 @@ class VisualStudioCCompiler(CCompiler): def get_argument_syntax(self): return 'msvc' + def get_allow_undefined_link_args(self): + # link.exe + return ['/FORCE:UNRESOLVED'] + + class ClangClCCompiler(VisualStudioCCompiler): def __init__(self, exelist, version, is_cross, exe_wrap, is_64): super().__init__(exelist, version, is_cross, exe_wrap, is_64) self.id = 'clang-cl' + class ArmCCompiler(ArmCompiler, CCompiler): def __init__(self, exelist, version, compiler_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 3d53f27..f464ec8 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -1265,6 +1265,12 @@ class Compiler: raise EnvironmentException( '%s does not support get_profile_use_args ' % self.get_id()) + def get_undefined_link_args(self): + ''' + Get args for allowing undefined symbols when linking to a shared library + ''' + return [] + @enum.unique class CompilerType(enum.Enum): @@ -1511,6 +1517,14 @@ class GnuLikeCompiler(abc.ABC): def get_profile_use_args(self): return ['-fprofile-use', '-fprofile-correction'] + def get_allow_undefined_link_args(self): + if self.compiler_type.is_osx_compiler: + # Apple ld + return ['-Wl,-undefined,dynamic_lookup'] + else: + # GNU ld and LLVM lld + return ['-Wl,--allow-shlib-undefined'] + class GnuCompiler(GnuLikeCompiler): """ diff --git a/mesonbuild/compilers/fortran.py b/mesonbuild/compilers/fortran.py index 8eea4e7..0afdfdf 100644 --- a/mesonbuild/compilers/fortran.py +++ b/mesonbuild/compilers/fortran.py @@ -144,9 +144,6 @@ end program prog def get_compiler_check_args(self): return CCompiler.get_compiler_check_args(self) - def get_allow_undefined_link_args(self): - return CCompiler.get_allow_undefined_link_args(self) - def get_output_args(self, target): return CCompiler.get_output_args(self, target) -- cgit v1.1 From a7845d91aa896c22d0b09e2f25d393bbfe5e9553 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Thu, 18 Oct 2018 13:53:40 -0700 Subject: ifort: ifort needs to have -lifcore like gfotran needs -lgfortran --- mesonbuild/compilers/fortran.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/fortran.py b/mesonbuild/compilers/fortran.py index 0afdfdf..fe25067 100644 --- a/mesonbuild/compilers/fortran.py +++ b/mesonbuild/compilers/fortran.py @@ -345,6 +345,9 @@ class IntelFortranCompiler(IntelCompiler, FortranCompiler): val.remove('-pipe') return val + def language_stdlib_only_link_flags(self): + return ['-lifcore', '-limf'] + class PathScaleFortranCompiler(FortranCompiler): def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwags): -- cgit v1.1 From b17ab09eaf049bb4ce002419ec29cf1192bf7c57 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Thu, 18 Oct 2018 14:23:52 -0700 Subject: compilers/fortran: pass -module ${path} instead of -module${path} ifort doesn't like the latter, and gfortran seems happy with the former. I don't have any of the other supported fortran compilers to test with. --- mesonbuild/compilers/fortran.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/fortran.py b/mesonbuild/compilers/fortran.py index fe25067..75db26d 100644 --- a/mesonbuild/compilers/fortran.py +++ b/mesonbuild/compilers/fortran.py @@ -169,7 +169,7 @@ end program prog return ('-I', ) def get_module_outdir_args(self, path): - return ['-module' + path] + return ['-module', path] def module_name_to_filename(self, module_name): return module_name.lower() + '.mod' -- cgit v1.1 From 842d8556ecc873abf3c580b725bb8d1fe5230246 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 12 Nov 2018 16:32:56 -0800 Subject: compilers: quiet ICC messages about pch These are useful for debugging, but not interesting for end users, where it just adds lines between ninja jobs without adding value. --- mesonbuild/compilers/c.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'mesonbuild/compilers') diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index 9a2d7db..4a79ca0 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -1245,7 +1245,7 @@ class IntelCCompiler(IntelCompiler, CCompiler): CCompiler.__init__(self, exelist, version, is_cross, exe_wrapper, **kwargs) IntelCompiler.__init__(self, compiler_type) self.lang_header = 'c-header' - default_warn_args = ['-Wall', '-w3', '-diag-disable:remark', '-Wpch-messages'] + default_warn_args = ['-Wall', '-w3', '-diag-disable:remark'] self.warn_args = {'1': default_warn_args, '2': default_warn_args + ['-Wextra'], '3': default_warn_args + ['-Wextra']} -- cgit v1.1