Утилита MAK

 

Введение

    Что это такое
    Можно ли обойтись без этой утилиты?
    Общие сведения

Трансляция утилиты

    Компиляторы для трансляции самой утилиты MAK
    Генерация исполнимого кода для Windows
    Генерация исполнимого кода для Linux
    Настройка под компилятор
    Компиляция под Borland C++ 3.1

Внутренний язык mak-файлов

Download

TODO - планы


 Что это такое

MAK - утилита управления процессом трансляции проектов на C и C++, упрощенный аналог make. Работает в настоящее время в Windows (9x/.../XP) и Linux (проверено в Mandrake с версии 7.2 до 10). Позволяет иметь одинаковые файлы проекта для разных компиляторов, благодаря тому, что обобщенные опции компиляции типа 'включать отладочную информацию' или 'оптимизация по скорости' преобразуются в опции командной строки для конкретного компилятора. В интернете можно найти несколько подобных утилит (например, на http://sourceforge.net). В чем-то они превосходят MAK. Например, в MAK в текущей версии (см. также TODO - планы) нет возможности сгенерировать родной (native) make-файл для компиляторов.

Можно ли обойтись без этой утилиты?

    Да.

    Все программы Solarix'а нормально компилируются через создаваемые в IDE MS Visual Studio.NET и Borland C Builder проекты, которые также можно найти среди скачиваемых исходников (например, файл \LEM/Demo/AI/Solarix/Ygres/Compiler/compiler.bpr - проект для CBuilder'а версии 6.0). Для некоторых утилит IDE-проекты создавались в целях более удобной отладки.

Общие сведения

Эта программа используется как make-утилита с возможностями эмуляции обобщенных опций трансляции (оптимизация, целевой процессор и т.д.) и автоматического перевода этих опций в опции командной строки для конкретного выбранного компилятора. В настоящее время программа MAK поддерживает большое количество различных компиляторов C/C++ и позволяет строить программы для самых популярных платформ - MSDOS, Windows, LINUX.

Все исходные тексты утилиты находятся в каталоге \LEM\Demo\Mak.

Желательность использования именно утилиты MAK для построения модулей Системы объясняется тем, что создавать для каждого модуля mak-файлы проектов либо IDE-проекты для всех поддерживаемых компиляторов достаточно затруднительно. Совместимость же по опциям командной строки у компиляторов отсутствует. Отсутствует также и совместимость по внутреннему языку у make-утилит в разных компиляторах. С помощью утилиты MAK можно легко компилировать модули с выбираемым компилятором (см. п.4 - настройка на компилятор).

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


Компиляторы для трансляции самой утилиты MAK

Мы принципиально ограничились старым предстандартом C++ (обычно обзываемом как AT&T CFront 3.0). Шаблоны (и все более новые конструкции) не используются. Никакие дополнительные библиотеки, кроме стандартной C'шной, не используются (даже iostream и другие C++ библиотеки). Имена всех файлов исходников - короткие (8.3). Поэтому компилировать утилиту из исходников можно в принципе любым доступным компилятором. Мы проверялись с помощью:

Borland C++ 3.1
Watcom C++ v.11/Open Watcom
Borland C++ Builder 6.0
Microsoft VisualSudio.NET 2003
MinGW v.3.1
Linux GCC 3.2

Более под рукой ничего не оказалось...

Генерация исполнимого кода для Windows

Можно скачать готовые исполнимые модули!

Итак, приступаем.

На первом этапе используется компилятор Borland C++ 3.1. Вероятно, можно использовать и другие аналогичные компиляторы (Zortec C++ 3.1, к примеру). В IDE компилятора (bc.exe) загружается файл проекта mak.prj, находящийся в каталоге MAK. При необходимости корректируются пути (пункты меню Options | Directories). В модели памяти large создается исполнимый файл размером примерно 120 Кб.

Настройка утилиты на ОСь и поддерживаемые (target) компиляторы выполняется через макросы в файле MAK\mak_cfg.h. Необходимо оставить поддержку DOS/Win (макросы MAK_CFG_MSDOS и MAK_CFG_WIN32), языка C++ (макрос MAK_CFG_CPP).

Созданный файл mak.exe переносится в каталог, доступный для просмотра через содержимое переменной среды PATH.

Созданный exe'шник вполне работоспособен - за исключением одной фичи. Чтобы не портить себе настроение при компиляции остальных модулей Системы, лучше откомпилировать утилиту в современном компиляторе (например, в Borland C++ Builder'е). Для этого можно либо воспользоваться готовым проектом для IDE  (mak_bcb.bpr среди исходников), либо сделать второй виток генерации MAK-  с помощью уже полученного exe'шника.

Допустим, имеем exe'шник после BC++ 3.1. В командной строке производим настройку на целевой компилятор, генерируем скрипт и компилируемся:

tc56
mak -batch
compile

Первая команда - настройка переменных окружения (пути и так далее), вторая команда - создание текстового файла (скрипта) с именем compile.bat, последняя - исполнение скрипта.

В результате должен получиться файл mak.exe.

При компиляции в MS VisualStudio 2003 последовательность шагов аналогичная. После команды mak -batch содержимое консоли будет примерно таким:

После команды compile результат:

Генерация исполнимого кода для LINUX

Можно скачать готовые исполнимые модули!

