On 10/06/2011 08:51 PM, Robert Dailey wrote:
> Well there you go, deleting the cache & reconfiguring fixed it. That was
> weird.
>
> Thanks for the help!
FYI, the attached CMakeLists.txt examines a variable's value in 5 cases:
NONEXIST: No value in current scope or in cache.
SCOPEONLY: Value in current scope, no value in cache.
CACHEONLY: No value in current scope, value in cache.
BOTHEQUAL: The same value in current scope and cache.
BOTHUNEQUAL: Different values in current scope and cache.
The findings are:
NOT STREQUAL, NONEXIST[SCOPE]=, NONEXIST[CACHE]=
STREQUAL, SCOPEONLY[SCOPE]=xyz, SCOPEONLY[CACHE]=
STREQUAL, CACHEONLY[SCOPE]=xyz, CACHEONLY[CACHE]=xyz
STREQUAL, BOTHEQUAL[SCOPE]=xyz, BOTHEQUAL[CACHE]=xyz
STREQUAL, BOTHUNEQUAL[SCOPE]=xyz, BOTHUNEQUAL[CACHE]=abc
AFAICS, this is exactly what one would expect, i.e. STREQUAL refers to
the variable's value in the current scope and uses the cached value as
fallback - in CACHEONLY - if the variable has no current-scope value.
This is with CMake 2.8.6; do you gain different results?
Regards,
Michael
> On Thu, Oct 6, 2011 at 1:50 PM, Robert Dailey <[email protected]> wrote:
>
>> Ok interesting, it is working for me too. I guess my reproducible use case
>> was invalid.
>>
>> (BTW, I'm running through cmake-gui on Windows 7 x64 using CMake version
>> 2.8.5)
>>
>> My use case was a simplified version of the real code. FUBARTEST is
>> actually a cache variable defined by the root CMakeLists.txt file. In my
>> real test case, my STREQUAL statement is failing to execute the conditional
>> code when I do this:
>>
>> if( NEMO_TARGET STREQUAL "NSPR" )
>>
>> However if I do this, it works:
>>
>> if( "${NEMO_TARGET}" STREQUAL "NSPR" )
>>
>> I don't know why both would behave differently. Just to rule out the cache
>> variable being the issue, I tried this (I attempted to make the SET() call
>> override the originally defined cache variable. I did not actually remove
>> the variable from cache):
>>
>> set( NEMO_TARGET "NSPR" )
>> if( NEMO_TARGET STREQUAL "NSPR" )
>>
>> Of course, this statement did not result in the enclosed message() being
>> executed.
>>
>> I have tried creating a small test case to reproduce this issue but so far
>> I have been unsuccessful. I'll try clearing my cache to rule out any issues
>> there. In the meantime if you have any suspicions or have run into this
>> before, please give me some ideas on how to solve this :)
>>
>> Thanks.
>>
>> ---------
>> Robert Dailey
>>
>>
>>
>> On Thu, Oct 6, 2011 at 1:31 PM, Eric Noulard <[email protected]>wrote:
>>
>>> 2011/10/6 Robert Dailey <[email protected]>:
>>>> According to the CMake documentation, the `STREQUAL` comparison is
>>> allowed
>>>> to take either a VARIABLE or a STRING as either parameter. So, in this
>>>> example below, the message does NOT print, which is broken:
>>>> set( FUBARTEST "OK" )
>>>> if( FUBARTEST STREQUAL "OK" )
>>>> message( "It Worked" )
>>>> endif()
>>>> Any reason why this isn't working as documented?
>>>
>>> Don't know but it works just fine for on Linux + CMake 2.8.6
>>> which cmake version are you using?
>>>
>>> Could you try running
>>> cmake --trace --debug-output -P fubartest.cmake
>>>
>>> and tell us waht's printed out?
>>>
>>>
>>>
>>> --
>>> Erk
>>> Membre de l'April - « promouvoir et défendre le logiciel libre » -
>>> http://www.april.org
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(STREQUAL NONE)
SET(CMAKE_VERBOSE_MAKEFILE ON)
UNSET(NONEXIST)
UNSET(NONEXIST CACHE)
IF(NONEXIST STREQUAL "xyz")
MESSAGE("STREQUAL, NONEXIST[SCOPE]=${NONEXIST},
NONEXIST[CACHE]=$CACHE{NONEXIST}")
ELSE()
MESSAGE("NOT STREQUAL, NONEXIST[SCOPE]=${NONEXIST},
NONEXIST[CACHE]=$CACHE{NONEXIST}")
ENDIF()
SET(SCOPEONLY "xyz")
UNSET(SCOPEONLY CACHE)
IF(SCOPEONLY STREQUAL "xyz")
MESSAGE("STREQUAL, SCOPEONLY[SCOPE]=${SCOPEONLY},
SCOPEONLY[CACHE]=$CACHE{SCOPEONLY}")
ELSE()
MESSAGE("NOT STREQUAL, SCOPEONLY[SCOPE]=${SCOPEONLY},
SCOPEONLY[CACHE]=$CACHE{SCOPEONLY}")
ENDIF()
SET(CACHEONLY "xyz" CACHE STRING "" FORCE)
SET(CACHEONLY "pqr") # In order to check if UNSET(CACHEONLY) really...
UNSET(CACHEONLY) # ...unsets CACHEONLY only in the current scope.
IF(CACHEONLY STREQUAL "xyz")
MESSAGE("STREQUAL, CACHEONLY[SCOPE]=${CACHEONLY},
CACHEONLY[CACHE]=$CACHE{CACHEONLY}")
ELSE()
MESSAGE("NOT STREQUAL, CACHEONLY[SCOPE]=${CACHEONLY},
CACHEONLY[CACHE]=$CACHE{CACHEONLY}")
ENDIF()
SET(BOTHEQUAL "xyz" CACHE STRING "" FORCE)
SET(BOTHEQUAL "xyz") # Actually unnecessary.
IF(BOTHEQUAL STREQUAL "xyz")
MESSAGE("STREQUAL, BOTHEQUAL[SCOPE]=${BOTHEQUAL},
BOTHEQUAL[CACHE]=$CACHE{BOTHEQUAL}")
ELSE()
MESSAGE("NOT STREQUAL, BOTHEQUAL[SCOPE]=${BOTHEQUAL},
BOTHEQUAL[CACHE]=$CACHE{BOTHEQUAL}")
ENDIF()
SET(BOTHUNEQUAL "abc" CACHE STRING "" FORCE)
SET(BOTHUNEQUAL "xyz")
IF(BOTHUNEQUAL STREQUAL "xyz")
MESSAGE("STREQUAL, BOTHUNEQUAL[SCOPE]=${BOTHUNEQUAL},
BOTHUNEQUAL[CACHE]=$CACHE{BOTHUNEQUAL}")
ELSE()
MESSAGE("NOT STREQUAL, BOTHUNEQUAL[SCOPE]=${BOTHUNEQUAL},
BOTHUNEQUAL[CACHE]=$CACHE{BOTHUNEQUAL}")
ENDIF()
--
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Follow this link to subscribe/unsubscribe:
http://www.cmake.org/mailman/listinfo/cmake