ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 11


                ПРИЛОЖЕНИЕ А. УТИЛИТЫ TURBO PASCAL.

     Это приложение   описывает  пять  автономных  программ-утилит,
которые поставляются  вместе  с  Турбо  Паскалем:  TPUMOVER,  MАКЕ,
TOUCH, CREP, и BINOBJ.


     Использование TPUMOVER - программы для работы с модулями.

     Когда Вы пишете модули,  то хотите их сделать  доступными  для
любой разрабатываемой Вами программы (В главе 4 "Модули и связанные
с ними возможности" объясняется что такое Модуль и говорится о том,
как  создавать  собственные  модули.).  Теперь мы покажем Вам,  как
использовать TPUMOVER для удаления редко  используемых  модулей  из
TURBO.TPL, и как поместить туда часто используемые модули.

                    Просмотр файлов - модулей.

     Существует два типа файлов модулей:  .TPU файлы и .TPL  файлы.
Когда Вы компилируете модуль, Турбо Паскаль помещает результирующий
об'ектный код в .TPU (Turbo Pascal Unit  -  Модуль  Турбо  Паскаля)
файл, который всегда содержит только один модуль.
     Файл .TPL (Turbo Pascal Library -  Библиотека  Турбо  Паскаля)
может содержать много модулей. Например, все модули, находящиеся на
Вашей дистрибутивной дискете сосредоточены в файле TURBO.TPL.  Файл
TURBO.TPL является   библиотечным  файлом из которого Турбо Паскаль
выбирает необходимые модули.  Если в процессе  компиляции  какой-то
модуль в   TURBO.TPL   не   найден,  то  Турбо  Паскаль  ищет  файл
"имя_модуля.TPU",  если же и этот файл не  будет  обнаружен,  тогда
компиляция  заканчивается  с  выдачей  ошибки.  Если Вы используете
опцию Build,  Турбо Паскаль сначала ищет  файл  "имя_модуля.PAS"  и
перекомпилирует  его,  формируя  результирующий .TPU файл.  Если Вы
используете опцию Make, Турбо Паскаль просматривает оба файла "имя_
модуля.PAS" и "имя_модуля.TPU", сравнивая их даты и время последней
модификации и перекомпилирует  .PAS  файл,  если  он  модифицирован
после создания . TPU файла. Обычно, когда Вы пишете свой модуль, он
хранится в .TPU файле,  а для его использования, Вы должны сообщить
Турбо Паскалю,  где его искать. Если Вы используете интегрированную
среду, то должны специфицировать опцию Unit Directories (Справочник
модулей)   в   меню   Oрtions/Directories   (Опции/   Справочники).
(Turbo.TPL загружается из справочника Turbo в этом же  меню).  Если
Вы  используете  среду  компилятора  коммандной  строки,  то должны
применять опцию /U (Используйте опцию /Т  для  загрузки  библиотеки
Турбо   Паскаля   из   другого   справочника  в  случае  применения
компилятора командной строки).
     Наверное Вы уже заметили,  что можно использовать  стандартные
модули Турбо Паскаля - без указания  имени  файла.  Это  происходит
потому,  что эти модули хранятся в стандартном модуле Турбо Паскаля
-  TURBO.TPL,  который помещен на дистрибутивной дискете. Поскольку
стандартные модули находятся в этом файле, то любая программа может
использовать их без "знания" их местоположения.
     Предположим у Вас есть модуль TOOLS.TPU,  и Вы используете его
во многих различных программах.  Хотя  добавление  модуля  TOOLS  в
библиотеку  TURBO.TPL  требует  дополнительной  оперативной  памяти
(TURBO.  TPL автоматически загружается компилятором  в  оперативную
память),  наличие  этого  модуля  в  резидентной  библиотеке делает
использование модуля TOOLS более доступным,  из-за того, что модуль
находится в памяти, а не на диске.
     В TURBO.TPL  уже  имеются  пять  стандартных модулей:  System,
Overlay, Printer, Crt и Dos.


                      Использование TPUMOVER.

     TPUMOVER -   диалоговая   программа,    очень    похожая    на
