Как передать переменную списка в execute_process CMake? - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу выполнить команду CMake в подкаталоге с execute_process, а также передать некоторые переменные кэша в качестве -D параметров.

Если переменная имеет тип string, она работает. Однако, если переменная является списком, типичный метод передачи списка в командной строке, похоже, не работает.

Я перепробовал все комбинации, перечисленные в этом ответе. Я даже пытался присоединиться к mylist с "\\;" или "\\\\;". Однако execute_process, кажется, всегда распаковывает '-DVal2=a\\;b\\;c\\;' или '-DVal2=a;b;c' в -Dval2=a b c.

Как я могу предотвратить это? Работает только -DVal2=a\\;b\\;c, но очень раздражает.

set(
    mylist
    a
    b
    c
)

set(
    cmake_args
    "-DVal1=abc"
    "'-DVal2=${mylist}'" #does not work, the execute_process will unpack it into seperated args
)

execute_process(
        COMMAND ${CMAKE_COMMAND} ${cmake_args} ${CMAKE_SOURCE_DIR}/subproject
        OUTPUT_FILE ${CMAKE_BINARY_DIR}/config.log
        ERROR_FILE ${CMAKE_BINARY_DIR}/config.log
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/subproject
        RESULT_VARIABLE config_result
)

1 Ответ

0 голосов
/ 06 сентября 2018

Я думаю, вам нужно экранировать символ ;, который является разделителем по умолчанию для списков в CMake, но неясно, как вы это сделаете, чтобы он не работал для вас.

Итак, попробуйте что-то вроде этого

set(mylist_str "")

foreach(item ${mylist})
  string(APPEND mylist_str ${item} "\;")
endforeach()

# this is for debugging
message(STATUS "List as string: ${mylist_str}")

set(cmake_args 
    "-DVal1=abc"
    "-DVal2=${mylist_str}"
    "-DVal3=\"${mylist_str}\"" # this has quotes around it
)

# this is for debugging
foreach(item ${cmake_args})
  message(STATUS "A list item: ${item}")
endforeach()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...