Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Автономная утилита MAKE


 Предыдущая страница     |     Следующая страница  
Добавить в избанное Обсудить в форуме Написать автору сайта

     Этот раздел   содержит   полную   документацию   по   созданию конфигурационных файлов и использованию программы Make.

   

Создание конфигурационных файлов.

      Конфигурационный  файл   содержит    определения    и    связи  необходимые для программы  Make  с целью поддержания Ваших программ в актуальном состоянии.  Вы можете  создавать  сколь  угодно  много конфигурационных файлов  с  любыми  именами.  Если  Вы  не зададите  конфигурационный файл при запуске программы Make (используя опцию - f),  то  в этом случае Make будет искать файл с именем по умолчанию Makefile.

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

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

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

      - комментарии.

     - явные  правила.

     - неявные правила.

     - макроопределения.

     - директивы: включение файла, условное выполнение, обнаружение

       ошибок, аннулирование макроопределения.

      Давайте рассмотрим  более детально каждую из этих конструкций.

Комментарии.

      Комментарии начинаются с символа (#),  все что следует за этим  символом до конца строки программой Make игнорируется.  Комментарии могут помещаться  в  любом  месте.  Обратная  наклонная  черта   не продолжает комментарий на следующую строку,  вместо этого Вы должны использовать символ (#) на каждой строке.  Обратную наклонную черту нельзя  использовать  в качестве символа продолжения комментария по той причине, что если черта предшествует символу #, она не является последним символом в строке,  если же она стоит после знака #,  она является частью самого комментария.

     Ниже приводится  ряд  примеров комментариев в конфигурационном файле.

     # makefile fo GETSTA .

     # does compile project maintenance

     # implicit rule

     .asm.obj: #.OBJ файлы зависят от входных ASM файлов

       tasm $*.asm,$*.obj:               # команда для их создания

     # unconditional rule

     getstars.exe:                    всегда создается GETSTARS.EXE

       tpc getstars /m

     # dependencies

     slib2.obj: slib2.asm               # команда для его создания.

                  # Используется приведенное выше неявное правило

     slib1.obj: slib1.asm          # приведение в соответствие как

                                               в явном правиле

       tasm slib1.asm,slib1.obj:

     # end of makefile

 [начало] [оглавление]

 

Явные правила.

      Явные правила принимают форму:

          target [target ... ]: [source source ... ]

            [command]

            [command]

            ...

где target - файл,  который подлежит модифицированию, source - файл  от  которого  зависит  target,  а  command - любая допустимая команда MS-DOS (включая запуск .BAT файлов и выполнение .COM и .EXE файлов).

     Явные правила определяют один или более  результирующих  имен, отсуствие или наличие нескольких исходных файлов,  и необязательный список команд,   подлежащих  выполнению.  Имена  результирующего  и исходного файлов,  перечисленных в явных правилах,  могут содержать имя   устройства  и  спецификации  справочника,  но  они  не  могут содержать шаблоны имен файлов (например *.OBJ).

     Синтаксис команды является  важным  элементом,   результирущий файл должен начинаться  с  начала  строки  (колонка  1),  и  каждая команда  должна  быть отделена по крайней мере,  одним пробелом или знаком табуляции.  Как уже упоминалось  ранее,  обратная  наклонная черта  может  использоваться  в  качестве  символа продолжения если список исходных файлов или команд  не  умещается  в  одной  строке. И, наконец,  как  исходные  файлы,  так  и  команды   не   являются обязательными  параметрами,  возможно существование явного правила, содержащего  только  результирующий  файл   target   [target..]   с последующим символом двоеточия(:).

     Идея применения   явного   правила   состоит   в   том,    что перечисленные    команды   будут   создавать   или   модифицировать результирующий файл target,  обычно используя  для  этого  исходные файлы.  Когда программа Make обнаруживает явное правило,  то прежде всего она проверяет наличие результирующего и исходных файлов. Если результирующий  файл  существует,  то  его  время  и  дата последней модификации сравниваются  с  временем  и  датой  каждого  исходного файла.  Если  любой из исходных файлов модифицирован после создания результирующего файла,  список команд выполняется.  В  задании  для программы  MAKE  имя  файла  в  левой  части  явного правила должно встречаться не более одного раза.

     Каждая командная  строка  в  явном правиле должна начинаться с раделителя (пробела).  Make рассматривает все строки  после  явного правила как   часть списка команд вплоть до строки,  начинающейся с колонки 1 (без предшествующих разделителей) и до конца файла.

     Пустые строки игнорируются.

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

     - Если явное правило для результирующего файла  имеет команды, то  формирование  этого  результирующего  файла  зависит  только от перечисленных в правиле файлов.

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

     Ниже представлен   конфигурационный   файл  с  примером  явных  правил:

         myutil.obj: myutil.asm

           tasm myutil.asm,myutil.obj;

         myapp.exe:  myapp.pas myglobal.tpu myitils.tpu

           tpc myapp /Tc:\tp5\bin

         myglobal.tpu: myglobal.pas

           tpc myglobal /Tc:\tp5\bin

 

         myutils.tpu: myutils.pas myglobal.tpu myutil.obj

           tpc myutils /Tc:\tp5\bin

     - Первое явное правило означает,  что  MYUTIL.OBJ  зависит  от  MYUTIL.ASM, и что MYUTIL.OBJ создается выполнением заданной команды  TASM. (опция /Т плюс имя пути во всех этих примерах будет об'яснена  позже).

     - Второе правило означает, что MYAPP.EXE зависит от MYAPP.PAS,  MYGLOBAL.TPU и MYUTIL.OBJ, и создается заданной командой TPC.

     - Если Вы измените порядок следования  правил  таким  образом,  что правило   для формирования MYAPP.EXE будет стоять первым,  Make  перекомпилирует ( или переассемблирует)  только необходимые  файлы.  Это произойдет потому, что Make без заданного результирующего файла в командной строке будет пытаться выполнить первое  явное  правило, которое будет обнаружено в конфигурационном файле.

     - На  практике,  Вам  следует  опускать  два  последних  явных правила  и  просто добавлять директиву /М в команду в явном правиле для MYAPP.EXE.  Однако  Вам  необходимо  добавить  все  зависимости исходных файлов из MYGLOBAL.TPU и MYUTOL.TPU.

 [начало] [оглавление]

 

Неявные правила.

      Make также позволяет Вам определять неявные  правила,  которые  являются   обобщением   явных   правил.   Ниже   приводится  пример  иллюстрирующий  зависимость  между  этими  двумя   типами   правил.  Рассмотрим явное правило из программы в предыдущем примере.

         myutil.obj:myutil.asm

           tasm myutil.asm.myutil.obj;

     Это правило является общим,  потому,  что  оно  придерживается общего  принципа:  .OBJ  файл  зависит от .ASM файла с тем же самым именем и создаетя выполнением  программы  TASM  (Турбо  Ассемблер). Действительно,  Вы можете иметь конфигурационный файл с несколькими (или даже несколькими  десятками)  явных  правил,  придерживающихся этого формата.

     Для переопределения  явного   правила   неявным,   Вы   можете сократить  все явные правила одинаковой формы.  В качестве неявного правила, конструкция  

         .asm.obj:

           tasm $*.asm, $*.obj;

      Это правило  означает,  что "любой файл оканчивающийся на .OBJ зависит от файла с тем же именем,  с расширением .ASM,  и .OBJ файл создается  с  использованием  команды tasm $*.ASM,  $*.obj,  где $* представляет собой имя файла без расширения".  (символ $*  является специальным   макроопределением   и   рассматриваются  в  следующем разделе).

     Неявное правило имеет следующий синтаксис:

         .source_extension.target_extension:

           (command)

           (command)

           ...

     Заметьте, что  команды  не  являются  обязательными  и  должны  начинаться  не  с  начала  строки.  Source_extension  -  расширение  исходного  файла  (которое  должно  начинаться  с  первой  колонки) представляет   собой   расширение   любого  файла  удовлетворяющего формату:

          имя_файла.расширение_исходного файла

      Аналогично, target_extension    (расширение    результирующего  файла)      относится к файлу "имя_файла.расширение_результирующего_файла", где       "имя_файла" одинаковое для исходного и результирующего файлов. Другими словами, это неявное правило заменяет все явные правила имеющие формат

          fname.target_extension:fname.source_extension

           (command) (command)

           ...

      для любого fname (имени файла).

      Неявные правила используются в том случае,  если  для  данного  результирующего  файла  не  найдено  явного  правила или если явное  правило для этого файла не имеет команд.

     Расширение файла  используется  для  определения  того,  каким неявным правилом пользоваться.  Неявное правило применяется  в  том случае,  если найден файл с тем же именем, что и результирующий, но с упомянутым расширением исходного файла. Для примера, предположим, что у Вас есть конфигурационный файл (с именем Makefile) содержание которого следующее:

          .asm.obj:

           tasm $*.asm,$*.obj;

      Если у Вас есть подпрограмма  на  языке  ассемблера  с  именем RATIO.ASM, которую Вы хотите откомпилировать в RATIO.OBJ, Вы должны использовать команду

         make ratio.obj

     Программа Make будет считать RATIO.OBJ результирующим  файлом. Поскольку для создания RATIO.OBJ явного правила нет, Make применяет неявное правило и генерирует команду

         tasm ratio.asm,ratio.obj;

которая конечно   использует   для  создания  RATIO.OBJ  Турбо Ассемблера.

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

          .pas.tpu:

           tpc $<

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

          myglobal.tpu:   myglobal.pas   myutils.tpu:   myutils.pas

         myglobal.tpu myutil.obj

      Поскольку у Вас нет явной информации о том,  как создавать эти .TPU файлы, Make применяет неявное правило, определенное ранее.

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

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

     Все последующие  строки  неявного  правила рассматриваются как часть списка команд,  вплоть  до  строки,  которая  начинается  без разделителей  или  до  конца  файла.  Пустые  строки  игнорируются. Синтаксис командной строки приводится далее в этом приложении.

     В отличие  от явных правил,  программа Make в случае  неявного правила не знает полного имени файла.  По этой причине  Make  может задавать  специальные макросы,  позволяющие Вам включать имя файла, которое  строится  по  этому  правилу  (Детальная   информация   по макроопределениям  приводится  в  этом  приложении).  Вот несколько примеров неявных правил:

         .pas.exe:

           tpc $<

         .pas.tpu:

           tpc $<

         .asm.obj:

           tasm $* /mx;

     В предыдущем примере, в качестве результирующих файлов использовались .EXE файлы,  а в качестве исходных - .PAS файлы.   В  этом примере имеется   одна командная строка (синтаксис командной строки рассматривается ниже в этом приложении).

     Второе неявное  правило  создает  .TPU  файлы  из .PAS файлов. Последний  пример  указывает  программе  Make  на   ассемблирование заданного файла из исходного .ASM файла,  используя Турбо Ассемблер TASM с опцией /mx.

 [начало] [оглавление]

 

Списки команд.

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

     Команды в списке команд должны иметь отступ - т.е.  иметь  или  знаки  табуляции  или  предшествующие  пробелы  в  строке.  Команды  представляются в следующем формате:

         [префикс...] тело команды

     Каждая командая   строка   в   списке   команд   состоит    из (необязательного) списка префиксов, с последующим телом команды.

     Префиксы, разрешенные в команде,   модифицируют  интерпретацию команды программой  MAKE.  Префикс представляет собой знак (@)  или (-), после чего следует число.

     @ Отменяет отображение команды перед выполнением.

     Отображения не происходит даже если не  задана  опция  -  S  в командной  строке.  Действие этого префикса распространяется только на команду в которой он имеется.

      - num устанавливает реакцию программы  MAKE  на  коды  выхода. Если число (num) определено, MAKE прекратит обработку, только в том случае,  если статус выхода будет превышать  заданное  значение.  В этом  примере,  MAKE прекращает обработку только если статус выхода больше 4-х:

          -4 myprog sample.x

      Если префикса - num не задано,  MAKE проверяет  статус  выхода для команды.  Если статус не нулевой, MAKE останавливает выполнение текущий результирующий файл.

      (-) Если задан дефис без числа, MAKE вообще не будет проверять статус  выхода.  Независимо  от  кода  выхода,  работа  MAKE  будет продолжена.

      Тело команды интерпретируется точно также,  если бы  Вы  ввели строку для COMMAND.COM,  за исключением того, что не поддерживаются переопределение устройств ввода/вывода и связь через  каналы.  MAKE выполняет   следующие   встроенные   команды,   активизируя   копию COMMAND.COM для их выполнения:

     BREAK       CD       CHDIR       CLS       COPY

     MD          MKDIR    PATH        PROMPT    REN

     RENAME      SET      TIME        TYPE      VER

     VERIFY      VOL

     MAKE осуществляет   поиск   любого   другого   имени  команды, используя алгоритм поиска MS-DOS:

     - Сначала осуществляется поиск в текущем  справочнике,   после чего выполняется поиск в справочнике указанных в пути.

     - В каждом справочнике сначала  проверяется  наличие  файла  с расширением .COM, затем .EXE и наконец .BAT.

     - Если обнаружен .BAT файл,  активизируется копия  COMMAND.COM для выполнения.

      Конечно, если  в командной строке задано расширение файла,  то поиск файла осуществляется только  с  этим  расширением.  Следующая команда  вызовет  выполнение  программой  COMMAND.COM команды смены справочника

         cd  c:\include

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

          tpc  myprog.pas  /$B+, R+,I+

      Эта команда   будет   осуществлять   поиск   только  используя расширение .COM:

         myprog.com  geo.xyz

      Эта команда   будет   выполняться   с   использованием  явного определения имени файла и устройства.

         c:\myprogs\fil.exe -r

 [начало] [оглавление]

Макросы.

      Часто определенные   команды,   имена   файлов    или    опции используются в конфигурационном файле несколько раз.  В приведенном ранее примере этого приложения, все команды TPC использовали ключ / TC:\tp5\bin,   что   означало,   что   файлы  TPC.CFG  и  TURBO.TPL расположены  в  справочнике  C:\TP5\BIN.  Предположим,  Вы   хотите подключить другой справочник, что для этого необходимо сделать?

     Вы можете изменить все опции /Т,  вставив необходимое имя пути файла. Или Вы можете определить макрос (макроопределение). Макрос - это имя ,  которое определяет некоторую строку символов (букв или цифр).  Макроопределение  задает имя макроса и текст расширения.  В результате,  если программа  Make  обнаружит  имя,  соответствующее макросу, она заменит это имя на макро-расширение.

     Предположим, Вы определили следующий  макрос  в  самом  начале своего конфигурационного файла:

          TYRBO = C:\tp5\bin

      Вы определили макрос TURBO, который эквивалентен строке c:\tp\ bin. Теперь  Вы можете переписать конфигурационный  файл  следующим образом:

          TURBO=c:\tp5\bin

         myapp.exe: myapp.pas mygobal.tpu myutils.tpu

           tpc myapp /T$(TURBO)

          myurils.tpu: myutil.pas myglobal.tpu myytil.obj

           tpc myutils /T$(TURBO)

          myglobal.tpu: myglobal.pas

           tpc myglobal; /T$(TURBO)

          myutil.obj: myutil.asm

           tasm myutil.asm,myutil.obj;

    Везде где  специфицирован  справочник  Turbo,  Вы  используете вызов   макроса   $(TURBO).  Когда  Вы  запускаете  MAKE,  $(TURBO) заменяется расширением с:\TP5.BIN.  В результате Вы имеете  тот  же самый   набор   команд.   Так   в   чем   же   здесь  выигрыш?  Ваш конфигурационный файл стал  более  гибким.  Изменив  теперь  первую строку на

          TURBO = c:\tp5\project

      Вы измените все команды для использования конфигурационными  и библиотечными файлами другого справочника.

     Если же Вы вынесете первую строку из конфигурационного файла и будете вводить   ее вместе с вызовом программы MAKE,  используя при этом опцию - D (определить),  Вы можете задавать каждый  раз  новый справочник:

          make  -DTURBO=c:\tp5\project

      Это задает  программе  MAKE  режим  интерпретации  TURBO   как макроса с расширением текста c:\tp5\project.

     Макроопределения имеют форму

         имя_макроса = расширение_текста.

где "имя_макроса" - строка,  составленная из букв и  цифр  без использования разделителей,  хотя Вы можете иметь разделители между именем макроса и знаком равенства (=).  Расширение_текста  -  любая произвольная строка,  содержащая буквы,  цифры, разделители и знаки пунктуации, заканчивающаяся символом возврата каретки.

     Если имя    макроса    уже    было    определено,    то,   или макроопределением  в  конфигурационном  файле,  или  опцией  -D   в командной строке запуска программы MAKE,  новое определение заменит старое. Использование  строчных  или  прописных  букв   в   макросе является  существенным;  это  означает,  что  имена макросов turbo, Turbo и TURBO будут считаться различными.

     Макрос в   конфигурационном   файле  активизируется  следующим образом:

         $(имя макроса)

     Скобки являются обязательными,  даже если имя макроса  состоит из  одного  символа,  исключая  шесть  специальных предопределенных макросов о которых речь пойдет немного позднее. Эта конструкция - $ (имя макроса) - носит название макровызова.

     Когда Make обнаруживает  макровызов  она  заменяет  макрос  на расширение.  Если  макрос  не определен,  Make заменяет его нулевой строкой.

     Макросы в макросах:  Макросы не могут активизироваться в левой части  (имя  макроса) макроопределения.  Они могут использоваться в правой части (расширение текста), но они не расширяются до тех пор, пока определенный макрос не будет активизирован.

     Другими словами,  когда макровызов расширяется, любые макросы, имеющиеся в его расширении также расширяются.

     Макросы в правилах: Макросы в строках правила расширяются.

     Макросы в директивах: Макровызовы расширяются в директивах !if и !elif. Если макрос активизированный в директивах !if или !elif не определен, он расширяется до значения 0 (False - Ложно).

      Макросы в  командах:  Макровызовы  в  командах  расширяются во время выполнения команды.

      Прграмма MAKE  имеет  несколько  специальных  предопределенных встроенных макросов:  $d,  $*,  $<,  $:,  $., и $&. Первый является проверочным макросом,  используемым в  условных  директивах  !if  и !elif, другие являются макросами имени файла, используемого в явных и неявных  правилах.  Различные  макросы   имен   файлов   работают аналогичным образом,  расширяясь до некоторых вариаций полного пути имени создаваемого файла. Кроме того, строки окружения операционной системы SET автоматически загружаются в качестве макросов, а макрос _MAKE_ определяется как 1 (единица).

      Макрос условного тестирования ($d).

      Этот макрос  расширяется  в  1,  если  заданное  имя   макроса определено, и в 0, если не определено. Содержание расширения текста макроса не имеет  значения.  Этот  специальный  макрос  расширяется только в том случае,  если заданы директивы !if и !elif.  Например, если Вы хотите изменить Ваш конфигурационный  файл  таким  образом, чтобы  он  использовал  специфический справочник для Турбо Паскаля, если он не задан,  Вы можете поместить следующие  строки  в  начале своего конфигурационного файла:

          !if  !elif                 # Если TURBO не определен

         TURBO=c:\tp5\bin           # Определяем его на с:\tp5\bin

         !endif

      Если Вы активизируете MAKE в командной строке

          make -DTURBO=c:\tp5\project

то TURBO будет определяться как c:\tp5\project. Однако, если Вы активизируете только один MAKE:

         make

то TURBO  будет  определен как c:\tp5\bin - это Ваш справочник "по умолчанию".

    

Макрос имени основного файла ($*).

      Этот макрос разрешается  в  командах  для  явного  и  неявного  правила.  Макрос расширяется до имени создаваемого файла,  исключая всякое расширение:

          Имя файла  A:\P\TESTFILE.PAS

         $* расширяется до A:\P\TESTFILE

      Например, Вы   можете   модифицировать   явное   правило   для MYAPP.EXE:

         myapp.exe:  myapp.pas myglobal.tpu myutils.tpu

           tpc $* /TS(TURBO)

     Когда команда в этом правиле выполняется, макрос $* заменяется на имя результирующего файла (без расширения)  - MYAPP. Этот макрос очень удобен для  неявных правил.  Например,  неявное  правило  для TPC может  выглядеть следующим образом (допуская,  что макрос TURBO уже определен или будет определен):

          .pas.exe:

           tpc $* /TS(TURBO)

 

Макрос имени полного файла ($<).

      Макрос имени полного файла ($<)  также используется в командах  для явного и  неявного правила.  В явном правиле, $< расширяется до полного имени результирующего файла (включая расширение),   подобно следующему примеру:

          Имя файла A:\P\TESTFILE.PAS

         $<  расширяется до A:\P\TESTFILE.PAS

      Например, правило

          starlib.tpu: starlib.pas

           copy $< \oldtpus

           tpc $* /TS(TURBO)

будет копировать   STARLIB.TPU  в  справочник  \OLDTPUS  перед компиляцией STARLIB.PAS.

     В неявном  правиле,  $< принимает значение  имени  файла  плюс расширение исходного файла. Например, предыдущее неявное правило

         .asm.obj:

           tasm $*.asm,$*.obj;

     может быть переделано в

         .asm.obj:

           tasm $<,$*.obj;

   

Макрос имени пути файла ($:).

      Этот макрос  расширяется  до  имени  пути  (без  имени файла), например:

          имя файла  A:\P\TESTFILE.PAS

          $. расширяется до A:\P\

  

Макрос имени файла и расширения ($.)

      Этот макрос  расширяется  до  имени   файла   с   расширением, например:

          имя файла  A:\P\TESTFILE.PAS

          $. расширяется до TESTFILE.PAS

   

Макрос имени файла ($&).

      Этот макрос расширяется только до имени файла,  без  пути  или расширения, например:

          имя файла  A:\P\TESTFILE.PAS

          $& расширяется до TESRFILE

[начало] [оглавление]  

 

Директивы.

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

     Директивы в    конфигурационном     файле     начинаются     с восклицательного знака (!).  Ниже приводится полный список директив программы MAKE.

         !include

         !if

         !else

         !elif

         !endif

         !error

         !undef

     Директива включения файла (!include) определяет  файл, который будет   подключаться   в   конфигурационный  файл  для  последующей интерпретации. Директива имеет следующий вид:

         !include "имя файла"

     или

         !include <имя файла>

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

     Как использовать эту директиву?  Предположим Вы  создали  файл PATH.MAC таким образом, что он содержит следующее:

         !if  !$d(TURBO)

         TURBO=c:\tp5\bin

         !endif

     То в  этом  случае  Вы  можете   использовать   это   условное макроопределение в любом конфигурационном файле, применяя директиву

         !include  "PATH.MAC"

     Когда программа  MAKE  обнаруживает  директиву  !include,  она открывает указанный файл и считывает содержимое,  как будто бы этот файл является частью конфигурационного файла.

     Условные директива (!if,  !elif, !else, и !endif) представляют программисту  определенную  степень  гибкости  при  конструировании конфигурационных файлов.  Правила и макросы могут в зависимости  от условий    интерпретировать   макроопределения   командной   строки (используя опцию - D) таким  образом,  что  будет  разрешаться  или запрещаться отдельные команды конфигурационного файла.

     Формат этих  директив  анологичен  формату  условных  директив Турбо Паскаля, но является более расширенным:

          !if   выражение

               [строки]

         !endif

          !if   выражение

               [строки]

         !else

               [строки]

         !endif

         !if   выражение

               [строки]

         !elif выражение

               [строки]

         !endif

      Заметьте: [строки] могут быть следующими:

               макроопределение

               явное правило

               неявное правило

               директива подключения

               группа if

               директива ошибки

               директива отмены определения.

      Условные директивы  формируют группу,  включающую,  по крайней мере,  директиву  !if  начинающую  группу   и   директиву   !endif, заканчивающую группу.

     - В состав группы может быть включена одна директива !else.      - Директивы !elif могут находиться  между  директивами  !if  и !else.

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

     - Группы   условных   директив   могут   быть   вложенными  до произвольной глубины.

     Любые правила,  команды,  и директивы должны  быть  полными  в границах отдельного исходного файла.

     Любые директивы !if  должны  иметь  соответствующие  директивы !endif  в  границах  того  же  исходного  файла.  Поэтому следующий подключаемый файл является некорректным, независимо от того, что он содержит,  потому что он не имеет соответствующей директивы !endif.

          !if $(FILE_COUNT)  > 5

         некоторые правила

         !else

         другие пррравила

         <end-of-file>

      Выражение, допустимое в директиве !if или !elif использует тот же  синтаксис,  что  используется  в  языке  программирования   Си. Выражение  подсчитывается  как простое 32-х битовое целое выражение со знаком.

     Числа могут    вводится    десятичными,    восьмиричными   или шестнадцатиричными  константами.  Например   является   допустимыми следующие константы в выражении.

         4536        # десятичная константа

         0677        # восьмиричная константа (заметьте, что она  задается ведущим нулем).

         $23AF       # шестнадцатиричная константа.

      также допустимы следующие унарные операторы:

          - отрицание.

         ~ битовое дополнение.

         ! логическое Не.

      В выражении  могут  использоваться любые из следующих бинарных операторов:

         + сложение

         - вычитание

         * умножение

         / деление

         % вычисление остатка

         >> сдвиг вправо

         << сдвиг влево

         &  битовое и

         |  битовое или

         ^  логическое исключающие или

         && логическое и

         || логическое или

         >  больше

         <  меньше

         >= больше или равно

         <= меньше или равно

         == равенство

         != неравенство

     Выражение может  содержать  следующий  тернарный (состоящий из трех частей) оператор:

          ?:         Операнд перед знаком ? трактуется в качестве                проверочного.

      Если значение  этого   операнда   отличается   от   нуля,   то результатом  является второй операнд (часть между ?  и двоеточием). Если значение первого  операнда  равно  нулю,  результат  принимает значение третьего операнда (часть после двоеточия).

     Для группировки  операндов  в  группу   могут   использоваться скобки. В случае отсуствия скобок бинарные операторы группируются в вычислении согласно порядка вычисления принятого в языке Си.

     Группировка операндов   одинакового   приоритета  производится слева  направо,  за  исключением  тернарного   оператора,   который группируется справа налево.

     Макросы могут активизироваться в выражении,  причем, считается допустимым   использование   специального   макроса   $d().   После расширения  всех  макросов  выражение  должно  быть   синтаксически правильным.  Любые  слова  в расширяемом выражении трактуются,  как ошибки.

     Директива сообщения  об  ошибке  (!error)   вызывает остановку программы MAKE и печать фатальной  диагностики,   содержащий  текст после директивы !error. Формат директивы следующий.

          !error  "любой текст"

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

         !if  !$d(TURBO)

         # если TURBO не определен.

         !error TURBO не определен.

         !endif

     Если Вы   достигнете  этого  места  без  определенного  TURBO, программа MAKE остановится с выдачей сообщения об ошибке:

          Fatal makefile 5: Error directive: TURBO не определен

      Директива отмены  макроопределения  (!undef)  вызывает  отмену любого   определения  для  именованного  макроса.  Если  макрос  не определен, директива не имеет никакого эффекта. Синтаксис директивы следующий: !undef имя макроса.

[начало] [оглавление]

    

Использование программы Make.

      Теперь Вы   достаточно   знаете   о   том,    как    создавать конфигурационные   файлы,   теперь  самое  время,  узнать,  как  их использовать  вместе  с  программой  MAKE.  Самый  простой   способ использования MAKE состоит в простом наборе команды

         make

в командной   строке   MS-DOS.   После  этого  программа  MAKE просматривает  наличие  конфигурационного  файла   MAKEFILE,   если программа  не  может его найти,  то она просматривает наличие файла MAKEFILE.MAK,  если и он отсуствует,  программа  останавливается  с выдачей сообщения об ошибке.

     Что делать,  если  Вы  хотите  использовать  файл  с   именем, отличным  от MAKEFILE или MAKEFILE.MAK?  Вам необходимо указать для программы MAKE опцию (-f), задающую имя файла:

          make - f stars.mak

      Оющий синтаксис использования программы MAKE следующий:

       make опция опция ... результирующий файл результирующий файл

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

     Ниже приводятся синтаксические правила:

     - Если приводится  список  опций,  то  слово  MAKE  отделяется пробелом.

     - Каждая  опция  make  должна  отделяться  от  смежных   опций пробелом.  Опции  могут  располагаться  в  любом  порядке и в любом количестве (пока есть место в командной строке).

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

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

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

     Ниже приводится  несколько  примеров   командных   строк   для программы MAKE.

         make -n -fstars.mak

         make -s

         make -Iinclude -DTURBO=c\tp5\project

     Если любая    исполняемая   команда   снимается   при   помощи Ctrl-Break,  то  MAKE  останавливается.  Поэтому  Ctrl-Break   (или Ctrl-C)  останавливает  как  текущую  исполняемую  команду,  так  и программу MAKE.

[начало] [оглавление]  

 

Файл BUILTINS.MAK.

      При использовании программы MAKE,  часто возникает потребность многократного использования макросов и правил (обычно неявных). Для этого у Вас есть три возможности. Во-первых, Вы можете поместить их в каждый создаваемый  Вами  конфигурационный  файл.  Во-вторых,  Вы можете  поместить  их  все  в  один  файл  и использовать директиву подключения !include в каждом из создаваемых  Вами конфигурационных файлов.

     В третьих,    Вы   можете   поместить   их  в  файл  с  именем BUILTINS.MAK.

     Всякий раз,  когда   Вы   запускаете   программу   MAKE,   она просматривает файл с именем BUILTINS.MAK,  и если он обнаружен,  то MAKE считывает  его  перед  обращением  к  файлу  MAKEFILE  (или  к выбранному Вами конфигурационному файлу).

     Файл BUILTINS.MAK  предназначается  для  использования   любых правил (обычно неявных правил)  или макросов, которые в большинстве случаев будут Вами использоваться.

     Специального требования,  чтобы  существовал файл BUILTINS.MAK не  существует.  Если  MAKE   обнаружит   файл   BUILTINS.MAK,   он обрабатывает   этот  файл  первым.  Если  MAKE  не  обнаружит  файл BUILTINS.MAK,  он  переходит  непосредственно  к  обработке   файла MAKEFILE (или заданного Вами конфигурационного файла).

[начало] [оглавление]  

 

Как Make осуществляет поиск файлов.

      MAKE будет  искать файл BUILTINS.MAK в текущем справочнике или в справочнике откуда  запускается  система  (если  Вы  работаете  в MS-DOS 3.X).  Вам следует поместить этот файл в том же справочнике, где находится файл MAKE.EXE.

     Программа MAKE  всегда  осуществляет  поиск  конфигурационного файла  только  в  текущем  справочнике.  Этот файл содержит правила создания выполнимых файлов.

     MAKE также  осуществляет  поиск  в  текущем  справочнике любых подключаемых  файлов  по  !include.  Если  Вы   используете   опцию подключения - I, поиск также выполняется в указанном справочнике.

[начало] [оглавление]  

 

Опции командной строки программы Make.

      Мы уже  упоминали  несколько  опций командной строки программы MAKE, теперь мы представляем полный их перечень.

     Заметьте, что   вид   (строчная   или   прописная)    является существенным, опция -d не служит заменой для -D.

      - D идентификатор.  - Определяет именованный идентификатор для строки, состоящей из одиночного символа 1.

     - D   идент=строка.  -  Определяет  именованный  идентификатор "идент" для  "строки"  после  знака  равенства.  Строка  не  должна содержать пробелы или знаки табуляции.

     - I  directory.   - MAKE будет осуществлять поиск подключаемых файлов в указанном справочнике (directory)  (также как и в  текущем справочнике).

     - U   идентификатор.   -   Отменяет   предыдущие   определения идентификатора.

     - S.  -  Обычно,  MAKE  выдает  на  экран  каждую  выполняемую команду,  при использовании опции - S выдача  команд  на  экран  не производится.

     - n.  - Вызывает выдачу команд,  без их выполнения.  Это очень полезно при отладке конфигурационного файла.

     - f  имя  файла.   -   Использует   имя   файла   в   качестве конфигурационного.  Если  данного  файла  не существует и не задано расширение,  то будет осуществляться поиск файла с именем указанным в опции с расширением .MAK.

     - ?  или - h. - Производится выдача подсказки по использованию опций.

[начало] [оглавление]

  

Сообщения об ошибках программы MAKE.

      Все диагностические  сообщения  программы MAKE можно разделить на 2 вида:  фатальные ошибки и  просто  ошибки.  При  возникновении фатальной  ошибки  выполнение программы немедленно прерывается.  Вы должны  предпринять  надлежащие  действия  и  повторить  выполнение программы.  Ошибки  (просто  ошибки)  указывают на синтаксические и семантические ошибки в конфигурационном файле. Программа MAKE будет продолжать  интерпретацию конфигурационного файла и закончит работу после обработки всех строк файла.

  

Фатальные ошибки.

        Don't know how to make XXXXXXXX

         Неизвестно, как создавать ХХХХХХХХ

      Это сообщение выдается,  когда MAKE  обнаружит  несуществующее имя файла в последовательности построения, и не существует правила, позволяющего построить этот файл.

         Error directive: XXXX

         Ошибочная директива: ХХХХ

     Это сообщение  выдается,  когда  программа  MAKE  обрабатывает директиву  сообщения  об  ошибке в исходном файле.  Текст директивы отображается в сообщении.

         Incorrect command line argument: XXX

         Некорректный аргумент ХХХ командной строки.

     Эта ошибка   возникает  в  случае,  если  MAKE  выполняется  с некорректными аргументами командной строки.

         Not enough memory.

         Недостаточно памяти.

     Эта ошибка   возникает,  когда  происходит  исчерпание  общего запаса  оперативной  памяти.  Вам   следует   попытаться   провести компиляцию  на  компьютере с большим об'емом памяти.  Если же у Вас используется  компьютер  с  об'емом  памяти  в  640К,  Вам  следует упростить свой исходный файл.

        Unable to execute command

         Невозможно выполнить команду.

     Это сообщение выдается после попытки выполнения  команды.  Это может  произойти  в  результате  неудачи в обнаружении исполняемого файла,  или  нарушения  синтаксиса  команды.  Гораздо  реже   может возникнуть ситуация,  что исполняемый файл существует,  но каким-то образом запорчен.

         Unable to open makefile

         Невозможно открыть конфигурационный файл.

     Это сообщение выдается,  когда текущий справочник не  содержит конфигурационный файл с именем MAKEFILE.

 

Ошибки.

          Bad file name format in include statement

         Плохой формат имени файла в операторе подключения

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

         Bad undef statement syntax

         Плохой синтаксис оператора отмены макроопределения.

     Утверждение !Undef должно содержать одиночный идентификатор  и ничего более.

         Character constant too long

         Символьная константа слишком длинна.

     Символьные константы  могут быть длиной только  один  или  два символа.

         Command arguments toо long.

         Слишком длинный перечень аргументов командной строки.

     Аргументы, присуствующие в команде выполняемой программой MAKE не должны превышать общую длину  командной  строки  более  чем  127 символов - ограничение, накладываемое операционной системой MS-DOS.

         Сommand syntax error

         Синтаксическая ошибка в команде.

     Эта ошибка возникает в случае, если:

     - Первая  строка  правила  в  конфигурационном  файле содержит ведущие пробелы.

     - Неявное правило не содержит расширений файлов.

     - Явное  правило  не  содержит  имени перед символом двоеточия (:).

     - Макроопределение   не   содержит   имени   перед    символом равенства(=).

         Division by zero.

         Деление на ноль.

     Операция деления  или получения остатка в утверждении !if имет нулевой делитель.

          Expression syntax error in !if statemant

         Синтаксическая ошибка выражения в утверждении !if.

      Плохо составлено  выражение  в  утверждении  !if  -   содержит несоответствующее   количество   скобок,  излишнее  количество  или пропущенные операторы, константы.

         File name too long

         Слишком длинное имя файла.

     Имя файла заданное в директиве !include слишком длинное.      Общая длина  имени пути файла в MS-DOS должна быть не более 78 символов.

        Illegal chracter in constants expression X

         Недействительный символ Х в константом выражении.

      Программе MAKE  встретился  некоторый  символ,  запрещенный  в константном  выражении.  Если  этот символ является буквой,  то это (вероятно)   означает   синтаксическую   ошибку    в    обозначении идентификатора.

         Illegal octal digit

         Недействительная восьмиричная цифра.

     Восьмиричная константа содержит цифру 8 или 9.

        Macro expansion too long

         Макрорасширение слишком длинное.

     Макрос не может расширяться более чем на 4096  символов.   Эта ошибка часто встречается в случае, если макрос рекурсивно расширяет сам себя, что некорректно.

        misplaced elif statment

         Неправильное использование утверждения elif.

     Встретившаяся директива   !elif   не   имеет   соответствующей директивы !if.

         No file name ending

         Нет окончания имени файла.

     Имя файла  в   утверждении   include   не   имеет   корректной закрывающей кавычки или фигурной скобки.

         Redefinition of target XXXXXXXX

         Повторное определение результирующего файла ХХХХХХХХ.

     Имя результирующего  файла встречается в более чем одном явном правиле.

         Unable to open include file XXXXXXXX.XXX

         Невозможно открыть подключаемый файл ХХХХХХХХ.ХХХ

     Файл не обнаружен.  Это может возникнуть также  в  результате, если   подключаемый   файл   подключает   самого  себя.  Проверьте, существует ли файл на самом деле.

         Unexpected end of file in conditional started on line #

         Неожиданный конец файла в условном предложении на строке N

     Исходный файл заканчивается,  до обнаружения  программой  MAKE утверждения !endif, которое или пропущено, или имеет синтаксическую ошибку.

         Unknown preprocessor statment

         Неизвестное препроцессорное утверждение

     Встретившийся в  начале строки символ (!)  не имеет после себя утверждения, соответствующего  error,  undef,  if,  elif,  include, else, или endif.

[начало] [оглавление]


Предыдущая страница     |     Следующая страница


Добавить в избанное Обсудить в форуме Написать автору сайта

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz