list
Операции со списками.
Синтаксис
Reading
list(LENGTH <list> <out-var>)
list(GET <list> <element index> [<index> ...] <out-var>)
list(JOIN <list> <glue> <out-var>)
list(SUBLIST <list> <begin> <length> <out-var>)
Search
list(FIND <list> <value> <out-var>)
Modification
list(APPEND <list> [<element>...])
list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>)
list(INSERT <list> <index> [<element>...])
list(POP_BACK <list> [<out-var>...])
list(POP_FRONT <list> [<out-var>...])
list(PREPEND <list> [<element>...])
list(REMOVE_ITEM <list> <value>...)
list(REMOVE_AT <list> <index>...)
list(REMOVE_DUPLICATES <list>)
list(TRANSFORM <list> <ACTION> [...])
Ordering
list(REVERSE <list>)
list(SORT <list> [...]) Введение
Подкоманды списка APPEND, INSERT, FILTER, PREPEND, POP_BACK, POP_FRONT, REMOVE_AT, REMOVE_ITEM, REMOVE_DUPLICATES, REVERSE и SORT могут создавать новые значения для списка в текущем области видимости переменной CMake. Аналогично команде set(), команда LIST создаёт новые значения переменных в текущей области видимости, даже если сам список фактически определён в родительской области видимости. Для распространения результатов этих операций вверх используйте set() с PARENT_SCOPE, set() с CACHE INTERNAL, или другие средства распространения значений.
Примечание
Список в cmake — это группа строк, разделенных ;. Для создания списка можно использовать команду set. Например, set(var a b c d e) создаёт список со значениями a;b;c;d;e, а set(var "a b c d e") создаёт строку или список с одним элементом. (Обратите внимание, что аргументы макросов не являются переменными и поэтому не могут использоваться в командах LIST.)
Примечание
При указании индексов, если <element index> равно 0 или больше, индексация ведётся с начала списка, где 0 соответствует первому элементу списка. Если <element index> равно -1 или меньше, индексация ведётся с конца списка, где -1 соответствует последнему элементу списка. Будьте внимательны при подсчёте с отрицательными индексами: они не начинаются с 0. -0 эквивалентно 0, первому элементу списка.
Чтение
list(LENGTH <list> <output variable>)
Возвращает длину списка.
list(GET <list> <element index> [<element index> ...] <output variable>)
Возвращает список элементов, указанных индексами из списка.
list(JOIN <list> <glue> <output variable>)
Новая в версии 3.12.
Возвращает строку, соединяющую все элементы списка с использованием строки склейки. Для объединения нескольких строк, которые не являются частью списка, используйте оператор JOIN из команды string().
list(SUBLIST <list> <begin> <length> <output variable>)
Новая в версии 3.12.
Возвращает подсписок данного списка. Если <length> равно 0, будет возвращён пустой список. Если <length> равно -1 или список меньше <begin>+<length>, то будут возвращены оставшиеся элементы списка, начиная с <begin>.
Поиск
list(FIND <list> <value> <output variable>)
Возвращает индекс элемента в списке или -1, если элемент не найден.
Модификация
list(APPEND <list> [<element> ...])
Добавляет элементы в список.
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
Новая в версии 3.6.
Включает или удаляет элементы из списка, соответствующие шаблону режима. В режиме REGEX, элементы будут сопоставляться с заданным регулярным выражением.
Для получения более подробной информации о регулярных выражениях см. string(REGEX).
list(INSERT <list> <element_index> <element> [<element> ...])
Вставляет элементы в список в указанное местоположение.
list(POP_BACK <list> [<out-var>...])
Новая в версии 3.15.
Если имя переменной не задано, удаляется ровно один элемент. В противном случае, значение последнего элемента присваивается заданной переменной и удаляется, до последнего заданного имени переменной.
list(POP_FRONT <list> [<out-var>...])
Новая в версии 3.15.
Если имя переменной не задано, удаляется ровно один элемент. В противном случае, значение первого элемента присваивается заданной переменной и удаляется, до последнего заданного имени переменной.
list(PREPEND <list> [<element> ...])
Новая в версии 3.15.
Вставляет элементы в позицию 0 в списке.
list(REMOVE_ITEM <list> <value> [<value> ...])
Удаляет все вхождения заданных элементов из списка.
list(REMOVE_AT <list> <index> [<index> ...])
Удаляет элементы в заданных индексах из списка.
list(REMOVE_DUPLICATES <list>)
Удаляет дублирующиеся элементы из списка. Относительный порядок элементов сохраняется, но если встречаются дубликаты, сохраняется только первое вхождение.
list(TRANSFORM <list> <ACTION> [<SELECTOR>]
[OUTPUT_VARIABLE <output variable>])
Новая в версии 3.12.
Преобразует список, применяя действие ко всем или, указав <SELECTOR>, к выбранным элементам списка, сохраняя результат на месте или в указанной выходной переменной.
Примечание
Подкоманда TRANSFORM не изменяет количество элементов в списке. Если указан <SELECTOR>, только некоторые элементы будут изменены, остальные останутся такими же, как и до преобразования.
<ACTION> определяет действие, которое должно быть применено к элементам списка. Действия имеют точно такую же семантику, как подкоманды команды string(). <ACTION> должно быть одним из следующих:
APPEND, PREPEND: Добавить, добавить в начало заданное значение к каждому элементу списка.
list(TRANSFORM <list> <APPEND|PREPEND> <value> ...)
TOUPPER, TOLOWER: Преобразовать каждый элемент списка в заглавные, строчные буквы.
list(TRANSFORM <list> <TOLOWER|TOUPPER> ...)
STRIP: Удалить ведущие и хвостовые пробелы из каждого элемента списка.
list(TRANSFORM <list> STRIP ...)
GENEX_STRIP: Удалить все generator expressions из каждого элемента списка.
list(TRANSFORM <list> GENEX_STRIP ...)
REPLACE: Сопоставить регулярное выражение как можно большее количество раз и заменить выражение замены на соответствие для каждого элемента списка (Такая же семантика, как REGEX REPLACE из команды string()).
list(TRANSFORM <list> REPLACE <regular_expression>
<replace_expression> ...)
<SELECTOR> определяет, какие элементы списка будут преобразованы. Одновременно может быть указан только один тип селектора. При задании <SELECTOR> должно быть одним из следующих:
AT: Указать список индексов.
list(TRANSFORM <list> <ACTION> AT <index> [<index> ...] ...)
FOR: Указать диапазон с, необязательно, шагом, используемым для итерации по диапазону.
list(TRANSFORM <list> <ACTION> FOR <start> <stop> [<step>] ...)
REGEX: Указать регулярное выражение. Будут преобразованы только элементы, соответствующие регулярному выражению.
list(TRANSFORM <list> <ACTION> REGEX <regular_expression> ...)
Сортировка
list(REVERSE <list>)
Инвертирует содержимое списка на месте.
list(SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])
Сортирует список на месте по алфавиту.
Новая в версии 3.13: Добавлены опции COMPARE, CASE, и ORDER.
Новая в версии 3.18: Добавлена опция COMPARE NATURAL.
Используйте ключевое слово COMPARE для выбора метода сравнения для сортировки. Опция <compare> должна быть одной из следующих:
-
STRING: Сортирует список строк по алфавиту. Это поведение по умолчанию, если опцияCOMPAREне задана. -
FILE_BASENAME: Сортирует список путей к файлам по их именам файлов. -
NATURAL: Сортирует список строк с использованием естественного порядка (см. руководство поstrverscmp(3)), т.е. так, что сопряжённые цифры сравниваются как целые числа. Например: следующий список10.0 1.1 2.1 8.0 2.0 3.1будет отсортирован как1.1 2.0 2.1 3.1 8.0 10.0при выборе сравненияNATURAL, где он будет отсортирован как1.1 10.0 2.0 2.1 3.1 8.0при выборе сравненияSTRING.
Используйте ключевое слово CASE для выбора режима сортировки, чувствительной или нечувствительной к регистру. Опция <case> должна быть одной из следующих:
-
SENSITIVE: Элементы списка сортируются с учётом регистра. Это поведение по умолчанию, если опцияCASEне задана. -
INSENSITIVE: Элементы списка сортируются без учёта регистра. Порядок элементов, отличающихся только регистром, не определён.
Для управления порядком сортировки можно использовать ключевое слово ORDER. Опция <order> должна быть одной из следующих:
-
ASCENDING: Сортирует список в порядке возрастания. Это поведение по умолчанию, если опцияORDERне задана. -
DESCENDING: Сортирует список в порядке убывания.
© 2000–2021 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.21/command/list.html