1# (C) Copyright 2011- ECMWF.
2#
3# This software is licensed under the terms of the Apache Licence Version 2.0
4# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5# In applying this licence, ECMWF does not waive the privileges and immunities
6# granted to it by virtue of its status as an intergovernmental organisation nor
7# does it submit to any jurisdiction.
8
9##############################################################################
10#.rst:
11#
12# ecbuild_check_fortran
13# =====================
14#
15# Check for Fortran features. ::
16#
17#   ecbuild_check_fortran( [ FEATURES <feature1> [ <feature2> ... ] ]
18#                          [ REQUIRED <feature1> [ <feature2> ... ] ]
19#                          [ PRINT ] )
20#
21# Options
22# -------
23#
24# FEATURES : optional
25#   list of optional features to check for
26#
27# REQUIRED : optional
28#   list of required features to check for, fails if not detected
29#
30# PRINT : optional
31#   print a summary of features checked for, found and not found
32#
33# Note
34# ----
35#
36# If neither ``FEATURES`` nor ``REQUIRED`` are given, check for all features.
37#
38##############################################################################
39
40function( ecbuild_check_fortran )
41
42  # parse parameters
43
44  set( options PRINT )
45  set( single_value_args )
46  set( multi_value_args   FEATURES REQUIRED )
47
48  cmake_parse_arguments( _p "${options}" "${single_value_args}" "${multi_value_args}"  ${_FIRST_ARG} ${ARGN} )
49
50  if(_PAR_UNPARSED_ARGUMENTS)
51    ecbuild_critical("Unknown keywords given to ecbuild_check_fortran(): \"${_PAR_UNPARSED_ARGUMENTS}\"")
52  endif()
53
54  include( ${ECBUILD_MACROS_DIR}/fortran_features/CheckFortranFeatures.cmake )
55
56  fortran_find_all_features( ALL_FEATURES ) # list all available features to check
57
58  if( NOT _p_FEATURES AND NOT _p_REQUIRED ) # no input, then search for all features
59
60    fortran_feature_check()
61
62  else()
63
64    foreach( _f ${_p_FEATURES} )
65      fortran_feature_check( ${_f} )
66    endforeach()
67
68    foreach( _f ${_p_REQUIRED} )
69      fortran_feature_check( REQUIRED ${_f} )
70    endforeach()
71
72  endif()
73
74  if( _p_FEATURES OR _p_REQUIRED )
75    set( Fortran_CHECKED_FEATURES ${_p_FEATURES} ${_p_REQUIRED} )
76  else()
77    set( Fortran_CHECKED_FEATURES ${ALL_FEATURES} )
78  endif()
79
80  foreach( f ${Fortran_CHECKED_FEATURES} )
81    string( TOUPPER ${f} FEAT )
82    if( HAS_Fortran_${FEAT} )
83       list( APPEND Fortran_SUPPORTED_FEATURES ${f} )
84       set( EC_HAVE_Fortran_${FEAT} 1 PARENT_SCOPE )
85    else()
86       list( APPEND Fortran_NOT_SUPPORTED_FEATURES ${f} )
87       set( EC_HAVE_Fortran_${FEAT} 0 PARENT_SCOPE )
88    endif()
89  endforeach()
90
91  if( Fortran_CHECKED_FEATURES )
92    list( SORT Fortran_CHECKED_FEATURES )
93  endif()
94  if( Fortran_SUPPORTED_FEATURES )
95    list( SORT Fortran_SUPPORTED_FEATURES )
96  endif()
97  if( Fortran_NOT_SUPPORTED_FEATURES )
98    list( SORT Fortran_NOT_SUPPORTED_FEATURES )
99  endif()
100
101  set( Fortran_CHECKED_FEATURES       ${Fortran_CHECKED_FEATURES}       PARENT_SCOPE )
102  set( Fortran_SUPPORTED_FEATURES     ${Fortran_SUPPORTED_FEATURES}     PARENT_SCOPE )
103  set( Fortran_NOT_SUPPORTED_FEATURES ${Fortran_NOT_SUPPORTED_FEATURES} PARENT_SCOPE )
104
105  if( _p_PRINT )
106    if( Fortran_CHECKED_FEATURES )
107      join( Fortran_CHECKED_FEATURES " " Fortran_CHECKED_FEATURES_STR )
108      ecbuild_info( "Checked Fortran features: ${Fortran_CHECKED_FEATURES_STR}" )
109    else()
110      ecbuild_info( "Checked no Fortran features" )
111    endif()
112    if( Fortran_SUPPORTED_FEATURES )
113      join( Fortran_SUPPORTED_FEATURES " " Fortran_SUPPORTED_FEATURES_STR )
114      ecbuild_info( "Found Fortran features: ${Fortran_SUPPORTED_FEATURES_STR}" )
115    else()
116      ecbuild_info( "Found no Fortran features" )
117    endif()
118    if( Fortran_NOT_SUPPORTED_FEATURES )
119      join( Fortran_NOT_SUPPORTED_FEATURES " " Fortran_NOT_SUPPORTED_FEATURES_STR )
120      ecbuild_info( "Not found Fortran features: ${Fortran_NOT_SUPPORTED_FEATURES_STR}" )
121    else()
122      ecbuild_info( "Found all checked Fortran features" )
123    endif()
124  endif()
125
126endfunction( ecbuild_check_fortran )
127