Правила вывода
Правила вывода в NMAKE предоставляют команды для обновления целевых объектов и вывода зависимых от целевых объектов. Расширения в правиле вывода соответствуют одному целевому объекту и зависят от того же базового имени. Правила вывода — это определяемые пользователем или предопределенные правила вывода; Предопределенные правила можно переопределять.
Если устаревшая зависимость не имеет команд, а если .SUFFIXES
содержит расширение зависимостей, NMAKE использует правило, расширения которого соответствуют целевому объекту и существующему файлу в текущем или указанном каталоге. Если несколько правил совпадают с существующими файлами, .SUFFIXES
список определяет, какой из них следует использовать; приоритет списка спускается слева направо. Если зависимый файл не существует и не указан в качестве целевого объекта в другом блоке описания, правило вывода может создать отсутствующий зависимый от другого файла с тем же базовым именем. Если целевой объект блока описания не имеет зависимых или команд, правило вывода может обновить целевой объект. Правила вывода могут создавать целевой объект командной строки, даже если блок описания не существует. NMAKE может вызывать правило для выводимых зависимых, даже если указан явный зависимый.
Определение правила
From_ext представляет расширение зависимого файла, а to_ext представляет расширение целевого файла.
.from_ext.to_ext:
commands
Расширения не учитывает регистр. Макросы можно вызывать для представления from_ext и to_ext; макросы развертываются во время предварительной обработки. Период (.
) перед from_ext должен отображаться в начале строки. Двоеточие (:
) предшествует нулю или нескольким пробелам или вкладкам. За ним могут следовать только пробелы или вкладки, точка с запятой (;
) для указания команды, знака числа (#
) для указания комментария или нового символа. Другие пробелы не допускаются. Команды указываются как в блоках описания.
Пути поиска в правилах
{from_path}.from_ext{to_path}.to_ext:
commands
Правило вывода применяется к зависимости только в том случае, если пути, указанные в зависимости, точно соответствуют путям правила вывода. Укажите каталог зависимых в from_path и каталог целевого объекта в to_path; пробелы не разрешены. Укажите только один путь для каждого расширения. Для одного расширения требуется путь к другому. Чтобы указать текущий каталог, используйте период (.
) или пустые фигурные скобки ({ }
). Макросы могут представлять from_path и to_path; они вызываются во время предварительной обработки.
Пример путей поиска
{dbi\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUDBI) $<
{ilstore\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
{misc\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{misc\}.c{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
{msf\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
{bsc\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{mre\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{namesrvr\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $(YUPDB) $<
{src\cvr\}.cpp{$(ODIR)}.obj::
$(CC) $(CFLAGS) $<
Правила пакетного режима
{from_path}.from_ext{to_path}.to_ext::
commands
Правила вывода в пакетном режиме предоставляют только одно вызов правила вывода, если команды N проходят через это правило вывода. Без правил вывода в пакетном режиме требуется вызывать команды N. N — это количество зависимых, которые активируют правило вывода.
Единственное синтаксическое различие от стандартного правила вывода заключается в том, что правило вывода в пакетном режиме заканчивается двойной двоеточием (::
).
Примечание.
Вызываемое средство должно иметь возможность обрабатывать несколько файлов. Правило вывода в пакетном режиме должно использоваться $<
в качестве макроса для доступа к зависимым файлам.
Правила вывода в пакетном режиме могут ускорить процесс сборки. Быстрее предоставлять файлы компилятору в пакетном режиме, так как драйвер компилятора вызывается только один раз. Например, компилятор C и C++ выполняется быстрее при обработке набора файлов, так как он может оставаться в памяти в течение всего процесса.
В следующем примере показано, как использовать правила вывода в пакетном режиме:
#
# sample makefile to illustrate batch-mode inference rules
#
O = .
S = .
Objs = $O/foo1.obj $O/foo2.obj $O/foo2.obj $O/foo3.obj $O/foo4.obj
CFLAGS = -nologo
all : $(Objs)
!ifdef NOBatch
{$S}.cpp{$O}.obj:
!else
{$S}.cpp{$O}.obj::
!endif
$(CC) $(CFLAGS) -Fd$O\ -c $<
$(Objs) :
#end of makefile
NMAKE создает следующие выходные данные без правил вывода в пакетном режиме:
E:\tmp> nmake -f test.mak -a NOBatch=1
Microsoft (R) Program Maintenance Utility Version 7.00.0000
Copyright (C) Microsoft Corp 1988-2001. All rights reserved.
cl -nologo -Fd.\ -c .\foo1.cpp
foo1.cpp
cl -nologo -Fd.\ -c .\foo2.cpp
foo2.cpp
cl -nologo -Fd.\ -c .\foo3.cpp
foo3.cpp
cl -nologo -Fd.\ -c .\foo4.cpp
foo4.cpp
NMAKE выдает следующий результат с правилами вывода в пакетном режиме:
E:\tmp> nmake -f test.mak -a
Microsoft (R) Program Maintenance Utility Version 7.00.0000
Copyright (C) Microsoft Corp 1988-2001. All rights reserved.
cl -nologo -Fd.\ -c .\foo1.cpp .\foo2.cpp .\foo3.cpp .\foo4.cpp
foo1.cpp
foo2.cpp
foo3.cpp
foo4.cpp
Generating Code...
Предварительно определенные правила
Предопределенные правила вывода используют предоставленные NMAKE команды и макросы параметров.
Правило | Команда | Действие по умолчанию | Правило пакетной службы | Платформа |
---|---|---|---|---|
.asm.exe |
$(AS) $(AFLAGS) $< |
ml $< |
no | x86 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml /c $< |
yes | x86 |
.asm.exe |
$(AS) $(AFLAGS) $< |
ml64 $< |
no | x64 |
.asm.obj |
$(AS) $(AFLAGS) /c $< |
ml64 /c $< |
yes | x64 |
.c.exe |
$(CC) $(CFLAGS) $< |
cl $< |
no | all |
.c.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
yes | all |
.cc.exe |
$(CC) $(CFLAGS) $< |
cl $< |
no | all |
.cc.obj |
$(CC) $(CFLAGS) /c $< |
cl /c $< |
yes | all |
.cpp.exe |
$(CPP) $(CPPFLAGS) $< |
cl $< |
no | all |
.cpp.obj |
$(CPP) $(CPPFLAGS) /c $< |
cl /c $< |
yes | all |
.cxx.exe |
$(CXX) $(CXXFLAGS) $< |
cl $< |
no | all |
.cxx.obj |
$(CXX) $(CXXFLAGS) /c $< |
cl /c $< |
yes | all |
.rc.res |
$(RC) $(RFLAGS) /r $< |
rc /r $< |
no | all |
Выводимые зависимости и правила
NMAKE предполагает, что зависимый от целевого объекта, если существует применимое правило вывода. Правило применяется, если:
to_ext соответствует расширению целевого объекта.
from_ext соответствует расширению файла с базовым именем целевого объекта и существующим в текущем или указанном каталоге.
from_ext находится в
.SUFFIXES
; ни один другой from_ext в правиле сопоставления не имеет более высокого.SUFFIXES
приоритета.Явный зависимый не имеет более высокого
.SUFFIXES
приоритета.
Выводимые зависимые могут вызвать непредвиденные побочные эффекты. Если блок описания целевого объекта содержит команды, NMAKE выполняет эти команды вместо команд в правиле.
Приоритет правил зависимости
Если правило вывода определено несколько раз, NMAKE использует определение с наивысшим приоритетом. В следующем списке показано порядок приоритета от самого высокого до самого низкого:
Правило вывода, определенное в файле makefile; Более поздние определения имеют приоритет.
Правило вывода, определенное в
Tools.ini
; более поздние определения имеют приоритет.Предопределенное правило вывода.
См. также
NMAKE reference (Справочник по NMAKE)