CMake переменная с точкой с запятой - PullRequest
0 голосов
/ 26 февраля 2020

Скажем, есть программа, которая требует ввода в форме <prog> --param "one;two;three": флаг --param, за которым следует строка (заключенная в кавычки) слов, разделенных точкой с запятой. Например, можно использовать следующий сценарий Bash:

flag=${1}
items=(${2//;/ })

echo "flag: ${flag}"
echo "items: ${items[@]}"

Очевидно, что результат будет:

flag: --param
items: one two three

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

Этот вопрос чем-то похож на этот , но предложенный ответ там не работает для

Рассмотрим этот CMakeLists.txt файл:

cmake_minimum_required(VERSION 3.16.2)
project(clumsy)

add_custom_command(OUTPUT foo.txt
    COMMAND bash ${CMAKE_SOURCE_DIR}/script.sh --param "one;two;three" &>> foo.txt
    WORKING_DIRECTORY ${CMAKE_BUILD_DIR}
    VERBATIM
)
add_custom_target(foo DEPENDS foo.txt)

set(PARAMS "one;two;three")
add_custom_command(OUTPUT bar.txt
    COMMAND bash ${CMAKE_SOURCE_DIR}/script.sh --param "${PARAMS}" &>> bar.txt
    WORKING_DIRECTORY ${CMAKE_BUILD_DIR}
    VERBATIM
)
add_custom_target(bar DEPENDS bar.txt)

Запуск make foo после настройки работает должным образом:

[100%] Generating foo.txt
flag: --param
items: one two three  <----
[100%] Built target foo

Однако make bar приводит к неправильный вывод, потому что переменная PARAMS была развернута в виде списка, а фактический ввод был --param one two three вместо --param "one;two;three":

[100%] Generating bar.txt
flag: --param
items: one  <----
[100%] Built target bar

Как использовать переменную PARAMS и при этом делать ввод для внешнего команда состоит из двух аргументов ?

ОБНОВЛЕНИЕ

Я сделал код CMakeLists.txt более сложным с использованием перенаправлений вывода, включающих & (например, * 1040) *) который конфликтует с использованием VERBATIM fl ag, который важен для работы с переменными кавычками.

1 Ответ

0 голосов
/ 26 февраля 2020

После некоторого столкновения с тем, почему использование переменной не идентично буквальному использованию (используемому для определения переменной), я решил опубликовать этот ответ, чтобы дать некоторую ясность.

Как предложено @KamilCuk Использование цитируемой переменной --params "${PARAMS}" работает, но только , если также используется опция VERBATIM. В большинстве случаев это не проблема, но из-за отсутствия возможности поддержки CMake для перенаправления вывода в файл нельзя использовать &>> в режиме VERBATIM (он заключен в кавычки).

Итак, кажется, что в add_custom_command невозможно иметь перенаправления и нерасширяющиеся переменные, у вас может быть только одна из них.

...