Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Система построения проектов CMake. Учебник.pdf
X
- •Введение
- •Модульное программирование
- •Автоматизация построения проектов
- •Обзор инструментов построения проектов
- •qmake
- •Генераторы
- •Входные файлы
- •Пути
- •Синтаксис
- •Команды
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Основные концепции
- •Строки
- •Свойства
- •Примеры простых проектов
- •Команды общего назначения
- •cmake_minimum_required()
- •project()
- •include()
- •message()
- •Команды описания целей
- •add_executable()
- •add_library()
- •add_subdirectory()
- •Команды настроек целей
- •include_directories()
- •target_include_directories()
- •add_definitions(), add_compile_options()
- •target_compile_definitions()
- •target_compile_options()
- •target_compile_features()
- •target_link_libraries()
- •add_dependencies()
- •Команды обработки данных
- •math()
- •list()
- •Команды управляющих конструкций
- •foreach(), endforeach()
- •Команды работы с файлами
- •get_filename_component()
- •Команды добавления специальных целей
- •configure_file()
- •add_test(), enable_testing()
- •install()
- •add_custom_target()
- •Прочие команды
- •find_package()
- •get_property(), set_property()
- •Виды конфигураций
- •Выражения генераторов
- •Информационные выражения
- •Логические выражения
- •Преобразующие выражения
- •Вспомогательные выражения
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Интерфейс подключения библиотек
- •Подключение заголовочной библиотеки
- •Частичная подмена стандартной библиотеки
- •Интерфейс подключения библиотек
- •Локализация приложения
- •Установка приложения
- •Инструменты разработки
- •Управление версиями
- •Генерирование документации
- •Упражнения
- •Тест рубежного контроля
- •Проектное задание
- •Заключение
- •Библиография
- •Ответы на тесты

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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
