Is this something new to 2.6, or is it the same as 2.4?


Alan W. Irwin wrote:
The LIST command has issues when dealing with a list with some empty elements.

To see this try the following CMakeLists.txt

set(list_example "1;;;2;3;4")
message("list_example = ${list_example}")
list(APPEND list_example "5")
message("list_example = ${list_example}")
list(LENGTH list_example list_example_length)
message("list_example_length = ${list_example_length}")
list(GET list_example 1 list_example1)
message("list_example1 = ${list_example1}")
list(REMOVE_AT list_example 5)
message("list_example = ${list_example}")

The result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2

CMake Error at CMakeLists.txt:5 (list):
  list index: 5 out of range (-5, 4)

So APPEND is fine, but LENGTH, GET, and REMOVE_AT work as if the two empty
components of the list are not there.

VARIANT 1.

If I replace the last two lines by

list(REMOVE_AT list_example 1)
message("list_example = ${list_example}")

the result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2
list_example = 1;3;4;5

VARIANT 2.

If I replace the last two lines by

list(REMOVE_ITEM list_example "1")
message("list_example = ${list_example}")

the result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2
list_example = 2;3;4;5

VARIANT 3.

If I replace the last two lines by

list(REMOVE_ITEM list_example "")
message("list_example = ${list_example}")

the result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2
list_example = 1;2;3;4;5

VARIANT 4.

If I replace the last two lines by

list(SORT list_example 1)
message("list_example = ${list_example}")

the result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2
list_example = 1;2;3;4;5

VARIANT 5.

If I replace the last two lines by

list(REVERSE list_example 1)
message("list_example = ${list_example}")

the result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2
list_example = 5;4;3;2;1

VARIANT 6.

If I replace the last two lines by

list(FIND list_example "1" one_index)
message("list_example = ${list_example}")
message("one_index = ${one_index}")

the result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2
list_example = 1;;;2;3;4;5
one_index = 0

VARIANT 7.

If I replace the last two lines by

list(FIND list_example "" null_index)
message("list_example = ${list_example}")
message("null_index = ${null_index}")

the result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2
list_example = 1;;;2;3;4;5
null_index = -1

VARIANT 8.

If I replace the last two lines by

list(INSERT list_example 4 6 7)
message("list_example = ${list_example}")

the result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2
list_example = 1;2;3;4;6;7;5

All the above results for LENGTH, GET, REMOVE_AT, REMOVE_ITEM, SORT,
REVERSE, and INSERT are consistent with the mental model that no indices are
assigned to empty elements of a CMake list, and the result has the empty
elements dropped (which by accident gives the correct result for REMOVE_ITEM
when an empty element is dropped). However, from the above results APPEND
keeps those empty elements in the result, as does FIND, (but FIND cannot
find those empty elements).

I am not aware of any other language that ignores empty elements or drops
them from the results for certain operations so I believe the above results
are symptoms of a language bug that needs to be addressed.  I don't know
CMake well enough to give you a patch, but I assume it is a fairly trivial
fix.

I also have a wishlist bug to report which I hope gets addressed at the same
time as the more serious bug above.

VARIANT 9.

If I replace the last two lines by

list(INSERT list_example 5 6 7)
message("list_example = ${list_example}")

the result is

list_example = 1;;;2;3;4
list_example = 1;;;2;3;4;5
list_example_length = 5
list_example1 = 2
CMake Error at CMakeLists.txt:21 (list):
  list index: 5 out of range (-5, 4)

If you insert just after the end of the list, it should work just like an
append instead of giving you an index error as above.

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
__________________________
_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake


_______________________________________________
CMake mailing list
CMake@cmake.org
http://www.cmake.org/mailman/listinfo/cmake

Reply via email to