2009-07-09 13 views
10

Estoy involucrado en el proyecto C++ dirigido a plataformas Windows y Linux (RHEL). Hasta ahora, el desarrollo se realizó exclusivamente en Visual Studio 2008. Para la compilación de Linux utilizamos el plugin de Visual Studio de terceros, que lee los archivos de la solución/perojects de VS y se compilan remotamente en la máquina Linux.Building C++ en Windows y Linux

Recientemente, la decisión fue abandonar el complemento de terceros.

Ahora mi gran preocupación es un sistema de compilación. Estaba buscando herramientas de compilación multiplataforma. De esta forma, no es necesario mantener dos conjuntos de archivos de compilación (por ejemplo, vcproj/solution para Windows y crear archivos para Linux).

Encontré los siguientes candidatos: a. Scons b. cmake

¿Qué opinas sobre las herramientas para el desarrollo cross-platfrom?

Otro punto que me molesta es que Visual Studio (+ Visual Assist) perderá mucha funcionalidad sin archivos vcproj: ¿cómo manejas el problema con las herramientas?

Gracias Dima

PS 1: Algo que me gusta de Scons es que (a) utiliza pitón y por lo tanto flexible, mientras que cmake utiliza un lenguaje decoro (entiendo que no es una característica ganadora para una build-system) (b) autónomo (no es necesario generar makefiles en Linux como con cmake).

¿Por qué no Scons? ¿Por qué en sus proyectos la decisión fue usar cmake?

+0

El sistema de salida está diseñado para un máximo de dos plataformas, por lo que la pregunta es si cmake no está "sobre matar"? Otro punto que me preocupa es que la construcción debe ser reproducible (construir dos veces desde cero dará los productos * SAME * exactamente). Por supuesto, usando el sistema de compilación nativo estoy cerca del objetivo. ¿Es posible que cmake lo rompa y cree vcproj/makefiles diferente dependiendo de la configuración de la persona que lo compila (por ejemplo, para Windows, cada desarrollador hace la compilación en su máquina privada)? – dimba

+0

Solo para una nota sobre Asistencia Visual. Tiene una opción para cargar archivos desde el directorio cuando se usan soluciones vacías. –

Respuesta

10

CMake le permitirá seguir utilizando soluciones de Visual Studio y archivos de proyectos. Cmake no construye el código fuente en sí, sino que generó archivos de compilación para usted. Para Linux esto puede ser Code :: Blocks, KDevelop o makefiles simples o incluso otras opciones más esotéricas. Para Windows puede ser, entre otros, archivos de proyectos de Visual Studio y otros para MacOS. Así que las soluciones y proyectos de Visual Studio se crean desde su CMakeLists.txt. Esto funciona para grandes proyectos bien. P.ej. Ogre3d utiliza CMake para todas las plataformas (Windows, Linux, MacOS e iPhone) y funciona muy bien.

No sé mucho sobre scons en ese sentido, solo solía construir una biblioteca y solo en Linux. Entonces no puedo comparar estos dos en terreno justo. Pero para nuestros proyectos multiplataforma CMake es lo suficientemente fuerte.

+0

CMake es bastante bueno: * regenerará * los archivos del proyecto VS, por lo que es parcialmente engañoso decir "Le permite seguir usando ... archivos de proyecto". Lo recomendaría encarecidamente para un proyecto de C++, ya que la única solución es que uno requiera compatibilidad entre muchos sistemas operativos que incluyen Windows (Windows es el único "difícil" ...), y donde también quiera usar Visual Studio. – Arafangion

+0

Espero que el resto de mi respuesta aclare esto. :) Tienes razón, por supuesto. Los archivos de solución que tiene ahora son reemplazados por los generados. CMake agregará algunos proyectos a su solución en sí misma (ALL_PROJECTS, INSTALL, ZERO_CHECK), estos pueden parecer incómodos al principio, pero son bastante útiles una vez que lean lo que son. Especialmente INSTALAR. Construirá todas las partes de la solución y copiará archivos DLL, EXEs y otros archivos creados como se especifica en CMakeFiles.txt en sus directorios de destino para que pueda ejecutar NSIS u otra herramienta de paquete para crear un paquete de instalación. – haffax

+0

Vale la pena señalar que SCons * puede * generar archivos de proyecto VS. –

3

No he usado Scons antes, por lo que no puedo decir cómo funciona, pero CMake funciona bastante bien.

Funciona produciendo los archivos de compilación necesarios para la plataforma a la que se dirige.

Cuando se utiliza para apuntar a VC++, produce archivos de solución y proyecto, por lo que desde VS, parece como si fueran proyectos VS nativos. La única diferencia es, por supuesto, que si edita el proyecto o la solución directamente a través de VS, los cambios se borrarán la próxima vez que ejecute CMake, ya que sobrescribe sus archivos de proyecto/solución.

Por lo tanto, cualquier cambio debe realizarse en los archivos CMake.

0

Tuve que hacer esto mucho en el pasado. Lo que hicimos fue usar gnu make para prácticamente todo, incluso windows a veces.

Puede usar los archivos de proyecto en Windows si lo prefiere y usar gnu make para Linux.

No hay realmente una buena manera de escribir makefiles multiplataforma porque el archivo de destino será ser diferente entre otras cosas (y problemas de nombre de ruta, \ vs/etc). En general, probablemente esté modificando el código en las distintas plataformas para tener en cuenta las sutiles diferencias, por lo que un cambio en un archivo make y la comprobación en las otras plataformas tendría que suceder de todos modos.

Muchos proyectos OS mantienen Makefile para diferentes plataformas como zlib donde son nombrados como Makefile.win, makefile.linux etc. Se podría seguir su ejemplo.

