Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Система построения проектов CMake. Учебник.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
2.7. Команды обработки данных
нечной системы построения не происходит (как при исполне­нии команды message(SEND_ERROR ...), п. 2.4.4).
list(LENGTH hимя_спискаi hимя_переменнойi)
Эта форма команды записывает в переменную длину спис-
ка.
list(
GET hимя_спискаi hиндекс1i ... hиндексni
hимя_переменнойi)
Эта форма команды записывает в заданную переменную
список из значений исходного списка с заданными индексами.
N
list(APPEND hимя_спискаifhзначение1i ... hзначениеnig)
Эта форма команды дописывает в конец заданного списка
заданные значения. Команда эквивалентна команде:
set(
hимя_спискаi ${hимя_спискаi}
f
hзначение1i ... hзначениеnig)
list(FIND hимя_спискаi hзначениеi hимя_переменнойi)
Эта форма команды находит в списке заданное значение и возвращает индекс его первого вхождения (−1 при отсутствии значения в списке).
list(
121
2. Основы языка CMake
INSERT hимя_спискаi hиндексi
f
hзначение1i ... hзначениеnig)
Эта форма команды вставляет в заданную позицию списка
заданные значения.
list(REMOVE_ITEM hимя_спискаi hзначение1i ... hзначениеni)
Эта форма команды удаляет из списка все вхождения за-
данных значений.
list(REMOVE_AT hимя_спискаi hиндекс1i ... hиндексni)
Эта форма команды удаляет из списка все элементы с за-
данными индексами (в исходном списке).
list(REMOVE_DUPLICATES hимя_спискаi)
Эта форма команды удаляет из списка все одинаковые эле-
менты, кроме их первых вхождений.
list(REVERSE hимя_спискаi)
Эта форма команды меняет в списке порядок его элементов
на противоположный.
list(SORT hимя_спискаi)
Эта форма команды сортирует элементы списка по возрас-
танию в лексикографическом порядке.
122
2.7. Команды обработки данных
2.7.4. string()
Команда string() реализует основные алгоритмы обра­ботки строк: выделение подстроки, поиск, замену и т. д. В от­личие от других языков, в CMake нет средств для индексации отдельных элементов строк как массивов, поэтому команда string() является единственным доступным способом анали­за и изменения их содержимого. В этом руководстве будут рас­смотрены лишь основные варианты применения команды, наи­более часто используемые на практике.
string(hунарная_операцияi hимя_переменнойi hстрокаi)
hунарная_операцияi F
LENGTH
— Команда, вызванная с аргументом LENGTH, записывает в за-
данную переменную длину заданной строки.
— Команда с аргументом TOLOWER/TOUPPER записывает в пере-
менную заданную строку в нижнем/верхнем регистре.
— Команда с аргументом STRIP записывает в переменную
подстроку исходной строки без ведущих и завершающих
пробелов.
TOLOWER
 
TOUPPER
 
