diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2017-01-03 15:55:51 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-03 15:55:51 -0500 |
commit | 35633c68656ef2d4856e816f9701458d1a6a9e8a (patch) | |
tree | a8f9a6319fc8f363ce41001e551604801447609c | |
parent | 027af6b064381a1a48f7fe76d3b54162e5d095e7 (diff) | |
parent | a99732aaf2e84e2c08e976f05e98e2d7aa96c7d5 (diff) | |
download | meson-35633c68656ef2d4856e816f9701458d1a6a9e8a.zip meson-35633c68656ef2d4856e816f9701458d1a6a9e8a.tar.gz meson-35633c68656ef2d4856e816f9701458d1a6a9e8a.tar.bz2 |
Merge pull request #1253 from geier1993/intel
Intel C/C++ Compiler support
34 files changed, 370 insertions, 109 deletions
diff --git a/mesonbuild/backend/ninjabackend.py b/mesonbuild/backend/ninjabackend.py index 3491681..60383af 100644 --- a/mesonbuild/backend/ninjabackend.py +++ b/mesonbuild/backend/ninjabackend.py @@ -1837,6 +1837,8 @@ rule FORTRAN_DEP_HACK pchlist = [] if len(pchlist) == 0: pch_dep = [] + elif compiler.id == 'intel': + pch_dep = [] else: arr = [] i = os.path.join(self.get_target_private_dir(target), compiler.get_pch_name(pchlist[0])) @@ -1956,6 +1958,9 @@ rule FORTRAN_DEP_HACK src = os.path.join(self.build_to_src, target.get_source_subdir(), pch[-1]) (commands, dep, dst, objs) = self.generate_msvc_pch_command(target, compiler, pch) extradep = os.path.join(self.build_to_src, target.get_source_subdir(), pch[0]) + elif compiler.id == 'intel': + # Intel generates on target generation + continue else: src = os.path.join(self.build_to_src, target.get_source_subdir(), pch[0]) (commands, dep, dst, objs) = self.generate_gcc_pch_command(target, compiler, pch[0]) diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py index 0481ab2..8212d01 100644 --- a/mesonbuild/compilers.py +++ b/mesonbuild/compilers.py @@ -33,7 +33,9 @@ lib_suffixes = ('a', 'lib', 'dll', 'dylib', 'so') lang_suffixes = { 'c': ('c',), 'cpp': ('cpp', 'cc', 'cxx', 'c++', 'hh', 'hpp', 'ipp', 'hxx'), - 'fortran': ('f', 'f90', 'f95'), + # f90, f95, f03, f08 are for free-form fortran ('f90' recommended) + # f, for, ftn, fpp are for fixed-form fortran ('f' or 'for' recommended) + 'fortran': ('f90', 'f95', 'f03', 'f08', 'f', 'for', 'ftn', 'fpp'), 'd': ('d', 'di'), 'objc': ('m',), 'objcpp': ('mm',), @@ -1683,9 +1685,10 @@ class GnuDCompiler(DCompiler): def __init__(self, exelist, version, is_cross): DCompiler.__init__(self, exelist, version, is_cross) self.id = 'gcc' - self.warn_args = {'1': ['-Wall', '-Wdeprecated'], - '2': ['-Wall', '-Wextra', '-Wdeprecated'], - '3': ['-Wall', '-Wextra', '-Wdeprecated', '-Wpedantic']} + default_warn_args = ['-Wall', '-Wdeprecated'] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + ['-Wextra'], + '3': default_warn_args + ['-Wextra', '-Wpedantic']} self.base_options = ['b_colorout', 'b_sanitize', 'b_staticpic'] def get_colorout_args(self, colortype): @@ -1923,7 +1926,7 @@ class VisualStudioCCompiler(CCompiler): def gen_pch_args(self, header, source, pchname): objname = os.path.splitext(pchname)[0] + '.obj' - return (objname, ['/Yc' + header, '/Fp' + pchname, '/Fo' + objname ]) + return (objname, ['/Yc' + header, '/Fp' + pchname, '/Fo' + objname]) def gen_import_library_args(self, implibname): "The name of the outputted import library" @@ -2064,6 +2067,10 @@ CLANG_OSX = 1 CLANG_WIN = 2 # Possibly clang-cl? +ICC_STANDARD = 0 +ICC_OSX = 1 +ICC_WIN = 2 + def get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, is_shared_module): if soversion is None: sostr = '' @@ -2148,9 +2155,10 @@ class GnuCCompiler(GnuCompiler, CCompiler): def __init__(self, exelist, version, gcc_type, is_cross, exe_wrapper=None, defines=None): CCompiler.__init__(self, exelist, version, is_cross, exe_wrapper) GnuCompiler.__init__(self, gcc_type, defines) - self.warn_args = {'1': ['-Wall', '-Winvalid-pch'], - '2': ['-Wall', '-Wextra', '-Winvalid-pch'], - '3': ['-Wall', '-Wpedantic', '-Wextra', '-Winvalid-pch']} + default_warn_args = ['-Wall', '-Winvalid-pch'] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + ['-Wextra'], + '3': default_warn_args + ['-Wextra', '-Wpedantic']} def get_options(self): opts = {'c_std': coredata.UserComboOption('c_std', 'C language standard to use', @@ -2184,9 +2192,10 @@ class GnuCPPCompiler(GnuCompiler, CPPCompiler): def __init__(self, exelist, version, gcc_type, is_cross, exe_wrap, defines): CPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap) GnuCompiler.__init__(self, gcc_type, defines) - self.warn_args = {'1': ['-Wall', '-Winvalid-pch', '-Wnon-virtual-dtor'], - '2': ['-Wall', '-Wextra', '-Winvalid-pch', '-Wnon-virtual-dtor'], - '3': ['-Wall', '-Wpedantic', '-Wextra', '-Winvalid-pch', '-Wnon-virtual-dtor']} + default_warn_args = ['-Wall', '-Winvalid-pch', '-Wnon-virtual-dtor'] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + ['-Wextra'], + '3': default_warn_args + ['-Wextra', '-Wpedantic']} def get_options(self): opts = {'cpp_std': coredata.UserComboOption('cpp_std', 'C++ language standard to use', @@ -2223,6 +2232,7 @@ class GnuCPPCompiler(GnuCompiler, CPPCompiler): # too strict without this and always fails. return self.get_no_optimization_args() + ['-fpermissive'] + class GnuObjCCompiler(GnuCompiler, ObjCCompiler): def __init__(self, exelist, version, is_cross, exe_wrapper=None, defines=None): @@ -2230,9 +2240,10 @@ class GnuObjCCompiler(GnuCompiler, ObjCCompiler): # Not really correct, but GNU objc is only used on non-OSX non-win. File a bug # if this breaks your use case. GnuCompiler.__init__(self, GCC_STANDARD, defines) - self.warn_args = {'1': ['-Wall', '-Winvalid-pch'], - '2': ['-Wall', '-Wextra', '-Winvalid-pch'], - '3': ['-Wall', '-Wpedantic', '-Wextra', '-Winvalid-pch']} + default_warn_args = ['-Wall', '-Winvalid-pch'] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + ['-Wextra'], + '3': default_warn_args + ['-Wextra', '-Wpedantic']} class GnuObjCPPCompiler(GnuCompiler, ObjCPPCompiler): @@ -2241,9 +2252,10 @@ class GnuObjCPPCompiler(GnuCompiler, ObjCPPCompiler): # Not really correct, but GNU objc is only used on non-OSX non-win. File a bug # if this breaks your use case. GnuCompiler.__init__(self, GCC_STANDARD, defines) - self.warn_args = {'1': ['-Wall', '-Winvalid-pch', '-Wnon-virtual-dtor'], - '2': ['-Wall', '-Wextra', '-Winvalid-pch', '-Wnon-virtual-dtor'], - '3': ['-Wall', '-Wpedantic', '-Wextra', '-Winvalid-pch', '-Wnon-virtual-dtor']} + default_warn_args = ['-Wall', '-Winvalid-pch', '-Wnon-virtual-dtor'] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + ['-Wextra'], + '3': default_warn_args + ['-Wextra', '-Wpedantic']} def get_compiler_check_args(self): # -fpermissive allows non-conforming code to compile which is necessary @@ -2283,7 +2295,7 @@ class ClangCompiler(): # Workaround for Clang bug http://llvm.org/bugs/show_bug.cgi?id=15136 # This flag is internal to Clang (or at least not documented on the man page) # so it might change semantics at any time. - return ['-include-pch', os.path.join (pch_dir, self.get_pch_name (header))] + return ['-include-pch', os.path.join(pch_dir, self.get_pch_name(header))] def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module): if self.clang_type == CLANG_STANDARD: @@ -2321,9 +2333,10 @@ class ClangCCompiler(ClangCompiler, CCompiler): def __init__(self, exelist, version, clang_type, is_cross, exe_wrapper=None): CCompiler.__init__(self, exelist, version, is_cross, exe_wrapper) ClangCompiler.__init__(self, clang_type) - self.warn_args = {'1': ['-Wall', '-Winvalid-pch'], - '2': ['-Wall', '-Wextra', '-Winvalid-pch'], - '3': ['-Wall', '-Wpedantic', '-Wextra', '-Winvalid-pch']} + default_warn_args = ['-Wall', '-Winvalid-pch'] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + ['-Wextra'], + '3': default_warn_args + ['-Wextra', '-Wpedantic']} def get_options(self): return {'c_std': coredata.UserComboOption('c_std', 'C language standard to use', @@ -2346,14 +2359,15 @@ class ClangCPPCompiler(ClangCompiler, CPPCompiler): def __init__(self, exelist, version, cltype, is_cross, exe_wrapper=None): CPPCompiler.__init__(self, exelist, version, is_cross, exe_wrapper) ClangCompiler.__init__(self, cltype) - self.warn_args = {'1': ['-Wall', '-Winvalid-pch', '-Wnon-virtual-dtor'], - '2': ['-Wall', '-Wextra', '-Winvalid-pch', '-Wnon-virtual-dtor'], - '3': ['-Wall', '-Wpedantic', '-Wextra', '-Winvalid-pch', '-Wnon-virtual-dtor']} + default_warn_args = ['-Wall', '-Winvalid-pch', '-Wnon-virtual-dtor'] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + ['-Wextra'], + '3': default_warn_args + ['-Wextra', '-Wpedantic']} def get_options(self): return {'cpp_std': coredata.UserComboOption('cpp_std', 'C++ language standard to use', ['none', 'c++03', 'c++11', 'c++14', 'c++1z', - 'gnu++03', 'gnu++11', 'gnu++14', 'gnu++1z'], + 'gnu++11', 'gnu++14', 'gnu++1z'], 'none')} def get_option_compile_args(self, options): @@ -2378,6 +2392,140 @@ class ClangObjCPPCompiler(ClangCompiler, GnuObjCPPCompiler): ClangCompiler.__init__(self, cltype) self.base_options = ['b_pch', 'b_lto', 'b_pgo', 'b_sanitize', 'b_coverage'] + +# Tested on linux for ICC 14.0.3, 15.0.6, 16.0.4, 17.0.1 +class IntelCompiler: + def __init__(self, icc_type): + self.id = 'intel' + self.icc_type = icc_type + self.lang_header = 'none' + self.base_options = ['b_pch', 'b_lto', 'b_pgo', 'b_sanitize', 'b_coverage', + 'b_colorout', 'b_ndebug', 'b_staticpic', 'b_lundef', 'b_asneeded'] + # Assembly + self.can_compile_suffixes.add('s') + + def get_pic_args(self): + return ['-fPIC'] + + def get_buildtype_args(self, buildtype): + return gnulike_buildtype_args[buildtype] + + def get_buildtype_linker_args(self, buildtype): + return gnulike_buildtype_linker_args[buildtype] + + def get_pch_suffix(self): + return 'pchi' + + def get_pch_use_args(self, pch_dir, header): + return ['-pch', '-pch_dir', os.path.join(pch_dir), '-x', + self.lang_header, '-include', header, '-x', 'none'] + + def get_pch_name(self, header_name): + return os.path.split(header_name)[-1] + '.' + self.get_pch_suffix() + + def split_shlib_to_parts(self, fname): + return (os.path.split(fname)[0], fname) + + def get_soname_args(self, prefix, shlib_name, suffix, path, soversion, is_shared_module): + if self.icc_type == ICC_STANDARD: + gcc_type = GCC_STANDARD + elif self.icc_type == ICC_OSX: + gcc_type = GCC_OSX + elif self.icc_type == ICC_WIN: + gcc_type = GCC_MINGW + else: + raise MesonException('Unreachable code when converting icc type to gcc type.') + return get_gcc_soname_args(gcc_type, prefix, shlib_name, suffix, path, soversion, is_shared_module) + + def get_std_shared_lib_link_args(self): + # FIXME: Don't know how icc works on OSX + # if self.icc_type == ICC_OSX: + # return ['-bundle'] + return ['-shared'] + + +class IntelCCompiler(IntelCompiler, CCompiler): + def __init__(self, exelist, version, icc_type, is_cross, exe_wrapper=None): + CCompiler.__init__(self, exelist, version, is_cross, exe_wrapper) + IntelCompiler.__init__(self, icc_type) + self.lang_header = 'c-header' + default_warn_args = ['-Wall', '-w3', '-diag-disable:remark', '-Wpch-messages'] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + ['-Wextra'], + '3': default_warn_args + ['-Wextra', '-Wpedantic']} + + def get_options(self): + c_stds = ['c89', 'c99'] + g_stds = ['gnu89', 'gnu99'] + if mesonlib.version_compare(self.version, '>=16.0.0'): + c_stds += ['c11'] + opts = {'c_std': coredata.UserComboOption('c_std', 'C language standard to use', + ['none'] + c_stds + g_stds, + 'none')} + return opts + + def get_option_compile_args(self, options): + args = [] + std = options['c_std'] + if std.value != 'none': + args.append('-std=' + std.value) + return args + + def get_std_shared_lib_link_args(self): + return ['-shared'] + + def has_multi_arguments(self, args, env): + return super(IntelCCompiler, self).has_multi_arguments(args + ['-diag-error', '10006'], env) + + +class IntelCPPCompiler(IntelCompiler, CPPCompiler): + def __init__(self, exelist, version, icc_type, is_cross, exe_wrap): + CPPCompiler.__init__(self, exelist, version, is_cross, exe_wrap) + IntelCompiler.__init__(self, icc_type) + self.lang_header = 'c++-header' + default_warn_args = ['-Wall', '-w3', '-diag-disable:remark', + '-Wpch-messages', '-Wnon-virtual-dtor'] + self.warn_args = {'1': default_warn_args, + '2': default_warn_args + ['-Wextra'], + '3': default_warn_args + ['-Wextra', '-Wpedantic']} + + def get_options(self): + c_stds = [] + g_stds = ['gnu++98'] + if mesonlib.version_compare(self.version, '>=15.0.0'): + c_stds += ['c++11', 'c++14'] + g_stds += ['gnu++11'] + if mesonlib.version_compare(self.version, '>=16.0.0'): + c_stds += ['c++17'] + if mesonlib.version_compare(self.version, '>=17.0.0'): + g_stds += ['gnu++14'] + opts = {'cpp_std': coredata.UserComboOption('cpp_std', 'C++ language standard to use', + ['none'] + c_stds + g_stds, + 'none'), + 'cpp_debugstl': coredata.UserBooleanOption('cpp_debugstl', + 'STL debug mode', + False)} + return opts + + def get_option_compile_args(self, options): + args = [] + std = options['cpp_std'] + if std.value != 'none': + args.append('-std=' + std.value) + if options['cpp_debugstl'].value: + args.append('-D_GLIBCXX_DEBUG=1') + return args + + def get_option_link_args(self, options): + return [] + + def get_compiler_check_args(self): + return self.get_no_optimization_args() + + def has_multi_arguments(self, args, env): + return super(IntelCPPCompiler, self).has_multi_arguments(args + ['-diag-error', '10006'], env) + + class FortranCompiler(Compiler): def __init__(self, exelist, version, is_cross, exe_wrapper=None): self.language = 'fortran' @@ -2558,12 +2706,15 @@ class SunFortranCompiler(FortranCompiler): def get_module_outdir_args(self, path): return ['-moddir=' + path] -class IntelFortranCompiler(FortranCompiler): +class IntelFortranCompiler(IntelCompiler, FortranCompiler): std_warn_args = ['-warn', 'all'] def __init__(self, exelist, version, is_cross, exe_wrapper=None): - self.file_suffixes = ('f', 'f90') - super().__init__(exelist, version, is_cross, exe_wrapper=None) + self.file_suffixes = ('f90', 'f', 'for', 'ftn', 'fpp') + FortranCompiler.__init__(self, exelist, version, is_cross, exe_wrapper) + # FIXME: Add support for OS X and Windows in detect_fortran_compiler so + # we are sent the type of compiler + IntelCompiler.__init__(self, ICC_STANDARD) self.id = 'intel' def get_module_outdir_args(self, path): @@ -2625,15 +2776,13 @@ class NAGFortranCompiler(FortranCompiler): def get_module_outdir_args(self, path): return ['-mdir', path] - def get_always_args(self): - return [] - def get_warn_args(self, level): return NAGFortranCompiler.std_warn_args class VisualStudioLinker(): always_args = ['/NOLOGO'] + def __init__(self, exelist): self.exelist = exelist diff --git a/mesonbuild/environment.py b/mesonbuild/environment.py index 2e5387d..48f5865 100644 --- a/mesonbuild/environment.py +++ b/mesonbuild/environment.py @@ -396,6 +396,10 @@ class Environment(): # everything else to stdout. Why? Lord only knows. version = search_version(err) return VisualStudioCCompiler([compiler], version, is_cross, exe_wrap) + if '(ICC)' in out: + # TODO: add microsoft add check OSX + inteltype = ICC_STANDARD + return IntelCCompiler(ccache + [compiler], version, inteltype, is_cross, exe_wrap) errmsg = 'Unknown compiler(s): "' + ', '.join(compilers) + '"' if popen_exceptions: errmsg += '\nThe follow exceptions were encountered:' @@ -525,6 +529,10 @@ class Environment(): if 'Microsoft' in out or 'Microsoft' in err: version = search_version(err) return VisualStudioCPPCompiler([compiler], version, is_cross, exe_wrap) + if '(ICC)' in out: + # TODO: add microsoft add check OSX + inteltype = ICC_STANDARD + return IntelCPPCompiler(ccache + [compiler], version, inteltype, is_cross, exe_wrap) errmsg = 'Unknown compiler(s): "' + ', '.join(compilers) + '"' if popen_exceptions: errmsg += '\nThe follow exceptions were encountered:' diff --git a/run_project_tests.py b/run_project_tests.py index c26b885..18988fb 100755 --- a/run_project_tests.py +++ b/run_project_tests.py @@ -58,6 +58,11 @@ class AutoDeletedDir(): try: shutil.rmtree(self.dir) return + # Sometimes we get: ValueError: I/O operation on closed file. + except ValueError: + return + # Deleting can raise OSError or PermissionError on Windows + # (most likely because of anti-virus locking the file) except (OSError, PermissionError): if i == retries - 1: mlog.warning('Could not delete temporary directory.') diff --git a/run_unittests.py b/run_unittests.py index 7326800..d1c192f 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -19,7 +19,7 @@ import re, json import tempfile from glob import glob import mesonbuild.environment -from mesonbuild.environment import detect_ninja +from mesonbuild.environment import detect_ninja, Environment from mesonbuild.dependencies import PkgConfigDependency def get_soname(fname): @@ -33,6 +33,12 @@ def get_soname(fname): return m.group(1) raise RuntimeError('Could not determine soname:\n\n' + raw_out) +def get_fake_options(): + import argparse + opts = argparse.Namespace() + opts.cross_file = None + return opts + class FakeEnvironment(object): def __init__(self): self.cross_info = None @@ -81,11 +87,13 @@ class LinuxlikeTests(unittest.TestCase): def _run(self, command): self.output += subprocess.check_output(command, env=os.environ.copy()) - def init(self, srcdir): + def init(self, srcdir, extra_args=None): + if extra_args is None: + extra_args = [] args = [srcdir, self.builddir, '--prefix', self.prefix, '--libdir', self.libdir] - self._run(self.meson_command + args) + self._run(self.meson_command + args + extra_args) self.privatedir = os.path.join(self.builddir, 'meson-private') def build(self): @@ -170,7 +178,7 @@ class LinuxlikeTests(unittest.TestCase): testdir = os.path.join(self.common_test_dir, '3 static') self.init(testdir) compdb = self.get_compdb() - self.assertTrue('-fPIC' in compdb[0]['command']) + self.assertIn('-fPIC', compdb[0]['command']) # This is needed to increase the difference between build.ninja's # timestamp and coredata.dat's timestamp due to a Ninja bug. # https://github.com/ninja-build/ninja/issues/371 @@ -179,7 +187,7 @@ class LinuxlikeTests(unittest.TestCase): # Regenerate build self.build() compdb = self.get_compdb() - self.assertTrue('-fPIC' not in compdb[0]['command']) + self.assertNotIn('-fPIC', compdb[0]['command']) def test_pkgconfig_gen(self): ''' @@ -196,7 +204,7 @@ class LinuxlikeTests(unittest.TestCase): simple_dep = PkgConfigDependency('libfoo', env, kwargs) self.assertTrue(simple_dep.found()) self.assertEqual(simple_dep.get_version(), '1.0') - self.assertTrue('-lfoo' in simple_dep.get_link_args()) + self.assertIn('-lfoo', simple_dep.get_link_args()) def test_vala_c_warnings(self): ''' @@ -221,15 +229,15 @@ class LinuxlikeTests(unittest.TestCase): self.assertIsNotNone(vala_command) self.assertIsNotNone(c_command) # -w suppresses all warnings, should be there in Vala but not in C - self.assertTrue('-w' in vala_command) - self.assertFalse('-w' in c_command) + self.assertIn("'-w'", vala_command) + self.assertNotIn("'-w'", c_command) # -Wall enables all warnings, should be there in C but not in Vala - self.assertFalse('-Wall' in vala_command) - self.assertTrue('-Wall' in c_command) + self.assertNotIn("'-Wall'", vala_command) + self.assertIn("'-Wall'", c_command) # -Werror converts warnings to errors, should always be there since it's # injected by an unrelated piece of code and the project has werror=true - self.assertTrue('-Werror' in vala_command) - self.assertTrue('-Werror' in c_command) + self.assertIn("'-Werror'", vala_command) + self.assertIn("'-Werror'", c_command) def test_static_compile_order(self): ''' @@ -410,6 +418,59 @@ class LinuxlikeTests(unittest.TestCase): self.assertTrue('TEST_ENV is set' in vg_log) self.assertTrue('Memcheck' in vg_log) + def _test_stds_impl(self, testdir, compiler, p): + lang_std = p + '_std' + # Check that all the listed -std=xxx options for this compiler work + # just fine when used + for v in compiler.get_options()[lang_std].choices: + std_opt = '{}={}'.format(lang_std, v) + self.init(testdir, ['-D' + std_opt]) + cmd = self.get_compdb()[0]['command'] + if v != 'none': + cmd_std = "'-std={}'".format(v) + self.assertIn(cmd_std, cmd) + try: + self.build() + except: + print('{} was {!r}'.format(lang_std, v)) + raise + self.wipe() + # Check that an invalid std option in CFLAGS/CPPFLAGS fails + # Needed because by default ICC ignores invalid options + cmd_std = '-std=FAIL' + env_flags = p.upper() + 'FLAGS' + os.environ[env_flags] = cmd_std + self.init(testdir) + cmd = self.get_compdb()[0]['command'] + qcmd_std = "'{}'".format(cmd_std) + self.assertIn(qcmd_std, cmd) + with self.assertRaises(subprocess.CalledProcessError, + msg='{} should have failed'.format(qcmd_std)): + self.build() + + def test_compiler_c_stds(self): + ''' + Test that C stds specified for this compiler can all be used. Can't be + an ordinary test because it requires passing options to meson. + ''' + testdir = os.path.join(self.common_test_dir, '1 trivial') + env = Environment(testdir, self.builddir, self.meson_command, + get_fake_options(), []) + cc = env.detect_c_compiler(False) + self._test_stds_impl(testdir, cc, 'c') + + def test_compiler_cpp_stds(self): + ''' + Test that C++ stds specified for this compiler can all be used. Can't + be an ordinary test because it requires passing options to meson. + ''' + testdir = os.path.join(self.common_test_dir, '2 cpp') + env = Environment(testdir, self.builddir, self.meson_command, + get_fake_options(), []) + cpp = env.detect_cpp_compiler(False) + self._test_stds_impl(testdir, cpp, 'cpp') + + class RewriterTests(unittest.TestCase): def setUp(self): diff --git a/test cases/common/1 trivial/meson.build b/test cases/common/1 trivial/meson.build index 1f7b375..a93de75 100644 --- a/test cases/common/1 trivial/meson.build +++ b/test cases/common/1 trivial/meson.build @@ -6,6 +6,11 @@ project('trivial test', #this is a comment sources = 'trivial.c' +if meson.get_compiler('c').get_id() == 'intel' + # Error out if the -std=xxx option is incorrect + add_project_arguments('-diag-error', '10159', language : 'c') +endif + exe = executable('trivialprog', sources : sources) test('runtest', exe) # This is a comment diff --git a/test cases/common/132 dependency file generation/main .c b/test cases/common/132 dependency file generation/main .c new file mode 100644 index 0000000..0fb4389 --- /dev/null +++ b/test cases/common/132 dependency file generation/main .c @@ -0,0 +1,3 @@ +int main(int argc, char *argv[]) { + return 0; +} diff --git a/test cases/common/132 dependency file generation/meson.build b/test cases/common/132 dependency file generation/meson.build new file mode 100644 index 0000000..dcfdcd9 --- /dev/null +++ b/test cases/common/132 dependency file generation/meson.build @@ -0,0 +1,12 @@ +project('dep file gen', 'c') + +cc_id = meson.get_compiler('c').get_id() +if cc_id == 'intel' + # ICC does not escape spaces in paths in the dependency file, so Ninja + # (correctly) thinks that the rule has multiple outputs and errors out: + # 'depfile has multiple output paths' + error('MESON_SKIP_TEST: Skipping test with Intel compiler because it generates broken dependency files') +endif + +e = executable('main file', 'main .c') +test('test it', e) diff --git a/test cases/common/2 cpp/meson.build b/test cases/common/2 cpp/meson.build index 9c6f71a..6398382 100644 --- a/test cases/common/2 cpp/meson.build +++ b/test cases/common/2 cpp/meson.build @@ -1,3 +1,9 @@ project('c++ test', 'cpp') + +if meson.get_compiler('cpp').get_id() == 'intel' + # Error out if the -std=xxx option is incorrect + add_project_arguments('-diag-error', '10159', language : 'cpp') +endif + exe = executable('trivialprog', 'trivial.cc', extra_files : 'something.txt') test('runtest', exe) diff --git a/test cases/common/25 object extraction/meson.build b/test cases/common/25 object extraction/meson.build index c76b0db..d99ec84 100644 --- a/test cases/common/25 object extraction/meson.build +++ b/test cases/common/25 object extraction/meson.build @@ -9,8 +9,8 @@ else obj1 = lib1.extract_objects('src/lib.c') obj2 = lib2.extract_objects(['lib.c']) - e1 = executable('main 1', 'main.c', objects : obj1) - e2 = executable('main 2', 'main.c', objects : obj2) + e1 = executable('main1', 'main.c', objects : obj1) + e2 = executable('main2', 'main.c', objects : obj2) test('extraction test 1', e1) test('extraction test 2', e2) diff --git a/test cases/common/94 default options/meson.build b/test cases/common/94 default options/meson.build index a718bcc..a9176e0 100644 --- a/test cases/common/94 default options/meson.build +++ b/test cases/common/94 default options/meson.build @@ -1,20 +1,20 @@ project('default options', 'cpp', 'c', default_options : [ 'buildtype=debugoptimized', - 'cpp_std=c++03', + 'cpp_std=c++11', 'cpp_eh=none', 'warning_level=3', ]) -cpp = meson.get_compiler('cpp') +cpp_id = meson.get_compiler('cpp').get_id() assert(get_option('buildtype') == 'debugoptimized', 'Build type default value wrong.') -if cpp.get_id() == 'msvc' +if cpp_id == 'msvc' cpp_eh = get_option('cpp_eh') assert(cpp_eh == 'none', 'MSVC eh value is "' + cpp_eh + '" instead of "none"') else cpp_std = get_option('cpp_std') - assert(cpp_std == 'c++03', 'C++ std value is "' + cpp_std + '" instead of c++03.') + assert(cpp_std == 'c++11', 'C++ std value is "' + cpp_std + '" instead of c++11.') endif w_level = get_option('warning_level') diff --git a/test cases/d/3 shared library/meson.build b/test cases/d/3 shared library/meson.build index 5dae66b..1f45109 100644 --- a/test cases/d/3 shared library/meson.build +++ b/test cases/d/3 shared library/meson.build @@ -1,12 +1,9 @@ project('D Shared Library', 'd') -if meson.get_compiler('d').get_id() != 'gcc' - - ldyn = shared_library('stuff', 'libstuff.d', install : true) - ed = executable('app_d', 'app.d', link_with : ldyn, install : true) - test('linktest_dyn', ed) - -else - message('GDC can not build shared libraries. Test skipped.') - install_data('no-installed-files', install_dir : '') +if meson.get_compiler('d').get_id() == 'gcc' + error('MESON_SKIP_TEST: GDC can not build shared libraries') endif + +ldyn = shared_library('stuff', 'libstuff.d', install : true) +ed = executable('app_d', 'app.d', link_with : ldyn, install : true) +test('linktest_dyn', ed) diff --git a/test cases/d/3 shared library/no-installed-files b/test cases/d/3 shared library/no-installed-files deleted file mode 100644 index e69de29..0000000 --- a/test cases/d/3 shared library/no-installed-files +++ /dev/null diff --git a/test cases/d/4 library versions/meson.build b/test cases/d/4 library versions/meson.build index 26cc38a..f680651 100644 --- a/test cases/d/4 library versions/meson.build +++ b/test cases/d/4 library versions/meson.build @@ -1,25 +1,22 @@ project('D library versions', 'd') if meson.get_compiler('d').get_id() == 'gcc' - message('GDC can not build shared libraries. Test skipped.') - install_data('no-installed-files', install_dir : '') -else - - shared_library('some', 'lib.d', - version : '1.2.3', - soversion : '0', - install : true) + error('MESON_SKIP_TEST: GDC can not build shared libraries') +endif - shared_library('noversion', 'lib.d', - install : true) +shared_library('some', 'lib.d', + version : '1.2.3', + soversion : '0', + install : true) - shared_library('onlyversion', 'lib.d', - version : '1.4.5', - install : true) +shared_library('noversion', 'lib.d', + install : true) - shared_library('onlysoversion', 'lib.d', - # Also test that int soversion is acceptable - soversion : 5, - install : true) +shared_library('onlyversion', 'lib.d', + version : '1.4.5', + install : true) -endif +shared_library('onlysoversion', 'lib.d', + # Also test that int soversion is acceptable + soversion : 5, + install : true) diff --git a/test cases/d/4 library versions/no-installed-files b/test cases/d/4 library versions/no-installed-files deleted file mode 100644 index e69de29..0000000 --- a/test cases/d/4 library versions/no-installed-files +++ /dev/null diff --git a/test cases/failing build/1 vala c werror/unused-var.c b/test cases/failing build/1 vala c werror/unused-var.c index e11d64c..6b85078 100644 --- a/test cases/failing build/1 vala c werror/unused-var.c +++ b/test cases/failing build/1 vala c werror/unused-var.c @@ -1,3 +1,5 @@ +#warning "something" + int somelib(void) { diff --git a/test cases/fortran/1 basic/meson.build b/test cases/fortran/1 basic/meson.build index 9c40951..833a177 100644 --- a/test cases/fortran/1 basic/meson.build +++ b/test cases/fortran/1 basic/meson.build @@ -2,6 +2,6 @@ project('simple fortran', 'fortran') add_global_arguments('-fbounds-check', language : 'fortran') -e = executable('simple', 'simple.f95', +e = executable('simple', 'simple.f90', fortran_args : '-ffree-form') test('Simple Fortran', e) diff --git a/test cases/fortran/1 basic/simple.f95 b/test cases/fortran/1 basic/simple.f90 index e0fb1d8..e0fb1d8 100644 --- a/test cases/fortran/1 basic/simple.f95 +++ b/test cases/fortran/1 basic/simple.f90 diff --git a/test cases/fortran/2 modules/meson.build b/test cases/fortran/2 modules/meson.build index 0087c26..030f255 100644 --- a/test cases/fortran/2 modules/meson.build +++ b/test cases/fortran/2 modules/meson.build @@ -1,4 +1,4 @@ project('modules', 'fortran') -e = executable('modprog', 'stuff.f95', 'prog.f95') +e = executable('modprog', 'stuff.f90', 'prog.f90') test('moduletest', e) diff --git a/test cases/fortran/2 modules/prog.f95 b/test cases/fortran/2 modules/prog.f90 index c3998cc..c3998cc 100644 --- a/test cases/fortran/2 modules/prog.f95 +++ b/test cases/fortran/2 modules/prog.f90 diff --git a/test cases/fortran/2 modules/stuff.f95 b/test cases/fortran/2 modules/stuff.f90 index 4a6399b..4a6399b 100644 --- a/test cases/fortran/2 modules/stuff.f95 +++ b/test cases/fortran/2 modules/stuff.f90 diff --git a/test cases/fortran/5 static/main.f95 b/test cases/fortran/5 static/main.f90 index dc6454c..dc6454c 100644 --- a/test cases/fortran/5 static/main.f95 +++ b/test cases/fortran/5 static/main.f90 diff --git a/test cases/fortran/5 static/meson.build b/test cases/fortran/5 static/meson.build index d6f922b..bd74a29 100644 --- a/test cases/fortran/5 static/meson.build +++ b/test cases/fortran/5 static/meson.build @@ -1,5 +1,5 @@ project('try-static-library', 'fortran') -static_hello = static_library('static_hello', 'static_hello.f95') +static_hello = static_library('static_hello', 'static_hello.f90') -executable('test_exe', 'main.f95', link_with : static_hello) +executable('test_exe', 'main.f90', link_with : static_hello) diff --git a/test cases/fortran/5 static/static_hello.f95 b/test cases/fortran/5 static/static_hello.f90 index 63415b0..63415b0 100644 --- a/test cases/fortran/5 static/static_hello.f95 +++ b/test cases/fortran/5 static/static_hello.f90 diff --git a/test cases/fortran/6 dynamic/dynamic.f95 b/test cases/fortran/6 dynamic/dynamic.f90 index e78a406..e78a406 100644 --- a/test cases/fortran/6 dynamic/dynamic.f95 +++ b/test cases/fortran/6 dynamic/dynamic.f90 diff --git a/test cases/fortran/6 dynamic/main.f95 b/test cases/fortran/6 dynamic/main.f90 index cb3a53f..cb3a53f 100644 --- a/test cases/fortran/6 dynamic/main.f95 +++ b/test cases/fortran/6 dynamic/main.f90 diff --git a/test cases/fortran/6 dynamic/meson.build b/test cases/fortran/6 dynamic/meson.build index 53edaf6..c791dac 100644 --- a/test cases/fortran/6 dynamic/meson.build +++ b/test cases/fortran/6 dynamic/meson.build @@ -1,4 +1,4 @@ project('dynamic_fortran', 'fortran') -dynamic = shared_library('dynamic', 'dynamic.f95') -executable('test_exe', 'main.f95', link_with : dynamic) +dynamic = shared_library('dynamic', 'dynamic.f90') +executable('test_exe', 'main.f90', link_with : dynamic) diff --git a/test cases/frameworks/11 gir subproject/gir/meson.build b/test cases/frameworks/11 gir subproject/gir/meson.build index e92c641..48e0a47 100644 --- a/test cases/frameworks/11 gir subproject/gir/meson.build +++ b/test cases/frameworks/11 gir subproject/gir/meson.build @@ -28,8 +28,10 @@ gnome.generate_gir( message('TEST: ' + girsubproject.outdir()) +envdata = environment() +envdata.append('GI_TYPELIB_PATH', girsubproject.outdir(), 'subprojects/mesongir', separator : ':') +envdata.append('LD_LIBRARY_PATH', girsubproject.outdir(), 'subprojects/mesongir') + test('gobject introspection/subproject/c', girexe) test('gobject introspection/subproject/py', find_program('prog.py'), - env : ['GI_TYPELIB_PATH=' + girsubproject.outdir() + ':subprojects/mesongir', - 'LD_LIBRARY_PATH=' + girsubproject.outdir() + ':subprojects/mesongir', - ]) + env : envdata) diff --git a/test cases/frameworks/7 gnome/gir/meson.build b/test cases/frameworks/7 gnome/gir/meson.build index beddc81..f3a4534 100644 --- a/test cases/frameworks/7 gnome/gir/meson.build +++ b/test cases/frameworks/7 gnome/gir/meson.build @@ -33,7 +33,8 @@ gnome.generate_gir( test('gobject introspection/c', girexe) gir_paths = ':'.join([girlib.outdir(), dep1lib.outdir(), dep2lib.outdir()]) +envdata = environment() +envdata.append('GI_TYPELIB_PATH', gir_paths, separator : ':') +envdata.append('LD_LIBRARY_PATH', gir_paths) test('gobject introspection/py', find_program('prog.py'), - env : ['GI_TYPELIB_PATH=' + gir_paths, - 'LD_LIBRARY_PATH=' + gir_paths, - ]) + env : envdata) diff --git a/test cases/frameworks/7 gnome/meson.build b/test cases/frameworks/7 gnome/meson.build index a771e71..c75c049 100644 --- a/test cases/frameworks/7 gnome/meson.build +++ b/test cases/frameworks/7 gnome/meson.build @@ -1,5 +1,14 @@ project('gobject-introspection', 'c') +cc = meson.get_compiler('c') + +add_global_arguments('-DMESON_TEST', language : 'c') +if cc.get_id() == 'intel' + # Ignore invalid GCC pragma warnings from glib + # https://bugzilla.gnome.org/show_bug.cgi?id=776562 + add_global_arguments('-wd2282', language : 'c') +endif + gnome = import('gnome') gio = dependency('gio-2.0') giounix = dependency('gio-unix-2.0') @@ -7,7 +16,6 @@ glib = dependency('glib-2.0') gobj = dependency('gobject-2.0') gir = dependency('gobject-introspection-1.0') gmod = dependency('gmodule-2.0') -add_global_arguments('-DMESON_TEST', language : 'c') subdir('resources-data') subdir('resources') diff --git a/test cases/windows/7 mingw dll versioning/meson.build b/test cases/windows/7 mingw dll versioning/meson.build index 23a3343..2f6035e 100644 --- a/test cases/windows/7 mingw dll versioning/meson.build +++ b/test cases/windows/7 mingw dll versioning/meson.build @@ -2,16 +2,16 @@ project('mingw dll versioning', 'c') cc = meson.get_compiler('c') +if cc.get_id() == 'msvc' + error('MESON_SKIP_TEST: test is only for MinGW') +endif + # Test that MinGW/GCC creates correctly-named dll files and dll.a files, # and also installs them in the right place -if cc.get_id() != 'msvc' - shared_library('some', 'lib.c', - version : '1.2.3', - soversion : '0', - install : true) +shared_library('some', 'lib.c', + version : '1.2.3', + soversion : '0', + install : true) - shared_library('noversion', 'lib.c', - install : true) -else - install_data('no-installed-files', install_dir : '') -endif +shared_library('noversion', 'lib.c', + install : true) diff --git a/test cases/windows/7 mingw dll versioning/no-installed-files b/test cases/windows/7 mingw dll versioning/no-installed-files deleted file mode 100644 index e69de29..0000000 --- a/test cases/windows/7 mingw dll versioning/no-installed-files +++ /dev/null diff --git a/test cases/windows/8 msvc dll versioning/meson.build b/test cases/windows/8 msvc dll versioning/meson.build index 0c36173..d6aecb6 100644 --- a/test cases/windows/8 msvc dll versioning/meson.build +++ b/test cases/windows/8 msvc dll versioning/meson.build @@ -2,15 +2,15 @@ project('msvc dll versioning', 'c') cc = meson.get_compiler('c') +if cc.get_id() != 'msvc' + error('MESON_SKIP_TEST: test is only for msvc') +endif + # Test that MSVC creates foo-0.dll and bar.dll -if cc.get_id() == 'msvc' - shared_library('some', 'lib.c', - version : '1.2.3', - soversion : '0', - install : true) +shared_library('some', 'lib.c', + version : '1.2.3', + soversion : '0', + install : true) - shared_library('noversion', 'lib.c', - install : true) -else - install_data('no-installed-files', install_dir : '') -endif +shared_library('noversion', 'lib.c', + install : true) diff --git a/test cases/windows/8 msvc dll versioning/no-installed-files b/test cases/windows/8 msvc dll versioning/no-installed-files deleted file mode 100644 index e69de29..0000000 --- a/test cases/windows/8 msvc dll versioning/no-installed-files +++ /dev/null |