Actual source code: package.c


  2: #include <petsc/private/petscimpl.h>

  4: /*@C
  5:    PetscHasExternalPackage - Determine whether PETSc has been configured with the given package

  7:    Not Collective

  9:    Input Parameters:
 10: .  pkg - external package name

 12:    Output Parameters:
 13: .  has - `PETSC_TRUE` if PETSc is configured with the given package, else `PETSC_FALSE`.

 15:    Level: intermediate

 17:    Notes:
 18:    This is basically an alternative for PETSC_HAVE_XXX whenever a preprocessor macro is not available/desirable, e.g. in Python.

 20:    The external package name pkg is e.g. "hdf5", "yaml", "parmetis".
 21:    It should correspond to the name listed in  ./configure --help  or e.g. in PetscViewerType, MatPartitioningType, MatSolverType.

 23:    The lookup is case insensitive, i.e. looking for "HDF5" or "hdf5" is the same.

 25: .seealso: `PetscViewerType`, `MatPartitioningType`, `MatSolverType`
 26: @*/
 27: PetscErrorCode PetscHasExternalPackage(const char pkg[], PetscBool *has)
 28: {
 29:   char   pkgstr[128], *loc;
 30:   size_t cnt;

 34:   PetscSNPrintfCount(pkgstr, sizeof(pkgstr), ":%s:", &cnt, pkg);
 36:   PetscStrtolower(pkgstr);
 37: #if defined(PETSC_HAVE_PACKAGES)
 38:   PetscStrstr(PETSC_HAVE_PACKAGES, pkgstr, &loc);
 39: #else
 40:   #error "PETSC_HAVE_PACKAGES macro undefined. Please reconfigure"
 41: #endif
 42:   *has = loc ? PETSC_TRUE : PETSC_FALSE;
 43:   return 0;
 44: }