2010-07-22 50 views
9

我需要替换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}) 

你有什么更好的想法如何实现这一目标?

回答

12

你不需要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}")