Escape "[]" в списке разделенных точкой с запятой в CMake
Я обнаружил, что "[" и "]" могут иметь особые значения в списке с разделителями с запятой в CMake
. Когда я пробую этот код в CMakeLists.txt
:
set(XX "a" "b" "[" "]")
message("${XX}")
foreach(x ${XX})
message("--> ${x}")
endforeach()
Я ожидаю результат:
a;b;[;]
--> a
--> b
--> [
--> ]
Однако я получил следующее:
a;b;[;]
--> a
--> b
--> [;]
Я не нашел никакой документации для использования "[" и "]". Возможно ли избежать этих символов, чтобы я мог получить ожидаемый результат? Я использую CMake 2.8.12.2
. Спасибо за любую помощь:)
Ответы
Ответ 1
В соответствии с документация открывающая квадратная скобка определенно имеет особое значение:
Примечание. версии CMake до 3.0 не поддерживают аргументы в скобках. Они интерпретируют открывающую скобку как начало некорректного аргумента.
Таким образом, проблема заключается в смешении аргументов с котировкой и без кавычек. Возможным обходным решением в вашем случае является замена квадратного кронштейна открытия на что-то еще при инициализации, а затем его замену следующим образом:
CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT (HELLO NONE)
SET(XX a b BRACKET ])
MESSAGE("${XX}")
FOREACH(x ${XX})
STRING(REGEX REPLACE "BRACKET" "[" x ${x})
MESSAGE("--> ${x}")
ENDFOREACH()
Ответ 2
Как отмечено в другом ответе, квадратные скобки теперь используются для разделения "длинной формы" аргументов или комментарии длинной формы, также задокументированные в CMake 3.0 и более поздних версиях.
Одна пара квадратных скобок с; внутри также долгое время использовались для обозначения пар реестра [key; value] в Windows. Пример этого поведения показан в файле CMake InstallRequiredSystemLibraries.cmake:
get_filename_component(msvc_install_dir
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0;InstallDir]" ABSOLUTE)
Способ, которым он реализован, имеет неприятный побочный эффект, вызывающий замешательство, когда кто-то хочет иметь значения списка, содержащие квадратные скобки, поэтому этот вопрос на SO.