1 |
# - Find the MPI compiler wrappers |
2 |
# This module locates the MPI compiler wrappers (mpicc, mpicxx/mpic++, |
3 |
mpif77 and mpif90). |
4 |
# It is useful if one wants to force a project to use the MPI compiler |
5 |
wrappers as default |
6 |
# compilers. |
7 |
# |
8 |
# The module has the following COMPONENTS: |
9 |
# C searches for mpicc |
10 |
# CXX searches for mpicxx and mpic++ |
11 |
# F77 searches for mpif77 |
12 |
# F90 searches for mpif90 |
13 |
# If no components are specified, all of them are enabled by default. |
14 |
# |
15 |
# The module sets the following cache variables (if the corresponding |
16 |
module is enabled): |
17 |
# MPICOMPILERS_C the mpicc compiler |
18 |
# MPICOMPILERS_CXX the mpicxx/mpic++ compiler |
19 |
# MPICOMPILERS_F77 the mpif77 compiler |
20 |
# MPICOMPILERS_F90 the mpif90 compiler |
21 |
# |
22 |
# If the user wishes to specify a specific compiler wrapper (e.g. one |
23 |
which is |
24 |
# using a non-standard name or one which is not found on the path) can |
25 |
do so |
26 |
# by setting the corresponding MPICOMPILERS_XXX variable (e.g. using the |
27 |
# -D flag the first time CMake is run). It also honours environment |
28 |
variables |
29 |
# by the same name. The CC, CXX and similar variables are not |
30 |
considered by |
31 |
# design. |
32 |
# |
33 |
# If the module is not REQUIRED make sure to check the MPICOMPILERS_XXX |
34 |
# variables. |
35 |
# |
36 |
# Beware that although the module can search for both the mpif77 and |
37 |
mpif90 |
38 |
# compiler wrappers, CMake only knows the CMAKE_Fortran_COMPILER |
39 |
variable |
40 |
# which means that you can't use both of the wrappers in the same |
41 |
project. This, |
42 |
# however, probably is not a big issue as Fortran90 is a superset of |
43 |
# Fortran77 and all Fortran90 compilers I know of also process Fortran77 |
44 |
# sources. |
45 |
# |
46 |
# An example CMakeLists.txt could look like this: |
47 |
# |
48 |
# # prevent CMake from compiler detection using NONE as the project |
49 |
language |
50 |
# project( some_project NONE ) |
51 |
# |
52 |
# cmake_minimum_required( VERSION 2.6 ) |
53 |
# |
54 |
# # find the mpi compiler wrappers |
55 |
# find_package( MpiCompilers REQUIRED CXX F77 ) |
56 |
# |
57 |
# # set the CMAKE_XXX_COMPILER variables |
58 |
# set( CMAKE_CXX_COMPILER ${MPICOMPILERS_CXX} ) |
59 |
# set( CMAKE_Fortran_COMPILER ${MPICOMPILERS_F77} ) |
60 |
# # enable the corresponding languages to do the compiler detection |
61 |
# enable_language( CXX ) |
62 |
# enable_language( Fortran ) |
63 |
# |
64 |
# # now go on as usual |
65 |
# add_executable( fancy_mpi_program source1.cxx source2.f ) |
66 |
|
67 |
# Copyright 2009 Michael Wild <themiwi at users.sourceforge.net> |
68 |
|
69 |
# check the components that are requested |
70 |
if( MpiCompilers_FIND_COMPONENTS ) |
71 |
set( __MpiCompilers_C FALSE ) |
72 |
set( __MpiCompilers_CXX FALSE ) |
73 |
set( __MpiCompilers_F77 FALSE ) |
74 |
set( __MpiCompilers_F90 FALSE ) |
75 |
foreach( __MpiCompilers_comp ${MpiCompilers_FIND_COMPONENTS} ) |
76 |
if( __MpiCompilers_comp STREQUAL C ) |
77 |
set( __MpiCompilers_C TRUE ) |
78 |
elseif( __MpiCompilers_comp STREQUAL CXX ) |
79 |
set( __MpiCompilers_CXX TRUE ) |
80 |
elseif(__MpiCompilers_comp STREQUAL F77 ) |
81 |
set( __MpiCompilers_F77 TRUE ) |
82 |
elseif( __MpiCompilers_comp STREQUAL F90 ) |
83 |
set( __MpiCompilers_F90 TRUE ) |
84 |
else( __MpiCompilers_comp STREQUAL C ) |
85 |
message( FATAL_ERROR "Unknown component ${__MpiCompilers_comp}" ) |
86 |
endif( __MpiCompilers_comp STREQUAL C ) |
87 |
endforeach( __MpiCompilers_comp ) |
88 |
else( MpiCompilers_FIND_COMPONENTS ) |
89 |
# by default turn all components on |
90 |
set( __MpiCompilers_C TRUE ) |
91 |
set( __MpiCompilers_CXX TRUE ) |
92 |
set( __MpiCompilers_F77 TRUE ) |
93 |
set( __MpiCompilers_F90 TRUE ) |
94 |
endif( MpiCompilers_FIND_COMPONENTS ) |
95 |
|
96 |
# find the requested compilers and set up the list |
97 |
# of required variables |
98 |
set( __MpiCompilers_REQVARS "" ) |
99 |
set( __MpiCompilers_FOUNDCOMPILERS "" ) |
100 |
if( __MpiCompilers_C ) |
101 |
if( NOT "$ENV{MPICOMPILERS_C}" STREQUAL "" ) |
102 |
set( MPICOMPILERS_C $ENV{MPICOMPILERS_C} CACHE FILEPATH "Path to |
103 |
the MPI C compiler" ) |
104 |
else( NOT "$ENV{MPICOMPILERS_C}" STREQUAL "" ) |
105 |
find_program( MPICOMPILERS_C mpicc DOC "Path to the MPI C |
106 |
compiler" ) |
107 |
endif( NOT "$ENV{MPICOMPILERS_C}" STREQUAL "" ) |
108 |
list( APPEND __MpiCompilers_REQVARS MPICOMPILERS_C ) |
109 |
set( __MpiCompilers_FOUNDCOMPILERS "$ |
110 |
{__MpiCompilers_FOUNDCOMPILERS} ${MPICOMPILERS_C}" ) |
111 |
endif( __MpiCompilers_C ) |
112 |
if( __MpiCompilers_CXX ) |
113 |
if( NOT "$ENV{MPICOMPILERS_CXX}" STREQUAL "" ) |
114 |
set( MPICOMPILERS_CXX $ENV{MPICOMPILERS_CXX} CACHE FILEPATH "Path |
115 |
to the MPI C++ compiler" ) |
116 |
else( NOT "$ENV{MPICOMPILERS_CXX}" STREQUAL "" ) |
117 |
find_program( MPICOMPILERS_CXX NAMES mpicxx mpic++ DOC "Path to |
118 |
the MPI C++ compiler" ) |
119 |
endif( NOT "$ENV{MPICOMPILERS_CXX}" STREQUAL "" ) |
120 |
list( APPEND __MpiCompilers_REQVARS MPICOMPILERS_CXX ) |
121 |
set( __MpiCompilers_FOUNDCOMPILERS "$ |
122 |
{__MpiCompilers_FOUNDCOMPILERS} ${MPICOMPILERS_CXX}" ) |
123 |
endif( __MpiCompilers_CXX ) |
124 |
if( __MpiCompilers_F77 ) |
125 |
if( NOT "$ENV{MPICOMPILERS_F77}" STREQUAL "" ) |
126 |
set( MPICOMPILERS_F77 $ENV{MPICOMPILERS_F77} CACHE FILEPATH "Path |
127 |
to the MPI F77 compiler" ) |
128 |
else( NOT "$ENV{MPICOMPILERS_F77}" STREQUAL "" ) |
129 |
find_program( MPICOMPILERS_F77 mpif77 DOC "Path to the MPI F77 |
130 |
compiler" ) |
131 |
endif( NOT "$ENV{MPICOMPILERS_F77}" STREQUAL "" ) |
132 |
list( APPEND __MpiCompilers_REQVARS MPICOMPILERS_F77 ) |
133 |
set( __MpiCompilers_FOUNDCOMPILERS "$ |
134 |
{__MpiCompilers_FOUNDCOMPILERS} ${MPICOMPILERS_F77}" ) |
135 |
endif( __MpiCompilers_F77 ) |
136 |
if( __MpiCompilers_F90 ) |
137 |
if( NOT "$ENV{MPICOMPILERS_F90}" STREQUAL "" ) |
138 |
set( MPICOMPILERS_F90 $ENV{MPICOMPILERS_F90} CACHE FILEPATH "Path |
139 |
to the MPI F90 compiler" ) |
140 |
else( NOT "$ENV{MPICOMPILERS_F90}" STREQUAL "" ) |
141 |
find_program( MPICOMPILERS_F90 mpif90 DOC "Path to the MPI F77 |
142 |
compiler" ) |
143 |
endif( NOT "$ENV{MPICOMPILERS_F90}" STREQUAL "" ) |
144 |
list( APPEND __MpiCompilers_REQVARS MPICOMPILERS_F90 ) |
145 |
set( __MpiCompilers_FOUNDCOMPILERS "$ |
146 |
{__MpiCompilers_FOUNDCOMPILERS} ${MPICOMPILERS_F90}" ) |
147 |
endif( __MpiCompilers_F90 ) |
148 |
|
149 |
mark_as_advanced( ${__MpiCompilers_REQVARS} ) |
150 |
|
151 |
# handle standard arguments |
152 |
include( FindPackageHandleStandardArgs ) |
153 |
find_package_handle_standard_args( MpiCompilers DEFAULT_MSG |
154 |
__MpiCompilers_FOUNDCOMPILERS ${__MpiCompilers_REQVARS} ) |
155 |
|