2017-08-02 5 views
0

私たちはexperiencing AppVeyor x64 build failuresであり、提案はset PlatformToolset to DefaultPlatformToolsetです。プロパティ値は文書化されていないので、完全にテストしたい。 MSbuildからPlatformToolsetプロパティを設定するには?

は、私たちは AppVeyor configuration fileDefaultPlatformToolsetを有線:

test_script: 

- cmd: >- 
    msbuild /t:Build /p:PlatformToolset=DefaultPlatformToolset cryptlib.vcxproj 
    msbuild /t:Build /p:PlatformToolset=DefaultPlatformToolset cryptest.vcxproj 
    msbuild /t:CopyCryptestToRoot /p:PlatformToolset=DefaultPlatformToolset cryptest.vcxproj 
    cryptest.exe v 
    cryptest.exe tv all 

DefaultPlatformToolsetがAppVeyor障害を引き起こしています。ここでは、すべてが正しいと信じログからだ:Build 1.0.129

msbuild /t:Build /p:PlatformToolset=DefaultPlatformToolset cryptlib.vcxproj 
Microsoft (R) Build Engine version 14.0.25420.1 
Copyright (C) Microsoft Corporation. All rights reserved. 
Build started 8/2/2017 5:14:24 AM. 
The target "_ConvertPdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets (45,37)" does not exist in the project, and will be ignored. 
The target "_CollectPdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets (45,70)" does not exist in the project, and will be ignored. 
The target "_CollectMdbFiles" listed in a BeforeTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets (52,38)" does not exist in the project, and will be ignored. 
The target "_CopyMdbFiles" listed in an AfterTargets attribute at "C:\Program Files (x86)\MSBuild\14.0\Microsoft.Common.targets\ImportAfter\Xamarin.Common.targets (52,71)" does not exist in the project, and will be ignored. 
Project "C:\projects\cryptopp\cryptlib.vcxproj" on node 1 (Build target(s)). 
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.Cpp.Platform.targets(57,5): error MSB8020: The build tools for DefaultPlatformToolset (Platform Toolset = 'DefaultPlatformToolset') cannot be found. To build using the DefaultPlatformToolset build tools, please install DefaultPlatformToolset build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution". [C:\projects\cryptopp\cryptlib.vcxproj] 
Done Building Project "C:\projects\cryptopp\cryptlib.vcxproj" (Build target(s)) -- FAILED. 
Build FAILED. 

プロジェクトをビルドするためのMSBuildを使用しているとき、我々はコマンドラインでPlatformToolsetを設定するにはどうすればよいですか?


これらの作業はありません。上記と同様のエラーが発生します。エラーメッセージの提案について

> msbuild /t:Build /p:PlatformToolset=""$(DefaultPlatformToolset)"" cryptlib.vcxproj 
Microsoft (R) Build Engine version 4.6.1087.0 
[Microsoft .NET Framework, version 4.0.30319.42000] 
Copyright (C) Microsoft Corporation. All rights reserved. 

Build started 8/2/2017 2:19:15 AM. 
Project "c:\Users\Test\cryptlib.vcxproj" on node 1 (Build target(s)). 
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Platform.p 
rops(15,24): error MSB4115: The "exists" function only accepts a scalar value, 
but its argument "$(VCTargetsPath)\Platforms\$(Platform)\PlatformToolsets\$(Pla 
tformToolset)\Microsoft.Cpp.$(Platform).$(PlatformToolset).props" evaluates to 
"C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\\Platforms\x64\Platform 
Toolsets\"$(DefaultPlatformToolset)"\Microsoft.Cpp.x64."$(DefaultPl 
atformToolset)".props" which is not a scalar value. 

> msbuild /t:Build /p:PlatformToolset=DefaultPlatformToolset cryptlib.vcxproj 

> msbuild /t:Build /p:PlatformToolset=$(DefaultPlatformToolset) cryptlib.vcxproj 

> msbuild /t:Build /p:PlatformToolset="$(DefaultPlatformToolset)" cryptlib.vcxproj 

> msbuild /t:Build /p:PlatformToolset='$(DefaultPlatformToolset)' cryptlib.vcxproj 

は、ここで引用している愚かなMSのXMLをやろうとし、別のエラーです:

