xref: /petsc/src/sys/objects/package.c (revision 1ed6e3ff8437baa411029a28c2b08f047df9ad9a)
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