5

GNU Make makefile を Microsoft Visual Studio Makefile に変換しています。次の3つの疑問があります。

1) 文字列を置き換えるにはどうすればよいですか。たとえば、以下を含むフォルダー内:

namespace_type_function1.cpp
namespace_type_function2.cpp
namespace_type_function3.cpp

タイプを「INT」文字列と言うように変更したいので、最終的に取得します

namespace_INT_function1.cpp
namespace_INT_function2.cpp
namespace_INT_function3.cpp

2) 同様の方法でプレフィックスを追加するにはどうすればよいですか 3. 同様の方法でサフィックスを追加するにはどうすればよいですか。

4

2 に答える 2

10

環境変数または内部 nmake 変数のいずれかに文字列を取得したら、次を使用して固定文字列を別の文字列に置き換えることができます。

$(MY_VAR:REPLACE_THIS=WITH_THIS)

"WITH_THIS" は空の文字列にすることができます。

メイクファイルの例:

MY_VAR=123451234512345
ALL:
   @echo $(MY_VAR:12=XX)
   @echo $(MY_VAR:12=)

出力:

XX345XX345XX345
345345345

Microsoft のドキュメントから:

マクロ置換では大文字と小文字が区別され、リテラルです。string1 と string2 はマクロを呼び出すことができません。置換によって元の定義が変更されることはありません。を除く定義済みマクロのテキストを置き換えることができます$$@

コロンの前にスペースやタブはありません。コロンの後のすべては、リテラルとして解釈されます。string2 がヌルの場合、string1 のすべてのオカレンスがマクロの定義文字列から削除されます。

于 2013-09-27T19:40:16.967 に答える
5

NMAKE は部分文字列の置換を除いて多くの文字列処理を備えておらず、これでもマクロ展開を行うことはできません。ただし、NMAKE は makefile のインクルードをサポートしているため、実装がやや複雑ではありますが、活用できる明らかな手法があります。

アイデアは、一時的なメイクファイルを作成し、再帰呼び出しに含めることで、必要に応じて別のマクロ展開ラウンドを実行することです。これを使用して、変数の接頭辞、接尾辞、または区切り記号を文字列のリストに追加できます。必要に応じて、さらに拡張ラウンドを同様に実行できます。

次のスニペットは、メソッドを示しています。a b c d eリストを次のように変換します[a];[b];[c];[d];[e](つまり、プレフィックス、サフィックス、および要素間の区切り記号を追加します)。元のメイクファイル (NMAKE が 2 次展開をサポートする場合に実行されるルール) はほとんど変更されていません。最後に、NMAKE は実行全体の後に一時ファイルを残しません。

# The name of the makefile.
MAKEFILE = test.mak

# The list of strings to be processed. The elements can be separated by one or more spaces or tabs.
LIST = a b c d e

# The prefix to add to each element.
PREFIX = [

# The suffix to add to each element.
SUFFIX = ]

# The separator to add between each element.
SEP = ;

#####

# Replace tabs with spaces.
# Note: there is a hard tab character between the colon and the equal sign.
LIST = $(LIST:  = )

!IFNDEF TEMPFILE
# Write a temporary makefile.
target1 target2:
    @$(MAKE) /nologo /C /$(MAKEFLAGS) /F$(MAKEFILE) TEMPFILE=<< $@
LIST = $(PREFIX)$$(LIST: =$(SUFFIX)$(SEP)$(PREFIX))$(SUFFIX)
LIST = $$(LIST:$(PREFIX)$(SUFFIX)$(SEP)=)
<<NOKEEP

!ELSE
# Here goes your original makefile.
!   INCLUDE $(TEMPFILE)

target1:
    @echo.$@
    @echo.$(LIST)

target2:
    @echo.$@
    @echo.$(LIST)
!ENDIF

これによる唯一の注意点は、コマンドライン マクロが再帰呼び出しに渡されないため、あまり役に立たないことです。

于 2014-01-09T23:38:57.713 に答える