интегрированную  среду  Турбо  Паскаля.  Она показывает Вам модули,
содержащиеся в двух различных файлах и позволяет  Вам перебрасывать
модули  между  этими файлами или удалять их.  TPUMOVER используется
главным образом для работы с файлами в TURBO.TPL,  но также имеет и
другие полезные функции.
     Заметьте, что TPUMOVER отображает  содержимое  файлов  в  двух
окнах.  Вверху  окна появляется имя файла,  после чего отображается
список модулей  в  этом  файле.  Каждая  строка  окна  представляет
информацию об одном модуле: имя модуля, размер кода, размер данных,
размер  таблицы  символов  и  имена  модулей,  используемых  данным
модулем. Все размеры приводятся в байтах, а имена модулей усекаются
до семи символов.  Если список используемых модулей слишком большой
и  не вмещается в окно,  то он оканчивается тремя точками,  нажатие
клавиши F4 приводит к выдаче верхнего  под-окна  с  именами  других
модулей.  И, наконец, в окне отведены две строки для отображения (в
байтах) текущего размера файла и количества свободного пространства
на диске, где этот файл расположен.
     В любой момент времени,  одно из окон является "активным".  Об
этом свидетельствует  двойная  линия  вокруг активного окна.  Кроме
того,  только в активном окне имеется  подсвеченное  поле,  которое
появляется  в  списке  модулей  файла,  это поле может перемещаться
вверх и вниз  с  использованием  клавиш  управления.  Все  вводимые
команды  относятся  только  к  активному  окну,  нажатие клавиши F6
переключает окна из активного состояния в пассивное и наоборот. Для
включения TPUMOVER наберите:

         TPUMOVER  файл1  файл2.

     где файл1  и  файл2  -  .TPL  или .TPU файлы.  Расширение .TPU
предполагается по умолчанию,  поэтому Вы должны явно добавлять .TPL
для .TPL файлов.
     TPUMOVER загружается  и  отображает  два  окна  - с файлом 1 в
левом окне и файлом 2 в правом окне.  Заметьте, что если Вы укажете
только файл 1, правое окно по умолчанию будет иметь имя NОNAME.TPU.
Если Вы вообще не укажете файлов, TPUMOVER будет пытаться загрузить
TURBO.TPL (в левом окне,  с пустым правом окном). Если этот файл не
будет обнаружен,  TPUMOVER отобразить содержимое  справочника  всех
фалов с расширением .TPL.


                       Команды TPUMOVER.

     Основные команды перечислены снизу  экрана.   Ниже  приводится
краткое описание каждой из них:
     - F1 - вызывает выдачу подсказки на экран.
     - F2 - сохраняет  текущий  файл  (файл  связанный  с  активным
окном).
     - F3 - позволяет выбрать новый файл для активного окна.
     - F4 - отображает верхнее подокно,  показывающее все вхождения
модулей в данный модуль.  В главном окне показывается только первое
вхождение.   Если  снизу  имеются  три  точки,  то  существуют  еще
вхождения, для отображения которых необходимо нажать клавишу F4.
     - F6 - позволяет Вам переключать окна, переводя их попеременно
из активного в пассивное состояние (и наоборот).
     - + (знак плюс) маркирует модуль (для последующего копирования
или  удаления).  Вы  можете  одновременно   маркировать   несколько
модулей, Вы можете также аннулировать маркирование модуля повторным
нажатием клавиши (+).
     - Ins - копирует все маркированные модули из активного окна  в
пассивное.
     - Del - удаляет все маркированные модули из активного окна.
     - Esc - позволяет осуществить выход из TPUMOVER. Заметьте, что
эта операция не сохраняет автоматически все проделанные  изменения,
Вы должны явно задавать F2 для сохранения модификаций перед выходом
из TPUMOVER.


                  Помещение модулей в TURBO.TPL.

     Предположим Вы создали модуль Tools,  который откомпилирован и
помещен в файл  TOOLS.TPU.   Вы  хотите  поместить  этот  модуль  в
TURBO.TPL. Как это сделать? Прежде всего наберите команду:

         TPUMOVER  TURBO  TOOLS

     Эта команда  вызовет отображение экрана TPUMOVER с TURBO.TPL в
