Skip to content

Commit

Permalink
add cmake helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
jedwards4b committed Oct 1, 2020
1 parent 6962be0 commit cd9c7b3
Show file tree
Hide file tree
Showing 5 changed files with 589 additions and 1 deletion.
47 changes: 47 additions & 0 deletions cmake/FindESMF.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@

if (DEFINED ENV{ESMFMKFILE})
message("ESMFMKFILE: $ENV{ESMFMKFILE}")
else()
message(FATAL_ERROR "ESMFMKFILE env variable is not defined")
endif()

set(ESMFMKFILE $ENV{ESMFMKFILE})

# convert esmf.mk makefile variables to cmake variables until ESMF
# provides proper cmake package
file(STRINGS ${ESMFMKFILE} esmf_mk_text)
foreach(line ${esmf_mk_text})
string(REGEX REPLACE "^[ ]+" "" line ${line}) # strip leading spaces
if (line MATCHES "^ESMF_*") # process only line starting with ESMF_
string(REGEX MATCH "^ESMF_[^=]+" esmf_name ${line})
string(REPLACE "${esmf_name}=" "" emsf_value ${line})
set(${esmf_name} "${emsf_value}")
endif()
endforeach()
string(REPLACE "-I" "" ESMF_F90COMPILEPATHS ${ESMF_F90COMPILEPATHS})
string(REPLACE " " ";" ESMF_F90COMPILEPATHS ${ESMF_F90COMPILEPATHS})

# We use only these 4 variables in our build system. Make sure they are all set
if(ESMF_VERSION_MAJOR AND
ESMF_F90COMPILEPATHS AND
ESMF_F90ESMFLINKRPATHS AND
ESMF_F90ESMFLINKLIBS)
message(" Found ESMF:")
message("ESMF_VERSION_MAJOR: ${ESMF_VERSION_MAJOR}")
message("ESMF_F90COMPILEPATHS: ${ESMF_F90COMPILEPATHS}")
message("ESMF_F90ESMFLINKRPATHS: ${ESMF_F90ESMFLINKRPATHS}")
message("ESMF_F90ESMFLINKLIBS: ${ESMF_F90ESMFLINKLIBS}")
else()
message("One of the ESMF_ variables is not defined")
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(ESMF
FOUND_VAR
ESMF_FOUND
REQUIRED_VARS
ESMF_F90COMPILEPATHS
ESMF_F90ESMFLINKRPATHS
ESMF_F90ESMFLINKLIBS
VERSION_VAR
ESMF_VERSION_STRING)
103 changes: 103 additions & 0 deletions cmake/FindPIO.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# - Try to find PIO
#
# This can be controled by setting PIO_PATH or PIO_<lang>_PATH Cmake variables,
# where <lang> is the COMPONENT language one needs.
#
# Once done, this will define:
#
# PIO_<lang>_FOUND (BOOL) - system has PIO
# PIO_<lang>_IS_SHARED (BOOL) - whether the library is shared/dynamic
# PIO_<lang>_INCLUDE_DIR (PATH) - Location of the header files and modules
# PIO_<lang>_LIBRARY (File) - Path to the <lang> library files
# PIO_<lang>_LIBRARIES (List) - link these to use PIO
#
# Available COMPONENTS are: C Fortran
# If no components are specified only C is assumed
include (LibFind)
include (LibCheck)

# Define PIO C Component
define_package_component(PIO DEFAULT
COMPONENT C
INCLUDE_NAMES pio.h
LIBRARY_NAMES pioc)

# Define PIO Fortran Component
define_package_component(PIO
COMPONENT Fortran
INCLUDE_NAMES pio.mod pio.inc
LIBRARY_NAMES piof)

# Search for list of valid components requested
find_valid_components(PIO)

#==============================================================================
# SEARCH FOR VALIDATED COMPONENTS
foreach (pcomp IN LISTS PIO_FIND_VALID_COMPONENTS)

# If not found already, search...
if (NOT PIO_${pcomp}_FOUND)

# Manually add the MPI include and library dirs to search paths
# and search for the package component
if (MPI_${pcomp}_FOUND)
initialize_paths (PIO_${pcomp}_PATHS
INCLUDE_DIRECTORIES ${MPI_${pcomp}_INCLUDE_PATH}
LIBRARIES ${MPI_${pcomp}_LIBRARIES})
find_package_component(PIO COMPONENT ${pcomp}
PATHS ${PIO_${pcomp}_PATHS})
else ()
find_package_component(PIO COMPONENT ${pcomp} HINT PIO_${pcomp}_PATH=${PIO_PATH})
endif ()

# Continue only if component found
if (PIO_${pcomp}_FOUND)

# Checks
if (pcomp STREQUAL C)

# Check version
check_version (PIO
NAME "pio_meta.h"
HINTS ${PIO_C_INCLUDE_DIRS}
MACRO_REGEX "PIO_VERSION_")

endif ()

# Dependencies
if (pcomp STREQUAL C AND NOT PIO_C_IS_SHARED)

