Поделиться через


Правила вывода

Правила вывода в 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 предполагает, что зависимый от целевого объекта, если существует применимое правило вывода. Правило применяется, если:

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

Приоритет правил вывода

Если правило вывода определено несколько раз, NMAKE использует определение с наивысшим приоритетом. В следующем списке показано порядок приоритета от самого высокого до самого низкого:

  1. Правило вывода, определенное в файле makefile; Более поздние определения имеют приоритет.

  2. Правило вывода, определенное в Tools.ini; более поздние определения имеют приоритет.

  3. Предопределенное правило вывода.

См. также

NMAKE reference (Справочник по NMAKE)