левом окне (активное)  и TOOLS.TPU в правом окне.  Заметьте,  что в
этом примере   предполагается  что  TURBO.TPL и TOOLS.TPU находятся
оба в текущем справочнике,  если это не так,  Вам необходимо задать
соответствующий путь для каждого файла.  Теперь выполните следующие
действия:
     1. Нажмите F6 для активизации правого окна (TOOLS.TPU).
     2. Нажмите  +  для  маркирования  TOOLS (единственный модуль в
правом  окне).
     3. Нажмите Ins для копирования TOOLS в TURBO.TPL.
     4. Нажмите F6 для  активизации  левого  окна  (TURBO.TPL).
     5. Нажмите  F2  для сохранения изменений в TURBO.TPL на диске.
     6. Нажмите Esc для выхода из TPUMOVER.

     Модуль TOOLS  теперь  будет  являться частью TURBO.TPL и будет
автоматически загружаться при использовании Турбо Паскаля.
     Если Вы захотите добавить другие модули в TURBO.TPL, Вы можете
это сделать  без  выхода  из  TPUMOVER.  После  нажатия на F2,  для
сохранения TURBO.TPL на диске, выполните следующие действия:
     1. Нажмите клавишу F6 для активизации правого окна.
     2. Нажмите клавишу F3 для выбора нового файла в правом окне.
     3. Повторите шаги 2 - 5 предыдущего примера  для  маркирования
соответствующего модуля,  копирования его в TURBO.TPL,  активизации
левого окна, и сохранения TURBO.TPL на диске.
     Вы можете  повторять  это столько раз,  сколько необходимо для
построения Вашей библиотеки.


                  Удаление модулей из TURBO.TPL.

     Предположим, что  большинство  из Ваших программ не используют
модули Overlay или Printer, поэтому давайте удалим их из TURBO.TPL,
для чего наберите команду:

         TPUMOVER  TURBO

     Это вызовет  загрузку  TPUMOVER  с  TURBO.TPL  в  левом окне и
NONAME.TPU (имя по умолчанию) в правом. Левое окно активное, поэто-
му выполняем   следующие  действия:
     - Используйте клавишу "стрелка вниз" для перемещения светового
       поля на модуль Overlay.
     - Нажмите + для выбора модуля Overlay.
     - Нажмите клавишу Del для удаления модуля Overlay.
     - Нажмите клавишу F2 для сохранения изменений в TURBO.TPL.
     - Нажмите Esc для выхода из TPUMOVER.

     Вы можете повторить процедуру для удаления модуля Printer.


            Перемещение файлов между .TPL библиотеками.

     Предположим, что Ваш товарищ написал ряд модулей и передал Вам
файл  (MYSTUFF.TPL)  в  котором  содержатся  эти модули.  Вы хотите
скопировать только модули GameStuff и RandStuff  в  TURBO.TPL.  Как
это  сделать?  Ваша  командая  строка  должна  выглядеть  следующим
образом:

         TPUMOVER  MYSTUFF.TPL  TURBO.TPL

     Это приведет  к  загрузке  TPUMOVER  с  MYSTUFF.TPL  в   левом
(активном)  окне  и  TURBO.TPL  в правом окне.  Далее,  используйте
следующие команды:
     - Используйте  клавиши  "стрелка  вверх"  и "стрелка вниз" для
перемещения светового поля на GaveStuff.
     - Нажмите клавишу + для выбора GameStuff.
     - Используйте  клавиши  "стрелка вверх" или "стрелка вниз" для
перемещения светового поля на RandStuff.
     - Нажмите клавишу + для выбора RandStuff.
     - Нажмите клавишу Ins для копирования GameStuff и RandStuff  в
Turbo.TPL.
     - Нажмите клавишу F6 для активизации окна с TURBO.TPL.
     - Нажмите F2 для сохранения изменений в TURBO.TPL.
     - Нажмите Esc для выхода из TPUMOVER.


           Сокращения, употребляемые в командной строке.

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

        TPUMOVER TURBO /параметр имя модуля

     где параметром является или +, или -, или *.
     Эти команды выполняют  следующие  функции  без  отображения  в