# DEPENDENCY: PnetCDF (if PnetCDF enabled)
check_macro (PIO_HAS_PNETCDF
NAME TryPIO_PNETCDF.c
HINTS ${CMAKE_MODULE_PATH}
DEFINITIONS -I${PIO_C_INCLUDE_DIR}
COMMENT "whether PIO has PnetCDF support")
if (PIO_HAS_PNETCDF)
find_package (PnetCDF COMPONENTS C)
endif ()


elseif (pcomp STREQUAL Fortran AND NOT PIO_Fortran_IS_SHARED)

# DEPENDENCY: PIO
set (orig_comp ${pcomp})
set (orig_comps ${PIO_FIND_VALID_COMPONENTS})
find_package (PIO COMPONENTS C)
set (PIO_FIND_VALID_COMPONENTS ${orig_comps})
set (pcomp ${orig_comp})
if (PIO_C_FOUND)
list (APPEND PIO_Fortran_INCLUDE_DIRS ${PIO_C_INCLUDE_DIRS})
list (APPEND PIO_Fortran_LIBRARIES ${PIO_C_LIBRARIES})
endif ()

endif ()

endif ()

endif ()

endforeach ()
message("PIO_C_FOUND ${PIO_C_FOUND}")
message("PIO_Fortran_FOUND ${PIO_Fortran_FOUND}")
message("PIO_Fortran_INCLUDE_DIR ${PIO_Fortran_INCLUDE_DIR}")
104 changes: 104 additions & 0 deletions cmake/LibCheck.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
include (CMakeParseArguments)
include (CheckFunctionExists)
#==============================================================================
#
# FUNCTIONS TO HELP WITH Check* MODULES
#
#==============================================================================

#______________________________________________________________________________
# - Basic function to check a property of a package using a try_compile step
#
# SYNTAX: check_macro (<return_variable>
# NAME <filename>
# HINTS <path> <path> ...
# DEFINITIONS <definition1> <definition> ...
# COMMENT <string_comment>)
#
function (check_macro VARIABLE)

# Parse the input arguments
set (oneValueArgs COMMENT NAME)
set (multiValueArgs HINTS DEFINITIONS)
cmake_parse_arguments (${VARIABLE} "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

# If the return variable is defined, already, don't continue
if (NOT DEFINED ${VARIABLE})

message (STATUS "Checking ${${VARIABLE}_COMMENT}")
find_file (${VARIABLE}_TRY_FILE
NAMES ${${VARIABLE}_NAME}
HINTS ${${VARIABLE}_HINTS})
if (${VARIABLE}_TRY_FILE)
try_compile (COMPILE_RESULT
${CMAKE_CURRENT_BINARY_DIR}/try${VARIABLE}
SOURCES ${${VARIABLE}_TRY_FILE}
COMPILE_DEFINITIONS ${${VARIABLE}_DEFINITIONS}
OUTPUT_VARIABLE TryOUT)
if (COMPILE_RESULT)
message (STATUS "Checking ${${VARIABLE}_COMMENT} - yes")
else ()
message (STATUS "Checking ${${VARIABLE}_COMMENT} - no")
endif ()

set (${VARIABLE} ${COMPILE_RESULT}
CACHE BOOL "${${VARIABLE}_COMMENT}")

else ()
message (STATUS "Checking ${${VARIABLE}_COMMENT} - failed")
endif ()

unset (${VARIABLE}_TRY_FILE CACHE)
endif ()

endfunction ()

#______________________________________________________________________________
# - Basic function to check the version of a package using a try_run step
#
# SYNTAX: check_version (<pkg>
# NAME <try_version_file>
# HINTS <path> <path> ...
# DEFINITIONS <definition1> <definition> ...)
#
function (check_version PKG)

# Parse the input arguments
set (oneValueArgs NAME MACRO_REGEX)
set (multiValueArgs HINTS)
cmake_parse_arguments (${PKG} "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

# If the return variable is defined, already, don't continue
if (NOT DEFINED ${PKG}_VERSION)

message (STATUS "Checking ${PKG} version")
find_file (${PKG}_VERSION_HEADER
NAMES ${${PKG}_NAME}
HINTS ${${PKG}_HINTS})
if (${PKG}_VERSION_HEADER)
set (def)
file (STRINGS ${${PKG}_VERSION_HEADER} deflines
REGEX "^#define[ \\t]+${${PKG}_MACRO_REGEX}")
foreach (defline IN LISTS deflines)
string (REPLACE "\"" "" defline "${defline}")
string (REPLACE "." "" defline "${defline}")
string (REGEX REPLACE "[ \\t]+" ";" deflist "${defline}")
list (GET deflist 2 arg)
list (APPEND def ${arg})
endforeach ()
string (REPLACE ";" "." vers "${def}")
message (STATUS "Checking ${PKG} version - ${vers}")
set (${PKG}_VERSION ${vers}
CACHE STRING "${PKG} version string")
if (${PKG}_VERSION VERSION_LESS ${PKG}_FIND_VERSION})
message (FATAL_ERROR "${PKG} version insufficient")
endif ()
else ()
message (STATUS "Checking ${PKG} version - failed")
endif ()

unset (${PKG}_VERSION_HEADER CACHE)

endif ()

endfunction ()
Loading

0 comments on commit cd9c7b3

Please sign in to comment.