From: Alan W. Irwin <irwin@be...>  20090227 23:25:38

On 20090227 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 CMake2.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 reconfiguration. > And if cmake is run again, the variables are taken correctly from the cache. I suggest you drop all reuse 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 reuse 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 equationofstate 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). __________________________ Linuxpowered Science __________________________ 