Прочитать на английском

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


Использование макроса NMAKE

Чтобы использовать макрос, заключите его имя в скобки, предшествующие знаку доллара ($) следующим образом:

$(macro_name)

Пробелы в имени не допускаются. Скобки являются необязательными, если macro_name является одним символом. Строка определения заменяет; неопределенный макрос заменяется $(macro_name)пустой строкой.

Макроподстановка

При вызове macro_name каждое вхождение string1 в строке определения заменяется строкой 2.

$(macro_name:string1=string2)

Подстановка макросов учитывает регистр и является литеральным; string1 и string2 не могут вызывать макросы. Подстановка не изменяет исходное определение. Вы можете заменить текст в любом предопределенном макросе, кроме $$@.

Пробелы или вкладки не предшествуют двоеточию (:); все пробелы или вкладки после двоеточия интерпретируются как литералы. Если строка2 имеет значение NULL, все вхождения string1 удаляются из строки определения макроса.

Функции макросов

NMAKE предоставляет набор функций, которые можно использовать для изменения строк, списков элементов и путей к файлам. Эти функции доступны в NMAKE начиная с Visual Studio 2022.

Синтаксис функции

Функции используют следующий синтаксис:

$(function_name arg0,arg1,arg2...)

Аргументы функции могут быть любой строкой и могут включать вложенные вызовы макросов. За исключением особых случаев, аргументы не могут быть null.

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

SINGLESPACE=$(subst ',,' ') # Use "subst" since a normal assignment trims trailing whitespace.
$(subst $(SINGLESPACE)an,irec,red ant) # Evaluates to "redirect"

Запятые в списке аргументов всегда считаются разделителями аргументов и не могут быть экранированы. Если для любого аргумента требуется литеральная запятая, используйте макрос, содержащий запятую:

COMMA=,
INPUT=a, b
$(subst $(COMMA) , and ,$(INPUT)) # Evaluates to "a and b"

Синтаксис списка

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

Например, простейшая функция списка — это stripфункция, которая принимает один аргумент списка и создает список с теми же элементами (но с пробелами, очищенными как описано выше):

$(strip a   b   c d    ) # Evaluates to "a b c d"

Синтаксис шаблона

Некоторые функции поддерживают использование шаблона. Шаблон — это строка, содержащая один подстановочный знак, который может соответствовать любому количеству символов. Первым % в шаблоне является подстановочный знак, а все последующие % символы рассматриваются как литералы. В % любом месте до того, \% как фактический подстановочный знак можно экранировать с помощью \ (т. е. рассматривается как литерал%). Любой \ , который будет экранировать подстановочный знак, можно сбежать с другим \ (поэтому \\% рассматривается как литерал \ , за которым следует подстановочный знак). Чтобы считаться совпадением, все входные символы должны соответствовать шаблону; частичные совпадения не поддерживаются.

Шаблоны можно продемонстрировать с помощью filter функции, которая сохраняет только элементы, соответствующие шаблону:

$(filter abc,abc) # Evaluates to "abc" - exactly matches
$(filter bc,abc) # Evaluates to "" - pattern "bc" only matches part of the item "abc"
$(filter %ef,abcdef) # Evaluates to "abcdef" - wildcard matches "abcd"
$(filter a%f,abcdef) # Evaluates to "abcdef" - wildcard matches "bcde"
$(filter %abc,abc) # Evaluates to "abc" - wildcard doesn't need to match any characters
$(filter a%c%d,abcd abc%d) # Evaluates to "abc%d" - only the first `%` is a wildcard, the rest are literals
$(filter a\%b%d,a%bcd) # Evaluates to "a%bcd" - `%` before the wildcard must be escaped with `\`
$(filter a\\%cd,a\bcd) # Evaluates to "a\bcd" - a `\` that would escape the wildcard must be escaped with another `\`
$(filter a%c\\%d,abc\\%d) # Evaluates to "abc\\%d" - any `\` after the wildcard isn't treated as an escape
$(filter \\a%f,\\abcdef) # Evaluates to "\\abcdef" - any `\\` that isn't directly before the wildcard isn't treated as an escape

Функции по категориям

Function Характер использования Поддерживается
Текстовые функции Целевые назначения Поддерживается
findstring, findstringi Проверяет, содержит ли входные данные строку. VS 2022 17.0
lowercase Преобразует строку в нижний регистр. VS 2022 17.2
subst, substi Заменяет все экземпляры одной строки другой. VS 2022 17.0
uppercase Преобразует строку в верхний регистр. VS 2022 17.2
Перечисление функций Целевые назначения Поддерживается
filter, filteri Хранит элементы в списке, который соответствует по крайней мере одному шаблону. VS 2022 17.0
filterout, filterouti Хранит элементы в списке, который не соответствует ни одному шаблону. VS 2022 17.0
patsubst, patsubsti Преобразует каждый элемент, соответствующий шаблону, элементы, которые не совпадают, остаются как есть. VS 2022 17.1
strip Очищает пробелы в списке элементов и вокруг нее. VS 2022 17.0
Функции пути к файлу Целевые назначения Поддерживается
abspath Получает абсолютный путь для каждого элемента в списке. VS 2022 17.1
basename Возвращает базовое имя для каждого элемента в списке. VS 2022 17.1

См. также

Макросы и программа NMAKE