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.