Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Система построения проектов CMake. Учебник.pdf
Скачиваний:
0
Добавлен:
08.09.2026
Размер:
2 Мб
Скачать
☆
2.10. Команды добавления специальных целей
add_library(mylib mylib.cpp mylib.h)
Как можно видеть, код библиотеки вместе с её описанием в системе CMake не имеет каких-либо существенных отличий от других похожих примеров, рассмотренных ранее.
Теперь перейдём к разработке теста. Файл mylib_test.cpp может выглядеть следующим образом:
#include "mylib.h"
int main()
{
return (answer() == 42 ? 0 : 1);
}
Программа завершается с передачей вызывающей системе нулевого кода возврата, если вызываемая функция библиотеки (answer()) возвращает ожидаемое от неё значение, и ненулево­го в противном случае.
Файл CMakeLists.txt для проекта теста:
add_executable(mylib_test mylib_test.cpp)
include_directories(../lib)
target_link_libraries(mylib_test mylib)
add_test(
NAME mylib_test_1
171
2. Основы языка CMake
COMMAND mylib_test
)
Здесь определяется цель mylib_test, которая генериру­ет исполняемый файл, связываемый с библиотекой. Команда add_test() создаёт тест с исполняемым файлом-результатом работы цели mylib_test.
Файл CMakeLists.txt описания проекта верхнего уровня:
cmake_minimum_required(VERSION 2.8)
project(mylib)
enable_testing()
add_subdirectory(lib)
add_subdirectory(test)
Здесь перед добавлением подпроектов lib и test вызыва­ется команда enable_testing(), которая включает создание це­ли тестирования.
В POSIX-совместимой системе команды построения и тести­рования проекта могут быть следующими:
cmake ../../work/cross/mylib
make
make test
172
2.10. Команды добавления специальных целей
При необходимости можно передать дополнительные ар­гументы утилите ctest, реализующей тестирование, при помо­щи переменной ARGS:
make test ARGS="--timeout 1"
Здесь утилите ctest передаётся аргумент, задающий тайм­аут для теста, равный 1 с.
В случае успешного прохождения теста вывод команды
«make test» будет подобен следующему:
Running tests...
Test project /home/dubrov/_build/build_mylib
Start 1: mylib_test_1
1/1 Test #1: mylib_test_1 ..................... Passed 0.00 sec
100% tests passed, 0 tests failed out of 1
Total Test time (real) = 0.01 sec
Если же функция answer() из библиотеки вернёт какое­либо другое значение, вывод команды «make test» изменится на следующий:
Running tests...
Test project /home/dubrov/_build/build_mylib
Start 1: mylib_test_1
1/1 Test #1: mylib_test_1 .....................***Failed 0.00 sec
0% tests passed, 1 tests failed out of 1
Total Test time (real) = 0.01 sec
173
2. Основы языка CMake
The following tests FAILED:
1 - mylib_test_1 (Failed)
Errors while running CTest
make: *** [test] Error 8
Замечания:
— После запуска тестов в подкаталоге Testing/Temporary
каталога построения проекта будет создан файл LastTest.log с подробностями запуска тестов. В част­ности, там будет сохранена информация, выводимая тестовыми программами в стандартные потоки.
∗
— Ограничить время работы теста можно также из сценария
CMake установкой свойства теста TIMEOUT в заданное коли­чество секунд (команда set_property(), п. 2.11.2).
— Для разработки сложных тестовых приложений удобно
пользоваться сторонними каркасами модульного тестиро­вания, такими как Google Test6и Qt Test7.
N

2.10.3. install()

