Sistemas de construcción C ++: ¿qué usar? [cerrado]

136

Estoy buscando comenzar un nuevo proyecto en C ++, solo en mi propio tiempo inicialmente, y estoy investigando los sistemas de compilación que están disponibles. Parece que la respuesta es "Muchos, y todos son horribles".

Las características que necesito específicamente para esto son:

  1. Soporte de C ++ 11
  2. Multiplataforma (Linux como objetivo principal, pero capaz de construir al menos también en Windows)
  3. Soporte de prueba de unidad decente
  4. Soporte para múltiples módulos para separar código
  5. Soporte para la generación de código (Uso de asn1c o protobuf, aún no es 100% seguro)
  6. Facil de mantener

Ahora, sé que puedo hacer 1-4 de los que usan CMake y Autotools con bastante facilidad. Probablemente también con SCons y Waf y los otros dos también. El problema es que nunca he resuelto cómo generar correctamente el código utilizándolos, es decir, los archivos fuente que no existen hasta que se ejecuta el proceso de compilación por primera vez, por lo que los archivos fuente que el sistema de compilación debe poder convertir en código ejecutable pero en realidad no lo sabe hasta que comienza la compilación ... (ASN1C en particular genera docenas de archivos de encabezado y fuente que deben poder trabajar juntos, y el conjunto real de archivos genera depende del contenido de su archivo asn) Hay También el hecho de que ninguno de estos es especialmente fácil de mantener: CMake y Autotools tienen su propio gran conjunto de scripts que debe administrar para que funcionen,

Entonces, ¿qué sistemas de compilación se recomiendan para algo como esto? ¿O estaré atrapado con los archivos de creación y los scripts de shell por ahora?

Graham
fuente
11
"Parece que la respuesta es 'Muchos, y todos son horribles'" es mi impresión también (con la adición de 'horrible desde mi punto de vista'; no me gusta generalizar demasiado con términos como estos ) Realmente configuré el mío por esa misma razón, y funcionó mejor de lo esperado, ya que hace lo que quiero y cómo siempre quise que las cosas funcionaran. Para algo que requiera un poco menos de tiempo, probablemente tendrá que revisar las herramientas existentes y elegir una que le dé menos dolores de cabeza que las otras.
Christian Stieber
44
Prueba tup .
Kerrek SB
ver también: stackoverflow.com/q/3349956
ergosys
8
¿Qué tipo de soporte de C ++ 11 espera de un sistema de compilación? Esto es algo que obtienes del compilador, el sistema de compilación no analiza ni lee los archivos fuente reales, solo los pasa a quien los necesite, ¿no?
Baruch
55
Es cierto, pero sería fácil decirle al compilador que use el soporte de C ++ 11 sería bueno. g ++ necesita una bandera, sonar un conjunto diferente, msvc aparentemente no necesita ninguna y así sucesivamente. Además, el soporte para detectar qué funciones de c ++ 11 están disponibles sería útil, ya que también difiere entre los compiladores ...
Graham

Respuestas:

117

+1 para "Muchos, y son horribles".

Pero, el "más rico" y "más escalable" es probablemente CMake , que es un generador de Makefile (también genera MSVC ++ *.proj/ nativo *.sln). Sintaxis extraña, pero una vez que la aprende, puede permitirle generar compilaciones para diferentes plataformas. Si "comenzara fresco", probablemente lo usaría CMake. Debería manejar su lista, aunque su "generación de código" podría asumir una "vida propia" más allá del sistema de compilación, dependiendo de lo que quiera hacer. (Vea abajo.)

Para proyectos simples, el generador QMake está bien (no necesita usar las bibliotecas Qt para usar QMake). Pero no está describiendo "simple": la generación de código y las "fases adicionales" significan que probablemente quiera CMakeo algo con una API rica para sus propias extensiones, como Scons(o Waf).

Usamos Scons en el trabajo. Produce "construcciones a prueba de balas", pero es realmente lento. Ningún otro sistema será tan a prueba de balas como Scons. Pero es lento. Está escrito en Python y hemos ampliado la interfaz para nuestra "organización del espacio de trabajo" (donde simplemente especificamos dependencias de los módulos), y eso es parte de la Sconsintención del diseño (este tipo de extensión a través de Python). Conveniente, pero las construcciones son lentas. Obtiene compilaciones a prueba de balas (cualquier caja de desarrollador puede hacer la versión final), pero es lento. Y es lento. Sin Sconsembargo, no olvide que si lo usa , es lento. Y es lento.

