On 2009-02-27 22:13+0100 Werner Smekal wrote:

> Hi Alan,
> [out of order]What I don't understand is, that
>
> check_symbol_exists(finite "math.h" HAVE_FINITE)
> if(NOT HAVE_FINITE)
> check_function_exists(finite HAVE_FINITE)
> endif(NOT HAVE_FINITE)
>
> Doesn't work. check_function_exists is called, but IF("${VARIABLE}" MATCHES 
> "^${VARIABLE}$") in CheckFunctionsExists.cmake/CheckFunctionsExists.cmake is 
> true for check_symbol_exists and false for check_function_exists???? 
> HAVE_FINITE is both times "".I also don't understand "${VARIABLE}" MATCHES 
> "^${VARIABLE}$" - I was playing around with a regex checker and no matter 
> what I did ("test" matches "^test$", "" matches "^$", etc.) this statement 
> was always true. Why it is false for check_function_exists I don't get. This 
> would make the logic a lot easier ....

IF("${VARIABLE}" MATCHES "^${VARIABLE}$")

Is CMake-2.2 (or so) logic which I never understood either, but from
explanations I got years ago on the CMake mailing list it works on all
versions of CMake just like the more modern

IF(NOT DEFINED VARIABLE)

which is true if the variable has not been set at all, but false otherwise
(even if the variable has been set to "").  So reusing the HAVE_FINITE
variable the way you propose above just won't work.



> Thanks for the explanations. I changed the code now to:
>
> check_symbol_exists(finite "math.h" HAVE_FINITE)
> if(NOT HAVE_FINITE)
> check_function_exists(finite HAVE_FINITE2)
> if(HAVE_FINITE2)
>   set(HAVE_FINITE ${HAVE_FINITE2} CACHE INTERNAL "Have function finite")
> else(HAVE_FINITE2)
>   check_symbol_exists(_finite "math.h" _HAVE_FINITE)
>   if(NOT _HAVE_FINITE)
>     check_function_exists(_finite _HAVE_FINITE2)
>     if(_HAVE_FINITE2)
>       set(_HAVE_FINITE ${_HAVE_FINITE2} CACHE INTERNAL "Have function 
> _finite")
>       set(HAVE_FINITE ${_HAVE_FINITE} CACHE INTERNAL "Have function 
> _finite")
>     endif(_HAVE_FINITE2)
>     set(_HAVE_FINITE2 "" CACHE INTERNAL "Have function _finite")
>   endif(NOT _HAVE_FINITE)
> endif(HAVE_FINITE2)
> set(HAVE_FINITE2 "" CACHE INTERNAL "Have function finite")
> endif(NOT HAVE_FINITE)
>
> This works now, and using Visual C++ doesn't always lead to re-configuration. 
> And if cmake is run again, the variables are taken correctly from the cache.

I suggest you drop all re-use of variables for the reasons I mentioned to
produce a reliable result in all cases (not just the ones you have tested
so far).

So I suggest this version which stores the result in the uncached variable
HAVE_FINITE with everything else in cached variables which are marked as
advanced.  (This follows the suggestion for the best way to return results
from CMake modules.)

check_symbol_exists(finite "math.h" HAVE_FINITE_SYMBOL)
if(HAVE_FINITE_SYMBOL)
   set(HAVE_FINITE ON)
else(HAVE_FINITE_SYMBOL)
   check_function_exists(finite HAVE_FINITE_FUNCTION)
   if(HAVE_FINITE_FUNCTION)
     set(HAVE_FINITE ON)
   else(HAVE_FINITE_FUNCTION)
     check_symbol_exists(_finite "math.h" HAVE__FINITE_SYMBOL)
     if(HAVE__FINITE_SYMBOL)
       set(HAVE_FINITE ON)
     else(HAVE__FINITE_SYMBOL)
       check_function_exists(_finite "math.h" HAVE__FINITE_FUNCTION)
       if(HAVE__FINITE_FUNCTION)
        set(HAVE_FINITE ON)
       endif(HAVE__FINITE_FUNCTION)
     endif(HAVE__FINITE_SYMBOL)
   endif(HAVE_FINITE_FUNCTION)
endif(NOT HAVE_FINITE_SYMBOL)

mark_as_advanced(
   HAVE_FINITE_SYMBOL
   HAVE_FINITE_FUNCTION
   HAVE__FINITE_SYMBOL
   HAVE__FINITE_FUNCTION
   )

Note, I have not checked this completely so there might be a typo in there,
but The above logic has clean flow which I presume most CMake users can
understand at a glance.  It follows the rule there is no re-use of
check_function/symbol_exists variables for other purposes, and HAVE_FINITE
gets set properly (or not at all if no alternative works) the first time. On
subsequent times HAVE_FINITE gets set quite rapidly from the cached values
of the advanced variables since the search is skipped entirely inside
check_????_exists and the existing cached value of the unique variable left
untouched, instead.

HTH.

Alan
__________________________
Alan W. Irwin

Astronomical research affiliation with Department of Physics and Astronomy,
University of Victoria (astrowww.phys.uvic.ca).

Programming affiliations with the FreeEOS equation-of-state implementation
for stellar interiors (freeeos.sf.net); PLplot scientific plotting software
package (plplot.org); the libLASi project (unifont.org/lasi); the Loads of
Linux Links project (loll.sf.net); and the Linux Brochure Project
(lbproject.sf.net).
__________________________

Linux-powered Science
__________________________

------------------------------------------------------------------------------
Open Source Business Conference (OSBC), March 24-25, 2009, San Francisco, CA
-OSBC tackles the biggest issue in open source: Open Sourcing the Enterprise
-Strategies to boost innovation and cut costs with open source participation
-Receive a $600 discount off the registration fee with the source code: SFAD
http://p.sf.net/sfu/XcvMzF8H
_______________________________________________
Plplot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/plplot-devel

Reply via email to