Четвертый Borland C++ и его окружение

       

Синтаксис неявных правил


Утилита MAKE позволяет на ряду с явными правилами задавать

неявные правила. Неявные правила представляют собой обобщение явных правил; они применяются ко всем файлам, которые имеют соответствующие расширения имен файлов.

Ниже приводится пример, который иллюстрирует отношение между

двумя правилами. Рассмотрим явное правило из предыдущего примера.

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

принципу: объектный файл(с расширением имени .OBJ) зависит от

файла с тем же основным именем и расширением .C и создается путем

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

файл для утилиты MAKE, который будет содержать несколько(или

несколько десятков) явных правил, соответствующих одному и тому

же формату.

Переписывая явное правило в виде неявного правила, вы можете

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



.c.obj:

BCC -c $<

Это правило означает следующее: "Любой файл с расширением .C

может быть оттранслирован в файл с тем же основным именем и расширением .OBJ с помощью следующей последовательности команд".

Создание файла .OBJ происходит с помощью второй строки этого правила, где $< означает имя файла с расширением, присущим исходному

файлу (.C). (Символ $< представляет макрокоманду особого вида.

Объяснение макрокоманд приводится далее. Макрокоманда $< при каждом выполнении команды будет заменена полным именем соответствующего исходного файла .C).

Идентификатор $< представляет собой специальную макрокоманду. Макрокоманды обсуждаются ниже. Макрокоманда $< при каждом выполнении команды будет заменяться полными именем соответствующего

исходного файла .С.

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

[{исходный_каталог}].исх_расшир.[{целевой_каталог}]цел_расшир:

[команда]

...

Как и ранее, использование команды является необязательным.

Если команда используется, то перед ней должны стоять один или

несколько символов пробелов.




"Исх_расшир" ( расширение имени файла, которое должно начинаться точкой в столбце 1) представляет собой расширение имени
исходного файла; то есть, оно относится к любому файлу, который
имеет следующий формат:
имя_файла.исх_расшир
Аналогично, "цел_расшир" относится к файлу, который удовлетворяет спецификации:
имя_файла.цел_расшир
Здесь "имя_файла" является одинаковым для обоих файлов. Другими словами, данное неявное правило заменяет все явные правила,
которые соответствуют следующему формату:
имя_файла.исх_расшир:имя_файла.цел_расшир
[команда]
...
для любого имени файла.
Если утилита MAKE не может обнаружить явное правило для заданного результирующего файла, или если имя результирующего файла
появляется в явном правиле, у которого отсутствуют команды, то
она использует неявные правила.
Расширение имени интересующего утилиту MAKE файла используется для определения того неявного правила, которое должно использоваться. Это неявное правило применяется в том случае, если
обнаружен файл с тем же самым основным именем, что и у результирующего файла, но с заданным расширением исходного файла.
Предположим, например, что у вас имеется формирующий файл
утилиты MAKE (с именем MAKEFILE), который имеет следующее содержимое:
c.obj:
BCC -c $<
Если у вас имеется написанная на Си программа с именем
RATIO.C, которую вы хотите скомпилировать в файл RATIO.OBJ, то вы
можете воспользоваться командой:
make ratio.obj
Утилита MAKE будет рассматривать файл RATIO.OBJ в качестве
результирующего файла. Поскольку явное правило для создания файла
RATIO.OBJ не существует, утилита MAKE применяет неявное правило и
генерирует следующую команду:
BCC -c ratio.c
которая, естественно, выполняет компиляцию для создания файла
RATIO.OBJ.
Утилита MAKE использует неявные правила и в том случае, когда ей задаются явные правила, не сопровождающиеся никакими командами. Предположим, что в начале файла описания вы задали следующее неявное правило:
.c.obj:


BCC -c $<
Если это правило задано, вы можете удалить команду из приведенного ниже явного правила:
myрrog.obj: myрrog.c include\stdio.h
BCC -c myрrog.c
Процесс обработки будет прежним.
Если вы используете систему Borland C++ и разрешаете утилите
MAKE выполнять автоматическую проверку зависимостей, вы можете
удалить все явно заданные зависимости, в которых объектные файлы
указываются в качестве результирующих. Если задана автоматическая
проверка зависимостей, и используются неявные правила, то представленный в начале раздела по явным правилам пример с тремя правилами превращается в следующий:
c.obj:
BCC -c $<
рrog.exe: myрrog.obj рrog2.obj
tlink lib\c0s myрrog рrog2, рrog, ,lib\cs
Вы можете создать несколько неявных правил с одним и тем же
расширением имени результирующего файла. Если для заданного расширения имени результирующего файла имеется более одного неявного
правила, то правила проверяются в том порядке, в котором они появляются в файле описания, до тех пор, пока не найдется правило,
подходящее для расширения имени исходного файла, или до тех пор,
пока утилита MAKE не осуществит проверку всех применимых правил.
Утилита MAKE использует первое неявное правило, в котором
указан файл с расширением имени исходного файла. Даже если выполнение команды, заданной в этом правиле, заканчивается безуспешно,
никакие неявные правила больше не проверяются.
Все строки, следующие за неявным правилом вплоть до очередной строки, которая не начинается с символа пробела, или до конца
файла, считаются частью списка команд для этого правила.
Цель в явном правиле получает свою командную строку из явного правила. Следующий пример показывает неявное правили и явное
правило без командной строки:
.c.obj
bcc -c $< #использует макрокоманду $<
myprog.obj: #явное правило, использующее команду
# bcc -c myprog.c

Содержание раздела