ОПИСАНИЕ ПРИМЕРА

В этом разделе рассказывается о возможностях тонкой настройки make-файлов на усложненном примере проекта, который, аналогично предыдущему примеру, состоит из двух подпроектов: Клиент (Client) и Сервер (Server).

Кроме того, в проекте заведен подпроект Сервер-заглушка (ServerDummy), который реализует протокол взаимодействия с клиентом также, как и сервер, но вместо его функционального поведения предоставляет заглушку.

Все подпроекты сопровождаются модульными тестами.

 

СОЗДАНИЕ ОСНОВНЫХ MAKE-ФАЙЛОВ ПРОЕКТА

Дерево каталогов проекта показано на рисунке ниже:

Для того, чтобы создать показанные на рисунке make-файлы, следует выполнить команды так, как описано в предыдущем разделе :

$ me-create -conf
$ me-create -project
$ me-create -subproj src/Server
$ me-create -subproj src/Server/ServerDummy
$ me-create -subproj src/Client

При выполнении команд будет задан вопрос о выборе шаблона. Во всех трех случаях следует выбирать первый шаблон, т.е. шаблон консольного приложения.

В главном make-файле проекта следует задать список подпроектов, составляющих проект. Поскольку подпроект ServerDummy необходима только на этапе отладки Клиента, в состав основных подпроектов она не входит:

base_subprojs_dirs := src/Client src/Server

 

НАСТОЙКА СБОРКИ ПОДПРОЕКТА CLIENT

Настойка сборки подпроекта Client заключается в подключении к сборке внешнего каталога исходных файлов src/TCPEngine :

Client_source_dirs += src/Client src/TCPEngine

При таком подключении модульные тесты, написанные для файлов каталога, будут подключены к сборке тестов автоматически. Если среди файлов модульных тестов окажется файл с функцией main , то его необходимо исключать из сборки:

Client_exclude_files += src/TCPEngine/Tests/TestMain.cpp

Библиотеки модульных тестов, такие как cppunit и cppunitlite, устроены таким образом, что это не помешает запуску тестов.

 

НАСТРОЙКА ПОДПРОЕКТА SERVER

Настройка подпроекта Server, аналогично подпроектове Client, заключается в подключении к сборке каталога TCPEngine . Однако, в данном случае подключение будет осуществленно без поддержки модульных тестов. Для этого конфигурационный файл подпроекта следует модифицировать следующим образом:

Server_notests_source_dirs += src/TCPEngine

Выбор того, как подключать внешние каталоги, полностью возлагается на разработчика.

 

НАСТРОЙКА ПОДПРОЕКТА SERVERDUMMY

Настройка подпроекта ServerDummy также связана с подключением внешних какалогов:

ServerDummy_source_dirs += src/Server/DummyServer src/Server
ServerDummy_notests_source_dirs += src/TCPEngine
ServerDummy_exclude_files += src/Server/Server.cpp src/Server/Operations.cpp

Здесь с помощью тэга <имя подпроекта>_exclude_files, отменяется включение части файлов из добавленного внешнего каталога.

 

СОЗДАНИЕ СЕССИИ ДЛЯ ОТЛАДКИ КЛИЕНТА

Ниже показывается как настоить сессию для отладки подпроекта Client, если подпроект Server еще не реализован. Для того, чтобы не испортить настройки сборки проекта, следует создать отладочную сессию:

$ me-create -debug Debug_client

Перед осуществлением сборки следует проверить параметр session в файле .me-session :

session=Debug_client

Следующим шагом следует исключить из компиляции подпроект Server и добавить DummyServer, изменив Debug_client/Makefile.in так, как показано ниже:

session_subprojs_dirs = src/Server/ServerDummy
exclude_subproj_dirs = src/Server

 

НАСТРОЙКА ФИНАЛЬНОЙ (РЕЛИЗНОЙ) СБОРОЧНОЙ СЕССИИ

Релизная сессия будет настроена так, что сборка проекта в рамках этой сессии не будет требовать установленного Make-Effect. Это удобно в случае поставки программного продукта с исходными кодами.

