2009-06-23 21 views
20

Estoy buscando en scons y solo quiero asegurarme de saber cuáles son las alternativas, antes de invertir un pedazo de células cerebrales en algo completamente diferente. He estado usando GNU make en el pasado pero nunca he estado particularmente feliz con eso.ant + cpptasks vs. scons vs. make

Particularmente: ¿por qué no se usa Ant con mayor frecuencia en proyectos C/C++? (dado que hay ant cpptasks) Leí algunas publicaciones que dicen que Ant está más orientado a Java (obviamente), pero ¿cuál es el inconveniente de hacerlo? ¿Y por qué es mucho mejor que hacer?

Estoy trabajando con un compilador cruzado para TI DSP, normalmente hay 20-50 archivos cpp en un proyecto. Parecería que la parte más difícil en la administración de compilación es la comprobación automática de dependencias. Todo lo demás es solo un mapeo de listas de archivos junto con conjuntos de opciones de compilación.

editar: y por qué la compilación cruzada cambia algo? es un compilador que se ejecuta de la misma manera que gcc, solo que produce archivos/ejecutables de objetos que no se ejecutarán en mi PC.

Respuesta

25

Para la compilación cruzada, creo que sus mejores opciones son CMake o Autotools. Especialmente si puede compilar su código para múltiples arquitecturas/plataformas. Por lo general, compilo un subconjunto de mi código en la máquina nativa para fines de prueba de la unidad y todo para la plataforma de destino. CMake maneja esto especialmente bien, ya que le permite especificar dónde viven las bibliotecas compiladas cruzadas. Entonces, en lugar de buscar el libpng compilado cruzado en/usr/lib, se le puede decir que busque en/opt/arm-eabi-gcc/o donde tenga las bibliotecas de la cadena de herramientas instaladas en su máquina de compilación. Puede crear múltiples directorios de compilación para las diferentes variantes y compilar manualmente cada variante con make, o activar el lote con una marca recursiva hecha a mano braindead.

Ant tiene la desventaja de que es básicamente tan bueno o tan malo como Make de vainilla, con la desventaja adicional de que está utilizando algo que no es particularmente convencional para C o C++. Debe tratar con todas sus propias dependencias, tanto las internas, como el archivo C, el archivo de encabezado, la biblioteca o el ejecutable, como también las dependencias externas, como tener que vincularse con bibliotecas de terceros. Además, no creo que las tareas Ant C realmente se mantengan así. Todos los que he visto que usan Ant para C recomiendan llamar a GCC con tareas ejecutivas.

SCons es mejor, pero la compilación cruzada no es su punto fuerte. Tampoco es un "sistema de compilación" como CMake o Autotools, solo es una herramienta de compilación. Como dice en su wiki, it is pretty much "Make in Python". Sin embargo, sí se ha integrado en el manejo de las dependencias, lo que significa que no tiene que hacer las suyas allí con "gcc -MM -MD" o lo que sea, por lo que es una ventaja sobre Make. SCons también tiene soporte para detectar bibliotecas de terceros que están instaladas, pero la forma en que generalmente se hace puede agregar mucho a su tiempo de compilación. A diferencia de otros sistemas, SCons ejecuta la etapa de comprobación cada vez que lo ejecuta, aunque la mayoría de los resultados se almacenan en caché. SCons también es famoso por sus largos tiempos de compilación, aunque para 50 archivos eso no sería un problema. El soporte de compilación cruzada en SCons es inexistente: debe desplegar su propio as discussed on this thread on the mailing list. Por lo general, fuerza la compilación para que sea como una plataforma Unix, y luego anula el nombre del compilador de C. Crear múltiples variantes o separar el directorio de compilación del directorio de origen está lleno de errores, lo que lo hace menos adecuado si cruza y compila de forma nativa su código.

