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)