4

GNU Make の makefile では、次のイディオムを使用して、ファイルが存在するかどうかをテストします。

static:
ifeq ($(wildcard $(FileName)),)
    # do something when the file doesn't exist
else
    # do something different when it does
endif

しかし、NMake では動作しません ( fatal error U1000: syntax error : ')' missing in macro invocation)。どうすれば交換できますか?置換が両方のビルド システムで機能する場合は完璧です。

4

4 に答える 4

8

Jack Kelly の提案に付け加えると、CMD.EXE シェルで存在のテストを行うことができます。NMake には、一時的な .cmd ファイルを作成して実行する機能も含まれています。

「check-syntax」ターゲットに使用する (n)makefile 構文の例を次に示します。複数ファイルのプロジェクトで、コンパイルを実行することにより、単一の C# ソース ファイルの構文をチェックします。

check-syntax :
    <<flymake-build.cmd  $(CS_SOURCE)
SETLOCAL ENABLEDELAYEDEXPANSION
set errorlevel=
for %%I in (%*) do if NOT x%%I == x$(FLYMAKE_ORIGINAL) (
   set filesToBuild=!filesToBuild! %%I
)
$(_CSC) /t:module $(LIBSREF) $(FLYMAKE_CHECK) !filesToBuild!
ENDLOCAL && exit /b %errorlevel%
<<

「flymake-build.cmd」は、作成される一時的な cmd ファイルの名前です。二重山かっこ ( <<) は、ファイルが実行される前に、一時ファイルに入るコンテンツの開始と終了を示します。

その最初の行のファイル名の後のものは、.cmd ファイルに渡される引数です。この例では、引数は という makefile 変数の内容ですCS_SOURCE。私の場合、これはプロジェクト内のファイル名のリストです。Makefile 変数は、一時ファイルのテキスト内でも展開されます。_CSCコンパイラ ( ) とその他のシンボルを参照していることがわかります。

.cmd コード内では、for ループ、if ステートメントなど、好きなことを行うことができます。これは通常の .cmd ファイルです。

.cmd ファイル内のコマンドによって生成されたエラー (ビルドの終了など) に nmake が応答するようにする場合はexit /b、cmd を終了する方法を使用する必要があります。

これに関するドキュメントはどこか暗いコーナーで見つけたので、一般的な説明のためにここで共有したいと思いました. (編集ここにリンクがあります。)

于 2010-12-22T22:22:04.903 に答える
2

Makefile レベルではなく、シェル レベルで実行します。posix ツールに依存できる場合:

static:
    @if test -f $(FileName); then \
      echo something; \
    else \
      echo some other thing; \
    fi

どこでも行継続マーカーに注意してください。

でこれを行う必要がある場合は、コンストラクトCMD.EXEを使用して同様のことを行うことができます。IF EXIST $(FileName) COMMAND ELSE COMMAND

于 2010-12-20T04:25:34.230 に答える