diff --git a/.github/workflows/datm_noahmp.yaml b/.github/workflows/datm_noahmp.yaml index cfcf1204..2f6618cd 100644 --- a/.github/workflows/datm_noahmp.yaml +++ b/.github/workflows/datm_noahmp.yaml @@ -113,6 +113,7 @@ jobs: component_build: | export PATH=${{ env.DEP_INSTALL_DIR }}/view/bin:$PATH export ESMFMKFILE=${{ env.DEP_INSTALL_DIR }}/view/lib/esmf.mk + export ESMF_ROOT=${{ env.DEP_INSTALL_DIR }}/view export NetCDF_ROOT=${{ env.DEP_INSTALL_DIR }}/view export FC=gfortran cd ${{ env.APP_INSTALL_DIR }}/noahmp diff --git a/CMakeLists.txt b/CMakeLists.txt index 04c11173..6bec8fdf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,10 +36,11 @@ list(APPEND _noahmp_files src/module_sf_noahmplsm.F90 # Find dependencies find_package(MPI REQUIRED) find_package(NetCDF REQUIRED) -if (TARGET esmf) - message("Target esmf is already found. Skip find_package ...") +if (TARGET ESMF::ESMF) + message("Target ESMF::ESMF is already found. Skip find_package ...") else() set(USE_ESMF_STATIC_LIBS TRUE) + list(APPEND CMAKE_MODULE_PATH $ENV{ESMF_ROOT}/cmake) find_package(ESMF REQUIRED) if (ESMF_FOUND) set(CMAKE_Fortran_COMPILER "${ESMF_F90COMPILER}") @@ -74,7 +75,7 @@ set_target_properties(noahmp PROPERTIES ) target_include_directories(noahmp PUBLIC $ $) -target_link_libraries(noahmp PUBLIC esmf fms) +target_link_libraries(noahmp PUBLIC ESMF::ESMF fms) #------------------------------------------------------------------------------ # CMake export for ESMX driver @@ -101,4 +102,4 @@ install( install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include DESTINATION ${CMAKE_INSTALL_PREFIX}) install(EXPORT noahmp - DESTINATION lib/cmake) + DESTINATION lib/cmake) diff --git a/cmake/FindESMF.cmake b/cmake/FindESMF.cmake deleted file mode 100644 index e86b7e94..00000000 --- a/cmake/FindESMF.cmake +++ /dev/null @@ -1,138 +0,0 @@ -# - Try to find ESMF -# -# Uses ESMFMKFILE to find the filepath of esmf.mk. If this is NOT set, then this -# module will attempt to find esmf.mk. If ESMFMKFILE exists, then -# ESMF_FOUND=TRUE and all ESMF makefile variables will be set in the global -# scope. Optionally, set ESMF_MKGLOBALS to a string list to filter makefile -# variables. For example, to globally scope only ESMF_LIBSDIR and ESMF_APPSDIR -# variables, use this CMake command in CMakeLists.txt: -# -# set(ESMF_MKGLOBALS "LIBSDIR" "APPSDIR") - -# Set ESMFMKFILE as defined by system env variable. If it's not explicitly set -# try to find esmf.mk file in default locations (ESMF_ROOT, CMAKE_PREFIX_PATH, -# etc) -if(NOT DEFINED ESMFMKFILE) - if(NOT DEFINED ENV{ESMFMKFILE}) - find_path(ESMFMKFILE_PATH esmf.mk PATH_SUFFIXES lib lib64) - if(ESMFMKFILE_PATH) - set(ESMFMKFILE ${ESMFMKFILE_PATH}/esmf.mk) - message(STATUS "Found esmf.mk file ${ESMFMKFILE}") - endif() - else() - set(ESMFMKFILE $ENV{ESMFMKFILE}) - endif() -endif() - -# Only parse the mk file if it is found -if(EXISTS ${ESMFMKFILE}) - set(ESMFMKFILE ${ESMFMKFILE} CACHE FILEPATH "Path to esmf.mk file") - set(ESMF_FOUND TRUE CACHE BOOL "esmf.mk file found" FORCE) - - # Read the mk file - file(STRINGS "${ESMFMKFILE}" esmfmkfile_contents) - # Parse each line in the mk file - foreach(str ${esmfmkfile_contents}) - # Only consider uncommented lines - string(REGEX MATCH "^[^#]" def ${str}) - # Line is not commented - if(def) - # Extract the variable name - string(REGEX MATCH "^[^=]+" esmf_varname ${str}) - # Extract the variable's value - string(REGEX MATCH "=.+$" esmf_vardef ${str}) - # Only for variables with a defined value - if(esmf_vardef) - # Get rid of the assignment string - string(SUBSTRING ${esmf_vardef} 1 -1 esmf_vardef) - # Remove whitespace - string(STRIP ${esmf_vardef} esmf_vardef) - # A string or single-valued list - if(NOT DEFINED ESMF_MKGLOBALS) - # Set in global scope - set(${esmf_varname} ${esmf_vardef}) - # Don't display by default in GUI - mark_as_advanced(esmf_varname) - else() # Need to filter global promotion - foreach(m ${ESMF_MKGLOBALS}) - string(FIND ${esmf_varname} ${m} match) - # Found the string - if(NOT ${match} EQUAL -1) - # Promote to global scope - set(${esmf_varname} ${esmf_vardef}) - # Don't display by default in the GUI - mark_as_advanced(esmf_varname) - # No need to search for the current string filter - break() - endif() - endforeach() - endif() - endif() - endif() - endforeach() - - # Construct ESMF_VERSION from ESMF_VERSION_STRING_GIT - # ESMF_VERSION_MAJOR and ESMF_VERSION_MINOR are defined in ESMFMKFILE - set(ESMF_VERSION 0) - set(ESMF_VERSION_PATCH ${ESMF_VERSION_REVISION}) - set(ESMF_BETA_RELEASE FALSE) - if(ESMF_VERSION_BETASNAPSHOT MATCHES "^('T')$") - set(ESMF_BETA_RELEASE TRUE) - if(ESMF_VERSION_STRING_GIT MATCHES "^ESMF.*beta_snapshot_[0-9]") - string(REGEX REPLACE "^ESMF.*beta_snapshot_\([0-9]*\).*" "\\1" ESMF_BETA_SNAPSHOT "${ESMF_VERSION_STRING_GIT}") - elseif(ESMF_VERSION_STRING_GIT MATCHES "^v.*b[0-9]") - string(REGEX REPLACE "^v.*b\([0-9]*\).*" "\\1" ESMF_BETA_SNAPSHOT "${ESMF_VERSION_STRING_GIT}") - else() - set(ESMF_BETA_SNAPSHOT 0) - endif() - message(STATUS "Detected ESMF Beta snapshot ${ESMF_BETA_SNAPSHOT}") - endif() - set(ESMF_VERSION "${ESMF_VERSION_MAJOR}.${ESMF_VERSION_MINOR}.${ESMF_VERSION_PATCH}") - - # Find the ESMF library - if(USE_ESMF_STATIC_LIBS) - find_library(ESMF_LIBRARY_LOCATION NAMES libesmf.a PATHS ${ESMF_LIBSDIR} NO_DEFAULT_PATH) - if(ESMF_LIBRARY_LOCATION MATCHES "ESMF_LIBRARY_LOCATION-NOTFOUND") - message(WARNING "Static ESMF library (libesmf.a) not found in \ - ${ESMF_LIBSDIR}. Try setting USE_ESMF_STATIC_LIBS=OFF") - endif() - add_library(ESMF STATIC IMPORTED) - else() - find_library(ESMF_LIBRARY_LOCATION NAMES esmf PATHS ${ESMF_LIBSDIR} NO_DEFAULT_PATH) - if(ESMF_LIBRARY_LOCATION MATCHES "ESMF_LIBRARY_LOCATION-NOTFOUND") - message(WARNING "ESMF library not found in ${ESMF_LIBSDIR}.") - endif() - add_library(ESMF UNKNOWN IMPORTED) - endif() - - # Add ESMF include directories - set(ESMF_INCLUDE_DIRECTORIES "") - separate_arguments(_ESMF_F90COMPILEPATHS NATIVE_COMMAND ${ESMF_F90COMPILEPATHS}) - foreach(_ITEM ${_ESMF_F90COMPILEPATHS}) - string(REGEX REPLACE "^-I" "" _ITEM "${_ITEM}") - list(APPEND ESMF_INCLUDE_DIRECTORIES ${_ITEM}) - endforeach() - - # Add ESMF link libraries - string(STRIP "${ESMF_F90ESMFLINKRPATHS} ${ESMF_F90ESMFLINKPATHS} ${ESMF_F90LINKPATHS} ${ESMF_F90LINKLIBS} ${ESMF_F90LINKOPTS}" ESMF_INTERFACE_LINK_LIBRARIES) - - # Finalize find_package - include(FindPackageHandleStandardArgs) - - find_package_handle_standard_args( - ${CMAKE_FIND_PACKAGE_NAME} - REQUIRED_VARS ESMF_LIBRARY_LOCATION - ESMF_INTERFACE_LINK_LIBRARIES - ESMF_F90COMPILEPATHS - VERSION_VAR ESMF_VERSION) - - set_target_properties(ESMF PROPERTIES - IMPORTED_LOCATION "${ESMF_LIBRARY_LOCATION}" - INTERFACE_INCLUDE_DIRECTORIES "${ESMF_INCLUDE_DIRECTORIES}" - INTERFACE_LINK_LIBRARIES "${ESMF_INTERFACE_LINK_LIBRARIES}") - -else() - set(ESMF_FOUND FALSE CACHE BOOL "esmf.mk file NOT found" FORCE) - message(WARNING "ESMFMKFILE ${ESMFMKFILE} not found. Try setting ESMFMKFILE \ - to esmf.mk location.") -endif()