diff --git a/CMakeLists.txt b/CMakeLists.txt index 2a771819..5aba18fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ # -*- mode: cmake; tab-width: 2; indent-tabs-mode: t; truncate-lines: t; compile-command: "cmake -Wdev" -*- # vim: set filetype=cmake autoindent tabstop=2 shiftwidth=2 noexpandtab softtabstop=2 nowrap: +cmake_minimum_required (VERSION 2.8) # key information about the library set (project "opm-core") @@ -10,295 +11,80 @@ set (${project}_VERSION_MAJOR 1) set (${project}_VERSION_MINOR 0) set (doxy_dir "Documentation") -# defines that must be present in config.h for our headers -set (${project}_CONFIG_VAR - HAVE_AGMG - HAVE_DUNE_ISTL - HAVE_DYNAMIC_BOOST_TEST - HAVE_ERT - HAVE_SUITESPARSE_UMFPACK_H - HAVE_NULLPTR - HAVE_STATIC_ASSERT - ) - -# dependencies -set (${project}_DEPS - # compile with C99 support if available - "C99" - # compile with C++0x/11 support if available - "CXX11Features" - # various runtime library enhancements - "Boost 1.39.0 - COMPONENTS date_time filesystem system unit_test_framework signals REQUIRED" - # matrix library - "BLAS REQUIRED" - "LAPACK REQUIRED" - # Tim Davis' SuiteSparse archive - "SuiteSparse COMPONENTS umfpack" - # solver - "SuperLU" - # xml processing (for config parsing) - "TinyXML" - # Ensembles-based Reservoir Tools (ERT) - "ERT" - # DUNE dependency - "dune-common" - "dune-istl" - ) - # additional search modules set (${project}_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules") list (APPEND CMAKE_MODULE_PATH ${${project}_MODULE_DIR}) -# include special -if (CMAKE_VERSION VERSION_LESS "2.8.3") - message (STATUS "Enabling compatibility modules for CMake 2.8.3") - list (APPEND CMAKE_MODULE_PATH "${${project}_MODULE_DIR}/compat-2.8.3") -endif (CMAKE_VERSION VERSION_LESS "2.8.3") +macro (prereqs_hook project) +endmacro (prereqs_hook project) -if (CMAKE_VERSION VERSION_LESS "2.8.5") - message (STATUS "Enabling compatibility modules for CMake 2.8.5") - list (APPEND CMAKE_MODULE_PATH "${${project}_MODULE_DIR}/compat-2.8.5") -endif (CMAKE_VERSION VERSION_LESS "2.8.5") +macro (sources_hook project) + # Algebraic Multigrid must be compiled together with our program; + # if it is not available, then remove our corresponding component + find_package (AGMG) + if (AGMG_FOUND) + list (APPEND ${project}_SOURCES ${AGMG_SOURCES}) + endif (AGMG_FOUND) -if (CMAKE_VERSION VERSION_LESS "2.8.7") - message (STATUS "Enabling compatibility modules for CMake 2.8.7") - list (APPEND CMAKE_MODULE_PATH "${${project}_MODULE_DIR}/compat-2.8.7") -endif (CMAKE_VERSION VERSION_LESS "2.8.7") + # these solvers are only compiled in if their dependency is found + if (NOT AGMG_FOUND) + list (REMOVE_ITEM opm-core_SOURCES + ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/linalg/LinearSolverAGMG.cpp + ) + endif (NOT AGMG_FOUND) + if (NOT dune-istl_FOUND) + list (REMOVE_ITEM opm-core_SOURCES + ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/linalg/LinearSolverIstl.cpp + ) + endif (NOT dune-istl_FOUND) + if (NOT SuiteSparse_FOUND) + list (REMOVE_ITEM opm-core_SOURCES + ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/linalg/call_umfpack.c + ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/linalg/LinearSolverUmfpack.cpp + ) + list (REMOVE_ITEM examples_SOURCES + ${PROJECT_SOURCE_DIR}/tutorials/tutorial2.cpp + ${PROJECT_SOURCE_DIR}/tutorials/tutorial3.cpp + ${PROJECT_SOURCE_DIR}/tutorials/tutorial4.cpp + ) + endif (NOT SuiteSparse_FOUND) -# don't write default flags into the cache, preserve that for user set values -include (AddOptions) -no_default_options () - -# C++ project -cmake_minimum_required (VERSION 2.8) -project (${${project}_NAME}) -enable_language (C) -enable_language (CXX) - -# print system information to better pinpoint issues from log alone -include (UseSystemInfo) -system_info () - -# very early try to print repo id (to pinpoint version if something goes wrong) -include (UseVCSInfo) -vcs_info () - -# print toolchain information to identify compilers with potential bugs -include (UseCompVer) -compiler_info () - -# default settings: build static debug library -include (OpmDefaults) -opm_defaults (${project}) -message (STATUS "Build type: ${CMAKE_BUILD_TYPE}") - -# use tricks to do faster builds -include (UseFastBuilds) - -# precompiled headers -include (UsePrecompHeaders) - -# optimize full if we're not doing a debug build -include (UseOptimization) - -# turn on all warnings; this must be done before adding any -# dependencies, in case they alter the list of warnings -include (UseWarnings) - -# parallel computing must be explicitly enabled -option (USE_MPI "Use Message Passing Interface for parallel computing" OFF) -if (NOT USE_MPI) - set (CMAKE_DISABLE_FIND_PACKAGE_MPI TRUE) -endif (NOT USE_MPI) - -### --- begin opm-core specific --- ### -include (UseOpenMP) -find_openmp (${project}) -### --- end opm-core specific --- ### - -# macro to set standard variables (INCLUDE_DIRS, LIBRARIES etc.) -include (OpmFind) -find_and_append_package_list_to (${project} ${${project}_DEPS}) - -# remove the dependency on the testing framework from the main library; -# it is not possible to query for Boost twice with different components. -list (REMOVE_ITEM ${project}_LIBRARIES ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) - -# don't import more libraries than we need to -include (UseOnlyNeeded) - -# put debug information into every executable -include (UseDebugSymbols) - -# detect if Boost is in a shared library -include (UseDynamicBoost) - -# needed for Debian installation scheme -include (UseMultiArch) - -# this module contains code to figure out which files is where -include (OpmFiles) -opm_auto_dirs () - -# put libraries in lib/ -opm_out_dirs () - -# identify the compilation units in the library; sources in opm/, -# tests files in tests/, examples in tutorials/ and examples/ -opm_sources (${project}) - -### --- begin AGMG specific --- ### -# Algebraic Multigrid must be compiled together with our program; -# if it is not available, then remove our corresponding component -find_package (AGMG) -if (AGMG_FOUND) - list (APPEND ${project}_SOURCES ${AGMG_SOURCES}) -endif (AGMG_FOUND) -### --- end AGMG specific --- ### - -### --- begin opm-core specific --- ### -# these solvers are only compiled in if their dependency is found -if (NOT AGMG_FOUND) + # we are not supposed to include the TinyXML test prog. regardless list (REMOVE_ITEM opm-core_SOURCES - ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/linalg/LinearSolverAGMG.cpp + ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/utility/parameters/tinyxml/xmltest.cpp ) -endif (NOT AGMG_FOUND) -if (NOT dune-istl_FOUND) - list (REMOVE_ITEM opm-core_SOURCES - ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/linalg/LinearSolverIstl.cpp - ) -endif (NOT dune-istl_FOUND) -if (NOT SuiteSparse_FOUND) - list (REMOVE_ITEM opm-core_SOURCES - ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/linalg/call_umfpack.c - ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/linalg/LinearSolverUmfpack.cpp - ) - list (REMOVE_ITEM examples_SOURCES - ${PROJECT_SOURCE_DIR}/tutorials/tutorial2.cpp - ${PROJECT_SOURCE_DIR}/tutorials/tutorial3.cpp - ${PROJECT_SOURCE_DIR}/tutorials/tutorial4.cpp - ) -endif (NOT SuiteSparse_FOUND) -# we are not supposed to include the TinyXML test prog. regardless -list (REMOVE_ITEM opm-core_SOURCES - ${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/utility/parameters/tinyxml/xmltest.cpp - ) + # remove inline TinyXML if a system version was found + if (TinyXML_FOUND) + file (GLOB_RECURSE _inline_tinyxml "${opm-core_DIR}/core/utility/parameters/tinyxml/*") + foreach (_file IN LISTS _inline_tinyxml) + list (REMOVE_ITEM opm-core_SOURCES ${_file}) + endforeach (_file) + endif (TinyXML_FOUND) -# remove inline TinyXML if a system version was found -if (TinyXML_FOUND) - file (GLOB_RECURSE _inline_tinyxml "${opm-core_DIR}/core/utility/parameters/tinyxml/*") - foreach (_file IN LISTS _inline_tinyxml) - list (REMOVE_ITEM opm-core_SOURCES ${_file}) - endforeach (_file) -endif (TinyXML_FOUND) + # anyhow remove it from the header list (so it doesn't get installed) + list (REMOVE_ITEM opm-core_HEADERS "${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/utility/parameters/tinyxml/tinystr.h") + list (REMOVE_ITEM opm-core_HEADERS "${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/utility/parameters/tinyxml/tinyxml.h") -# anyhow remove it from the header list (so it doesn't get installed) -list (REMOVE_ITEM opm-core_HEADERS "${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/utility/parameters/tinyxml/tinystr.h") -list (REMOVE_ITEM opm-core_HEADERS "${PROJECT_SOURCE_DIR}/${opm-core_DIR}/core/utility/parameters/tinyxml/tinyxml.h") + # HAVE_ERT is used as an #ifdef, not as an #if in the source code, if it + # is not true, then it should be unset altogether + if (NOT HAVE_ERT) + set (HAVE_ERT) + list (REMOVE_ITEM examples_SOURCES + ${PROJECT_SOURCE_DIR}/examples/import_rewrite.cpp + ) + endif (NOT HAVE_ERT) +endmacro (sources_hook project) -# HAVE_ERT is used as an #ifdef, not as an #if in the source code, if it -# is not true, then it should be unset altogether -if (NOT HAVE_ERT) - set (HAVE_ERT) - list (REMOVE_ITEM examples_SOURCES - ${PROJECT_SOURCE_DIR}/examples/import_rewrite.cpp - ) -endif (NOT HAVE_ERT) -### --- end opm-core specific --- ### +macro (fortran_hook project) + # only include Fortran support if AGMG sources are available + set (${project}_FORTRAN_IF HAVE_AGMG) +endmacro (fortran_hook project) -# create configuration header which describes available features -# necessary to compile this library. singular version is the names that -# is required by this project alone, plural version transitively -# includes the necessary defines by the dependencies -include (ConfigVars) -list (APPEND ${project}_CONFIG_VARS ${${project}_CONFIG_VAR}) +macro (tests_hook project) + cond_disable_test ("AGMG") + cond_disable_test ("ERT") +endmacro (tests_hook project) -# write configuration variables to this file. note that it is a temporary. -message (STATUS "Writing config file \"${PROJECT_BINARY_DIR}/config.h\"...") -set (CONFIG_H "${PROJECT_BINARY_DIR}/config.h.tmp") -configure_vars ( - FILE CXX ${CONFIG_H} - WRITE ${${project}_CONFIG_VARS} - ) - -include (UseFortranWrappers) -define_fc_func ( - APPEND ${CONFIG_H} - IF HAVE_AGMG # HAVE_BLAS HAVE_LAPACK - ) - -# overwrite the config.h that is used by the code only if we have some -# real changes. thus, we don't have to recompile if a reconfigure is run -# due to some files being added, for instance -execute_process (COMMAND - ${CMAKE_COMMAND} -E copy_if_different ${CONFIG_H} ${PROJECT_BINARY_DIR}/config.h - ) - -# compile main library; pull in all required includes and libraries -include (OpmCompile) -opm_compile (${project}) - -# installation target: copy the library together with debug and -# configuration files to system directories -include (OpmInstall) -opm_install (${project}) -message (STATUS "This build defaults to installing in ${CMAKE_INSTALL_PREFIX}") - -# installation of CMake modules to help user programs locate the library -include (OpmProject) -opm_cmake_config (${project}) - -# routines to build satellites such as tests, tutorials and samples -include (OpmSatellites) - -# example programs are found in the tutorials/ and examples/ directory -opm_compile_satellites (${project} examples "" "") - -# infrastructure for testing -enable_testing () -include (CTest) - -### --- begin opm-core specific --- ### -# conditionally disable tests when features aren't available -macro (cond_disable_test name) - if ((NOT DEFINED HAVE_${name}) OR (NOT HAVE_${name})) - message (STATUS "${name} test disabled, since ${name} is not found.") - string (TOLOWER "${name}" name_lower) - get_filename_component (test_${name}_FILE "tests/test_${name_lower}.cpp" ABSOLUTE) - list (REMOVE_ITEM tests_SOURCES "${test_${name}_FILE}") - endif ((NOT DEFINED HAVE_${name}) OR (NOT HAVE_${name})) -endmacro (cond_disable_test name) -cond_disable_test ("AGMG") -cond_disable_test ("ERT") -### --- end opm-core specific --- ### - -# make datafiles necessary for tests available in output directory -opm_data (tests datafiles "${tests_DIR}") -opm_compile_satellites (${project} tests "" "${tests_REGEXP}") - -# use this target to run all tests -add_custom_target (check - COMMAND ${CMAKE_CTEST_COMMAND} - DEPENDS tests - COMMENT "Checking if library is functional" - VERBATIM - ) - -# generate documentation from source code with Doxygen; -# setup install target for this documentation -include (OpmDoc) -opm_doc (${project} ${doxy_dir}) - -# provide compatibility with using this build in dunecontrol -include (DuneCompat) -include (LibtoolArchives) -configure_la (${project} ${${project}_TARGET} ${project}_LIBTOOL_ARCHIVE) - -### clean in-source builds ### -include (OpmDistClean) -opm_dist_clean (${project}) - -### emulate the with-xxx feature of autotools; -include (OpmKnown) +# all setup common to the OPM library modules is done here +include (OpmLibMain)