mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
If we write a blank value into the cache, we tell CMake that ERT isn't found and it won't check again. If we delete it from the cache in case we didn't find the directories, then CMake will run the find module again the next time we configure. Just probing for directories is cheap so this is no problem. This allows us to install ERT, do a reconfigure and it will then be picked up by the build system. If we find ERT and it doesn't compile properly, a blank value will still be written, and it won't try again the next time, so you must wipe the cache if you *upgrade* ERT into a newer and more compatible version.
221 lines
6.9 KiB
CMake
221 lines
6.9 KiB
CMake
# - Find the Ensemble-based Reservoir Tool (ERT)
|
|
#
|
|
# Set the cache variable ERT_ROOT to the install location of the ERT
|
|
# libraries and header files.
|
|
#
|
|
# If found, it sets these variables:
|
|
#
|
|
# ERT_INCLUDE_DIRS Header file directories
|
|
# ERT_LIBRARIES Archives and shared objects
|
|
# ERT_CONFIG_VARS Definitions that goes in config.h
|
|
# ERT_LINKER_FLAGS Options that must be passed to linker
|
|
#
|
|
# It will also add to CMAKE_C_FLAGS and CMAKE_CXX_FLAGS if necessary to
|
|
# link with the ERT libraries.
|
|
|
|
# variables to pass on to other packages
|
|
if (FIND_QUIETLY)
|
|
set (ERT_QUIET "QUIET")
|
|
else (FIND_QUIETLY)
|
|
set (ERT_QUIET "")
|
|
endif (FIND_QUIETLY)
|
|
|
|
# if a directory has been specified by the user, then don't go look
|
|
# in the system directories as well
|
|
if (ERT_ROOT)
|
|
set (_no_default_path "NO_DEFAULT_PATH")
|
|
else (ERT_ROOT)
|
|
set (_no_default_path "")
|
|
endif (ERT_ROOT)
|
|
|
|
# ERT doesn't have any config-mode file, so we need to specify the root
|
|
# directory in its own variable
|
|
find_path (ERT_ECL_INCLUDE_DIR
|
|
NAMES "ert/ecl/ecl_util.h"
|
|
HINTS "${ERT_ROOT}"
|
|
PATHS "../ert"
|
|
PATH_SUFFIXES "devel/libecl/include/" "include"
|
|
DOC "Path to ERT Eclipse library header files"
|
|
${_no_default_path}
|
|
)
|
|
find_path (ERT_UTIL_INCLUDE_DIR
|
|
NAMES "ert/util/stringlist.h"
|
|
HINTS "${ERT_ROOT}"
|
|
PATHS "../ert"
|
|
PATH_SUFFIXES "devel/libert_util/include/" "include"
|
|
DOC "Path to ERT Eclipse library header files"
|
|
${_no_default_path}
|
|
)
|
|
find_path (ERT_GEN_INCLUDE_DIR
|
|
NAMES "ert/util/int_vector.h"
|
|
HINTS "${ERT_ROOT}"
|
|
PATHS "${PROJECT_BINARY_DIR}/../ert" "${PROJECT_BINARY_DIR}/../ert-build"
|
|
"${PROJECT_BINARY_DIR}/../ert/devel"
|
|
PATH_SUFFIXES "libert_util/include/" "include"
|
|
DOC "Path to ERT generated library header files"
|
|
${_no_default_path}
|
|
)
|
|
|
|
# need all of these libraries
|
|
if (CMAKE_SIZEOF_VOID_P)
|
|
math (EXPR _BITS "8 * ${CMAKE_SIZEOF_VOID_P}")
|
|
endif (CMAKE_SIZEOF_VOID_P)
|
|
find_library (ERT_LIBRARY_ECL
|
|
NAMES "ecl"
|
|
HINTS "${ERT_ROOT}"
|
|
PATHS "${PROJECT_BINARY_DIR}/../ert" "${PROJECT_BINARY_DIR}/../ert-build"
|
|
"${PROJECT_BINARY_DIR}/../ert/devel"
|
|
PATH_SUFFIXES "lib" "lib${_BITS}" "lib/${CMAKE_LIBRARY_ARCHITECTURE}"
|
|
DOC "Path to ERT Eclipse library archive/shared object files"
|
|
${_no_default_path}
|
|
)
|
|
find_library (ERT_LIBRARY_GEOMETRY
|
|
NAMES "ert_geometry"
|
|
HINTS "${ERT_ROOT}"
|
|
PATHS "${PROJECT_BINARY_DIR}/../ert" "${PROJECT_BINARY_DIR}/../ert-build"
|
|
"${PROJECT_BINARY_DIR}/../ert/devel"
|
|
PATH_SUFFIXES "lib" "lib${_BITS}" "lib/${CMAKE_LIBRARY_ARCHITECTURE}"
|
|
DOC "Path to ERT Geometry library archive/shared object files"
|
|
${_no_default_path}
|
|
)
|
|
find_library (ERT_LIBRARY_UTIL
|
|
NAMES "ert_util"
|
|
HINTS "${ERT_ROOT}"
|
|
PATHS "${PROJECT_BINARY_DIR}/../ert" "${PROJECT_BINARY_DIR}/../ert-build"
|
|
"${PROJECT_BINARY_DIR}/../ert/devel"
|
|
PATH_SUFFIXES "lib" "lib${_BITS}" "lib/${CMAKE_LIBRARY_ARCHITECTURE}"
|
|
DOC "Path to ERT Utilities library archive/shared object files"
|
|
${_no_default_path}
|
|
)
|
|
# the "library" found here is actually a list of several files
|
|
list (APPEND ERT_INCLUDE_DIR
|
|
${ERT_ECL_INCLUDE_DIR}
|
|
${ERT_UTIL_INCLUDE_DIR}
|
|
${ERT_GEN_INCLUDE_DIR}
|
|
)
|
|
list (APPEND ERT_LIBRARY
|
|
${ERT_LIBRARY_ECL}
|
|
${ERT_LIBRARY_GEOMETRY}
|
|
${ERT_LIBRARY_UTIL}
|
|
)
|
|
list (APPEND ERT_LIBRARIES ${ERT_LIBRARY})
|
|
list (APPEND ERT_INCLUDE_DIRS ${ERT_INCLUDE_DIR})
|
|
|
|
# if we didn't find any files, then don't proceed through the entire dependency list
|
|
include (FindPackageHandleStandardArgs)
|
|
if (ERT_INCLUDE_DIR MATCHES "-NOTFOUND" OR ERT_LIBRARIES MATCHES "-NOTFOUND")
|
|
find_package_handle_standard_args (ERT
|
|
DEFAULT_MSG
|
|
ERT_INCLUDE_DIR ERT_LIBRARY
|
|
)
|
|
# clear the cache so the find probe is attempted again if files becomes
|
|
# available (only upon a unsuccessful *compile* should we disable further
|
|
# probing)
|
|
set (HAVE_ERT)
|
|
unset (HAVE_ERT CACHE)
|
|
return ()
|
|
endif (ERT_INCLUDE_DIR MATCHES "-NOTFOUND" OR ERT_LIBRARIES MATCHES "-NOTFOUND")
|
|
|
|
# these system variables are probed for, and used in HEADER files (sic)
|
|
list (APPEND ERT_CONFIG_VARS
|
|
HAVE_ISFINITE
|
|
HAVE_GLOB
|
|
HAVE_FORK
|
|
HAVE_GETUID
|
|
HAVE_LOCKF
|
|
HAVE_OPENDIR
|
|
HAVE_PROC
|
|
HAVE_READLINKAT
|
|
HAVE_SYMLINK
|
|
HAVE_VA_COPY
|
|
)
|
|
include (CheckSymbolExists)
|
|
include (CheckFunctionExists)
|
|
check_symbol_exists (isfinite math.h HAVE_ISFINITE)
|
|
check_function_exists (glob HAVE_GLOB)
|
|
check_function_exists (fork HAVE_FORK)
|
|
check_function_exists (getuid HAVE_GETUID)
|
|
check_function_exists (lockf HAVE_LOCKF)
|
|
check_function_exists (opendir HAVE_OPENDIR)
|
|
check_function_exists (readlinkat HAVE_READLINKAT)
|
|
check_function_exists (symlink HAVE_SYMLINK)
|
|
check_symbol_exists (va_copy stdarg.h HAVE_VA_COPY)
|
|
|
|
if (UNIX)
|
|
set (HAVE_PROC 1)
|
|
else (UNIX)
|
|
set (HAVE_PROC)
|
|
endif (UNIX)
|
|
|
|
# dependencies
|
|
|
|
# parallel programming
|
|
include (UseOpenMP)
|
|
find_openmp (ERT)
|
|
|
|
# compression library
|
|
find_package (ZLIB ${ERT_QUIET})
|
|
if (ZLIB_FOUND)
|
|
list (APPEND ERT_INCLUDE_DIRS ${ZLIB_INCLUDE_DIRS})
|
|
list (APPEND ERT_LIBRARIES ${ZLIB_LIBRARIES})
|
|
endif (ZLIB_FOUND)
|
|
|
|
# numerics
|
|
find_package (BLAS ${ERT_QUIET})
|
|
if (BLAS_FOUND)
|
|
list (APPEND ERT_INCLUDE_DIRS ${BLAS_INCLUDE_DIRS})
|
|
list (APPEND ERT_LIBRARIES ${BLAS_LIBRARIES})
|
|
list (APPEND ERT_LINKER_FLAGS ${BLAS_LINKER_FLAGS})
|
|
endif (BLAS_FOUND)
|
|
find_package (LAPACK ${ERT_QUIET})
|
|
if (LAPACK_FOUND)
|
|
list (APPEND ERT_INCLUDE_DIRS ${LAPACK_INCLUDE_DIRS})
|
|
list (APPEND ERT_LIBRARIES ${LAPACK_LIBRARIES})
|
|
list (APPEND ERT_LINKER_FLAGS ${LAPACK_LINKER_FLAGS})
|
|
endif (LAPACK_FOUND)
|
|
|
|
# math library (should exist on all unices; automatically linked on Windows)
|
|
if (UNIX)
|
|
find_library (MATH_LIBRARY
|
|
NAMES "m"
|
|
)
|
|
list (APPEND ERT_LIBRARIES ${MATH_LIBRARY})
|
|
endif (UNIX)
|
|
|
|
# since OpenMP often implies pthreads, we need to tidy up
|
|
# (last instance of library must be left standing, thus reversing that
|
|
# list before removing duplicates)
|
|
include (Duplicates)
|
|
remove_dup_deps (ERT)
|
|
|
|
# see if we can compile a minimum example
|
|
# CMake logical test doesn't handle lists (sic)
|
|
if (NOT (ERT_INCLUDE_DIR MATCHES "-NOTFOUND" OR ERT_LIBRARIES MATCHES "-NOTFOUND"))
|
|
include (CMakePushCheckState)
|
|
include (CheckCSourceCompiles)
|
|
cmake_push_check_state ()
|
|
set (CMAKE_REQUIRED_INCLUDES ${ERT_INCLUDE_DIR})
|
|
set (CMAKE_REQUIRED_LIBRARIES ${ERT_LIBRARIES})
|
|
check_c_source_compiles (
|
|
"#include <ert/ecl/ecl_util.h>
|
|
int main (void) {
|
|
int sz;
|
|
sz = ecl_util_get_sizeof_ctype (ECL_INT_TYPE);
|
|
return 0;
|
|
}" HAVE_ERT)
|
|
cmake_pop_check_state ()
|
|
else (NOT (ERT_INCLUDE_DIR MATCHES "-NOTFOUND" OR ERT_LIBRARIES MATCHES "-NOTFOUND"))
|
|
# clear the cache so the find probe is attempted again if files becomes
|
|
# available (only upon a unsuccessful *compile* should we disable further
|
|
# probing)
|
|
set (HAVE_ERT)
|
|
unset (HAVE_ERT CACHE)
|
|
endif (NOT (ERT_INCLUDE_DIR MATCHES "-NOTFOUND" OR ERT_LIBRARIES MATCHES "-NOTFOUND"))
|
|
|
|
# if the test program didn't compile, but was required to do so, bail
|
|
# out now and display an error; otherwise limp on
|
|
find_package_handle_standard_args (ERT
|
|
DEFAULT_MSG
|
|
ERT_INCLUDE_DIR ERT_LIBRARY HAVE_ERT
|
|
)
|