diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2019-04-30 10:53:39 -0700 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2019-05-03 10:36:50 -0700 |
commit | 541523eebab8f62b182643296deab26a47117f6f (patch) | |
tree | b5db369f05d6407125c9eee947adb96221844ab7 /mesonbuild/compilers/fortran.py | |
parent | 604b2534e8516e5ddade6d2d2514b3078275d711 (diff) | |
download | meson-541523eebab8f62b182643296deab26a47117f6f.tar.gz |
compilers: Split C-Like functionality into a mixin classes
Currently C++ inherits C, which can lead to diamond problems. By pulling
the code out into a standalone mixin class that the C, C++, ObjC, and
Objc++ compilers can inherit and override as necessary we remove one
source of diamonding. I've chosen to split this out into it's own file
as the CLikeCompiler class is over 1000 lines by itself. This also
breaks the VisualStudio derived classes inheriting from each other, to
avoid the same C -> CPP inheritance problems. This is all one giant
patch because there just isn't a clean way to separate this.
I've done the same for Fortran since it effectively inherits the
CCompiler (I say effectively because was it actually did was gross
beyond explanation), it's probably not correct, but it seems to work for
now. There really is a lot of layering violation going on in the
Compilers, and a really good scrubbing would do this code a lot of good.
Diffstat (limited to 'mesonbuild/compilers/fortran.py')
-rw-r--r-- | mesonbuild/compilers/fortran.py | 177 |
1 files changed, 5 insertions, 172 deletions
diff --git a/mesonbuild/compilers/fortran.py b/mesonbuild/compilers/fortran.py index b4eb3273b..3fee43bb6 100644 --- a/mesonbuild/compilers/fortran.py +++ b/mesonbuild/compilers/fortran.py @@ -15,7 +15,6 @@ from typing import List import subprocess, os from pathlib import Path -from .c import CCompiler from .compilers import ( CompilerType, apple_buildtype_linker_args, @@ -28,54 +27,26 @@ from .compilers import ( ClangCompiler, ElbrusCompiler, IntelCompiler, - PGICompiler + PGICompiler, ) +from .clike import CLikeCompiler from mesonbuild.mesonlib import ( EnvironmentException, MachineChoice, is_osx, LibType ) -class FortranCompiler(Compiler): - library_dirs_cache = CCompiler.library_dirs_cache - program_dirs_cache = CCompiler.library_dirs_cache - find_library_cache = CCompiler.library_dirs_cache +class FortranCompiler(CLikeCompiler, Compiler): def __init__(self, exelist, version, is_cross, exe_wrapper=None, **kwargs): self.language = 'fortran' Compiler.__init__(self, exelist, version, **kwargs) - cc = CCompiler(exelist, version, is_cross, exe_wrapper, **kwargs) + CLikeCompiler.__init__(self, is_cross, exe_wrapper) self.id = 'unknown' - self.is_cross = cc.is_cross - self.exe_wrapper = cc.exe_wrapper def get_display_language(self): return 'Fortran' - def needs_static_linker(self): - return CCompiler.needs_static_linker(self) - - def get_always_args(self): - return CCompiler.get_always_args(self) - - def get_linker_debug_crt_args(self): - return CCompiler.get_linker_debug_crt_args(self) - - def get_no_stdinc_args(self): - return CCompiler.get_no_stdinc_args(self) - - def get_no_stdlib_link_args(self): - return CCompiler.get_no_stdlib_link_args(self) - - def get_warn_args(self, level): - return CCompiler.get_warn_args(self, level) - - def get_no_warn_args(self): - return CCompiler.get_no_warn_args(self) - - def get_soname_args(self, *args): - return CCompiler.get_soname_args(self, *args) - def sanity_check(self, work_dir: Path, environment): """ Check to be sure a minimal program can compile and execute @@ -133,59 +104,11 @@ class FortranCompiler(Compiler): return apple_buildtype_linker_args[buildtype] return gnulike_buildtype_linker_args[buildtype] - def split_shlib_to_parts(self, fname): - return CCompiler.split_shlib_to_parts(self, fname) - - def build_rpath_args(self, *args): - return CCompiler.build_rpath_args(self, *args) - def get_dependency_gen_args(self, outtarget, outfile): return [] - def depfile_for_object(self, objfile): - return CCompiler.depfile_for_object(self, objfile) - - def get_depfile_suffix(self): - return CCompiler.get_depfile_suffix(self) - - def get_exelist(self): - return CCompiler.get_exelist(self) - - def get_linker_exelist(self): - return CCompiler.get_linker_exelist(self) - def get_preprocess_only_args(self): - return ['-cpp'] + CCompiler.get_preprocess_only_args(self) - - def get_compile_only_args(self): - return CCompiler.get_compile_only_args(self) - - def get_no_optimization_args(self): - return CCompiler.get_no_optimization_args(self) - - def get_compiler_check_args(self): - return CCompiler.get_compiler_check_args(self) - - def get_output_args(self, target): - return CCompiler.get_output_args(self, target) - - def get_linker_output_args(self, outputname): - return CCompiler.get_linker_output_args(self, outputname) - - def get_coverage_args(self): - return CCompiler.get_coverage_args(self) - - def get_coverage_link_args(self): - return CCompiler.get_coverage_link_args(self) - - def get_werror_args(self): - return CCompiler.get_werror_args(self) - - def get_std_exe_link_args(self): - return CCompiler.get_std_exe_link_args(self) - - def get_include_args(self, path, is_system): - return CCompiler.get_include_args(self, path, is_system) + return ['-cpp'] + super().get_preprocess_only_args() def get_module_incdir_args(self): return ('-I', ) @@ -214,102 +137,12 @@ class FortranCompiler(Compiler): return filename - def get_std_shared_lib_link_args(self): - return CCompiler.get_std_shared_lib_link_args(self) - - def _get_search_dirs(self, *args, **kwargs): - return CCompiler._get_search_dirs(self, *args, **kwargs) - - def get_compiler_dirs(self, *args, **kwargs): - return CCompiler.get_compiler_dirs(self, *args, **kwargs) - - def get_library_dirs(self, *args, **kwargs): - return CCompiler.get_library_dirs(self, *args, **kwargs) - - def get_pic_args(self): - return CCompiler.get_pic_args(self) - - def name_string(self): - return CCompiler.name_string(self) - - def get_linker_search_args(self, dirname): - return CCompiler.get_linker_search_args(self, dirname) - - def get_default_include_dirs(self): - return CCompiler.get_default_include_dirs(self) - - def gen_export_dynamic_link_args(self, env): - return CCompiler.gen_export_dynamic_link_args(self, env) - - def gen_import_library_args(self, implibname): - return CCompiler.gen_import_library_args(self, implibname) - - def _get_basic_compiler_args(self, env, mode): - return CCompiler._get_basic_compiler_args(self, env, mode) - - def _get_compiler_check_args(self, env, extra_args, dependencies, mode='compile'): - return CCompiler._get_compiler_check_args(self, env, extra_args, dependencies, mode=mode) - - def compiles(self, code, env, *, extra_args=None, dependencies=None, mode='compile', disable_cache=False): - return CCompiler.compiles(self, code, env, extra_args=extra_args, - dependencies=dependencies, mode=mode, disable_cache=disable_cache) - - def _build_wrapper(self, code, env, extra_args, dependencies=None, mode='compile', want_output=False, disable_cache=False): - return CCompiler._build_wrapper(self, code, env, extra_args, dependencies, mode, want_output, disable_cache=disable_cache) - - def links(self, code, env, *, extra_args=None, dependencies=None, disable_cache=False): - return CCompiler.links(self, code, env, extra_args=extra_args, - dependencies=dependencies, disable_cache=disable_cache) - - def run(self, code, env, *, extra_args=None, dependencies=None): - return CCompiler.run(self, code, env, extra_args=extra_args, dependencies=dependencies) - - def _get_patterns(self, *args, **kwargs): - return CCompiler._get_patterns(self, *args, **kwargs) - - def get_library_naming(self, *args, **kwargs): - return CCompiler.get_library_naming(self, *args, **kwargs) - - def find_library_real(self, *args): - return CCompiler.find_library_real(self, *args) - - def find_library_impl(self, *args): - return CCompiler.find_library_impl(self, *args) - def find_library(self, libname, env, extra_dirs, libtype: LibType = LibType.PREFER_SHARED): code = '''program main call exit(0) end program main''' return self.find_library_impl(libname, env, extra_dirs, code, libtype) - def thread_flags(self, env): - return CCompiler.thread_flags(self, env) - - def thread_link_flags(self, env): - return CCompiler.thread_link_flags(self, env) - - def linker_to_compiler_args(self, args): - return CCompiler.linker_to_compiler_args(self, args) - - def has_arguments(self, args, env, code, mode): - return CCompiler.has_arguments(self, args, env, code, mode) - - def has_multi_arguments(self, args, env): - return CCompiler.has_multi_arguments(self, args, env) - - def has_header(self, hname, prefix, env, *, extra_args=None, dependencies=None, disable_cache=False): - return CCompiler.has_header(self, hname, prefix, env, extra_args=extra_args, dependencies=dependencies, disable_cache=disable_cache) - - def get_define(self, dname, prefix, env, extra_args, dependencies, disable_cache=False): - return CCompiler.get_define(self, dname, prefix, env, extra_args, dependencies, disable_cache=disable_cache) - - @classmethod - def _get_trials_from_pattern(cls, pattern, directory, libname): - return CCompiler._get_trials_from_pattern(pattern, directory, libname) - - @staticmethod - def _get_file_from_list(env, files: List[str]) -> Path: - return CCompiler._get_file_from_list(env, files) class GnuFortranCompiler(GnuCompiler, FortranCompiler): def __init__(self, exelist, version, compiler_type, is_cross, exe_wrapper=None, defines=None, **kwargs): |