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.