Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Система построения проектов CMake. Учебник.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
2.2. Синтаксис
— целям;
— тестам (п. 2.10.2);
— исходным файлам;
— переменным, хранящимся в кэше (п. 2.2.3);
— файлам для установки (п. 2.10.3).
Также существуют глобальные свойства. Как и перемен­ные, свойства могут быть стандартными (имеющими пред­определённое назначение). Изменение таких свойств приводит к определённым изменениям в генерируемой системе построе­ния. В дальнейшем стандартные свойства будут рассматривать­ся по мере необходимости. Некоторые стандартные свойства до­ступны только на чтение. Таким образом, можно провести ана­логию между свойствами CMake и свойствами классов в объект­но-ориентированных языках программирования.
Для считывания и установки значений свойств использу­ются команды get_property() и set_property() (п. 2.11.2).
Замечание: в отличие от переменных, которые имеют области действия, свойства всегда связаны с объектами, для которых они определены. Например, глобальное свойство с заданным именем всегда существует в единственном экземпляре, в то вре­мя как одновременно может существовать сразу несколько пе­ременных с одним и тем же именем в разных областях дей­ствия.
N
61
2. Основы языка CMake
2.2.5. Регулярные выражения
Некоторые из команд CMake (string(), п. 2.7.4, if(), п. 2.8.1, install(), п. 2.10.3) имеют возможность работы с ре­гулярными выражениями. В CMake поддерживается язык ре­гулярных выражений, аналогичный многим утилитам POSIX (табл. 2.2).
Таблица 2.2
Элементы регулярных выражений
Строка Описание
ˆ Соответствует началу строки
$ Соответствует концу строки
. (точка) Соответствует одному любому символу
[hсимволыi] Соответствует одному любому символу
из перечисленных в скобках
[ˆhсимволыi] Соответствует одному любому символу,
которого нет в скобках
hсимволi-hсимволi Внутри скобок определяет диапазон
символов между находящимися слева и справа от «-»: «[a-d]» эквивалент­но «[abcd]». Если символ «-» грани­чит со скобками, он рассматривается
62
как литерал. Например: «[-+]» соответ­ствует «-» или «+»
2.2. Синтаксис
Окончание табл. 2.2
Строка Описание
hобразецi* Соответствует образцу 0 или больше
раз
hобразецi+ Соответствует образцу 1 или больше
раз
hобразецi? Соответствует образцу 0 или 1 раз
hобразецi|hобразецi Соответствует образцу слева или спра-
ва от «|»
(hобразецi) Используется для явного указания по-
рядка операций. Кроме этого, сохраня­ет соответствующую строку для даль­нейшего использования в выражении замены (п. 2.7.4) и в специальной пере­менной CMAKE_MATCH_1 и т. д.
— Операции повтора образца («*», «+» и «?») имеют более
высокий приоритет по сравнению с конкатенацией. Кон­катенация (в теории формальных грамматик) — это следо­вание обычных символов (не представленных в табл. 2.2) и образцов, она обозначается пустой строкой (как опе­рация умножения в арифметике). Таким образом, регу­лярное выражение «aX*» следует понимать как «a(X*)», а не «(aX)*». То есть ему соответствует строка «aXXX», но не «aXaX».
63
2. Основы языка CMake
— Операция дизъюнкции образцов («|»), наоборот, имеет бо-
лее низкий приоритет по сравнению с конкатенацией. Так,
выражение «ab|cd» следует понимать как «(ab)|(cd)»,
а не «a(b|c)d». Ему соответствуют строки «ab» и «cd»,
но не «abd» и «acd».
Специальная переменная CMAKE_MATCH_0 содержит послед­нюю подстроку, распознанную как соответствующую регуляр­ному выражению любой командой CMake. Аналогично, пе­ременные CMAKE_MATCH_1, CMAKE_MATCH_2 и т. д. содержат подстроки, соответствующие группирующим подвыражениям (частям регулярных выражений в круглых скобках). Начи­ная с версии 3.2 CMake также поддерживает переменную CMAKE_MATCH_COUNT, которая принимает значение максималь­ного номера n заполненной последним сопоставлением пере­менной CMAKE_MATCH_hni.
Замечания:
— Регулярные выражения имеют свойство «жадности». Это
значит, что при выделении командой string() подстрок,
соответствующих заданному регулярному выражению, вы-
деляется наиболее длинная подстрока, насколько это воз-
можно. Например, в строке «---ab-cd-cd---» в соответ-
ствии с выражением «ab.*cd» будет выделена подстрока
«ab-cd-cd», а не «ab-cd».
— CMake поддерживает меньший набор возможностей
по сравнению с регулярными выражениями POSIX1. На-
пример, конструкции, ссылающиеся на распознанные
1
http://en.wikibooks.org/wiki/Regular_Expressions (дата обращения: 16.02.2015).
64