CMake y Autotools tienen los problemas de dependencia resueltos bastante bien, y el soporte de compilación cruzada de autotools está maduro. CMake ha tenido una compilación cruzada desde la versión 2.6.0, que se lanzó en abril de 2008. Obtiene esas características de forma gratuita, además de otras como el empaquetado y la ejecución de pruebas unitarias ("hacer comprobaciones" u objetivos similares). La desventaja de ambas herramientas es que requieren un arranque.En el caso de CMake, debe tener instalado el binario de CMake para crear los archivos de la solución Makefiles o Visual Studio. En el caso de Autotools es un poco más complicado porque no todos los que compilan el software necesitarán instalar automake y autoconf, solo aquellos que necesitan cambiar el sistema de compilación (agregar nuevos archivos cuenta como cambiar el sistema de compilación). El arranque de 2 etapas (configure.ac -> configure, configure + Makefile.in -> Makefile) es conceptualmente un poco más complicado de entender.

Para la edición: La compilación cruzada es un dolor de cabeza extra en los sistemas de compilación porque agrega complejidad a la autodetección de programas y bibliotecas. SCons no se ocupa de este problema, eso depende de usted para resolverlo. Ant de manera similar no hace nada. Autoconf maneja esto en el caso autotools, pero es posible que deba proporcionar "--with-libfoobar =/some/path" en la línea de comandos cuando configura o enfrenta enlaces rotos cuando intenta usar/usr/lib en la fase de enlace . El enfoque de CMake es un poco más pesado con el archivo toolchain, pero significa que no tiene que especificar todas las herramientas y librerías (CC, CXX, RANLIB, --with-ibfoo =, etc.) tal como se descifran de una convención estándar. En teoría, puede reutilizar un archivo CMake toolchain adecuadamente diseñado en múltiples proyectos para realizar una compilación cruzada. En la práctica, CMake no está lo suficientemente extendido como para hacer que esto sea conveniente para un hacker promedio, aunque puede ser útil si está creando múltiples proyectos de propiedad.

1

Ant tiene una base de usuarios muy pesada de Java (por razones naturales). El hecho de que Ant puede ser muy útil en un entorno mucho más amplio es algo que la mayoría de los desarrolladores que no son de Java desconocen. Como resultado, si usa Ant para construir su C/C++ - codifique mucho más usted mismo que si usa un sistema con una base de usuarios más grande (CMake o SCons).

Personalmente, he estado muy contento con CMake, principalmente porque es el único sistema de compilación que puede generar proyectos reales de Visual Studio. SCons también puede hacerlo, pero solo hacen una llamada externa a SCons, mientras que CMake genera proyectos que usan el propio motor de compilación de Visual Studio. Esto es muy útil si está trabajando junto con personas que están acostumbradas a Visual Studio.

No estoy seguro de que llame al soporte de CMake para crosscompilation "maduro", ya que todavía es bastante joven. Pero la gente de CMake lo dice en serio, así que no dudaría en probarlo.

6

He usado Ant + CppTasks hace muchos años para construir bases de código muy grandes integradas en el nuevo código Java a través de JNI, y estaba muy satisfecho con el resultado de construcciones incrementales muy confiables de código C++, buena flexibilidad (en archivos de compilación, o a través de ajustes al código). PERO, CppTasks es un proyecto sin comunidad y el mantenedor (Curt Arnold) no ha hecho nada con él durante mucho tiempo. Sigue siendo muy bueno y útil, pero ten en cuenta que muy pocas personas conocen o usan CppTasks (la forma en que los compiladores "pujan" por archivos me pican, por ejemplo, cuando necesitaba un compilador específico para archivos C, y el compilador diferente de C++ los recogía) en lugar).

La forma en que CppTasks realiza un seguimiento de las opciones de compilación y escanea dinámicamente las fuentes para las dependencias de encabezado, todo lo suficientemente rápido (hay almacenamiento en caché de dependencias), significaba que el único sistema con el que trabajé tenía compilaciones incrementales precisas. algo muy importante al construir bases de código muy grandes.

