"Smith, Barry F." <bsm...@mcs.anl.gov> writes:

>> On Jun 26, 2019, at 1:53 PM, Jed Brown <j...@jedbrown.org> wrote:
>> 
>> "Smith, Barry F." <bsm...@mcs.anl.gov> writes:
>> 
>>>  It can be a plug-in whose source sits in the PETSc source tree, even in 
>>> the PC directory. It gets built by the PETSc build system after the 
>>> build system installs PETSc and SLEPc (in the Spack world it would have its 
>>> own Spack file that just depends on PETSc and SLEPc). Pretty easy to setup 
>>> (and yes less hacky than my previous suggestion). 
>>> 
>>>   The only thing missing is the PCRegister(newmethod) inside the PETSc 
>>> library so -pc_type newmethod is truly transparent but actually even that 
>>> is workable with dynamic libraries, each PETSc dynamic library has a 
>>> function that is called by PETSc when PETSc loads the library, this routine 
>>> could call the registration function. One can provide, for example in an 
>>> environmental variable a list of dynamic library plug-ins that PETSc loads, 
>>> but I now realized
>>> and even more transparent way, in the PETSc install library directory we 
>>> have a subdirectory (called say petsc-plugins), PETSc sys would 
>>> automatically load these libraries at run time and thus transparently 
>>> register the new PC.  Almost close enough to satisfy Matt without the 
>>> hackyness of my first suggestion that Jed hated. Drawback, only with 
>>> dynamic libraries for the plug-ins.
>> 
>> With static libraries, the user would just need to link the 
>> libpetsc-plugin.a.
>> 
>> Actual registration can be done using __attribute((constructor)) (or a
>> C++ static constructor, but I think the attribute is widely supported).
>
>   Good idea. If the combination of the two is widely supported then we don't 
> need to even worry about the dynamic library case; which will be a relieve

We're using __attribute((constructor)) in libCEED to avoid having a central 
registration list (like in PCRegisterAll).  It has been working fine.

Reply via email to