La automatización de la compilación mediante el uso de la plataforma específica de los archivos de proyecto o por el uso de proyectos generadores?

StackOverflow https://stackoverflow.com/questions/1957227

Pregunta

Hay algunas construir sistemas que sean capaces de generar específicas de la plataforma archivos de proyecto de Visual Studio sln,vcproj,vcxproj archivos o XCode xcodeproj proyectos en OS X.

Uno de ellos es CMake, pero me enteré de que el apoyo para este es muy limitado, buggy y eso es muy duro para mantenerlo actualizado con las nuevas versiones (como VS 2010).

También, al menos CMake, la falta de apoyo para las páginas de propiedades de Visual Studio y esto hace más difícil de manejar y el proyecto de cambio de ancho de configuraciones - como la activación/desactivación de Análisis de Código para todos los proyectos.

Una solución para el problema anterior para crear manualmente los archivos de proyecto para cada plataforma, que en mi caso sólo hay dos, pero incluso con más el número no debe ser tan grande.

Es muy fácil llamar a la plataforma de creación específico de comandos en un genérico construir script de automatización.Para el ejemplo he utilizado waf (Python) para la automatización de este en algunos proyectos sin necesidad de utilizar su propia construcción de la parte.

Me gustaría ver lo que volvería a escoger entre: tratando de reparar/mantener el proyecto de generadores o mantener separados los archivos de proyecto?

¿Fue útil?

Solución

Esto es lo que hacemos, tal vez no sea la mejor manera, pero funciona muy bien para nosotros y nos encontramos con que no es demasiado difícil de mantener, puede que le resulte interesante.

Nuestra plataforma principal es ventanas, casi todo el desarrollo se lleva a cabo en el IDE de VS. Para las otras plataformas (sólo algunas versiones de Linux por ahora) que utilizamos exclusivamente CMake. Básicamente elegimos el camino "tratando de reparar / mantener los generadores de proyectos", pero con los archivos de proyecto de Visual Studio como un punto de partida.

  • utilizamos archivos de proyecto de Visual Studio como un contenedor para todos los archivos de un proyecto
  • todos Opciones de construcción se encuentran en las hojas de propiedades, cada proyecto tiene un conjunto estándar y, finalmente, algunas hojas adicionales para tirar en ciertas bibliotecas, etc.
  • tenemos algunos scripts simples que permiten añadir / eliminar las hojas de propiedades en un solo lote
  • todas las hojas de propiedades tienen una contraparte cmake; ambos se mantuvieron en el mismo directorio, y si nos ponemos al día uno, actualizamos la contraparte, así, siempre. Esto no se hace con un guión, y admito que es la parte 'complicado':. A pesar de que realmente en gran medida de las macros, siempre hay opciones que están disponibles en una sola plataforma, pero en el otro ot
  • tenemos un script que convierte los archivos en los archivos vcproj cmake, que básicamente se crea un archivo cmake que incluye las hojas de propiedades cmake correspondientes y que contiene todos los archivos de origen del vcproj tiene.
  • si fuera poco escribí un servidor de compilación que se ejecuta en todas las plataformas que utilizamos. Se construye utilizando msbuild o cmake, y es la clave para mantener este sistema de trabajo:. Cada cambio que hacemos provoca una acumulación + pruebas en al menos dos máquinas, por lo que sabemos immedeatly si todo está bien Stil

Recientemente hemos empezado a utilizar VS2010, y la migración sólo se tarda alrededor de un día:. Primero dejamos VS convertir todos nuestros proyectos y hojas de propiedades, a continuación, hemos hecho algunos ajustes en las secuencias de comandos para manejar los nuevos formatos de archivo XML

Editar

lo siento, pero no puedo publicar los guiones, política de la empresa, espero que comprendan. Un poco de pseudocódigo no es un problema sin embargo. Añadir / quitar las hojas de propiedades de archivos de proyectos VS2008 es la siguiente:

foreach proj in projectfiles //list of vcproj files
  foreach config in configuration //configurations eg 'Debug|Win32, Debug|x64'
    f = OpenFile( proj );
      //find start of Configuration element, then get what's after InheritedPropertySheets=
    propsheets = GetPropSheetsForConfig( f, config );
    propsheets = DoAction( action, args, propsheets ); //action is add/remove/.. with argument args
    SetPropSheetsForConfig( f, propsheets );

En los archivos CMakeLists esto es más o menos la misma, excepto el guión funciona en el 'include (..)' líneas.

Convertig de vcproj a CMakeLists:

f = OpenFile( proj );
projname = GetProjectName( f );
sources = GetSourceFiles( f ); //all File/RelativePath elements under Filter 'Source Files'
sources = CheckFilter( sources ); //apply rules to include/exclude platform specific files
propsheets[] = GetPropSheetsForConfig( f, configs[] );

fout = CreateCMakeFromProj( proj ); //CMakeLists.txt in corresponding directory
WriteCMakeHeader( fout, projname );
WriteCMakeSources( sources );
WriteCMakeIncludes( configs[], propsheets[] ); //write includes, conditional on CMAKE_BUILD_TYPE

El servidor de compilación es un material bastante avanzada, pero en un principio era sólo un receptor TCP:

  • espera de conexión
  • obtener argumentos opcionales (hojas de propiedades / acción)
  • actualización del repositorio
  • finalmente ejecutar el archivo por lotes para las hojas de propiedades con los argumentos dados
  • iniciar la línea de comandos reconstrucción completa + pruebas, la producción de captura en archivo
  • archivo de análisis para las líneas que contienen 'error', los resultados de correo

Otros consejos

Todos mis proyectos son multiplataforma, y mi preferencia es la solución.Con Scons mantener una cruz de proyecto de la plataforma es de poco o ningún trabajo.Un buen entorno definido de trabajo para la mayoría de los proyectos, y el uso de una plantilla para cada proyecto/subproyecto.Usted también tiene el beneficio de un control completo sobre el proceso de construcción, permitiendo el uso de lenguajes específicos de dominio, hacer de la generación de código, gestionar el control de código fuente, con facilidad.

Aprendizaje Scons es muy sencillo cuando sabes python, sin saber python, son disconvering dos grandes tecnologías no uno ;)

boost.build para nuestros proyectos de plataforma. Funciona bien para C ++ proyectos de biblioteca. Nos gusta porque sólo tenemos que mantener un guión y se integra con Boost.Test también.

Se tiene una curva de aprendizaje muy empinada y la documentación es bastante pobre. Pero hace su trabajo bien en Windows y Linux, las dos plataformas que trabajamos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top