Personalizzare le compilazioni C++

Per i progetti C++, i file e .props personalizzati .targets non possono essere usati nello stesso modo per eseguire l'override delle impostazioni predefinite. Questo articolo descrive un modo diverso per personalizzare la compilazione che funziona per le compilazioni C++.

Il file Directory.Build.props utile per la personalizzazione dei progetti .NET viene importato da Microsoft.Common.props, che viene importato in Microsoft.Cpp.Default.props, mentre la maggior parte delle impostazioni predefinite è definita in Microsoft.Cpp.props e per molte proprietà non è possibile usare una condizione "se non ancora definita", perché la proprietà è già definita, ma l'impostazione predefinita deve essere diversa per specifiche proprietà di progetto definite in PropertyGroup con Label="Configuration" (vedere .vcxproj e la struttura del file props).

Per i progetti C++, è possibile usare le proprietà seguenti per specificare .props i file da importare automaticamente prima/dopo i file Microsoft.Cpp.* :

  • ForceImportAfterCppDefaultProps
  • ForceImportBeforeCppProps
  • ForceImportAfterCppProps
  • ForceImportBeforeCppTargets
  • ForceImportAfterCppTargets

Per personalizzare i valori predefiniti delle proprietà per tutte le compilazioni C++, creare un altro .props file (ad esempio, MyProps.props) e definire la ForceImportAfterCppProps proprietà in Directory.Build.props modo che punti al file:

<PropertyGroup>
  <ForceImportAfterCppProps>$(MsbuildThisFileDirectory)\MyProps.props</ForceImportAfterCppProps>
</PropertyGroup>

MyProps.props verrà importato automaticamente alla fine di Microsoft.Cpp.props.

Personalizzare tutte le compilazioni C++

La personalizzazione dell'installazione di Visual Studio non è consigliata, poiché non è facile tenere traccia di tali personalizzazioni, ma se si estende Visual Studio per personalizzare le compilazioni C++ per una determinata piattaforma, è possibile creare .targets file per ogni piattaforma e inserirli nelle cartelle di importazione appropriate per tali piattaforme come parte di un'estensione di Visual Studio.

Il .targets file per la piattaforma Win32, Microsoft.Cpp.Win32.targets, contiene l'elemento seguente Import :

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportBefore\*.targets"
        Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportBefore')"
/>

C'è un elemento simile alla fine dello stesso file:

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportAfter\*.targets"
        Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportAfter')"
/>

Esistono elementi di importazione simili per altre piattaforme di destinazione in *%ProgramFiles32%\MSBuild\Microsoft.Cpp\v{version}\Platforms*.

Dopo aver inserito il .targets file nella cartella appropriata ImportAfter in base alla piattaforma, MSBuild importa il file in ogni compilazione C++ per tale piattaforma. Se necessario, è possibile inserire più .targets file.

Usando l'estendibilità di Visual Studio, sono possibili ulteriori personalizzazioni, ad esempio la definizione di una nuova piattaforma. Per altre informazioni, vedere Estendibilità del progetto C++.

Specificare un'importazione personalizzata nella riga di comando

Per la personalizzazione .targets da includere per una compilazione specifica di un progetto C++, impostare una o entrambe le proprietà ForceImportBeforeCppTargets e ForceImportAfterCppTargets nella riga di comando.

msbuild /p:ForceImportBeforeCppTargets="C:\build\config\Custom.Before.Microsoft.Cpp.Targets" MyCppProject.vcxproj

Per un'impostazione globale ,ad esempio tutte le build C++ per una piattaforma in un server di compilazione, sono disponibili due metodi. Prima di tutto, è possibile impostare queste proprietà usando una variabile di ambiente di sistema sempre impostata. Questa tecnica funziona perché MSBuild legge sempre l'ambiente e crea (o esegue l'override) delle proprietà per tutte le variabili di ambiente.