Должен быть установлен транслятор C++, например GCC. Обычно он входит в стандартную конфигурацию. Запускаете скрипт (текстовый файл mak.sh), набрав в командной строке

./mak.sh

или

bash < mak.sh

Временные и объектные файлы будут сохранены в текущем каталоге. На машине Pentium-II 500 MHz трансляция занимает несколько секунд. Никаких сообщений по ходу трансляции не печатается. В случае успешной трансляции будет создан файл mak, который надо перенести в любую подходящую папку для программ пользователя. Можно, конечно, запускать утилиту из текущего каталога, скопировав туда файл mak, с помощью команды:

./mak

После этого можно проверить корректность построенного модуля, набрав команду

mak mak.mk gnu <ENTER>

Будет выполнена перекомпиляция всех исходных текстов утилиты. Создается опять-таки файл mak - исполнимый модуль. Теперь компиляция в GCC выполнена под общим командованием утилиты MAK.

Обращая внимание, что каких-либо изменений в файле mak.mk делать не надо, формирование нужных опций для компилятора выполняется автоматически.

Настройка под компилятор

Утилита умеет считывать переменные окружения. В этих переменных можно указать условное имя используемого компилятора, наименование платформы и другие параметры, а также пути к библиотекам и header'ам. Это наиболее удобный способ использования утилиты - не приходится при каждом запуске утилиты MAK указывать в командной строке имена и номер версии транслятора, а также писать в mak-файлах явные пути к используемым библиотекам, папкам с хидерами и т.д.

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

Переписав эти командные файлы в какой-нибудь доступный через PATH каталог (допустим, c:\bats), можно настроить трансляцию на OpenWatcom C++ (или его предок Watcom C++), набрав в командной строке:

w_dos

Для трансляции с помощью MS VisulStudio.NET 2003 надо набрать

vs2003

Аналогично, для компиляции в Borland C Builder 6.0 набираем

tc56

Для использования этих bat-файлов на своей машине скорректируйте пути к каталогам в них (сами батники имеют комментарии - следуйте им).

В принципе ничто не мешает менять настройку на компилятор налету - в командной строке запускаете соответствующий bat-файл, компилируете программу, запускаете другой bat-файл, и т.д. Однако могут возникнуть сложности с размером environment'а - области памяти, отводимой для переменных окружения. В этом случае закройте 'отработанное' окно DOS-сессии и откройте другое.

Для среды Linux настрока может производиться по-разному. Мы предпочитаем вариант автоматической настройки на GCC (учитывая его стандартность для Linux'а) - через файл типа .bashrc в домашнем каталоге пользователя, который исполняется при создании нового сеанса. Пример этого файла можно взять здесь.

Теперь мы готовы компилировать программы непосредственно системы SOLARIX, начиная с YGRES.

Компиляция под Borland C++ 3.1 и Watcom C++

    Весьма древний (более 10 лет!), но все еще используемый компайлер. В нем реализован старый предстандарт C++ (есть шаблоны, но нет исключений и многого другого).

    Утилита MAK нормально компилируется под BC++ 3.1, и получается вполне работоспособный код. Но есть одна особенность (именно - фича, а не баг) в получающемся exe'шнике. Стандартные библиотеки BC++ 3.1 создавались в то время, когда файлы в MSDOS и Windows 3.1 могли иметь только имена 8.3. Поэтому и получающаяся утилита также не сможет работать с cpp-файлами и именами до 8.3. При попытке работать с длинными именами ждет сюрприз (например, файлы исходников в библиотеке BOOST имеют длинные имена, и эти файлы включаются в проекты модулей Solarix'а).

    Аналогичная особенность есть и в dos-exe'шниках после Watcom C++.

   Поэтому если планируется работать с  длинными именами файлов, то лучше откомпилировать MAK в современном компиляторе (мы предпочитаем Borland C Builder). Для скачивания также предлагается именно скомпилированная в BCB утилита. Но можно скачать и откомпилированную в TC++ 3.1.


Внутренний язык mak-файлов

    Получить краткую справку можно в командной строке:

mak -h

    Описание языка будет включено сюда немного позднее...


TO DO - планы

    В настоящее время идет работа над следующим (0.40) релизом утилиты (примерно на конец 2004 года), в которую будут включены некоторые новые возможности (в порядке убывания важности):

1. поддержка опций компиляции для CPU AMD

2. генерация dependency info по хидерам, включаемым через #include в cpp-файлах проектов

3. генерация native make-файлов для поддерживаемых компиляторов

4. создание графического front-end'а для управления файлами проекта в MAK (по-возможности front-end будет создан с использованием портабельной (собственной или сторонней) оконной библиотеки)

5. поддержка управления созданием кода для Microsoft.NET

6. проверить работу для фришного компилятора Borland C++ 5.5

7. порт на FreeBSD

8. рефакторинг исходного кода - с целью достижения внутренней гармонии, в частности - необходимо убрать глобальные объекты с текущими флагами компиляции

9. включение поддержки Intel компиляторов C++

10. создание нормальных rpm'ов для установки в Linux'е

11. удобная генерация места ошибок в файлах скриптов.

    Отметим, что утилита с самого начала (почти 10 лет тому взад!) создавалась как рабочий инструмент. Поэтому кардинально менять синтаксис внутреннего языка (например, отказаться от операции раскрытия макросов через ${...}) мы не можем. Остается путь функциональной эволюции.


  © Козиев Илья 2019
изменено 01-Jul-10