окнах:
     /+ добавляет названный модуль в TURBO.TPL
     /- Удаляет названный модуль из TURBO.TPL
     /* Извлекает   (копирует)  названный  модуль  из  TURBO.TPL  и
сохраняет его в файле с именем "имя модуля .TPU".
     /? Отображает окно подсказки.


                     Автономная утилита 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
         другие пррравила
         

     Выражение, допустимое в директиве !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.


                          Утилита TOUCH.

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

         touch имя файла [имя файла...]

     в командной  строке  MS-DOS.   TOUCH   обновит   дату   (даты)
формирования файлов.
     Проделав это, Вы можете теперь активизировать команду MAKE для
перепостроения затронутых результирующих файлов.  (Используя  TOUCH
Вы можете   употреблять символы * и ?  для указания имени файлов по
шаблону поиска).


                           Утилита GREP.

     GREP -   это   мощная   поисковая   утилита,   которая   может
осуществлять  просмотр  текста  в  нескольких  файлах одновременно.
Например,  если Вы забыли в какой  программе  определена  процедура
SetUpModem,  Вы  можете  использовать  программу GREP для просмотра
содержимого всех .PAS файлов в Вашем справочнике на  наличие строки
SetUPMyModem.
     Синтаксис командной строки для программы GREP следующий:

         GREP [опции] поисковая строка [спецификация файла...]

     где опции - состоят из одного или более одиночных  символов  с
дефисом впереди,  "поисковая строка" определяет шаблон для поиска и
"спецификация  файла"  -  путь  и  имя  файла.  Спецификация  файла
информирует GREP о файлах (или группах файлов) подлежащих просмотру
это может быть  явное  задание  имени  или  использование  символов
поиска по шаблону (? и *).
     Указание пути  файла  не  является   обязательным.   Если   Вы
используете  спецификацию  файла без указания пути,  программа GREP
делает просмотр только в текущем справочнике.  Если Вы  не  укажете
спецификацию  файла,  ввод для программы GREP должен осуществляться
перенаправлением стандартного ввода или использованием канала.


                   Переключатели программы GREP.

     В командной строке,  опции представляют собой один  или  более
одиночных символов с дефисом (-) впереди. Каждый отдельный символ -
- это переключатель, который Вы можете включить или выключить: знак
(+) после символа включает опцию, а знак минус (-) выключает.
     Значение по умолчанию - включено (подразумевается +):   напри-
мер, -  R означает то же самое, что и -R+. Вы можете составить спи-
сок опций следующим образом:  (-I -P -L).  Или Вы можете об'единить
их: -ILD  или (-IL -D, и т.д.). Для программы GREP все это является
идентичным.

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

     - С   Только   подсчет:  Выдается  только  подсчет  количества
соответствующих поисковых строк.  Для каждого файла, содержащего по
крайней  мере одну искомую строку,  GREP выдает имя файла и подсчет
количества соответсвующих строк. Сами строки не отображаются.

     - D Справочники:  Для каждой спецификации файла, приведенной в
командной   строке,   GREP   просматривает   все   файлы,   которые
соответствуют этой спецификации, как в указанном справочнике, так и
во всех подчиненных справочниках. Если Вы не указали в спецификации
файла пути,  GREP  предполагает,  что  файлы  находятся  в  текущем
справочнике.

     - I   Игнорировать  верхний/нижний  регистры:  Программа  GREP
игнорирует различия верхнего/нижнего регистров. GREP интерпретирует
все буквы от а до z, как идентичные соответствующим буквам A-Z.

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

     - N Номера строк:  Каждая соответствующая  строка,   выводимая
программой GREP сопровождается предшествующим номером строки.

     - О   UNIX-подобный  формат  вывода:  Изменяет  формат  вывода
соответствующих строк для организации канала  связи  UNIX-подобного
формата.  Всем  строкам  на выходе предшествует имя файла,  который
содержит искомые строки.

     - R Поиск нормального выражения:  Текст  определенный  строкой
поиска интерпретируется как нормальное выражение,  вместо буквенной
строки.

     - U  Обновить  опции:  GREP  об'единяет  опции,   заданные   в
командной  строке с другими не указанными опциями (со значениями по
умолчанию) и записывает их в файл GREP.COM как  новые  значения  по
умолчанию.  (Другими словами,  программа GREP самоконфигурируется).
Эта опция позволяет Вам произвести установку опций по  умолчанию по
своему усмотрению.

     - V Несоответствие: Выводятся только не соответсвующие строки.
Не соответсвующими строками считаются только строки,  не содержащие
поисковой строки.

     - W  Поиск слова:  Искомый текст,  соответствующий нормальному
выражению   считается   соответствием   только   в   случае,   если
предшествующий  и последующий символы не являются частью слова.  По
умолчанию набор символов слова включает A-Z,  9-0  и  подчеркивание
(_).  Дополнительная форма этой опции позволяет Вам специфицировать
набор допустимых символов в слове. Эта форма имеет вид - W [набор],
где  "набор" - любой допустимый набор.  Если для определения набора
используются алфавитные символы,  набор автоматически определяется,
как  содержащий  значения  как верхнего так и нижнего регистров для
каждой буквы.  Если опция -W используется совместно с опцией -U, то
новый  набор  допустимых  символов сохраняется в качестве набора по
умолчанию.

     - Z  Дополнительная  информация:  GREP  выводит  имя   каждого
просматриваемого файла.  Каждая соответствующая строка предваряется
ее номером. Дается подсчет соответствующих строк для каждого файла,
даже если он равен нулю.

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

         -Z -L -C -N

     Каждое появление опции отвергает предыдущее определение:
     Состояние опций   отражает    установленный    Вами    порядок
использования.  В  любой  данный  момент времени каждая опция может
быть только включенной, или только выключенной.
     Вы можете установить предпочитаемые Вами значения по умолчанию
для каждой опции GREP.COM при помощи  опции  -U. Например, если  Вы
хотите,   чтобы   GREP   всегда   осуществляла   поиск   с  выдачей
дополнительной информации (опция -Z включена), Вы можете установить
этот режим с помощью следующей команды:

         GREP -U -Z


         Как осуществлять поиск с помощью программы GREP.

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

     Когда используется   переключатель   -R,   поисковая    строка
интерпретируется  как  нормальное  выражение  (в  противоположность
буквенному выражению), при этом следующие символы имеют специальные
значения:

     ^ Этот знак (символ вставки)  в начале выражения соответствует
началу строки.
     $ Знак доллара в конце выражения соответствует концу строки.
     . Точка соответствует любому символу.
     * Выражение  следующее  за  символом  звездочки  соответствует
нулевому или большему количеству  появлений  этого  выражения:  fo*
соответствует fo, foo и т.д., но не f.
     [] Строка, заключенная в скобки соответствует любому символу в
этой строке,  но не в другой.  Если первый символ в строке - символ
вставки,  выражение соответствует любому символу,  кроме символов в
самой строке. Например [xyz] соответствует x, y и z, в то время как
[^xyz] соответствует а и в,  но не х или у. Диапазон символов может
быть задан  двумя  символами,  отделенными дефисом (-).  Могут быть
комбинации  для  формирования  выражений,   вроде   [?a-bd-z]   для
соответствия символу ? и любой букве, кроме с.
     \ Символ  обратной наклонной черты,  сообщает программе GREP о
поиске последующего буквенного символа.
     Например, \. соответствует точке.
     Заметьте: Четыре  символа  (?,  +,  * и.) не имеют какого-либо
специального значения,  если они используются в  наборе.  Символ  ^
интерпретируется  специальным образом только в том случае,  если он
сразу же следует в начале набора (т.  е. сразу же после символа [).
     Любой обычный    символ,   не   упомянутый   в   этом   списке
соответствует самому  символу.  Конкатенация  нормальных  выражений
являтся нормальным выражением.

               Примеры использования программы GREP.

-------------------------------------------------------------------
     Следующие примеры  предполагают,  что опции по умолчанию имеют
положение - off (выключено).

         grep main (*.pas
         соответствует :  main()
                          mymain(
         Не соответствует : mymainfunс()
                            MAIN(i: integer);

         Просматривает :  *.pas  в текущем справочнике.
         Примечание :  По умолчанию, поиск зависит
                       от положения верхнего/нижнего регистра.
-------------------------------------------------------------------
         grep  -R[^a-z]main\*(*.pas
         Соответствует:    main(i: integer)
                           main(i,j: integer)

         Не соответствует: mymain()
                           MAIN(i: integer);
         Просматривает :  *.pas в текущем справочнике.
         Примечание :  Поскольку пробелы и знаки табуляции обычно
                       считаются разделителями в командной строке,
                       Вы должны заключить их в кавычки, если Вы
                       хотите включить их в качестве части нор-
                       мального выражения. В Вашем примере пробел
                       после слова main был заключен в кавычки, с
                       использованием символа обратной наклонной
                       черты. Вы также можете выполнить это, по-
                       местив пробел или целое нормальное выраже-
                       ние в двойные кавычки (").
-------------------------------------------------------------------
         grep -RI[a-c]:\\data\.fil*.pas*.inc
         Соответсевует:     A:\data.fil
                            C:\Data.Fil
                            B:\Data.Fil

         Несоответствует:   d:\data.fil
                            a:data.fil
                            writeln(*c:\\data.fil*);

         Просматривает:     *.pas и *.inc а текущем справочнике

         Примечание:        Если Вы хотите выполнить поиск символов
                            \ и . Вы должны заключить их в кавычки,
                            поместив впереди них символ обратной
                            наклонной черты.
-------------------------------------------------------------------
         grep -RI[^a-z] word[^a-z]*.doc
         Соответствует:     every new word must be on a new line
                            MY WORD!
                            word -- smallest unit of speech.
                            In the beginning there was the WORD, and
                            the WORD.

         Не соответствует:  Each file has at least 2000 words.
                            He misspells toward as towоrd.

         Просматривает:     *.doc  в текущем справочнике.

         Примечание:        Этот формат в основном применяется для по-
                            иска слов.
-------------------------------------------------------------------
         grep "search string with spaces" *.doc *.asm a:\work\
         myfile.*

         Соответствует:     This is a search string with spaces in it

         Не соответствует:  THIS IS A SEARCH STRING WITH SPACES
                            IN IT.

         Просматривает:     *.doc и *.asm в текущем справочнике, и
                            myfile.* в справочнике \work на
                            устройствe А:

         Примечание:        Этот пример того, как осуществлять поиск
                            строки  со вставленными пробелами.
-------------------------------------------------------------------
         grep -RD"[,.:?'\"]" $\*.doc

         Соответствует:     He said hi to me.
                            Where are you going?
                            Happening in anticipation of a unique
                            situation,
                            Examples include the following:
                            "Many men smoke, but fu man chu."

         Не соответствует:  He said "HI" to me
                            Where are you going? I'm headed to the
                            beach this

         Просматривает:     *.doc в корневом справочнике и во всех
                            подсправочниках на текущем устройстве.

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


                          Утилита BINOBJ.

     Программа BINOBJ.EXE  предназначена для конвертирования любого
файла в .OBJ файл,  таким образом,  что он  может  компоноваться  в
программу Турбо Паскаля как "процедура". Это весьма полезно, если у
Вас имеется файл двоичных  даннных,  который  должен  находиться  в
сегменте  кода  или  если  размер  файла данных слишком большой для
формирования массива типированных  констант.  Например,  Вы  можете
использовать  BINOBJ  с  модулем  GRAPH для связывания графического
устройства или файлов печати с Вашим .EXE файлом.  В  этом  случае,
для  использования  Вашей  графической  программы,  Вам нужно иметь
только .EXE файл.  (см.  пример GRLINK.PAS на дистрибутивном  диске
N2).

         BINOBJ  принимает три параметра:
         BINOBJ  <источник[.BIN]> <место назначения [.OBJ]>
                 <общее имя>

     где источник - двоичный файл, подлежащий преобразованию, место
назначения - имя  формируемого  .OBJ  файла,  и  общее  имя  -  имя
процедуры, которая будет обьявлена в Вашей программе.
     В следующем примере,  процедура Showscreen принимает указатель
в качестве параметра и передает 4000 байтов данных в память экрана.
Файл MENU.DTA   содержит  образ  главного меню экрана (80*25*2=4000
байтов).
     Ниже приводится  простая  (без  проверок  на  ошибки)   версия
программы MYPROGRAM.PAS:

         program MyProg;

         procedure ShowScreen(var ScreenData : pointer;
         {Отображение полного экрана, без проверки на ошибки!}
         var
           ScreenSegment: word;

         begin
           if (Lo(LastMode) = 7) then                    ( Mono? )
             ScreenSegment := $B000
          else
            ScreenSegment := $B800;
         Move(ScreenData^,                        { По указателю }
                      Ptr(ScreenSegment,0)^    { В память экрана }
                      4000);                       ( 80 * 25 * 2 )
         end;

         var
           MenuP : pointer;
           MenuF : file;
         begin
           Assign(MenuF,'MENU.DTA'); {Открытие файла данных экрана}
           Reset(MenuF, 1);
           GetMem(MenuP, 4000);         { Размещение буфера в куче}
           BlokRead(MenuF, MenuP^,4000);     {Чтение данных экрана}
           Close(MenuF);
           ShowScreen(MenuP);                  {Отображение экрана}
         end.

     Файл данных экрана MENU.DTA открывается и считывается  в буфер
кучи.  Оба  файла  MYPROG.EXE  и  MENU.DTA  должены присуствовать в
момент выполнения программы.  Вы  можете  использовать  BINOBJ  для
пребразования   MENU.DTA  в  .OBJ  файл  (MENUDTA.OBJ)  и  сообщить
программе о необходимости связи этого файла с  процедурой MenuData.
Затем  Вы  можете  об'явить  внешней  процедуру  MenuData,  которая
фактически будет содержать экранные данные. Скомпоновав .OBJ файл с
помощью  директивы  компилятора  $L,  MenuData  будет  длинной 4000
байтов и  будет  содержать  данные  Вашего  экрана.  Прежде  всего,
вызовите BINOBJ для обработки MENU.DTA.

         binobj MENU.DTA MENUDTA MenuData

     Первый параметр  MENU.DTA  указывает  на  обычный  файл данных
экрана, второй - MENUDTA - это имя создаваемого .OBJ файла (т.к. не
указано расширение,  будет  добавлено  .OBJ).  Последней параметр -
MenuData - имя внешней процедуры,  которая будет об'явлена в  Вашей
программе.  Теперь,  поскольку  Вы  конвертировали  MENU.DTA в .OBJ
файл,  новая версия программы MYPROG.PAS будет выглядеть  следующим
образом:

         program MyProg;

         procedure ScowScreen(ScreenData : pointer);
         {Отображение полного экрана, без проверок на ошибки}
         var
           ScreenSegment: word;
         begin
           if (Lo(LastMode) = 7) then                     ( Mono? )
             ScreenSegment :=$B000
           else
             ScreenSegment :=$B800;
         Move(ScreenData^,                           {По умолчанию}
                        Ptr(ScreenSegment,0)^     {В память экрана}
                        4000);                      ( 80 * 25 * 2 )
       end;

       procedure MenuData; external;
       ($L MENUDTA.OBJ)
       begin
         ShowScreen(&MenuData);                {Отображение экрана}
       end.

     Заметьте, что процедура ShowScreen не изменилась,  и что адрес
Вашей процедуры передается с употреблением оператора @.
     Преимущество связывания  данных экрана с .EXE файлом очевидно.
Вам  нет  необходимости  осуществлять   какую-либо   поддержку   по
оперированию  с файлами для использования основной программы. Кроме
того,  у  Вас  есть  преимущество,  заключающееся   в   возможности
обращения к экрану по имени (MenuData). Недостатки:

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

     Программа BINOBJ  особенно  полезна при стабильности двоичного
файла.  Одна  из  простых  графических   программ   (находится   на
дистрибутивной   дискете   N2)  GRLINK.PAS  использует  BINOBJ  для
построения двух модулей, которые содержат драйвер и файлы печати.



Яндекс цитирования