include(FindPkgConfig) 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}) if (LINK_EXECUTABLE OR APPLE) # the parameter --enable-new-dtags causes a linker problem, i.e. some libraries are # linked without an rpath (or any other path information) and can not be found while # running the executable. The hack below removes this flag manually from the linker flags. string(REPLACE "-Wl,--enable-new-dtags" "" MY_MPI_CXX_LINK_FLAGS " ${MPI_CXX_LINK_FLAGS} ") string(STRIP "${MY_MPI_CXX_LINK_FLAGS}" MY_MPI_CXX_LINK_FLAGS) target_link_libraries(${_TARGET_} ${_SCOPE_} ${MPI_CXX_LIBRARIES} ${MY_MPI_CXX_LINK_FLAGS}) endif (LINK_EXECUTABLE OR APPLE) 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_VALID OFF) else () find_file(PETSC_HEADER_FILE "petsc.h" PATHS ${PETSC_INCLUDE_DIRS} NO_DEFAULT_PATH) if (PETSC_HEADER_FILE) set(PETSC_VALID ON) else () set(PETSC_VALID OFF) endif () endif (NOT PETSC_INCLUDE_DIRS) # if not valid, search again if (NOT PETSC_VALID) message(WARNING " ---> pkg-config of PETSc is broken!") find_package(PETSc REQUIRED CXX) set(PETSC_INCLUDE_DIRS ${PETSC_INCLUDES}) set(PETSC_LIBRARY_DIRS ${PETSC_LIB_DIR}) message(STATUS " Found PETSc, version ${PETSC_VERSION}") endif (NOT PETSC_VALID) 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 OR APPLE) set(PETSC_LINK_LIBRARIES "") foreach (_PETSC_LIB ${PETSC_LIBRARIES}) find_library(_PETSC_LINK_LIB ${_PETSC_LIB} PATHS ${PETSC_LIBRARY_DIRS} NO_DEFAULT_PATH) list(APPEND PETSC_LINK_LIBRARIES ${_PETSC_LINK_LIB}) endforeach() message(STATUS " Found PETSc library ${PETSC_LINK_LIBRARIES}") target_link_libraries(${_TARGET_} ${_SCOPE_} ${PETSC_LINK_LIBRARIES}) endif (LINK_EXECUTABLE OR APPLE) # 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}) file(READ ${PARMETIS_HEADER_FILE} PARMETIS_HEADER_FILE_CONTENT) string(FIND "${PARMETIS_HEADER_FILE_CONTENT}" "ParMETIS_V3_PartKway" PARMETIS_PARTKWAY_VALID) string(FIND "${PARMETIS_HEADER_FILE_CONTENT}" "ParMETIS_V3_Mesh2Dual" PARMETIS_MESH2DUAL_VALID) string(FIND "${PARMETIS_HEADER_FILE_CONTENT}" "ParMETIS_V3_AdaptiveRepart" PARMETIS_ADAPTIVEREPART_VALID) string(FIND "${PARMETIS_HEADER_FILE_CONTENT}" "ParMETIS_V3_RefineKway" PARMETIS_REFINEKWAYVALID) if (NOT (PARMETIS_PARTKWAY_VALID AND PARMETIS_MESH2DUAL_VALID AND PARMETIS_ADAPTIVEREPART_VALID AND PARMETIS_REFINEKWAYVALID)) message(FATAL_ERROR "ParMETIS installation not complete. Not all required symbols found in ${PARMETIS_HEADER_FILE}.") endif () else() message(FATAL_ERROR "Could not find ParMetis header file 'parmetis.h'!") endif (PARMETIS_HEADER_FILE) if (LINK_EXECUTABLE OR APPLE) 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 OR APPLE) # 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 OR APPLE) 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 OR APPLE) # blas library is required if (LINK_EXECUTABLE OR APPLE) 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 OR APPLE) # lapack library is required if (LINK_EXECUTABLE OR APPLE) 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 OR APPLE) endmacro(target_enable_petsc)