NMAKE マクロを使用する

マクロを使用するには、次のようにその名前をかっこで囲み、ドル記号 ($) を前に付ける必要があります。

$(macro_name)

スペースは使用できません。 macro_name が 1 つの文字の場合、かっこは省略可能です。 定義文字列が $(macro_name) に置き換わり、未定義のマクロは null 文字列に置き換えられます。

マクロでの代入

macro_name が呼び出されると、その定義文字列で string1 が出現するたびに、string2 に置き換えられます。

$(macro_name:string1=string2)

マクロでの代入は大文字と小文字が区別され、リテラルです。string1string2 でマクロは呼び出されません。 代入では、元の定義は変更しません。 テキストは、$$@ を除く任意の定義済みのマクロで置き換えることができます。

コロン (:) の前にスペースやタブは挿入されません。コロンの後のスペースやタブはリテラルとして解釈されます。 string2 が null の場合、出現するすべての string1 がマクロの定義文字列から削除されます。

マクロの関数

NMAKE には、文字列、項目の一覧、ファイル パスを変更するために使用できる一連の関数が含まれています。 それらの関数は、Visual Studio 2022 以降の NMAKE で使用できます。

関数の構文

関数では、次の構文を使用します。

$(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"

リスト構文

一部の関数では、空白で区切られた項目のリストをサポートしています。 リストの先頭、リストの末尾、または各項目間の余分な空白文字は無視されます。 関数によって生成されるリストでは、各項目間の区切り記号として 1 つのスペースを使用し、先頭または末尾に空白文字は付きません。

たとえば、最も単純なリスト関数は 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

カテゴリ別の関数

機能 目的 サポートされています
テキスト関数 目的 サポートあり
findstring, findstringi 入力に文字列が含まれているかを確認します。 VS 2022 17.0
lowercase 文字列を小文字に変換します。 VS 2022 17.2
subst, substi 1 つの文字列のすべてのインスタンスを別の文字列に置き換えます。 VS 2022 17.0
uppercase 文字列を大文字に変換します。 VS 2022 17.2
リスト機能 目的 サポートあり
filter, filteri 1 つ以上のパターンに一致する項目をリストに保持します。 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