5. Шаблон для составных проектов

5.1. Назначение

В некоторых случаях проект состоит из нескольких отдельных проектов. Например, если разрабатывается библиотека поддержки взаимодействия через сокеты по протоколу TCP/IP, то для тестирования этой библиотеки необходимо два приложения: одно для серверного сокета, второе для клиентского. В терминах шаблона для C++ потребуется три проектных файла - один для библиотеки, второй для серверного приложения, а третий - для клиентского приложения:

// Проектный файл для библиотеки tcp_socket.4xx
#include <start.4xx>

appMode = "lib";
screenMode = "console";
target = "lib/tcp_socket";
cppSource += "tcp_socket/tcp_socket.cpp";

#include <finish.4xx>

// Проектный файл для серверного приложения test_server.4xx #include <start.4xx> appMode = "exe"; screenMode = "console"; target = "test_server"; cppSource += "tcp_socket/test_server.cpp"; libs += "lib/tcp_socket"; dependOnPrjs += "tcp_socket.4xx"; #include <finish.4xx>
// Проектный файл для серверного приложения test_client.4xx #include <start.4xx> appMode = "exe"; screenMode = "console"; target = "test_client"; cppSource += "tcp_socket/test_client.cpp"; libs += "lib/tcp_socket"; dependOnPrjs += "tcp_socket.4xx"; #include <finish.4xx>

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

mxxc -f test_server.4xx
mxxc -f test_client.4xx

что не очень удобно. Более удобно было бы иметь один проектный файл, из которого запускается компиляция обоих приложений. Именно для создания таких объединяющих проектных файлов и предназначен шаблон составных проектов. С его использованием приведенный выше пример дополняется еще одним файлом:

// Составной проект tcp_test.4xx
#include <composite/start.4xx>

prjs += "test_server.4xx";
prjs += "test_client.4xx";

#include <composite/finish.4xx>

Теперь для компиляции обоих тестовых приложений необходимо указывать mxxc имя только одного проекта:

mxxc -f tcp_test.4xx

5.2. Принцип работы

Принцип работы шаблона черезвычайно прост - для всех проектов, указанных в переменной prjs (см. 5.4.1) последовательно запускается mxxc, которой указывается имя очередного проектного файла и все директивы командной строки, указанные при запуске составного проекта. Т.е. если есть следующий составной проект:

// Составной проект tcp_test.4xx
#include <composite/start.4xx>

prjs += "test_server.4xx";
prjs += "test_client.4xx";

#include <composite/finish.4xx>

то запуск mxxc -f tcp_test.4xx равносилен:

mxxc -f test_server.4xx
mxxc -f test_client.4xx

А запуск mxxc -f tcp_test.4xx -d MSC -d DEBUG равносилен:

mxxc -f test_server.4xx -d MSC -d DEBUG
mxxc -f test_client.4xx -d MSC -d DEBUG

5.3. Состав шаблона

Шаблон для составных проектов хранится в нескольких файлах, расположенных в подкаталоге lib/composite. Главными файлами шаблона являются:

5.4. Переменные шаблона

Далее описываются наиболее важные переменные шаблона для C++, их тип, назначение, правила и примеры использования. Переменные описываются в порядке их значимости для проекта.

При описании типа переменной используется синтаксис языка M++.

5.4.1. prjs

string[]	prjs;

Содержит имена проектных файлов, которые входят в составной проект (отдельные подпроекты). Построение подпроектов осуществляется в том порядке, в котором они указаны в переменной prjs.

5.4.2. ignore_result

string	ignore_result;

Если содержит отличное от empty значение, то результат построения подпроектов игнорируется.

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

5.5. Особенность

Как было сказано выше, работа шаблона организована тривиально - последовательный запуск mxxc для подпроектов с передачей тех же аргументов, которые были указаны составному проекту. Это нужно учитывать при объявлении таких символов препроцессора, как REBUILD (см. 4.4.16). Если вернуться к примеру из 5.1, то запуск mxxc -f tcp_test.4xx -d REBUILD, приведет к тому, что библиотека tcp_socket будет полностью перекомпилирована дважды: первый раз при запуске mxxc -f test_server.4xx -d REBUILD, второй раз при запуске mxxc -f test_client.4xx -d REBUILD.

Hosted by uCoz