Релизная сессия автоматически создается при создании проекта, однако, если необходимой релизной сборочной сессии не существует, то она может быть создана командой из корневого каталога проекта:

me-create -release <имя сессии>

Так же, как и при создании отладочной сессии, будет создан каталог с именем сессии и файл Makefile.in .

В некоторых случаях удобнее, если конфигурационный файл сборочной сессии располагается в главном каталоге проекта. Make-Effect позволяет перемещать конфигурационный файл сборочной сессии при соблюдении правила именования, файл в главном каталоге должен иметь имя mk-<имя сессии>.in:

$ mv Release/Makefile.in mk-Release.in

По умолчанию релизная сессия использует частичную компиляцию, опираясь на работу утилиты me-autodep из состава Make-Effect. Чтобы отключить частичную компиляцию следует изменить настройки в файле mk-Release.in:

depend = no
default: clean build

Если для релизной сессии использовалось имя отличное от Release , следует проверить значение имени сессии по-умолчанию в главном make-файле проекта. Значение session должно быть установлено в соответствии с используемой сессией.

Если все шаги выполнены, команда make приведет к сборке проекта.

 

ПОДГОТОВКА ПРОЦЕДУРЫ ИНСТАЛЛЯЦИИ

Make-Effect предлагает заготовку для создания tar.gz архивов, которые распаковываются QNX утилитой install -u .

Для того, чтобы по команде make pack создавался установочный архив, следует установить параметры главного make-файла проекта: project - имя проекта, version - версия проекта, installation_dir - каталог установки.

Процедуру упаковки следует реализовывать в файле pack.sh . Для данного примера процедура упаковки может быть задана следующим образом:

pax -ws ,$session/bin,$installation_directory, -f $output_tar_file $session/bin

Если процедура упаковки проекта задана верно, становятся доступными команды make pack (создание установочного архива) и make install (инсталляция проекта).

 

ОФОРМЛЕНИЕ TCPENGINE В ВИДЕ БИБЛИОТЕКИ

Оформление TCPEngine в виде библиотеки поможет решить проблему с тем, что модульные тесты для каталога src/TCPEngine вызываются только вместе с тестами подпроекта Client

Для того, чтобы создать подпроект статической библиотеки, необходимо в корневом каталоге проекта вызвать команду

$ me-create -subproj src/TCPEngine

и выбрать вариант #3 - шаблон статической библиотеки.

Параметры <имя подпроекта>_source_dirs , <имя подпроекта>_notests_source_dirs и <имя подпроекта>_exclude_files make-файлов остальных подпроектов следует вернуть в исходное состояние:

файл ./src/Client/Makefile.in :
Client_source_dirs += src/Client
Client_exclude_files +=

файл ./src/Server/DummyServer/Makefile.in :
ServerDummy_notests_source_dirs +=

файл ./src/Server/Makefile.in :
Server_notests_source_dirs +=

А параметры <имя подпроекта>_ldflags установить так, как показано ниже:

файл ./src/Client/Makefile.in :
Client_ldflags += -L $(session)/bin -l TCPEngine.lib

файл ./src/Server/DummyServer/Makefile.in :
Server_ldflags += -L $(session)/bin -l TCPEngine.lib

файл ./src/Server/Makefile.in :
ServerDummy_ldflags += -L $(session)/bin -l TCPEngine.lib

Для поддержки перекомпиляции подпроектов при обновлении библиотеки, в конфигурационные файлы подпроектов Client и Server следует добавить строки так, как показано ниже:

файл ./src/Client/Makefile.in :
$(Client_out_dir)/Client: $(session)/bin/TCPEngine.lib

файл ./src/Server/Makefile.in :
$(Server_out_dir)/Server: $(session)/bin/TCPEngine.lib

Последним шагом следует указать новый подпроект в главном make-файле проекта:

base_subprojs_dirs := TCPEngine Client Server

Поскольку сборка подпроектов осуществляется в том порядке, в котором они перечислены, сборка библиотеки должна быть поставлена вперед списка.