Personalización de compilaciones de C++

En el caso de los proyectos de C++, los archivos .targets y .props personalizados no se pueden usar de la misma manera para invalidar la configuración predeterminada. En este artículo se describe una forma distinta de personalizar la compilación que funciona para las compilaciones de C++.

El archivo Directory.Build.props, que es útil para personalizar los proyectos de .NET, se importa mediante Microsoft.Common.props, que se importa en Microsoft.Cpp.Default.props mientras que la mayoría de los valores predeterminados se definen en Microsoft.Cpp.props; además, para muchas propiedades, no se puede usar una condición "si aún no se ha definido", ya que la propiedad ya está definida, pero el valor predeterminado debe ser diferente para determinadas propiedades de proyecto definidas en PropertyGroup con Label="Configuration" (consulte Estructura de los archivos .vcxproj y .props).

Para los proyectos de C++, puede usar las propiedades siguientes para especificar que los archivos .props se importen automáticamente antes o después de los archivos Microsoft.Cpp.*:

  • ForceImportAfterCppDefaultProps
  • ForceImportBeforeCppProps
  • ForceImportAfterCppProps
  • ForceImportBeforeCppTargets
  • ForceImportAfterCppTargets

Para personalizar los valores predeterminados de las propiedades de todas las compilaciones de C++, cree otro archivo .props (por ejemplo, MyProps.props) y defina la propiedad ForceImportAfterCppProps en Directory.Build.props apuntando a él:

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

MyProps.props se importará automáticamente al final de Microsoft.Cpp.props.

Personalización de todas las compilaciones de C++

No se recomienda personalizar la instalación de Visual Studio, ya que no es fácil realizar un seguimiento de estas personalizaciones, pero si está ampliando Visual Studio para personalizar las compilaciones de C++ para una plataforma determinada, puede crear archivos de .targets para cada plataforma y colocarlos en las carpetas de importación correspondientes a esas plataformas como parte de una extensión de Visual Studio.

El archivo .targets para la plataforma Win32, Microsoft.Cpp.Win32.targets, contiene el siguiente elemento Import:

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

Hay un elemento similar cerca del final del mismo archivo:

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

Existen elementos de importación similares para otras plataformas de destino en *%ProgramFiles32%\MSBuild\Microsoft.Cpp\v{version}\Platforms*.

Una vez que coloque el archivo .targets en la carpeta ImportAfter correspondiente según la plataforma, MSBuild importará el archivo en cada compilación de C++ de esa plataforma. Puede colocar ahí varios archivos de .targets, si es necesario.

Con Extensibilidad de Visual Studio, pueden realizarse más personalizaciones, como la definición de una nueva plataforma. Para obtener más información, consulte Extensibilidad de proyectos de C++.

Especificación de una importación personalizada en la línea de comandos

En el caso de los .targets personalizados que desee incluir para una compilación específica de un proyecto de C++, establezca una o las dos propiedades ForceImportBeforeCppTargets y ForceImportAfterCppTargets en la línea de comandos.

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

En el caso de una configuración global (para incidir, por ejemplo, en todas las compilaciones de C++ de una plataforma en un servidor de compilación), hay dos métodos. En primer lugar, puede establecer estas propiedades mediante una variable de entorno del sistema que siempre se establece. Esta técnica funciona porque MSBuild siempre lee el entorno y crea (o invalida) propiedades para todas las variables de entorno.