|
| 1 | +find_package(PkgConfig REQUIRED) |
| 2 | +if(DEFINED PETSC_DIR) |
| 3 | + if(DEFINED PETSC_ARCH) |
| 4 | + set(ENV{PKG_CONFIG_PATH} "${PETSC_DIR}/${PETSC_ARCH}/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}") |
| 5 | + else() |
| 6 | + set(ENV{PKG_CONFIG_PATH} "${PETSC_DIR}/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}") |
| 7 | + endif() |
| 8 | +endif() |
| 9 | + |
| 10 | +# we give an internal name _petsc |
| 11 | +# so we can fill up the PETSC_VARIABLE based |
| 12 | +# on static or not |
| 13 | +pkg_check_modules(_petsc PETSc) |
| 14 | + |
| 15 | +find_file(_petsc_PC_FILE petsc.pc |
| 16 | + PATHS ${_petsc_LIBRARY_DIRS}/../lib/pkgconfig |
| 17 | + ${_petsc_STATIC_LIBRARY_DIRS}/../lib/pkgconfig |
| 18 | + ENV PKG_CONFIG_PATH |
| 19 | + NO_DEFAULT_PATH) |
| 20 | +if(_petsc_PC_FILE) |
| 21 | + file(READ "${_petsc_PC_FILE}" _petsc_PC_CONTENTS) |
| 22 | + message(STATUS "PETSc .pc file: ${_petsc_PC_FILE}") |
| 23 | + message(STATUS "PETSc .pc contents:\n${_petsc_PC_CONTENTS}") |
| 24 | +endif() |
| 25 | + |
| 26 | +if(_petsc_FOUND AND _petsc_VERSION) |
| 27 | + set(PETSC_VERSION ${_petsc_VERSION}) |
| 28 | +endif() |
| 29 | + |
| 30 | +# note, there are a number of additional properties that |
| 31 | +# can be extracted / set on a target. We just do the basic |
| 32 | +# set for now. See: https://cmake.org/cmake/help/latest/module/FindPkgConfig.html |
| 33 | +if(PCMS_LINK_PETSC_STATIC) |
| 34 | + message(STATUS "STATIC PETSC BUILD") |
| 35 | + set(PETSC_LIBRARIES ${_petsc_STATIC_LINK_LIBRARIES}) |
| 36 | + set(PETSC_INCLUDE_DIRS ${_petsc_STATIC_INCLUDE_DIRS}) |
| 37 | + set(PETSC_LIBRARY_DIRS ${_petsc_STATIC_LIBRARY_DIRS}) |
| 38 | + set(PETSC_LDFLAGS ${_petsc_STATIC_LDFLAGS}) |
| 39 | + set(PETSC_LDFLAGS_OTHER ${_petsc_STATIC_LDFLAGS_OTHER}) |
| 40 | +elseif(_petsc_FOUND) |
| 41 | + message(STATUS "SHARED PETSC BUILD") |
| 42 | + set(PETSC_LIBRARIES ${_petsc_LINK_LIBRARIES}) |
| 43 | + set(PETSC_INCLUDE_DIRS ${_petsc_INCLUDE_DIRS}) |
| 44 | + set(PETSC_LIBRARY_DIRS ${_petsc_LIBRARY_DIRS}) |
| 45 | + set(PETSC_LDFLAGS ${_petsc_LDFLAGS}) |
| 46 | + set(PETSC_LDFLAGS_OTHER ${_petsc_LDFLAGS_OTHER}) |
| 47 | +endif() |
| 48 | +message(STATUS "PETSC_LIBRARIES ${PETSC_LIBRARIES}") |
| 49 | +message(STATUS "PETSC_INCLUDE_DIRS ${PETSC_INCLUDE_DIRS}") |
| 50 | +message(STATUS "PETSC_LIBRARY_DIRS ${PETSC_LIBRARY_DIRS}") |
| 51 | +message(STATUS "PETSC_LDFLAGS ${PETSC_LDFLAGS}") |
| 52 | +message(STATUS "PETSC_LDFLAGS_OTHER ${PETSC_LDFLAGS_OTHER}") |
| 53 | + |
| 54 | + |
| 55 | +if(NOT TARGET PETSc::PETSc) |
| 56 | + add_library(PETSc::PETSc INTERFACE IMPORTED GLOBAL) |
| 57 | + set_target_properties(PETSc::PETSc PROPERTIES INTERFACE_LINK_LIBRARIES "${PETSC_LIBRARIES}" |
| 58 | + INTERFACE_INCLUDE_DIRECTORIES "${PETSC_INCLUDE_DIRS}" |
| 59 | + INTERFACE_LINK_DIRECTORIES "${PETSC_LIBRARY_DIRS}" |
| 60 | + INTERFACE_LINK_OPTIONS "${PETSC_LDFLAGS_OTHER}") |
| 61 | +endif() |
| 62 | + |
| 63 | + |
| 64 | + |
| 65 | +include(FindPackageHandleStandardArgs) |
| 66 | +# TODO consider adding version check logic |
| 67 | +find_package_handle_standard_args(PETSc |
| 68 | + REQUIRED_VARS PETSC_LIBRARIES PETSC_INCLUDE_DIRS |
| 69 | + VERSION_VAR PETSC_VERSION) |
0 commit comments