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:
- Soporte de C ++ 11
- Multiplataforma (Linux como objetivo principal, pero capaz de construir al menos también en Windows)
- Soporte de prueba de unidad decente
- Soporte para múltiples módulos para separar código
- Soporte para la generación de código (Uso de asn1c o protobuf, aún no es 100% seguro)
- 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?
Respuestas:
+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íaCMake
. 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
CMake
o algo con una API rica para sus propias extensiones, comoScons
(oWaf
).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 laScons
intenció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. SinScons
embargo, 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]
Scons
funciona 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
qmake
se escribió, para elmoc
preprocesamiento de*.hpp/*.cpp
archivos).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 "
fuente
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.
fuente
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.
fuente
javac
con clases internas, que están separadas enclass$1.class
archivos), 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..tup/mnt
. Luego ejecuta todos los programas de compilación en una carpeta (es decir,.tup/mnt/@tupjob-XXXXX
como 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 esatupjob
ruta, que no existe y causa errores.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.
fuente
El sistema de compilación de Google es una buena alternativa: http://bazel.io/
fuente
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.
fuente
solo para agregar mis centavos: premake
http://industriousone.com/premake
También hay una página web dedicada en la wiki.
fuente
ant
tambié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.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.
fuente