xref: /petsc/src/sys/objects/package.c (revision 1ed6e3ff8437baa411029a28c2b08f047df9ad9a)
160fbe2beSVaclav Hapla #include <petsc/private/petscimpl.h> /*I    "petscsys.h"   I*/
260fbe2beSVaclav Hapla 
3*cc4c1da9SBarry Smith /*@
460fbe2beSVaclav Hapla   PetscHasExternalPackage - Determine whether PETSc has been configured with the given package
560fbe2beSVaclav Hapla 
660fbe2beSVaclav Hapla   Not Collective
760fbe2beSVaclav Hapla 
82fe279fdSBarry Smith   Input Parameter:
960fbe2beSVaclav Hapla . pkg - external package name
1060fbe2beSVaclav Hapla 
112fe279fdSBarry Smith   Output Parameter:
12811af0c4SBarry Smith . has - `PETSC_TRUE` if PETSc is configured with the given package, else `PETSC_FALSE`.
1360fbe2beSVaclav Hapla 
1460fbe2beSVaclav Hapla   Level: intermediate
1560fbe2beSVaclav Hapla 
1660fbe2beSVaclav Hapla   Notes:
1721532e8aSBarry Smith   This is basically an alternative for `PETSC_HAVE_XXX` whenever a preprocessor macro is not available/desirable, e.g. in Python.
1860fbe2beSVaclav Hapla 
1960fbe2beSVaclav Hapla   The external package name pkg is e.g. "hdf5", "yaml", "parmetis".
2021532e8aSBarry Smith   It should correspond to the name listed in  `./configure --help`  or e.g. in `PetscViewerType`, `MatPartitioningType`, `MatSolverType`.
2160fbe2beSVaclav Hapla 
2260fbe2beSVaclav Hapla   The lookup is case insensitive, i.e. looking for "HDF5" or "hdf5" is the same.
2360fbe2beSVaclav Hapla 
24db781477SPatrick Sanan .seealso: `PetscViewerType`, `MatPartitioningType`, `MatSolverType`
2560fbe2beSVaclav Hapla @*/
PetscHasExternalPackage(const char pkg[],PetscBool * has)26d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscHasExternalPackage(const char pkg[], PetscBool *has)
27d71ae5a4SJacob Faibussowitsch {
2860fbe2beSVaclav Hapla   char   pkgstr[128], *loc;
2960fbe2beSVaclav Hapla   size_t cnt;
3060fbe2beSVaclav Hapla 
3160fbe2beSVaclav Hapla   PetscFunctionBegin;
324f572ea9SToby Isaac   PetscAssertPointer(pkg, 1);
334f572ea9SToby Isaac   PetscAssertPointer(has, 2);
349566063dSJacob Faibussowitsch   PetscCall(PetscSNPrintfCount(pkgstr, sizeof(pkgstr), ":%s:", &cnt, pkg));
355f80ce2aSJacob Faibussowitsch   PetscCheck(cnt < sizeof(pkgstr), PETSC_COMM_SELF, PETSC_ERR_SUP, "Package name is too long: \"%s\"", pkg);
369566063dSJacob Faibussowitsch   PetscCall(PetscStrtolower(pkgstr));
3760fbe2beSVaclav Hapla #if defined(PETSC_HAVE_PACKAGES)
389566063dSJacob Faibussowitsch   PetscCall(PetscStrstr(PETSC_HAVE_PACKAGES, pkgstr, &loc));
3960fbe2beSVaclav Hapla #else
4060fbe2beSVaclav Hapla   #error "PETSC_HAVE_PACKAGES macro undefined. Please reconfigure"
4160fbe2beSVaclav Hapla #endif
4260fbe2beSVaclav Hapla   *has = loc ? PETSC_TRUE : PETSC_FALSE;
433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4460fbe2beSVaclav Hapla }
45