>msbuild /t:Build /p:PlatformToolset="$(DefaultPlatformToolset)" cryptlib.vcxproj 
Microsoft (R) Build Engine version 4.6.1087.0 
[Microsoft .NET Framework, version 4.0.30319.42000] 
Copyright (C) Microsoft Corporation. All rights reserved. 

MSBUILD : error MSB1011: Specify which project or solution file to use because t 
his folder contains more than one project or solution file. 
'#34' is not recognized as an internal or external command, 
operable program or batch file. 
'#34' is not recognized as an internal or external command, 
operable program or batch file. 

そして、この1があります。 ..またはソリューションを右クリックし、[ソリューションの再割り当て]を選択する、私たちはできません。これはリモートのコマンドラインのみです。コマンドラインからVCUpgradeを実行する方法を解明しようとしています

答えて

2

DefaultPlatformToolsetは、メインプロジェクトによってインポートされたプラットフォーム.propsファイルの1つに設定されるMSBuildプロパティです。 C++プロジェクトファイル内の一点で、これはMSBuildのプロパティであるため

<DefaultPlatformToolset>v140</DefaultPlatformToolset> 

を使用してプロパティを設定し、例えば、VS2017は、順番に<msbuild installation>\Microsoft.Cpp\v4.0\V140\Microsoft.Cpp.Default.propsをインポートしてしまうためにライン

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 

、あるはずそれはAppveyorやcmdによって知られていないので、appveyor.ymlから直接参照することはできません。そして、たとえそれが知られていても、$(DefaultPlatformToolset)(msbuildプロパティ展開構文)を使用して参照することはできませんが、cmdの形式は%ABC%です。 PlatformToolsetプロパティがたとえばに設定されているため、取得するエラーはすべてです。文字列 'DefaultPlatformToolset'であるのに対して、v110やv140、v120_xpなどの実際の利用可能なプラットフォームの名前に設定する必要があります。

最も簡単な方法は、プロジェクトファイルに入力することです。必要に応じてコマンドラインからオーバーライドできます。代わりに、msbuildを実行して、その値を出力してから、/ p:PlatformToolset =を使って渡します。しかし、それはVisual Studioのローカル開発ビルドにはあまり適していません。プロジェクトファイルを変更するための

、PlatformToolsetが定義されている部分(複数可)を見つけて、$(DefaultPlatformToolset)に変更し - これは後Microsoft.Cpp.Default.propsプロパティがないかもしれない他のインポート来る必要がありますまだ定義されていません。何らかの理由でDefaultPlatformToolset(何かカスタムバージョンまたは古いバージョンのVSバージョン)が定義されていないプラットフォームのために構築する場合は、最初にの適切なデフォルトに設定してからの前にMicrosoft.Cpp.Default.propsを設定してください。例:

<PropertyGroup Label="Globals"> 
    <PlatformToolset>v100</PlatformToolset> 
</PropertyGroup> 
.... 
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 
.... 
<PropertyGroup> 
    <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> 
</PropertyGroup> 

は、ここでそれを行うための別の方法です:

<!-- Use DefaultPlatformToolset after Microsoft.Cpp.Default.props --> 
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 
<!-- Set DefaultPlatformToolset to v100 (VS2010) if not defined --> 
<PropertyGroup Label="EmptyDefaultPlatformToolset"> 
    <DefaultPlatformToolset Condition=" '$(DefaultPlatformToolset)' == '' ">v100</DefaultPlatformToolset> 
    </PropertyGroup> 
<PropertyGroup Label="PlatformToolset"> 
    <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> 
</PropertyGroup> 

Microsoft.Cpp.Default.propsをインポートする前に、グローバル・プロパティ・グループ要素が設定されていることを確認することも非常に重要です。これらが設定されていない場合は、MSBuildがApplicationが構築されていると仮定し、それは後で来るConfigurationType無視します:

<PropertyGroup Label="Globals"> 
    <ProjectGuid>{016d3861-ccd6-4a50-83b4-fe4e93bea333}</ProjectGuid> 
    <RootNamespace>mylib</RootNamespace> 
    <ConfigurationType>StaticLibrary</ConfigurationType> 
</PropertyGroup> 
... 
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> 
... 
<PropertyGroup> 
    <PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset> 
</PropertyGroup> 
+0

ない考え、私はそれが積極的に多分ちょうど、それを拒否することとは何かを持っているかわからないが内部を文書化する時間/関心の欠如 – stijn

関連する問題