1 #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/
2
3 /*@
4 PetscHasExternalPackage - Determine whether PETSc has been configured with the given package
5
6 Not Collective
7
8 Input Parameter:
9 . pkg - external package name
10
11 Output Parameter:
12 . has - `PETSC_TRUE` if PETSc is configured with the given package, else `PETSC_FALSE`.
13
14 Level: intermediate
15
16 Notes:
17 This is basically an alternative for `PETSC_HAVE_XXX` whenever a preprocessor macro is not available/desirable, e.g. in Python.
18
19 The external package name pkg is e.g. "hdf5", "yaml", "parmetis".
20 It should correspond to the name listed in `./configure --help` or e.g. in `PetscViewerType`, `MatPartitioningType`, `MatSolverType`.
21
22 The lookup is case insensitive, i.e. looking for "HDF5" or "hdf5" is the same.
23
24 .seealso: `PetscViewerType`, `MatPartitioningType`, `MatSolverType`
25 @*/
PetscHasExternalPackage(const char pkg[],PetscBool * has)26 PetscErrorCode PetscHasExternalPackage(const char pkg[], PetscBool *has)
27 {
28 char pkgstr[128], *loc;
29 size_t cnt;
30
31 PetscFunctionBegin;
32 PetscAssertPointer(pkg, 1);
33 PetscAssertPointer(has, 2);
34 PetscCall(PetscSNPrintfCount(pkgstr, sizeof(pkgstr), ":%s:", &cnt, pkg));
35 PetscCheck(cnt < sizeof(pkgstr), PETSC_COMM_SELF, PETSC_ERR_SUP, "Package name is too long: \"%s\"", pkg);
36 PetscCall(PetscStrtolower(pkgstr));
37 #if defined(PETSC_HAVE_PACKAGES)
38 PetscCall(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 PetscFunctionReturn(PETSC_SUCCESS);
44 }
45