aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2020-01-09 12:56:06 -0800
committerDylan Baker <dylan@pnwbakers.com>2020-01-29 09:11:24 -0800
commit6440b55b07ae89753c6b41f5a525951cf785b138 (patch)
tree46f53a2a9126a241992e8866b624ae8d1286797b
parent081de4bfbc42262684b01ed61d4caa055600a917 (diff)
downloadmeson-6440b55b07ae89753c6b41f5a525951cf785b138.zip
meson-6440b55b07ae89753c6b41f5a525951cf785b138.tar.gz
meson-6440b55b07ae89753c6b41f5a525951cf785b138.tar.bz2
dependencies: Use a factory for fortran coarrays
-rw-r--r--mesonbuild/dependencies/__init__.py4
-rw-r--r--mesonbuild/dependencies/coarrays.py78
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