Usar uma macro do NMAKE
Para usar uma macro, coloque seu nome entre parênteses precedido por um sinal de dólar ($
) da seguinte maneira:
$(macro_name)
Espaços não são permitidos. Os parênteses serão opcionais se macro_name for um único caractere. A cadeia de caracteres de definição substitui $(macro_name)
; uma macro indefinida é substituída por uma cadeia de caracteres nula.
Substituição de macro
Quando macro_name é invocado, cada ocorrência de string1 em sua cadeia de caracteres de definição é substituída por string2.
$(macro_name:string1=string2)
A substituição de macro diferencia maiúsculas de minúsculas e é literal; string1 e string2 não podem invocar macros. A substituição não modifica a definição original. Você pode substituir o texto em qualquer macro predefinida, exceto $$@
.
Nenhum espaço ou guia precede os dois-pontos (:
); espaços ou guias após os dois-pontos são interpretados como literais. Se string2 for nulo, todas as ocorrências de string1 serão excluídas da cadeia de caracteres de definição da macro.
Funções de macro
O NMAKE fornece um conjunto de funções que podem ser usadas para modificar cadeias de caracteres, listas de itens e caminhos de arquivo. Essas funções estão disponíveis no NMAKE a partir do Visual Studio 2022.
Sintaxe de função
As funções usam a sintaxe a seguir:
$(function_name arg0,arg1,arg2...)
Os argumentos para uma função podem ser qualquer cadeia de caracteres e podem incluir invocações de macro aninhadas. Exceto em casos especiais, os argumentos não podem ser nulos.
Qualquer espaço em branco extra entre o nome da função e a lista de argumentos é ignorado. Se o primeiro argumento exigir espaço em branco à esquerda, use uma macro que contenha o espaço em branco necessário:
SINGLESPACE=$(subst ',,' ') # Use "subst" since a normal assignment trims trailing whitespace.
$(subst $(SINGLESPACE)an,irec,red ant) # Evaluates to "redirect"
Vírgulas dentro de uma lista de argumentos são sempre consideradas separadores de argumentos e não podem ser escapadas. Se algum argumento exigir uma vírgula literal, use uma macro que contenha uma vírgula:
COMMA=,
INPUT=a, b
$(subst $(COMMA) , and ,$(INPUT)) # Evaluates to "a and b"
Sintaxe de lista
Algumas funções dão suporte a uma lista de itens separados por espaço em branco. O espaço em branco extra é ignorado no início da lista, no final da lista ou entre cada item. As listas produzidas por uma função usam um único espaço entre cada item como separador e não têm espaço em branco à esquerda ou à direita.
Por exemplo, a função de lista mais simples é strip
, que usa um argumento de lista única e produz uma lista com exatamente os mesmos itens (mas com o espaço em branco limpo como acima):
$(strip a b c d ) # Evaluates to "a b c d"
Sintaxe de padrões
Algumas funções dão suporte ao uso de um padrão. Um padrão é uma cadeia de caracteres que contém um único curinga que pode corresponder a qualquer número de caracteres. O primeiro %
em um padrão é o curinga, e os caracteres posteriores %
são tratados como literais. Um %
em qualquer lugar antes do curinga real pode ser escapado usando \
(ou seja, \%
é tratado como um literal %
). Qualquer \
que escape do curinga pode ser escapado com outro \
(portanto, \\%
é tratado como um literal \
seguido pelo curinga). Para ser considerada uma correspondência, todos os caracteres de entrada devem ser correspondidos pelo padrão; não há suporte para correspondências parciais.
Os padrões podem ser demonstrados usando a função filter
, que mantém apenas os itens que correspondem ao padrão:
$(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
Funções por categoria
Função | Finalidade | Com suporte |
---|---|---|
Funções de texto | Finalidade | Com suporte |
findstring , findstringi |
Verifica se a entrada contém uma cadeia de caracteres. | VS 2022 17.0 |
lowercase |
Converte uma cadeia de caracteres em letras minúsculas. | VS 2022 17.2 |
subst , substi |
Substitui todas as instâncias de uma cadeia de caracteres por outra. | VS 2022 17.0 |
uppercase |
Converte uma cadeia de caracteres em letras maiúsculas. | VS 2022 17.2 |
Funções de lista | Finalidade | Com suporte |
filter , filteri |
Mantém os itens em uma lista que correspondem a pelo menos um padrão. | VS 2022 17.0 |
filterout , filterouti |
Mantém os itens em uma lista que não correspondem a nenhum padrão. | VS 2022 17.0 |
patsubst , patsubsti |
Transforma cada item que corresponde a um padrão, os itens que não correspondem são deixados como estão. | VS 2022 17.1 |
strip |
Limpa o espaço em branco dentro e ao redor de uma lista de itens. | VS 2022 17.0 |
Funções de caminho da ATL | Finalidade | Com suporte |
abspath |
Obtém o caminho absoluto para cada item em uma lista. | VS 2022 17.1 |
basename |
Obtém o nome de base de cada item em uma lista. | VS 2022 17.1 |