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


Блоки описания

Блоки описания образуют ядро файла makefile. Они описывают целевые объекты или файлы для создания, а также их зависимости, файлы, необходимые для создания целевых объектов. Блок описания может включать команды, описывающие создание целевых объектов из зависимостей. Блок описания — это строка зависимостей, за которой при необходимости следует блок команд:

targets... : dependents...
    commands...

Строки зависимостей

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

hi_bye.exe : hello.obj goodbye.obj helper.lib

В этой строке hi_bye.exe зависимостей используется целевой объект. Его зависимости: hello.obj, goodbye.objи helper.lib. Строка зависимостей сообщает NMAKE создать целевой объект всякий разhello.obj, когда он goodbye.objизменился или helper.lib изменился в последнее время.hi_bye.exe

Целевой объект должен находиться в начале строки. Его нельзя отступить с помощью пробелов или вкладок. Используйте двоеточие (:) для разделения целевых объектов от зависимых объектов. Пробелы или вкладки допускаются между целевыми объектами, разделителем двоеточия (:) и зависимыми. Чтобы разделить строку зависимостей, используйте обратную косую черту (\) после целевого объекта или зависимого объекта.

Перед выполнением блоков команд NMAKE сканирует все зависимости и все применимые правила вывода для создания дерева зависимостей. Дерево зависимостей указывает шаги, необходимые для полного обновления целевого объекта. NMAKE проверяет рекурсивно, является ли зависимый целевой объект в другом списке зависимостей. После сборки дерева зависимостей NMAKE проверяет метки времени. Если все зависимые в дереве более новые, чем целевой объект, NMAKE создает целевой объект.

Целевые объекты

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

Несколько целевых объектов

NMAKE оценивает несколько целевых объектов в одной зависимости, как если бы они были указаны в отдельном блоке описания.

Например, это правило:

bounce.exe leap.exe : jump.obj
   echo Building...

вычисляется как:

bounce.exe : jump.obj
   echo Building...

leap.exe : jump.obj
   echo Building...

Кумулятивные зависимости

Зависимости являются совокупными в блоке описания, если целевой объект повторяется.

Например, этот набор правил:

bounce.exe : jump.obj
bounce.exe : up.obj
   echo Building bounce.exe...

вычисляется как:

bounce.exe : jump.obj up.obj
   echo Building bounce.exe...

При наличии нескольких целевых объектов в нескольких строках зависимостей в одном блоке описания NMAKE оценивает их как если бы они были указаны в отдельном блоке описания. Однако только целевые объекты в последней строке зависимостей используют блок команд. NMAKE пытается использовать правило вывода для других целевых объектов.

Например, этот набор правил:

leap.exe bounce.exe : jump.obj
bounce.exe climb.exe : up.obj
   echo Building bounce.exe...

вычисляется как:

leap.exe : jump.obj
# invokes an inference rule

bounce.exe : jump.obj up.obj
   echo Building bounce.exe...

climb.exe : up.obj
   echo Building bounce.exe...

Целевые объекты в нескольких блоках описания

Чтобы обновить целевой объект в нескольких блоках описания с помощью разных команд, укажите две последовательные двоеточия (::) между целевыми объектами и зависимыми.

target.lib :: one.asm two.asm three.asm
    ml one.asm two.asm three.asm
    lib target one.obj two.obj three.obj
target.lib :: four.c five.c
    cl /c four.c five.c
    lib target four.obj five.obj

Побочные эффекты зависимостей

Можно указать целевой объект с двоеточием (:) в двух строках зависимостей в разных расположениях. Если команды отображаются только после одной из строк, NMAKE интерпретирует зависимости, как если бы строки были смежными или объединенными. Он не вызывает правило вывода для зависимости, которая не имеет команд. Вместо этого NMAKE предполагает, что зависимости принадлежат одному блоку описания и выполняют команды, указанные с другой зависимостью. Рассмотрим этот набор правил:

bounce.exe : jump.obj
   echo Building bounce.exe...

bounce.exe : up.obj

вычисляется как:

bounce.exe : jump.obj up.obj
   echo Building bounce.exe...

Этот эффект не возникает, если используется двойная двоеточие (::). Например, этот набор правил:

bounce.exe :: jump.obj
   echo Building bounce.exe...

bounce.exe :: up.obj

вычисляется как:

bounce.exe : jump.obj
   echo Building bounce.exe...

bounce.exe : up.obj
# invokes an inference rule

Псевдоцелевые объекты

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

Имена псевдотаргета соответствуют правилам синтаксиса имен файлов для целевых объектов. Однако если имя не имеет расширения, оно может превышать 8-символьное ограничение для имен файлов и может содержать до 256 символов.

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

В этом примере UPDATE представляет собой псевдотарет.

UPDATE : *.*
COPY $** c:\product\release

При вычислении UPDATE NMAKE копирует все файлы в текущем каталоге в указанный диск и каталог.

В следующем файле makefile псевдотаргет all создает project1.exe и то, и project2.exe , если all целевой объект не указан в командной строке. Псевдотаргет setenv изменяет переменную среды LIB перед обновлением .exe файлов:

all : setenv project1.exe project2.exe

project1.exe : project1.obj
    LINK project1;

project2.exe : project2.obj
    LINK project2;

setenv :
    set LIB=\project\lib

Зависимые объекты

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

Выводимые зависимости

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

Пути поиска для зависимых элементов

Можно указать необязательный путь поиска для каждого зависимого. Ниже приведен синтаксис для указания набора каталогов для поиска:

{directory[;directory...]}зависимый

Заключите имена каталогов в фигурные скобки ({ }). Разделите несколько каталогов с запятой (;). Пробелы или вкладки не разрешены. NMAKE ищет зависимый сначала в текущем каталоге, а затем в списке каталогов в указанном порядке. Макрос можно использовать для указания части или всего пути поиска. Только указанный зависимый использует этот путь поиска.

Пример пути поиска каталога

В этой строке зависимостей показано, как создать спецификацию каталога для поиска:

reverse.exe : {\src\omega;e:\repo\backwards}retro.obj

Целевой объект reverse.exe имеет один зависимый объект retro.obj. Список, заключенный в фигурные скобки, указывает два каталога. NMAKE сначала выполняет поиск retro.obj в текущем каталоге. Если он не существует, NMAKE выполняет поиск \src\omega каталога, а затем e:\repo\backwards каталог.

См. также

Справочник по NMAKE