diff options
author | Dylan Baker <dylan@pnwbakers.com> | 2020-01-09 12:56:06 -0800 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2020-01-29 09:11:24 -0800 |
commit | 6440b55b07ae89753c6b41f5a525951cf785b138 (patch) | |
tree | 46f53a2a9126a241992e8866b624ae8d1286797b | |
parent | 081de4bfbc42262684b01ed61d4caa055600a917 (diff) | |
download | meson-6440b55b07ae89753c6b41f5a525951cf785b138.zip meson-6440b55b07ae89753c6b41f5a525951cf785b138.tar.gz meson-6440b55b07ae89753c6b41f5a525951cf785b138.tar.bz2 |
dependencies: Use a factory for fortran coarrays
-rw-r--r-- | mesonbuild/dependencies/__init__.py | 4 | ||||
-rw-r--r-- | mesonbuild/dependencies/coarrays.py | 78 |
2 files changed, 42 insertions, 40 deletions
diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py index 6b91b38..ac12edb 100644 --- a/mesonbuild/dependencies/__init__.py +++ b/mesonbuild/dependencies/__init__.py @@ -21,7 +21,7 @@ from .base import ( # noqa: F401 PkgConfigDependency, CMakeDependency, find_external_dependency, get_dep_identifier, packages, _packages_accept_language, DependencyFactory) from .dev import ValgrindDependency, gmock_factory, gtest_factory, llvm_factory -from .coarrays import CoarrayDependency +from .coarrays import coarray_factory from .mpi import MPIDependency from .scalapack import ScalapackDependency from .misc import (BlocksDependency, CursesDependency, OpenMPDependency, cups_factory, gpgme_factory, libgcrypt_factory, libwmf_factory, netcdf_factory, pcap_factory, python3_factory, shaderc_factory, threads_factory) @@ -40,7 +40,7 @@ packages.update({ 'cuda': CudaDependency, # per-file - 'coarray': CoarrayDependency, + 'coarray': coarray_factory, 'hdf5': HDF5Dependency, 'mpi': MPIDependency, 'scalapack': ScalapackDependency, diff --git a/mesonbuild/dependencies/coarrays.py b/mesonbuild/dependencies/coarrays.py index 7f0b30e..84c3412 100644 --- a/mesonbuild/dependencies/coarrays.py +++ b/mesonbuild/dependencies/coarrays.py @@ -12,8 +12,39 @@ # See the License for the specific language governing permissions and # limitations under the License. -from ..mesonlib import listify -from .base import CMakeDependency, DependencyMethods, ExternalDependency, PkgConfigDependency +import functools +import typing as T + +from .base import CMakeDependency, DependencyMethods, ExternalDependency, PkgConfigDependency, detect_compiler, factory_methods + +if T.TYPE_CHECKING: + from . base import DependencyType + from ..environment import Environment, MachineChoice + + +@factory_methods({DependencyMethods.PKGCONFIG, DependencyMethods.CMAKE, DependencyMethods.SYSTEM}) +def coarray_factory(env: 'Environment', for_machine: 'MachineChoice', + kwargs: T.Dict[str, T.Any], methods: T.List[DependencyMethods]) -> T.List['DependencyType']: + fcid = detect_compiler('coarray', env, for_machine, 'fortran').get_id() + candidates = [] # type: T.List[DependencyType] + + if fcid == 'gcc': + # OpenCoarrays is the most commonly used method for Fortran Coarray with GCC + if DependencyMethods.PKGCONFIG in methods: + for pkg in ['caf-openmpi', 'caf']: + candidates.append(functools.partial( + PkgConfigDependency, pkg, env, kwargs, language='fortran')) + + if DependencyMethods.CMAKE in methods: + if 'modules' not in kwargs: + kwargs['modules'] = 'OpenCoarrays::caf_mpi' + candidates.append(functools.partial( + CMakeDependency, 'OpenCoarrays', env, kwargs, language='fortran')) + + if DependencyMethods.SYSTEM in methods: + candidates.append(functools.partial(CoarrayDependency, env, kwargs)) + + return candidates class CoarrayDependency(ExternalDependency): @@ -29,53 +60,24 @@ class CoarrayDependency(ExternalDependency): super().__init__('coarray', environment, kwargs, language='fortran') kwargs['required'] = False kwargs['silent'] = True - self.is_found = False - methods = listify(self.methods) cid = self.get_compiler().get_id() if cid == 'gcc': - """ OpenCoarrays is the most commonly used method for Fortran Coarray with GCC """ - - if set([DependencyMethods.AUTO, DependencyMethods.PKGCONFIG]).intersection(methods): - for pkg in ['caf-openmpi', 'caf']: - pkgdep = PkgConfigDependency(pkg, environment, kwargs, language=self.language) - if pkgdep.found(): - self.compile_args = pkgdep.get_compile_args() - self.link_args = pkgdep.get_link_args() - self.version = pkgdep.get_version() - self.is_found = True - self.pcdep = pkgdep - return - - if set([DependencyMethods.AUTO, DependencyMethods.CMAKE]).intersection(methods): - if not kwargs.get('modules'): - kwargs['modules'] = 'OpenCoarrays::caf_mpi' - cmakedep = CMakeDependency('OpenCoarrays', environment, kwargs, language=self.language) - if cmakedep.found(): - self.compile_args = cmakedep.get_compile_args() - self.link_args = cmakedep.get_link_args() - self.version = cmakedep.get_version() - self.is_found = True - return - - if DependencyMethods.AUTO in methods: - # fallback to single image - self.compile_args = ['-fcoarray=single'] - self.version = 'single image (fallback)' - self.is_found = True - return - + # Fallback to single image + self.compile_args = ['-fcoarray=single'] + self.version = 'single image (fallback)' + self.is_found = True elif cid == 'intel': - """ Coarrays are built into Intel compilers, no external library needed """ + # Coarrays are built into Intel compilers, no external library needed self.is_found = True self.link_args = ['-coarray=shared'] self.compile_args = self.link_args elif cid == 'intel-cl': - """ Coarrays are built into Intel compilers, no external library needed """ + # Coarrays are built into Intel compilers, no external library needed self.is_found = True self.compile_args = ['/Qcoarray:shared'] elif cid == 'nagfor': - """ NAG doesn't require any special arguments for Coarray """ + # NAG doesn't require any special arguments for Coarray self.is_found = True @staticmethod |