# -*- 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) project (opm-core) set (opm-core_VERSION_MAJOR 1) set (opm-core_VERSION_MINOR 0) enable_language (C) enable_language (CXX) # build debug by default if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) set (CMAKE_BUILD_TYPE "Debug") endif (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) message (STATUS "Build type: ${CMAKE_BUILD_TYPE}") # all public header files are together with the source set (opm-core_INCLUDE_DIR "${PROJECT_SOURCE_DIR}") list (APPEND opm-core_INCLUDE_DIRS "${opm-core_INCLUDE_DIR}") # additional search modules set (opm-core_MODULE_DIR "${PROJECT_SOURCE_DIR}/cmake/Modules") list (APPEND CMAKE_MODULE_PATH ${opm-core_MODULE_DIR}) # include special if (CMAKE_VERSION VERSION_LESS "2.8.7") message (STATUS "Enabling backward compatibility modules for CMake ${CMAKE_VERSION}") list (APPEND CMAKE_MODULE_PATH "${opm-core_MODULE_DIR}/compat-2.8.7") endif (CMAKE_VERSION VERSION_LESS "2.8.7") # use tricks to do faster builds include (UseFastBuilds) # macro to set standard variables (INCLUDE_DIRS, LIBRARIES etc.) include (OpmFind) # dependencies list (APPEND opm-core_DEPS # compile with C99 support if available "C99" # compile with C++0x/11 support if available "CXX11Features" # matrix library "BLAS REQUIRED" "LAPACK REQUIRED" # Tim Davis' SuiteSparse archive "SuiteSparse COMPONENTS umfpack" # solver "SUPERLU" # xml processing (for config parsing) "TinyXML" # various runtime library enhancements "Boost 1.39.0 COMPONENTS date_time filesystem system unit_test_framework REQUIRED" # DUNE dependency "dune-istl" # Ensembles-based Reservoir Tools (ERT) "ERT" ) find_and_append_package_list (${opm-core_DEPS}) # put debug information into every executable include (UseDebugSymbols) # optimize full if we're not doing a debug build include (UseOptimization) # turn on all warnings include (UseWarnings) # detect if Boost is in a shared library include (UseDynamicBoost) # needed for Debian installation scheme include (UseMultiArch) # put libraries in lib/ (no multi-arch support in build tree) set (CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib") set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin") set (CMAKE_Fortran_MODULE_DIRECTORY "${PROJECT_BINARY_DIR}/CMakeFiles") # find all the source code (note that these variables have name after # the target library and not the project). the documentation recommends # against using globs to enumerate source code, but if you list the # files explicitly you'll change the build files every time you add to # the project as well as having to rebuild completely anyway. file (GLOB_RECURSE opmcore_SOURCES "opm/core/[^.]*.c" "opm/core/[^.]*.cpp") file (GLOB_RECURSE opmcore_HEADERS "opm/core/[^.]*.h" "opm/core/[^.]*.hpp") # 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 opmcore_SOURCES ${AGMG_SOURCES}) endif (AGMG_FOUND) # these solvers are only compiled in if their dependency is found if (NOT AGMG_FOUND) list (REMOVE_ITEM opmcore_SOURCES ${PROJECT_SOURCE_DIR}/opm/core/linalg/LinearSolverAGMG.cpp ) endif (NOT AGMG_FOUND) if (NOT dune-istl_FOUND) list (REMOVE_ITEM opmcore_SOURCES ${PROJECT_SOURCE_DIR}/opm/core/linalg/LinearSolverIstl.cpp ) endif (NOT dune-istl_FOUND) if (NOT SuiteSparse_FOUND) list (REMOVE_ITEM opmcore_SOURCES ${PROJECT_SOURCE_DIR}/opm/core/linalg/call_umfpack.c ${PROJECT_SOURCE_DIR}/opm/core/linalg/LinearSolverUmfpack.cpp ) endif (NOT SuiteSparse_FOUND) # these files are provided in source control, but can only compile with Matlab # available; we are not supposed to include the TinyXML test prog. regardless list (REMOVE_ITEM opmcore_SOURCES ${PROJECT_SOURCE_DIR}/opm/core/grid/cpgpreprocess/mxgrdecl.c ${PROJECT_SOURCE_DIR}/opm/core/grid/cpgpreprocess/processgrid.c ${PROJECT_SOURCE_DIR}/opm/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/utility/parameters/tinyxml/*") foreach (_file IN LISTS _inline_tinyxml) list (REMOVE_ITEM opmcore_SOURCES ${_file}) endforeach (_file) endif (TinyXML_FOUND) # anyhow remove it from the header list (so it doesn't get installed) list (REMOVE_ITEM opmcore_HEADERS "opm/core/utility/parameters/tinyxml/tinystr.h") list (REMOVE_ITEM opmcore_HEADERS "opm/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) endif (NOT HAVE_ERT) # 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) set (opm-core_CONFIG_VAR HAVE_AGMG HAVE_DUNE_ISTL HAVE_DYNAMIC_BOOST_TEST HAVE_ERT HAVE_SUITESPARSE_UMFPACK_H HAVE_NULLPTR HAVE_STATIC_ASSERT ) list (APPEND opm-core_CONFIG_VARS ${opm-core_CONFIG_VAR}) configure_vars ( FILE CXX "${PROJECT_BINARY_DIR}/config.h" WRITE ${opm-core_CONFIG_VARS} ) include (UseFortranWrappers) define_fc_func ( APPEND "${PROJECT_BINARY_DIR}/config.h" ) # some CMake properties do not do list expansion string (REPLACE ";" " " opm-core_LINKER_FLAGS_STR "${opm-core_LINKER_FLAGS}") # default to building a shared library, but let user override if (DEFINED BUILD_SHARED_LIBS) set (_shared_def ${BUILD_SHARED_LIBS}) else (DEFINED BUILD_SHARED_LIBS) set (_shared_def ON) endif (DEFINED BUILD_SHARED_LIBS) option (BUILD_opm-core_SHARED "Build opm-core as a shared library" ${_shared_def}) if (BUILD_opm-core_SHARED) set (opm-core_LIBRARY_TYPE SHARED) else (BUILD_opm-core_SHARED) set (opm-core_LIBRARY_TYPE STATIC) endif (BUILD_opm-core_SHARED) # create this library include_directories (${opm-core_INCLUDE_DIRS}) link_directories (${opm-core_LIBRARY_DIRS}) add_definitions (${opm-core_DEFINITIONS}) add_library (opmcore ${opm-core_LIBRARY_TYPE} ${opmcore_SOURCES}) set (opm-core_VERSION "${opm-core_VERSION_MAJOR}.${opm-core_VERSION_MINOR}") set_target_properties (opmcore PROPERTIES SOVERSION ${opm-core_VERSION_MAJOR} VERSION ${opm-core_VERSION} LINK_FLAGS "${opm-core_LINKER_FLAGS_STR}" ) target_link_libraries (opmcore ${opm-core_LIBRARIES}) # queue this executable to be stripped strip_debug_symbols (opmcore opm-core_DEBUG) # we need to know the name of the library which is generated get_target_property (opm-core_LIBRARY opmcore LOCATION) # write configuration file to locate library configure_file ( ${PROJECT_SOURCE_DIR}/opm-core-config.cmake.in ${PROJECT_BINARY_DIR}/opm-core-config.cmake @ONLY ) configure_file ( ${PROJECT_SOURCE_DIR}/opm-core-config-version.cmake.in ${PROJECT_BINARY_DIR}/opm-core-config-version.cmake @ONLY ) configure_vars ( FILE CMAKE "${PROJECT_BINARY_DIR}/opm-core-config.cmake" APPEND "${opm-core_CONFIG_VARS}" ) ### installation ### foreach (_hdr IN LISTS opmcore_HEADERS) get_filename_component (_dir ${_hdr} PATH) file (RELATIVE_PATH _rel_dir "${PROJECT_SOURCE_DIR}" "${_dir}") install ( FILES ${_hdr} DESTINATION include/${_rel_dir} ) endforeach (_hdr) install ( TARGETS opmcore LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} ) install ( FILES ${PROJECT_BINARY_DIR}/${opm-core_DEBUG} DESTINATION ${CMAKE_INSTALL_LIBDIR} ) install ( FILES dune.module DESTINATION ${CMAKE_INSTALL_LIBDIR_NOARCH}/dunecontrol/opm-core ) 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 (opm-core) ### test programs ### # find the source code file (GLOB_RECURSE tests_SOURCES "tests/[^.]*.c" "tests/[^.]*.cpp") # 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") # compile each of these separately add_custom_target (tests) foreach (test_FILE IN LISTS tests_SOURCES) get_filename_component (test_NAME "${test_FILE}" NAME_WE) add_executable (${test_NAME} EXCLUDE_FROM_ALL ${test_FILE}) add_dependencies (tests ${test_NAME}) set_target_properties (${test_NAME} PROPERTIES LINK_FLAGS "${opm-core_LINKER_FLAGS_STR}" ) target_link_libraries (${test_NAME} opmcore ${opm-core_LIBRARIES}) strip_debug_symbols (${test_NAME}) endforeach (test_FILE) # ideally this should run the tests, but for now we only test if they # compile without errors add_custom_target (check DEPENDS tests COMMENT Checking if library is functional VERBATIM ) ### documentation ### configure_file ( ${PROJECT_SOURCE_DIR}/Doxyfile.in ${PROJECT_BINARY_DIR}/Doxyfile @ONLY ) find_package (Doxygen) if (DOXYGEN_FOUND) add_custom_target (doc COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/Doxyfile SOURCES ${PROJECT_BINARY_DIR}/Doxyfile WORKING_DIRECTORY ${PROJECT_BINARY_DIR} COMMENT "Generating API documentation with Doxygen" VERBATIM ) set (_formats html) foreach (format IN LISTS _formats) string (TOUPPER ${format} FORMAT) install ( DIRECTORY ${PROJECT_BINARY_DIR}/Documentation/${format} DESTINATION share/doc/opm-core/ COMPONENT ${format} OPTIONAL ) # target to install just HTML documentation add_custom_target (install-${format} COMMAND ${CMAKE_COMMAND} -DCOMPONENT=${format} -P cmake_install.cmake COMMENT Installing ${FORMAT} documentation VERBATIM ) # since the documentation is optional, it is not automatically built add_dependencies (install-${format} doc) endforeach (format) endif (DOXYGEN_FOUND) ### clean in-source builds ### set (DISTCLEAN_FILES CMakeCache.txt cmake_install.cmake Makefile config.h opm-core-config.cmake opm-core-config-version.cmake opm-core-install.cmake Doxyfile ) set (DISTCLEAN_DIRS CMakeFiles/ ) add_custom_target (distclean COMMAND ${CMAKE_COMMAND} -E remove ${DISTCLEAN_FILES} COMMAND ${CMAKE_COMMAND} -E remove_directory ${DISTCLEAN_DIRS} # cannot depend on clean because it is only defined in the master Makefile # not in CMakeFiles/Makefile where this target will end up # DEPENDS clean WORKING_DIRECTORY ${PROJECT_BINARY_DIR} COMMENT Removing CMake-generated files VERBATIM ) # smart wrapper that auto-parallelizes builds file (COPY GNUmakefile DESTINATION ${PROJECT_BINARY_DIR} )