2.3. Примеры простых проектов

подстроки («\1», «\2» и т. д.), допустимы только в выра- жениях замены команды string(REGEX REPLACE ...)
(п. 2.7.4), но не в том же самом регулярном выражении.
Образцы повтора после скобок («(aX)*») в CMake не имеют смысла.
N
Примеры использования регулярных выражений приведе-
ны в описании команды string() (п. 2.7.4).
2.3. Примеры простых проектов
Прежде чем приступать к изучению основных команд язы­ка CMake, рассмотрим несколько простых примеров его исполь­зования.
ПРИМЕР Пусть требуется построить проект из одного исходного файла, в результате чего должен быть создан исполняемый модуль. Рассмотрим возможную структуру каталогов проекта (рис. 2.1). Здесь в некоторой рабочей папке находятся каталог исходных файлов проекта (test_cmake) и каталог построения (_build). В этом примере оба каталога расположены рядом друг с другом для упрощения команды вызова инструмента CMake, в реально­сти эти каталоги могут располагаться совершенно в разных ме­стах.
Для решения задачи в каталоге проекта должен содержать­ся файл CMakeLists.txt со следующим возможным содержани­ем:
65
2. Основы языка CMake
hрабочий каталогi
_build ........................каталог построения проекта
test_cmake .............каталог исходных файлов проекта
main.cpp
...
CMakeLists.txt ..................файл описания проекта
build.cmd (build.sh)
Рис. 2.1. Структура каталога простого проекта
# CMakeLists.txt - описание простого проекта
project(test_cmake)
add_executable(test_cmake main.cpp)
Первая строка файла является комментарием. Дальше сле­дует команда project(), задающая имя проекта. Это имя бу­дет использовано при создании системы построения в качестве имени решения или основного проекта.
Последняя строка содержит команду add_executable(), которая определяет новую цель построения с именем test_cmake и исходным файлом main.cpp. По умолчанию построение цели должно привести к созданию исполняемого модуля с тем же именем, что и имя цели (test_cmake) в выход­ном каталоге проекта. На платформе Windows имя файла будет дополнено расширением «.exe».
Если в дальнейшем будет необходимо добавить в проект другие исходные файлы, их имена можно добавить в список ар­гументов команды add_executable().
66
2.3. Примеры простых проектов
Для удобства можно создать файл сценария build.cmd в ОС Windows (build.sh в системах на основе Linux, OS X и т. д.) рядом с каталогом _build, при помощи которого можно авто­матизировать процесс построения вызовом инструмента CMake с нужными аргументами. Содержимое этого файла является спе­цифичным для компьютера, на котором выполняется построе­ние, поэтому нет смысла помещать его в каталог исходных фай­лов.
mkdir _build
cd _build
set PATH=C:\Program Files\CodeBlocks\MinGW\bin;%PATH%
cmake -G "CodeBlocks - MinGW Makefiles" ../test_cmake
В первой строке исполняется команда mkdir, создающая ка­талог построения, если его не существует. Следующая команда (cd) выбирает каталог построения в качестве текущего. Следу­ющая за ней команда добавляет в начало системной перемен­ной окружения PATH путь к исполняемым файлам компилято­ра MinGW, входящего в состав дистрибутива интегрированной среды Code::Blocks. Это необходимо для того, чтобы инструмент
CMake мог найти нужные файлы инструментов компилятора MinGW и сгенерировать рассчитанные на них файлы построе-
ния.
В последней строке вызывается сам инструмент CMake. Ему передаётся два аргумента: имя генератора при помощи клю­ча «-G» (здесь генерируется файл проекта для среды Code::Blocks,
67
2. Основы языка CMake
использующий утилиту построения mingw32-make) и путь к ка­талогу проекта, в котором расположен файл CMakeLists.txt.
Таким образом, каталог _build можно удалить в любой мо­мент. Для повторного построения достаточно запустить команд­ный файл build.cmd и обработать созданный проект при помо­щи среды Code::Blocks (рис. 2.2).
Рис. 2.2. Сгенерированный проект, открытый в среде
Code::Blocks
Похожим образом можно написать аналогичный сцена­рий build.sh для операционных систем на основе Linux, FreeBSD и т. п.
ПРИМЕР Пусть необходимо построить проект, содержащий две цели: ста­тическую библиотеку и приложение, использующее эту библио-
68
2.3. Примеры простых проектов
теку. Пусть файлы в каталоге проекта организованы так, как изображено на рис. 2.3.
hрабочий каталогi
_build_lib ....................... каталог построения проекта
lib ......................... каталог исходных файлов проекта
sample_lib ................подкаталог проекта библиотеки
sample_module.cpp
sample_module.h
CMakeLists.txt ........... описание проекта библиотеки
sample_program ..подкаталог проекта исполняемого файла
main.cpp
CMakeLists.txt ........... описание проекта приложения
CMakeLists.txt .......... описание проекта верхнего уровня
build_lib.cmd (build_lib.sh)
Рис. 2.3. Структура каталога проекта с библиотекой
Здесь исходные файлы библиотеки и приложения располо­жены в двух подкаталогах проектов нижнего уровня, каждый из которых имеет собственный файл описания CMakeLists.txt. Оба проекта объединяются третьим файлом CMakeLists.txt, расположенным на каталог выше, в корне составного проекта. Эти файлы могут иметь следующее содержание:
Файл CMakeLists.txt верхнего уровня:
cmake_minimum_required(VERSION 2.8)
project(lib)
add_subdirectory(sample_lib)
add_subdirectory(sample_program)
69
2. Основы языка CMake
Файл CMakeLists.txt проекта библиотеки:
add_library(
sample_lib sample_module.cpp sample_module.h)
Файл CMakeLists.txt проекта исполняемого файла:
add_executable(sample_program main.cpp)
include_directories(../sample_lib)
target_link_libraries(sample_program sample_lib)
Описание проекта верхнего уровня начинается с коман­ды cmake_minimum_required() (п. 2.4.1), устанавливающей наи­меньшую версию инструмента CMake, которым может быть об­работан проект. Далее устанавливается название проекта при помощи команды project() (п. 2.4.2). Затем к проекту присо­единяются два проекта нижнего уровня при помощи команд add_subdirectory() (п. 2.5.3), задающих пути к подкаталогам.
Описание проекта библиотеки содержит единственную ко­манду add_library() (п. 2.5.2), в которой задаются имя цели и список исходных файлов проекта. Сборка проекта должна при­вести к созданию статической библиотеки в выходном катало­ге проекта sample_lib (подкаталога sample_lib выходного ка­талога проекта верхнего уровня). Имя файла библиотеки будет по умолчанию совпадать с именем цели sample_lib с префик­сом и расширением, зависящими от компилятора. Например, для компилятора gcc имя библиотеки будет libsample_lib.a.
Описание проекта приложения отличается от предыду­щего примера добавлением двух новых команд. Команда
70
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]