diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000000..32a36f6154 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,918 @@ +cmake_minimum_required( VERSION 3.20 ) +cmake_policy( SET CMP0118 NEW ) + +enable_language( C ) +enable_language( CXX ) +enable_language( Fortran ) + +project( WRF ) +set( EXPORT_NAME ${PROJECT_NAME} ) + +if ( DEFINED CMAKE_TOOLCHAIN_FILE ) + set( WRF_CONFIG ${CMAKE_TOOLCHAIN_FILE} ) + # message( STATUS "Loading configuration file... : ${WRF_CONFIG}" ) + # include( ${WRF_CONFIG} ) +endif() + +# list( APPEND CMAKE_MODULE_PATH ) +list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/ ${PROJECT_SOURCE_DIR}/cmake/modules ) + +# Use link paths as rpaths +set( CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE ) +set( CMAKE_Fortran_PREPROCESS ON ) + +# This is always set +list( APPEND CMAKE_C_PREPROCESSOR_FLAGS -P -nostdinc -traditional ) + +include( CMakePackageConfigHelpers ) +include( CheckIPOSupported ) +include( c_preproc ) +include( m4_preproc ) +include( target_copy ) +include( confcheck ) +include( gitinfo ) +include( printOption ) +include( wrf_case_setup ) +include( wrf_get_version ) + +check_ipo_supported( RESULT IPO_SUPPORT ) + +# First grab git info +wrf_git_commit( + RESULT_VAR GIT_VERSION + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + ) + +# Configure file for usage +configure_file( + ${PROJECT_SOURCE_DIR}/cmake/template/commit_decl.cmake + ${PROJECT_BINARY_DIR}/inc/commit_decl + @ONLY + ) + +# Grab version info +wrf_get_version( ${PROJECT_SOURCE_DIR}/README ) + +################################################################################ +## +## Options that can be user configured +## +################################################################################ +# Mode configuration + +set( OPTIMIZATION_LEVEL "" ) +set( WRF_OS "" ) +set( WRF_MACH "" ) + +if ( "${CMAKE_BUILD_TYPE}" STREQUAL "" ) + set( CMAKE_BUILD_TYPE Release ) + message( STATUS "Set default build type to ${CMAKE_BUILD_TYPE}" ) +endif() +################################################################################ +## WRF Core selection +################################################################################ +set( WRF_CORE_OPTIONS + # Options listed here + ARW + CONVERT # This exists in compile but not configure + DA # Var directory + DA_4D_VAR + PLUS + ) + +set( WRF_CORE "" CACHE STRING "WRF_CORE" ) +if ( "${WRF_CORE}" STREQUAL "" ) + # Set default WRF_CORE + list( GET WRF_CORE_OPTIONS 0 WRF_CORE ) +endif() + +################################################################################ +## WRF Nesting selection +################################################################################ +set( WRF_NESTING_OPTIONS + # Options listed here + NONE + BASIC + MOVES + VORTEX + ) + +set( WRF_NESTING "" CACHE STRING "WRF_NESTING" ) +if ( "${WRF_NESTING}" STREQUAL "" ) + # Set default WRF_NESTING + list( GET WRF_NESTING_OPTIONS 0 WRF_NESTING ) +endif() + +################################################################################ +## WRF Case selection +##!TODO Maybe one day make it so this doesn't need to be a selection and all are +## always built? +################################################################################ +set( WRF_CASE_OPTIONS + # Options listed here + EM_REAL # make this the default + # EM_IDEAL # Technically doable but does anyone build this? It is not a target option in make + EM_FIRE + EM_SCM_XY + EM_TROPICAL_CYCLONE + EM_HELDSUAREZ + + # These are sub-categories of ideal - Keep these lower in the list + EM_B_WAVE # Keep this one here as it is used to check index + EM_GRAV2D_X + EM_HILL2D_X + EM_LES + EM_QUARTER_SS + EM_SEABREEZE2D_X + EM_CONVRAD + EM_SQUALL2D_X + EM_SQUALL2D_Y + ) + +set( WRF_CASE "" CACHE STRING "WRF_CASE" ) +if ( "${WRF_CASE}" STREQUAL "" ) + # Set default WRF_CASE + list( GET WRF_CASE_OPTIONS 0 WRF_CASE ) +endif() + +# DO NOT USE OPTION - IT DOES NOT WORK AS ANTICIPATED EVEN WHEN CLEARING CACHE - YOU HAVE BEEN WARNED +# If you add anything here, the description should be the name itself - this helps the configuration script +set( USE_DOUBLE OFF CACHE BOOL "USE_DOUBLE" ) +set( USE_MPI OFF CACHE BOOL "USE_MPI" ) +set( USE_OPENMP OFF CACHE BOOL "USE_OPENMP" ) +set( USE_HDF5 OFF CACHE BOOL "USE_HDF5" ) +set( USE_JASPER OFF CACHE BOOL "USE_JASPER" ) +set( USE_PIO OFF CACHE BOOL "USE_PIO" ) +set( USE_IPO OFF CACHE BOOL "USE_IPO" ) + + +set( ENABLE_CHEM OFF CACHE BOOL "ENABLE_CHEM" ) +set( ENABLE_CMAQ OFF CACHE BOOL "ENABLE_CMAQ" ) +set( ENABLE_KPP OFF CACHE BOOL "ENABLE_KPP" ) +set( ENABLE_DFI_RADAR OFF CACHE BOOL "ENABLE_DFI_RADAR" ) +set( ENABLE_TITAN OFF CACHE BOOL "ENABLE_TITAN" ) +set( ENABLE_MARS OFF CACHE BOOL "ENABLE_MARS" ) +set( ENABLE_VENUS OFF CACHE BOOL "ENABLE_VENUS" ) +set( ENABLE_VENUS OFF CACHE BOOL "ENABLE_VENUS" ) +set( ENABLE_TERRAIN OFF CACHE BOOL "ENABLE_TERRAIN" ) +set( ENABLE_CTSM OFF CACHE BOOL "ENABLE_CTSM" ) + +# What do these defines even do if they are always on???? +set( USE_ALLOCATABLES ON CACHE BOOL "USE_ALLOCATABLES" ) +set( wrfmodel ON CACHE BOOL "wrfmodel" ) +set( GRIB1 ON CACHE BOOL "GRIB1" ) +set( INTIO ON CACHE BOOL "INTIO" ) +set( KEEP_INT_AROUND ON CACHE BOOL "KEEP_INT_AROUND" ) +set( LIMIT_ARGS ON CACHE BOOL "LIMIT_ARGS" ) + +# Toggles, how do we want to best address these options? Environment vars are not +# the best +set( WRFIO_NCD_NO_LARGE_FILE_SUPPORT OFF CACHE BOOL "WRFIO_NCD_NO_LARGE_FILE_SUPPORT" ) +set( FORCE_NETCDF_CLASSIC OFF CACHE BOOL "FORCE_NETCDF_CLASSIC" ) +set( BUILD_RRTMG_FAST OFF CACHE BOOL "BUILD_RRTMG_FAST" ) +set( BUILD_RRTMK OFF CACHE BOOL "BUILD_RRTMK" ) +set( BUILD_SBM_FAST ON CACHE BOOL "BUILD_SBM_FAST" ) +set( SHOW_ALL_VARS_USED OFF CACHE BOOL "SHOW_ALL_VARS_USED" ) + + +# TODO investigate if this needs set +# Not cached, cannot be changed, do not touch +set( USE_M4 ON ) +# Same thing -what do these defines even do if they are always on???? +set( NMM_CORE OFF ) +set( NETCDF ON ) + + +# Special internal flag for profiling compilation +set( PROFILE_COMPILATION OFF CACHE BOOL "PROFILE_COMPILATION" ) + + +# From arch/preamble +#### Single location for defining total number of domains. You need +#### at least 1 + 2*(number of total nests). For example, 1 coarse +#### grid + three fine grids = 1 + 2(3) = 7, so MAX_DOMAINS=7. +set( MAX_DOMAINS_F 21 ) + + +#### DM buffer length for the configuration flags. + +set( CONFIG_BUF_LEN 65536 ) + +#### Size of bitmasks (in 4byte integers) of stream masks for WRF I/O + +set( MAX_HISTORY 25 ) + +set( IWORDSIZE 4 ) +set( DWORDSIZE 8 ) +set( LWORDSIZE 4 ) + + +######################## + +################################################################################ +## +## Load options selected and any ancillary logic +## +################################################################################ + +# Check WRF options +if ( NOT ${WRF_CORE} IN_LIST WRF_CORE_OPTIONS ) + message( FATAL_ERROR "WRF Core option not recognized : ${WRF_CORE}" ) +endif() + +if ( NOT ${WRF_NESTING} IN_LIST WRF_NESTING_OPTIONS ) + message( FATAL_ERROR "WRF Nesting option not recognized : ${WRF_NESTING}" ) +endif() + +if ( NOT ${WRF_CASE} IN_LIST WRF_CASE_OPTIONS ) + message( FATAL_ERROR "WRF Case option not recognized : ${WRF_CASE}" ) +endif() + + +# Handle selection +set( EM_CORE 1 ) +# Far easier to write this one as normal logic rather than generator expression +if( ${WRF_CORE} STREQUAL "CONVERT" OR ${WRF_CORE} STREQUAL "COAMPS" ) + set( EM_CORE 0 ) +endif() + +set( MOVE_NESTS 0 ) +# Far easier to write this one as normal logic rather than generator expression +if( ${WRF_NESTING} STREQUAL "MOVES" OR ${WRF_NESTING} STREQUAL "VORTEX" ) + set( MOVE_NESTS 1 ) +endif() + +if ( ${ENABLE_KPP} AND NOT ${ENABLE_CHEM} ) + message( WARNING "ENABLE_KPP requires ENABLE_CHEM but is not set, ignoring" ) +endif() + + +# Additional information on the type of case we are compiling +string( TOLOWER ${WRF_CASE} WRF_CASE_FOLDER ) +string( REPLACE "em_" "" WRF_CASE_MODULE ${WRF_CASE_FOLDER} ) + +# Find if it is a specialized ideal case or general +list( FIND WRF_CASE_OPTIONS EM_B_WAVE START_GENERAL_IDEAL_CASE_IDX ) +list( FIND WRF_CASE_OPTIONS ${WRF_CASE} CURRENT_CASE_IDX ) +set( WRF_GENERAL_IDEAL_CASE TRUE ) +if ( ${CURRENT_CASE_IDX} LESS ${START_GENERAL_IDEAL_CASE_IDX} ) + set( WRF_GENERAL_IDEAL_CASE FALSE ) +endif() + +if ( NOT ${WRFIO_NCD_NO_LARGE_FILE_SUPPORT} ) + message( STATUS "netCDF large file support not suppressed, if available it will be used" ) +endif() + + +# Handle double promotion - doing this here instead of from config.cmake toolchain +# file since the double promotion logic is a nightmare +list( FIND WRF_CORE_OPTIONS ${WRF_CORE} CURRENT_WRF_CORE_IDX ) +list( FIND WRF_CORE_OPTIONS "DA" START_DA_IDX ) +# DA + WRF PLUS cores require double precision +if ( ${CURRENT_WRF_CORE_IDX} GREATER_EQUAL ${START_DA_IDX} AND NOT ${USE_DOUBLE} ) + # if ( # Apparently set regardless of compiler + # ${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU" OR + # ${CMAKE_Fortran_COMPILER_ID} STREQUAL "Fujitsu" ) + message( STATUS "DA and PLUS Core builds require double precision" ) + set( USE_DOUBLE ON CACHE BOOL "Required by configuration" FORCE ) + # endif() +endif() + +if ( ${USE_DOUBLE} ) + set( RWORDSIZE 8 ) + if ( ${BUILD_SBM_FAST} ) + set( BUILD_SBM_FAST OFF CACHE BOOL "Required by configuration" FORCE ) + message( STATUS "BUILD_SBM_FAST does not support double, turning off" ) + endif() +else() + set( RWORDSIZE 4 ) +endif() + +math( EXPR RWORDSIZE_B "8 * ${RWORDSIZE}" ) + + +# Check if IPO usage +if ( ${USE_IPO} ) + if ( NOT ${IPO_SUPPORT} ) + message( STATUS "IPO/LTO not supported, request ignored" ) + set( USE_IPO OFF CACHE BOOL "Required by configuration" FORCE ) + endif() +endif() + +################################################################################ +## +## Now find packages that cross-compilation is potentially handled +## +################################################################################ +# If nesting is enabled, DM_PARALLEL must be set, but if this is a non-MPI compilation +# we must stub its usage +list( FIND WRF_NESTING_OPTIONS ${WRF_NESTING} CURRENT_NESTING_IDX ) + +# If MPI or nesting +set( USE_RSL_LITE OFF ) +if ( ${USE_MPI} ) + # Through ***MUCH*** debugging, if utilizing MPI__COMPILER + # https://cmake.org/cmake/help/latest/module/FindMPI.html#variables-for-locating-mpi + # the find logic makes a mess of things by utilizing -show[me] + # Which may or may not get polluted by the environment + # It still technically finds MPI but the output is nonintuitive + # saying things like hdf5 or pthread + find_package( MPI REQUIRED COMPONENTS Fortran C ) + add_compile_definitions( + USE_MPI=1 + DM_PARALLEL + ) + + if ( DEFINED WRF_MPI_Fortran_FLAGS AND NOT "${WRF_MPI_Fortran_FLAGS}" STREQUAL "" ) + add_compile_options( + $<$:${WRF_MPI_Fortran_FLAGS}> + ) + endif() + + if ( DEFINED WRF_MPI_C_FLAGS AND NOT "${WRF_MPI_C_FLAGS}" STREQUAL "" ) + add_compile_options( + $<$:${WRF_MPI_C_FLAGS}> + ) + endif() + + # Check if MPI in all its glory has forced IPO down our throats due to hard-coding the wrapper flags + # https://www.open-mpi.org/faq/?category=mpi-apps#why-no-rpath LOL! + # Quote "The default installation of Open MPI tries very hard to not include any non-essential flags in the wrapper compilers" + # Okay, yea sure. Maybe it's the distro's lib config that does add all the bloatware flags + if ( NOT ${USE_IPO} ) + # get compile info + message( STATUS "Checking if MPI requires IPO" ) + foreach( IPO_FLAG IN LISTS CMAKE_Fortran_COMPILE_OPTIONS_IPO ) + string( FIND "${MPI_Fortran_COMPILE_OPTIONS}" ${IPO_FLAG} MPI_FORCE_IPO ) + # Note we are not using IN_LIST since certain IPO settings might not exactly match (e.g. -flto vs -flto=auto) + if ( NOT ${MPI_FORCE_IPO} EQUAL -1 ) + # An IPO flag was found + if ( ${IPO_SUPPORT} ) + message( STATUS "NOTE: ${MPI_Fortran_COMPILER} requires IPO flags be enabled, forcing USE_IPO=ON" ) + set( USE_IPO ON CACHE BOOL "Required by MPI" FORCE ) + break() + else() + message( FATAL_ERROR "${MPI_Fortran_COMPILER} requires IPO support but selected compiler does not support it, would fail to link" ) + endif() + endif() + endforeach() + endif() + + set( USE_RSL_LITE ON ) +# We know NONE is the zero index so compare against that +elseif( ${CURRENT_NESTING_IDX} GREATER 0 ) + add_compile_definitions( + DM_PARALLEL + STUBMPI + ) + set( USE_RSL_LITE ON ) +endif() + +if ( ${USE_OPENMP} ) + find_package( OpenMP REQUIRED COMPONENTS Fortran C ) + add_compile_definitions( USE_OPENMP=1 SM_PARALLEL ) +endif() + +if ( ${USE_M4} ) + find_program( + M4_PROGRAM + m4 + REQUIRED + ) + set( M4_FLAGS ${WRF_M4_FLAGS} -Uinclude -Uindex -Ulen ) +endif() + + + +# HDF5 has some funky weirdness between versions where the casing has changed +# Optional +if ( ${USE_HDF5} ) + find_package( HDF5 ) +endif() + +# Optional for grib2 +if ( ${USE_JASPER} ) + find_package( Jasper 1.900.1...<1.900.24 ) +endif() + +# Optional +if ( ${USE_PIO} ) + find_package( PIO QUIET ) +endif() + +if ( ${ENABLE_TERRAIN} ) + find_package( RPC ) +endif() + +if ( ${ENABLE_CTSM} ) + # Will need our own finder + # find_package( CTSM REQUIRED ) +endif() + +# Will need our own finder +# find_package( GPFS REQUIRED ) + +# Included is a lightweight finder, but we really should switch to using UniData's netCDF cmake config +# The reason these are two separate and not COMPONENTS of one larger package is because that is the way UniData +# has laid out the cmake configs for each respective package +find_package( netCDF REQUIRED ) +find_package( netCDF-Fortran REQUIRED ) + +# Make use of version checking here and not in find_package for previous versions that did not use cmake +if ( ( NOT netCDF_VERSION GREATER_EQUAL "4.1.3" ) OR ( NOT netCDF-Fortran_VERSION GREATER_EQUAL "4.1.3" ) ) + message( FATAL "Please make sure NETCDF versions are 4.1.3 or later. " ) +endif() + +find_package( pnetCDF QUIET ) + +# Attempt to find zlib packaged with netcdf first +set( ZLIB_ROOT ${netCDF_PREFIX} ) +find_package( ZLIB REQUIRED ) +find_package( CURL REQUIRED ) + +################################################################################ +## +## Print out final set of options to be used +## DO NOT MODIFY OPTIONS BEYOND THIS POINT +## +################################################################################ + +if ( DEFINED CMAKE_TOOLCHAIN_FILE ) + print_option( WRF_CONFIG 20 ${BOLD_CYAN} ) +endif() + +print_option( CMAKE_BUILD_TYPE 20 ${BOLD_CYAN} ) + + +print_option( WRF_CORE 20 ${BOLD_CYAN} ) +print_option( WRF_NESTING 20 ${BOLD_CYAN} ) +print_option( WRF_CASE 20 ${BOLD_CYAN} ) + + +print_option( USE_DOUBLE 20 ) +print_option( USE_MPI 20 ) +print_option( USE_OPENMP 20 ) +print_option( USE_IPO 20 ) + +print_option( ENABLE_CHEM 20 ) +print_option( ENABLE_CMAQ 20 ) +print_option( ENABLE_KPP 20 ) +print_option( ENABLE_DFI_RADAR 20 ) +print_option( ENABLE_TITAN 20 ) +print_option( ENABLE_MARS 20 ) +print_option( ENABLE_VENUS 20 ) +print_option( ENABLE_VENUS 20 ) +print_option( ENABLE_TERRAIN 20 ) +print_option( ENABLE_CLM 20 ) + +print_option( USE_ALLOCATABLES 20 ) +print_option( wrfmodel 20 ) +print_option( GRIB1 20 ) +print_option( INTIO 20 ) +print_option( KEEP_INT_AROUND 20 ) +print_option( LIMIT_ARGS 20 ) + +print_option( FORCE_NETCDF_CLASSIC 20 ) +print_option( BUILD_RRTMG_FAST 20 ) +print_option( BUILD_RRTMK 20 ) +print_option( BUILD_SBM_FAST 20 ) +print_option( SHOW_ALL_VARS_USED 20 ) + +print_option( WRFIO_NCD_NO_LARGE_FILE_SUPPORT 36 ) + +################################################################################ +## +## Set any global cmake options decided by particular configuration +## +################################################################################ +set( CMAKE_INTERPROCEDURAL_OPTIMIZATION ${USE_IPO} ) + +################################################################################ +## +## Configuration checks for features & intrinsices +## +################################################################################ +add_subdirectory( confcheck ) + +################################################################################ +## +## Adjust flags based on compiler and linker used +## +################################################################################ + +# https://stackoverflow.com/a/47927921 +# Define compile options to be inherited for directories +define_property( + SOURCE + PROPERTY COMPILE_FLAGS + INHERITED + BRIEF_DOCS "brief-doc" + FULL_DOCS "full-doc" + ) + +define_property( + DIRECTORY + PROPERTY COMPILE_FLAGS + INHERITED + BRIEF_DOCS "brief-doc" + FULL_DOCS "full-doc" + ) + +# Get current build type flags and put them in there +if ( "${CMAKE_BUILD_TYPE}" STREQUAL "Release" ) + set_directory_properties( + PROPERTIES + COMPILE_FLAGS + $<$:${WRF_FCOPTIM}> + ) +# else() +# # Assume no optimization +# set_directory_properties( +# PROPERTIES +# COMPILE_FLAGS +# $<$:${WRF_FCNOOPT}> +# ) +endif() + + +# This is really ugly but such is the cost of supporting many ways to say the same thing +# https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html +add_compile_options( + # Use "" and ; specifically to evaluate correctly + # "$<$:>" #@ Absoft Fortran + # "$<$:>" #@ Analog VisualDSP++ + # "$<$:>" #@ Apple Clang + # "$<$:>" #@ ARM Compiler + # "$<$:>" #@ ARM Compiler based on Clang + # "$<$:>" #@ Bruce C Compiler + # "$<$:>" #@ Concurrent Fortran + # "$<$:>" #@ LLVM Clang + "$<$:-s;integer32;-s;real${RWORDSIZE_B}>" #@ Cray Compiler + # "$<$:>" #@ Embarcadero + "$<$,$>:-fdefault-real-${RWORDSIZE}>" #@ Classic Flang Fortran Compiler + # "$<$:>" #@ LLVM Flang Fortran Compiler + "$<$:-CcdRR${RWORDSIZE}>" #@ Fujitsu HPC compiler (Trad mode) + # "$<$:>" #@ Fujitsu HPC compiler (Clang mode) + "$<$:-r${RWORDSIZE};-i4>" #@ G95 Fortran + "$<$,$>:-fdefault-real-${RWORDSIZE}>" #@ GNU Compiler Collection + # "$<$:>" #@ Green Hills Software + # "$<$:>" #@ Hewlett-Packard Compiler + # "$<$:>" #@ IAR Systems + "$<$:-real-size;${RWORDSIZE_B};-i4>" #@ Intel Classic Compiler + "$<$:-real-size;${RWORDSIZE_B};-i4>" #@ Intel LLVM-Based Compiler + # "$<$:>" #@ MCST Elbrus C/C++/Fortran Compiler + # "$<$:>" #@ Microsoft Visual Studio + "$<$:-r${RWORDSIZE};-i4>" #@ NVIDIA HPC Compiler + # "$<$:>" #@ NVIDIA CUDA Compiler + # "$<$:>" #@ Open Watcom + "$<$:-r${RWORDSIZE};-i4>" #@ The Portland Group + "$<$:-r${RWORDSIZE};-i4>" #@ PathScale + # "$<$:>" #@ Small Device C Compiler + # "$<$:>" #@ Oracle Solaris Studio + # "$<$:>" #@ Tasking Compiler Toolsets + # "$<$:>" #@ Texas Instruments + # "$<$:>" #@ Tiny C Compiler + "$<$:-qrealsize=${RWORDSIZE};-qintsize=4>" #@ IBM XL + # "$<$:>" #@ IBM Clang-based XL + # "$<$:>" #@ IBM LLVM-based Compiler + # Todo find how to handle default selection or add new compiler IDs + # unknown how to add support for sxf90 + + # line lengths + "$<$:-ffree-line-length-none>" #@ GNU Compiler Collection + ) + + +# https://stackoverflow.com/a/53155812 +# set( Fortran_COMPILER_ID ${CMAKE_Fortran_COMPILER_ID} ) +# message( STATUS "Set Fortran_COMPILER_ID to : ${Fortran_COMPILER_ID}" ) + + +# Whole project flags +add_compile_options( + # $<$:-cpp> + # Use "" and ; specifically to evaluate correctly + "$<$:-diag-disable;6843>" + $<$,$>:-fallow-argument-mismatch> + $<$,$>:-fallow-invalid-boz> + $<$,$>:-ffree-line-length-none> + + # $,$:-diag-disable;6843> + ) + +if ( ${PROFILE_COMPILATION} ) + message( STATUS "Attemping to add compilation profiling..." ) + add_compile_options( + $<$:-ftime-report> + ) +endif() + +add_compile_definitions( + MAX_DOMAINS_F=${MAX_DOMAINS_F} + CONFIG_BUF_LEN=${CONFIG_BUF_LEN} + MAX_HISTORY=${MAX_HISTORY} + IWORDSIZE=${IWORDSIZE} + DWORDSIZE=${DWORDSIZE} + LWORDSIZE=${LWORDSIZE} + RWORDSIZE=${RWORDSIZE} + # Only define if set, this is to use #ifdef/#ifndef preprocessors + # in code since cmake cannot handle basically any others :( + # https://gitlab.kitware.com/cmake/cmake/-/issues/17398 + $<$:WRF_CHEM=$> + $<$:BUILD_CHEM=$> + $<$:WRF_CMAQ=$> + $<$,$>:WRF_KPP=$> + $<$:WRF_DFI_RADAR=$> + $<$:WRF_TITAN=$> + $<$:WRF_MARS=$> + $<$:WRF_VENUS=$> + + # Because once again we need two defines to control one thing + $<$:WRF_USE_CTSM=$> + $<$>:WRF_USE_CLM> + + # If force classic or no nc-4 support enable classic + $<$,$>>:NETCDF_classic=1> + $<$,$>>:WRFIO_NCD_NO_LARGE_FILE_SUPPORT=1> + # May need a check for WRFIO_ncdpar_LARGE_FILE_SUPPORT + + # Now set the opposite in different defines, because why not :) + $<$>,$>:USE_NETCDF4_FEATURES=1> + $<$>,$>:WRFIO_NCD_LARGE_FILE_SUPPORT=1> + + # Could simplify logic to just check if RPC is available but to be explicit + # Does this actually need to check for EM_CORE (Config.pl:443) + # not enable terran or not rpc_found do + # not ( enable terrain and rpc_found ) + $<$,$>>:LANDREAD_STUB> + $<$:TERRAIN_AND_LANDUSE> + + + $<$:USE_ALLOCATABLES> + $<$:wrfmodel> + $<$:GRIB1> + $<$:INTIO> + $<$:KEEP_INT_AROUND> + $<$:LIMIT_ARGS> + + #!TODO Always defined - fix the ambiguous english in these BUILD_*_FAST defines + BUILD_RRTMG_FAST=$ + BUILD_RRTMK=$ + BUILD_SBM_FAST=$ + SHOW_ALL_VARS_USED=$ + + # Alwasys set + NMM_CORE=$ + NMM_MAX_DIM=2600 + NETCDF + + #!TODO Change this to a confcheck + NONSTANDARD_SYSTEM_SUBR + + EM_CORE=${EM_CORE} + WRFPLUS=$> + DA_CORE=$,$>> + # DFI_RADAR=$ + + # Nesting options + $<$:MOVE_NESTS> + $<$>:VORTEX_CENTER> + + # Configuration checks + $<$>:NO_IEEE_MODULE> + $<$>:NO_ISO_C_SUPPORT> + # If flush fails, check if we can fall back to fflush, and if not no support + $<$>:$,USE_FFLUSH,NO_FLUSH_SUPPORT>> + $<$>:NO_GAMMA_SUPPORT> + + #!TODO Leaving as is in WRF for now but investigate why we don't do this + # https://stackoverflow.com/a/1035713 + # If fseeko64 succeeds, use that, else check if we can fall back to fseeko, and if not just use fseek + $,FSEEKO64_OK,$,FSEEKO_OK,FSEEK_OK>> + + # I don't believe these are used anymore... + # $<$:MPI2_SUPPORT=$> + # $<$:MPI2_THREAD_SUPPORT=$> + + ) + + +# Make core target +add_library( + ${PROJECT_NAME}_Core + STATIC + ) + +# Supplemental to core, or rather should be, some stuff in external is legitimately part of WRF and others +# are source code from truly external repositories - albeit old versions +add_subdirectory( external ) +add_subdirectory( tools ) + +# add_dependencies() does not support generator expressions so whatever we can defer to linking please do so +add_dependencies( + ${PROJECT_NAME}_Core + # So many things depend on this that I'm adding a dep here + registry_code + ) +target_include_directories( + ${PROJECT_NAME}_Core + PUBLIC + # List module directories first so the compiler does not get confused + # about things "not being compiled yet" - yes, yes it is compiled + # These are already set up to be @ install location + $ + $ + $ + $ + $ + + $ + + + $ + $ + $ + $ + + $ + $ + + # For install interface includes, i.e. when used by external tools + # such as WPS + # $ + $ + $ + $ + + PRIVATE + # May or may not exist + $<$:$> + $<$:$> + $<$:$> + $<$:$> + $<$:$> + $<$:$> + $<$:$> + $<$:$> + $<$:$> + + ${PROJECT_SOURCE_DIR}/dyn_em + + # externals + ${PROJECT_SOURCE_DIR}/external/esmf_time_f90 + ${PROJECT_SOURCE_DIR}/external/io_grib_share + ${PROJECT_SOURCE_DIR}/external/io_netcdf + ${PROJECT_SOURCE_DIR}/external/io_int + + # Found Packages not handled through :: imported target + ${netCDF_INCLUDE_DIRS} + ${netCDF-Fortran_INCLUDE_DIRS} + ${pnetCDF_INCLUDE_DIRS} + ) + +# Add directly to core +add_subdirectory( phys ) +add_subdirectory( share ) +add_subdirectory( frame ) +add_subdirectory( inc ) + +if ( ${WRF_CHEM} ) + add_subdirectory( chem ) +endif() + +add_subdirectory( dyn_em ) + + +add_subdirectory( main ) + +################################################################################ +# Add subdirectory with case info +################################################################################ +if ( ${CURRENT_WRF_CORE_IDX} GREATER_EQUAL ${START_DA_IDX} ) + message( STATUS "DA or PLUS build, WRF_CASE selection ignored" ) +else() + add_subdirectory( test/${WRF_CASE_FOLDER} ) +endif() + +# Configure core +set_target_properties( + ${PROJECT_NAME}_Core + PROPERTIES + # Just dump everything in here + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/modules/ + Fortran_FORMAT FREE + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + +# Because of the way netCDF provides its info and the way cmake auto-gens RPATH, we need to help it along +target_link_directories( + ${PROJECT_NAME}_Core + PUBLIC + ${netCDF_LIBRARY_DIR} + ${netCDF-Fortran_LIBRARY_DIR} + ) + + +target_link_libraries( ${PROJECT_NAME}_Core + PUBLIC + ${netCDF_LIBRARIES} + ${netCDF-Fortran_LIBRARIES} + ${pnetCDF_LIBRARIES} + $<$:$> + $<$:$> + # This will add in target dependencies if they exist + $ + $ + $ + $ + $ + PRIVATE + + + # "External" io libs + esmf_time_f90 + + io_grib1 + grib1_util + MEL_grib1 + WGRIB + + io_grib_share + fftpack5 + + $ + $ + $ + $ + io_netcdf + $ + $ + $ + + $ + $ + + $ + ) + +################################################################################ +## +## Install and export +## +################################################################################ +set( CONFIG_INSTALL_DIRECTORY lib/cmake/${PROJECT_NAME} ) +install( + TARGETS ${PROJECT_NAME}_Core + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) + +# Install to namespace +install( + EXPORT ${EXPORT_NAME}Targets + DESTINATION ${CONFIG_INSTALL_DIRECTORY} + FILE ${EXPORT_NAME}Targets.cmake + NAMESPACE ${EXPORT_NAME}:: + ) + +configure_package_config_file( + ${PROJECT_SOURCE_DIR}/cmake/template/${EXPORT_NAME}Config.cmake.in + ${CMAKE_BINARY_DIR}/${EXPORT_NAME}Config.cmake + INSTALL_DESTINATION ${CONFIG_INSTALL_DIRECTORY} + ) + +write_basic_package_version_file( + ${CMAKE_BINARY_DIR}/${EXPORT_NAME}ConfigVersion.cmake + VERSION ${PROJECT_VERSION} + #!TODO Check if this is the type of versioning support we want to use + COMPATIBILITY SameMinorVersion + ) + +install( + FILES + ${CMAKE_BINARY_DIR}/${EXPORT_NAME}Config.cmake + ${CMAKE_BINARY_DIR}/${EXPORT_NAME}ConfigVersion.cmake + DESTINATION ${CONFIG_INSTALL_DIRECTORY} + ) + +# Install some helper files for anyone using this build as part of their code +install( + DIRECTORY + # Trailing / is important + ${PROJECT_SOURCE_DIR}/cmake/modules/ + COMPONENT helpers + DESTINATION share + FILES_MATCHING + PATTERN "*.cmake" + ) +install( + FILES + ${PROJECT_SOURCE_DIR}/cmake/confcheck.cmake + ${PROJECT_SOURCE_DIR}/cmake/gitinfo.cmake + ${PROJECT_SOURCE_DIR}/cmake/printOption.cmake + ${PROJECT_SOURCE_DIR}/cmake/wrf_get_version.cmake + COMPONENT helpers + DESTINATION share + ) \ No newline at end of file diff --git a/README b/README index 30879e360b..0dc23906b0 100644 --- a/README +++ b/README @@ -29,6 +29,7 @@ This is the main directory for the WRF Version 4 source code release. ====================================== Other README files are located in the WRF/doc directory: +doc/README.cmake_build doc/README.crtm doc/README.CTSM doc/README.cygwin.md diff --git a/arch/configure.defaults b/arch/configure.defaults index 36ca1b6e00..1275f3ce33 100644 --- a/arch/configure.defaults +++ b/arch/configure.defaults @@ -818,7 +818,7 @@ CC_TOOLS = $(SCC) NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) PGI compiler with pgcc #serial smpar dmpar dm+sm +#ARCH Darwin x86_64 arm64, (MACOS) PGI compiler with pgcc #serial smpar dmpar dm+sm # DESCRIPTION = PGI ($SFC/$SCC) DMPARALLEL = # 1 @@ -862,7 +862,7 @@ CC_TOOLS = cc NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) intel compiler with icc #serial smpar dmpar dm+sm +#ARCH Darwin x86_64 arm64, (MACOS) intel compiler with icc #serial smpar dmpar dm+sm # DESCRIPTION = INTEL ($SFC/$SCC) DMPARALLEL = # 1 @@ -909,7 +909,7 @@ CC_TOOLS = cc NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) intel compiler with clang EDIT FOR OPENMPI #serial smpar dmpar dm+sm +#ARCH Darwin x86_64 arm64, (MACOS) intel compiler with clang EDIT FOR OPENMPI #serial smpar dmpar dm+sm # DESCRIPTION = INTEL ($SFC/$SCC) DMPARALLEL = # 1 @@ -955,7 +955,7 @@ CC_TOOLS = cc NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) g95 with gcc #serial dmpar +#ARCH Darwin x86_64 arm64, (MACOS) g95 with gcc #serial dmpar # DESCRIPTION = GNU ($SFC/$SCC) DMPARALLEL = # 1 @@ -1000,7 +1000,7 @@ CC_TOOLS = $(SCC) NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) gfortran with gcc #serial smpar dmpar dm+sm +#ARCH Darwin x86_64 arm64, (MACOS) gfortran with gcc #serial smpar dmpar dm+sm # DESCRIPTION = GNU ($SFC/$SCC) DMPARALLEL = # 1 @@ -1045,7 +1045,7 @@ CC_TOOLS = $(SCC) NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) gfortran with clang #serial smpar dmpar dm+sm +#ARCH Darwin x86_64 arm64, (MACOS) gfortran with clang #serial smpar dmpar dm+sm # DESCRIPTION = GNU ($SFC/clang) DMPARALLEL = # 1 @@ -1090,7 +1090,7 @@ CC_TOOLS = clang NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) xlf #serial dmpar +#ARCH Darwin x86_64 arm64, (MACOS) xlf #serial dmpar # DESCRIPTION = IBM ($SFC/$SCC) DMPARALLEL = # 1 @@ -1695,7 +1695,7 @@ CC_TOOLS = $(SCC) NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) PGI compiler with pgcc -f90= #serial smpar dmpar dm+sm +#ARCH Darwin x86_64 arm64, (MACOS) PGI compiler with pgcc -f90= #serial smpar dmpar dm+sm # DESCRIPTION = PGI ($SFC/$SCC): -f90=pgf90 DMPARALLEL = # 1 @@ -1739,7 +1739,7 @@ CC_TOOLS = cc NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) intel compiler with icc #serial smpar dmpar dm+sm +#ARCH Darwin x86_64 arm64, (MACOS) intel compiler with icc #serial smpar dmpar dm+sm # DESCRIPTION = INTEL ($SFC/$SCC): Open MPI DMPARALLEL = # 1 @@ -1786,7 +1786,7 @@ CC_TOOLS = cc NETCDFPAR_BUILD = CONFIGURE_NETCDFPAR_BUILD ########################################################### -#ARCH Darwin (MACOS) gfortran with gcc openmpi #serial smpar dmpar dm+sm +#ARCH Darwin x86_64 arm64, (MACOS) gfortran with gcc openmpi #serial smpar dmpar dm+sm # DESCRIPTION = GNU ($SFC/$SCC): Open MPI DMPARALLEL = # 1 diff --git a/arch/configure_reader.py b/arch/configure_reader.py new file mode 100755 index 0000000000..fb89bfca80 --- /dev/null +++ b/arch/configure_reader.py @@ -0,0 +1,628 @@ +#!/usr/bin/env python3 + +import argparse +import sys +import os +import re +import inspect +import platform +from shutil import which + +archBlock = re.compile( r"(?:#[ ]*)(ARCH(?:.*\n)*?)(?:#{5,})", re.I ) +kvPair = re.compile( r"^(\w+)(?:[ \t]*=[ \t]*)(.*?)$", re.I | re.M ) +# Make this gnarly and complicated since configure.defaults has no standard formatting +# v start v OS V typical v MACOS +osAndArch = re.compile( r"^ARCH[ ]+(\w+)[ ]+((?:\w+.*?),|(?:[(].*?[)]))", re.I ) +# Just grab the first two words, thats what you get +osAndArchAlt = re.compile( r"^ARCH[ ]+(\w+)[ ]+(\w+)", re.I ) + +referenceVar = re.compile( r"[$]([(])?(\w+)(?(1)[)])", re.I ) +compileObject = re.compile( r"(\W)-c(\W)" ) + +class Stanza(): + + def __init__( self, lines ) : + self.lines_ = lines + self.os_ = None + self.arch_ = None + self.osArchLine_ = None + self.archs_ = [] + self.kvPairs_ = {} + self.crossPlatform_ = False + self.skipCrossPlatform_ = True + self.serialOpt_ = False + self.smparOpt_ = False + self.dmparOpt_ = False + self.dmsmOpt_ = False + + def parse( self ) : + self.osArchLine_ = self.lines_.partition("\n")[0] + # First get os & archs + osarchMatch = osAndArch.match( self.osArchLine_ ) + + if osarchMatch is None : + osarchMatch = osAndArchAlt.match( self.osArchLine_ ) + if osarchMatch is None : + print( "Could not find OS and architecture info in " + self.osArchLine_ ) + + self.os_ = osarchMatch.group(1) + self.archs_ = osarchMatch.group(2).strip(",").split( " " ) + + if ( self.os_.lower() != platform.system().lower() or + platform.machine() not in self.archs_ ) : + self.crossPlatform_ = True + + # Allow cross platform or must not be cross platform + if not self.skipCrossPlatform_ or ( self.skipCrossPlatform_ and not self.crossPlatform_ ) : + + # Find OpenMP/MPI compilation options + memOpts = self.osArchLine_.partition( "#" )[-1].split( " " ) + # print( memOpts ) + self.serialOpt_ = "serial" in memOpts + self.smparOpt_ = "smpar" in memOpts + self.dmparOpt_ = "dmpar" in memOpts + self.dmsmOpt_ = "dm+sm" in memOpts + + for kvPairMatch in kvPair.finditer( self.lines_ ) : + self.kvPairs_[ kvPairMatch.group(1) ] = kvPairMatch.group(2) + self.removeComments( kvPairMatch.group(1) ) + + # Now sanitize + self.sanitize() + + ###################################################################################################################### + ## + ## search and replace $() and $ instances + ## + ###################################################################################################################### + def dereference( self, field, fatal=False ) : + # print( "Dereferencing " + field ) + + if field in self.kvPairs_ : + prevField = self.kvPairs_[field] + + for refVarIter in referenceVar.finditer( prevField ) : + envSub = None + + if refVarIter is not None : + # Grab group 1 and check that it is in our kv pairs + refVar = refVarIter.group(2) + # print( "Found variable {0} in field {1}".format( refVar, field ) ) + if refVar not in self.kvPairs_ : + # Try to use the environment variables + if refVar in os.environ : + envSub = os.environ[ refVar ] + else: + if fatal : + # print( "Could not rereference : " + refVar ) + exit(1) + else: + continue + + + # This is an environment variable + if envSub is not None : + self.kvPairs_[field] = self.kvPairs_[field].replace( + "{var}".format( var=refVarIter.group(0) ), + envSub + ) + # This is a kv pair, recurse + else : + # Recursively deref + self.dereference( refVar, fatal ) + + # Replace in original + self.kvPairs_[field] = self.kvPairs_[field].replace( + "{var}".format( var=refVarIter.group(0) ), + self.kvPairs_[refVar] + ) + + def removeReferences( self, field, specifics=[] ) : + if field in self.kvPairs_ : + if specifics : + for specific in specifics : + self.kvPairs_[ field ] = self.kvPairs_[ field ].replace( + "$({var})".format( var=specific ), + "" + ) + else : + self.kvPairs_[ field ] = referenceVar.sub( "", self.kvPairs_[ field ] ) + + + def removeComments( self, field ) : + if field in self.kvPairs_ : + self.kvPairs_[ field ] = self.kvPairs_[ field ].split( "#", 1 )[0] + + def splitIntoFieldAndFlags( self, field ) : + # Fix flags being mixed with programs + if field in self.kvPairs_ : + fieldValue = self.kvPairs_[ field ] + + self.kvPairs_[field] = fieldValue.partition(" ")[0] + self.kvPairs_[field + "_FLAGS"] = fieldValue.partition(" ")[1] + + ###################################################################################################################### + ## + ## Clean up the stanza so kv pairs can be used as-is + ## + ###################################################################################################################### + def sanitize( self ) : + # Fix problematic variables + self.dereference( "DM_FC" ) + self.dereference( "DM_CC" ) + self.removeReferences( "FCBASEOPTS_NO_G" ) + # Get rid of all these mixed up flags, these are handled by cmake natively or + # just in the wrong place + self.removeReferences( "FCBASEOPTS", [ "FCDEBUG", "FORMAT_FREE", "BYTESWAPIO", ] ) + self.removeReferences( "FFLAGS", [ "FORMAT_FREE", "FORMAT_FIXED" ] ) + self.removeReferences( "F77FLAGS", [ "FORMAT_FREE", "FORMAT_FIXED" ] ) + # # Now deref + self.dereference( "FCBASEOPTS" ) + + # Remove rogue compile commands that should *NOT* even be here + keysToSanitize = [ + "ARFLAGS","ARFLAGS", + "CC", + "CFLAGS_LOCAL", + "CFLAGS", + "COMPRESSION_INC", + "COMPRESSION_LIBS", + "CPP", + "CPPFLAGS", + "DM_CC", + "DM_FC", + "ESMF_LDFLAG", + "F77FLAGS", + "FC", + "FCBASEOPTS_NO_G", + "FCBASEOPTS", + "FCOPTIM", + "FCSUFFIX", + "FDEFS", + "FFLAGS", + "FNGFLAGS", + "FORMAT_FIXED", + "FORMAT_FREE", + "LD", + "LDFLAGS_LOCAL", + "LDFLAGS", + "MODULE_SRCH_FLAG", + "RLFLAGS", + "SCC", + "SFC", + "TRADFLAG", + ] + + for keyToSan in keysToSanitize : + if keyToSan in self.kvPairs_ : + self.kvPairs_[ keyToSan ] = self.kvPairs_[ keyToSan ].replace( "CONFIGURE_COMP_L", "" ) + self.kvPairs_[ keyToSan ] = self.kvPairs_[ keyToSan ].replace( "CONFIGURE_COMP_I", "" ) + self.kvPairs_[ keyToSan ] = self.kvPairs_[ keyToSan ].replace( "CONFIGURE_FC", "" ) + self.kvPairs_[ keyToSan ] = self.kvPairs_[ keyToSan ].replace( "CONFIGURE_CC", "" ) + self.kvPairs_[ keyToSan ] = self.kvPairs_[ keyToSan ].replace( "CONFIGURE_FDEFS", "" ) + self.kvPairs_[ keyToSan ] = self.kvPairs_[ keyToSan ].replace( "CONFIGURE_MPI", "" ) + self.kvPairs_[ keyToSan ] = self.kvPairs_[ keyToSan ].replace( "CONFIGURE_COMPAT_FLAGS", "" ) + self.kvPairs_[ keyToSan ] = self.kvPairs_[ keyToSan ].replace( "CONFIGURE_CPPFLAGS", "" ) + self.kvPairs_[ keyToSan ] = self.kvPairs_[ keyToSan ].replace( "CONFIGURE_TRADFLAG", "" ) + + self.kvPairs_[ keyToSan ] = compileObject.sub( r"\1\2", self.kvPairs_[ keyToSan ] ).strip() + + + # Now fix certain ones that are mixing programs with flags all mashed into one option + self.splitIntoFieldAndFlags( "SFC" ) + self.splitIntoFieldAndFlags( "SCC" ) + self.splitIntoFieldAndFlags( "DM_FC" ) + self.splitIntoFieldAndFlags( "DM_CC" ) + self.splitIntoFieldAndFlags( "CPP" ) + self.splitIntoFieldAndFlags( "M4" ) + + # Now deref all the rest + for key in self.kvPairs_ : + self.dereference( key ) + # And for final measure strip + self.kvPairs_[ key ] = self.kvPairs_[ key ].strip() + + def serialCompilersAvailable( self ) : + return which( self.kvPairs_["SFC"] ) is not None and which( self.kvPairs_["SCC"] ) is not None + + def dmCompilersAvailable( self ) : + return which( self.kvPairs_["DM_FC"] ) is not None and which( self.kvPairs_["DM_CC"] ) is not None + + ###################################################################################################################### + ## + ## string representation to view as option + ## + ###################################################################################################################### + def __str__( self ): + # base = """OS {os:<8} ARCHITECTURES {archs:<20} + # >> SFC = {SFC:<12} + # >> SCC = {SCC:<12} + # >> CCOMP = {CCOMP:<12} + # >> DM_FC = {DM_FC:<12} + # >> DM_CC = {DM_CC:<12} + # """ + base = """ {os:<10} {recSFC} {SFC:<11} / {recSCC} {SCC:<11} / {recDM_FC} {DM_FC:<11} / {recDM_CC} {DM_CC:<11}""" + text = inspect.cleandoc( base ).format( + os=str(self.os_), + recSFC =( "!!" if which( self.kvPairs_["SFC"] ) is None else (" " * 2 ) ), + recSCC =( "!!" if which( self.kvPairs_["SCC"] ) is None else (" " * 2 ) ), + recDM_FC=( "!!" if which( self.kvPairs_["DM_FC"] ) is None else (" " * 2 ) ), + recDM_CC=( "!!" if which( self.kvPairs_["DM_CC"] ) is None else (" " * 2 ) ), + # archs=str(self.archs_), + SFC=str( self.kvPairs_["SFC"] ), + SCC=str( self.kvPairs_["SCC"] ), + DM_FC=str( self.kvPairs_["DM_FC"] ), + DM_CC=str( self.kvPairs_["DM_CC"] ) + ) + # text += "\n" + "\n".join( [ "{key:<18} = {value}".format( key=key, value=value) for key, value in self.kvPairs_.items() ] ) + return text + + ###################################################################################################################### + ## + ## Find first apparent difference between two stanzas + ## + ###################################################################################################################### + @staticmethod + def findFirstDifference( rhStanza, lhStanza, maxLength=32 ) : + diff = False + value = "" + valuesToCheck = [ + "ARCH_LOCAL", + "BYTESWAPIO", + "CFLAGS_LOCAL", + "CFLAGS", + "DM_CC_FLAGS", + "DM_CC", + "DM_FC_FLAGS", + "DM_FC", + "FCBASEOPTS", + "FCDEBUG", + "FCNOOPT", + "FCOPTIM", + "FFLAGS", + "M4_FLAGS", + "SCC", + "SFC" + ] + for rhKey, rhValue in rhStanza.kvPairs_.items() : + if rhKey in valuesToCheck and rhKey in lhStanza.kvPairs_ : + # Qualifies for difference + if rhValue != lhStanza.kvPairs_[rhKey] : + diff = True + value = "{key:<12} = {value}".format( key=rhKey, value=lhStanza.kvPairs_[rhKey] ) + + # Truncate + value = ( value[:maxLength] + "..." ) if len( value ) > maxLength else value + + return diff, value + +######################################################################################################################## +## +## Option handling +## +######################################################################################################################## +def getOptionsParser() : + parser = argparse.ArgumentParser( ) + + # https://stackoverflow.com/a/24181138 + requiredNamed = parser.add_argument_group( "required named arguments" ) + + requiredNamed.add_argument( + "-c", "--config", + dest="configFile", + help="configure.defaults file holding all stanza configurations", + type=str, + required=True + ) + requiredNamed.add_argument( + "-t", "--template", + dest="cmakeTemplateFile", + help="cmake template file for configuring stanza into cmake syntax", + type=str, + required=True + ) + requiredNamed.add_argument( + "-o", "--output", + dest="outputConfigFile", + help="cmake output toolchain config file for selected stanza", + type=str, + required=True + ) + + parser.add_argument( + "-p", "--preselect", + dest="preselect", + help="Use preselected stanza configuration, if multiple match grabs the first one", + type=str, + default=None + ) + + parser.add_argument( + "-x", "--skipCMakeOptions", + dest="skipCMakeOptions", + help="Skip query of available CMake options", + default=False, + const=True, + action='store_const' + ) + parser.add_argument( + "-s", "--source", + dest="sourceCMakeFile", + help="Required unless -x/--skipCMakeOptions set, project cmake source file used to determine available options", + type=str, + default=None + ) + + return parser + + +class Options(object): + """Empty namespace""" + pass + +######################################################################################################################## +## +## Select stanza to operate on +## +######################################################################################################################## +def selectStanza( options ) : + + fp = open( options.configFile, 'r' ) + lines = fp.read() + fp.close() + + # Now grab the blocks and parse + stanzas = [] + # Gather all stanzas available + for stanzaBlock in archBlock.finditer( lines ) : + stanza = Stanza( stanzaBlock.group(1) ) + stanza.parse() + + if not stanza.crossPlatform_ and stanza.serialCompilersAvailable() and ( stanza.dmCompilersAvailable() or ( stanza.serialOpt_ or stanza.smparOpt_ ) ) : + if "DESCRIPTION" not in stanza.kvPairs_ : + # Of course WPS configure.defaults is different than WRF so descriptions are embedded in the comments + stanza.kvPairs_[ "DESCRIPTION" ] = stanza.osArchLine_.partition( "," )[ -1 ].partition( "#" )[0].strip() + stanzas.append( stanza ) + + idxSelection = 0 + if options.preselect is None : + # Query for selected + stanzaIdx = 0 + uniqueConfigs = {} + for stanza in stanzas : + stanzaConfig = str( stanza ) + stanzaId = "{idx:<3} ".format( idx=stanzaIdx ) + if stanzaConfig not in uniqueConfigs : + uniqueConfigs[ stanzaConfig ] = { "stanza" : stanza, "idx" : stanzaIdx } + + print( stanzaId + stanzaConfig + stanza.kvPairs_[ "DESCRIPTION" ] ) + # else : + # diff, value = Stanza.findFirstDifference( uniqueConfigs[ stanzaConfig ]["stanza"], stanza ) + # if diff : + # print( stanzaId + stanzaConfig + "@{idx} diff => {value}".format( idx=uniqueConfigs[ stanzaConfig ][ "idx" ], value=value ) ) + # else : + # print( stanzaId + stanzaConfig + "[no difference]" ) + stanzaIdx += 1 + print( "!! - Compiler not found, some configurations will not work and will be hidden" ) + stringSelection = input( "Select configuration [0-{stop}] Default [0] (note !!) : ".format( stop=( stanzaIdx-1) ) ) + idxSelection = int( stringSelection if stringSelection.isdigit() else 0 ) + if idxSelection < 0 or idxSelection > stanzaIdx - 1 : + print( "Invalid configuration selection!" ) + exit(1) + else : + for stanza in stanzas : + if options.preselect.lower() in stanza.kvPairs_["DESCRIPTION"].lower() : + print( str( stanza ) + stanza.kvPairs_[ "DESCRIPTION"] ) + break + else : + idxSelection += 1 + if idxSelection == len( stanzas ) : + print( "Error: Stanza configuration with description '{0}' does not exist. Preselect failed.".format( options.preselect ) ) + exit(1) + + stanzaCfg = stanzas[idxSelection] + + return stanzaCfg + +######################################################################################################################## +## +## Select enum-like string for string-based cmake options +## +######################################################################################################################## +def getStringOptionSelection( topLevelCmake, searchString, destinationOption, defaultIndex=0 ) : + topLevelCmakeFP = open( topLevelCmake, "r" ) + topLevelCmakeLines = topLevelCmakeFP.read() + topLevelCmakeFP.close() + + stringOptionsMatch = re.search( + r"set\s*[(]\s*" + searchString + r"\s*(.*?)[)]", + topLevelCmakeLines, + re.I | re.S | re.M + ) + if stringOptionsMatch is None : + print( "Syntax error in parsing " + searchString + " from " + topLevelCmake ) + exit(1) + + options = [ option.split( "#", 1 )[0].strip() for option in stringOptionsMatch.group(1).split( "\n" ) ] + # Weed out empties + options = [ option for option in options if option ] + + optionsFmt = "\n\t" + "\n\t".join( [ "{idx} : {opt}".format( idx=options.index( opt ), opt=opt ) for opt in options ] ) + stringSelection = input( "Select option for {option} from {optionsSource} [0-{max}] {opts} \nDefault [{defIdx}] : ".format( + option=destinationOption, + optionsSource=searchString, + max=len(options)-1, + opts=optionsFmt, + defIdx=defaultIndex + ) + ) + selection = int( stringSelection if stringSelection.isdigit() else defaultIndex ) + + if selection < 0 or selection > len(options) : + print( "Invalid option selection for " + searchString + "!" ) + exit(1) + + return options[selection] + +######################################################################################################################## +## +## Aggregate and allow toggle of various suboptions in alternate menu +## +######################################################################################################################## +def getSubOptions( topLevelCmake, ignoreOptions ) : + topLevelCmakeFP = open( topLevelCmake, "r" ) + topLevelCmakeLines = topLevelCmakeFP.read() + topLevelCmakeFP.close() + + stringOptionsMatch = re.finditer( + r"set\s*[(]\s*(\w+)\s*(ON|OFF)\s*CACHE\s*BOOL\s*\"(.*?)\"\s*[)]", + topLevelCmakeLines, + re.I | re.M + ) + # Remove commented ones and ones that don't follow pattern set( ON|OFF CACHE BOOL "" ) + options = [ [ option.group( 1 ), option.group( 2 ) ] for option in stringOptionsMatch if option.group( 1 ) == option.group( 3 ) and option.group(0).split( "#", 1 )[0].strip() ] + + # Remove ignore options + options = [ option for option in options if option[0] not in ignoreOptions ] + subOptions = {} + + if options : + subOptionQuit = False + optionToggleIdx = -1 + + # Print menu + optionStr = "{idx:<3} {option:<24} : {value:<5}" + print( optionStr.format( idx="ID", option="Option", value="Default" ) ) + for opt in options : + print( optionStr.format( idx=options.index(opt), option=opt[0], value=opt[1] ) ) + + print( "Enter ID to toggle option on or off, q to quit : " ) + # Loop until q, toggle from default not current value + while not subOptionQuit : + optionToggleIdx = input() + try: + optionToggleIdx = int( optionToggleIdx ) + if optionToggleIdx < 0 or optionToggleIdx >= len( options ) : + print( "Not a valid index" ) + else: + subOptions[ options[optionToggleIdx][0] ] = "ON" if not ( options[optionToggleIdx][1] == "ON" ) else "OFF" + print( "Set {option} to {value}".format( option=options[optionToggleIdx][0], value=subOptions[ options[optionToggleIdx][0] ] ) ) + except ValueError as err : + subOptionQuit = optionToggleIdx.lower() == "q" + + return subOptions + +def main() : + + parser = getOptionsParser() + options = Options() + parser.parse_args( namespace=options ) + + stanzaCfg = selectStanza( options ) + + additionalOptions = {} + if not options.skipCMakeOptions : + if options.sourceCMakeFile is None : + print( "Error: Project source cmake file required for project specific options." ) + exit(1) + else: + additionalOptions = projectSpecificOptions( options, stanzaCfg ) + + generateCMakeToolChainFile( options.cmakeTemplateFile, options.outputConfigFile, stanzaCfg, additionalOptions ) + +######################################################################################################################## +######################################################################################################################## +## +## ABOVE THIS BREAK THINGS ARE EXACTLY THE SAME AS WRF/WPS +## BELOW THIS BREAK THINGS DIFFER +## +######################################################################################################################## +######################################################################################################################## + +def generateCMakeToolChainFile( cmakeToolChainTemplate, output, stanza, optionsDict={} ) : + cmakeToolChainTemplateFP = open( cmakeToolChainTemplate, "r" ) + cmakeToolChainTemplateLines = cmakeToolChainTemplateFP.read() + cmakeToolChainTemplateFP.close() + + configStanza = cmakeToolChainTemplateLines.format( + ARCH_LOCAL=stanza.kvPairs_["ARCH_LOCAL"], + BYTESWAPIO=stanza.kvPairs_["BYTESWAPIO"], + CFLAGS_LOCAL=stanza.kvPairs_["CFLAGS_LOCAL"], + DM_CC=stanza.kvPairs_["DM_CC"], + DM_FC=stanza.kvPairs_["DM_FC"], + DM_FC_FLAGS=stanza.kvPairs_["DM_FC_FLAGS"], + DM_CC_FLAGS=stanza.kvPairs_["DM_CC_FLAGS"], + FCBASEOPTS=stanza.kvPairs_["FCBASEOPTS"], + FCDEBUG=stanza.kvPairs_["FCDEBUG"], + FCNOOPT=stanza.kvPairs_["FCNOOPT"], + FCOPTIM=stanza.kvPairs_["FCOPTIM"], + M4_FLAGS=stanza.kvPairs_["M4_FLAGS"], + SCC=stanza.kvPairs_["SCC"], + SFC=stanza.kvPairs_["SFC"], + SCC_FLAGS=stanza.kvPairs_["SCC_FLAGS"], + SFC_FLAGS=stanza.kvPairs_["SFC_FLAGS"], + CPP=stanza.kvPairs_["CPP"], + CPP_FLAGS=stanza.kvPairs_["CPP_FLAGS"], + ) + + # Extra stufff not from stanza but options + fmtOption = "set( {opt:<32} {value:<12} CACHE STRING \"Set by configuration\" FORCE )" + configStanza += "\n" + "\n".join( [ fmtOption.format( opt=key, value=value ) for key, value in optionsDict.items() ] ) + + outputFP = open( output, "w" ) + outputFP.write( configStanza ) + outputFP.close() + +def projectSpecificOptions( options, stanzaCfg ) : + coreOption = getStringOptionSelection( options.sourceCMakeFile, "WRF_CORE_OPTIONS", "WRF_CORE" ) + nestingOption = getStringOptionSelection( options.sourceCMakeFile, "WRF_NESTING_OPTIONS", "WRF_NESTING", 1 ) + caseOption = getStringOptionSelection( options.sourceCMakeFile, "WRF_CASE_OPTIONS", "WRF_CASE" ) + + # These are yes + yesValues = [ "yes", "y", "true", "1" ] + # Acceptable no values + noValues = [ "no", "n", "false", "0" ] + + ############################################################################## + # Decompose the weird way to write the logic for DM/SM + USE_MPI = False + if ( stanzaCfg.serialOpt_ or stanzaCfg.smparOpt_ ) and ( stanzaCfg.dmparOpt_ or stanzaCfg.dmsmOpt_ ) : + # togglable + # we can safely check this since the user would not have been able to select this stanza if it couldn't be disabled + if stanzaCfg.dmCompilersAvailable() : + useMPI = not( input( "[DM] Use MPI? Default [Y] [Y/n] : " ).lower() in noValues ) + else : + useMPI = False + else: + # User has no choice in the matter + useMPI = ( stanzaCfg.dmparOpt_ or stanzaCfg.dmsmOpt_ ) + + useOpenMP = False + if ( stanzaCfg.serialOpt_ or stanzaCfg.dmparOpt_ ) and ( stanzaCfg.smparOpt_ or stanzaCfg.dmsmOpt_ ): + # togglable + useOpenMP = input( "[SM] Use OpenMP? Default [N] [y/N] : " ).lower() in yesValues + else: + # User has no choice in the matter + useOpenMP = ( stanzaCfg.smparOpt_ or stanzaCfg.dmsmOpt_ ) + + ############################################################################## + + alreadyAsked = [ "USE_MPI", "USE_OPENMP" ] + doSuboptionMenu = input( "Configure additional options? Default [N] [y/N] : " ).lower() in yesValues + subOptions = {} + if doSuboptionMenu : + subOptions = getSubOptions( options.sourceCMakeFile, alreadyAsked ) + + additionalOptions = { + "WRF_CORE" : coreOption, + "WRF_NESTING" : nestingOption, + "WRF_CASE" : caseOption, + "USE_MPI" : "ON" if useMPI else "OFF", + "USE_OPENMP" : "ON" if useOpenMP else "OFF", + } + additionalOptions.update( subOptions ) + + return additionalOptions + +if __name__ == '__main__' : + main() \ No newline at end of file diff --git a/chem/CMakeLists.txt b/chem/CMakeLists.txt new file mode 100644 index 0000000000..9bfbf3d5ac --- /dev/null +++ b/chem/CMakeLists.txt @@ -0,0 +1,226 @@ +# WRF CMake Build +target_include_directories( + ${PROJECT_NAME}_Core + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ) + +######################################################################################################################## +# +# Now add sources +# +######################################################################################################################## +target_sources( + ${PROJECT_NAME}_Core + PRIVATE + module_data_isrpia_data.F + module_data_ISRPIA.F + module_data_isrpia_asrc.F + module_data_isrpia_solut.F + module_data_isrpia_kmc198.F + module_data_isrpia_kmc223.F + module_data_isrpia_kmc248.F + module_data_isrpia_kmc273.F + module_data_isrpia_kmc298.F + module_data_isrpia_kmc323.F + module_data_isrpia_expnc.F + module_data_isrpia_caseg.F + module_data_isrpia_casej.F + isofwd.F + isorev.F + isocom.F + moduleHETDATA.F + moduleHETAERO.F + moduleAERODATA.F + aerorate_so2.F + module_aer_opt_out.F + module_add_emiss_burn.F + module_add_emis_cptec.F + module_bioemi_beis314.F + module_chem_utilities.F + module_cmu_dvode_solver.F + module_data_cbmz.F + module_data_cmu_bulkaqchem.F + module_data_gocartchem.F + module_data_gocart_seas.F + module_data_mosaic_kind.F + module_data_mosaic_constants.F + module_data_mosaic_aero.F + module_data_mosaic_main.F + module_data_mosaic_asect.F + module_data_mosaic_asecthp.F + module_data_mosaic_boxmod.F + module_data_mosaic_other.F + module_data_mosaic_therm.F + module_data_radm2.F + module_data_rrtmgaeropt.F + module_data_megan2.F + module_data_soa_vbs.F + module_data_soa_vbs_het.F + module_data_sorgam.F + module_data_sorgam_vbs.F + module_ftuv_subs.F + module_ghg_fluxes.F + module_gocart_drydep.F + module_gocart_settling.F + module_gocart_so2so4.F + module_input_tracer_data.F + module_interpolate.F + module_mosaic_csuesat.F + module_mozcart_wetscav.F + module_peg_util.F + module_tropopause.F + module_upper_bc_driver.F + module_vertmx_wrf.F + module_wave_data.F + module_wetdep_ls.F + module_zero_plumegen_coms.F + module_vash_settling.F + module_chem_plumerise_scalar.F + module_dep_simple.F + module_gocart_dmsemis.F + module_gocart_aerosols.F + module_gocart_dust.F + module_gocart_dust_afwa.F + module_gocart_seasalt.F + module_uoc_dust.F + module_qf03.F + module_soilpsd.F + module_dust_load.F + module_uoc_dustwd.F + module_data_uoc_wd.F + module_mosaic_addemiss.F + module_mosaic_initmixrats.F + module_mosaic_support.F + module_mosaic_init_aerpar.F + module_mosaic_ext.F + module_mosaic_astem.F + module_mosaic_lsode.F + module_mosaic_box_aerchem.F + module_mosaic_aerchem_intr.F + module_mosaic_coag1d.F + module_mosaic_coag3d.F + module_mosaic_movesect1d.F + module_mosaic_movesect3d.F + module_mosaic_newnucb.F + module_mosaic_sect_intr.F + module_mosaic_aerdynam_intr.F + module_mosaic_movesect.F + module_mosaic_newnuc.F + module_mosaic_soa_vbs.F + module_cbmz_lsodes_solver.F + module_cbmz_rodas3_solver.F + module_cmu_bulkaqchem.F + module_data_mgn2mech.F + module_ftuv_driver.F + module_fastj_data.F + module_fastj_mie.F + module_input_chem_data.F + module_mosaic_coag.F + module_mosaic_gly.F + module_mosaic_wetscav.F + module_mosaic_therm.F + module_phot_mad.F + params.mod.F #!TODO Rename this please + numer.F + rdxs.F + rxn.F + params_mod.F + module_phot_tuv.F + module_subs_tuv.F + rtrans.F + la_srb.F + module_radm.F + module_sorgam_aqchem.F + module_sorgam_vbs_aqchem.F + module_aerosols_soa_vbs.F + module_aerosols_soa_vbs_het.F + module_aerosols_sorgam.F + module_aerosols_sorgam_vbs.F + module_bioemi_megan2.F + module_bioemi_simple.F + module_cbm4_initmixrats.F + module_cb05_initmixrats.F + module_cb05_vbs_initmixrats.F + module_cbmz.F + module_cbmz_initmixrats.F + module_cbmz_rodas_prep.F + module_ctrans_grell.F + module_gocart_chem.F + module_input_tracer.F + module_lightning_nox_driver.F + module_lightning_nox_ott.F + module_lightning_nox_decaria.F + module_mixactivate_wrappers.F + module_mosaic_init_aerpar.F + module_mosaic2_driver.F + module_mosaic_sumpm.F + module_mosaic_driver.F + module_optical_averaging.F + module_plumerise1.F + module_mosaic_drydep.F + module_wetscav_driver.F + module_prep_wetscav_sorgam.F + module_input_chem_bioemiss.F + module_input_dust_errosion.F + module_input_gocart_dms.F + module_cbmz_addemiss.F + module_cbm4_addemiss.F + module_cb05_addemiss.F + module_emissions_anthropogenics.F + module_aer_drydep.F + module_cam_mam_calcsize.F + module_cam_mam_dust_sediment.F + module_cam_mam_drydep.F + module_cam_mam_init.F + module_cam_mam_initaerodata.F + module_cam_mam_initmixrats.F + module_cam_mam_rename.F + module_cam_mam_wateruptake.F + module_cam_mam_gasaerexch.F + module_cam_mam_coag.F + module_cam_mam_newnuc.F + module_cam_mam_aerchem_driver.F + module_cam_mam_addemiss.F + module_cam_mam_wetscav.F + module_cam_mam_mz_aerosols_intr.F + module_cam_mam_wetdep.F + module_cam_mam_cloudchem.F + module_cam_mam_setsox.F + module_cam_mam_mo_chem_utls.F + module_mosaic_cloudchem.F + module_sorgam_cloudchem.F + module_sorgam_vbs_cloudchem.F + module_cam_mam_gas_wetdep_driver.F + module_cam_mam_mo_sethet.F + module_phot_fastj.F + module_chem_cup.F + module_isocom.F + module_isofwd.F + module_isorev.F + chemics_init.F + chem_driver.F + cloudchem_driver.F + photolysis_driver.F + optical_driver.F + mechanism_driver.F + emissions_driver.F + dry_dep_driver.F + aerosol_driver.F + ) + +######################################################################################################################## +# +# convert_emiss executable +# +######################################################################################################################## +add_executable( + convert_emiss + convert_emiss.F + ) + +target_link_libraries( + convert_emiss + PRIVATE + ${PROJECT_NAME}_Core + ) \ No newline at end of file diff --git a/cleanCMake.sh b/cleanCMake.sh new file mode 100755 index 0000000000..06c3a38a8c --- /dev/null +++ b/cleanCMake.sh @@ -0,0 +1,69 @@ +#!/bin/sh +buildDirectory=_build +installDirectory=install + +help() +{ + echo "./cleanCMake.sh [options]" + echo " -c [Default if no options] Basic cmake clean functionality [make -j 1 clean]" + echo " -b Remove cmake binary installs [xargs rm < ${buildDirectory}/install_manifest.txt]" + echo " -f Remove build & install folders (WRF) [ rm ${buildDirectory} -r; rm ${installDirectory}/ -r ]" + echo " -a Remove all (WRF), equivalent to -c -b -f (more specifically -c then -b then-f)" + echo "Specific builds/installs" + echo " -d directory Specify operating on particular build directory" + echo " -i directory Specify operating on particular install directory" +} + +cleanBasicBuild=FALSE +cleanBasicInstall=FALSE +cleanLinks=FALSE +cleanFolders=FALSE +cleanAll=FALSE + +while getopts "hcbfad:i:" opt; do + case ${opt} in + c) + cleanBasicBuild=TRUE + ;; + b) + cleanBasicInstall=TRUE + ;; + f) + cleanFolders=TRUE + ;; + a) + cleanAll=TRUE + ;; + d) + buildDirectory=$OPTARG + ;; + i) + installDirectory=$OPTARG + ;; + h) help; exit 0 ;; + *) help; exit 1 ;; + :) help; exit 1 ;; + \?) help; exit 1 ;; + esac +done + +if [ $OPTIND -eq 1 ]; then + # Do basic clean I guess + cleanBasicBuild=TRUE +fi + +if [ "${cleanBasicBuild}" = "TRUE" ] || [ "${cleanAll}" = "TRUE" ]; then + echo "Doing cmake make clean" + OLD_DIR=$PWD + cd ${buildDirectory} && make -j 1 clean > /dev/null 2>&1; cd $OLD_DIR +fi + +if [ "${cleanBasicInstall}" = "TRUE" ] || [ "${cleanAll}" = "TRUE" ]; then + echo "Removing binary installs" + xargs rm < ${buildDirectory}/install_manifest.txt > /dev/null 2>&1 +fi + +if [ "${cleanFolders}" = "TRUE" ] || [ "${cleanAll}" = "TRUE" ]; then + echo "Deleting ${buildDirectory} & ${installDirectory}/" + rm ${buildDirectory} -r; rm ${installDirectory}/ -r > /dev/null 2>&1 +fi diff --git a/cmake/c_preproc.cmake b/cmake/c_preproc.cmake new file mode 100644 index 0000000000..14f7fe9295 --- /dev/null +++ b/cmake/c_preproc.cmake @@ -0,0 +1,130 @@ +# WRF Macro for C preprocessing F files that are just... bad ifdef usage to say the least +macro( wrf_c_preproc_fortran ) + + set( options ) + set( oneValueArgs TARGET_NAME SUFFIX PREFIX EXTENSION OUTPUT_DIR ) + set( multiValueArgs DEPENDENCIES INCLUDES SOURCES DEFINITIONS TARGET_SCOPE ) + + cmake_parse_arguments( + WRF_PP_F + "${options}" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN} + ) + + # Santitize input + if ( DEFINED WRF_PP_F_TARGET_SCOPE ) + set( WRF_PP_F_TARGET_DIRECTORY TARGET_DIRECTORY ${WRF_PP_F_TARGET_SCOPE} ) + endif() + + set( WRF_PP_F_INCLUDES_FLAGS ) + foreach( WRF_PP_F_INC ${WRF_PP_F_INCLUDES} ) + list( APPEND WRF_PP_F_INCLUDES_FLAGS -I${WRF_PP_F_INC} ) + endforeach() + + wrf_expand_definitions( + RESULT_VAR WRF_PP_F_DEFS + DEFINITIONS ${WRF_PP_F_DEFINITIONS} + ) + + # Generate compile command and file outputs + set( WRF_PP_F_OUTPUT ) + set( WRF_PP_F_COMMANDS ) + foreach( WRF_PP_F_SOURCE_FILE ${WRF_PP_F_SOURCES} ) + get_filename_component( WRF_PP_F_INPUT_SOURCE ${WRF_PP_F_SOURCE_FILE} REALPATH ) + get_filename_component( WRF_PP_F_INPUT_SOURCE_FILE_ONLY ${WRF_PP_F_SOURCE_FILE} NAME ) + + if ( ${WRF_PP_F_EXTENSION} MATCHES "^[.][a-z0-9]+$" ) + string( REGEX REPLACE "[.].*$" "${WRF_PP_F_EXTENSION}" WRF_PP_F_OUTPUT_FILE ${WRF_PP_F_INPUT_SOURCE_FILE_ONLY} ) + else() + # Default extension + string( REGEX REPLACE "[.].*$" ".i" WRF_PP_F_OUTPUT_FILE ${WRF_PP_F_INPUT_SOURCE_FILE_ONLY} ) + endif() + + set( WRF_PP_F_OUTPUT_FILE ${WRF_PP_F_OUTPUT_DIR}/${WRF_PP_F_PREFIX}${WRF_PP_F_OUTPUT_FILE}${WRF_PP_F_SUFFIX} ) + + list( + APPEND WRF_PP_F_COMMANDS + COMMAND ${CMAKE_C_PREPROCESSOR} ${CMAKE_C_PREPROCESSOR_FLAGS} ${WRF_PP_F_INPUT_SOURCE} ${WRF_PP_F_DEFS} ${WRF_PP_F_INCLUDES_FLAGS} > ${WRF_PP_F_OUTPUT_FILE} + # Force check that they were made + COMMAND ${CMAKE_COMMAND} -E compare_files ${WRF_PP_F_OUTPUT_FILE} ${WRF_PP_F_OUTPUT_FILE} + ) + list( + APPEND WRF_PP_F_OUTPUT + ${WRF_PP_F_OUTPUT_FILE} + ) + + # # Tell all targets that eventually use this file that it is generated - this is useful if this macro is used in a + # # different directory than where the target dependency is set + # # Thanks to https://gitlab.kitware.com/cmake/community/-/wikis/FAQ#how-can-i-add-a-dependency-to-a-source-file-which-is-generated-in-a-subdirectory + # # and https://samthursfield.wordpress.com/2015/11/21/cmake-dependencies-between-targets-and-files-and-custom-commands/ + # # It keeps getting better lol + # # https://gitlab.kitware.com/cmake/cmake/-/issues/18399 + # # We could use cmake 3.20+ and CMP0118, but this allows usage from 3.18.6+ + # TL;DR - This doesn't work despite all documentation stating otherwise, need to use CMP0118 + # set_source_files_properties( + # ${WRF_PP_F_OUTPUT_FILE} + # ${WRF_PP_F_TARGET_DIRECTORY} + # PROPERTIES + # GENERATED TRUE + # ) + set_source_files_properties( + ${WRF_PP_F_OUTPUT_FILE} + DIRECTORY ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} + ${WRF_PP_F_TARGET_DIRECTORY} + PROPERTIES + Fortran_PREPROCESS OFF + ) + # message( STATUS "File ${WRF_PP_F_SOURCE_FILE} will be preprocessed into ${WRF_PP_F_OUTPUT_FILE}" ) + + endforeach() + + # Preprocess sources into a custom target + add_custom_command( + OUTPUT ${WRF_PP_F_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E make_directory ${WRF_PP_F_OUTPUT_DIR} + ${WRF_PP_F_COMMANDS} + COMMENT "Preprocessing ${WRF_PP_F_TARGET_NAME}" + DEPENDS ${WRF_PP_F_DEPENDENCIES} + ) + + add_custom_target( + ${WRF_PP_F_TARGET_NAME} + COMMENT "Building ${WRF_PP_F_TARGET_NAME}" + DEPENDS ${WRF_PP_F_OUTPUT} + ) + +endmacro() + +# Helper macro to take current defintions and santize them with -D, compatible with generator expressions +# for use when definitions are needed at generation time for custom commands +macro( wrf_expand_definitions ) + set( options ) + set( oneValueArgs RESULT_VAR ) + set( multiValueArgs DEFINITIONS ) + + cmake_parse_arguments( + WRF_EXP + "${options}" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN} + ) + + set( WRF_EXP_DEFS ) + foreach( WRF_EXP_DEF ${WRF_EXP_DEFINITIONS} ) + if ( NOT ${WRF_EXP_DEF} MATCHES ".*-D.*" ) + # We have a generator expression, inject the -D correctly + # THIS SHOULD ONLY BE USED FOR CONDITIONALLY APPLIED DEFINITIONS + if ( ${WRF_EXP_DEF} MATCHES "^[$]<" ) + # Take advantage of the fact that a define is most likely not an expanded variable (i.e. starts with a-zA-Z, adjust if not) + # preceeded by the defining generator expression syntax $<>:var or ,var + # Yes this is fragile but is probably more robust than the current code if you're relying on this macro :D + string( REGEX REPLACE "(>:|,)([a-zA-Z])" "\\1-D\\2" WRF_EXP_DEF_SANITIZED ${WRF_EXP_DEF} ) + list( APPEND WRF_EXP_DEFS ${WRF_EXP_DEF_SANITIZED} ) + else() + list( APPEND WRF_EXP_DEFS -D${WRF_EXP_DEF} ) + endif() + endif() + + endforeach() + + set( ${WRF_EXP_RESULT_VAR} ${WRF_EXP_DEFS} ) +endmacro() \ No newline at end of file diff --git a/cmake/confcheck.cmake b/cmake/confcheck.cmake new file mode 100644 index 0000000000..5db8469519 --- /dev/null +++ b/cmake/confcheck.cmake @@ -0,0 +1,133 @@ +# WRF Macro for adding configuration checks from source file, default is fortran +# https://cmake.org/cmake/help/latest/module/CheckFortranSourceCompiles.html +# https://github.com/ufs-community/ufs-weather-model/issues/132 +include( CheckFortranSourceRuns ) +include( CheckFortranSourceCompiles ) +include( CheckCSourceRuns ) +include( CheckCSourceCompiles ) +include( CheckCXXSourceRuns ) +include( CheckCXXSourceCompiles ) + +macro( wrf_conf_check ) + + set( options QUIET RUN REQUIRED ) + set( oneValueArgs RESULT_VAR EXTENSION FAIL_REGEX SOURCE MESSAGE SOURCE_TYPE ) + set( multiValueArgs ADDITIONAL_FLAGS ADDITIONAL_DEFINITIONS ADDITIONAL_INCLUDES ADDITIONAL_LINK_OPTIONS ADDITIONAL_LIBRARIES ) + + cmake_parse_arguments( + WRF_CFG + "${options}" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN} + ) + + get_filename_component( WRF_CFG_SOURCE_FILE ${WRF_CFG_SOURCE} REALPATH ) + file( READ ${WRF_CFG_SOURCE_FILE} WRF_CFG_CODE ) + + # Santize for newlines + string( REPLACE "\\n" "\\\\n" WRF_CFG_CODE "${WRF_CFG_CODE}" ) + + if ( NOT DEFINED WRF_CFG_SOURCE_TYPE ) + set( WRF_CFG_SOURCE_TYPE fortran ) + endif() + + if ( DEFINED WRF_CFG_FAIL_REGEX ) + if ( DEFINED WRF_CFG_RUN ) + message( WARNING "wrf_conf_check: FAIL_REGEX ignored when running check" ) + else() + set( WRF_CFG_FAIL_REGEX FAIL_REGEX ${WRF_CFG_FAIL_REGEX} ) + endif() + endif() + + if ( DEFINED WRF_CFG_EXTENSION ) + set( WRF_CFG_EXTENSION SRC_EXT ${WRF_CFG_EXTENSION} ) + endif() + + # Additional options + if ( DEFINED WRF_CFG_QUIET AND ${WRF_CFG_QUIET} ) + set( CMAKE_REQUIRED_QUIET ${WRF_CFG_QUIET} ) + endif() + + if ( DEFINED WRF_CFG_ADDITIONAL_FLAGS ) + set( CMAKE_REQUIRED_FLAGS ${WRF_CFG_ADDITIONAL_FLAGS} ) + endif() + + if ( DEFINED WRF_CFG_ADDITIONAL_DEFINITIONS ) + set( CMAKE_REQUIRED_DEFINITIONS ${WRF_CFG_ADDITIONAL_DEFINITIONS} ) + endif() + + if ( DEFINED WRF_CFG_ADDITIONAL_INCLUDES ) + set( CMAKE_REQUIRED_INCLUDES ${WRF_CFG_ADDITIONAL_INCLUDES} ) + endif() + + if ( DEFINED WRF_CFG_ADDITIONAL_LINK_OPTIONS ) + set( CMAKE_REQUIRED_LINK_OPTIONS ${WRF_CFG_ADDITIONAL_LINK_OPTIONS} ) + endif() + + if ( DEFINED WRF_CFG_ADDITIONAL_LIBRARIES ) + set( CMAKE_REQUIRED_LIBRARIES ${WRF_CFG_ADDITIONAL_LIBRARIES} ) + endif() + + string( TOLOWER "${WRF_CFG_SOURCE_TYPE}" WRF_CFG_SOURCE_TYPE ) + if ( DEFINED WRF_CFG_RUN ) + if ( ${WRF_CFG_SOURCE_TYPE} STREQUAL "fortran" ) + check_fortran_source_runs( + "${WRF_CFG_CODE}" + ${WRF_CFG_RESULT_VAR} + ${WRF_CFG_FAIL_REGEX} + ${WRF_CFG_EXTENSION} + ) + elseif ( ${WRF_CFG_SOURCE_TYPE} STREQUAL "c" ) + check_c_source_runs( + "${WRF_CFG_CODE}" + ${WRF_CFG_RESULT_VAR} + ${WRF_CFG_FAIL_REGEX} + ${WRF_CFG_EXTENSION} + ) + elseif ( ${WRF_CFG_SOURCE_TYPE} STREQUAL "cpp" ) + check_cpp_source_runs( + "${WRF_CFG_CODE}" + ${WRF_CFG_RESULT_VAR} + ${WRF_CFG_FAIL_REGEX} + ${WRF_CFG_EXTENSION} + ) + endif() + else() + if ( ${WRF_CFG_SOURCE_TYPE} STREQUAL "fortran" ) + check_fortran_source_compiles( + "${WRF_CFG_CODE}" + ${WRF_CFG_RESULT_VAR} + ${WRF_CFG_EXTENSION} + ) + elseif ( ${WRF_CFG_SOURCE_TYPE} STREQUAL "c" ) + check_c_source_compiles( + "${WRF_CFG_CODE}" + ${WRF_CFG_RESULT_VAR} + ${WRF_CFG_EXTENSION} + ) + elseif ( ${WRF_CFG_SOURCE_TYPE} STREQUAL "cpp" ) + check_cpp_source_compiles( + "${WRF_CFG_CODE}" + ${WRF_CFG_RESULT_VAR} + ${WRF_CFG_EXTENSION} + ) + endif() + endif() + + # If it failed - note that since this is a run/compile test we expect pass/true + # to just proceed as normal, but if failure we should do something about it + if ( NOT ( DEFINED ${WRF_CFG_RESULT_VAR} AND "${${WRF_CFG_RESULT_VAR}}" ) ) + set( WRF_CFG_MSG_TYPE STATUS ) + if ( DEFINED WRF_CFG_REQUIRED AND ${WRF_CFG_REQUIRED} ) + set( WRF_CFG_MSG_TYPE FATAL_ERROR ) + endif() + + if ( DEFINED WRF_CFG_MESSAGE ) + message( ${WRF_CFG_MSG_TYPE} "${WRF_CFG_MESSAGE}" ) + else() + message( ${WRF_CFG_MSG_TYPE} "${WRF_CFG_RESULT_VAR} marked as required, check failed" ) + endif() + endif() + +endmacro() + + diff --git a/cmake/gitinfo.cmake b/cmake/gitinfo.cmake new file mode 100644 index 0000000000..0262961c18 --- /dev/null +++ b/cmake/gitinfo.cmake @@ -0,0 +1,41 @@ +# WRF Macro to identify the commit where the compiled code came from +macro( wrf_git_commit ) + + set( options ) + set( oneValueArgs WORKING_DIRECTORY RESULT_VAR ) + set( multiValueArgs ) + + cmake_parse_arguments( + WRF_GIT_COMMIT + "${options}" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN} + ) + + + message( STATUS "Retrieving git information..." ) + execute_process( + OUTPUT_VARIABLE WRF_GIT_COMMIT_SHA + COMMAND git describe --dirty --long --always --abbrev=40 + WORKING_DIRECTORY ${WRF_GIT_COMMIT_WORKING_DIRECTORY} + RESULT_VARIABLE WRF_GIT_COMMIT_NO_GIT_REPO + # ECHO_OUTPUT_VARIABLE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + execute_process( + OUTPUT_VARIABLE WRF_GIT_COMMIT_DIFF + COMMAND git diff --shortstat + WORKING_DIRECTORY ${WRF_GIT_COMMIT_WORKING_DIRECTORY} + # ECHO_OUTPUT_VARIABLE + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + if ( ${WRF_GIT_COMMIT_NO_GIT_REPO} GREATER 0 ) + set( ${WRF_GIT_COMMIT_RESULT_VAR} "No git found or not a git repository, git commit version not available.") + message( STATUS "git info : Unable to get info" ) + else() + set( ${WRF_GIT_COMMIT_RESULT_VAR} "git info : ${WRF_GIT_COMMIT_SHA} ${WRF_GIT_COMMIT_DIFF}" ) + message( STATUS "git SHA : ${WRF_GIT_COMMIT_SHA}" ) + message( STATUS "git diff : ${WRF_GIT_COMMIT_DIFF}" ) + endif() + +endmacro() \ No newline at end of file diff --git a/cmake/m4_preproc.cmake b/cmake/m4_preproc.cmake new file mode 100644 index 0000000000..4158795578 --- /dev/null +++ b/cmake/m4_preproc.cmake @@ -0,0 +1,88 @@ +# WRF Macro for m4 preprocessing F files +macro( wrf_m4_preproc_fortran ) + + set( options ) + set( oneValueArgs TARGET_NAME SUFFIX PREFIX EXTENSION OUTPUT_DIR M4_PROGRAM ) + set( multiValueArgs DEPENDENCIES SOURCES FLAGS TARGET_SCOPE ) + + cmake_parse_arguments( + WRF_PP_M4 + "${options}" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN} + ) + set( WRF_PP_M4_PROGRAM_TO_USE m4 ) + if ( DEFINED WRF_PP_M4_PROGRAM ) + set( WRF_PP_M4_PROGRAM_TO_USE ${WRF_PP_M4_PROGRAM} ) + endif() + + # Santitize input + if ( DEFINED WRF_PP_M4_TARGET_SCOPE ) + set( WRF_PP_M4_TARGET_DIRECTORY TARGET_DIRECTORY ${WRF_PP_M4_TARGET_SCOPE} ) + endif() + + # Generate compile command and file outputs + set( WRF_PP_M4_OUTPUT ) + set( WRF_PP_M4_COMMANDS ) + foreach( WRF_PP_M4_SOURCE_FILE ${WRF_PP_M4_SOURCES} ) + get_filename_component( WRF_PP_M4_INPUT_SOURCE ${WRF_PP_M4_SOURCE_FILE} REALPATH ) + get_filename_component( WRF_PP_M4_INPUT_SOURCE_FILE_ONLY ${WRF_PP_M4_SOURCE_FILE} NAME ) + + if ( ${WRF_PP_M4_EXTENSION} MATCHES "^[.][a-z0-9]+$" ) + string( REGEX REPLACE "[.].*$" "${WRF_PP_M4_EXTENSION}" WRF_PP_M4_OUTPUT_FILE ${WRF_PP_M4_INPUT_SOURCE_FILE_ONLY} ) + else() + # Default extension + string( REGEX REPLACE "[.].*$" ".i" WRF_PP_M4_OUTPUT_FILE ${WRF_PP_M4_INPUT_SOURCE_FILE_ONLY} ) + endif() + + set( WRF_PP_M4_OUTPUT_FILE ${WRF_PP_M4_OUTPUT_DIR}/${WRF_PP_M4_PREFIX}${WRF_PP_M4_OUTPUT_FILE}${WRF_PP_M4_SUFFIX} ) + + list( + APPEND WRF_PP_M4_COMMANDS + COMMAND ${WRF_PP_M4_PROGRAM_TO_USE} ${WRF_PP_M4_FLAGS} ${WRF_PP_M4_INPUT_SOURCE} > ${WRF_PP_M4_OUTPUT_FILE} + # Force check that they were made + COMMAND ${CMAKE_COMMAND} -E compare_files ${WRF_PP_M4_OUTPUT_FILE} ${WRF_PP_M4_OUTPUT_FILE} + ) + list( + APPEND WRF_PP_M4_OUTPUT + ${WRF_PP_M4_OUTPUT_FILE} + ) + + # # Tell all targets that eventually use this file that it is generated - this is useful if this macro is used in a + # # different directory than where the target dependency is set + # # Thanks to https://gitlab.kitware.com/cmake/community/-/wikis/FAQ#how-can-i-add-a-dependency-to-a-source-file-which-is-generated-in-a-subdirectory + # # and https://samthursfield.wordpress.com/2015/11/21/cmake-dependencies-between-targets-and-files-and-custom-commands/ + # # It keeps getting better lol + # # https://gitlab.kitware.com/cmake/cmake/-/issues/18399 + # # We could use cmake 3.20+ and CMP0118, but this allows usage from 3.18.6+ + # TL;DR - This doesn't work despite all documentation stating otherwise, need to use CMP0118 + # set_source_files_properties( + # ${WRF_PP_M4_OUTPUT_FILE} + # ${WRF_PP_M4_TARGET_DIRECTORY} + # PROPERTIES + # GENERATED TRUE + # ) + set_source_files_properties( + ${WRF_PP_M4_OUTPUT_FILE} + DIRECTORY ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} + ${WRF_PP_M4_TARGET_DIRECTORY} + PROPERTIES + Fortran_PREPROCESS OFF + ) + # message( STATUS "File ${WRF_PP_M4_SOURCE_FILE} will be preprocessed into ${WRF_PP_M4_OUTPUT_FILE}" ) + + endforeach() + + # Preprocess sources into a custom target + add_custom_command( + OUTPUT ${WRF_PP_M4_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E make_directory ${WRF_PP_M4_OUTPUT_DIR} + ${WRF_PP_M4_COMMANDS} + COMMENT "Preprocessing ${WRF_PP_M4_TARGET_NAME}" + DEPENDS ${WRF_PP_M4_DEPENDENCIES} + ) + + add_custom_target( + ${WRF_PP_M4_TARGET_NAME} + DEPENDS ${WRF_PP_M4_OUTPUT} + ) +endmacro() diff --git a/cmake/modules/FindJasper.cmake b/cmake/modules/FindJasper.cmake new file mode 100644 index 0000000000..541ecf2147 --- /dev/null +++ b/cmake/modules/FindJasper.cmake @@ -0,0 +1,65 @@ +# Find Jasper +# Eventually replace with Jasper's actual config if using that +# Once found this file will define: +# Jasper_FOUND - System has Jasper +# Jasper_INCLUDE_DIRS - The Jasper include directories +# Jasper_LIBRARIES - The libraries needed to use Jasper + +find_package( PkgConfig ) +pkg_check_modules( PC_Jasper QUIET Jasper ) +# set(CMAKE_FIND_DEBUG_MODE TRUE) +find_path( + Jasper_INCLUDE_DIR + NAMES jasper/jasper.h # Make it so we go up one dir + # Hints before PATHS + HINTS ${Jasper_ROOT} ${JASPERINC} ${JASPER_PATH} ENV Jasper_ROOT ENV JASPERINC ENV JASPER_PATH + PATHS ${PC_Jasper_INCLUDE_DIRS} + PATH_SUFFIXES Jasper jasper include #include/jasper + ) +find_library( + Jasper_LIBRARY + NAMES jasper + # Hints before PATHS + HINTS ${Jasper_ROOT} ${JASPERLIB} ${JASPER_PATH} ENV Jasper_ROOT ENV JASPERLIB ENV JASPER_PATH + PATHS ${PC_Jasper_LIBRARY_DIRS} + PATH_SUFFIXES lib + ) + +# Ripped from https://github.com/Kitware/CMake/blob/master/Modules/FindJasper.cmake +if( Jasper_INCLUDE_DIR AND EXISTS "${Jasper_INCLUDE_DIR}/jasper/jas_config.h") + file(STRINGS "${Jasper_INCLUDE_DIR}/jasper/jas_config.h" jasper_version_str REGEX "^#define[\t ]+JAS_VERSION[\t ]+\".*\".*") + string(REGEX REPLACE "^#define[\t ]+JAS_VERSION[\t ]+\"([^\"]+)\".*" "\\1" Jasper_VERSION_STRING "${jasper_version_str}") +endif() +# set(CMAKE_FIND_DEBUG_MODE FALSE) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + Jasper + FOUND_VAR Jasper_FOUND + REQUIRED_VARS + Jasper_LIBRARY + Jasper_INCLUDE_DIR + VERSION_VAR Jasper_VERSION_STRING + HANDLE_VERSION_RANGE + ) + +if ( Jasper_FOUND AND NOT TARGET Jasper::Jasper ) + add_library( Jasper::Jasper UNKNOWN IMPORTED ) + set_target_properties( + Jasper::Jasper + PROPERTIES + IMPORTED_LOCATION "${Jasper_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${PC_Jasper_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${Jasper_INCLUDE_DIR}" + ) + + # Allow traditional/legacy style usage + set( Jasper_LIBRARIES ${Jasper_LIBRARY} ) + set( Jasper_INCLUDE_DIRS ${Jasper_INCLUDE_DIR} ) + set( Jasper_DEFINITIONS ${PC_Jasper_CFLAGS_OTHER} ) + + mark_as_advanced( + Jasper_INCLUDE_DIR + Jasper_LIBRARY + ) +endif() \ No newline at end of file diff --git a/cmake/modules/FindRPC.cmake b/cmake/modules/FindRPC.cmake new file mode 100644 index 0000000000..fbbbbda36f --- /dev/null +++ b/cmake/modules/FindRPC.cmake @@ -0,0 +1,59 @@ +# Find RPC +# Eventually replace with RPC's actual config if using that +# Once found this file will define: +# RPC_FOUND - System has RPC +# RPC_INCLUDE_DIRS - The RPC include directories +# RPC_LIBRARIES - The libraries needed to use RPC + +find_package( PkgConfig ) +pkg_check_modules( PC_RPC QUIET RPC ) +# set(CMAKE_FIND_DEBUG_MODE TRUE) +find_path( + RPC_INCLUDE_DIR + NAMES rpc/types.h # Make it so we go up one dir + # Hints before PATHS + HINTS ENV RPC_ROOT ENV RPCINC ENV RPC_PATH ${RPC_ROOT} ${RPCINC} ${RPC_PATH} + PATHS ${PC_RPC_INCLUDE_DIRS} + PATH_SUFFIXES tirpc + ) +find_library( + RPC_LIBRARY + NAMES rpc rpcsvc + # Hints before PATHS + HINTS ENV RPC_ROOT ENV RPCLIB ENV RPC_PATH ${RPC_ROOT} ${RPCLIB} ${RPC_PATH} + PATHS ${PC_RPC_LIBRARY_DIRS} + PATH_SUFFIXES lib + ) + +# set(CMAKE_FIND_DEBUG_MODE FALSE) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + RPC + FOUND_VAR RPC_FOUND + REQUIRED_VARS + RPC_LIBRARY + RPC_INCLUDE_DIR + # VERSION_VAR RPC_VERSION + ) + +if ( RPC_FOUND AND NOT TARGET RPC::RPC ) + add_library( RPC::RPC UNKNOWN IMPORTED ) + set_target_properties( + RPC::RPC + PROPERTIES + IMPORTED_LOCATION "${RPC_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${PC_RPC_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${RPC_INCLUDE_DIR}" + ) + + # Allow traditional/legacy style usage + set( RPC_LIBRARIES ${RPC_LIBRARY} ) + set( RPC_INCLUDE_DIRS ${RPC_INCLUDE_DIR} ) + set( RPC_DEFINITIONS ${PC_RPC_CFLAGS_OTHER} ) + + mark_as_advanced( + RPC_INCLUDE_DIR + RPC_LIBRARY + ) +endif() \ No newline at end of file diff --git a/cmake/modules/FindnetCDF-Fortran.cmake b/cmake/modules/FindnetCDF-Fortran.cmake new file mode 100644 index 0000000000..0ead239a57 --- /dev/null +++ b/cmake/modules/FindnetCDF-Fortran.cmake @@ -0,0 +1,89 @@ +# Find netcdf +# Eventually replace with netCDF-Fortran's actual config if using that +# Once found this file will define: +# netCDF-Fortran_FOUND - System has netcdf +# netCDF-Fortran_INCLUDE_DIRS - The netcdf include directories +# netCDF-Fortran_LIBRARIES - The libraries needed to use netcdf +# netCDF-Fortran_DEFINITIONS - Compiler switches required for using netcdf + +# list( REMOVE_ITEM CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ) +# find_package( netCDF-Fortran ) +# list( APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ) + + +# exit early if we don't even need to be here +if ( netCDF-Fortran_FOUND ) + return() +endif() + +############################################################################### +# First try to find using netCDF-Fortran native cmake build +# TODO : Enable this when netCDF-Fortran native cmake build works well as an imported package +# find_package( netCDF-Fortran CONFIG ) +# if ( netCDF-Fortran_FOUND ) +# message( STATUS "Found netCDF-Fortran through native cmake build" ) +# return() +# endif() +############################################################################### + +# else +# Use nf-config +find_program( + NETCDF-FORTRAN_PROGRAM + nf-config + QUIET + ) + +if ( ${NETCDF-FORTRAN_PROGRAM} MATCHES "-NOTFOUND$" ) + message( STATUS "No nf-config found" ) +else() + message( STATUS "Found NETCDF-FORTRAN_PROGRAM : ${NETCDF-FORTRAN_PROGRAM}" ) + + execute_process( COMMAND ${NETCDF-FORTRAN_PROGRAM} --includedir OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF-Fortran_INCLUDE_DIR ) + execute_process( COMMAND ${NETCDF-FORTRAN_PROGRAM} --prefix OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF-Fortran_PREFIX ) + execute_process( COMMAND ${NETCDF-FORTRAN_PROGRAM} --flibs OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF-Fortran_FLIBS ) + execute_process( COMMAND ${NETCDF-FORTRAN_PROGRAM} --version OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF-Fortran_VERSION_RAW ) + execute_process( COMMAND ${NETCDF-FORTRAN_PROGRAM} --has-nc4 OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF-Fortran_NC4_YES ) + + # check for large file support + find_file( netCDF-Fortran_INCLUDE_FILE netcdf.inc ${netCDF-Fortran_INCLUDE_DIR} ) + file( READ ${netCDF-Fortran_INCLUDE_FILE} netCDF-Fortran_INCLUDE_FILE_STR ) + string( FIND "${netCDF-Fortran_INCLUDE_FILE_STR}" "nf_format_64bit_data" netCDF-Fortran_LARGE_FILE_SUPPORT_FOUND ) + if ( ${netCDF-Fortran_LARGE_FILE_SUPPORT_FOUND} EQUAL -1 ) + set( netCDF-Fortran_LARGE_FILE_SUPPORT "NO" ) + else() + set( netCDF-Fortran_LARGE_FILE_SUPPORT "YES" ) + endif() + + # Sanitize version + string( REPLACE " " ";" netCDF-Fortran_VERSION_LIST ${netCDF-Fortran_VERSION_RAW} ) + list( GET netCDF-Fortran_VERSION_LIST -1 netCDF-Fortran_VERSION ) + + # Convert to YES/NO - Note cannot be generator expression if you want to use it during configuration time + string( TOUPPER ${netCDF-Fortran_NC4_YES} netCDF-Fortran_NC4 ) + + set( netCDF-Fortran_DEFINITIONS ) + set( netCDF-Fortran_LIBRARY_DIR ${netCDF-Fortran_PREFIX}/lib ) + + set( netCDF-Fortran_LIBRARIES + $<$:${netCDF-Fortran_FLIBS}> + ) + + # Because we may need this for in-situ manual preprocessing do not use genex + set( netCDF-Fortran_INCLUDE_DIRS ${netCDF-Fortran_INCLUDE_DIR} ) +endif() + +find_package( PkgConfig ) + +include(FindPackageHandleStandardArgs) + +# handle the QUIETLY and REQUIRED arguments and set netCDF-Fortran_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args( + netCDF-Fortran DEFAULT_MSG + netCDF-Fortran_INCLUDE_DIRS + netCDF-Fortran_FLIBS + netCDF-Fortran_VERSION + ) + +mark_as_advanced( netCDF-Fortran_FLIBS netCDF-Fortran_PREFIX netCDF-Fortran_LIBRARY_DIR ) \ No newline at end of file diff --git a/cmake/modules/FindnetCDF.cmake b/cmake/modules/FindnetCDF.cmake new file mode 100644 index 0000000000..518ec95348 --- /dev/null +++ b/cmake/modules/FindnetCDF.cmake @@ -0,0 +1,95 @@ +# Find netcdf +# Eventually replace with netCDF's actual config if using that +# Once found this file will define: +# netCDF_FOUND - System has netcdf +# netCDF_INCLUDE_DIRS - The netcdf include directories +# netCDF_LIBRARIES - The libraries needed to use netcdf +# netCDF_DEFINITIONS - Compiler switches required for using netcdf + +# list( REMOVE_ITEM CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ) +# find_package( netCDF ) +# list( APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ) + +# exit early if we don't even need to be here +if ( netCDF_FOUND ) + return() +endif() + + +############################################################################### +# First try to find using netCDF native cmake build +# TODO : Enable this when netCDF native cmake build works well as an imported package +# find_package( netCDF CONFIG ) +# if ( netCDF_FOUND ) +# message( STATUS "Found netCDF through native cmake build" ) +# return() +# endif() +############################################################################### + + +# else +# Use nc-config +find_program( + NETCDF_PROGRAM + nc-config + QUIET + ) + +if ( ${NETCDF_PROGRAM} MATCHES "-NOTFOUND$" ) + message( STATUS "No nc-config found" ) +else() + message( STATUS "Found NETCDF_PROGRAM : ${NETCDF_PROGRAM}" ) + + execute_process( COMMAND ${NETCDF_PROGRAM} --includedir OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF_INCLUDE_DIR ) + execute_process( COMMAND ${NETCDF_PROGRAM} --libdir OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF_LIBRARY_DIR ) + execute_process( COMMAND ${NETCDF_PROGRAM} --prefix OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF_PREFIX ) + execute_process( COMMAND ${NETCDF_PROGRAM} --libs OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF_CLIBS ) + execute_process( COMMAND ${NETCDF_PROGRAM} --version OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF_VERSION_RAW ) + execute_process( COMMAND ${NETCDF_PROGRAM} --has-nc4 OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF_NC4_YES ) + execute_process( COMMAND ${NETCDF_PROGRAM} --has-pnetcdf OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF_PNETCDF_YES ) + execute_process( COMMAND ${NETCDF_PROGRAM} --has-parallel OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE netCDF_PARALLEL_YES ) + + # check for large file support + find_file( netCDF_INCLUDE_FILE netcdf.h ${netCDF_INCLUDE_DIR} ) + file( READ ${netCDF_INCLUDE_FILE} netCDF_INCLUDE_FILE_STR ) + string( FIND "${netCDF_INCLUDE_FILE_STR}" "NC_FORMAT_64BIT_DATA" netCDF_LARGE_FILE_SUPPORT_FOUND ) + if ( ${netCDF_LARGE_FILE_SUPPORT_FOUND} EQUAL -1 ) + set( netCDF_LARGE_FILE_SUPPORT "NO" ) + else() + set( netCDF_LARGE_FILE_SUPPORT "YES" ) + endif() + + # Sanitize version + string( REPLACE " " ";" netCDF_VERSION_LIST ${netCDF_VERSION_RAW} ) + list( GET netCDF_VERSION_LIST -1 netCDF_VERSION ) + + # Convert to YES/NO - Note cannot be generator expression if you want to use it during configuration time + string( TOUPPER ${netCDF_NC4_YES} netCDF_NC4 ) + string( TOUPPER ${netCDF_PNETCDF_YES} netCDF_PNETCDF ) + string( TOUPPER ${netCDF_PARALLEL_YES} netCDF_PARALLEL ) + + set( netCDF_DEFINITIONS ) + + set( netCDF_LIBRARIES + # All supported language variants will need this regardless - this may conflict with the RPATH in any + # supplemental packages so be careful to use compatible langauge versions of netCDF + $<$,$>:${netCDF_CLIBS}> + ) + # Because we may need this for in-situ manual preprocessing do not use genex + set( netCDF_INCLUDE_DIRS ${netCDF_INCLUDE_DIR} ) +endif() + +find_package( PkgConfig ) + +include(FindPackageHandleStandardArgs) + +# handle the QUIETLY and REQUIRED arguments and set netCDF_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args( netCDF DEFAULT_MSG + netCDF_INCLUDE_DIRS + netCDF_LIBRARY_DIR + netCDF_CLIBS + netCDF_VERSION + ) + +mark_as_advanced( netCDF_CLIBS netCDF_PREFIX netCDF_LIBRARY_DIR ) \ No newline at end of file diff --git a/cmake/modules/FindpnetCDF.cmake b/cmake/modules/FindpnetCDF.cmake new file mode 100644 index 0000000000..3606b94ba2 --- /dev/null +++ b/cmake/modules/FindpnetCDF.cmake @@ -0,0 +1,90 @@ +# Find pnetcdf +# Eventually replace with pnetCDF's actual config if using that +# Once found this file will define: +# pnetCDF_FOUND - System has pnetcdf +# pnetCDF_INCLUDE_DIRS - The pnetcdf include directories +# pnetCDF_LIBRARIES - The libraries needed to use pnetcdf +# pnetCDF_DEFINITIONS - Compiler switches required for using pnetcdf + +# list( REMOVE_ITEM CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ) +# find_package( pnetCDF ) +# list( APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR} ) + +# Use pnetcdf-config +find_program( + PNETCDF_PROGRAM + pnetcdf-config + QUIET + ) + +if ( ${PNETCDF_PROGRAM} MATCHES "-NOTFOUND$" ) + message( STATUS "No pnetcdf-config found : ${PNETCDF_PROGRAM}" ) +else() + message( STATUS "Found PNETCDF_PROGRAM : ${PNETCDF_PROGRAM}" ) + + execute_process( COMMAND ${PNETCDF_PROGRAM} --includedir OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE pnetCDF_INCLUDE_DIR ) + execute_process( COMMAND ${PNETCDF_PROGRAM} --libdir OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE pnetCDF_LIBRARY_DIR ) + execute_process( COMMAND ${PNETCDF_PROGRAM} --prefix OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE pnetCDF_PREFIX ) + execute_process( COMMAND ${PNETCDF_PROGRAM} --version OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE pnetCDF_VERSION_RAW ) + execute_process( COMMAND ${PNETCDF_PROGRAM} --netcdf4 OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE pnetCDF_NC4_ENABLED ) + + execute_process( COMMAND ${PNETCDF_PROGRAM} --has-c++ OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE pnetCDF_CXX_YES ) + execute_process( COMMAND ${PNETCDF_PROGRAM} --has-fortran OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE pnetCDF_FORTRAN_YES ) + + # check for large file support + find_file( pnetCDF_INCLUDE_FILE pnetcdf.inc ${pnetCDF_INCLUDE_DIR} ) + file( READ ${pnetCDF_INCLUDE_FILE} pnetCDF_INCLUDE_FILE_STR ) + string( FIND "${pnetCDF_INCLUDE_FILE_STR}" "nf_format_64bit" pnetCDF_LARGE_FILE_SUPPORT_FOUND ) + if ( ${pnetCDF_LARGE_FILE_SUPPORT_FOUND} EQUAL -1 ) + set( pnetCDF_LARGE_FILE_SUPPORT "NO" ) + else() + set( pnetCDF_LARGE_FILE_SUPPORT "YES" ) + endif() + + # Sanitize version + string( REPLACE " " ";" pnetCDF_VERSION_LIST ${pnetCDF_VERSION_RAW} ) + list( GET pnetCDF_VERSION_LIST -1 pnetCDF_VERSION ) + + # Note that pnetCDF has decided to change things up and use "disabled" instead of "yes/no" + string( TOLOWER ${pnetCDF_NC4_ENABLED} pnetCDF_NC4_ENABLED ) + if ( ${pnetCDF_NC4_ENABLED} STREQUAL "enabled" ) + set( pnetCDF_NC4 "YES" ) + else() + set( pnetCDF_NC4 "NO" ) + endif() + + string( TOUPPER ${pnetCDF_CXX_YES} pnetCDF_CXX ) + string( TOUPPER ${pnetCDF_FORTRAN_YES} pnetCDF_FORTRAN ) + + + set( pnetCDF_DEFINITIONS ) + + # Find libraries + find_library( + pnetCDF_LIBRARY + NAMES pnetcdf + # Hints before PATHS + HINTS ${pnetCDF_LIBRARY_DIR} + NO_DEFAULT_PATH + ) + + + set( pnetCDF_LIBRARIES + $<$:${pnetCDF_LIBRARY}> + $<$:$<$:${pnetCDF_LIBRARY}>> + $<$:$<$:${pnetCDF_LIBRARY}>> + ) + set( pnetCDF_INCLUDE_DIRS ${pnetCDF_INCLUDE_DIR} ) +endif() +find_package( PkgConfig ) +include(FindPackageHandleStandardArgs) + +# handle the QUIETLY and REQUIRED arguments and set pnetCDF_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args( pnetCDF DEFAULT_MSG + pnetCDF_INCLUDE_DIRS + pnetCDF_LIBRARIES + pnetCDF_VERSION + ) + +# mark_as_advanced( pnetCDF_CLIBS pnetCDF_CXXLIBS pnetCDF_FLIBS ) \ No newline at end of file diff --git a/cmake/printOption.cmake b/cmake/printOption.cmake new file mode 100644 index 0000000000..f00d893e9a --- /dev/null +++ b/cmake/printOption.cmake @@ -0,0 +1,54 @@ +# https://stackoverflow.com/a/19578320 +# Some color defintions +if ( NOT "${PRINT_OPTION_SUPPRESS_COLOR}" ) + if ( NOT WIN32 ) + string( ASCII 27 ESC ) + set( COLOR_RESET "${ESC}[m" ) + set( COLOR_BOLD "${ESC}[1m" ) + set( RED "${ESC}[31m" ) + set( GREEN "${ESC}[32m" ) + set( YELLOW "${ESC}[33m" ) + set( BLUE "${ESC}[34m" ) + set( MAGENTA "${ESC}[35m" ) + set( CYAN "${ESC}[36m" ) + set( WHITE "${ESC}[37m" ) + set( BOLD_RED "${ESC}[1;31m" ) + set( BOLD_GREEN "${ESC}[1;32m" ) + set( BOLD_YELLOW "${ESC}[1;33m" ) + set( BOLD_BLUE "${ESC}[1;34m" ) + set( BOLD_MAGENTA "${ESC}[1;35m" ) + set( BOLD_CYAN "${ESC}[1;36m" ) + set( BOLD_WHITE "${ESC}[1;37m" ) + endif() +endif() + +function( print_option ) + set( OPTION ${ARGV0} ) + set( JUSTIFY ${ARGV1} ) + + if ( ${ARGC} GREATER_EQUAL 3 ) + set( ALT_COLOR ${ARGV2} ) + endif() + + if ( DEFINED ALT_COLOR ) + set( OPT_COLOR ${ALT_COLOR} ) + else() + set( OPT_COLOR ${RED} ) + if ( ${${OPTION}} ) + set( OPT_COLOR ${GREEN} ) + endif() + endif() + + set( OPTION_STR "${OPTION}" ) + string( LENGTH ${OPTION_STR} OPTION_STR_LEN ) + math( EXPR N_JUSTIFY "${JUSTIFY} - ${OPTION_STR_LEN}" ) + + if ( ${N_JUSTIFY} LESS 1 ) + set( N_JUSTIFY 1 ) + endif() + + string( REPEAT " " ${N_JUSTIFY} JUSTIFY_WHITESPACE ) + + message( STATUS "${OPTION_STR}${JUSTIFY_WHITESPACE} : ${OPT_COLOR}${${OPTION}}${COLOR_RESET}" ) + +endfunction() \ No newline at end of file diff --git a/cmake/target_copy.cmake b/cmake/target_copy.cmake new file mode 100644 index 0000000000..429eddc976 --- /dev/null +++ b/cmake/target_copy.cmake @@ -0,0 +1,75 @@ +# WRF Macro for copying files with generated dependency +# https://stackoverflow.com/a/34800230 +macro( wrf_copy_source_files ) + + set( options ) + set( oneValueArgs TARGET_NAME SUFFIX PREFIX EXTENSION OUTPUT_DIR ) + set( multiValueArgs DEPENDENCIES SOURCES ) + + cmake_parse_arguments( + WRF_COPY + "${options}" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN} + ) + + # Generate compile command and file outputs + set( WRF_COPY_OUTPUT ) + set( WRF_COPY_COMMANDS ) + foreach( WRF_COPY_SOURCE_FILE ${WRF_COPY_SOURCES} ) + get_filename_component( WRF_COPY_INPUT_SOURCE ${WRF_COPY_SOURCE_FILE} REALPATH ) + get_filename_component( WRF_COPY_INPUT_SOURCE_FILE_ONLY ${WRF_COPY_SOURCE_FILE} NAME ) + + if ( ${WRF_COPY_EXTENSION} MATCHES "^[.][a-z0-9]+$" ) + string( REGEX REPLACE "[.].*$" "${WRF_COPY_EXTENSION}" WRF_COPY_OUTPUT_FILE ${WRF_COPY_INPUT_SOURCE_FILE_ONLY} ) + else() + # Default to original filename + set( WRF_COPY_OUTPUT_FILE ${WRF_COPY_INPUT_SOURCE_FILE_ONLY} ) + endif() + + set( WRF_COPY_OUTPUT_FILE ${WRF_COPY_OUTPUT_DIR}/${WRF_COPY_PREFIX}${WRF_COPY_OUTPUT_FILE}${WRF_COPY_SUFFIX} ) + + + list( + APPEND WRF_COPY_COMMANDS + COMMAND ${CMAKE_COMMAND} -E copy ${WRF_COPY_INPUT_SOURCE} ${WRF_COPY_OUTPUT_FILE} + # Force check that they were made + COMMAND ${CMAKE_COMMAND} -E compare_files ${WRF_COPY_OUTPUT_FILE} ${WRF_COPY_OUTPUT_FILE} + ) + list( + APPEND WRF_COPY_OUTPUT + ${WRF_COPY_OUTPUT_FILE} + ) + + # # Tell all targets that eventually use this file that it is generated - this is useful if this macro is used in a + # # different directory than where the target dependency is set + # # Thanks to https://gitlab.kitware.com/cmake/community/-/wikis/FAQ#how-can-i-add-a-dependency-to-a-source-file-which-is-generated-in-a-subdirectory + # # and https://samthursfield.wordpress.com/2015/11/21/cmake-dependencies-between-targets-and-files-and-custom-commands/ + # # It keeps getting better lol + # # https://gitlab.kitware.com/cmake/cmake/-/issues/18399 + # # We could use cmake 3.20+ and CMP0118, but this allows usage from 3.18.6+ + # TL;DR - This doesn't work despite all documentation stating otherwise, need to use CMP0118 + # set_source_files_properties( + # ${WRF_COPY_OUTPUT_FILE} + # ${WRF_COPY_TARGET_DIRECTORY} + # PROPERTIES + # GENERATED TRUE + # ) + + message( STATUS "File ${WRF_COPY_SOURCE_FILE} will be copied to ${WRF_COPY_OUTPUT_FILE}" ) + + endforeach() + + # Preprocess sources into a custom target + add_custom_command( + OUTPUT ${WRF_COPY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E make_directory ${WRF_COPY_OUTPUT_DIR} + ${WRF_COPY_COMMANDS} + COMMENT "Preprocessing ${WRF_COPY_TARGET_NAME}" + DEPENDS ${WRF_COPY_DEPENDENCIES} + ) + + add_custom_target( + ${WRF_COPY_TARGET_NAME} + DEPENDS ${WRF_COPY_OUTPUT} + ) +endmacro() diff --git a/cmake/template/WRFConfig.cmake.in b/cmake/template/WRFConfig.cmake.in new file mode 100644 index 0000000000..f896e0f420 --- /dev/null +++ b/cmake/template/WRFConfig.cmake.in @@ -0,0 +1,54 @@ +# WRF CMake Package + +@PACKAGE_INIT@ + +include( "${CMAKE_CURRENT_LIST_DIR}/@EXPORT_NAME@Targets.cmake" ) + +set( WRF_VERSION @PROJECT_VERSION@ ) + +# Options WRF was built with +set( WRF_CORE @WRF_CORE@ ) +set( WRF_NESTING @WRF_NESTING@ ) +set( WRF_CASE @WRF_CASE@ ) + +set( WRF_USE_DOUBLE @USE_DOUBLE@ ) +set( WRF_USE_MPI @USE_MPI@ ) +set( WRF_USE_OPENMP @USE_OPENMP@ ) +set( WRF_ENABLE_CHEM @ENABLE_CHEM@ ) +set( WRF_ENABLE_CMAQ @ENABLE_CMAQ@ ) +set( WRF_ENABLE_KPP @ENABLE_KPP@ ) +set( WRF_ENABLE_DFI_RADAR @ENABLE_DFI_RADAR@ ) +set( WRF_ENABLE_TITAN @ENABLE_TITAN@ ) +set( WRF_ENABLE_MARS @ENABLE_MARS@ ) +set( WRF_ENABLE_VENUS @ENABLE_VENUS@ ) +set( WRF_ENABLE_VENUS @ENABLE_VENUS@ ) +set( WRF_ENABLE_TERRAIN @ENABLE_TERRAIN@ ) +set( WRF_ENABLE_CLM @ENABLE_CLM@ ) +set( WRF_USE_ALLOCATABLES @USE_ALLOCATABLES@ ) +set( WRF_wrfmodel @wrfmodel@ ) +set( WRF_GRIB1 @GRIB1@ ) +set( WRF_INTIO @INTIO@ ) +set( WRF_KEEP_INT_AROUND @KEEP_INT_AROUND@ ) +set( WRF_LIMIT_ARGS @LIMIT_ARGS@ ) +set( WRF_FORCE_NETCDF_CLASSIC @FORCE_NETCDF_CLASSIC@ ) +set( WRF_BUILD_RRTMG_FAST @BUILD_RRTMG_FAST@ ) +set( WRF_BUILD_RRTMK @BUILD_RRTMK@ ) +set( WRF_BUILD_SBM_FAST @BUILD_SBM_FAST@ ) +set( WRF_SHOW_ALL_VARS_USED @SHOW_ALL_VARS_USED@ ) +set( WRF_WRFIO_NCD_NO_LARGE_FILE_SUPPORT @WRFIO_NCD_NO_LARGE_FILE_SUPPORT@ ) + + +if ( ${WRF_USE_MPI} ) + find_package( MPI REQUIRED COMPONENTS Fortran C ) +endif() + +if ( ${WRF_USE_OPENMP} ) + find_package( OpenMP REQUIRED COMPONENTS Fortran C ) +endif() + +find_package( netCDF REQUIRED ) +# Attempt to find zlib packaged with netcdf first +set( ZLIB_ROOT ${netCDF_PREFIX} ) +find_package( ZLIB REQUIRED ) + +check_required_components( "@EXPORT_NAME@_Core" ) \ No newline at end of file diff --git a/cmake/template/arch_config.cmake b/cmake/template/arch_config.cmake new file mode 100644 index 0000000000..42cba60287 --- /dev/null +++ b/cmake/template/arch_config.cmake @@ -0,0 +1,29 @@ +# https://cmake.org/cmake/help/latest/module/FindMPI.html#variables-for-locating-mpi +set( MPI_Fortran_COMPILER "{DM_FC}" ) +set( MPI_C_COMPILER "{DM_CC}" ) + +# https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html +set( CMAKE_Fortran_COMPILER "{SFC}" ) +set( CMAKE_C_COMPILER "{SCC}" ) + +# Our own addition +set( CMAKE_C_PREPROCESSOR "{CPP}" ) +set( CMAKE_C_PREPROCESSOR_FLAGS {CPP_FLAGS} ) + +# https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_FLAGS_INIT.html +set( CMAKE_Fortran_FLAGS_INIT "{SFC_FLAGS} {FCBASEOPTS} {BYTESWAPIO}" ) +set( CMAKE_C_FLAGS_INIT "{SCC_FLAGS} {CFLAGS_LOCAL}" ) + +# https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_FLAGS_CONFIG_INIT.html +set( CMAKE_Fortran_FLAGS_DEBUG_INIT "{FCDEBUG}" ) +set( CMAKE_Fortran_FLAGS_RELEASE_INIT "" ) +set( CMAKE_C_FLAGS_DEBUG_INIT "" ) +set( CMAKE_C_FLAGS_RELEASE_INIT "" ) + +# Project specifics now +set( WRF_MPI_Fortran_FLAGS "{DM_FC_FLAGS}" ) +set( WRF_MPI_C_FLAGS "{DM_CC_FLAGS}" ) +set( WRF_ARCH_LOCAL "{ARCH_LOCAL}" ) +set( WRF_M4_FLAGS "{M4_FLAGS}" ) +set( WRF_FCOPTIM "{FCOPTIM}" ) +set( WRF_FCNOOPT "{FCNOOPT}" ) \ No newline at end of file diff --git a/cmake/template/commit_decl.cmake b/cmake/template/commit_decl.cmake new file mode 100644 index 0000000000..bcc368835b --- /dev/null +++ b/cmake/template/commit_decl.cmake @@ -0,0 +1 @@ + CHARACTER (LEN=*), PARAMETER :: commit_version = '@GIT_VERSION@' \ No newline at end of file diff --git a/cmake/wrf_case_setup.cmake b/cmake/wrf_case_setup.cmake new file mode 100644 index 0000000000..4e65dc0a72 --- /dev/null +++ b/cmake/wrf_case_setup.cmake @@ -0,0 +1,124 @@ +# WRF Macro for adding target symlinks/copies to be run after internal install() code +macro( wrf_setup_targets ) + + set( options USE_SYMLINKS ) + set( oneValueArgs DEST_PATH ) + set( multiValueArgs TARGETS ) + + cmake_parse_arguments( + WRF_SETUP + "${options}" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN} + ) + set( WRF_SETUP_CMD copy_if_different ) + if ( ${WRF_SETUP_USE_SYMLINKS} ) + set( WRF_SETUP_CMD create_symlink ) + endif() + + + foreach ( WRF_SETUP_TARGET ${WRF_SETUP_TARGETS} ) + + # Generate install code for each target + # https://stackoverflow.com/a/56528615 + #!TODO Do we *need* the rm for symlinks beforehand? + # get_filename_component( WRF_SETUP_FILE_ONLY $ NAME + + # If we ever wanted to link or copy things other than binaries we could change this + set( WRF_SETUP_INSTALL_LOCATION ${CMAKE_INSTALL_PREFIX}/bin ) + + install( + CODE " + message( STATUS \"Setting up $ via ${WRF_SETUP_CMD}\" ) + execute_process( COMMAND ${CMAKE_COMMAND} -E ${WRF_SETUP_CMD} ${WRF_SETUP_INSTALL_LOCATION}/$ ${WRF_SETUP_DEST_PATH}/$ ) + " + COMPONENT setup + ) + + # Add .exe link as well + install( + CODE " + message( STATUS \"Creating symlink for $.exe\" ) + execute_process( COMMAND ${CMAKE_COMMAND} -E create_symlink ${WRF_SETUP_DEST_PATH}/$ ${WRF_SETUP_DEST_PATH}/$.exe ) + " + COMPONENT setup + ) + + endforeach() + +endmacro() + +# WRF Macro for adding file symlinks/copies to be run after internal install() code +macro( wrf_setup_files ) + + set( options USE_SYMLINKS ) + set( oneValueArgs DEST_PATH ) + set( multiValueArgs FILES ) + + cmake_parse_arguments( + WRF_SETUP + "${options}" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN} + ) + set( WRF_SETUP_CMD copy_if_different ) + if ( ${WRF_SETUP_USE_SYMLINKS} ) + set( WRF_SETUP_CMD create_symlink ) + endif() + + foreach ( WRF_SETUP_FILE ${WRF_SETUP_FILES} ) + + # Generate install code for each file, this could be done in a simpler manner + # with regular commands but to preserve order of operations it will be done via install( CODE ... ) + # https://stackoverflow.com/a/56528615 + get_filename_component( WRF_SETUP_FULL_FILE ${WRF_SETUP_FILE} ABSOLUTE ) + get_filename_component( WRF_SETUP_FILE_ONLY ${WRF_SETUP_FILE} NAME ) + # Left here for debug purposes, may want to turn this into a trace-level debug msg + # message( "Generating install commands for ${WRF_SETUP_FILE_ONLY} into ${WRF_SETUP_DEST_PATH}" ) + install( + CODE " + message( STATUS \"Setting up ${WRF_SETUP_FILE_ONLY} via ${WRF_SETUP_CMD}\" ) + execute_process( COMMAND ${CMAKE_COMMAND} -E ${WRF_SETUP_CMD} ${WRF_SETUP_FULL_FILE} ${WRF_SETUP_DEST_PATH}/${WRF_SETUP_FILE_ONLY} ) + " + COMPONENT setup + ) + + endforeach() + +endmacro() + +# WRF Macro for adding file symlink to be run after internal install() code +macro( wrf_setup_file_new_name ) + + set( options USE_SYMLINKS ) + set( oneValueArgs FILE NEW_NAME ) + set( multiValueArgs ) + + cmake_parse_arguments( + WRF_SETUP + "${options}" "${oneValueArgs}" "${multiValueArgs}" + ${ARGN} + ) + + set( WRF_SETUP_CMD copy_if_different ) + if ( ${WRF_SETUP_USE_SYMLINKS} ) + set( WRF_SETUP_CMD create_symlink ) + endif() + + # Generate install code for each file, this could be done in a simpler manner + # with regular commands but to preserve order of operations it will be done via install( CODE ... ) + # https://stackoverflow.com/a/56528615 + get_filename_component( WRF_SETUP_FULL_FILE ${WRF_SETUP_FILE} ABSOLUTE ) + get_filename_component( WRF_SETUP_FILE_ONLY ${WRF_SETUP_FILE} NAME ) + get_filename_component( WRF_SETUP_NEW_NAME_FULL_FILE ${WRF_SETUP_NEW_NAME} ABSOLUTE ) + get_filename_component( WRF_SETUP_NEW_NAME_FILE_ONLY ${WRF_SETUP_NEW_NAME} NAME ) + # Left here for debug purposes, may want to turn this into a trace-level debug msg + # message( "Generating install commands for ${WRF_SETUP_FILE_ONLY} to ${WRF_SETUP_NEW_NAME_FILE_ONLY}" ) + install( + CODE " + message( STATUS \"Setting up ${WRF_SETUP_FILE_ONLY} (rename ${WRF_SETUP_NEW_NAME_FILE_ONLY}) via ${WRF_SETUP_CMD}\" ) + execute_process( COMMAND ${CMAKE_COMMAND} -E ${WRF_SETUP_CMD} ${WRF_SETUP_FULL_FILE} ${WRF_SETUP_NEW_NAME_FULL_FILE} ) + " + COMPONENT setup + ) + +endmacro() + diff --git a/cmake/wrf_get_version.cmake b/cmake/wrf_get_version.cmake new file mode 100644 index 0000000000..668c9d6941 --- /dev/null +++ b/cmake/wrf_get_version.cmake @@ -0,0 +1,11 @@ +# WRF Macro for getting version, this *should* be replaced with a better versioning scheme +macro( wrf_get_version WRF_VERSION_FILE ) + file( STRINGS ${WRF_VERSION_FILE} WRF_VERSION_FILE_OUTPUT ) + + list( POP_FRONT WRF_VERSION_FILE_OUTPUT FIRST_LINE ) + string( REPLACE " " ";" FIRST_LINE_LIST ${FIRST_LINE} ) + list( GET FIRST_LINE_LIST -1 WRF_VERSION ) + + set( PROJECT_VERSION ${WRF_VERSION} ) + message( STATUS "Setting project version to ${PROJECT_VERSION}" ) +endmacro() diff --git a/compile_new b/compile_new new file mode 100755 index 0000000000..721df9d3bf --- /dev/null +++ b/compile_new @@ -0,0 +1,13 @@ +#!/bin/sh +# Meant to be run at the top level + +# Now run cmake +buildDirectory=$1 +if [ ! -d "$buildDirectory" ]; then + buildDirectory=$PWD/_build + echo "Using default build directory : ${buildDirectory}" +else + shift +fi +cd $buildDirectory && make install $* +exit $? \ No newline at end of file diff --git a/confcheck/CMakeLists.txt b/confcheck/CMakeLists.txt new file mode 100644 index 0000000000..152aeeaa3a --- /dev/null +++ b/confcheck/CMakeLists.txt @@ -0,0 +1,87 @@ +# WRF configuration checks +wrf_conf_check( + RUN + RESULT_VAR Fortran_2003_IEEE + SOURCE ${PROJECT_SOURCE_DIR}/tools/fortran_2003_ieee_test.F + EXTENSION .F + MESSAGE "Some IEEE Fortran 2003 features missing, removing usage of these features" + ) + +wrf_conf_check( + RUN + RESULT_VAR Fortran_2003_ISO_C + SOURCE ${PROJECT_SOURCE_DIR}/tools/fortran_2003_iso_c_test.F + EXTENSION .F + MESSAGE "Some ISO_C Fortran 2003 features missing, removing usage ISO_C and stubbing code dependent on it" + ) + +wrf_conf_check( + RUN + RESULT_VAR Fortran_2003_FLUSH + SOURCE ${PROJECT_SOURCE_DIR}/tools/fortran_2003_flush_test.F + EXTENSION .F + MESSAGE "Standard FLUSH routine Fortran 2003 features missing, checking for alternate Fortran_2003_FFLUSH" + ) + +if ( NOT ${Fortran_2003_FLUSH} ) + wrf_conf_check( + RUN + RESULT_VAR Fortran_2003_FFLUSH + SOURCE ${PROJECT_SOURCE_DIR}/tools/fortran_2003_fflush_test.F + EXTENSION .F + MESSAGE "Standard FFLUSH routine Fortran 2003 features missing, no alternate to FLUSH found, feature stubbed out" + ) +endif() + +wrf_conf_check( + RUN + RESULT_VAR Fortran_2003_GAMMA + SOURCE ${PROJECT_SOURCE_DIR}/tools/fortran_2008_gamma_test.F + EXTENSION .F + MESSAGE "Some Fortran 2003 features missing, removing usage gamma function intrinsic and stubbing code dependent on it" + ) + + + +wrf_conf_check( + RUN + SOURCE_TYPE C + RESULT_VAR FSEEKO64 + SOURCE ${PROJECT_SOURCE_DIR}/tools/fseek_test.c + EXTENSION .c + ADDITIONAL_DEFINITIONS -DTEST_FSEEKO64 -DFILE_TO_TEST="${PROJECT_SOURCE_DIR}/CMakeLists.txt" + MESSAGE "fseeko64 not supported, checking alternate fseeko" + ) + +if ( NOT "${FSEEKO64}" ) + wrf_conf_check( + RUN + SOURCE_TYPE C + RESULT_VAR FSEEKO + SOURCE ${PROJECT_SOURCE_DIR}/tools/fseek_test.c + EXTENSION .c + ADDITIONAL_DEFINITIONS -DTEST_FSEEKO -DFILE_TO_TEST="${PROJECT_SOURCE_DIR}/CMakeLists.txt" + MESSAGE "fseeko not supported, compiling with fseek (caution with large files)" + ) +endif() + +# Unsure if this is even necessary. Defines littered throughout configure.defaults +# if ( ${USE_MPI} ) +# wrf_conf_check( +# RUN +# SOURCE_TYPE C +# RESULT_VAR MPI2_SUPPORT +# SOURCE ${PROJECT_SOURCE_DIR}/tools/mpi2_test.c +# EXTENSION .c +# MESSAGE "MPI_Comm_f2c() and MPI_Comm_c2f() not supported" +# ) + +# wrf_conf_check( +# RUN +# SOURCE_TYPE C +# RESULT_VAR MPI2_THREAD_SUPPORT +# SOURCE ${PROJECT_SOURCE_DIR}/tools/mpi2_thread_test.c +# EXTENSION .c +# MESSAGE "MPI_Init_thread() not supported" +# ) +# endif() \ No newline at end of file diff --git a/configure_new b/configure_new new file mode 100755 index 0000000000..e9d9900ba1 --- /dev/null +++ b/configure_new @@ -0,0 +1,84 @@ +#!/bin/sh + +help() +{ + echo "./configure_new [options] [-- ]" + echo " -p Preselect a stanza configuration with matching description" + echo " -x Skip CMake options prompt, meant to be used in conjunction with direct pass-in options" + echo " -d directory Use as alternate build directory" + echo " -i directory Use as alternate install directory" + echo " -- Directly pass CMake options to configuration, equivalent to cmake " + echo " -h Print this message" + +} + +preselect= +skipCMake=false +while getopts p:xd:i:h opt; do + case $opt in + p) + preselect=$OPTARG + ;; + x) + skipCMake=true + ;; + d) + buildDirectory=$OPTARG + ;; + i) + installDirectory=$OPTARG + ;; + h) help; exit 0 ;; + *) help; exit 1 ;; + :) help; exit 1 ;; + \?) help; exit 1 ;; + esac +done + +shift "$((OPTIND - 1))" + +extraOps= +if [ $skipCMake = true ]; then + extraOps="-x" +else + extraOps="-s CMakeLists.txt" +fi + +if [ -z "$buildDirectory" ]; then + buildDirectory=_build + echo "Using default build directory : $buildDirectory" +fi +if [ -z "$installDirectory" ]; then + installDirectory=$PWD/install + echo "Using default install directory : $installDirectory" +fi + +mkdir -p $buildDirectory + +if [ ! -z "$preselect" ]; then + echo "Using preselected config ${preselect}" + # Meant to be run at the top level + ./arch/configure_reader.py \ + -c arch/configure.defaults \ + -t cmake/template/arch_config.cmake \ + -o $buildDirectory/wrf_config.cmake \ + ${extraOps} -p "${preselect}" +else + # Meant to be run at the top level + ./arch/configure_reader.py \ + -c arch/configure.defaults \ + -t cmake/template/arch_config.cmake \ + -o $buildDirectory/wrf_config.cmake \ + ${extraOps} +fi + +configureStanza=$? + +if [ $configureStanza -eq 0 ]; then + # Now run cmake + cd $buildDirectory + cmake .. -DCMAKE_INSTALL_PREFIX=$installDirectory -DCMAKE_TOOLCHAIN_FILE=$buildDirectory/wrf_config.cmake $* + exit $? +else + exit $configureStanza +fi \ No newline at end of file diff --git a/doc/README.cmake_build b/doc/README.cmake_build new file mode 100644 index 0000000000..d11c248cf6 --- /dev/null +++ b/doc/README.cmake_build @@ -0,0 +1,229 @@ + +How to compile and run? +----------------------- + +- In WRF directory, type './configure_new' - this will create a + _build/wrf_config.cmake file that has appropriate compile options for the + supported computers. + + Note: !! You must clone all submodules manually and have all code prepared !! + !! to compile. No extra steps are done to download code or sanitize it !! + + Note: WRF requires netCDF library, but this cmake build does not require you + to set any environment variables. For netCDF detection, the configuration + will be detected from the `nc-config` in your path unless using + netCDF_ROOT cmake variable. See more information from cmake on *_ROOT + variables if you do not want to use the netCDF associated with the + `nc-config` in your path + + Follow the prompts to select your configuration. The first will be a general + stanza selection, which will only show configurations for which you have the + supported compilers in your path. Likewise, for partially supported stanzas + a '!!' will appear next to that portion of the stanza denoting that this + portion of the stanza is not supported in your environment and thus will not + be selectable via the interactive dialogs. + + Compared to previous version of `configure` this will look much more sparse + and the numbering will be changed to reflect what is availble. For this + reason it will be best to talk about configuration with their description + or some other unique identifier from now on with this build methodology. + + Other common options previously done during the stanza configuration selection + are now broken out into y/n interactive queries. This includes usage of : + * SM (OpenMP) + * DM (MPI) + + Target selection (case), core, and nesting are all done at the configuration phase. + + Any extra configuration parameters that would normally be done through + environment variables or extra command line options are under the + "Configure additional options?" section + + Advanced features of `./configure_new` are discussed later in this document + +- Type './compile_new [any make options such as `-j 12`]' + If the first argument to compile_new is a directory, it will instead use that + directory as the location for building. If not the default is to build the + configuration placed in _build (the default location for `./configure_new` to + place a configuration) + + +- If sucessful, this will create either `real` or `ideal` and `wrf` executables + in the install location's bin/ directory (for default location this will be + install/bin/) and the appropriate executables will be also copied into + the respective test directoires under the same install directory as + /test/. Likewise, for specific test cases that + have additional or modified inputs, those input files are copied from the + respective source location test/ + + Note: Compared to the older compile script, executables do not have the '.exe' + suffix + +- cd to the appropriate test directory in the installation location to run + ideal/real/wrf. + +- If it is one of the idealized cases (b_wave, hill2d_x, grav2d_x, quarter_ss, + squall2d_x, squall2d_y, em_les or em_heldsuarez), cd the the appropriate directory, type + + ./ideal + + to produce wrfinput_d01 file for wrf model. Then type + + ./wrf + + to run. + +- If it is real-data case (real), place files from WPS (met_em.*) + in the appropriate directory, type + + ./real + + to produce wrfbdy_d01 and wrfinput_d01. Then type + + ./wrf + + to run. + +- If you use mpich, type + + mpirun -np number-of-processors wrf + +- If you want to clean your configuration use `./cleanCMake.sh`, additional + options are available, see `./cleanCMake.sh -h` for more info + + +Advanced Configuration +----------------------- + +- The 'configure_new' script is designed to work out-of-the-box with minimal + guidance, however to take full advantage of the features this system brings + one can use `./configure_new -h` to receive a help message: + ./configure_new [options] [-- ] + -p Preselect a stanza configuration with matching description + -x Skip CMake options prompt, meant to be used in conjunction with direct pass-in options + -d directory Use as alternate build directory + -i directory Use as alternate install directory + -- Directly pass CMake options to configuration, equivalent to cmake + -h Print this message + + The '-p' option allows the preselection of a stanza based on its description + without requiring knowledge about its defined number within your environment. + This does require that the stanza exist within the compatible set that would + be available within your environment. + + The '-x' option allows the interactive dialogs to be suppressed, and + configuration will immediately proceed with whatever options have been set or + passed in. This is meant to be used with the '--' delimeter option + + The '-d' option allows us to specify an alternative build/configuration + directory. As CMake best operates with out-of-source builds, our configuration + and compilation all happen within a different directory than the source. The + default name of this directory is _build/, however for more fine-tuned control + or housing multiple builds from the same source repo at the same time one can + specify a different directory name using this option. It is recommended to use + _build* as the prefix to denote this as an autogenerated directory that can be + safely deleted in its entirety + + The '-i' options allows us to specify an alternative install directory for our + compiled configuration. The default value is $PWD/install. Note that the + default includes '$PWD/' - directory locations provided via this option should + use absolute paths as the compile command is executed inside the build + directory, thus any relative paths would be from that location. The files to + be placed in the install directory follows the same premises as the '-d' + option meaning they are autogenerated or copies of source files. This means + the install directory can be safely deleted in its entirety if this + configuration is no longer desired. This also allows multiple installs of + different compilations to coexist from within the same source repo + + The '--' option is meant to be a delimeter marking all subsequent input to be + fed directly to the CMake command execution. In other words, after this marker + anything that you place afterwards is as if you are directly passing in + command line options to `cmake`. This allows you to more effectively use the + '-x' option to skip interactive dialogs and instead write the value you want + beforehand, though usage of this option is not necessary. The option name and + values for a given option, respectively, are always named the same as the + cmake option so utilizing the same option name and value that appears in + the interactive dialog will work. As an example : + + ./configure_new -p GNU -x -- -DWRF_CORE=ARW -DWRF_NESTING=BASIC -DWRF_CASE=EM_REAL + + Would configure immediately configure for the first GNU stanza, using "ARW" as + the WRF_CORE option, "BASIC" as the WRF_NESTING option, and "EM_REAL" as the + WRF_CASE option. Note that the value used is the actual name of the value, not + the numeric shorthand used during interactive dialog. + + +- The 'compile_new' has a complimentary feature to pair with 'configure_new'. + This feature is specifying an alternate build directory to use as a compile + location. The alternate install directory, if used, does not need to be + specified as that is embedded into the cmake configuration files at configure + time. To use this feature, specify the alternate build directory to use as the + first argument ONLY into the script, like so : + + ./configure_new _buildCustomDirectory -j 12 + + Afterwards, all standard make options apply. If no directory is provided it + will be assumed that you are using the default build directory '_build'. This + should be sufficient for normal usage. + + +- The 'cleanCmake.sh' is a cleaning script to more easily facilitate cleaning + configurations, whether configured, compiled, or installed. To see the full + list of options, use `./cleanCmake.sh -h` to receive a help message: + + ./cleanCMake.sh [options] + -c [Default if no options] Basic cmake clean functionality [make -j 1 clean] + -b Remove cmake binary installs [xargs rm < _build/install_manifest.txt] + -f Remove build & install folders (WRF) [ rm _build -r; rm install/ -r ] + -a Remove all (WRF), equivalent to -c -b -f (more specifically -c then -b then -f)" + Specific builds/installs + -d directory Specify operating on particular build directory + -i directory Specify operating on particular install directory + + Each command tells exactly or the equivalent shell commands that would be + executed, but for clarity they are explained below as well. + + The '-c' option is the default usage if no options were passed in, in other + words `./cleanCmake.sh`. This effectively goes into the build directory and + runs `make -j 1 clean`, removing all binary objects in the build directory. + This does not remove files in the install directory. + + The '-b' option removes the installed files from the install directory + manually. This can be useful for reinstating a faulty or manually disrupted + install without needing to entirely recompile. For example, imagine modifying + the provided 'namelist.input' in the test case folder of the install, but not + recalling what the original values were and where the file originates from. + One could clean only the install and reinstall the exact same compilation with + `./cleanCMake.sh -b && ./compile_new` to reobtain a pristine install. + + The '-f' option removes the build and install directories entirely. This is + quickest way to clean but also lose a configuration. It can be very useful if + you find your configuration not working as expected and need a full reset. + This can often happen with CMake caching, which can be a headache to clear. + + The '-a' option can be seen as an alternative to the '-f' option which + effectively in the end does the same but in a more ordered fashion. This will + perform all the cleaning in a step-by-step process first doing the '-c' option, + then the '-b' option, and finally the '-f'. + + + Additional functionality is provided to compliment the advanced features in + 'configure_new' of '-d'/'-i'. These are mimicked in 'cleanCMake.sh' to have + the same usage and flags, so interchanging then between the commands will work. + The effects of 'cleanCMake.sh' cleaning, based on option, will + correspondingly affect the newly specified directories. For example, if an + alternate build directory is provided, the '-b' option will use that instead: + + ./cleanCMake.sh -b -d _buildCustomDirectory + + One might think we would use the install directory when specifying the '-b' + option, but recall that the install location is embeded into the build + configuration and thus removing the installs that cmake did without entirely + removing the install directory requires going to the build directory. This + can be extremely versatile when installing into common locations where other + projects or installed software coexists within a single base install folder. + + + + + diff --git a/dyn_em/CMakeLists.txt b/dyn_em/CMakeLists.txt new file mode 100644 index 0000000000..bff8b38e5d --- /dev/null +++ b/dyn_em/CMakeLists.txt @@ -0,0 +1,45 @@ +# WRF CMake Build +target_include_directories( + ${PROJECT_NAME}_Core + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ) + +######################################################################################################################## +# +# Now add sources +# +######################################################################################################################## +target_sources( + ${PROJECT_NAME}_Core + PRIVATE + module_advect_em.F + module_ieva_em.F + module_diffusion_em.F + module_small_step_em.F + module_big_step_utilities_em.F + module_em.F + module_solvedebug_em.F + module_bc_em.F + module_init_utilities.F + module_wps_io_arw.F + module_damping_em.F + module_polarfft.F + module_force_scm.F + module_first_rk_step_part1.F + module_first_rk_step_part2.F + module_avgflx_em.F + module_sfs_nba.F + module_convtrans_prep.F + module_sfs_driver.F + module_stoch.F + module_after_all_rk_steps.F + init_modules_em.F + solve_em.F + start_em.F + shift_domain_em.F + couple_or_uncouple_em.F + nest_init_utils.F + adapt_timestep_em.F + interp_domain_em.F + ) diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt new file mode 100644 index 0000000000..7036a9debe --- /dev/null +++ b/external/CMakeLists.txt @@ -0,0 +1,85 @@ +# WRF CMake Build + +# The way ncep has written these makes this difficult if not impossible to do... +# # External projects, run them inline but make an alias to their target as if +# # we "built" them ourselves - useful to avoid ExternalProject_Add() + find_package() weirdness +# # Newer versions we might need to do that since g2 relies on bacio with find_package() +# add_subdirectory( bacio ) +# add_subdirectory( g2 ) + +# # bacio v2.6.0 +# add_library( bacio::bacio ALIAS bacio ) + +# # g2 v3.1.2 +# if ( ${USE_DOUBLE} ) +# add_library( g2::g2 ALIAS g2_d ) +# else() +# add_library( g2::g2 ALIAS g2_4 ) +# endif() + + +# Always build + +add_subdirectory( io_int ) +add_subdirectory( io_grib1 ) +add_subdirectory( io_grib_share ) +add_subdirectory( ioapi_share ) +add_subdirectory( fftpack/fftpack5 ) + +if ( AMT_OCN ) + # I have no clue how this gets used + message( STATUS "Adding [atm_ocn] to configuration" ) + add_subdirectory( atm_ocn ) +endif() + +if ( ADIOS2 ) + message( STATUS "Adding [io_adios2] to configuration" ) + add_subdirectory( io_adios2 ) +endif() + +if ( ESMF ) + message( STATUS "Adding [io_esmf] to configuration" ) + add_subdirectory( io_esmf ) +endif() + +#!TODO Is this always needed +add_subdirectory( esmf_time_f90 ) + +# netCDF +#!TODO I believe this is always required from configure:651 +add_subdirectory( io_netcdf ) +#!TODO We should collapse all these files into #ifdefs even if they are compiled +# multiple times with different defs for the same configuration +if ( ${netCDF_PARALLEL} AND ${USE_MPI} ) + message( STATUS "Adding [io_netcdfpar] to configuration" ) + add_subdirectory( io_netcdfpar ) +endif() + +if ( ${pnetCDF_FOUND} ) + message( STATUS "Adding [io_pnetcdf] to configuration" ) + add_subdirectory( io_pnetcdf ) +endif() + +if ( ${PIO_FOUND} ) + message( STATUS "Adding [io_pio] to configuration" ) + add_subdirectory( io_pio ) +endif() + +# https://cmake.org/cmake/help/latest/module/FindHDF5.html +# I don't think this is the correct variable to control this IO capability... +if ( ${HDF5_IS_PARALLEL} ) + message( STATUS "Adding [io_phdf5] to configuration" ) + add_subdirectory( io_phdf5 ) +endif() + + +if ( ${Jasper_FOUND} ) + message( STATUS "Adding [io_grib2] to configuration" ) + add_subdirectory( io_grib2 ) +endif() + +if ( ${USE_RSL_LITE} ) + add_subdirectory( RSL_LITE ) +endif() + + diff --git a/external/RSL_LITE/CMakeLists.txt b/external/RSL_LITE/CMakeLists.txt new file mode 100644 index 0000000000..5f38783343 --- /dev/null +++ b/external/RSL_LITE/CMakeLists.txt @@ -0,0 +1,51 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + c_code.c + buf_for_proc.c + rsl_malloc.c + rsl_bcast.c + task_for_point.c + period.c + swap.c + cycle.c + f_pack.F90 + f_xpose.F90 + ) + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/atm_ocn/CMakeLists.txt b/external/atm_ocn/CMakeLists.txt new file mode 100644 index 0000000000..2fe79f79d3 --- /dev/null +++ b/external/atm_ocn/CMakeLists.txt @@ -0,0 +1,47 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + atm_comm.F + atm_tiles.F + cmpcomm.F + mpi_more.F + module_PATCH_QUILT.F + ) + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + Fortran_FORMAT FIXED + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/esmf_time_f90/CMakeLists.txt b/external/esmf_time_f90/CMakeLists.txt new file mode 100644 index 0000000000..3bba5fdd69 --- /dev/null +++ b/external/esmf_time_f90/CMakeLists.txt @@ -0,0 +1,62 @@ +# WRF CMake Build +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) +# Test1_ESMF +# Test1_WRFU +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + ESMF_Alarm.F90 + ESMF_BaseTime.F90 + ESMF_Clock.F90 + ESMF_Time.F90 + Meat.F90 + ESMF_Base.F90 + ESMF_Calendar.F90 + ESMF_Fraction.F90 + ESMF_TimeInterval.F90 + ESMF_Stubs.F90 + ESMF_Mod.F90 + module_symbols_util.F90 + module_utility.F90 + ESMF_AlarmClock.F90 + ) + +# target_compile_options( +# ${FOLDER_COMPILE_TARGET} +# PRIVATE +# # Specific flags for this target +# ) + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_LIST_DIR} + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/fftpack/fftpack5/CMakeLists.txt b/external/fftpack/fftpack5/CMakeLists.txt new file mode 100644 index 0000000000..1ae8c648de --- /dev/null +++ b/external/fftpack/fftpack5/CMakeLists.txt @@ -0,0 +1,53 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + c1f2kb.F cfft1b.F cmf3kf.F cosqb1.F costmi.F dcosq1f.F dfftb1.F mradb2.F mrfti1.F r1fgkf.F rfft2i.F sinqmi.F z1f2kf.F zfft1f.F zmf4kb.F + c1f2kf.F cfft1f.F cmf4kb.F cosqf1.F d1f2kb.F dcosq1i.F dfftf1.F mradb3.F msntb1.F r4_factor.F rfftb1.F sint1b.F z1f3kb.F zfft1i.F zmf4kf.F + c1f3kb.F cfft1i.F cmf4kf.F cosqmb.F d1f2kf.F dcosqb1.F dffti1.F mradb4.F msntf1.F r4_mcfti1.F rfftf1.F sint1f.F z1f3kf.F zfft2b.F zmf5kb.F + c1f3kf.F cfft2b.F cmf5kb.F cosqmf.F d1f3kb.F dcosqf1.F dsint1b.F mradb5.F r1f2kb.F r4_tables.F rffti1.F sint1i.F z1f4kb.F zfft2f.F zmf5kf.F + c1f4kb.F cfft2f.F cmf5kf.F cosqmi.F d1f3kf.F dcost1b.F dsint1f.F mradbg.F r1f2kf.F r8_factor.F rfftmb.F sintb1.F z1f4kf.F zfft2i.F zmfgkb.F + c1f4kf.F cfft2i.F cmfgkb.F cost1b.F d1f4kb.F dcost1f.F dsint1i.F mradf2.F r1f3kb.F r8_mcfti1.F rfftmf.F sintf1.F z1f5kb.F zfftmb.F zmfgkf.F + c1f5kb.F cfftmb.F cmfgkf.F cost1f.F d1f4kf.F dcost1i.F dsintb1.F mradf3.F r1f3kf.F r8_tables.F rfftmi.F sintmb.F z1f5kf.F zfftmf.F zmfm1b.F + c1f5kf.F cfftmf.F cmfm1b.F cost1i.F d1f5kb.F dcostb1.F dsintf1.F mradf4.F r1f4kb.F rfft1b.F sinq1b.F sintmf.F z1fgkb.F zfftmi.F zmfm1f.F + c1fgkb.F cfftmi.F cmfm1f.F costb1.F d1f5kf.F dcostf1.F mcsqb1.F mradf5.F r1f4kf.F rfft1f.F sinq1f.F sintmi.F z1fgkf.F zmf2kb.F + c1fgkf.F cmf2kb.F cosq1b.F costf1.F d1fgkb.F dfft1b.F mcsqf1.F mradfg.F r1f5kb.F rfft1i.F sinq1i.F xercon.F z1fm1b.F zmf2kf.F + c1fm1b.F cmf2kf.F cosq1f.F costmb.F d1fgkf.F dfft1f.F mcstb1.F mrftb1.F r1f5kf.F rfft2b.F sinqmb.F xerfft.F z1fm1f.F zmf3kb.F + c1fm1f.F cmf3kb.F cosq1i.F costmf.F dcosq1b.F dfft1i.F mcstf1.F mrftf1.F r1fgkb.F rfft2f.F sinqmf.F z1f2kb.F zfft1b.F zmf3kf.F + ) + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + Fortran_FORMAT FREE + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_adios2/CMakeLists.txt b/external/io_adios2/CMakeLists.txt new file mode 100644 index 0000000000..dde531a716 --- /dev/null +++ b/external/io_adios2/CMakeLists.txt @@ -0,0 +1,74 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +# Do this first to simplify steps later +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../ioapi_share + ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + ) + + +# First preprocess +get_directory_property( DIR_DEFS DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) +get_target_property ( FOLDER_COMPILE_TARGET_INCLUDES ${FOLDER_COMPILE_TARGET} INCLUDE_DIRECTORIES ) +wrf_c_preproc_fortran( + TARGET_NAME ${FOLDER_COMPILE_TARGET}_c_preproc_wrf_io + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + EXTENSION ".f90" + INCLUDES ${FOLDER_COMPILE_TARGET_INCLUDES} + DEFINITIONS ${DIR_DEFS} + SOURCES wrf_io.F90 + ) + +# Now M4 preprocess +wrf_m4_preproc_fortran( + TARGET_NAME ${FOLDER_COMPILE_TARGET}_m4_preproc_wrf_io + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + PREFIX "m4_preproc_" + EXTENSION ".f90" + SOURCES ${CMAKE_CURRENT_BINARY_DIR}/preproc/wrf_io.f90 + DEPENDENCIES ${FOLDER_COMPILE_TARGET}_c_preproc_wrf_io + TARGET_SCOPE ${FOLDER_COMPILE_TARGET} + FLAGS ${M4_FLAGS} + ) + +add_dependencies( ${FOLDER_COMPILE_TARGET} ${FOLDER_COMPILE_TARGET}_m4_preproc_wrf_io ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/preproc/m4_preproc_wrf_io.f90 + field_routines.F90 + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_esmf/CMakeLists.txt b/external/io_esmf/CMakeLists.txt new file mode 100644 index 0000000000..522e20bc00 --- /dev/null +++ b/external/io_esmf/CMakeLists.txt @@ -0,0 +1,50 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + module_symbols_util.F90 + module_esmf_extensions.F90 + module_utility.F90 + io_esmf.F90 + ext_esmf_open_for_read.F90 + ext_esmf_open_for_write.F90 + ext_esmf_read_field.F90 + ext_esmf_write_field.F90 + ) + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_grib1/CMakeLists.txt b/external/io_grib1/CMakeLists.txt new file mode 100644 index 0000000000..c21a07be84 --- /dev/null +++ b/external/io_grib1/CMakeLists.txt @@ -0,0 +1,55 @@ +# WRF CMake Build + +add_subdirectory( MEL_grib1 ) +add_subdirectory( grib1_util ) +add_subdirectory( WGRIB ) + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + grib1_routines.c + gribmap.c + io_grib1.F + trim.c + ) + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + Fortran_FORMAT FREE + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../ioapi_share + ${CMAKE_CURRENT_SOURCE_DIR}/../io_grib_share + ${CMAKE_CURRENT_SOURCE_DIR}/grib1_util + ${CMAKE_CURRENT_SOURCE_DIR}/MEL_grib1 + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_grib1/MEL_grib1/CMakeLists.txt b/external/io_grib1/MEL_grib1/CMakeLists.txt new file mode 100644 index 0000000000..b275211c69 --- /dev/null +++ b/external/io_grib1/MEL_grib1/CMakeLists.txt @@ -0,0 +1,71 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + FTP_getfile.c + apply_bitmap.c + display_gribhdr.c + gbyte.c + grib_dec.c + grib_enc.c + grib_seek.c + gribgetbds.c + gribgetbms.c + gribgetgds.c + gribgetpds.c + gribhdr2file.c + gribputbds.c + gribputgds.c + gribputpds.c + hdr_print.c + init_dec_struct.c + init_enc_struct.c + init_gribhdr.c + init_struct.c + ld_dec_lookup.c + ld_enc_input.c + ld_enc_lookup.c + ld_grib_origctrs.c + make_default_grbfn.c + make_grib_log.c + map_lvl.c + map_parm.c + pack_spatial.c + prt_inp_struct.c + upd_child_errmsg.c + prt_badmsg.c + swap.c + grib_uthin.c + set_bytes.c + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../../ioapi_share + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_grib1/WGRIB/CMakeLists.txt b/external/io_grib1/WGRIB/CMakeLists.txt new file mode 100644 index 0000000000..03f53648ff --- /dev/null +++ b/external/io_grib1/WGRIB/CMakeLists.txt @@ -0,0 +1,72 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + # wgrib_main.c # Driver + seekgrib.c + ibm2flt.c + readgrib.c + intpower.c + cnames.c + BDSunpk.c + flt2ieee.c + wrtieee.c + levels.c + PDStimes.c + missing.c + nceptable_reanal.c + nceptable_opn.c + ensemble.c + ombtable.c + ec_ext.c + gribtable.c + gds_grid.c + PDS_date.c + ectable_128.c + ectable_129.c + ectable_130.c + ectable_131.c + ectable_140.c + ectable_150.c + ectable_151.c + ectable_160.c + ectable_170.c + ectable_180.c + nceptab_129.c + dwdtable_002.c + dwdtable_201.c + dwdtable_202.c + dwdtable_203.c + cptectable_254.c + nceptab_130.c + nceptab_131.c + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_grib1/grib1_util/CMakeLists.txt b/external/io_grib1/grib1_util/CMakeLists.txt new file mode 100644 index 0000000000..c480ff8f87 --- /dev/null +++ b/external/io_grib1/grib1_util/CMakeLists.txt @@ -0,0 +1,39 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + alloc_2d.c + read_grib.c + write_grib.c + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../MEL_grib1 + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_grib2/CMakeLists.txt b/external/io_grib2/CMakeLists.txt new file mode 100644 index 0000000000..2a85c86094 --- /dev/null +++ b/external/io_grib2/CMakeLists.txt @@ -0,0 +1,13 @@ +# WRF CMake Build + +# Eventually switch to ncep tag on github but for now make this 1-to-1 with make-style WRF +add_subdirectory( g2lib ) +add_subdirectory( bacio-1.3 ) + +target_sources( + ${PROJECT_NAME}_Core + PRIVATE + grib2tbls_types.F + io_grib2.F + read_grib2map.F + ) diff --git a/external/io_grib2/bacio-1.3/CMakeLists.txt b/external/io_grib2/bacio-1.3/CMakeLists.txt new file mode 100644 index 0000000000..450cb510ed --- /dev/null +++ b/external/io_grib2/bacio-1.3/CMakeLists.txt @@ -0,0 +1,43 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + bacio.v1.3.c + baciof.F + ) + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_grib2/g2lib/CMakeLists.txt b/external/io_grib2/g2lib/CMakeLists.txt new file mode 100644 index 0000000000..70246d4d16 --- /dev/null +++ b/external/io_grib2/g2lib/CMakeLists.txt @@ -0,0 +1,109 @@ +# WRF CMake Build +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + addfield.F + addgrid.F + addlocal.F + cmplxpack.F + compack.F + comunpack.F + dec_jpeg2000.c + dec_png.c + drstemplates.F + enc_jpeg2000.c + enc_png.c + g2grids.F + gb_info.F + gbytesc.F + gdt2gds.F + getdim.F + getfield.F + getg2i.F + getg2ir.F + getgb2.F + getgb2l.F + getgb2p.F + getgb2r.F + getgb2rp.F + getgb2s.F + getidx.F + getlocal.F + getpoly.F + gettemplates.F + gf_free.F + gf_getfld.F + gf_unpack1.F + gf_unpack2.F + gf_unpack3.F + gf_unpack4.F + gf_unpack5.F + gf_unpack6.F + gf_unpack7.F + gribcreate.F + gribend.F + gribinfo.F + gribmod.F + gridtemplates.F + ixgb2.F + jpcpack.F + jpcunpack.F + misspack.F + mkieee.F + mova2i.c + pack_gp.F + params.F + pdstemplates.F + pngpack.F + pngunpack.F + putgb2.F + rdieee.F + realloc.F + reduce.F + simpack.F + simunpack.F + skgb.F + specpack.F + specunpack.F + ) + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + # Fortran_FORMAT FREE + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + $ + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + #!TODO Fix duplicates of wrf_[io|status]_flags.h + # ${CMAKE_CURRENT_SOURCE_DIR}/../ioapi_share + ${CMAKE_CURRENT_SOURCE_DIR}/../io_grib_share + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_grib2/g2lib/utest/CMakeLists.txt b/external/io_grib2/g2lib/utest/CMakeLists.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/external/io_grib_share/CMakeLists.txt b/external/io_grib_share/CMakeLists.txt new file mode 100644 index 0000000000..f62d453e8b --- /dev/null +++ b/external/io_grib_share/CMakeLists.txt @@ -0,0 +1,48 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + io_grib_share.F + get_region_center.c + gridnav.c + open_file.c + ) + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + Fortran_FORMAT FREE + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../ioapi_share + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) \ No newline at end of file diff --git a/external/io_int/CMakeLists.txt b/external/io_int/CMakeLists.txt new file mode 100644 index 0000000000..652e95ff55 --- /dev/null +++ b/external/io_int/CMakeLists.txt @@ -0,0 +1,51 @@ +# WRF CMake Build +# get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +# add_library( +# ${FOLDER_COMPILE_TARGET} +# STATIC +# ) + +# target_sources( +# ${FOLDER_COMPILE_TARGET} +# PRIVATE +target_sources( + ${PROJECT_NAME}_Core + PRIVATE + io_int.F90 + io_int_idx.c + module_io_int_idx.F90 + module_io_int_read.F90 + ) + +# set_target_properties( +# ${FOLDER_COMPILE_TARGET} +# PROPERTIES +# Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} +# Fortran_FORMAT FREE +# ) + + +# target_link_libraries( ${FOLDER_COMPILE_TARGET} +# PRIVATE +# ${netCDF_LIBRARIES} +# $<$:$> +# $<$:$> +# ) + +# target_include_directories( ${FOLDER_COMPILE_TARGET} +# PRIVATE +# ${netCDF_INCLUDE_DIRS} +# ${CMAKE_CURRENT_SOURCE_DIR} +# #!TODO Fix duplicates of wrf_[io|status]_flags.h +# # ${CMAKE_CURRENT_SOURCE_DIR}/../ioapi_share +# ${CMAKE_CURRENT_SOURCE_DIR}/../io_grib_share +# ${CMAKE_CURRENT_SOURCE_DIR}/../../inc +# ) + +# install( +# TARGETS ${FOLDER_COMPILE_TARGET} +# RUNTIME DESTINATION bin/ +# ARCHIVE DESTINATION lib/ +# LIBRARY DESTINATION lib/ +# ) diff --git a/external/io_netcdf/CMakeLists.txt b/external/io_netcdf/CMakeLists.txt new file mode 100644 index 0000000000..17d419e689 --- /dev/null +++ b/external/io_netcdf/CMakeLists.txt @@ -0,0 +1,77 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +# Do this first to simplify steps later +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PUBLIC + $<$:$> + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${netCDF-Fortran_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../ioapi_share + ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + ) + + +# First preprocess +get_directory_property( DIR_DEFS DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) +get_target_property ( FOLDER_COMPILE_TARGET_INCLUDES ${FOLDER_COMPILE_TARGET} INCLUDE_DIRECTORIES ) +wrf_c_preproc_fortran( + TARGET_NAME ${FOLDER_COMPILE_TARGET}_c_preproc_wrf_io + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + EXTENSION ".f90" + INCLUDES ${FOLDER_COMPILE_TARGET_INCLUDES} + DEFINITIONS ${DIR_DEFS} + SOURCES wrf_io.F90 + ) + +# Now M4 preprocess +wrf_m4_preproc_fortran( + TARGET_NAME ${FOLDER_COMPILE_TARGET}_m4_preproc_wrf_io + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + PREFIX "m4_preproc_" + EXTENSION ".f90" + SOURCES ${CMAKE_CURRENT_BINARY_DIR}/preproc/wrf_io.f90 + DEPENDENCIES ${FOLDER_COMPILE_TARGET}_c_preproc_wrf_io + TARGET_SCOPE ${FOLDER_COMPILE_TARGET} + FLAGS ${M4_FLAGS} + ) + +add_dependencies( ${FOLDER_COMPILE_TARGET} ${FOLDER_COMPILE_TARGET}_m4_preproc_wrf_io ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/preproc/m4_preproc_wrf_io.f90 + module_wrfsi_static.F90 + field_routines.F90 + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_netcdfpar/CMakeLists.txt b/external/io_netcdfpar/CMakeLists.txt new file mode 100644 index 0000000000..4e68778b06 --- /dev/null +++ b/external/io_netcdfpar/CMakeLists.txt @@ -0,0 +1,75 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +# Do this first to simplify steps later +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../ioapi_share + ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + ) + + +# First preprocess +get_directory_property( DIR_DEFS DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) +get_target_property ( FOLDER_COMPILE_TARGET_INCLUDES ${FOLDER_COMPILE_TARGET} INCLUDE_DIRECTORIES ) +wrf_c_preproc_fortran( + TARGET_NAME ${FOLDER_COMPILE_TARGET}_c_preproc_wrf_io + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + EXTENSION ".f90" + INCLUDES ${FOLDER_COMPILE_TARGET_INCLUDES} + DEFINITIONS ${DIR_DEFS} + SOURCES wrf_io.F90 + ) + +# Now M4 preprocess +wrf_m4_preproc_fortran( + TARGET_NAME ${FOLDER_COMPILE_TARGET}_m4_preproc_wrf_io + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + PREFIX "m4_preproc_" + EXTENSION ".f90" + SOURCES ${CMAKE_CURRENT_BINARY_DIR}/preproc/wrf_io.f90 + DEPENDENCIES ${FOLDER_COMPILE_TARGET}_c_preproc_wrf_io + TARGET_SCOPE ${FOLDER_COMPILE_TARGET} + FLAGS ${M4_FLAGS} + ) + +add_dependencies( ${FOLDER_COMPILE_TARGET} ${FOLDER_COMPILE_TARGET}_m4_preproc_wrf_io ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/preproc/m4_preproc_wrf_io.f90 + module_wrfsi_static.F90 + field_routines.F90 + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_phdf5/CMakeLists.txt b/external/io_phdf5/CMakeLists.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/external/io_pio/CMakeLists.txt b/external/io_pio/CMakeLists.txt new file mode 100644 index 0000000000..130b8921d3 --- /dev/null +++ b/external/io_pio/CMakeLists.txt @@ -0,0 +1,49 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + wrf_data_pio.F90 + pio_routines.F90 + wrf_io.F90 + field_routines.F90 + read_bdy_routines.F90 + module_wrfsi_static.F90 + ) + + +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) diff --git a/external/io_pnetcdf/CMakeLists.txt b/external/io_pnetcdf/CMakeLists.txt new file mode 100644 index 0000000000..1717f71383 --- /dev/null +++ b/external/io_pnetcdf/CMakeLists.txt @@ -0,0 +1,78 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library( + ${FOLDER_COMPILE_TARGET} + STATIC + ) + +# Do this first to simplify steps later +set_target_properties( + ${FOLDER_COMPILE_TARGET} + PROPERTIES + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + EXPORT_PROPERTIES Fortran_MODULE_DIRECTORY + ) + + +target_link_libraries( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_LIBRARIES} + ${pnetCDF_LIBRARIES} + $<$:$> + $<$:$> + ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${netCDF_INCLUDE_DIRS} + ${pnetCDF_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../ioapi_share + ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} + ) + + +# First preprocess +get_directory_property( DIR_DEFS DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) +get_target_property ( FOLDER_COMPILE_TARGET_INCLUDES ${FOLDER_COMPILE_TARGET} INCLUDE_DIRECTORIES ) +wrf_c_preproc_fortran( + TARGET_NAME ${FOLDER_COMPILE_TARGET}_c_preproc_wrf_io + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + EXTENSION ".f90" + INCLUDES ${FOLDER_COMPILE_TARGET_INCLUDES} + DEFINITIONS ${DIR_DEFS} + SOURCES wrf_io.F90 + ) + +# Now M4 preprocess +wrf_m4_preproc_fortran( + TARGET_NAME ${FOLDER_COMPILE_TARGET}_m4_preproc_wrf_io + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + PREFIX "m4_preproc_" + EXTENSION ".f90" + SOURCES ${CMAKE_CURRENT_BINARY_DIR}/preproc/wrf_io.f90 + DEPENDENCIES ${FOLDER_COMPILE_TARGET}_c_preproc_wrf_io + TARGET_SCOPE ${FOLDER_COMPILE_TARGET} + FLAGS ${M4_FLAGS} + ) + +add_dependencies( ${FOLDER_COMPILE_TARGET} ${FOLDER_COMPILE_TARGET}_m4_preproc_wrf_io ) + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/preproc/m4_preproc_wrf_io.f90 + module_wrfsi_static.F90 + field_routines.F90 + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + EXPORT ${EXPORT_NAME}Targets + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) + diff --git a/external/ioapi_share/CMakeLists.txt b/external/ioapi_share/CMakeLists.txt new file mode 100644 index 0000000000..ddd37ecae2 --- /dev/null +++ b/external/ioapi_share/CMakeLists.txt @@ -0,0 +1,11 @@ +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) +set( + WRF_INCLUDE_FILES + wrf_io_flags.h + wrf_status_codes.h + ) + +install( + FILES ${WRF_INCLUDE_FILES} + DESTINATION include/external/${FOLDER_COMPILE_TARGET} + ) \ No newline at end of file diff --git a/frame/CMakeLists.txt b/frame/CMakeLists.txt new file mode 100644 index 0000000000..59f8d2551b --- /dev/null +++ b/frame/CMakeLists.txt @@ -0,0 +1,169 @@ +# WRF CMake Build + +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) +set( + WRF_INCLUDE_FILES + module_internal_header_util.F + ${CMAKE_BINARY_DIR}/frame/module_state_description.F + ) + + +######################################################################################################################## +# Extra stuff for things that depend on registry code +# https://stackoverflow.com/a/50640971 +# Generate all the combinations dynamically, not a fan of this file breakdown +######################################################################################################################## +set( nl_dyn_source ) +get_directory_property( DIR_DEFS DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) +foreach( n RANGE 0 7 ) + + wrf_c_preproc_fortran( + TARGET_NAME nl_set_${n} + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + EXTENSION ".f90" + PREFIX "nl_set_${n}_" + INCLUDES ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_BINARY_DIR}/inc + DEPENDENCIES registry_code + DEFINITIONS ${DIR_DEFS} NNN=${n} NL_set_ROUTINES + SOURCES nl_access_routines.F + ) + wrf_c_preproc_fortran( + TARGET_NAME nl_get_${n} + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + EXTENSION ".f90" + PREFIX "nl_get_${n}_" + INCLUDES ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_BINARY_DIR}/inc + DEPENDENCIES registry_code + DEFINITIONS ${DIR_DEFS} NNN=${n} NL_get_ROUTINES + SOURCES nl_access_routines.F + ) + + add_dependencies( ${PROJECT_NAME}_Core nl_get_${n} nl_set_${n} ) + + list( + APPEND + nl_dyn_source + ${CMAKE_CURRENT_BINARY_DIR}/preproc/nl_set_${n}_nl_access_routines.f90 + ${CMAKE_CURRENT_BINARY_DIR}/preproc/nl_get_${n}_nl_access_routines.f90 + ) + +endforeach() + +if ( ${USE_M4} ) + wrf_m4_preproc_fortran( + TARGET_NAME md_calls + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + EXTENSION ".inc" + SOURCES md_calls.m4 + TARGET_SCOPE ${PROJECT_NAME}_Core + FLAGS ${M4_FLAGS} + ) + +else() + # Copy from arch quickly + # Normally I would say we just add it as source but it is an include file and I don't want to potentially + # pollute the include chain by adding in arch/ *and* I want to maintain the order of operations + # for target dependencies + wrf_copy_source_files( + TARGET_NAME md_calls + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + SOURCES ${PROJECT_SOURCE_DIR}/arch/md_calls.inc + ) +endif() + +add_dependencies( ${PROJECT_NAME}_Core md_calls ) +target_include_directories( + ${PROJECT_NAME}_Core + PRIVATE + ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + ) +######################################################################################################################## +# +# Now define base framework +# +######################################################################################################################## +set( MODULE_DM module_dm_stubs.F ) +if ( ${USE_RSL_LITE} ) + message( STATUS "Setting module_dm to RSL_LITE" ) + set( MODULE_DM ${PROJECT_SOURCE_DIR}/external/RSL_LITE/module_dm.F ) +endif() + +target_sources( + ${PROJECT_NAME}_Core + PRIVATE + ${WRF_INCLUDE_FILES} + + module_configure.F + module_driver_constants.F + module_domain_type.F + module_domain.F + module_streams.F + module_wrf_error.F + module_machine.F + module_timing.F + # module_dm.F + ${MODULE_DM} + module_cpl.F + module_cpl_oasis3.F + + + module_alloc_space_0.F + module_alloc_space_1.F + module_alloc_space_2.F + module_alloc_space_3.F + module_alloc_space_4.F + module_alloc_space_5.F + module_alloc_space_6.F + module_alloc_space_7.F + module_alloc_space_8.F + module_alloc_space_9.F + + ${CMAKE_BINARY_DIR}/frame/module_state_description.F # GENERATED + ${nl_dyn_source} # GENERATED + + clog.c + collect_on_comm.c + hires_timer.c + libmassv.F + + module_clear_halos.F + module_comm_dm.F + module_comm_dm_0.F + module_comm_dm_1.F + module_comm_dm_2.F + module_comm_dm_3.F + module_comm_dm_4.F + module_comm_nesting_dm.F + + + + module_integrate.F + + module_io.F + module_io_quilt.F + + module_nesting.F + module_quilt_outbuf_ops.F + module_sm.F + module_tiles.F + + pack_utils.c + wrf_debug.F + wrf_num_bytes_between.c + wrf_shutdown.F + ) + +# Disable optimizations on these files always +set_source_files_properties( + ${nl_dyn_source} + PROPERTIES + COMPILE_FLAGS + $<$:${WRF_FCNOOPT}> + ) + +install( + FILES ${WRF_INCLUDE_FILES} + DESTINATION include/${FOLDER_COMPILE_TARGET} + ) \ No newline at end of file diff --git a/inc/CMakeLists.txt b/inc/CMakeLists.txt new file mode 100644 index 0000000000..afae9a9632 --- /dev/null +++ b/inc/CMakeLists.txt @@ -0,0 +1,13 @@ +get_filename_component( FOLDER_COMPILE_TARGET ${CMAKE_CURRENT_SOURCE_DIR} NAME) +set( + WRF_INCLUDE_FILES + intio_tags.h + streams.h + version_decl + ${PROJECT_BINARY_DIR}/inc/commit_decl + ) + +install( + FILES ${WRF_INCLUDE_FILES} + DESTINATION include/inc/${FOLDER_COMPILE_TARGET} + ) \ No newline at end of file diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt new file mode 100644 index 0000000000..9a2f69eca6 --- /dev/null +++ b/main/CMakeLists.txt @@ -0,0 +1,153 @@ +# WRF CMake Build +set( FOLDER_COMPILE_TARGETS ) + +# First make true executables +if ( ${WRF_CORE} STREQUAL "PLUS" ) + add_executable( + wrfplus + wrf.F + module_wrf_top.F + ) + list( APPEND FOLDER_COMPILE_TARGETS wrfplus ) +else() + # I believe this is always made if not WRF PLUS or ESMF + add_executable( + wrf + wrf.F + module_wrf_top.F + ) + list( APPEND FOLDER_COMPILE_TARGETS wrf ) +# #!TODO When does this get activated? +# elseif() +# add_executable( +# wrf_SST_ESMF +# wrf_ESMFMod.F +# wrf_SST_ESMF.F +# module_wrf_top.F +# ) +# list( APPEND FOLDER_COMPILE_TARGETS em_wrf_SST_ESMF ) +endif() + +# Use case info from higher CMakeLists.txt +set( MODULE_FILE ${PROJECT_SOURCE_DIR}/dyn_em/module_initialize_${WRF_CASE_MODULE}.F ) + +if ( ${WRF_CASE} STREQUAL "EM_REAL" ) + add_executable( + ndown + ndown_em.F + ${MODULE_FILE} + ) + add_executable( + tc + tc_em.F + ${MODULE_FILE} + ) + add_executable( + real + real_em.F + ${MODULE_FILE} + ) + list( APPEND FOLDER_COMPILE_TARGETS ndown tc real ) + +elseif( NOT ${WRF_GENERAL_IDEAL_CASE} ) # Not general ideal and not real + # All others are variants of ideal + add_executable( + ideal + ideal_em.F + ${MODULE_FILE} + ) + list( APPEND FOLDER_COMPILE_TARGETS ideal ) +else() + # greater than or equal to general ideal case + add_executable( + ideal + ideal_em.F + ${PROJECT_SOURCE_DIR}/dyn_em/module_initialize_ideal.F + ) + list( APPEND FOLDER_COMPILE_TARGETS ideal ) +endif() + + +foreach ( TARGET ${FOLDER_COMPILE_TARGETS} ) + set_target_properties( + ${TARGET} + PROPERTIES + # Just dump everything in here + Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/modules/${TARGET}/ + Fortran_FORMAT FREE + ) + + + if ( ${USE_IPO} ) + set_target_properties( + ${TARGET} + PROPERTIES + INTERPROCEDURAL_OPTIMIZATION TRUE + ) + + if ( ${CMAKE_VERSION} VERSION_LESS 3.24 ) + target_link_libraries( + ${TARGET} + PRIVATE + ${PROJECT_NAME}_Core + ) + + # Static libraries with LTO/IPO sometimes don't pull all the correct symbols + set( LINKER_OPTION ${CMAKE_Fortran_LINKER_WRAPPER_FLAG} ) + target_link_options( + ${TARGET} + PRIVATE + ${LINKER_OPTION}--whole-archive $ ${LINKER_OPTION}--no-whole-archive + ) + else() + target_link_libraries( + ${TARGET} + PRIVATE + $ + ) + endif() + else() + target_link_libraries( + ${TARGET} + PRIVATE + ${PROJECT_NAME}_Core + ) + endif() + + target_include_directories( + ${TARGET} + PRIVATE + ${PROJECT_SOURCE_DIR}/inc + ${PROJECT_BINARY_DIR}/inc + $ + ) +endforeach() + + +install( + TARGETS ${FOLDER_COMPILE_TARGETS} + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) + +# Install the "run" directory +install( + DIRECTORY ${PROJECT_SOURCE_DIR}/run/ + DESTINATION ${CMAKE_INSTALL_PREFIX}/run + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ${FOLDER_COMPILE_TARGETS} + DEST_PATH ${CMAKE_INSTALL_PREFIX}/run + USE_SYMLINKS + ) + +# Re-setup this particular file +wrf_setup_files( + FILES + ${PROJECT_SOURCE_DIR}/phys/noahmp/parameters/MPTABLE.TBL + DEST_PATH + ${CMAKE_INSTALL_PREFIX}/run/ + ) diff --git a/phys/CMakeLists.txt b/phys/CMakeLists.txt new file mode 100644 index 0000000000..d7d85e1c12 --- /dev/null +++ b/phys/CMakeLists.txt @@ -0,0 +1,274 @@ +# WRF CMake Build + +######################################################################################################################## +# +# Quickly preprocess some files so that cmake can understand the module dependencies +# +######################################################################################################################## +get_directory_property( DIR_DEFS DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) +wrf_c_preproc_fortran( + TARGET_NAME module_ra_rrtmg_preproc + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/preproc/ + EXTENSION ".f90" + INCLUDES ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDENCIES registry_code + DEFINITIONS ${DIR_DEFS} + SOURCES module_ra_rrtmg_lwk.F + module_ra_rrtmg_lwf.F + module_ra_rrtmg_swk.F + module_ra_rrtmg_swf.F + module_sf_clm.F + ) + +add_dependencies( ${PROJECT_NAME}_Core module_ra_rrtmg_preproc ) + +target_sources( + ${PROJECT_NAME}_Core + PRIVATE + ccpp_kind_types.F + complex_number_module.F + module_bep_bem_helper.F + module_bl_acm.F + module_bl_boulac.F + module_bl_camuwpbl_driver.F + module_bl_eepsilon.F + module_bl_fogdes.F + module_bl_gbmpbl.F + module_bl_gfs.F + module_bl_gfsedmf.F + module_bl_gwdo.F + module_bl_gwdo_gsl.F + module_bl_keps.F + module_bl_mfshconvpbl.F + module_bl_mrf.F + module_bl_myjpbl.F + module_bl_myjurb.F + module_bl_mynn.F + module_bl_mynn_common.F + module_bl_mynn_wrapper.F + module_bl_qnsepbl.F + module_bl_shinhong.F + module_bl_temf.F + module_bl_ysu.F + module_cam_bl_diffusion_solver.F + module_cam_bl_eddy_diff.F + module_cam_cldwat.F + module_cam_constituents.F + module_cam_error_function.F + module_cam_esinti.F + module_cam_gffgch.F + module_cam_infnan.F + module_cam_molec_diff.F + module_cam_mp_cldwat2m_micro.F + module_cam_mp_conv_water.F + module_cam_mp_microp_aero.F + module_cam_mp_modal_aero_initialize_data_phys.F + module_cam_mp_ndrop.F + module_cam_mp_qneg3.F + module_cam_mp_radconstants.F + module_cam_physconst.F + module_cam_shr_const_mod.F + module_cam_shr_kind_mod.F + module_cam_support.F + module_cam_trb_mtn_stress.F + module_cam_upper_bc.F + module_cam_wv_saturation.F + module_checkerror.F + module_cu_bmj.F + module_cu_camzm.F + module_cu_camzm_driver.F + module_cu_g3.F + module_cu_gd.F + module_cu_gf_ctrans.F + module_cu_gf_deep.F + module_cu_gf_sh.F + module_cu_gf_wrfdrv.F + module_cu_kf.F + module_cu_kfcup.F + module_cu_kfeta.F + module_cu_ksas.F + module_cu_mskf.F + module_cu_nsas.F + module_cu_ntiedtke.F + module_cu_osas.F + module_cu_sas.F + module_cu_scalesas.F + module_cu_tiedtke.F + module_cumulus_driver.F + module_data_cam_mam_aero.F + module_data_cam_mam_asect.F + module_data_gocart_dust.F + module_diag_afwa.F + module_diag_cl.F + module_diag_functions.F + module_diag_hailcast.F + module_diag_misc.F + module_diag_nwp.F + module_diag_pld.F + module_diag_rasm.F + module_diag_solar.F + module_diag_trad_fields.F + module_diag_zld.F + module_diagnostics_driver.F + module_dust_emis.F + module_fdda_psufddagd.F + module_fdda_spnudging.F + module_fddagd_driver.F + module_fddaobs_driver.F + module_fddaobs_rtfdda.F + module_fire_emis.F + module_firebrand_spotting.F + module_firebrand_spotting_mpi.F + module_fr_fire_atm.F + module_fr_fire_core.F + module_fr_fire_driver.F + module_fr_fire_driver_wrf.F + module_fr_fire_model.F + module_fr_fire_phys.F + module_fr_fire_util.F + module_gfs_funcphys.F + module_gfs_machine.F + module_gfs_physcons.F + module_gocart_coupling.F + module_irrigation.F + module_lightning_driver.F + module_ltng_cpmpr92z.F + module_ltng_crmpr92.F + module_ltng_iccg.F + module_ltng_lpi.F + module_madwrf.F + module_microphysics_driver.F + module_microphysics_zero_out.F + module_mixactivate.F + module_mp_cammgmp_driver.F + module_mp_etanew.F + module_mp_fast_sbm.F + module_mp_fer_hires.F + module_mp_full_sbm.F + module_mp_gsfcgce.F + module_mp_gsfcgce_4ice_nuwrf.F + module_mp_jensen_ishmael.F + module_mp_kessler.F + module_mp_lin.F + module_mp_milbrandt2mom.F + module_mp_morr_two_moment.F + module_mp_morr_two_moment_aero.F + module_mp_nssl_2mom.F + module_mp_ntu.F + module_mp_p3.F + module_mp_radar.F + module_mp_SBM_polar_radar.F + module_mp_sbu_ylin.F + module_mp_thompson.F + module_mp_wdm5.F + module_mp_wdm6.F + module_mp_wdm7.F + module_mp_wsm3.F + module_mp_wsm5.F + module_mp_wsm6.F + module_mp_wsm6r.F + module_mp_wsm7.F + module_pbl_driver.F + module_physics_addtendc.F + module_physics_init.F + module_progtm.F + module_ra_aerosol.F + module_ra_cam.F + module_ra_cam_support.F + module_ra_clWRF_support.F + module_ra_eclipse.F + module_ra_effective_radius.F + module_ra_farms.F + module_ra_flg.F + module_ra_gfdleta.F + module_ra_goddard.F + module_ra_gsfcsw.F + module_ra_hs.F + module_ra_rrtm.F + module_ra_rrtmg_aero_optical_util_cmaq.F + module_ra_rrtmg_lw.F + # module_ra_rrtmg_lwf.F + ${CMAKE_CURRENT_BINARY_DIR}/preproc/module_ra_rrtmg_lwf.f90 + # module_ra_rrtmg_lwk.F + ${CMAKE_CURRENT_BINARY_DIR}/preproc/module_ra_rrtmg_lwk.f90 + module_ra_rrtmg_sw.F + # module_ra_rrtmg_swf.F + ${CMAKE_CURRENT_BINARY_DIR}/preproc/module_ra_rrtmg_swf.f90 + # module_ra_rrtmg_swk.F + ${CMAKE_CURRENT_BINARY_DIR}/preproc/module_ra_rrtmg_swk.f90 + + module_ra_sw.F + module_radiation_driver.F + module_sf_3dpwp.F + module_sf_bem.F + module_sf_bep.F + module_sf_bep_bem.F + # module_sf_clm.F + ${CMAKE_CURRENT_BINARY_DIR}/preproc/module_sf_clm.f90 + module_sf_ctsm.F + module_sf_exchcoef.F + module_sf_fogdes.F + module_sf_gecros.F + module_sf_gfdl.F + module_sf_gfs.F + module_sf_idealscmsfclay.F + module_sf_lake.F + module_sf_myjsfc.F + module_sf_mynn.F + module_sf_noah_seaice.F + module_sf_noah_seaice_drv.F + module_sf_noahdrv.F + module_sf_noahlsm.F + module_sf_noahlsm_glacial_only.F + # NoahMP Code + noahmp/drivers/wrf/module_sf_noahmpdrv.F + noahmp/src/module_sf_noahmp_glacier.F + noahmp/src/module_sf_noahmp_groundwater.F + noahmp/src/module_sf_noahmplsm.F + + module_sf_ocean_driver.F + module_sf_oml.F + module_sf_pxlsm.F + module_sf_pxlsm_data.F + module_sf_pxsfclay.F + module_sf_qnsesfc.F + module_sf_ruclsm.F + module_sf_scmflux.F + module_sf_scmskintemp.F + module_sf_sfcdiags.F + module_sf_sfcdiags_ruclsm.F + module_sf_sfclay.F + module_sf_sfclayrev.F + module_sf_slab.F + module_sf_ssib.F + module_sf_sstskin.F + module_sf_temfsfclay.F + module_sf_tmnupdate.F + module_sf_urban.F + module_shallowcu_driver.F + module_shcu_camuwshcu.F + module_shcu_camuwshcu_driver.F + module_shcu_deng.F + module_shcu_grims.F + module_shcu_nscv.F + module_surface_driver.F + module_wind_fitch.F + module_wind_mav.F + + # Shared physics + physics_mmm/bl_gwdo.F90 + physics_mmm/bl_ysu.F90 + physics_mmm/cu_ntiedtke.F90 + physics_mmm/module_libmassv.F90 + physics_mmm/mp_radar.F90 + physics_mmm/mp_wsm6.F90 + physics_mmm/mp_wsm6_effectRad.F90 + physics_mmm/sf_sfclayrev.F90 + ) + + +target_include_directories( + ${PROJECT_NAME}_Core + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ) \ No newline at end of file diff --git a/share/CMakeLists.txt b/share/CMakeLists.txt new file mode 100644 index 0000000000..229efae1e5 --- /dev/null +++ b/share/CMakeLists.txt @@ -0,0 +1,77 @@ +# WRF CMake Build + +target_include_directories( + ${PROJECT_NAME}_Core + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ) + +######################################################################################################################## +# +# Now define base share +# +######################################################################################################################## +target_sources( + ${PROJECT_NAME}_Core + PRIVATE + + module_model_constants.F + module_llxy.F + module_soil_pre.F + module_date_time.F + module_bc.F + + module_bc_time_utilities.F + module_get_file_names.F + module_compute_geop.F + module_chem_share.F + module_check_a_mundo.F + module_HLaw.F + module_ctrans_aqchem.F + module_random.F + module_interp_nmm.F + module_interp_store.F + module_string_tools.F + module_MPP.F + + module_io_wrf.F + + + module_io_domain.F + + module_optional_input.F + + input_wrf.F + output_wrf.F + wrf_bdyout.F + wrf_bdyin.F + dfi.F + mediation_integrate.F + mediation_wrfmain.F + + solve_interface.F + mediation_interp_domain.F + mediation_force_domain.F + mediation_feedback_domain.F + + start_domain.F + init_modules.F + set_timekeeping.F + interp_fcn.F + sint.F + wrf_ext_write_field.F + wrf_ext_read_field.F + + + wrf_tsin.F + landread.c + track_driver.F + track_input.F + module_trajectory.F + bobrand.c + wrf_timeseries.F + track_driver.F + wrf_fddaobs_in.F + mediation_nest_move.F + setfeenv.c + ) diff --git a/test/em_b_wave/CMakeLists.txt b/test/em_b_wave/CMakeLists.txt new file mode 100644 index 0000000000..1fdecccc5e --- /dev/null +++ b/test/em_b_wave/CMakeLists.txt @@ -0,0 +1,20 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES ${PROJECT_SOURCE_DIR}/run/README.namelist + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_convrad/CMakeLists.txt b/test/em_convrad/CMakeLists.txt new file mode 100644 index 0000000000..b362766fab --- /dev/null +++ b/test/em_convrad/CMakeLists.txt @@ -0,0 +1,27 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES + ${PROJECT_SOURCE_DIR}/run/README.namelist + ${PROJECT_SOURCE_DIR}/run/LANDUSE.TBL + ${PROJECT_SOURCE_DIR}/run/RRTMG_LW_DATA + ${PROJECT_SOURCE_DIR}/run/RRTMG_SW_DATA + ${PROJECT_SOURCE_DIR}/run/ozone.formatted + ${PROJECT_SOURCE_DIR}/run/ozone_lat.formatted + ${PROJECT_SOURCE_DIR}/run/ozone_plev.formatted + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_fire/CMakeLists.txt b/test/em_fire/CMakeLists.txt new file mode 100644 index 0000000000..1fdecccc5e --- /dev/null +++ b/test/em_fire/CMakeLists.txt @@ -0,0 +1,20 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES ${PROJECT_SOURCE_DIR}/run/README.namelist + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_grav2d_x/CMakeLists.txt b/test/em_grav2d_x/CMakeLists.txt new file mode 100644 index 0000000000..1fdecccc5e --- /dev/null +++ b/test/em_grav2d_x/CMakeLists.txt @@ -0,0 +1,20 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES ${PROJECT_SOURCE_DIR}/run/README.namelist + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_heldsuarez/CMakeLists.txt b/test/em_heldsuarez/CMakeLists.txt new file mode 100644 index 0000000000..1fdecccc5e --- /dev/null +++ b/test/em_heldsuarez/CMakeLists.txt @@ -0,0 +1,20 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES ${PROJECT_SOURCE_DIR}/run/README.namelist + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_hill2d_x/CMakeLists.txt b/test/em_hill2d_x/CMakeLists.txt new file mode 100644 index 0000000000..1fdecccc5e --- /dev/null +++ b/test/em_hill2d_x/CMakeLists.txt @@ -0,0 +1,20 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES ${PROJECT_SOURCE_DIR}/run/README.namelist + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_les/CMakeLists.txt b/test/em_les/CMakeLists.txt new file mode 100644 index 0000000000..1fdecccc5e --- /dev/null +++ b/test/em_les/CMakeLists.txt @@ -0,0 +1,20 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES ${PROJECT_SOURCE_DIR}/run/README.namelist + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_quarter_ss/CMakeLists.txt b/test/em_quarter_ss/CMakeLists.txt new file mode 100644 index 0000000000..54ffc652fc --- /dev/null +++ b/test/em_quarter_ss/CMakeLists.txt @@ -0,0 +1,31 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES + ${PROJECT_SOURCE_DIR}/run/README.namelist + ${PROJECT_SOURCE_DIR}/run/bulkdens.asc_s_0_03_0_9 + ${PROJECT_SOURCE_DIR}/run/bulkradii.asc_s_0_03_0_9 + ${PROJECT_SOURCE_DIR}/run/capacity.asc + ${PROJECT_SOURCE_DIR}/run/coeff_p.asc + ${PROJECT_SOURCE_DIR}/run/coeff_q.asc + ${PROJECT_SOURCE_DIR}/run/constants.asc + ${PROJECT_SOURCE_DIR}/run/kernels.asc_s_0_03_0_9 + ${PROJECT_SOURCE_DIR}/run/kernels_z.asc + ${PROJECT_SOURCE_DIR}/run/masses.asc + ${PROJECT_SOURCE_DIR}/run/termvels.asc + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_real/CMakeLists.txt b/test/em_real/CMakeLists.txt new file mode 100644 index 0000000000..d68270361a --- /dev/null +++ b/test/em_real/CMakeLists.txt @@ -0,0 +1,126 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS real tc ndown wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES + ${PROJECT_SOURCE_DIR}/run/README.namelist + ${PROJECT_SOURCE_DIR}/run/README.physics_files + ${PROJECT_SOURCE_DIR}/run/README.physics_files + + ${PROJECT_SOURCE_DIR}/run/ETAMPNEW_DATA + ${PROJECT_SOURCE_DIR}/run/ETAMPNEW_DATA.expanded_rain + ${PROJECT_SOURCE_DIR}/run/RRTM_DATA + ${PROJECT_SOURCE_DIR}/run/RRTMG_LW_DATA + ${PROJECT_SOURCE_DIR}/run/RRTMG_SW_DATA + ${PROJECT_SOURCE_DIR}/run/CAM_ABS_DATA + ${PROJECT_SOURCE_DIR}/run/CAM_AEROPT_DATA + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.RCP4.5 + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.RCP6 + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.RCP8.5 + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.A1B + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.A2 + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.SSP119 + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.SSP126 + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.SSP245 + #!TODO Why does this have an alt name? + # ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.SSP245 # Has alt name, why? + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.SSP370 + ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.SSP585 + ${PROJECT_SOURCE_DIR}/run/CLM_ALB_ICE_DFS_DATA + ${PROJECT_SOURCE_DIR}/run/CLM_ALB_ICE_DRC_DATA + ${PROJECT_SOURCE_DIR}/run/CLM_ASM_ICE_DFS_DATA + ${PROJECT_SOURCE_DIR}/run/CLM_ASM_ICE_DRC_DATA + ${PROJECT_SOURCE_DIR}/run/CLM_DRDSDT0_DATA + ${PROJECT_SOURCE_DIR}/run/CLM_EXT_ICE_DFS_DATA + ${PROJECT_SOURCE_DIR}/run/CLM_EXT_ICE_DRC_DATA + ${PROJECT_SOURCE_DIR}/run/CLM_KAPPA_DATA + ${PROJECT_SOURCE_DIR}/run/CLM_TAU_DATA + ${PROJECT_SOURCE_DIR}/run/ozone.formatted + ${PROJECT_SOURCE_DIR}/run/ozone_lat.formatted + ${PROJECT_SOURCE_DIR}/run/ozone_plev.formatted + ${PROJECT_SOURCE_DIR}/run/aerosol.formatted + ${PROJECT_SOURCE_DIR}/run/aerosol_lat.formatted + ${PROJECT_SOURCE_DIR}/run/aerosol_lon.formatted + ${PROJECT_SOURCE_DIR}/run/aerosol_plev.formatted + ${PROJECT_SOURCE_DIR}/run/eclipse_besselian_elements.dat + ${PROJECT_SOURCE_DIR}/run/capacity.asc + ${PROJECT_SOURCE_DIR}/run/coeff_p.asc + ${PROJECT_SOURCE_DIR}/run/coeff_q.asc + ${PROJECT_SOURCE_DIR}/run/constants.asc + ${PROJECT_SOURCE_DIR}/run/masses.asc + ${PROJECT_SOURCE_DIR}/run/termvels.asc + ${PROJECT_SOURCE_DIR}/run/kernels.asc_s_0_03_0_9 + ${PROJECT_SOURCE_DIR}/run/kernels_z.asc + ${PROJECT_SOURCE_DIR}/run/bulkdens.asc_s_0_03_0_9 + ${PROJECT_SOURCE_DIR}/run/bulkradii.asc_s_0_03_0_9 + ${PROJECT_SOURCE_DIR}/run/CCN_ACTIVATE.BIN + ${PROJECT_SOURCE_DIR}/run/p3_lookupTable_1.dat-v5.4_2momI + ${PROJECT_SOURCE_DIR}/run/p3_lookupTable_1.dat-v5.4_3momI + ${PROJECT_SOURCE_DIR}/run/p3_lookupTable_2.dat-v5.3 + ${PROJECT_SOURCE_DIR}/run/HLC.TBL + ${PROJECT_SOURCE_DIR}/run/wind-turbine-1.tbl + ${PROJECT_SOURCE_DIR}/run/ishmael-gamma-tab.bin + ${PROJECT_SOURCE_DIR}/run/ishmael-qi-qc.bin + ${PROJECT_SOURCE_DIR}/run/ishmael-qi-qr.bin + ${PROJECT_SOURCE_DIR}/run/BROADBAND_CLOUD_GODDARD.bin + ${PROJECT_SOURCE_DIR}/run/STOCHPERT.TBL + + ${PROJECT_SOURCE_DIR}/run/GENPARM.TBL + ${PROJECT_SOURCE_DIR}/run/LANDUSE.TBL + ${PROJECT_SOURCE_DIR}/run/SOILPARM.TBL + ${PROJECT_SOURCE_DIR}/run/URBPARM.TBL + ${PROJECT_SOURCE_DIR}/run/URBPARM_LCZ.TBL + ${PROJECT_SOURCE_DIR}/run/VEGPARM.TBL + ${PROJECT_SOURCE_DIR}/phys/noahmp/parameters/MPTABLE.TBL + ${PROJECT_SOURCE_DIR}/run/tr49t67 + ${PROJECT_SOURCE_DIR}/run/tr49t85 + ${PROJECT_SOURCE_DIR}/run/tr67t85 + ${PROJECT_SOURCE_DIR}/run/gribmap.txt + ${PROJECT_SOURCE_DIR}/run/grib2map.tbl + DEST_PATH + ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) + +wrf_setup_file_new_name( + FILE ${PROJECT_SOURCE_DIR}/run/CAMtr_volume_mixing_ratio.SSP245 + NEW_NAME ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST}/CAMtr_volume_mixing_ratio + USE_SYMLINKS + ) + + +if ( ${USE_DOUBLE} ) + + wrf_setup_file_new_name( + FILE ${PROJECT_SOURCE_DIR}/run/ETAMPNEW_DATA_DBL + NEW_NAME ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST}/ETAMPNEW_DATA + ) + wrf_setup_file_new_name( + FILE ${PROJECT_SOURCE_DIR}/run/ETAMPNEW_DATA.expanded_rain_DBL + NEW_NAME ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST}/ETAMPNEW_DATA.expanded_rain + ) + wrf_setup_file_new_name( + FILE ${PROJECT_SOURCE_DIR}/run/RRTM_DATA_DBL + NEW_NAME ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST}/RRTM_DATA + ) + wrf_setup_file_new_name( + FILE ${PROJECT_SOURCE_DIR}/run/RRTMG_LW_DATA_DBL + NEW_NAME ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST}/RRTMG_LW_DATA + ) + wrf_setup_file_new_name( + FILE ${PROJECT_SOURCE_DIR}/run/RRTMG_SW_DATA_DBL + NEW_NAME ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST}/RRTMG_SW_DATA + ) +endif() diff --git a/test/em_scm_xy/CMakeLists.txt b/test/em_scm_xy/CMakeLists.txt new file mode 100644 index 0000000000..fad4a9b122 --- /dev/null +++ b/test/em_scm_xy/CMakeLists.txt @@ -0,0 +1,26 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES + ${PROJECT_SOURCE_DIR}/run/README.namelist + ${PROJECT_SOURCE_DIR}/run/GENPARM.TBL + ${PROJECT_SOURCE_DIR}/run/LANDUSE.TBL + ${PROJECT_SOURCE_DIR}/run/SOILPARM.TBL + ${PROJECT_SOURCE_DIR}/run/VEGPARM.TBL + ${PROJECT_SOURCE_DIR}/run/RRTM_DATA + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_seabreeze2d_x/CMakeLists.txt b/test/em_seabreeze2d_x/CMakeLists.txt new file mode 100644 index 0000000000..00e2c6c7a7 --- /dev/null +++ b/test/em_seabreeze2d_x/CMakeLists.txt @@ -0,0 +1,23 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES + ${PROJECT_SOURCE_DIR}/run/README.namelist + ${PROJECT_SOURCE_DIR}/run/LANDUSE.TBL + ${PROJECT_SOURCE_DIR}/run/RRTM_DATA + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_squall2d_x/CMakeLists.txt b/test/em_squall2d_x/CMakeLists.txt new file mode 100644 index 0000000000..1fdecccc5e --- /dev/null +++ b/test/em_squall2d_x/CMakeLists.txt @@ -0,0 +1,20 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES ${PROJECT_SOURCE_DIR}/run/README.namelist + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_squall2d_y/CMakeLists.txt b/test/em_squall2d_y/CMakeLists.txt new file mode 100644 index 0000000000..1fdecccc5e --- /dev/null +++ b/test/em_squall2d_y/CMakeLists.txt @@ -0,0 +1,20 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES ${PROJECT_SOURCE_DIR}/run/README.namelist + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/test/em_tropical_cyclone/CMakeLists.txt b/test/em_tropical_cyclone/CMakeLists.txt new file mode 100644 index 0000000000..f7422e0971 --- /dev/null +++ b/test/em_tropical_cyclone/CMakeLists.txt @@ -0,0 +1,22 @@ +# These are just rules for this case, could be named CMakeLists.txt or something +# like install_rules.cmake, whatever you want really +get_filename_component( FOLDER_DEST ${CMAKE_CURRENT_SOURCE_DIR} NAME ) + +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DESTINATION ${CMAKE_INSTALL_PREFIX}/test/ + PATTERN CMakeLists.txt EXCLUDE + PATTERN .gitignore EXCLUDE + ) +wrf_setup_targets( + TARGETS ideal wrf + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + USE_SYMLINKS + ) + +wrf_setup_files( + FILES + ${PROJECT_SOURCE_DIR}/run/README.namelist + ${PROJECT_SOURCE_DIR}/run/LANDUSE.TBL + DEST_PATH ${CMAKE_INSTALL_PREFIX}/test/${FOLDER_DEST} + ) \ No newline at end of file diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 0000000000..1181ab0af4 --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,142 @@ +# WRF CMake Build + +#!TODO ORGANIZE THIS FOLDER +set( FOLDER_COMPILE_TARGET registry ) + +add_executable( + ${FOLDER_COMPILE_TARGET} + ) + +set( GEN_COMMS gen_comms.stub ) +if ( ${USE_RSL_LITE} ) + message( STATUS "Setting gen_comms to RSL_LITE" ) + set( GEN_COMMS ${PROJECT_SOURCE_DIR}/external/RSL_LITE/gen_comms.c ) +else() + # Account for the weird makefile nonsense of copying things around + set_source_files_properties( + gen_comms.stub + TARGET_DIRECTORY ${FOLDER_COMPILE_TARGET} + PROPERTIES + LANGUAGE C + ) +endif() + +target_sources( + ${FOLDER_COMPILE_TARGET} + PRIVATE + registry.c + my_strtok.c + reg_parse.c + data.c + type.c + misc.c + gen_defs.c + gen_allocs.c + gen_mod_state_descr.c + gen_scalar_indices.c + gen_args.c + gen_config.c + sym.c + symtab_gen.c + gen_irr_diag.c + gen_model_data_ord.c + gen_interp.c + # gen_comms.c + ${GEN_COMMS} + gen_scalar_derefs.c + set_dim_strs.c + gen_wrf_io.c + gen_streams.c + ) + +# set_target_properties( +# ${FOLDER_COMPILE_TARGET} +# PROPERTIES +# Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET} +# Fortran_FORMAT FREE +# ) + +target_include_directories( ${FOLDER_COMPILE_TARGET} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ) + +install( + TARGETS ${FOLDER_COMPILE_TARGET} + RUNTIME DESTINATION bin/ + ARCHIVE DESTINATION lib/ + LIBRARY DESTINATION lib/ + ) + +# Extra stuff for weird registry stuff +set( REGISTRY_FILE "NO_REGISTRY_FILE_SET" ) +if ( ${WRF_CORE} STREQUAL "ARW" ) + + if ( ${ENABLE_CHEM} ) + set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.EM_CHEM ) + + # This check does nothing + # elseif ( ${WRF_DFI_RADAR} ) + # set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.EM ) + + else() + set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.EM ) + + endif() + +elseif ( ${WRF_CORE} STREQUAL "PLUS" ) + set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.tladj ) + +elseif ( ${WRF_CORE} STREQUAL "CONVERT" ) + set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.CONVERT ) + +elseif ( ${WRF_CORE} STREQUAL "DA" OR ${WRF_CORE} STREQUAL "DA_4D_VAR" ) + if ( ${WRF_CHEM} ) + set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.wrfchemvar ) + else() + set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.wrfvar ) + endif() + +endif() + +get_directory_property( DIR_DEFS DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS ) +wrf_expand_definitions( + RESULT_VAR REGISTRY_DEFS + DEFINITIONS ${DIR_DEFS} + ) + +# How this is not a bigger thing or not resolved is beyond me +# https://gitlab.kitware.com/cmake/cmake/-/issues/18005 +# Also the suggestion does not work +add_custom_command( + OUTPUT + ${CMAKE_BINARY_DIR}/inc/nl_config.inc + ${CMAKE_BINARY_DIR}/frame/module_state_description.F + WORKING_DIRECTORY + ${CMAKE_BINARY_DIR} + # Replicate what exists in project directory for registry + COMMAND + ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/Registry + COMMAND + ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/inc + COMMAND + ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/frame + COMMAND + ${CMAKE_BINARY_DIR}/tools/registry ${REGISTRY_DEFS} -DNEW_BDYS ${REGISTRY_FILE} > ${CMAKE_BINARY_DIR}/registry.log 2>&1 + #!TODO Just have the registry code actually check for failure or better yet rewrite the + # registry code to not be so obfuscating + COMMAND + ${CMAKE_COMMAND} -E compare_files ${CMAKE_BINARY_DIR}/inc/nl_config.inc ${CMAKE_BINARY_DIR}/inc/nl_config.inc + DEPENDS + ${FOLDER_COMPILE_TARGET} + ) + + + +add_custom_target( + registry_code + DEPENDS + ${CMAKE_BINARY_DIR}/inc/nl_config.inc + ${CMAKE_BINARY_DIR}/frame/module_state_description.F + ) + diff --git a/tools/CodeBase/CMakeLists.txt b/tools/CodeBase/CMakeLists.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tools/fseek_test.c b/tools/fseek_test.c index edd25c6035..c1bee099b5 100644 --- a/tools/fseek_test.c +++ b/tools/fseek_test.c @@ -1,4 +1,7 @@ #define _FILE_OFFSET_BITS 64 +#ifndef FILE_TO_TEST +#define FILE_TO_TEST "Makefile" +#endif #include #include #include @@ -18,7 +21,7 @@ main() int result2 ; #endif fp = NULL ; - fp = fopen( "Makefile" , "r" ) ; + fp = fopen( FILE_TO_TEST , "r" ) ; #ifdef TEST_FSEEKO x = 0xffffffff ; result1 = (sizeof(x) == 8) ;