Me enferma pensar que una década después del año 2000, todavía no tenemos autos voladores. Probablemente tendremos que esperar otros cien años o algo para obtenerlos. Y, probablemente, todos estaremos volando en nuestros autos voladores que todavía se están construyendo con sistemas de construcción deficientes.

Sí, todos son horribles.

[SOBRE LA GENERACIÓN DE CÓDIGOS]

Sconsfunciona en "fases" y son "algo estáticas". Puede compilar código que se genera como parte de la compilación (las personas están haciendo esto de varias maneras diferentes), pero esto se ha descrito como "algo muy poco parecido a Scons".

Si es simple "preprocesar algunos archivos y generar archivos de origen", entonces no es gran cosa (tiene muchas opciones, y esta es la razón por la que qmakese escribió, para el mocpreprocesamiento de *.hpp/*.cpparchivos).

Sin embargo, si está haciendo esto de una manera "pesada", necesitará escribir su propio guión. Por ejemplo, teníamos scripts como parte de la compilación que consultaban las bases de datos y generaban clases de C ++ para interactuar entre las "capas" (en el desarrollo tradicional de aplicaciones de 3 niveles). Del mismo modo, generamos código fuente de servidor / cliente a través de IDL e información de versión incorporada para permitir que varios clientes / servidores se ejecuten simultáneamente con diferentes versiones (para el mismo "cliente" o "servidor"). Gran cantidad de código fuente generado. Podríamos "fingir" que es "el sistema de compilación", pero en realidad, es una infraestructura no trivial para la "gestión de la configuración", de la cual parte es el "sistema de compilación". Por ejemplo, este sistema tenía que "desmontar" y "

charley
fuente
37
También me gustan los Scons, pero creo que es lento.
Lothar
1
Puede hacer que CMake maneje la generación de código con un contenedor Makefile para realizar una segunda fase opcional cuando se genera el código. Pude admitir el seguimiento de dependencia total, la salida anticipada después de la generación del código para activar un re-cmake, etc. Ver: javaglue.com/javaglue.html#tag:JavaGlue y code.google.com/p/javaglue
sdw
3
Casi 2 años después, ¿todavía considera que los SCons son lentos? Cuando estaba eligiendo un sistema de compilación, me encontré con esto y contribuyó a mi decisión de elegir SCons.
JBentley
2
@Ben, eso es cierto, pero también es lento.
charley
2
Cualquiera que vea esto debería considerar Meson (que usa ninja).
Matthew D. Scholefield
33

Puede usar Gradle ahora: https://docs.gradle.org/current/userguide/native_software.html

Esto parece haber madurado bastante en los años transcurridos desde que publiqué esto originalmente. La página que dice que el proyecto está "incubando" ha desaparecido, pero no puedo encontrar ningún anuncio oficial que elimine este estado.

Nate Glenn
fuente
Estoy de acuerdo con Gradle. Gradle está diseñado para ser escalable. Sin embargo, depende de la implementación del complemento lo rápido que sea. También hay algo de gastos generales para gradle. También tenga en cuenta que algunos complementos pueden necesitar ser personalizados para sus casos de uso.
JE42
Interesante ver el interés de gradle en soportar C ++. Espero que produzcan un sistema de construcción agradable y sólido para proyectos de c ++ que todos nos faltemos.
hbobenicio
@quid gracias, actualizado.
Nate Glenn
1
Gradle es poderoso pero simple. Sin sintaxis extraña, un solo archivo gradle.build a menudo es suficiente para construir un proyecto completo con múltiples salidas ejecutables (principal, pruebas, etc.). Sin volcado de archivos en todos los directorios fuente. Súper amigable para versionar.
Overdrivr
1
Pasé los últimos dos días luchando con Gradle, solo tratando de crear una biblioteca, aplicación y gtests "hello world", y no puedo decir que pueda recomendarlo para un nuevo proyecto. Puede que todas las herramientas estén allí, pero la documentación no (dando el beneficio de la duda). ¿Quizás aquellos de ustedes que lo encuentran viable podrían señalar sus recursos favoritos?
jwm
16

Encontré estos, aún no los he usado personalmente:

Ninja , un pequeño sistema de construcción centrado en la velocidad. Google ahora usa Ninja para construir Android en lugar de Make: link .

Shake , un sistema de construcción potente y rápido.

Tup , un sistema de construcción de alto rendimiento. Diseño basado en algoritmos . Análisis de Tup .

Todos ahora son multiplataforma y son compatibles con Windows. Todavía no estoy seguro sobre el resto de sus requisitos, ya que, nuevamente, todavía tengo que probarlos yo mismo. Están siendo utilizados en el desarrollo comercial, CIG recogió a Ninja. He usado y amo la facilidad y velocidad de Ninja con un generador de proyectos. Los dos primeros son similares a Scons, Ant, etc.

leetNightshade
fuente
1
Tup desordenará las búsquedas de símbolos, no funciona bien con ningún otro sistema de compilación (en absoluto, realmente), no juega bien con salidas aleatorias (como las clases generadas javaccon clases internas, que están separadas en class$1.classarchivos), es mal escrito y utiliza hacks del sistema para lograr lo que hace. Es genial para sistemas pequeños; insostenible para proyectos más grandes.
Qix - MONICA FUE MAL TRATADA el
@Qix: ¿No puede mantener la salida separada de su repositorio?
Kerrek SB
1
@KerrekSB Puede, pero ese no es el problema con la búsqueda de símbolos. Tup usa FUSE y monta su propio middleware .tup/mnt. Luego ejecuta todos los programas de compilación en una carpeta (es decir, .tup/mnt/@tupjob-XXXXXcomo el directorio de trabajo) para monitorear las lecturas / escrituras, aplicando la configuración de compilación. Funciona bien, a menos que la ruta se almacene absolutamente (es decir, con símbolos). Cuando compila un binario, la ruta del símbolo se almacena en el propio binario. Eso significa que cuando GDB intenta cargar los símbolos, busca esa tupjobruta, que no existe y causa errores.
Qix - MONICA FUE MAL TRATADA el
Tanto Tup como Ninja son herramientas de muy bajo nivel, tan bajas o incluso más bajas que Make. No están diseñados para C ++. Ni siquiera llamaría a estas herramientas sistemas de construcción por sí mismos porque les faltan muchas características importantes de alto nivel que los verdaderos sistemas de construcción ofrecen para hacer frente a proyectos complejos del mundo real. Algunos de estos sistemas pueden usar Ninja como back-end.
Johan Boulé
11

Scons es un sistema muy amigable y flexible, pero tienes razón, Lothar, es muy lento.

Pero hay una manera de aumentar el rendimiento de los programas escritos en Python. Este uso del JIT. De todos los proyectos conocidos, PyPy es una implementación de Python 2.7 muy poderosa, de rápido crecimiento y respaldada por JIT. La compatibilidad de PyPy con Python 2.7 es simplemente increíble. Sin embargo, Scons declarado como proyecto sin apoyo en la compatibilidad wiki PyPy . Waf , por otro lado, modelado como sucesor de herramientas automáticas basado en Python, es totalmente compatible con la infraestructura PyPy. En mis proyectos, la velocidad del ensamblaje ha aumentado 5-7 veces en la transición a PyPy. Puede ver los informes de rendimiento de PyPy .

Para un sistema de construcción moderno y relativamente rápido, Waf es una buena opción.

Aegor
fuente
Vale la pena señalar que scons ahora está marcado como "Compatible" en la página wiki vinculada, por lo que aparentemente ahora funciona con PyPy.
Nombre falso el
8

El sistema de compilación de Google es una buena alternativa: http://bazel.io/

Mike B
fuente
3
"Multiplataforma (Linux como objetivo principal, pero capaz de construir al menos también en Windows)". Las preguntas frecuentes de Bazel dicen: "Actualmente estamos trabajando activamente para mejorar la compatibilidad con Windows, pero aún es muy difícil de usar".
Michael Mrozek
3
No estoy seguro de si es el sistema en sí mismo o el tipo que configuró el proyecto, pero tuve un gran dolor en la espalda al usarlo @ trabajo. Es muy poco flexible (en el sentido de que solo admite una forma de hacer cosas, a menudo subóptima, si no espeluznante), no lo suficientemente potente, mal documentado (aparte de los casos básicos), tiene poca comunidad, así que no esperes que el stackoverflow venga a salvarte , una gran dependencia en sí misma, no juega bien con la mayoría de los IDE en la mayoría de los sistemas, etc., etc. Así que, a menos que sea un fanático de Google, manténgase alejado de él (por cierto, hay una versión de Facebook de esto, llamada Buck) para los fanáticos de Facebook)
Slava
Oye, me pareció muy fácil de usar después de pasar 6 semanas tratando de hacer que CMake funcione. Quería que descargara las dependencias de terceros y las compilara (ya que estaba acostumbrado a crear buenas herramientas desde python y JavaScript). Esto lo hizo fácil, pero tiene el inconveniente de que es posible que tenga que escribir sus propios archivos bazel para terceros que no lo admiten. Necesitan un repositorio central para almacenarlos en mi opinión.
CpILL
6

Usé SCons y estoy impresionado por este sistema de compilación. SCons es extensible por Python y Python en sí mismo, es genial, porque Python tiene todo lo que necesita, solo codifique la lógica, toda la funcionalidad de bajo nivel ya está implementada en SCons y Python y es de plataforma cruzada. Si tiene buenas habilidades de programación, sus scripts de compilación se verán perfectos y fáciles.

Make, CMake y sistemas de compilación similares parecen basura de macros. Waf es SCons analógico. Estoy probando Waf pero SCons será más amigable, así que me quedé con SCons.

Por opinión de la multitud, SCons es demasiado lento, pero en medio de un proyecto no vi ninguna diferencia entre make y SCons por velocidad de construcción. En cambio, SCons ha trabajado bien con compilaciones paralelas, mientras que make tiene grandes problemas con él.

Además, SCons le permite obtener: configurar, construir, implementar, generar configuración a partir de plantillas, ejecutar pruebas y realizar cualquier otra tarea que se pueda hacer, puede codificar con Python y SCons, todo en uno. Esa es una gran ventaja.

Para un proyecto simple, CMake también es una buena opción.

Torsten
fuente
3
Mi problema aquí es que estoy mimado. Soy un desarrollador de Java de profesión, y herramientas como Gradle en el mundo de Java son el tipo de herramientas que realmente me gustaría tener para el desarrollo de C ++. Puedo configurar un proyecto gradle, sin dependencias externas, usando un archivo de construcción de una sola línea. Eso es. Los proyectos de varios módulos que tienen numerosas dependencias también son fáciles de hacer, y en realidad pesan mucho menos configuración que incluso un simple proyecto de C ++ ...
Graham
Tuve problemas para construir otros paquetes que usan Scons porque no abstrae indicadores de configuración del sistema como -I incluyen directorios y directorios de biblioteca -L. No tomará CFLAGS, a menudo tiene que modificar cada script de scons para que se vea en el lugar correcto.
Acíclico
5

solo para agregar mis centavos: premake

http://industriousone.com/premake

También hay una página web dedicada en la wiki.

usuario827992
fuente
2
Lamentablemente, Premake no admite la generación de código según los requisitos de OP. Y no llamaría a su soporte para pruebas de unidad "decente", aunque hay algunas cosas que puede hacer.
ergosys
@ergosys Noto que Ant no se menciona, anttambién es compatible con C / C ++, vea si esto es bueno para usted, es el apellido que tengo, solo uso Makefiles y Cmake para esto.
user827992
2

Puedes usar Ceedling . Sin embargo, tenga en cuenta que solo admite C en este momento y está estrechamente acoplado a los marcos de prueba de Unity y CMock del autor.

Se puede bifurcar y modificar para que funcione con un compilador de C ++ y un marco de prueba / simulación de unidades con bastante facilidad.

También Tup es una mención digna. Es extremadamente rápido, pero no sabe nada acerca de probar marcos, etc., lo que significa que tendrá que escribir su propio sistema de compilación usando Tup. Si planeas hacer TDD, Tup es probablemente el camino a seguir.

thegreendroid
fuente