1 cmake_minimum_required( VERSION 3.20 )
2 cmake_policy( SET CMP0118 NEW )
6 enable_language( Fortran )
9 set( EXPORT_NAME ${PROJECT_NAME} )
10 set( INTERNAL_GRIB2_PATH ${CMAKE_INSTALL_PREFIX}/grib2 )
12 if ( NOT DEFINED WRF_DIR AND NOT DEFINED WRF_ROOT )
13 message( STATUS "No WRF_DIR or WRF_ROOT provided, skipping targets that rely on WRF" )
16 list( APPEND CMAKE_MODULE_PATH
17 ${PROJECT_SOURCE_DIR}/cmake/
18 ${PROJECT_SOURCE_DIR}/cmake/modules
21 # I'd love to be able to do something like this, but this would place a depedency
22 # on WRF which would be bad since who would expect the *WRF Preprocessing System*
23 # to have a strict dependency on WRF. Silly me
24 # if ( DEFINED WRF_DIR )
25 # list( APPEND CMAKE_MODULE_PATH
30 # Use link paths as rpaths
31 set( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE )
32 set( CMAKE_Fortran_PREPROCESS ON )
34 include( CMakePackageConfigHelpers )
35 # include( confcheck )
37 include( wrf_get_version )
40 wrf_get_version( ${PROJECT_SOURCE_DIR}/README )
42 ################################################################################
46 ################################################################################
48 # Through ***MUCH*** debugging, if utilizing MPI_<LANG>_COMPILER
49 # https://cmake.org/cmake/help/latest/module/FindMPI.html#variables-for-locating-mpi
50 # the find logic makes a mess of things by utilizing <mpi> -show[me]
51 # Which may or may not get polluted by the environment
52 # It still technically finds MPI but the output is nonintuitive
53 # saying things like hdf5 or pthread
54 find_package( MPI REQUIRED COMPONENTS Fortran C )
55 add_compile_definitions(
60 if ( DEFINED WRF_MPI_Fortran_FLAGS AND NOT "${WRF_MPI_Fortran_FLAGS}" STREQUAL "" )
62 $<$<COMPILE_LANGUAGE:Fortran>,${WRF_MPI_Fortran_FLAGS}>
66 if ( DEFINED WRF_MPI_C_FLAGS AND NOT "${WRF_MPI_C_FLAGS}" STREQUAL "" )
68 $<$<COMPILE_LANGUAGE:C>,${WRF_MPI_C_FLAGS}>
74 find_package( OpenMP REQUIRED COMPONENTS Fortran C )
75 add_compile_definitions( USE_OPENMP=1 SM_PARALLEL )
80 if ( BUILD_EXTERNALS )
81 add_subdirectory( external )
82 # If we got here everything built, we are safe to add find paths for libs
83 set( ZLIB_ROOT ${INTERNAL_GRIB2_PATH} ) # This may get overridden by HDF5 if zlib is packaged with that
84 set( PNG_ROOT ${INTERNAL_GRIB2_PATH} )
85 set( Jasper_ROOT ${INTERNAL_GRIB2_PATH} )
89 # Now find required libraries, which may have been affected by externals
90 if ( DEFINED WRF_DIR OR DEFINED WRF_ROOT )
91 find_package( WRF COMPONENTS WRF_Core io_netcdf io_grib1 io_int REQUIRED )
93 message( STATUS "Found WRF : ${WRF_CONFIG} (found version \"${WRF_VERSION}\")" )
97 # Find externals now -- this is a little different than normal since we want WRF to
98 # take precedence if it is present on which libraries to use to avoid library splicing
99 # rather than finding our external thirdparty libraries first
100 find_package( ZLIB REQUIRED )
101 find_package( PNG REQUIRED )
102 find_package( Jasper 1.900.1...<1.900.24 REQUIRED )
104 # Add config definitions
105 message( STATUS "Adding configuration specific definitions : ${WPS_DEFINITIONS}" )
107 string( REPLACE " " ";" WPS_DEFINITIONS_LIST ${WPS_DEFINITIONS} )
109 # Make a copy, filter for anything not -D
110 set( WPS_UNDEFINITIONS_LIST ${WPS_DEFINITIONS_LIST} )
111 list( FILTER WPS_UNDEFINITIONS_LIST EXCLUDE REGEX "^-D(.*)" )
113 # Add this to the cpp processing
114 list( APPEND CMAKE_C_PREPROCESSOR_FLAGS ${WPS_UNDEFINITIONS_LIST} -P -nostdinc -traditional )
116 # Filter for anything that is -D
117 list( FILTER WPS_DEFINITIONS_LIST INCLUDE REGEX "^-D(.*)" )
119 # In CMake 2.26 this will not be necessary
120 list( TRANSFORM WPS_DEFINITIONS_LIST REPLACE "^-D(.*)" "\\1" )
122 add_compile_definitions(
123 ${WPS_DEFINITIONS_LIST}
124 ${WPS_UNDEFINITIONS_LIST}
125 $<$<COMPILE_LANGUAGE:Fortran>:USE_JPEG2000>
126 $<$<COMPILE_LANGUAGE:Fortran>:USE_PNG>
128 # Whole project flags
130 $<$<COMPILE_LANG_AND_ID:Fortran,GNU>:-fallow-argument-mismatch>
134 # Always build whatever we can
135 add_subdirectory( ungrib )
137 if ( DEFINED WRF_DIR )
138 # WRF Specific things
139 add_subdirectory( metgrid )
140 add_subdirectory( geogrid )
143 add_subdirectory( util )
146 ################################################################################
148 ## Install and export
150 ################################################################################
152 # Install to namespace
154 EXPORT ${EXPORT_NAME}Targets
155 DESTINATION lib/cmake/
156 FILE ${EXPORT_NAME}Targets.cmake
157 NAMESPACE ${EXPORT_NAME}::
160 configure_package_config_file(
161 ${PROJECT_SOURCE_DIR}/cmake/template/${EXPORT_NAME}Config.cmake.in
162 ${CMAKE_BINARY_DIR}/${EXPORT_NAME}Config.cmake
163 INSTALL_DESTINATION lib/cmake
166 write_basic_package_version_file(
167 ${CMAKE_BINARY_DIR}/${EXPORT_NAME}ConfigVersion.cmake
168 VERSION ${PROJECT_VERSION}
169 #!TODO Check if this is the type of versioning support we want to use
170 COMPATIBILITY SameMinorVersion
175 ${CMAKE_BINARY_DIR}/${EXPORT_NAME}Config.cmake
176 ${CMAKE_BINARY_DIR}/${EXPORT_NAME}ConfigVersion.cmake
177 DESTINATION lib/cmake
180 # Install some helper files for anyone using this build as part of their code
183 # Trailing / is important
184 ${PROJECT_SOURCE_DIR}/cmake/modules/