Источник: http://www.unix.org.ua/bcpp/r74_5_1.htm ------------------------------------= Make =----------------------------------- * Утилита MAKE * Как работает утилита MAKE * Файл BUILTINS.MAK * Использование TOUCH.EXE * Параметры командной строки * Установка параметров по умолчанию * Параметр совместимости -N * Использование формирующих файлов * Символические цели * Явные и неявные правила * Синтаксис явных правил * Несколько явных правил для одного целевого файла * Примеры * Автоматическая проверка зависимостей * Синтаксис неявных правил * Синтаксис команд * Префиксы команд * Операции в команде * Макрокоманды MAKE * Определение макрокоманд * Использование макрокоманд * Использование в качестве макрокоманд переменных среды * Подстановки с помощью макрокоманд * Особые ситуации * Предопределенные макрокоманды * Модификаторы макрокоманд * Директивы MAKE * Директивы с точкой * Директива .precious * Директива .PATH.расширение * Директива .suffixes * Директива включения файлов * Директивы условного выполнения * Выражения, допустимые в директивах условного выполнения * Директива !error * Директива отмены макроопределения Утилита MAKE Утилита MAKE фирмы Borland (MAKE - для защищенного режима и MAKER для реального режима) - это утилита управления проектами, работающая в режиме командной строки. Она помогает вам создавать выполняемую версию программы на основе самых последних версий исходных файлов. Многие программы состоят из значительного числа исходных файлов, каждый из которых, возможно, должен пропускаться через препроцессоры, ассемблеры, компиляторы и другие утилиты перед тем, как он будет объединяться с остальной частью программы. Если вы забудете перекомпилировать какой-либо модуль, который был модифицирован, или модуль, который зависит от какого-либо другого модифицированного исходного текста, то это может привести к разрушительным логическим ошибкам. С другой стороны, перекомпиляция всех исходных файлов лишь для того, чтобы обезопасить себя, может привести к слишком большим затратам времени. Эта задача разрешается утилитой MAKE. Утилите MAKE задается описание того, как должны обрабатываться исходные и объектные файлы вашей программы для того, чтобы получить результирующий продукт. Утилита MAKE анализирует эти описания и маркеры даты ваших файлов, а затем выполняет действия, необходимые для создания самой последней версии продукта. Во время выполнения этого процесса утилита MAKE может вызывать множество различных компиляторов, ассемблеров, компоновщиков и утилит, однако, для обновления результирующей программы она никогда не сделает ничего, что превышало бы необходимый минимум. Полезность утилиты MAKE выходит далеко за рамки чисто программных приложений. Вы можете воспользоваться утилитой MAKE для управления любым процессом, который связан с выбором файлов по имени и их обработкой для создания результирующего продукта. К числу некоторых широко распространенных приложений относится обработка текстов, автоматическое создание дубликатных копий, сортировка файлов по расширению имени с занесением их в другие каталоги, а также уничтожение временных файлов в ваших каталогах. Как работает утилита MAKE Утилита MAKE создает самую последнюю версию вашей программы, выполняя при этом следующие задачи: * Считывает специальный файл (называемый файлом описания, формирующим файлом или файлом сборки), который был предварительно вами создан. Этот файл указывает утилите MAKE, какие объектные файлы и библиотечные файлы должны быть скомпонованы для того, чтобы создать выполняемый файл, а также указывает, какие исходные файлы и файлы заголовков должны компилироваться для создания каждого объектного файла. * Проверяет время и дату создания каждого объектного файла по отношению к времени и дате создания исходного файла и файлов заголовков, от которых он зависит. Если какой-либо из этих файлов является более новым, чем объектный файл, утилита MAKE считает, что он был модифицирован, и что необходимо произвести перекомпиляцию исходного файла. * Вызывает компилятор для перекомпиляции исходного файла. * После того, как были проверены все зависимости объектных файлов, дата и время создания каждого объектного файла проверяется по отношению к дате и времени создания выполняемого файла. * Если какой-либо из объектных файлов оказывается более новым по сравнению с выполняемым файлом, утилита вызывает компоновщик для его перекомпоновки. Утилита MAKE полностью полагается на дату и время, которые DOS присваивает каждому файлу. Это означает, что для нормальной работы утилиты MAKE необходимо корректно устанавливать системные дату и время. Ниже приводится синтаксис вызова команды MAKE: MAKE [параметр...][результат...] Здесь "параметр" является параметром утилиты MAKE (они описываются далее), а "результат" представляет собой имя результирующего файла, который должен быть создан. Ниже описываются синтаксические правила вызова утилиты MAKE: * За словом make должен следовать пробел, а затем список параметров утилиты make. * Каждый параметр утилиты MAKE должен отделяться от соседних параметров пробелом. Параметры могут располагаться в любой последовательности; может быть введено произвольное число этих параметров (ограничением является длина командной строки). Все параметры, которые не задают строку (например, -s или -a) могут завершаться необязательным символом - или +. При помощи этих символов указывается выключение (-) или включение (+) данного параметра. * За списком параметров утилиты MAKE следует пробел, а затем необязательный список результирующих файлов. * Каждый результирующий файл также должен отделяться от соседних результирующих файлов пробелом. Утилита MAKE анализирует результирующие файлы в порядке их расположения, перекомпилируя по мере необходимости их компоненты. Если в командной строке не содержатся имена результирующих файлов, то утилита MAKE использует в качестве явно заданного результирующего файла имя первого обнаруженного результирующего файла. Если в командной строке указан один или несколько результирующих файлов, то они будут создаваться по мере необходимости. Файл BUILTINS.MAK Вы быстро обнаружите, что существуют макрокоманды и правила утилиты MAKE, которые требуется использовать снова и снова. Существует три способа их обработки: * Во-первых, вы можете заносить их в каждый создаваемый вами формирующий файл для утилиты MAKE; * Во-вторых, вы можете занести все эти элементы в один файл и воспользоваться директивой !include в каждом создаваемом вами формирующем файле утилиты MAKE. (Другие директивы описываются далее в этой главе.); * В-третьих, вы можете занести все эти элементы в файл BUILTINS.MAK. Каждый раз, когда вы запускаете утилиту MAKE, она ищет файл с именем BUILTINS.MAK. Однако, наличие файла BUILTINS.MAK не является обязательным. Если MAKE обнаруживает файл BUILTINS.MAK, то сначала она интерпретирует этот файл. Если утилита MAKE не может обнаружить файл BUILTINS.MAK, то она переходит непосредственно к интерпретации файла MAKEFILE (или того формирующего файла утилиты MAKE, который был вами задан с помощью параметра -f). Утилита MAKE сначала ищет файл BUILTINS.MAK в текущем каталоге. Если он отсутствует, и вы работаете под управлением DOS версии 3.0 или старше, то MAKE осуществляет поиск в том каталоге, откуда была вызвана сама утилита MAKE. Вам следует заносить файл BUILTINS.MAK в тот же каталог, где находится файл MAKE.EXE. Утилита MAKE всегда осуществляет поиск формирующего файла только в текущем каталоге. Этот файл содержит правила для конкретной создаваемой выполняемой программы. Как файл BUILTINS.MAK, так и формирующий файл подчиняются одинаковым синтаксическим правилам. Поиск файлов, задаваемых с помощью директивы !include, также осуществляется в текущем каталоге. Если вы используете параметр -I (файлы включения), то она будет также выполнять поиск в каталоге, заданном с помощью параметра -I. BUILTINS.MAK содержит стандартные правила и макрокоманды, которые MAKE применяет перед тем, как MAKE использует формирующий файл (параметр -r позволяет MAKE игнорировать BUILTINS.MAK). Использование TOUCH.EXE Иногда требуется вызвать принудительную перекомпиляцию или построение целевого файла, даже если он еще не изменялся. Это можно сделать с помощью утилиты TOUCH, которая изменяет дату и время одного или более файлов на текущие дату и время, делая его (их) более новым, чем файлы, от которых он зависит. Вы можете также вынудить MAKE перестроить целевой файл, изменив один из файлов, от которых он зависит. Для этого наберите в командной строке: TOUCH имя_файла [имя_файла] После этого TOUCH обновляет дату и время создания файла. Параметры командной строки Параметры командной строки управляют поведением утилиты MAKE. Заметьте, что имеет значение регистр букв (верхний или нижний); параметр -d не является допустимой заменой параметру -D. Кроме того, для указания параметров можно задавать либо косую черту (/), либо дефис (-). Параметр Действие -? или -h Выводит информационное сообщение. Отображаются стандартные параметры, за которыми следует знак плюс. -B Осуществляет полную перекомпиляцию всех результирующих файлов вне зависимости от дат создания файлов. -Dмакро Определяет "макро" как один символ - выражение !ifdef макро будет возвращать True. [-D]ид=[стр] Определяет названный идентификатор "ид" как строку "стр", стоящую после знака равенства. Эта строка не может содержать ни пробелов, ни знаков табуляции. -fимя_файла Использует "имя_файла" в качестве формирующего файла для утилиты MAKE. Если "имя_файла" не существует и не задано расширение имени файла, то утилита MAKE пытается найти файл FILENAME.MAK. -Iкаталог Осуществляет поиск файлов включения в указанном каталоге (а также в текущем каталоге). -K Сохраняет (не стирает) временные файлы, созданные утилитой MAKE. Все временные файлы имеют формат MAKEnnnn.$$$, где nnnn лежит в диапазоне от 0000 до 9999. -N Выполняет MAKE как Microsoft NMAKE. -Uидентиф Отменяет все заданные ранее описания названного идентификатора. -W Заносит в файл MAKE.EXE заданные в настоящий момент нестроковые параметры (типа -s или -a). -a Проверяет зависимости включаемых файлов и вложенных включаемых файлов, связанных с файлами .OBJ, и обновляет файл .OBJ, если файл .H изменен. -c Кэширует информацию о зависимостях, что улучшает производительность MAKE. Не используйте его с -a а также если MAKE изменяет включаемые файлы. -dкаталог Используется с -S для задания диска и каталога, который MAKE использует для свопинга (для MAKER не действует). -e Игнорирует макрокоманду, если ее имя совпадает с именем переменной операционной среды. -i Игнорирует состояние завершения всех запускаемых из MAKE программ и продолжает процесс построения. -m Выводит дату и время каждого файла при обработке его MAKE. -n Выводит команды, но не выполняет их (полезно использовать при отладке). -p Перед выполнением формирующего файла выводит все макроопределения и неявные правила. -q Возвращает 0, если цель имеет новую дату и время и не 0 в противном случае (используется в командных файлах). -r Игнорирует все правила, определенные в BUILTINS.MAK. -s Подавляет вывод команд на экран. -S Выгружает MAKE из памяти при выполнении команд, что уменьшает использование памяти и позволяет компилировать большие модули. Для MAKER не действует. Установка параметров по умолчанию Параметр -W позволяет вам установить некоторые параметры MAKE, которые будут использоваться по умолчанию. Чтобы задать такие параметры, наберите: make -параметр[-] [-параметр][-] ... -W Нужно учитывать, что -W не работает, когда загружена программа DOS SHARE, а также со следующими параметрами MAKE: -Dмакро -fимя_файла [-D]ид=[стр] -? или -h -dкаталог -lкаталог -Uидентификатор Параметр совместимости -N Параметр командной строки -N увеличивает совместимость с утилитой фирмы Microsoft NMAKE. Его следует использовать только в том случае, если вам требуется построить проект с использованием формирующих файлов, созданных для утилиты NMAKE. Предпочтительнее запускать утилиту MAKE без параметра -N, так как данный параметр вносит в утилиту MAKE некоторые трудноуловимые отличия: * $$ расширяется в один символ $, а $ расширяется в "пусто". * Символ каре (^) приводит к литеральной обработке последующего символа, если это специальный символ. Например, макрокоманда: TEST = this is ^ a test приведет к тому, что TEST будет расширяться в this is \na test, где \n - это символ языка Си перевода на новую строку. Это особенно полезно, когда вам нужно закончить строку символом продолжения строки: SOURCEDIR = C:\BOB\OBJ^\ * Если за символом каре следует обычный символ (не имеющий специального значения), то символ каре игнорируется. * Макрокоманда $d не будет специально определяемой текстовой макрокомандой. Используйте вместо нее директивы !ifdef и !ifndef. * Предопределенные макрокоманды, которые возвращают маршрут, не будут заканчиваться обратной косой чертой. Например, без параметра -N переключатель $( и >>, утилита MAKE добавляет операции << и &&. Эти операции для создания подаваемых на вход команды данных создают в оперативном порядке файл. Операция << создает временный файл и переназначает поток стандартного ввода команды таким образом, что он поступает из созданного файла. Если у вас имеется программа, которая допускает ввод данных из потока stdin, то команда: MYPROG < 5 какие-либо правила !else другие правила <конец файла> Еще один способ определения макрокоманды предоставляет директива !ifdef. Директива !ifdef MACRO эквивалентна !if $d(MACRO). Это верно также для директивы !ifndef: директива !ifdef MACRO эквивалентна !if $d(MACRO). Выражения, допустимые в директивах условного выполнения В директивах !if и !elif возможно задание выражений; они используют синтаксис, присущий языку Cи. Выражение вычисляется как обычное 32-битовое целое со знаком. Вы можете вводить числа как десятичные, восьмеричные или шестнадцатеричные константы. Если вы знаете язык Си, то вы уже знаете, как нужно задавать константы утилите MAKE: форматы одинаковы. Если вы программируете на ассемблере или на Турбо Паскале, то рекомендуем вам внимательно проанализировать приведенные ниже примеры. Ниже приводятся допустимые для утилиты MAKE константы: 4536 # десятичная константа 0677 # восьмеричная константа (различается по начальному нулю) 0x23aF # шестнадцатеричная константа (различается по начальной последовательности 0x) В выражении может использоваться любой из представленных ниже знаков операций: Операция Действие Символы унарных операций: - унарный минус ~ побитовое дополнение (инверсия всех битов) ! логическое отрицание NOT (0, если операнд ненулевой, 1 - в противном случае) Символы бинарных операций: + сложение - вычитание * умножение / деление % остаток >> сдвиг вправо << сдвиг влево & поразрядное И (AND) | поразрядное ИЛИ (OR) ^ поразрядное исключающее ИЛИ (XOR) && логическое И (AND) || логическое ИЛИ (OR) > больше чем " меньше чем >= больше либо равно "= меньше или равно == равенство != неравенство Символ тернарной операции: ?: Операнд перед знаком ? рассматривается как тестовый. Символы операций имеют тот же самый приоритет, что и в языке Си. Для группирования операндов в выражении можно использовать круглые скобки. В отличие от языка Си утилита MAKE может сравнивать строки с помощью обычных операций ==, !=, <, >, >= и =>. Числовые (например, + или *) операции со строками использовать нельзя. Строковые выражения могут содержать пробелы, но в этом случае их нужно заключать в кавычки: Model = "Medium model" . . . !if $(Model) == "Medium model" CFLAG = -mm !elif $(Model) == "Large model" CFLAG = -m1 !endif Вы можете вызвать макрокоманды в выражении; будет распознаваться специальная макрокоманда $d(). После того, как произошло расширение всех макрокоманд, синтаксис выражения должен соответствовать установленным требованиям. Директива !error Директива выдачи сообщения об ошибке (!error) указывает утилите MAKE, что нужно прервать выполнение и отобразить диагностическое сообщение о неисправимой ошибке, содержащее текст после директивы !error. Данная директива имеет формат: !error произвольный_текст Данная директива предназначена для включения в директивы условного выполнения, чтобы заданное пользователем условие определения ошибки могло бы прервать выполнение утилиты MAKE. Например, вы можете вставить перед первым явным правилом следующий код: !if !$d(MODEL) # если MODEL не определена !error MODEL не определена !endif Если при подходе к данной точке директива MODEL еще не была определена, то утилита MAKE прекращает выполнение с выдачей следующего сообщения об ошибке: Fatal makefile 4: Error directive: MODEL не определена Директива отмены макроопределения Директива отмены макроопределения (!undef) указывает на необходимость отмены любого определения для заданного макрокоманда. Если в настоящий момент данная макрокоманда не определен, то данная директива действовать не будет. Директива имеет следующий синтаксис: !undef имя_макрокоманды