Así que como he dicho un par de veces en las listas de usuario/dev Ant, si usted tiene un montón de cosas de Java y ya tienen una inversión en Ant, y no tienen miedo de sumergirse en el doc y el código de CppTasks, y ahora necesita construir el código "pegamento" de JNI, y/o las bibliotecas nativas "heredadas" que expone el código de pegamento, es un competidor que vale la pena, y las recompensas pueden ser grandes.

Integré fácilmente <rc> para Windows dll para agregar información de la versión completa, por ejemplo, escribir una pequeña tarea Ant para formatear correctamente el archivo .res.Me funcionó, pero Ant + CppTasks definitivamente es más para el usuario/desarrollador Ant "avanzado" en mi humilde opinión.

Espero que esto ayude. --DD

3

Me gustaría recomendar terp para la construcción de proyectos en C++ de ANT. Desarrollamos terp porque ANT es nuestra herramienta de compilación elegida y los CppTasks se estaban haciendo un poco largos en el diente y porque queríamos trabajar en un nivel diferente de abstracción. terp admite una gran cantidad de compiladores diferentes y es compatible con nuestra empresa. Para la mayoría del proyecto, no es gratuito.

Diseñamos terp principalmente para reconstrucciones completas en lugar de versiones incrementales con análisis de dependencia. Estamos llegando, pero todavía no está allí. El punto ideal para terp es en versiones multiplataforma, multi-procarch, multi-compilador donde no desea mantener n configuraciones diferentes para todas las combinaciones. En este momento (julio de 2009) está en versión beta pública, pero se lanzará pronto.

2

He estado trabajando en un proyecto en los últimos cinco años que hace x86 y armar compilaciones usando hormiga. Pusimos cpptasks para nuestros propósitos para producir un compilador genérico que acabamos de pasar en un prefijo ... como arm-gum-linux-gnueabi- y luego eso se antepone a la herramienta real, como g ++ o ar o lo que sea. Sin prefijo significa que obtiene las herramientas de desarrollo de plataformas de desarrollo. Las cadenas de herramientas para la compilación cruzada tienen esos prefijos en sus binarios de herramientas de compilación. Casi todo el motivo de ir con Ant en lugar de hacer algo basado fue la capacidad de las cpptasks para hacer compilaciones intrarregionales y la maraña de cosas que tiene que suceder para mantener feliz a autoconf. Podemos respaldar el paradigma de que casi cualquier archivo fuente, especialmente aquellos en una estructura de árbol de carpetas para un conjunto de bibliotecas, se puede crear/renombrar/eliminar y no es necesario realizar modificaciones en los archivos de compilación. Un pequeño inconveniente es que vincular archivos actualiza las propiedades de una manera que provocará una reconstrucción innecesaria.

<target name="lib.cvp"> 
<fetch.and.log.version 
    svnvers.target="common/cvp" 
    svnvers.property="libcvp.version"/> 
    <cc objdir="${obj.dir}/common/cvp" 
     commandPrefix="${command.prefix}" 
     compilerName="${compiler.name}" 
     outfile="${lib.dir}/cvp" outtype="static"> 
     <compiler extends="base.compiler"/> 
     <compilerarg 
      value="-D__CVP_LIB_BUILD_VERSION__=&quot;${libcvp.version}&quot;"/> 
     <compilerarg 
      value="-D__BUILD_NOTES__=&quot;${libcvp.toolversion}&quot;"/> 
     <compilerarg if="is.x86" value="-DARCH_X86"/> 
     <linker extends="base.linker"/> 
     <includepath refid="common.inc"/> 
     <fileset dir="${project.home}/common/cvp"> 
      <include name="*.c"/> 
      <include name="*.cpp"/> 
     </fileset> 
    </cc> 
</target> 
Cuestiones relacionadas