web-dev-qa-db-ja.com

MSBuild.exeは/ p:DefineConstantsも/ p:PreprocessorDefinitionsも受け入れません

「MSBuildコマンドラインからプリプロセッサ定義をコンパイラに渡すにはどうすればよいですか」という質問に答えたStackOverflowに関する記事を数多く読んだことがありますが、それらはすべて次のようなバリエーションで応答しました。

MSBuild.exe /p:DefineConstants=THING_TO_BE_DEFINED

私は思いつくことができるすべてのバリエーションを試しました:

MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED"
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED"
MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED=1"
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED=1"

...そして他の何十も。同様の方法でPreprocessorDefinitionsをオーバーライドすることにも気を惹きました。それらのすべてが以下の#errorをトリガーしました:

#include "stdafx.h"

#if !defined(THING_TO_BE_DEFINED)
#error "THING_TO_BE_DEFINED is not defined"
#endif

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

私は上記の単純なコマンドラインアプリケーションと、ここにある巨大なゲームプロジェクトでこれを試してきました。 Visual Studio(2005年と2008年にこれが見られます)の腸の奥深くにデフォルトが設定されているため、コマンドライン引数が適用されていないと推測できますが、この仮説を裏付ける証拠は見つかりませんでした。

これを機能させる方法について何かアイデアはありますか?なぜFSMの名において、彼らは古き良き時代に固執しなかったのですか?-D THING_TO_BE_DEFINED?

21

コマンドラインでMSBuildを呼び出す場合、DefineConstantsの値を指定することはできません。ただし、.csprojまたは別のMSBuildスクリプトをビルドしている場合は、それを指定できます。ソリューションファイルを「置き換える」msbuildファイルを作成する場合は、それを使用して、プロジェクトをビルドするときにその値を指定できます。例えば:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!-- Default value here -->
    <DefineConstants Condition=" '$(DefineConstants)'==''" >DEBUG;TRACE</DefineConstants>
  </PropertyGroup>

  <ItemGroup>
    <Projects Include="one.csproj" />
    <Projects Include="two.csproj" />
  </ItemGroup>

  <Target Name="Build">
    <MSBuild Projects="@(Projects)"
                 Properties="DefineConstants=$(DefineConstants)"/>
  </Target>
</Project>

次に、msbuild.exe buid.proj /p:DefineConstants="YourValue;Debug;Trace"を使用できます

コマンドラインでの引用符の使用法に注意してください。

私はこれに関連する何かについてしばらく前にブログ投稿を書いています http://sedodream.com/2008/05/07/MSBuildBuildingTheSameProjectMultipleTimes.aspx

TRACE&DEBUG定数を定義する場合、これは機能するはずです。

msbuild mysln.sln /t:Rebuild /p:Configuration=Release /p:DefineConstants="DEBUG;TRACE"
6
Robert Muehsig

以下は、/ pが機能するためにvcxprojに必要な変更です。

put <DefineConstants> </ DefineConstants>

<PropertyGroup Label = Globals>の下

<PreprocessorDefinitions> $(DefineConstants); WIN32; _DEBUG; _CONSOLE; UNIT_TEST_SIM;%(PreprocessorDefinitions)

このようにして、MSBuildは、/ p:DefineConstants = "MY_DEFINE"によってコマンドラインから提供されない限り、プリプロセッサに対してGlobalsPropertyGroupからのDefineConstantsの値を使用する必要があることを認識します。

4
Moshe

完全を期すために、これは私が欲しかったときにうまくいったことを私が見つけたものですTHING_TO_BE_DEFINED="VALUE WANTED"、VB.NET、およびmsbuildバージョン3.5.30729.1の場合、バッチファイル:

@msbuild /t:Rebuild /p:Configuration=Release;Platform="Any CPU";
DefineConstants="THING_TO_BE_DEFINED=\"VALUE WANTED\"" mysln.sln

(もちろんすべて1行で)

2
Mark Hurd