[CMake] Weird STREQUAL behaviour
    Marcel Loose 
    loose at astron.nl
       
    Tue Mar 31 05:40:21 EDT 2009
    
    
  
Hi all,
Could anyone shed a light on the following. IMHO it's a bug. 
I'm running cmake version 2.6-patch 2.
Here's my initial CMakeLists.txt file:
cmake_minimum_required(VERSION 2.6)
set(options fine good bad)
option(fine "Fine" OFF)
option(good "Good" OFF)
option(bad "Bad" OFF)
foreach(opt ${options})
  message(STATUS "opt = ${opt}")
  if(opt STREQUAL "fine")
    message(STATUS "This is fine")
  elseif(opt STREQUAL "good")
    message(STATUS "This is good")
  else(opt STREQUAL "fine")
    message(FATAL_ERROR "This is bad!")
  endif(opt STREQUAL "fine")
endforeach(opt ${options})
Running cmake produces the following output:
...
-- opt = fine
CMake Error at CMakeLists.txt:13 (message):
  This is bad!
...
which is not what I expected.
Quoting the variable opt in CMakeLists.txt yields:
cmake_minimum_required(VERSION 2.6)
set(options fine good bad)
option(fine "Fine" OFF)
option(good "Good" OFF)
option(bad "Bad" OFF)
foreach(opt ${options})
  message(STATUS "opt = ${opt}")
  if("${opt}" STREQUAL "fine")
    message(STATUS "This is fine")
  elseif("${opt}" STREQUAL "good")
    message(STATUS "This is good")
  else("${opt}" STREQUAL "fine")
    message(FATAL_ERROR "This is bad!")
  endif("${opt}" STREQUAL "fine")
endforeach(opt ${options})
Running cmake produces the following output:
...
-- opt = fine
-- This is fine
-- opt = good
-- This is fine
-- opt = bad
-- This is fine
...
which, again, is not what I expected.
Replacing STREQUAL with MATCHES in the initial CMakeLists.txt file
yields:
cmake_minimum_required(VERSION 2.6)
set(options fine good bad)
option(fine "Fine" OFF)
option(good "Good" OFF)
option(bad "Bad" OFF)
foreach(opt ${options})
  message(STATUS "opt = ${opt}")
  if(opt MATCHES "^fine$")
    message(STATUS "This is fine")
  elseif(opt MATCHES "^good$")
    message(STATUS "This is good")
  else(opt MATCHES "^fine$")
    message(FATAL_ERROR "This is bad!")
  endif(opt MATCHES "^fine$")
endforeach(opt ${options})
Running cmake produces the following output:
...
-- opt = fine
-- This is fine
-- opt = good
-- This is good
-- opt = bad
CMake Error at CMakeLists.txt:13 (message):
  This is bad!
...
which is, finally, what I expected! 
Is there something wrong with STREQUAL or do I simply fail to understand
how STREQUAL is supposed to work?
Best regards,
Marcel Loose.
    
    
More information about the CMake
mailing list