On Feb 9, 2013, at 11:57 AM, Karl Rupp <rupp at mcs.anl.gov> wrote:
> Hi Jed,
>
>> If we we did negative defines
>>
>> #define PETSC_HAVE_SOMETHING 0
>>
>> then we could have normal code
>>
>> if (PETSC_HAVE_SOMETHING) {
>> some_func(ibuprofen);
>> } else { ... }
>>
>> The problem with this is that (a) we always need to define everything so
>> petscconf.h becomes larger and configure becomes more tightly coupled in
>> some ways, and (b) any use of #if defined(PETSC_HAVE_SOMETHING) will
>> evaluate true even for a negative define. This last instance is such a
>> confusing source of bugs that almost every project avoids it.
>
> (a) might lead to a larger petscconf.h, but at the same time it always
> contains a full list of packages that can be used within PETSc. I wouldn't
> consider this to be a drawback.
>
> Fortunately, b) can be checked easily with 'style checkers', keeping the
> lifetime of such a bug below 1 day.
>
>
>> To convert this to usual C semantics, we could use (yet another) macro trick
>
> Replacing CPP with CPP to get rid of CPP? That does not sound like a good
> approach :-D
>
>
>> With this sort of thing, we could write
>>
>> if (PETSC_HAVE_(SOMETHING)) {
>> some_func(no_headache);
>> } else { ... }
>>
>> which can be reasoned about using normal C semantics. The condition
>> evaluates at compile time so the code produced (with any optimization)
>> is identical. If different functions are called in the two cases, the
>> linker may request both of them. (This can be good or bad.)
>
> Since #if defined(...) is often used to conditionally enable calls to
> external libraries, this would require us to either disallow all direct calls
> to external libraries in all of PETSc core (and use some sublibrary-type
> generic interface instead), or to always link against all libraries. The
> latter is a nightmare with respect to support-requests to petsc-maint.
Most of the time (except for when Matt starts typing) each external library
is associated with a few files that only get seen if the external library is
present (for example, ML, hypre, superLU, etc etc) thus all those external
libraries do not lead to the #if defined() nightmare.
Barry
>
> Best regards,
> Karli
>