Команда install() добавляет правило установки сущно­сти к специальной цели генерируемого проекта (цель install для системы make, проект INSTALL для среды Microsoft Visual Stu­dio и т. д.). При помощи этой команды можно создавать правила для выполнения следующих действий:
6
https://code.google.com/p/googletest/ (дата обращения: 11.01.2015).
7
http://doc.qt.io/qt-5/qttest-index.html (дата обращения: 11.01.2015).
174
2.10. Команды добавления специальных целей
— установки результатов выполнения целей проекта (коман-
ды add_executable(), п. 2.5.1, add_library(), п. 2.5.2);
— установки файлов из каталога проекта;
— установки подкаталогов из каталога проекта с возможно-
стью отбора содержащихся в них файлов по маске;
— запуска произвольных сценариев CMake;
— генерирования модулей CMake, облегчающих использова-
ние устанавливаемых библиотек в сторонних проектах.
После обработки описания системой CMake в выходном каталоге каждого подпроекта генерируется вспомогательный сценарий cmake_install.cmake, интерпретация которого и осу­ществляет фактическую установку. Вызов инструмента CMake для исполнения этого сценария записан в правилах install и т. д.
Команда install() способна принимать множество на­строек при помощи своих аргументов, мы рассмотрим в данном руководстве только основные из них.
Для установки результатов целей предназначена следую­щая форма команды install():
install(
TARGETS hимя_цели1i ... hимя_целиni
f
EXPORT hимя_экспортаi
g
f
f
ARCHIVE
f
DESTINATION hкаталогi
 
LIBRARY
 
RINTIME
g
g
175
2. Основы языка CMake
f
CONFIGURATIONSfDebug
f
COMPONENT hимя_компонентаi
 
Release
g
  
g g
...
g
...)
Команда добавляет к цели правила для установки резуль-
татов выполнения заданных целей.
— После необязательного аргумента EXPORT можно опре-
делить имя для устанавливаемых файлов, которое за­тем можно использовать для ссылки на них в коман­де определения правила генерирования сценария CMake
(install(EXPORT ...)).
— При помощи необязательных аргументов ARCHIVE,
LIBRARY и т. д. можно определить, к каким видам фай-
лов относятся следующие настройки (DESTINATION и т. д.). По умолчанию последующие настройки относятся ко всем файлам. Например, исполняемые файлы и динамические библиотеки в системах Windows относятся к категории RUNTIME, статические библиотеки, включая библиотеки импорта, относятся к категории ARCHIVE (см. описание команды add_library(), п. 2.5.2).
— После необязательного аргумента DESTINATION можно ука-
176
зать путь к каталогу, в который должны быть установ­лены файлы. Относительные пути определяют катало­ги относительно каталога установки. Каталог установ­ки определяется содержимым специальной переменной
2.10. Команды добавления специальных целей
CMake CMAKE_INSTALL_PREFIX, в которой по умолчанию
хранится путь «/usr/local» для POSIX-совместимых си-
стем и путь к подкаталогу с именем проекта внутри ката-
лога «Program Files» или «Program Files (x86)» для си-
стем Windows.
— После необязательного аргумента CONFIGURATIONS можно
указать конфигурации, которыми будет ограничено дей-
ствие правил установки.
— После необязательного аргумента COMPONENT можно задать
имя компонента, с которым будет связано правило уста-
новки. При помощи компонент можно организовать воз-
можность выбора пользователем для установки разных ча-
стей программного пакета. Выбор компонента определя-
ется значением переменной CMake COMPONENT. Пустое её
значение по умолчанию приводит к установке всех компо-
нент.
В одной команде можно указать несколько групп свойств, относящихся к различным видам файлов из перечисленных це­лей. При помощи нескольких команд install() можно устано­вить одни и те же файлы в разные каталоги.
Замечание: все цели, обрабатываемые командной install(), должны быть определены в том же самом подпроекте, в описа­нии которого вызывается эта команда.
N
install(
FILES
PROGRAMS hфайл1i ... hфайлni
177
2. Основы языка CMake
DESTINATION hкаталогi
f
CONFIGURATIONSfDebug
f
COMPONENT hимя_компонентаi
 
Release
g
  
g g
...
f
RENAME hимяig)
Эта форма команды install() добавляет правила для уста­новки заданных файлов. Относительные пути для устанавлива­емых файлов интерпретируются по отношению к каталогу теку­щего (под)проекта.
— Указание аргумента PROGRAMS вместо FILES приводит к то-
му, что на POSIX-совместимых системах установленные
файлы будут иметь права доступа на исполнение. Эта воз-
можность предназначена прежде всего для установки сце-
нариев из каталога исходных файлов проекта.
— Аргументы DESTINATION и т. д. имеют то же значение, что
и для команды install(TARGETS ...).
— После необязательного аргумента RENAME можно задать но-
вое имя устанавливаемого файла, отличное от исходного.
Этот аргумент допустим только в случае указания одного
исходного файла.
install(
DIRECTORYfhкаталог1i ... hкаталогni
DESTINATION hкаталогi
f
CONFIGURATIONSfDebug
f
COMPONENT hимя_компонентаi
178
 
Release
g
g
  
g g
...
2.10. Команды добавления специальных целей
f
FILES_MATCHING
g
f
f
PATTERN hмаскаi
f
EXCLUDE
g
 
REGEX hрегулярное_выражениеi
g
g
f
...g)
Эта форма команды install() добавляет правила для уста­новки файлов внутри заданных каталогов. Относительные пу­ти для устанавливаемых каталогов интерпретируются по отно­шению к каталогу текущего (под)проекта. Если список катало­гов пуст, в каталоге установки создаётся пустой каталог, имя ко­торого указано при помощи аргумента DESTINATION.
В выходной каталог копируется структура каталогов-ис­точников, при этом последние компоненты путей этих подка­талогов (после последнего символа «/») добавляются к пути ка­талога-приёмника.
ПРИМЕР Команда:
install(DIRECTORY dir1 dir2/)
добавит следующую структуру каталогов в выходном каталоге (рис. 2.12). ∗
— Аргументы DESTINATION и т. д. имеют то же значение, что
и для команды install(TARGETS ...).
179
2. Основы языка CMake
hкаталог установкиi
dir1
... ..................... файлы из hкаталог проектаi/dir1
... ........................ файлы из hкаталог проектаi/dir2
Рис. 2.12. Структура каталога установки
— В конце команды можно указать несколько групп свойств
для отбора файлов и каталогов, удовлетворяющих за­данной маске или регулярному выражению. При помо­щи необязательного аргумента FILES_MATCHING перед на­чалом первой группы можно указать, что проверяться на соответствие будут только имена файлов, а не катало­гов. Далее могут следовать несколько аргументов PATTERN и REGEX, устанавливающих соответствие на языке масок командных оболочек большинства систем или регулярных выражений (п. 2.2.5) соответственно. Аргумент EXCLUDE по­сле образца соответствия означает, что заданные файлы или каталоги будут исключены из установки, а не включе­ны в неё.
install(
f
f
SCRIPT hфайл_сценарияi
g
f
COMPONENT hимя_компонентаi
f
...g)
g f
CODE hкод_CMakei
g
g
Эта форма команды install() добавляет правила для за-
пуска сценариев CMake во время установки.
180
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]