+0

¿Cuál es la ventaja sobre usar algo como CMake con su enfoque? Con CMake solo tienes que administrar un conjunto de archivos de compilación y aún así puedes usar tu IDE favorito para sacar el máximo provecho. – haffax

+0

Una ventaja es que puede ser más fácil usar las secuencias de comandos estándar para cada sistema en lugar de encontrar una sola secuencia de comandos cruzada que de alguna manera funciona en torno a las peculiaridades de todos los sistemas operativos. Sin embargo, aún hay mucho esfuerzo de duplicación ... – Arafangion

2

Tenemos un gran número de bibliotecas del núcleo y las aplicaciones basadas en esas bibliotecas. Mantenemos un sistema de compilación basado en Makefile en Linux y en Windows utilizando la solución de Visual Studio para cada proyecto o biblioteca.

Encontramos que funciona bien para nuestras necesidades, cada biblioteca o aplicación se desarrolla bien en Linux o Windows con la compilación cruzada en cuenta (por ejemplo, no utilizan de plataforma específicas de la API). Usamos boost para cosas como rutas de archivos, hilos, etc. En casos específicos, usamos plantillas/# define para seleccionar la solución específica de la plataforma (por ejemplo, eventos). Cuando esté listo nos moveremos al otro sistema (Linux o Windows), recompilaremos, arreglaremos advertencias/errores y probaremos.

En lugar de perder tiempo averiguando herramientas que pueden compilarse cruzadas en ambas plataformas, utilizamos el sistema que es mejor para cada plataforma y dedicamos tiempo a solucionar problemas específicos y mejorar el software.

Tenemos aplicaciones GUI sólo en Windows atm. entonces no hay GUI para cruzar la compilación. La mayor parte de nuestro desarrollo que se comparte entre Windows y Linux es la red del lado del servidor (sockets, TCP/IP, UDP ...) y luego las herramientas del lado del cliente en las aplicaciones Linux y GUI en Windows.

utilizando con forzosamente para la fuente de gestión de versiones de código que encontramos en muchos casos bastante que el sistema Linux Makefile es mucho más flexible de lo que necesitamos continuación, Windows VS. Especialmente para usar múltiples espacios de trabajo (vistas de versiones de código fuente) donde necesitamos apuntar a directorios comunes, etc. En Linux, esto se puede hacer automáticamente ejecutando una secuencia de comandos para actualizar las variables de entorno, en Visual Studio las variables de entorno de referencia son muy inflexibles porque es difícil actualizar automáticamente entre vistas/ramas.

Re cuestión de sincronización:

Asumo que está pidiendo cómo asegurarse de que los dos sistemas de construcción se sincronizan entre Linux y Windows. En realidad estamos usando Hudson en Linux y CruiseControl en Windows (primero teníamos Windows con control de crucero, cuando fui a la versión de configuración de Linux pensé que Hudson es mejor, así que ahora tenemos un entorno mixto). Nuestros sistemas están funcionando todo el tiempo. Cuando algo se actualiza, se prueba y se libera (ya sea en Windows o en la versión de Linux) para que pueda saber de inmediato si no funciona. Durante las pruebas, nos aseguramos de que todas las funciones más recientes estén disponibles y sean completamente funcionales. Supongo que eso es todo, no hay magia oscura involucrada.

Oh que significa construir scripts ... Cada aplicación tiene su propia solución, en solución a configurar hasta dependencias. En el lado de Linux tengo un archivo MAKE para cada proyecto y un script de compilación en el directorio del proyecto que se ocupa de todas las dependencias, esto en su mayoría significa compilar bibliotecas centrales y un par de marcos específicos necesarios para la aplicación determinada. Como puede ver, esto es diferente para cada plataforma, es fácil agregar secuencias de comandos de línea a construcción que cambien al directorio y hagan el proyecto requerido.

Ayuda a tener proyectos configurados de manera consistente.

En Windows, abra el proyecto y agregue el proyecto de dependencia. Nuevamente no hay magia involucrada.Veo este tipo de tareas como relacionadas con el desarrollo, por ejemplo, se agregaron nuevas funcionalidades a un proyecto y se tuvieron que vincular en los marcos y encabezados. Entonces, desde mi punto de vista, no hay ninguna razón para automatizar estos, ya que son parte de lo que hacen los desarrolladores cuando implementan características.

+0

Voy a votar si dices cómo te aseguras de que los diversos scripts de compilación no se desincronicen. (Un servidor de integración continua sería de una sola manera) – Arafangion

+0

¡FÁCILMENTE vale la pena los votos por votos ahora! – Arafangion

1

Aquí hay un article sobre la decisión tomada por los desarrolladores de KDE para elegir CMake sobre SCons. Sin embargo, tengo que señalar que este artículo tiene casi tres años, por lo que los Scon deberían haber mejorado.

Here es una comparación de SCons con otras herramientas de construcción.

+0

También tenga en cuenta que SCons es más genérico, mientras que CMake está sesgado hacia determinados idiomas. – Arafangion

3

Otra opción es premake. Es como cmake porque genera soluciones a partir de archivos de definición. Es de código abierto y la última versión es muy altamente personalizable usando Lua scripting. Pudimos agregar soporte de plataforma personalizado sin demasiados problemas. Para su situación, tiene soporte para Visual Studio y GNU makefiles estándar.

Ver Premake 4.0 Homepage

climatizador es una buena opción para la integración continua. Lo tenemos funcionando en Linux usando Mono con éxito.

+1

No recomendaría premake debido a la falta de popularidad/comunidad/soporte en comparación con CMake y SCons que se utilizan en varios proyectos importantes. –

Cuestiones relacionadas