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