Cómo anular el comando de compilación de Visual Studio 2017 Community [duplicate]

4 minutos de lectura

Como anular el comando de compilacion de Visual Studio 2017
Tomáš Zato – Reincorporar a Mónica

Me gustaría anular el compilador predeterminado de Visual Studio C++ con un script de shell simple. Lo que quiero es capturar los argumentos, como el nombre del archivo, y crear algunas estadísticas. Sin embargo, quiero anular el proceso de compilación por completo, es decir, quiero llamar a la compilación original desde mi script de shell.

Busqué en Google, pero todo lo que encontré fue cómo tener scripts previos y posteriores a la compilación que se ejecutan dentro de un proyecto. Eso no es lo que quiero.

Quiero cambiar esto globalmente. ¿Cómo puedo hacerlo?

  • Busque el archivo cl.exe, reemplácelo con su propio archivo, registre los argumentos. Llamada opcional al cl.exe original con los argumentos.

    – Richard Critten

    23 ago. 17 a las 9:00

  • Por favor sea especifico. Dices que quieres capturar argumentos y crear estadísticas. También dice que desea anular el compilador con un script. Esos dos no son mutuamente excluyentes. Esta última no es la única solución para el primer problema y sospecho que realmente solo quieres una solución para el primero.

    – Stijn

    23 ago. 17 en 9:13


  • @stijn Califiqué la pregunta. Realmente quiero anular la compilación. Capturar argumentos es solo una de las muchas cosas que puedo hacer entonces, si tengo éxito.

    – Tomáš Zato – Reincorporar a Mónica

    23 ago. 17 a las 09:46

  • @RichardCritten Bueno, esto tiene algunos defectos, aunque podría ser un buen comienzo. Pero a) el estudio visual podría anular esto de nuevo en las actualizaciones y b) el script de shell no puede tener .exe extensión, por lo que tendría que hacer un programa C simple que ejecute el script real. Quiero usar Node.js en particular. Mi objetivo final es compilar archivos en otra máquina (por diversión, no porque realmente lo necesite).

    – Tomáš Zato – Reincorporar a Mónica

    23 ago. 17 a las 09:47

  • Ah, aún no conoces MsBuild:]Va a ser un viaje difícil simplemente buscando en Google, dame un poco de tiempo y prepararé una respuesta para que comiences.

    – Stijn

    23 ago. 17 en 10:46

Para un archivo de proyecto C++ estándar, la compilación se realiza mediante la invocación de MsBuild Objetivo nombrada ClCompile. Tenga en cuenta que también hay un MsBuild Articulo llamado ClCompile que enumera los archivos fuente de C++ reales utilizados, esto se puede ver fácilmente abriendo su .vcxproj en un editor de texto. En consecuencia, este elemento de ClCompile se utiliza en el destino de ClCompile, donde se pasa al CL Tarea que a su vez invocará cl.exe, el ejecutable del compilador real. Este código para esto se puede encontrar en el archivo Microsoft.CppCommon.targets para el conjunto de herramientas que usa, para una instalación predeterminada de la comunidad VS2017 en una máquina de 64 bits que es C:Program Files (x86)Microsoft Visual Studio2017Community Common7IDEVCVCTargetsMicrosoft.CppCommon.targets.

Cualquiera de esos 3 podría anularse con una versión personalizada; sin embargo, como ya pensó, simplemente reemplazar cl.exe en el disco no es la mejor idea.

Pero CL puede usar cualquier ejecutable simplemente anulando CLToolExe y CLToolPath propiedades. Prácticamente: abra su archivo .vcxproj y agregue

<PropertyGroup>
  <CLToolExe>mycl.exe</CLToolExe>
  <CLToolPath>c:pathtomycompilerstub</CLToolPath>
</PropertyGroup>

todo el camino al final, después de la línea de importación de Microsoft.Cpp.targets; Se llamará mycl.exe en lugar de cl.exe. Si desea el mismo efecto globalmente en su máquina, colocará ese PropertyGroup en un archivo msbuild separado y lo guardará, por ejemplo, en C: Archivos de programa (x86) Microsoft Visual Studio 2017 Community Common7 IDE VC VCTargets Platforms x64 ImportAfter MyCustomImport.targets. Cualquier archivo de destino en ese directorio se importará automáticamente.

Como alternativa, puede anular el objetivo ClCompile o la tarea CL. Sin embargo, eso es más complicado, por ejemplo, para ClCompile, comenzaría copiando toda la implementación que se encuentra en Microsoft.CppCommon.targets y luego agregaría la lógica que necesite. La ventaja es que tiene acceso directo a, por ejemplo, archivos fuente, etc. sin tener que analizar una línea de comando. Por ejemplo, esto anularía ClCompile e imprimiría los archivos fuente y los pasaría a un ejecutable personalizado:

<Target Name="ClCompile"
        Condition="'@(ClCompile)' != ''"
        DependsOnTargets="SelectClCompile">

  <Message Text="All the sources = @(ClCompile)"/>
  <Exec Command="mycustom.exe @(ClCompile)" />

  ... <!--rest of implementation copied from Microsoft.CppCommon.targets goes here-->
</Target>

Nuevamente, esto debe colocarse al final de su archivo de proyecto o en el directorio ImportAfter para anulación global.

  • ¿Entiendo correctamente que si anulo ClCompile target De la forma en que lo describió, ¿podré seleccionar ese objetivo en Visual Studio para compilarlo? De todos modos, muchas gracias por la ayuda, ¡este es un muy buen punto de partida para más investigaciones!

    – Tomáš Zato – Reincorporar a Mónica

    23 ago. 17 en 14:27

  • Si anula ClCompile, se llamará automáticamente en lugar del objetivo predeterminado de ClCompile, por ejemplo, cuando en VS presiona Build o compila un solo archivo.

    – Stijn

    23/08/17 a las 14:38

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad