diff --git a/AMDiS/CMakeLists.txt b/AMDiS/CMakeLists.txt index d2ff853b7c6278b7ad7cc7fc42a43e6e45dd9160..b0adce4093aa48d6674ddf5484f67117f64bb836 100644 --- a/AMDiS/CMakeLists.txt +++ b/AMDiS/CMakeLists.txt @@ -2,12 +2,9 @@ set(CMAKE_LEGACY_CYGWIN_WIN32 0) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) project(AMDiS) -if (USE_NEW_CMAKE AND ${CMAKE_VERSION} VERSION_GREATER "3.2") - # Experimental implementation of new CMakeLists.txt - # Can be selected by calling cmake -DUSE_NEW_CMAKE=ON . - # Use only if you know what you are doing :-) - include(${AMDiS_SOURCE_DIR}/cmake3/CMakeLists.txt) +if (${CMAKE_VERSION} VERSION_GREATER "3.2") + include(${AMDiS_SOURCE_DIR}/cmake3/CMakeLists.txt) else () - # By defualt the classical CMakeLists file ist used - include(${AMDiS_SOURCE_DIR}/cmake/CMakeLists.txt) + # Fallback to classical CMakeLists file + include(${AMDiS_SOURCE_DIR}/cmake/CMakeLists.txt) endif () diff --git a/AMDiS/cmake/AMDISConfig.cmake.in b/AMDiS/cmake/AMDISConfig.cmake.in index 31aaee1a1f8c819cca16e2381434db34d2c6942e..d7057d007c6e6ba5472f6c4f527f2573f647a243 100644 --- a/AMDiS/cmake/AMDISConfig.cmake.in +++ b/AMDiS/cmake/AMDISConfig.cmake.in @@ -157,11 +157,23 @@ endif (AMDIS_NEED_CXX11) #load mpi-compiler for use with parmetis and parallel_domain if(AMDIS_HAS_PARALLEL_DOMAIN) find_package(MPI REQUIRED) - if(MPI_FOUND) - list(APPEND AMDIS_LIBRARIES ${MPI_LIBRARIES}) - list(APPEND AMDIS_COMPILEFLAGS ${MPI_COMPILE_FLAGS}) - list(APPEND AMDIS_INCLUDE_DIRS ${MPI_INCLUDE_PATH}) - endif(MPI_FOUND) + list(APPEND AMDIS_LIBRARIES ${MPI_LIBRARIES}) + list(APPEND AMDIS_COMPILEFLAGS ${MPI_COMPILE_FLAGS}) + list(APPEND AMDIS_INCLUDE_DIRS ${MPI_INCLUDE_PATH}) + + find_library(PARMETIS_LIB parmetis) + if(PARMETIS_LIB) + list(APPEND AMDIS_LIBRARIES ${PARMETIS_LIB}) + else(PARMETIS_LIB) + message(FATAL_ERROR "could not find the parmetis libraries needed by amdis") + endif(PARMETIS_LIB) + find_library(METIS_LIB metis) + if(METIS_LIB) + list(APPEND AMDIS_LIBRARIES ${METIS_LIB}) + else(METIS_LIB) + message(FATAL_ERROR "could not find the metis libraries needed by amdis") + endif(METIS_LIB) + if(AMDIS_HAS_PARALLEL_DOMAIN STREQUAL "PETSC") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${AMDIS_DIR}) set(PETSC_EXECUTABLE_RUNS ON) @@ -175,18 +187,6 @@ if(AMDIS_HAS_PARALLEL_DOMAIN) elseif(AMDIS_HAS_PARALLEL_DOMAIN STREQUAL "PMTL") find_package(MTL REQUIRED) list(APPEND AMDIS_LIBRARIES ${MTL_LIBRARIES}) - find_library(PARMETIS_LIB parmetis) - if(PARMETIS_LIB) - list(APPEND AMDIS_LIBRARIES ${PARMETIS_LIB}) - else(PARMETIS_LIB) - message(FATAL_ERROR "could not find the parmetis libraries needed by amdis") - endif(PARMETIS_LIB) - find_library(METIS_LIB metis) - if(METIS_LIB) - list(APPEND AMDIS_LIBRARIES ${METIS_LIB}) - else(METIS_LIB) - message(FATAL_ERROR "could not find the metis libraries needed by amdis") - endif(METIS_LIB) endif() elseif(AMDIS_NEED_SEQ_PETSC) diff --git a/AMDiS/cmake/AMDISUse.cmake b/AMDiS/cmake/AMDISUse.cmake index 8087fe857af2ff1616e56a0d50b7b9ceb5d99849..a80f9c805c0764a4080fde33cd20d93932e71401 100644 --- a/AMDiS/cmake/AMDISUse.cmake +++ b/AMDiS/cmake/AMDISUse.cmake @@ -1,4 +1,4 @@ -#thats bad because it affects each target +# globally add compile options and include directories add_definitions(${AMDIS_COMPILEFLAGS}) include_directories(${AMDIS_INCLUDE_DIRS}) diff --git a/AMDiS/cmake/CMakeLists.txt b/AMDiS/cmake/CMakeLists.txt index 21b5ec2a560bd78d78dba9ecbd6c6a59c95f6123..032cdd01a57f70ca9b52032440047172a8e7a680 100644 --- a/AMDiS/cmake/CMakeLists.txt +++ b/AMDiS/cmake/CMakeLists.txt @@ -25,12 +25,12 @@ SET(MTL_INCLUDE_DIR ${LIB_DIR}/mtl4/ CACHE PATH "mtl4 directory") # #message("svn-rev: ${svn_info_WC_REVISION}") # set(AMDIS_SUB_MINOR "${svn_info_WC_REVISION}") # endif() -set(CurrentRevision "0.9") +set(CurrentRevision "1.1") if(NOT AMDIS_MAJOR) - set(AMDIS_MAJOR "0") + set(AMDIS_MAJOR "1") endif() if(NOT AMDIS_MINOR) - set(AMDIS_MINOR "9") + set(AMDIS_MINOR "1") endif() list(APPEND COMPILEFLAGS "-DAMDIS_VERSION=${CurrentRevision}") diff --git a/AMDiS/cmake/enable_cxx11.cmake b/AMDiS/cmake/enable_cxx11.cmake index 40aee58b328de48a40742a24249ed50af6047730..8b628c469950c0ad83e8bc80e5e7df1c4b7e5435 100644 --- a/AMDiS/cmake/enable_cxx11.cmake +++ b/AMDiS/cmake/enable_cxx11.cmake @@ -1,44 +1,36 @@ -# enable the c++11 features. From cmake version 3.0 this is simply done by setting -# the cxx_standard variables. For older cmake version the compile-flags must be added manually. +include(CheckCXXCompilerFlag) +include(CheckCXXSourceCompiles) +include(CheckIncludeFileCXX) + if (ENABLE_CXX11) - list(APPEND COMPILEFLAGS "-DHAS_CXX11=1") - if (${CMAKE_VERSION} VERSION_GREATER "3.0") - set(CMAKE_CXX_STANDARD 11) - set(CMAKE_CXX_STANDARD_REQUIRED ON) - if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") # cmake can not detect intel compile features - set(REQUIRED_CXX_FEATURES "cxx_alias_templates" "cxx_auto_type" "cxx_lambdas" "cxx_override" "cxx_range_for" "cxx_static_assert" "cxx_variadic_templates") + check_cxx_compiler_flag("-std=c++11" COMPILER_SUPPORTS_CXX11_FLAG) + + set(CXX11_CODE " + #include + #include + template using A = std::tuple; + int main(){ + decltype(1) vec[]={1,2,3}; + for(auto&& x:vec); + }") + + if (COMPILER_SUPPORTS_CXX11_FLAG) + set(CMAKE_REQUIRED_FLAGS "-std=c++11") + check_cxx_source_compiles("${CXX11_CODE}" CXX11_COMPILES_WITH_CXX11_FLAG) + set(CMAKE_REQUIRED_FLAGS "") + endif () + + if (COMPILER_SUPPORTS_CXX11_FLAG AND CXX11_COMPILES_WITH_CXX11_FLAG) + add_definitions("-std=c++11") + else () + check_cxx_source_compiles("${CXX11_CODE}" CXX11_COMPILES) + + if (NOT CXX11_COMPILES) + message (FATAL_ERROR "Compiler does not support C++11.") + endif () + endif () - add_library(test_compiler_features cmake/dummy.cc) - foreach(feature ${REQUIRED_CXX_FEATURES}) - target_compile_features(test_compiler_features PUBLIC ${feature}) - endforeach(feature) - endif () - else() - if (CMAKE_COMPILER_IS_GNUCXX) - set(GXX_MIN_VER "4.8") - if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS GXX_MIN_VER) - message (FATAL_ERROR "For C++11-Features the G++ Compiler must be at least version $GXX_MIN_VER") - endif () - list(APPEND COMPILEFLAGS "-std=gnu++11") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - set(CLANG_MIN_VER "3.0") - if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS CLANG_MIN_VER) - message (FATAL_ERROR "For C++11-Features the Clang Compiler must be at least version $CLANG_MIN_VER") - endif () - list(APPEND COMPILEFLAGS "-std=c++11") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") - set(INTEL_MIN_VER "12.1") - if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS INTEL_MIN_VER) - message (FATAL_ERROR "For C++11-Features the Intel C++ Compiler must be at least version $INTEL_MIN_VER") - endif () - list(APPEND COMPILEFLAGS "-std=c++11") - elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - set(MSVC_MIN_VER "12.0") - if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS MSVC_MIN_VER) - message (FATAL_ERROR "For C++11-Features the MSVC C++ Compiler must be at least version $MSVC_MIN_VER") - endif () - endif () - endif() + list(APPEND COMPILEFLAGS "-DHAS_CXX11=1") else () - list(APPEND COMPILEFLAGS "-DHAS_CXX11=0") + list(APPEND COMPILEFLAGS "-DHAS_CXX11=0") endif (ENABLE_CXX11) diff --git a/AMDiS/cmake3/AMDISConfig.cmake.in b/AMDiS/cmake3/AMDISConfig.cmake.in index 0396fdf849fdcd4bfaa3c68edc53e2acb780587d..e829ab28cb68b1be9d13c6943024b62c024a1218 100644 --- a/AMDiS/cmake3/AMDISConfig.cmake.in +++ b/AMDiS/cmake3/AMDISConfig.cmake.in @@ -14,8 +14,8 @@ # target_link_libraries(yourTarget AMDiS) # -if (${CMAKE_VERSION} VERSION_LESS "3.0") - message(FATAL_ERROR "The Configuration file was created for CMake version >= 3.0") +if (${CMAKE_VERSION} VERSION_LESS "3.2") + message(FATAL_ERROR "The Configuration file was created for CMake version >= 3.2") endif () list(APPEND CMAKE_MODULE_PATH ${AMDIS_DIR}) @@ -36,14 +36,16 @@ set(AMDIS_NEED_COMPOSITE_FEM @ENABLE_COMPOSITE_FEM@) set(BUILD_SHARED_LIBS @BUILD_SHARED_LIBS@) set(CMAKE_BUILD_TYPE @CMAKE_BUILD_TYPE@) +include(FindPkgConfig) + add_library(amdis_base INTERFACE) add_library(AMDiS ALIAS amdis_base) target_compile_definitions(amdis_base INTERFACE) if (AMDIS_NEED_CXX11) - set(CMAKE_CXX_STANDARD 11) - set(CMAKE_CXX_STANDARD_REQUIRED ON) + include(test_compile_features) + target_enable_cxx11(AMDIS_NEED_CXX11 amdis_base INTERFACE) target_compile_definitions(amdis_base INTERFACE HAS_CXX11=1) else () target_compile_definitions(amdis_base INTERFACE HAS_CXX11=0) @@ -82,7 +84,8 @@ endif (NOT BOOST_ROOT) if (NOT BOOST_LIBRARYDIR) set(BOOST_LIBRARYDIR @BOOST_LIBRARYDIR@) endif (NOT BOOST_LIBRARYDIR) -include(find_boost) +include(target_enable_boost) +target_enable_boost(amdis_base INTERFACE ON) # umfpack library # -------------------- @@ -90,7 +93,8 @@ if (AMDIS_NEED_UMFPACK) set(AMDIS_SuiteSparse_DIR @SuiteSparse_DIR@) set(AMDIS_UMFPACK_INCLUDE_DIR @UMFPACK_INCLUDE_DIRS@) set(AMDIS_UMFPACK_LIB_DIR ${AMDIS_UMFPACK_INCLUDE_DIR}/../include) - include(find_umfpack) + include(target_enable_umfpack) + target_enable_umfpack(amdis_base INTERFACE ON) endif (AMDIS_NEED_UMFPACK) @@ -100,27 +104,9 @@ if (AMDIS_HAS_PARALLEL_DOMAIN) target_compile_definitions(amdis_base INTERFACE HAVE_PARALLEL_DOMAIN_AMDIS=1) - find_package(MPI REQUIRED) - if (MPI_FOUND) - target_include_directories(amdis_base INTERFACE ${MPI_INCLUDE_PATH}) - target_compile_options(amdis_base INTERFACE ${MPI_COMPILE_FLAGS}) - target_link_libraries(amdis_base INTERFACE ${MPI_LIBRARIES}) - endif (MPI_FOUND) - - set(PETSC_EXECUTABLE_RUNS ON) - set(AMDIS_PETSC_DIR @PETSC_DIR@) - include(find_petsc) - if (PETSc_FOUND) - target_include_directories(amdis_base INTERFACE ${PETSC_INCLUDES}) - target_link_libraries(amdis_base INTERFACE - ${PETSC_LIBRARY_SYS} - ${PETSC_LIBRARIES} - blas lapack) - target_compile_definitions(amdis_base INTERFACE - HAVE_PARALLEL_PETSC=1) - else() - message(FATAL_ERROR "Could not find PETSc!") - endif (PETSc_FOUND) + include(target_enable_petsc) + target_enable_mpi(amdis_base INTERFACE ON) + target_enable_petsc(amdis_base INTERFACE ON) endif (AMDIS_HAS_PARALLEL_DOMAIN) @@ -188,12 +174,19 @@ unset(_MUPARSER_LIB CACHE) # Zoltan library # -------------- if (AMDIS_NEED_ZOLTAN) - find_library(ZOLTAN_LIB zoltan HINTS ENV LIBRARY_PATH DOC "Full path to the zoltan library") - if (ZOLTAN_LIB) - target_link_libraries(amdis_base INTERFACE ${ZOLTAN_LIB}) - else() - message(FATAL_ERROR "Could not find zoltan library!") - endif() + include(target_enable_zoltan) + target_enable_zoltan(amdis_base INTERFACE ON) endif () -set(AMDIS_LIBRARIES AMDiS) +# Extract some variables from INTERFACE target AMDiS +get_target_property(AMDIS_INCLUDE_DIRS AMDiS INTERFACE_INCLUDE_DIRECTORIES) +get_target_property(AMDIS_LIBRARIES AMDiS INTERFACE_LINK_LIBRARIES) +get_target_property(AMDIS_COMPILEFLAGS AMDiS INTERFACE_COMPILE_OPTIONS) +if (NOT AMDIS_COMPILEFLAGS) + set(AMDIS_COMPILEFLAGS "") +endif() + +get_target_property(_DEFINITIONS AMDiS INTERFACE_COMPILE_DEFINITIONS) +foreach(defn ${_DEFINITIONS}) + list(APPEND AMDIS_COMPILEFLAGS "-D${defn}") +endforeach(defn) diff --git a/AMDiS/cmake3/AMDISUse.cmake b/AMDiS/cmake3/AMDISUse.cmake index a7c5094032e0153ae4d2440d6fc51b5db46f68a8..b8f70ce059c49125d973cdbec4e31b352e4803d1 100644 --- a/AMDiS/cmake3/AMDISUse.cmake +++ b/AMDiS/cmake3/AMDISUse.cmake @@ -1 +1,3 @@ -message(STATUS "To compile your program with AMDiS simply add the target 'AMDiS' to the target_link_libraries(...) command") \ No newline at end of file +# globally add compile options and include directories +add_definitions(${AMDIS_COMPILEFLAGS}) +include_directories(${AMDIS_INCLUDE_DIRS}) diff --git a/AMDiS/cmake3/CMakeLists.txt b/AMDiS/cmake3/CMakeLists.txt index ccc960a6cad93b02928c5aefe844f878bb02d710..cc40112f7a0d5a25dfd714e44929bf13fd2c62e5 100644 --- a/AMDiS/cmake3/CMakeLists.txt +++ b/AMDiS/cmake3/CMakeLists.txt @@ -1,7 +1,5 @@ cmake_minimum_required(VERSION 3.2 FATAL_ERROR) -project(AMDiS VERSION 0.9 LANGUAGES CXX) - -message(WARNING "This is an experimental CMakeLists.txt file.") +project(AMDiS VERSION 1.1 LANGUAGES CXX) set(BASE_DIR ${AMDiS_SOURCE_DIR}) set(SOURCE_DIR ${BASE_DIR}/src) @@ -11,6 +9,7 @@ if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release" CACHE STRING "") endif () +include(FindPkgConfig) # ------------------------------------------------------------------------------ #some options to control the build process @@ -32,14 +31,9 @@ option(BUILD_SHARED_LIBS "Build all libraries as shared or static, default: shar mark_as_advanced(BUILD_SHARED_LIBS) if (MSVC) -# if (${CMAKE_VERSION} VERSION_LESS "3.4") - set(BUILD_SHARED_LIBS false) - mark_as_advanced(BUILD_SHARED_LIBS) - message(WARNING "Currently we can only build static libraries with Visual Studio") -# elseif (BUILD_SHARED_LIBS) -# set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS true) -# set(MSVC_SHARED_LIBS true) -# endif () + set(BUILD_SHARED_LIBS false) + mark_as_advanced(BUILD_SHARED_LIBS) + message(WARNING "Currently we can only build static libraries with Visual Studio") endif (MSVC) # ------------------------------------------------------------------------------ @@ -49,22 +43,12 @@ add_library(amdis_base INTERFACE) add_library(AMDiS::base ALIAS amdis_base) target_include_directories(amdis_base INTERFACE ${SOURCE_DIR}) -target_compile_definitions(amdis_base INTERFACE - $<$:DEBUG=0> - $<$>:DEBUG=1>) +target_compile_definitions(amdis_base INTERFACE) include(test_compile_features) -test_compile_features(ENABLE_CXX11 amdis_base INTERFACE - cxx_alias_templates - cxx_auto_type - cxx_lambdas - cxx_override - cxx_range_for - cxx_static_assert - cxx_variadic_templates) +target_enable_cxx11(ENABLE_CXX11 amdis_base INTERFACE) + if (ENABLE_CXX11) -# set(CMAKE_CXX_STANDARD 11) -# set(CMAKE_CXX_STANDARD_REQUIRED ON) target_compile_definitions(amdis_base INTERFACE HAS_CXX11=1) else () target_compile_definitions(amdis_base INTERFACE HAS_CXX11=0) @@ -75,10 +59,15 @@ endif (ENABLE_CXX11) include(find_mtl4) # -> target mtl4 install(FILES ${BASE_DIR}/cmake3/find_mtl4.cmake DESTINATION share/amdis/) -include(find_umfpack) +if (ENABLE_UMFPACK) + include(target_enable_umfpack) # -> target boost + target_enable_umfpack(amdis_base INTERFACE) + install(FILES ${BASE_DIR}/cmake3/target_enable_umfpack.cmake DESTINATION share/amdis/) +endif (ENABLE_UMFPACK) -include(find_boost) # -> target boost -install(FILES ${BASE_DIR}/cmake3/find_boost.cmake DESTINATION share/amdis/) +include(target_enable_boost) # -> target boost +target_enable_boost(amdis_base INTERFACE) +install(FILES ${BASE_DIR}/cmake3/target_enable_boost.cmake DESTINATION share/amdis/) # ------------------------------------------------------------------------------ @@ -236,9 +225,9 @@ endif (ENABLE_COMPOSITE_FEM) # ------------------------------------------------------------------------------ if (MSVC) - target_compile_definitions(amdis PRIVATE - _SCL_SECURE_NO_WARNINGS - _CRT_SECURE_NO_WARNINGS) + target_compile_definitions(amdis PRIVATE + _SCL_SECURE_NO_WARNINGS + _CRT_SECURE_NO_WARNINGS) endif (MSVC) target_link_libraries(amdis AMDiS::base muparser) @@ -266,5 +255,4 @@ configure_file(${BASE_DIR}/cmake3/AMDISConfig.cmake.in install(FILES ${AMDiS_BINARY_DIR}/AMDISConfig.cmake DESTINATION share/amdis/) install(FILES ${BASE_DIR}/cmake3/AMDISUse.cmake DESTINATION share/amdis/) -install(FILES ${BASE_DIR}/cmake3/test_compile_features.cmake DESTINATION share/amdis/) -install(FILES ${BASE_DIR}/cmake3/dummy.cc DESTINATION share/amdis/) +install(FILES ${BASE_DIR}/cmake3/test_compile_features.cmake DESTINATION share/amdis/) \ No newline at end of file diff --git a/AMDiS/cmake3/CorrectWindowsPaths.cmake b/AMDiS/cmake3/CorrectWindowsPaths.cmake new file mode 100644 index 0000000000000000000000000000000000000000..09bcdd67dcd04fd001d2b7acbd904b5014ebe42b --- /dev/null +++ b/AMDiS/cmake3/CorrectWindowsPaths.cmake @@ -0,0 +1,14 @@ +# CorrectWindowsPaths - this module defines one macro +# +# CONVERT_CYGWIN_PATH( PATH ) +# This uses the command cygpath (provided by cygwin) to convert +# unix-style paths into paths useable by cmake on windows + +macro (CONVERT_CYGWIN_PATH _path) + if (WIN32) + EXECUTE_PROCESS(COMMAND cygpath.exe -m ${${_path}} + OUTPUT_VARIABLE ${_path}) + string (STRIP ${${_path}} ${_path}) + endif (WIN32) +endmacro (CONVERT_CYGWIN_PATH) + diff --git a/AMDiS/cmake3/find_petsc.cmake b/AMDiS/cmake3/FindPETSc.cmake similarity index 62% rename from AMDiS/cmake3/find_petsc.cmake rename to AMDiS/cmake3/FindPETSc.cmake index 34e2b2fa0b09e1ce81b8052c994f7322b88f9e65..2be7d1484ea5dbe6bee9a7d9c414588f4eb12039 100644 --- a/AMDiS/cmake3/find_petsc.cmake +++ b/AMDiS/cmake3/FindPETSc.cmake @@ -1,4 +1,3 @@ -# source: https://github.com/jedbrown/cmake-modules/blob/master/FindPETSc.cmake # - Try to find PETSc # Once done this will define # @@ -10,8 +9,10 @@ # PETSC_MPIEXEC - Executable for running MPI programs # PETSC_VERSION - Version string (MAJOR.MINOR.SUBMINOR) # -# Hack: PETSC_VERSION currently decides on the version based on the -# layout. Otherwise we need to run C code to determine the version. +# Usage: +# find_package(PETSc COMPONENTS CXX) - required if build --with-clanguage=C++ --with-c-support=0 +# find_package(PETSc COMPONENTS C) - standard behavior of checking build using a C compiler +# find_package(PETSc) - same as above # # Setting these changes the behavior of the search # PETSC_DIR - directory in which PETSc resides @@ -21,6 +22,31 @@ # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # +set(PETSC_VALID_COMPONENTS + C + CXX) + +if(NOT PETSc_FIND_COMPONENTS) + set(PETSC_LANGUAGE_BINDINGS "C") +else() + # Right now, this is designed for compatability with the --with-clanguage option, so + # only allow one item in the components list. + list(LENGTH ${PETSc_FIND_COMPONENTS} components_length) + if(${components_length} GREATER 1) + message(FATAL_ERROR "Only one component for PETSc is allowed to be specified") + endif() + # This is a stub for allowing multiple components should that time ever come. Perhaps + # to also test Fortran bindings? + foreach(component ${PETSc_FIND_COMPONENTS}) + list(FIND PETSC_VALID_COMPONENTS ${component} component_location) + if(${component_location} EQUAL -1) + message(FATAL_ERROR "\"${component}\" is not a valid PETSc component.") + else() + list(APPEND PETSC_LANGUAGE_BINDINGS ${component}) + endif() + endforeach() +endif() + function (petsc_get_version) if (EXISTS "${PETSC_DIR}/include/petscversion.h") file (STRINGS "${PETSC_DIR}/include/petscversion.h" vstrings REGEX "#define PETSC_VERSION_(RELEASE|MAJOR|MINOR|SUBMINOR|PATCH) ") @@ -42,14 +68,21 @@ function (petsc_get_version) endif () endfunction () -if (PETSC_DIR) - file(TO_CMAKE_PATH ${PETSC_DIR} PETSC_DIR) -endif (PETSC_DIR) - find_path (PETSC_DIR include/petsc.h - HINTS ${AMDIS_PETSC_DIR} $ENV{HOME}/petsc ENV PETSC_DIR + HINTS /usr/lib/petsc ENV PETSC_DIR + PATHS + # Debian paths + /usr/lib/petscdir/3.5.1 /usr/lib/petscdir/3.5 + /usr/lib/petscdir/3.4.2 /usr/lib/petscdir/3.4 + /usr/lib/petscdir/3.3 /usr/lib/petscdir/3.2 /usr/lib/petscdir/3.1 + /usr/lib/petscdir/3.0.0 /usr/lib/petscdir/2.3.3 /usr/lib/petscdir/2.3.2 + # MacPorts path + /opt/local/lib/petsc + $ENV{HOME}/petsc DOC "PETSc Directory") +find_program (MAKE_EXECUTABLE NAMES make gmake) + if (PETSC_DIR AND NOT PETSC_ARCH) set (_petsc_arches $ENV{PETSC_ARCH} # If set, use environment variable first @@ -59,11 +92,11 @@ if (PETSC_DIR AND NOT PETSC_ARCH) foreach (arch ${_petsc_arches}) if (NOT PETSC_ARCH) find_path (petscconf petscconf.h - HINTS ${PETSC_DIR} - PATH_SUFFIXES ${arch}/include bmake/${arch} - NO_DEFAULT_PATH) + HINTS ${PETSC_DIR} + PATH_SUFFIXES ${arch}/include bmake/${arch} + NO_DEFAULT_PATH) if (petscconf) - set (PETSC_ARCH "${arch}" CACHE STRING "PETSc build architecture") + set (PETSC_ARCH "${arch}" CACHE STRING "PETSc build architecture") endif (petscconf) endif (NOT PETSC_ARCH) endforeach (arch) @@ -79,25 +112,22 @@ find_package_multipass (PETSc petsc_config_current # Determine whether the PETSc layout is old-style (through 2.3.3) or # new-style (>= 3.0.0) -if (EXISTS "${PETSC_DIR}/${PETSC_ARCH}/include/petscconf.h") # > 2.3.3 - if (EXISTS "${PETSC_DIR}/conf/rules") - set (petsc_conf_rules "${PETSC_DIR}/conf/rules") - set (petsc_conf_variables "${PETSC_DIR}/conf/variables") - else () - set (petsc_conf_rules "${PETSC_DIR}/lib/petsc/conf/rules") - set (petsc_conf_variables "${PETSC_DIR}/lib/petsc/conf/variables") - endif () +if (EXISTS "${PETSC_DIR}/${PETSC_ARCH}/lib/petsc/conf/petscvariables") # > 3.5 + set (petsc_conf_rules "${PETSC_DIR}/lib/petsc/conf/rules") + set (petsc_conf_variables "${PETSC_DIR}/lib/petsc/conf/variables") +elseif (EXISTS "${PETSC_DIR}/${PETSC_ARCH}/include/petscconf.h") # > 2.3.3 + set (petsc_conf_rules "${PETSC_DIR}/conf/rules") + set (petsc_conf_variables "${PETSC_DIR}/conf/variables") elseif (EXISTS "${PETSC_DIR}/bmake/${PETSC_ARCH}/petscconf.h") # <= 2.3.3 set (petsc_conf_rules "${PETSC_DIR}/bmake/common/rules") set (petsc_conf_variables "${PETSC_DIR}/bmake/common/variables") elseif (PETSC_DIR) message (SEND_ERROR "The pair PETSC_DIR=${PETSC_DIR} PETSC_ARCH=${PETSC_ARCH} do not specify a valid PETSc installation") -else () - message (FATAL_ERROR "PETSc could not be found. Be sure to set PETSC_DIR and PETSC_ARCH.") endif () -petsc_get_version() if (petsc_conf_rules AND petsc_conf_variables AND NOT petsc_config_current) + petsc_get_version() + # Put variables into environment since they are needed to get # configuration (petscvariables) in the PETSc makefile set (ENV{PETSC_DIR} "${PETSC_DIR}") @@ -112,12 +142,12 @@ if (petsc_conf_rules AND petsc_conf_variables AND NOT petsc_config_current) include ${petsc_conf_rules} include ${petsc_conf_variables} show : - -@echo -n \${\${VARIABLE}} +\t-@echo -n \${\${VARIABLE}} ") macro (PETSC_GET_VARIABLE name var) set (${var} "NOTFOUND" CACHE INTERNAL "Cleared" FORCE) - execute_process (COMMAND ${CMAKE_MAKE_PROGRAM} --no-print-directory -f ${petsc_config_makefile} show VARIABLE=${name} + execute_process (COMMAND ${MAKE_EXECUTABLE} --no-print-directory -f ${petsc_config_makefile} show VARIABLE=${name} OUTPUT_VARIABLE ${var} RESULT_VARIABLE petsc_return) endmacro (PETSC_GET_VARIABLE) @@ -126,6 +156,7 @@ show : petsc_get_variable (PETSC_CCPPFLAGS petsc_cpp_line) petsc_get_variable (PETSC_INCLUDE petsc_include) petsc_get_variable (PCC petsc_cc) + petsc_get_variable (PCC_FLAGS petsc_cc_flags) petsc_get_variable (MPIEXEC petsc_mpiexec) # We are done with the temporary Makefile, calling PETSC_GET_VARIABLE after this point is invalid! file (REMOVE ${petsc_config_makefile}) @@ -134,11 +165,39 @@ show : # Extract include paths and libraries from compile command line resolve_includes (petsc_includes_all "${petsc_cpp_line}") + #on windows we need to make sure we're linking against the right + #runtime library + if (WIN32) + if (petsc_cc_flags MATCHES "-MT") + set(using_md False) + foreach(flag_var + CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + if(${flag_var} MATCHES "/MD") + set(using_md True) + endif(${flag_var} MATCHES "/MD") + endforeach(flag_var) + if(${using_md} MATCHES "True") + message(WARNING "PETSc was built with /MT, but /MD is currently set. + See http://www.cmake.org/Wiki/CMake_FAQ#How_can_I_build_my_MSVC_application_with_a_static_runtime.3F") + endif(${using_md} MATCHES "True") + endif (petsc_cc_flags MATCHES "-MT") + endif (WIN32) + + include (CorrectWindowsPaths) + convert_cygwin_path(petsc_lib_dir) message (STATUS "petsc_lib_dir ${petsc_lib_dir}") macro (PETSC_FIND_LIBRARY suffix name) set (PETSC_LIBRARY_${suffix} "NOTFOUND" CACHE INTERNAL "Cleared" FORCE) # Clear any stale value, if we got here, we need to find it again - find_library (PETSC_LIBRARY_${suffix} NAMES ${name} HINTS ${petsc_lib_dir} NO_DEFAULT_PATH) + if (WIN32) + set (libname lib${name}) #windows expects "libfoo", linux expects "foo" + else (WIN32) + set (libname ${name}) + endif (WIN32) + find_library (PETSC_LIBRARY_${suffix} NAMES ${libname} HINTS ${petsc_lib_dir} NO_DEFAULT_PATH) set (PETSC_LIBRARIES_${suffix} "${PETSC_LIBRARY_${suffix}}") mark_as_advanced (PETSC_LIBRARY_${suffix}) endmacro (PETSC_FIND_LIBRARY suffix name) @@ -175,29 +234,42 @@ show : message (STATUS "Recognized PETSc install with single library for all packages") endif () - include (CheckCSourceRuns) + include(Check${PETSC_LANGUAGE_BINDINGS}SourceRuns) macro (PETSC_TEST_RUNS includes libraries runs) - multipass_c_source_runs ("${includes}" "${libraries}" " + if(${PETSC_LANGUAGE_BINDINGS} STREQUAL "C") + set(_PETSC_ERR_FUNC "CHKERRQ(ierr)") + elseif(${PETSC_LANGUAGE_BINDINGS} STREQUAL "CXX") + set(_PETSC_ERR_FUNC "CHKERRXX(ierr)") + endif() + if (PETSC_VERSION VERSION_GREATER 3.1) + set (_PETSC_TSDestroy "TSDestroy(&ts)") + else () + set (_PETSC_TSDestroy "TSDestroy(ts)") + endif () + + set(_PETSC_TEST_SOURCE " static const char help[] = \"PETSc test program.\"; -#include \"petscts.h\" +#include int main(int argc,char *argv[]) { PetscErrorCode ierr; TS ts; - ierr = PetscInitialize(&argc,&argv,0,help);CHKERRQ(ierr); - ierr = TSCreate(PETSC_COMM_WORLD,&ts);CHKERRQ(ierr); - ierr = TSSetFromOptions(ts);CHKERRQ(ierr); - ierr = TSDestroy(ts);CHKERRQ(ierr); - ierr = PetscFinalize();CHKERRQ(ierr); + ierr = PetscInitialize(&argc,&argv,0,help);${_PETSC_ERR_FUNC}; + ierr = TSCreate(PETSC_COMM_WORLD,&ts);${_PETSC_ERR_FUNC}; + ierr = TSSetFromOptions(ts);${_PETSC_ERR_FUNC}; + ierr = ${_PETSC_TSDestroy};${_PETSC_ERR_FUNC}; + ierr = PetscFinalize();${_PETSC_ERR_FUNC}; return 0; } -" ${runs}) +") + multipass_source_runs ("${includes}" "${libraries}" "${_PETSC_TEST_SOURCE}" ${runs} "${PETSC_LANGUAGE_BINDINGS}") if (${${runs}}) set (PETSC_EXECUTABLE_RUNS "YES" CACHE BOOL - "Can the system successfully run a PETSc executable? This variable can be manually set to \"YES\" to force CMake to accept a given PETSc configuration, but this will almost always result in a broken build. If you change PETSC_DIR, PETSC_ARCH, or PETSC_CURRENT you would have to reset this variable." FORCE) + "Can the system successfully run a PETSc executable? This variable can be manually set to \"YES\" to force CMake to accept a given PETSc configuration, but this will almost always result in a broken build. If you change PETSC_DIR, PETSC_ARCH, or PETSC_CURRENT you would have to reset this variable." FORCE) endif (${${runs}}) endmacro (PETSC_TEST_RUNS) + find_path (PETSC_INCLUDE_DIR petscts.h HINTS "${PETSC_DIR}" PATH_SUFFIXES include NO_DEFAULT_PATH) find_path (PETSC_INCLUDE_CONF petscconf.h HINTS "${PETSC_DIR}" PATH_SUFFIXES "${PETSC_ARCH}/include" "bmake/${PETSC_ARCH}" NO_DEFAULT_PATH) mark_as_advanced (PETSC_INCLUDE_DIR PETSC_INCLUDE_CONF) @@ -207,7 +279,7 @@ int main(int argc,char *argv[]) { if (petsc_works_minimal) message (STATUS "Minimal PETSc includes and libraries work. This probably means we are building with shared libs.") set (petsc_includes_needed "${petsc_includes_minimal}") - else (petsc_works_minimal) # Minimal includes fail, see if just adding full includes fixes it + else (petsc_works_minimal) # Minimal includes fail, see if just adding full includes fixes it petsc_test_runs ("${petsc_includes_all}" "${PETSC_LIBRARIES_TS}" petsc_works_allincludes) if (petsc_works_allincludes) # It does, we just need all the includes ( message (STATUS "PETSc requires extra include paths, but links correctly with only interface libraries. This is an unexpected configuration (but it seems to work fine).") @@ -215,21 +287,21 @@ int main(int argc,char *argv[]) { else (petsc_works_allincludes) # We are going to need to link the external libs explicitly resolve_libraries (petsc_libraries_external "${petsc_libs_external}") foreach (pkg SYS VEC MAT DM KSP SNES TS ALL) - list (APPEND PETSC_LIBRARIES_${pkg} ${petsc_libraries_external}) + list (APPEND PETSC_LIBRARIES_${pkg} ${petsc_libraries_external}) endforeach (pkg) petsc_test_runs ("${petsc_includes_minimal}" "${PETSC_LIBRARIES_TS}" petsc_works_alllibraries) if (petsc_works_alllibraries) - message (STATUS "PETSc only need minimal includes, but requires explicit linking to all dependencies. This is expected when PETSc is built with static libraries.") - set (petsc_includes_needed ${petsc_includes_minimal}) + message (STATUS "PETSc only need minimal includes, but requires explicit linking to all dependencies. This is expected when PETSc is built with static libraries.") + set (petsc_includes_needed ${petsc_includes_minimal}) else (petsc_works_alllibraries) - # It looks like we really need everything, should have listened to Matt - set (petsc_includes_needed ${petsc_includes_all}) - petsc_test_runs ("${petsc_includes_all}" "${PETSC_LIBRARIES_TS}" petsc_works_all) - if (petsc_works_all) # We fail anyways - message (STATUS "PETSc requires extra include paths and explicit linking to all dependencies. This probably means you have static libraries and something unexpected in PETSc headers.") - else (petsc_works_all) # We fail anyways - message (STATUS "PETSc could not be used, maybe the install is broken.") - endif (petsc_works_all) + # It looks like we really need everything, should have listened to Matt + set (petsc_includes_needed ${petsc_includes_all}) + petsc_test_runs ("${petsc_includes_all}" "${PETSC_LIBRARIES_TS}" petsc_works_all) + if (petsc_works_all) # We fail anyways + message (STATUS "PETSc requires extra include paths and explicit linking to all dependencies. This probably means you have static libraries and something unexpected in PETSc headers.") + else (petsc_works_all) # We fail anyways + message (STATUS "PETSc could not be used, maybe the install is broken.") + endif (petsc_works_all) endif (petsc_works_alllibraries) endif (petsc_works_allincludes) endif (petsc_works_minimal) diff --git a/AMDiS/cmake3/FindPackageMultipass.cmake b/AMDiS/cmake3/FindPackageMultipass.cmake index 7199e026db92465e81d2e730a4720a722fce4ff4..fbf06a7f0fc3aa20a0387f091eac4f74e7ffdab2 100644 --- a/AMDiS/cmake3/FindPackageMultipass.cmake +++ b/AMDiS/cmake3/FindPackageMultipass.cmake @@ -21,7 +21,14 @@ # # Make temporary files, run programs, etc, to determine FOO_INCLUDES and FOO_LIBRARIES # endif (NOT foo_current) # +# MULTIPASS_SOURCE_RUNS (Name INCLUDES LIBRARIES SOURCE RUNS LANGUAGE) +# Always runs the given test, use this when you need to re-run tests +# because parent variables have made old cache entries stale. The LANGUAGE +# variable is either C or CXX indicating which compiler the test should +# use. # MULTIPASS_C_SOURCE_RUNS (Name INCLUDES LIBRARIES SOURCE RUNS) +# DEPRECATED! This is only included for backwards compatability. Use +# the more general MULTIPASS_SOURCE_RUNS instead. # Always runs the given test, use this when you need to re-run tests # because parent variables have made old cache entries stale. @@ -39,7 +46,7 @@ macro (FIND_PACKAGE_MULTIPASS _name _current) # The name of the stored value for the given state set (_stored_var PACKAGE_MULTIPASS_${_NAME}_${_state}) if (NOT "${${_stored_var}}" STREQUAL "${${_NAME}_${_state}}") - set (_states_current "NO") + set (_states_current "NO") endif (NOT "${${_stored_var}}" STREQUAL "${${_NAME}_${_state}}") set (${_stored_var} "${${_NAME}_${_state}}" CACHE INTERNAL "Stored state for ${_name}." FORCE) list (REMOVE_AT _args 0) @@ -61,7 +68,7 @@ macro (FIND_PACKAGE_MULTIPASS _name _current) if (_cmd STREQUAL "DEPENDENTS") list (REMOVE_AT _args 0) foreach (dep ${_args}) - set (${_NAME}_${dep} "NOTFOUND" CACHE INTERNAL "Cleared" FORCE) + set (${_NAME}_${dep} "NOTFOUND" CACHE INTERNAL "Cleared" FORCE) endforeach (dep) endif (_cmd STREQUAL "DEPENDENTS") set (${_NAME}_FOUND "NOTFOUND" CACHE INTERNAL "Cleared" FORCE) @@ -70,9 +77,9 @@ macro (FIND_PACKAGE_MULTIPASS _name _current) endmacro (FIND_PACKAGE_MULTIPASS) -macro (MULTIPASS_C_SOURCE_RUNS includes libraries source runs) - include (CheckCSourceRuns) - # This is a ridiculous hack. CHECK_C_SOURCE_* thinks that if the +macro (MULTIPASS_SOURCE_RUNS includes libraries source runs language) + include (Check${language}SourceRuns) + # This is a ridiculous hack. CHECK_${language}_SOURCE_* thinks that if the # *name* of the return variable doesn't change, then the test does # not need to be re-run. We keep an internal count which we # increment to guarantee that every test name is unique. If we've @@ -86,6 +93,14 @@ macro (MULTIPASS_C_SOURCE_RUNS includes libraries source runs) set (testname MULTIPASS_TEST_${MULTIPASS_TEST_COUNT}_${runs}) set (CMAKE_REQUIRED_INCLUDES ${includes}) set (CMAKE_REQUIRED_LIBRARIES ${libraries}) - check_c_source_runs ("${source}" ${testname}) + if(${language} STREQUAL "C") + check_c_source_runs ("${source}" ${testname}) + elseif(${language} STREQUAL "CXX") + check_cxx_source_runs ("${source}" ${testname}) + endif() set (${runs} "${${testname}}") +endmacro (MULTIPASS_SOURCE_RUNS) + +macro (MULTIPASS_C_SOURCE_RUNS includes libraries source runs) + multipass_source_runs("${includes}" "${libraries}" "${source}" ${runs} "C") endmacro (MULTIPASS_C_SOURCE_RUNS) diff --git a/AMDiS/cmake3/ResolveCompilerPaths.cmake b/AMDiS/cmake3/ResolveCompilerPaths.cmake index b398025e95518511f4e06ba218dcef386a4e8eaa..54787fa38ffa50136414e6c788c50fb3c63746b8 100644 --- a/AMDiS/cmake3/ResolveCompilerPaths.cmake +++ b/AMDiS/cmake3/ResolveCompilerPaths.cmake @@ -38,23 +38,34 @@ # # assuming both directories exist. # Note: as currently implemented, the -I/string will be picked up mistakenly (cry, cry) +include (CorrectWindowsPaths) macro (RESOLVE_LIBRARIES LIBS LINK_LINE) - string (REGEX MATCHALL "((-L|-l|-Wl)([^\" ]+|\"[^\"]+\")|/[^\" ]+(a|so|dll))" _all_tokens "${LINK_LINE}") - set (_libs_found) - set (_directory_list) + string (REGEX MATCHALL "((-L|-l|-Wl)([^\" ]+|\"[^\"]+\")|[^\" ]+\\.(a|so|dll|lib))" _all_tokens "${LINK_LINE}") + set (_libs_found "") + set (_directory_list "") foreach (token ${_all_tokens}) if (token MATCHES "-L([^\" ]+|\"[^\"]+\")") # If it's a library path, add it to the list string (REGEX REPLACE "^-L" "" token ${token}) string (REGEX REPLACE "//" "/" token ${token}) + convert_cygwin_path(token) list (APPEND _directory_list ${token}) - elseif (token MATCHES "^(-l([^\" ]+|\"[^\"]+\")|/[^\" ]+(a|so|dll))") + elseif (token MATCHES "^(-l([^\" ]+|\"[^\"]+\")|[^\" ]+\\.(a|so|dll|lib))") # It's a library, resolve the path by looking in the list and then (by default) in system directories - string (REGEX REPLACE "^-l" "" token ${token}) - set (_root) - if (token MATCHES "^/") # We have an absolute path, add root to the search path - set (_root "/") + if (WIN32) #windows expects "libfoo", linux expects "foo" + string (REGEX REPLACE "^-l" "lib" token ${token}) + else (WIN32) + string (REGEX REPLACE "^-l" "" token ${token}) + endif (WIN32) + set (_root "") + if (token MATCHES "^/") # We have an absolute path + #separate into a path and a library name: + string (REGEX MATCH "[^/]*\\.(a|so|dll|lib)$" libname ${token}) + string (REGEX MATCH ".*[^${libname}$]" libpath ${token}) + convert_cygwin_path(libpath) + set (_directory_list ${_directory_list} ${libpath}) + set (token ${libname}) endif (token MATCHES "^/") set (_lib "NOTFOUND" CACHE FILEPATH "Cleared" FORCE) find_library (_lib ${token} HINTS ${_directory_list} ${_root}) @@ -78,10 +89,11 @@ endmacro (RESOLVE_LIBRARIES) macro (RESOLVE_INCLUDES INCS COMPILE_LINE) string (REGEX MATCHALL "-I([^\" ]+|\"[^\"]+\")" _all_tokens "${COMPILE_LINE}") - set (_incs_found) + set (_incs_found "") foreach (token ${_all_tokens}) string (REGEX REPLACE "^-I" "" token ${token}) string (REGEX REPLACE "//" "/" token ${token}) + convert_cygwin_path(token) if (EXISTS ${token}) list (APPEND _incs_found ${token}) else (EXISTS ${token}) diff --git a/AMDiS/cmake3/amdis_parallel.cmake b/AMDiS/cmake3/amdis_parallel.cmake index c5a4eb1013595496a9b364b0403ba486aceec420..cf79aaf70e7f2c4cfd4273ab4102696137b0ab52 100644 --- a/AMDiS/cmake3/amdis_parallel.cmake +++ b/AMDiS/cmake3/amdis_parallel.cmake @@ -26,87 +26,53 @@ if (ENABLE_PARALLEL_DOMAIN) target_compile_definitions(amdis_parallel INTERFACE HAVE_PARALLEL_DOMAIN_AMDIS=1) - # MPI is required - find_package(MPI REQUIRED) - if (MPI_FOUND) - target_include_directories(amdis_parallel INTERFACE - ${MPI_INCLUDE_PATH}) - target_compile_options(amdis_parallel INTERFACE - ${MPI_COMPILE_FLAGS}) - endif (MPI_FOUND) + include(target_enable_petsc) + target_enable_mpi(amdis_parallel INTERFACE) + target_enable_petsc(amdis_parallel INTERFACE) - # PETSc library is required - set(PETSC_EXECUTABLE_RUNS ON) - include(find_petsc) - if (PETSc_FOUND) - target_include_directories(amdis_parallel INTERFACE - ${PETSC_DIR}/include - ${PETSC_DIR}/${PETSC_ARCH}/include) + # add support for the zoltan library + if (ENABLE_ZOLTAN) + include(target_enable_zoltan) + target_enable_zoltan(amdis_parallel INTERFACE) + target_sources(amdis PRIVATE + ${SOURCE_DIR}/parallel/ZoltanPartitioner.cc) + endif (ENABLE_ZOLTAN) - # parmetis is required - find_file(PARMETIS_HEADER_FILE "parmetis.h" HINTS ${PETSC_DIR}/include ) - if (PARMETIS_HEADER_FILE) - get_filename_component(PARMETIS_INCLUDE_PATH "${PARMETIS_HEADER_FILE}" PATH CACHE) - target_include_directories(amdis_parallel INTERFACE ${PARMETIS_INCLUDE_PATH}) - else() - message(FATAL_ERROR "Could not find ParMetis header file 'parmetis.h'!") - endif (PARMETIS_HEADER_FILE) + if (ENABLE_BDDCML) + target_compile_definitions(amdis_parallel INTERFACE HAVE_BDDCML=1) + target_sources(amdis PRIVATE + ${SOURCE_DIR}/parallel/BddcMlSolver.cc) + endif (ENABLE_BDDCML) - # add support for the zoltan library - if (ENABLE_ZOLTAN) - find_file(ZOLTAN_HEADER_FILE "zoltan_cpp.h" HINTS ${PETSC_DIR}/include) - if (ZOLTAN_HEADER_FILE) - get_filename_component(ZOLTAN_HEADER_DIR "${ZOLTAN_HEADER_FILE}" PATH CACHE) - target_include_directories(amdis_parallel PRIINTERFACEVATE ${ZOLTAN_HEADER_DIR}) - else() - message(FATAL_ERROR "Could not find Zoltan include file 'zoltan_cpp.h'!") - endif(ZOLTAN_HEADER_FILE) - - target_compile_definitions(amdis_parallel INTERFACE HAVE_ZOLTAN=1) - target_sources(amdis PRIVATE - ${SOURCE_DIR}/parallel/ZoltanPartitioner.cc) - endif (ENABLE_ZOLTAN) - - if (ENABLE_BDDCML) - target_compile_definitions(amdis_parallel INTERFACE HAVE_BDDCML=1) - target_sources(amdis PRIVATE - ${SOURCE_DIR}/parallel/BddcMlSolver.cc) - endif (ENABLE_BDDCML) + # add some more source-files that need petsc + target_sources(amdis PRIVATE + ${SOURCE_DIR}/parallel/MatrixNnzStructure.cc + ${SOURCE_DIR}/parallel/ParallelCoarseSpaceSolver.cc + ${SOURCE_DIR}/parallel/PetscHelper.cc + ${SOURCE_DIR}/parallel/PetscSolver.cc + ${SOURCE_DIR}/parallel/PetscSolverGlobalMatrix.cc + ${SOURCE_DIR}/parallel/PetscSolverGlobalBlockMatrix.cc + ${SOURCE_DIR}/solver/PetscTypes.cc + ) - # add some more source-files that need petsc + if (ENABLE_PARALLEL_SOLVERS) target_sources(amdis PRIVATE - ${SOURCE_DIR}/parallel/MatrixNnzStructure.cc - ${SOURCE_DIR}/parallel/ParallelCoarseSpaceSolver.cc - ${SOURCE_DIR}/parallel/PetscHelper.cc - ${SOURCE_DIR}/parallel/PetscSolver.cc - ${SOURCE_DIR}/parallel/PetscSolverGlobalMatrix.cc - ${SOURCE_DIR}/parallel/PetscSolverGlobalBlockMatrix.cc - ${SOURCE_DIR}/solver/PetscTypes.cc + ${SOURCE_DIR}/parallel/PetscSolverFeti.cc + ${SOURCE_DIR}/parallel/PetscSolverFetiDebug.cc + ${SOURCE_DIR}/parallel/PetscSolverFetiMonitor.cc + ${SOURCE_DIR}/parallel/PetscSolverFetiOperators.cc + ${SOURCE_DIR}/parallel/PetscSolverFetiTimings.cc + ${SOURCE_DIR}/parallel/PetscSolverNavierStokes.cc + ${SOURCE_DIR}/parallel/PetscSolverNSCH.cc + ${SOURCE_DIR}/parallel/PetscSolverCahnHilliard2.cc + ${SOURCE_DIR}/parallel/PetscSolverCahnHilliard.cc + ${SOURCE_DIR}/parallel/PetscSolverSchur.cc ) - - if (ENABLE_PARALLEL_SOLVERS) - target_sources(amdis PRIVATE - ${SOURCE_DIR}/parallel/PetscSolverFeti.cc - ${SOURCE_DIR}/parallel/PetscSolverFetiDebug.cc - ${SOURCE_DIR}/parallel/PetscSolverFetiMonitor.cc - ${SOURCE_DIR}/parallel/PetscSolverFetiOperators.cc - ${SOURCE_DIR}/parallel/PetscSolverFetiTimings.cc - ${SOURCE_DIR}/parallel/PetscSolverNavierStokes.cc - ${SOURCE_DIR}/parallel/PetscSolverNSCH.cc - ${SOURCE_DIR}/parallel/PetscSolverCahnHilliard2.cc - ${SOURCE_DIR}/parallel/PetscSolverCahnHilliard.cc - ${SOURCE_DIR}/parallel/PetscSolverSchur.cc - ) - target_compile_definitions(amdis_parallel INTERFACE - HAVE_PARALLEL_SOLVERS=1) - endif (ENABLE_PARALLEL_SOLVERS) - target_compile_definitions(amdis_parallel INTERFACE - HAVE_PARALLEL_PETSC=1 - PETSC_VERSION=${PETSC_VERSION}) + HAVE_PARALLEL_SOLVERS=1) + endif (ENABLE_PARALLEL_SOLVERS) - target_link_libraries(amdis amdis_parallel ${PETSC_LIBRARIES} blas lapack) - endif (PETSc_FOUND) + target_link_libraries(amdis amdis_parallel) # specify how to install this target: # ----------------------------------- @@ -117,6 +83,9 @@ if (ENABLE_PARALLEL_DOMAIN) install(FILES ${BASE_DIR}/cmake3/ResolveCompilerPaths.cmake ${BASE_DIR}/cmake3/FindPackageMultipass.cmake - ${BASE_DIR}/cmake3/find_petsc.cmake + ${BASE_DIR}/cmake3/CorrectWindowsPaths.cmake + ${BASE_DIR}/cmake3/FindPETSc.cmake + ${BASE_DIR}/cmake3/target_enable_petsc.cmake + ${BASE_DIR}/cmake3/target_enable_zoltan.cmake DESTINATION share/amdis/) endif (ENABLE_PARALLEL_DOMAIN) diff --git a/AMDiS/cmake3/find_boost.cmake b/AMDiS/cmake3/find_boost.cmake deleted file mode 100644 index 36ad87503c015fc4765f9f880be6bd5d42303892..0000000000000000000000000000000000000000 --- a/AMDiS/cmake3/find_boost.cmake +++ /dev/null @@ -1,32 +0,0 @@ -if (BOOST_ROOT) - file(TO_CMAKE_PATH ${BOOST_ROOT} BOOST_ROOT) -endif (BOOST_ROOT) -if (BOOST_LIBRARYDIR) - file(TO_CMAKE_PATH ${BOOST_LIBRARYDIR} BOOST_LIBRARYDIR) -endif (BOOST_LIBRARYDIR) - -set(BOOST_VERSION "1.48") -set(BOOST_LIBS_REQUIRED system iostreams filesystem program_options date_time) -if (WIN32) - list(APPEND BOOST_LIBS_REQUIRED zlib) - if (ENABLE_COMPRESSION OR AMDIS_NEED_COMPRESSION) - list(APPEND BOOST_LIBS_REQUIRED bzip2) - endif (ENABLE_COMPRESSION OR AMDIS_NEED_COMPRESSION) -endif (WIN32) - -if (NOT BUILD_SHARED_LIBS) - set(Boost_USE_STATIC_LIBS ON) -endif (NOT BUILD_SHARED_LIBS) -find_package(Boost ${BOOST_VERSION} REQUIRED ${BOOST_LIBS_REQUIRED}) -if (Boost_FOUND) - add_library(boost INTERFACE) - target_include_directories(boost INTERFACE ${Boost_INCLUDE_DIR}) - target_link_libraries(boost INTERFACE ${Boost_LIBRARIES}) - - target_link_libraries(amdis_base INTERFACE boost) - - if (MSVC_SHARED_LIBS) - link_directories(${Boost_LIBRARY_DIRS}) - target_compile_definitions(amdis_base INTERFACE ${Boost_LIB_DIAGNOSTIC_DEFINITIONS}) - endif (MSVC_SHARED_LIBS) -endif (Boost_FOUND) diff --git a/AMDiS/cmake3/find_mtl4.cmake b/AMDiS/cmake3/find_mtl4.cmake index a54a1f1ba5c7f7d6718757c535745de87cdaae21..ec34f06bf407b8c78738bad56cc50a81f03f61bf 100644 --- a/AMDiS/cmake3/find_mtl4.cmake +++ b/AMDiS/cmake3/find_mtl4.cmake @@ -7,17 +7,9 @@ else () endif (IS_AMDISCONFIG) include(test_compile_features) -test_compile_features(MTL_ENABLE_CXX11 mtl4 INTERFACE - cxx_rvalue_references - cxx_auto_type - cxx_range_for - cxx_generalized_initializers - cxx_static_assert - cxx_defaulted_functions) +target_enable_cxx11(MTL_ENABLE_CXX11 mtl4 INTERFACE) if (MTL_ENABLE_CXX11) -# set(CMAKE_CXX_STANDARD 11) -# set(CMAKE_CXX_STANDARD_REQUIRED ON) set (CXX_ELEVEN_FEATURE_LIST "MOVE" "AUTO" "RANGEDFOR" "INITLIST" "STATICASSERT" "DEFAULTIMPL") foreach (feature ${CXX_ELEVEN_FEATURE_LIST}) target_compile_definitions(mtl4 INTERFACE MTL_WITH_${feature}) diff --git a/AMDiS/cmake3/find_umfpack.cmake b/AMDiS/cmake3/find_umfpack.cmake deleted file mode 100644 index 138f171b52a099e3585390e7047e3912b2091a21..0000000000000000000000000000000000000000 --- a/AMDiS/cmake3/find_umfpack.cmake +++ /dev/null @@ -1,91 +0,0 @@ -if (ENABLE_UMFPACK OR AMDIS_NEED_UMFPACK) - if (WIN32) - set(SuiteSparse_USE_LAPACK_BLAS ON) - endif (WIN32) - - if (SuiteSparse_DIR) - file(TO_CMAKE_PATH ${SuiteSparse_DIR} SuiteSparse_DIR) - endif (SuiteSparse_DIR) - - # try to use a cmake-package of suitesparse - find_package(SuiteSparse QUIET HINTS ${AMDIS_SuiteSparse_DIR}) - if (SuiteSparse_FOUND) - message(STATUS "Found SuiteSparse CMake-library") - include(${USE_SuiteSparse}) - target_link_libraries(amdis_base INTERFACE ${SuiteSparse_LIBRARIES}) - target_include_directories(amdis_base INTERFACE ${SuiteSparse_INCLUDE_DIR} ${SuiteSparse_METIS_INCLUDE_DIR}) - set(FOUND_SUITESPARSE_LIBS ${SuiteSparse_LIBRARIES}) - else (SuiteSparse_FOUND) - # find umfpack manually by searching for umfpack.h header file - find_library(UMFPACK_LIBRARY umfpack - HINTS ${AMDIS_UMFPACK_LIB_DIR} - DOC "Library file for UMFPACK") - find_file(UMFPACK_H umfpack.h - HINTS ${AMDIS_UMFPACK_INCLUDE_DIR} ENV CPATH /usr/include /usr/include/suitesparse /usr/include/ufsparse - DOC "Headerfile umfpack.h for UMFPACK") - - if (UMFPACK_H AND UMFPACK_LIBRARY) - get_filename_component(UMFPACK_PATH ${UMFPACK_H} PATH) - get_filename_component(UMFPACK_LIB_PATH ${UMFPACK_LIBRARY} PATH) - set(FOUND_SUITESPARSE_LIBS ${UMFPACK_LIBRARY}) - - # find all connected libraries - find_library(AMD_LIBRARY amd HINTS ${UMFPACK_LIB_PATH}) - find_library(BLAS_LIBRARY NAMES blas openblas HINTS ${UMFPACK_LIB_PATH} /usr/lib /usr/lib/openblas-base) - find_library(CHOLMOD_LIBRARY cholmod HINTS ${UMFPACK_LIB_PATH}) - find_library(COLAMD_LIBRARY colamd HINTS ${UMFPACK_LIB_PATH}) - find_library(SUITESPARSECONFIG_LIBRARY suitesparseconfig HINTS ${UMFPACK_LIB_PATH}) - if (AMD_LIBRARY AND BLAS_LIBRARY) - list(APPEND FOUND_SUITESPARSE_LIBS ${AMD_LIBRARY} ${BLAS_LIBRARY}) - endif (AMD_LIBRARY AND BLAS_LIBRARY) - if (CHOLMOD_LIBRARY) - list(APPEND FOUND_SUITESPARSE_LIBS ${CHOLMOD_LIBRARY}) - endif (CHOLMOD_LIBRARY) - if (COLAMD_LIBRARY) - list(APPEND FOUND_SUITESPARSE_LIBS ${COLAMD_LIBRARY}) - endif (COLAMD_LIBRARY) - if (SUITESPARSECONFIG_LIBRARY) - list(APPEND FOUND_SUITESPARSE_LIBS ${SUITESPARSECONFIG_LIBRARY}) - endif (SUITESPARSECONFIG_LIBRARY) - - target_include_directories(amdis_base INTERFACE ${UMFPACK_PATH}) - target_link_libraries(amdis_base INTERFACE ${FOUND_SUITESPARSE_LIBS}) - else() - message(FATAL_ERROR "Could not find the UMFPACK header umfpack.h.") - endif (UMFPACK_H AND UMFPACK_LIBRARY) - endif (SuiteSparse_FOUND) - - - # Check for clock_gettime in librt - if (NOT WIN32) - include(CheckLibraryExists) - check_library_exists(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME) - if (HAVE_CLOCK_GETTIME) - target_link_libraries(amdis_base INTERFACE rt) - else () - check_library_exists(c clock_gettime "" HAVE_CLOCK_GETTIME) - endif (HAVE_CLOCK_GETTIME) - endif (NOT WIN32) - - - # collect informations about umfpack version and found libraries - if (FOUND_SUITESPARSE_LIBS) - find_file(_UMFPACK_H umfpack.h HINTS ${SuiteSparse_INCLUDE_DIR} ${UMFPACK_PATH}) - file(STRINGS ${_UMFPACK_H} UMFPACK_VERSION_LINE REGEX "#define UMFPACK_VERSION") - string(REGEX MATCH "\"UMFPACK V?([^\"]+)\"" UMFPACK_VERSION_REGEX ${UMFPACK_VERSION_LINE}) - set(UMFPACK_VERSION ${CMAKE_MATCH_1}) - unset(_UMFPACK_H CACHE) - - message(STATUS "UMFPACK version: ${UMFPACK_VERSION}") - message(STATUS "Found the following SuiteSparse libraries:") - foreach (lib ${FOUND_SUITESPARSE_LIBS}) - message(STATUS " ${lib}") - endforeach () - endif (FOUND_SUITESPARSE_LIBS) - - target_compile_definitions(amdis_base INTERFACE - HAVE_UMFPACK=1 - MTL_HAS_UMFPACK=1) - - install(FILES ${BASE_DIR}/cmake3/find_umfpack.cmake DESTINATION share/amdis/) -endif (ENABLE_UMFPACK OR AMDIS_NEED_UMFPACK) \ No newline at end of file diff --git a/AMDiS/cmake3/muparser.cmake b/AMDiS/cmake3/muparser.cmake index 5f6842472a3b39e5d66e305b098689a9566137f8..3d1f88b6479db62f319557a0aeee14fcb5d7a7ac 100644 --- a/AMDiS/cmake3/muparser.cmake +++ b/AMDiS/cmake3/muparser.cmake @@ -17,8 +17,7 @@ add_library(muparser target_include_directories(muparser PUBLIC ${MUPARSER_INCLUDE_DIR}) if (ENABLE_CXX11) - set_property(TARGET muparser PROPERTY CXX_STANDARD 11) - set_property(TARGET muparser PROPERTY CXX_STANDARD_REQUIRED ON) + target_enable_cxx11(MUPARSER_ENABLE_CXX11 muparser PRIVATE) target_compile_definitions(muparser PRIVATE HAS_CXX11=1) endif (ENABLE_CXX11) @@ -29,4 +28,4 @@ file(GLOB MUPARSER_HEADERS "${MUPARSER_SOURCE_DIR}/include/*.h") install(FILES ${MUPARSER_HEADERS} DESTINATION include/amdis/muparser) install(TARGETS muparser - DESTINATION lib/amdis/ ) \ No newline at end of file + DESTINATION lib/amdis/ ) diff --git a/AMDiS/cmake3/target_enable_boost.cmake b/AMDiS/cmake3/target_enable_boost.cmake new file mode 100644 index 0000000000000000000000000000000000000000..7b79b1779827583b07b62da112eb5132d3e4214a --- /dev/null +++ b/AMDiS/cmake3/target_enable_boost.cmake @@ -0,0 +1,44 @@ +macro(target_enable_boost _TARGET_ _SCOPE_) + if (${ARGC} GREATER 2) + set(LINK_EXECUTABLE ON) + else () + set(LINK_EXECUTABLE OFF) + endif () + + if (BOOST_ROOT) + file(TO_CMAKE_PATH ${BOOST_ROOT} BOOST_ROOT) + endif (BOOST_ROOT) + if (BOOST_LIBRARYDIR) + file(TO_CMAKE_PATH ${BOOST_LIBRARYDIR} BOOST_LIBRARYDIR) + endif (BOOST_LIBRARYDIR) + + set(BOOST_VERSION "1.48") + set(BOOST_LIBS_REQUIRED system iostreams filesystem program_options date_time) + if (WIN32) + list(APPEND BOOST_LIBS_REQUIRED zlib) + if (ENABLE_COMPRESSION OR AMDIS_NEED_COMPRESSION) + list(APPEND BOOST_LIBS_REQUIRED bzip2) + endif (ENABLE_COMPRESSION OR AMDIS_NEED_COMPRESSION) + endif (WIN32) + + if (NOT BUILD_SHARED_LIBS) + set(Boost_USE_STATIC_LIBS ON) + endif (NOT BUILD_SHARED_LIBS) + find_package(Boost ${BOOST_VERSION} REQUIRED ${BOOST_LIBS_REQUIRED}) + if (Boost_FOUND) + add_library(boost INTERFACE) + target_include_directories(boost INTERFACE ${Boost_INCLUDE_DIR}) + + if (LINK_EXECUTABLE) + target_link_libraries(boost INTERFACE ${Boost_LIBRARIES}) + endif (LINK_EXECUTABLE) + + target_link_libraries(${_TARGET_} ${_SCOPE_} boost) + + if (MSVC_SHARED_LIBS AND LINK_EXECUTABLE) + link_directories(${Boost_LIBRARY_DIRS}) + target_compile_definitions(${_TARGET_} ${_SCOPE_} ${Boost_LIB_DIAGNOSTIC_DEFINITIONS}) + endif (MSVC_SHARED_LIBS AND LINK_EXECUTABLE) + endif (Boost_FOUND) + +endmacro(target_enable_boost) diff --git a/AMDiS/cmake3/target_enable_petsc.cmake b/AMDiS/cmake3/target_enable_petsc.cmake new file mode 100644 index 0000000000000000000000000000000000000000..9e77c584231f41f235d6d5105fa8c3b7c4892b52 --- /dev/null +++ b/AMDiS/cmake3/target_enable_petsc.cmake @@ -0,0 +1,139 @@ +macro(target_enable_mpi _TARGET_ _SCOPE_) + if (${ARGC} GREATER 2) + set(LINK_EXECUTABLE ON) + else () + set(LINK_EXECUTABLE OFF) + endif () + + find_package(MPI REQUIRED) + target_include_directories(${_TARGET_} ${_SCOPE_} + ${MPI_CXX_INCLUDE_PATH}) + target_compile_options(${_TARGET_} ${_SCOPE_} + ${MPI_CXX_COMPILE_FLAGS}) + string(STRIP " ${MPI_CXX_LINK_FLAGS} " MPI_CXX_LINK_FLAGS_) + + if (LINK_EXECUTABLE) + target_link_libraries(${_TARGET_} ${_SCOPE_} + ${MPI_CXX_LINK_FLAGS_} ${MPI_CXX_LIBRARIES}) + endif (LINK_EXECUTABLE) +endmacro(target_enable_mpi) + + +macro(target_enable_petsc _TARGET_ _SCOPE_) + if (${ARGC} GREATER 2) + set(LINK_EXECUTABLE ON) + else () + set(LINK_EXECUTABLE OFF) + endif () + + # PETSc library is required + find_file(PETSC_PKG_CONFIG "PETSc.pc" + HINTS ${PETSC_DIR}/lib/pkgconfig + $ENV{PETSC_DIR}/lib/pkgconfig + ${PETSC_ROOT}/lib/pkgconfig + $ENV{PETSC_ROOT}/lib/pkgconfig + /usr/lib/petsc/lib/pkgconfig + /usr/lib/petsc/linux-gnu-cxx-opt/lib/pkgconfig + /usr/lib/petsc/linux-gnu-c-opt/lib/pkgconfig) + if (PETSC_PKG_CONFIG) + get_filename_component(PETSC_PKG_CONFIG_PATH "${PETSC_PKG_CONFIG}" PATH CACHE) + set(ENV{PKG_CONFIG_PATH} ${PETSC_PKG_CONFIG_PATH}) + pkg_check_modules(PETSC REQUIRED PETSc>=3.3) + set(PETSC_DEFINITIONS ${PETSC_CFLAGS} ${PETSC_CFLAGS_OTHER}) + endif (PETSC_PKG_CONFIG) + + # check whether PETSc installation and configuration is valid + if (NOT PETSC_INCLUDE_DIRS) + set(PETSC_HEADER_FILE-NOTFOUND ON) + else () + find_file(PETSC_HEADER_FILE "petsc.h" PATHS ${PETSC_INCLUDE_DIRS} NO_DEFAULT_PATH) + endif (NOT PETSC_INCLUDE_DIRS) + + # if not valid, search again + if (PETSC_HEADER_FILE-NOTFOUND) + find_package(PETSc REQUIRED) + set(PETSC_INCLUDE_DIRS ${PETSC_INCLUDES}) + set(PETSC_LIBRARY_DIRS ${PETSC_LIB_DIR}) + message(STATUS " Found PETSc, version ${PETSC_VERSION}") + endif (PETSC_HEADER_FILE-NOTFOUND) + + target_include_directories(${_TARGET_} ${_SCOPE_} ${PETSC_INCLUDE_DIRS}) + target_compile_definitions(${_TARGET_} ${_SCOPE_} + HAVE_PARALLEL_PETSC=1 + PETSC_VERSION=${PETSC_VERSION}) + target_compile_options(${_TARGET_} ${_SCOPE_} ${PETSC_DEFINITIONS}) + + if (LINK_EXECUTABLE) + target_link_libraries(${_TARGET_} ${_SCOPE_} ${PETSC_LIBRARIES}) + endif (LINK_EXECUTABLE) + + + # parmetis is required + find_file(PARMETIS_HEADER_FILE "parmetis.h" + HINTS ${PARMETIS_DIR}/include ${PETSC_INCLUDE_DIRS} /usr/include/parmetis) + if (PARMETIS_HEADER_FILE) + get_filename_component(PARMETIS_INCLUDE_PATH "${PARMETIS_HEADER_FILE}" PATH CACHE) + target_include_directories(${_TARGET_} ${_SCOPE_} ${PARMETIS_INCLUDE_PATH}) + else() + message(FATAL_ERROR "Could not find ParMetis header file 'parmetis.h'!") + endif (PARMETIS_HEADER_FILE) + + if (LINK_EXECUTABLE) + find_library(PARMETIS_LIB parmetis + HINTS ${PARMETIS_DIR}/lib ${PETSC_LIBRARY_DIRS}) + if (NOT PARMETIS_LIB) + message(FATAL_ERROR "Could not find the ParMetis libraries needed by amdis") + endif (NOT PARMETIS_LIB) + message(STATUS " Found ParMetis library ${PARMETIS_LIB}") + target_link_libraries(${_TARGET_} ${_SCOPE_} ${PARMETIS_LIB}) + endif (LINK_EXECUTABLE) + + + # metis is required + find_file(METIS_HEADER_FILE "metis.h" + HINTS ${METIS_DIR}/include ${PETSC_INCLUDE_DIRS} /usr/include/metis) + if (METIS_HEADER_FILE) + get_filename_component(METIS_INCLUDE_PATH "${METIS_HEADER_FILE}" PATH CACHE) + target_include_directories(${_TARGET_} ${_SCOPE_} ${METIS_INCLUDE_PATH}) + else() + message(FATAL_ERROR "Could not find Metis header file 'metis.h'!") + endif (METIS_HEADER_FILE) + + if (LINK_EXECUTABLE) + find_library(METIS_LIB metis + HINTS ${METIS_DIR}/lib ${PETSC_LIBRARY_DIRS}) + if (NOT METIS_LIB) + message(FATAL_ERROR "Could not find the Metis libraries needed by amdis") + endif (NOT METIS_LIB) + message(STATUS " Found Metis library ${METIS_LIB}") + target_link_libraries(${_TARGET_} ${_SCOPE_} ${METIS_LIB}) + endif (LINK_EXECUTABLE) + + + # blas library is required + if (LINK_EXECUTABLE) + find_library(BLAS_LIB + NAMES blas fblas openblas + HINTS ${BLAS_DIR}/lib ${PETSC_LIBRARY_DIRS} /usr/lib/openblas-base /usr/lib/atlas-base) + if (BLAS_LIB) + set(BLAS_LIBRARIES ${BLAS_LIB}) + else (BLAS_LIB) + find_package(BLAS REQUIRED) + endif (BLAS_LIB) + target_link_libraries(${_TARGET_} ${_SCOPE_} ${BLAS_LIBRARIES}) + endif (LINK_EXECUTABLE) + + + # lapack library is required + if (LINK_EXECUTABLE) + find_library(LAPACK_LIB + NAMES lapack flapack + HINTS ${LAPACK_DIR}/lib ${PETSC_LIBRARY_DIRS} ${PETSC_DIR}/lib) + if (LAPACK_LIB) + set(LAPACK_LIBRARIES ${LAPACK_LIB}) + else (LAPACK_LIB) + find_package(LAPACK REQUIRED) + endif (LAPACK_LIB) + target_link_libraries(${_TARGET_} ${_SCOPE_} ${LAPACK_LIBRARIES}) + endif (LINK_EXECUTABLE) +endmacro(target_enable_petsc) diff --git a/AMDiS/cmake3/target_enable_umfpack.cmake b/AMDiS/cmake3/target_enable_umfpack.cmake new file mode 100644 index 0000000000000000000000000000000000000000..cc5d2dda6f9ba9fab9777ec15b9e253e25bf5ae5 --- /dev/null +++ b/AMDiS/cmake3/target_enable_umfpack.cmake @@ -0,0 +1,113 @@ +macro(target_enable_umfpack _TARGET_ _SCOPE_) + if (${ARGC} GREATER 2) + set(LINK_EXECUTABLE ON) + else () + set(LINK_EXECUTABLE OFF) + endif () + + if (WIN32) + set(SuiteSparse_USE_LAPACK_BLAS ON) + endif (WIN32) + + if (SuiteSparse_DIR) + file(TO_CMAKE_PATH ${SuiteSparse_DIR} SuiteSparse_DIR) + endif (SuiteSparse_DIR) + + # try to use a cmake-package of suitesparse + find_package(SuiteSparse QUIET HINTS ${AMDIS_SuiteSparse_DIR}) + if (SuiteSparse_FOUND) + message(STATUS "Found SuiteSparse CMake-library") + include(${USE_SuiteSparse}) + if (LINK_EXECUTABLE) + target_link_libraries(${_TARGET_} ${_SCOPE_} ${SuiteSparse_LIBRARIES}) + endif (LINK_EXECUTABLE) + target_include_directories(${_TARGET_} ${_SCOPE_} ${SuiteSparse_INCLUDE_DIR} ${SuiteSparse_METIS_INCLUDE_DIR}) + set(FOUND_SUITESPARSE_LIBS ${SuiteSparse_LIBRARIES}) + else (SuiteSparse_FOUND) + # find umfpack manually by searching for umfpack.h header file + find_library(UMFPACK_LIBRARY umfpack + HINTS ${AMDIS_UMFPACK_LIB_DIR} ${SUITESPARSE_LIB} $ENV{SUITESPARSE_LIB} + DOC "Library file for UMFPACK") + find_file(UMFPACK_H umfpack.h + HINTS ${AMDIS_UMFPACK_INCLUDE_DIR} ${SUITESPARSE_INC} $ENV{SUITESPARSE_INC} ENV CPATH /usr/include /usr/include/suitesparse /usr/include/ufsparse + DOC "Headerfile umfpack.h for UMFPACK") + + if (UMFPACK_H AND UMFPACK_LIBRARY) + get_filename_component(UMFPACK_PATH ${UMFPACK_H} PATH) + target_include_directories(${_TARGET_} ${_SCOPE_} ${UMFPACK_PATH}) + + get_filename_component(UMFPACK_LIB_PATH ${UMFPACK_LIBRARY} PATH) + set(FOUND_SUITESPARSE_LIBS ${UMFPACK_LIBRARY}) + + if (LINK_EXECUTABLE) + + # find all connected libraries + find_library(AMD_LIBRARY amd HINTS ${UMFPACK_LIB_PATH}) + + find_library(BLAS_LIB + NAMES blas fblas openblas + HINTS ${BLAS_DIR}/lib ${UMFPACK_LIB_PATH} /usr/lib/openblas-base /usr/lib/atlas-base) + if (BLAS_LIB) + set(BLAS_LIBRARIES ${BLAS_LIB}) + else (BLAS_LIB) + find_package(BLAS REQUIRED) + endif (BLAS_LIB) + + find_library(CHOLMOD_LIBRARY cholmod HINTS ${UMFPACK_LIB_PATH}) + find_library(COLAMD_LIBRARY colamd HINTS ${UMFPACK_LIB_PATH}) + find_library(SUITESPARSECONFIG_LIBRARY suitesparseconfig HINTS ${UMFPACK_LIB_PATH}) + if (AMD_LIBRARY AND BLAS_LIBRARIES) + list(APPEND FOUND_SUITESPARSE_LIBS ${AMD_LIBRARY} ${BLAS_LIBRARIES}) + endif (AMD_LIBRARY AND BLAS_LIBRARIES) + if (CHOLMOD_LIBRARY) + list(APPEND FOUND_SUITESPARSE_LIBS ${CHOLMOD_LIBRARY}) + endif (CHOLMOD_LIBRARY) + if (COLAMD_LIBRARY) + list(APPEND FOUND_SUITESPARSE_LIBS ${COLAMD_LIBRARY}) + endif (COLAMD_LIBRARY) + if (SUITESPARSECONFIG_LIBRARY) + list(APPEND FOUND_SUITESPARSE_LIBS ${SUITESPARSECONFIG_LIBRARY}) + endif (SUITESPARSECONFIG_LIBRARY) + + target_link_libraries(${_TARGET_} ${_SCOPE_} ${FOUND_SUITESPARSE_LIBS}) + endif (LINK_EXECUTABLE) + else() + message(FATAL_ERROR "Could not find the UMFPACK header umfpack.h.") + endif (UMFPACK_H AND UMFPACK_LIBRARY) + endif (SuiteSparse_FOUND) + + + # Check for clock_gettime in librt + if (NOT WIN32 AND LINK_EXECUTABLE) + include(CheckLibraryExists) + check_library_exists(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME) + if (HAVE_CLOCK_GETTIME) + target_link_libraries(${_TARGET_} ${_SCOPE_} rt) + else () + check_library_exists(c clock_gettime "" HAVE_CLOCK_GETTIME) + endif (HAVE_CLOCK_GETTIME) + endif (NOT WIN32 AND LINK_EXECUTABLE) + + + # collect informations about umfpack version and found libraries + if (FOUND_SUITESPARSE_LIBS) + find_file(_UMFPACK_H umfpack.h PATHS ${SuiteSparse_INCLUDE_DIR} ${UMFPACK_PATH} NO_DEFAULT_PATH) + file(STRINGS ${_UMFPACK_H} UMFPACK_VERSION_LINE REGEX "#define UMFPACK_VERSION") + string(REGEX MATCH "\"UMFPACK V?([^\"]+)\"" UMFPACK_VERSION_REGEX ${UMFPACK_VERSION_LINE}) + set(UMFPACK_VERSION ${CMAKE_MATCH_1}) + unset(_UMFPACK_H CACHE) + + message(STATUS "UMFPACK version: ${UMFPACK_VERSION}") + if (LINK_EXECUTABLE) + message(STATUS "Found the following SuiteSparse libraries:") + foreach (lib ${FOUND_SUITESPARSE_LIBS}) + message(STATUS " ${lib}") + endforeach () + endif (LINK_EXECUTABLE) + endif (FOUND_SUITESPARSE_LIBS) + + target_compile_definitions(${_TARGET_} ${_SCOPE_} + HAVE_UMFPACK=1 + MTL_HAS_UMFPACK=1) + +endmacro(target_enable_umfpack) diff --git a/AMDiS/cmake3/target_enable_zoltan.cmake b/AMDiS/cmake3/target_enable_zoltan.cmake new file mode 100644 index 0000000000000000000000000000000000000000..6488c1de9b61b2ba7005a4721772425dbd0dccc2 --- /dev/null +++ b/AMDiS/cmake3/target_enable_zoltan.cmake @@ -0,0 +1,26 @@ +macro(target_enable_zoltan _TARGET_ _SCOPE_) + if (${ARGC} GREATER 2) + set(LINK_EXECUTABLE ON) + else () + set(LINK_EXECUTABLE OFF) + endif () + + find_file(ZOLTAN_HEADER_FILE "zoltan_cpp.h" HINTS ${ZOLTAN_DIR}/include ${PETSC_INCLUDE_DIRS}) + if (ZOLTAN_HEADER_FILE) + get_filename_component(ZOLTAN_HEADER_DIR "${ZOLTAN_HEADER_FILE}" PATH CACHE) + target_include_directories(${_TARGET_} ${_SCOPE_} ${ZOLTAN_HEADER_DIR}) + else() + message(FATAL_ERROR "Could not find Zoltan include file 'zoltan_cpp.h'!") + endif(ZOLTAN_HEADER_FILE) + + target_compile_definitions(${_TARGET_} ${_SCOPE_} HAVE_ZOLTAN=1) + + if (LINK_EXECUTABLE) + find_library(ZOLTAN_LIB zoltan + HINTS ENV LIBRARY_PATH DOC "Full path to the zoltan library") + if (NOT ZOLTAN_LIB) + message(FATAL_ERROR "Could not find zoltan library!") + endif (NOT ZOLTAN_LIB) + target_link_libraries(${_TARGET_} ${_SCOPE_} ${ZOLTAN_LIB}) + endif (LINK_EXECUTABLE) +endmacro(target_enable_zoltan) \ No newline at end of file diff --git a/AMDiS/cmake3/test_compile_features.cmake b/AMDiS/cmake3/test_compile_features.cmake index c24c17bf4492b21743e2328bf0eba068b33a4c58..687fb51ecfda7a590d36349271730271d04644fd 100644 --- a/AMDiS/cmake3/test_compile_features.cmake +++ b/AMDiS/cmake3/test_compile_features.cmake @@ -1,48 +1,34 @@ +include(CheckCXXCompilerFlag) +include(CheckCXXSourceCompiles) -macro(test_compile_features RESULT_VAR TARGET SCOPE) # feature1 feature2 feature3 ...) - set(_FEATURES "") - foreach(FEATURE ${ARGN}) - set(_FEATURES "${_FEATURES} ${FEATURE}") - endforeach() - set(_DIR ${CMAKE_BINARY_DIR}/test_cxx11) +macro(target_enable_cxx11 RESULT_VAR _TARGET_ _SCOPE_) + check_cxx_compiler_flag("-std=c++11" COMPILER_SUPPORTS_CXX11_FLAG) - # test only of variable RESULT_VAR not yet set manually or by a - # previous call to this macro - if (NOT DEFINED ${RESULT_VAR}) - if (EXISTS "${BASE_DIR}/cmake3/dummy.cc") - set(DUMMY_FILE ${BASE_DIR}/cmake3/dummy.cc) - else () - set(DUMMY_FILE ${AMDIS_DIR}/dummy.cc) - endif () + set(CXX11_CODE " + #include + #include + template using A = std::tuple; + int main(){ + decltype(1) vec[]={1,2,3}; + for(auto&& x:vec); + }") - message(STATUS "Test for cxx11 features for target ${TARGET}") - execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${_DIR}) - file(WRITE ${_DIR}/CMakeLists.txt " - cmake_minimum_required(VERSION 3.1 FATAL_ERROR) - project(TestCxx LANGUAGES CXX) - add_library(test_cxx ${DUMMY_FILE}) - target_compile_features(test_cxx PRIVATE ${_FEATURES})") + if (COMPILER_SUPPORTS_CXX11_FLAG) + set(CMAKE_REQUIRED_FLAGS "-std=c++11") + check_cxx_source_compiles("${CXX11_CODE}" CXX11_COMPILES_WITH_CXX11_FLAG) + set(CMAKE_REQUIRED_FLAGS "") + endif () - execute_process(COMMAND ${CMAKE_COMMAND} ${_DIR} - WORKING_DIRECTORY ${_DIR} - RESULT_VARIABLE _ERR_CODE OUTPUT_QUIET) + if (COMPILER_SUPPORTS_CXX11_FLAG AND CXX11_COMPILES_WITH_CXX11_FLAG) + target_compile_options(${_TARGET_} ${_SCOPE_} "-std=c++11") + set(${RESULT_VAR} true CACHE BOOL "Enable C++11 compiler features" FORCE) + else () + check_cxx_source_compiles("${CXX11_CODE}" CXX11_COMPILES) - execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory ${_DIR}) - elseif (${RESULT_VAR}) - set(_ERR_CODE "0") + if (CXX11_COMPILES) + set(${RESULT_VAR} true CACHE BOOL "Enable C++11 compiler features" FORCE) else () - set(_ERR_CODE "1") + set(${RESULT_VAR} false CACHE BOOL "Enable C++11 compiler features" FORCE) endif () - - if ("${_ERR_CODE}" STREQUAL "0") - set(${RESULT_VAR} true CACHE BOOL "Enable C++11 compiler features") - target_compile_features(${TARGET} ${SCOPE} ${ARGN}) - else () - set(${RESULT_VAR} false CACHE BOOL "Enable C++11 compiler features") - endif () - mark_as_advanced(${RESULT_VAR}) - - unset(_ERR_CODE) - unset(_DIR) - unset(_FEATURES) -endmacro(test_compile_features) \ No newline at end of file + endif () +endmacro(target_enable_cxx11) diff --git a/AMDiS/src/config/Config_clang.h b/AMDiS/src/config/Config_clang.h index da5246c5c243a5897b208b319866ed065ae598fd..9007feb2b92b47f1369ac0dd13d8622530e1afa0 100644 --- a/AMDiS/src/config/Config_clang.h +++ b/AMDiS/src/config/Config_clang.h @@ -47,10 +47,7 @@ typedef size_t aligned_size_t __attribute__ ((aligned(CACHE_LINE))); // C++11 features // -------------- -#if __cplusplus > 199711L -#ifndef HAS_CXX11 - #define HAS_CXX11 1 -#endif +#if HAS_CXX11 // __has_feature(cxx_rvalue_references) #if CLANG_VERSION >= 20900 && !defined(HAS_VARIADIC_TEMPLATES) diff --git a/AMDiS/src/config/Config_gcc.h b/AMDiS/src/config/Config_gcc.h index b7781a222c8861438bbbc3f8e235e6ec6011f1c2..c281e3f71282afc415d3d7632abdebe2ed5ac6e4 100644 --- a/AMDiS/src/config/Config_gcc.h +++ b/AMDiS/src/config/Config_gcc.h @@ -47,10 +47,7 @@ typedef size_t aligned_size_t __attribute__ ((aligned(CACHE_LINE))); // C++11 features // -------------- -#if __cplusplus > 199711L -#ifndef HAS_CXX11 - #define HAS_CXX11 1 -#endif +#if HAS_CXX11 #if GCC_VERSION >= 40300 && !defined(HAS_VARIADIC_TEMPLATES) #define HAS_VARIADIC_TEMPLATES 1 diff --git a/AMDiS/src/config/Config_intel.h b/AMDiS/src/config/Config_intel.h index 087b078e2c635ff777b10c4311348ddfe90a2294..0ee7ab5b89fd25de1401cde84ce05b47750f778e 100644 --- a/AMDiS/src/config/Config_intel.h +++ b/AMDiS/src/config/Config_intel.h @@ -51,15 +51,7 @@ typedef __declspec(align(CACHE_LINE)) size_t aligned_size_t; // C++11 features // -------------- -// #if __cplusplus > 199711L -// workaround needed to test for -std=c++11 enabled, since __cplusplus gives wrong values -#include -#include -#if defined(_GLIBCXX_TUPLE) || defined(_GLIBCXX_TYPE_TRAITS) || defined(_GLIBCXX_ARRAY) || (__cplusplus > 199711L) - -#ifndef HAS_CXX11 - #define HAS_CXX11 1 -#endif +#if HAS_CXX11 #if INTEL_VERSION >= 1201 && !defined(HAS_VARIADIC_TEMPLATES) #define HAS_VARIADIC_TEMPLATES 1 diff --git a/AMDiS/src/config/Config_msc.h b/AMDiS/src/config/Config_msc.h index ea3bb62447a193e8a471e5f3556aa414e833199b..faecc69145a645f96381b8e6b69752ba2b306056 100644 --- a/AMDiS/src/config/Config_msc.h +++ b/AMDiS/src/config/Config_msc.h @@ -52,13 +52,6 @@ typedef __declspec(align(CACHE_LINE)) size_t aligned_size_t; #define ALWAYS_INLINE __forceinline #define OPENMODE std::ios::open_mode -// C++11 features -// -------------- -// #if __cplusplus > 199711L -// #ifndef HAS_CXX11 -// #define HAS_CXX11 1 -// #endif - #if MSC_VERSION >= 1800 && !defined(HAS_VARIADIC_TEMPLATES) #define HAS_VARIADIC_TEMPLATES 1 #endif diff --git a/AMDiS/src/traits/basic.hpp b/AMDiS/src/traits/basic.hpp index f6e54f51bb537af3a4a4c8a6d5b0914ae201a275..1f0303936b6fd6d8474120deff915e4098c5d03e 100644 --- a/AMDiS/src/traits/basic.hpp +++ b/AMDiS/src/traits/basic.hpp @@ -35,7 +35,7 @@ #include #endif -#ifdef HAS_CXX11 +#if HAS_CXX11 #include #endif @@ -45,7 +45,7 @@ namespace AMDiS // introduce some shortcuts for boost::mpl // --------------------------------------- -#ifdef HAS_CXX11 +#if HAS_CXX11 template using bool_ = std::integral_constant;