STRIP
string(CONCAT hимя_переменнойifhстрока1i ... hстрокаnig)
Команда string(CONCAT ...) выполняет конкатенацию нескольких строк, записывая результат в заданную перемен-
123
2. Основы языка CMake
ную. Таким образом, эта команда позволяет легко преобразо­вать список в строку без разделителей («;»).
string(
FIND hстрокаi hподстрокаi hимя_переменнойifREVERSEg)
Команда string(FIND ...) выполняет поиск в строке пер­вого (или последнего, если используется аргумент REVERSE) вхождения подстроки, записывая индекс её начала в заданную переменную. Позиции в строке нумеруются с 0, при отсутствии подстроки возвращается -1.
string(
SUBSTRING hстрокаi hначалоi hдлинаi hимя_переменнойi)
Команда string(SUBSTRING ...) выделяет из строки под­строку, начинающуюся с заданной позиции, заданной длины (или до конца, если в качестве длины указано -1), записывая ре­зультат в заданную переменную.
string(
f
REGEXgREPLACE
hвыражение_поискаi hвыражение_заменыi hимя_переменнойi
hстрока1i ... hстрокаni)
Команда string(REPLACE ...) выполняет замену всех вхождений заданной подстроки, которая передаётся ей через ар­гумент hвыражение_поискаi, на строку, которая передаётся через аргумент hвыражение_заменыi, в строке, являющейся конкатена­цией строк, которые передаются команде через последние аргу-
124
2.7. Команды обработки данных
менты. Изменённая строка записывается в заданную перемен­ную.
Команда string(REGEX REPLACE ...) работает аналогич­но, однако рассматривает свой аргумент hвыражение_поискаi как регулярное выражение (п. 2.2.5), а hвыражение_заменыi — как выражение замены, в котором могут встречаться ссылки на части найденных подстрок («\hномерi»).
string(
REGEX hоперацияi
hвыражение_поискаi hимя_переменнойi
hстрока1i ... hстрокаni)
hоперацияi F MATCH
MATCHALL
Команда string(REGEX MATCH ...) выполняет поиск пер­вого вхождения подстроки, удовлетворяющей заданному регу­лярному выражению, в строке, являющейся конкатенацией за­данных строк. Найденная подстрока записывается в перемен­ную. Как и в предыдущей форме команды, выполняется выделе­ние наиболее длинной подстроки, насколько это возможно. Ес­ли подстрока не найдена, возвращается пустая строка.
Команда string(REGEX MATCHALL ...) работает аналогич­но, но находит все возможные подстроки, соответствующие ре­гулярному выражению, и возвращает их в виде списка.
ПРИМЕРЫ
1)
string(FIND AsAsAs AsA POSITION1)
125
2. Основы языка CMake
string(FIND AsAsAs AsA POSITION2 REVERSE)
string(FIND AsAsAs AsD POSITION3)
string(REPLACE aS 0ab REP1 a Starta Start)
dump_vars(POSITION1 POSITION2 POSITION3 REP1)
Здесь пользовательская команда dump_vars() выполняет вывод значений переменных вместе с их именами, пере­данных ей в качестве аргументов. Определение такой ко­манды рассматривается далее в примере на с. 147. Исполне­ние команд в итоге приведёт к выводу следующей инфор­мации:
-- ==============
-- Dumping 4 variables:
-- POSITION1 == "0"
-- POSITION2 == "2"
-- POSITION3 == "-1"
-- REP1 == "0abtart0abtart"
-- ==============
Переменная POSITION1 содержит значение 0, так как под­строка «AsA» находится в строке «AsAsAs», начиная с пози­ции 0.
126
Аналогично, POSITION2 содержит 2, так как последнее вхождение этой подстроки начинается с позиции 2. POSITION3 содержит -1, так как искомая подстрока в стро­ке отсутствует.
2.7. Команды обработки данных
Команда string(REPLACE ...) сначала выполняет кон-
катенацию своих последних аргументов «a», «Starta»
и «Start», а затем в полученной строке выполняет замену.
2)
string(
REGEX MATCHALL
a[a-z]*z VARS
az aaxcz--amz-- -az- --za azzx)
string(
REGEX REPLACE
"(begin)(.*)(end\.)" "\\3\\2\\1" REPL
"begin WriteLn end. begin ReadLn end.")
dump_vars(
VARS REPL CMAKE_MATCH_1 CMAKE_MATCH_2
CMAKE_MATCH_3)
Выполнение команд приведёт к выводу следующего ре-
зультата:
-- ==============
-- Dumping 5 variables:
-- VARS == "azaaxcz;amz;az;aazz"
-- REPL == "end. WriteLn end. begin ReadLn begin"
-- CMAKE_MATCH_1 == "begin"
-- CMAKE_MATCH_2 == " WriteLn end. begin ReadLn "
-- CMAKE_MATCH_3 == "end."
-- ==============
127
2. Основы языка CMake
В этом примере проявляется «жадный» характер регуляр­ных выражений. Первая команда ищет соответствие в кон­катенации последних пяти аргументов регулярному вы­ражению «a[a-z]*z». Первой соответствующей ему под­строкой будет «az», однако команда пытается найти со­ответствие как можно более длинной подстроки, поэто­му первой выделяет подстроку «azaaxcz». Выделению бо­лее длинной подстроки препятствует то, что следующим за ней символом будет «-», а он не соответствует образцу
«[a-z]».
По той же причине вторая команда в качестве соответ­ствия третьему группирующему подвыражению распозна­ет последнюю строку «end.», а не первую.
3)
string(
REGEX MATCH ab.*cd VAR1
---ab-cd-cd---)
string(
REGEX MATCHALL "aX*" VAR2
"aXaX-aXXX--aXX--(aX))")
string(
REGEX MATCHALL "(ab|cd)" VAR3
"abd--acd--ab--cd--ad")
128
string(
REGEX MATCHALL "<([^>]+)>([^<]*)</([^>]+)>" VAR4
"<code>hello</code>")
dump_vars(

2.8. Команды управляющих конструкций

CMAKE_MATCH_0 CMAKE_MATCH_1 CMAKE_MATCH_2
CMAKE_MATCH_3 VAR1 VAR2 VAR3 VAR4)
Выполнение команд приведёт к выводу следующего ре-
зультата:
-- ==============
-- Dumping 8 variables:
-- CMAKE_MATCH_0 == "<code>hello</code>"
-- CMAKE_MATCH_1 == "code"
-- CMAKE_MATCH_2 == "hello"
-- CMAKE_MATCH_3 == "code"
-- VAR1 == "ab-cd-cd"
-- VAR2 == "aX;aX;aXXX;aXX;aX"
-- VAR3 == "ab;cd;ab;cd"
-- VAR4 == "<code>hello</code>"
-- ==============
Здесь регулярное выражение в последней команде устрое-
но таким образом, чтобы была подавлена его «жадность».
Например, в подвыражении, определяющем открываю-
щий тег языка HTML, должен отсутствовать символ «>».
∗
Замечание: если требуется только установить факт того, что за- данная строка соответствует регулярному выражению, для это­го проще воспользоваться командой if() (п. 2.8.1) с аргументом
MATCHES.
N
129
2. Основы языка CMake
2.8. Команды управляющих конструкций
2.8.1. if(), elseif(), else(), endif()
if(hусловие1i)
hкомандыi
f
elseif(hусловие2i)
hкомандыi
...
g
f
else()
hкомандыi
g
endif()
hусловиеi F
(hусловиеi)
NOT hусловиеi
hусловиеi AND hусловиеi
hусловиеi OR hусловиеi
hлогическая_константаi
hимя_переменнойi
hоперацияi hпутьi
hпутьi IS_NEWER_THAN hпутьi
hзначениеi hбинарная_операцияi hзначениеi
 
  
  
  
  
  
  
  
  
130
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]