[CMake] set(a b); set(b c); if(a STREQUAL b OR a STREQUAL c) ...

Ruslan Baratov ruslan_baratov at yahoo.com
Fri Sep 5 07:19:31 EDT 2014


On 04-Sep-14 20:40, Hendrik Sattler wrote:
>
> On 4. September 2014 16:38:21 MESZ, Ruslan Baratov via CMake <cmake at cmake.org> wrote:
>> On 04-Sep-14 18:09, Anders Lindgren wrote:
>>> make sure that the argument don't form a valid variable name.
>> It's not possible
>>
>>>      set(a b)
>>>      set(b c)
>>>      if(">${a}<" STREQUAL ">b<" OR ">${a}<" STREQUAL ">c<")
>>>        message("true")
>>>      endif()
>> How about that:
>>
>> set(a "") # variable `a` is empty
>> set("><" ">b<")
>>
>> if(">${a}<" STREQUAL ">b<")
>>    message("Value of variable with name `a` is `b`!")
>> endif()
> I really do not understand this argument.
> Do you have so little control over your build tool (and that's what CMake is)?
> Nobody makes variables like this. Maybe to break the build script on purpose. And then, it breaks, so what?
>
> HS
>
The solution ">...<" not changing the reason of the problem - ambiguity. 
It's just making things more obscure. My example prove that statement 
"make sure that the argument don't form a valid variable name" by 
creating string ">...<" is wrong. Here is example of how "strange" names 
can appear:

# User's code
macro(set_version package component version)
   set("${package}-${CMAKE_DEBUG_POSTFIX}_${component}" "${version}")
endmacro()

set(CMAKE_DEBUG_POSTFIX d)

if(Somepackage_FOUND)
   set(pack_name "Somepackage")
   set(pack_component "Somecomp")
   set(pack_version "1.2.3")
else()
   set(pack_name "")
   set(pack_component "")
   set(pack_version "")
endif()

set_version("${pack_name}" "${component}" "${version}")

find_package(...) # User call my code here

If package not found the variable "-d_" is defined and empty. Some user 
choose "-" and "_", the other choose ">" and "<". I don't want to 
blame/teach *users* for creating such names. The important thing is that 
it will not ruin my code.

Cheers, Ruslo


More information about the CMake mailing list