Replacing values in CMake lists
You don't need the if
check:
project(test)
cmake_minimum_required(VERSION 2.8)
macro(LIST_REPLACE LIST INDEX NEWVALUE)
list(INSERT ${LIST} ${INDEX} ${NEWVALUE})
MATH(EXPR __INDEX "${INDEX} + 1")
list (REMOVE_AT ${LIST} ${__INDEX})
endmacro(LIST_REPLACE)
set(my_list A B C)
LIST_REPLACE(my_list 0 "FIRST")
LIST_REPLACE(my_list 1 "SECOND")
LIST_REPLACE(my_list 2 "THIRD")
message (STATUS "NEW LIST: ${my_list}")
If you want to replace an item by value in the list, you can do like the following code:
macro(replace_list_item LIST OLD_VALUE NEW_VALUE)
list(FIND ${LIST} ${OLD_VALUE} OLD_VALUE_INDEX)
if(OLD_VALUE_INDEX GREATER_EQUAL 0)
list(REMOVE_AT ${LIST} ${OLD_VALUE_INDEX})
list(INSERT ${LIST} ${OLD_VALUE_INDEX} ${NEW_VALUE})
endif()
endmacro()
Example:
set(OPENCV_OPTIONS "")
list(APPEND OPENCV_OPTIONS -D WITH_ADE=ON)
list(APPEND OPENCV_OPTIONS -D WITH_CUDA=OFF)
list(APPEND OPENCV_OPTIONS -D WITH_EIGEN=ON)
# Old OPENCV_OPTIONS: -D;WITH_ADE=ON;-D;WITH_CUDA=OFF;-D;WITH_EIGEN=ON
message("Old OPENCV_OPTIONS: ${OPENCV_OPTIONS}")
replace_list_item(OPENCV_OPTIONS "WITH_CUDA=OFF" "WITH_CUDA=ON")
# New OPENCV_OPTIONS: -D;WITH_ADE=ON;-D;WITH_CUDA=ON;-D;WITH_EIGEN=ON
message("New OPENCV_OPTIONS: ${OPENCV_OPTIONS}")