В некоторых случаях проект состоит из нескольких отдельных проектов. Например, если разрабатывается библиотека поддержки взаимодействия через сокеты по протоколу 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
Принцип работы шаблона черезвычайно прост - для всех проектов, указанных в переменной 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
Шаблон для составных проектов хранится в нескольких файлах, расположенных в подкаталоге lib/composite. Главными файлами шаблона являются:
Далее описываются наиболее важные переменные шаблона для C++, их тип, назначение, правила и примеры использования. Переменные описываются в порядке их значимости для проекта.
При описании типа переменной используется синтаксис языка M++.
string[] prjs;
Содержит имена проектных файлов, которые входят в составной проект (отдельные подпроекты). Построение подпроектов осуществляется в том порядке, в котором они указаны в переменной prjs.
string ignore_result;
Если содержит отличное от empty значение, то результат построения подпроектов игнорируется.
По умолчании, если при построении подпроекта код возвраты mxxc отличен от нуля (т.е. признак, того, что подпроект не построен), то работа завершается, а mxxc возвращает значение, полученое при неудачном построении подпроекта. В некоторых случаях останавливать работу не нужно. В этих случаях нужно присвоить переменной ignore_result какое-либо значение и код возврата mxxc при построении подпроектов будет проигнорирован.
Как было сказано выше, работа шаблона организована тривиально - последовательный запуск 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.