Замена значений в списках CMake

#cmake

#cmake

Вопрос:

Мне нужно было заменить значение в списке CMake, однако, похоже, эта операция со списком не поддерживается.

Я придумал этот код:

 macro (LIST_REPLACE LIST INDEX NEWVALUE)
    list (REMOVE_AT ${LIST} ${INDEX})
    list (LENGTH ${LIST} __length)

    # Cannot insert at the end
    if (${__length} EQUAL ${INDEX})
        list (APPEND ${LIST} ${NEWVALUE})
    else (${__length} EQUAL ${INDEX})
        list (INSERT ${LIST} ${INDEX} ${NEWVALUE})
    endif (${__length} EQUAL ${INDEX})
endmacro (LIST_REPLACE)

# Example
set (fubar A;B;C)
LIST_REPLACE (fubar 2 "X")
message (STATUS ${fubar})
  

У вас есть идеи получше, как этого добиться?

Ответ №1:

Вам не нужна if проверка:

 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}")
  

Комментарии:

1. Умное решение, но почему CMake делает простые вещи такими сложными!

Ответ №2:

Если вы хотите заменить элемент по значению в списке, вы можете выполнить следующий код:

 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()
  

Пример:

 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}")