Todos o casi todos (y si no eres afortunado) hemos tenido que compilar desde el código fuente un programa. Realmente en la mayoría de proyectos basta con hacer un ./configure && make && make install para instalar el programa, pero vamos a ver las diferentes alternativas:
GNU Make
GNU Make es un sistema de compilación de bajo nivel, se configuran pocas cosas y no se realiza ningún test:
Pros:
- Muy extendido
- Simple de entender
- Rápido
Contras:
- Poco configurable
- Difícil de mantener
- No realiza tests
make
BSD Make
BSD Make es otra versión de Make que actualmente usan los sistemas operativos *BSD. Difiere en GNU Make siendo el BSD Make más amplio en funcionalidades aunque está menos extendido.
Pros:
- Rápido
- Simple de entender
- Más funcionalidades que GNU Make
Contras:
- Poco extendido en el mundo Linux
- No realiza tests
- Poco configurable
- Difícil de mantener
make
Autotools
Autotools es el sistema oficial de GNU y genera un script llamado configure que debemos llamar para generar el correspodiente Makefile de GNU Make. Está ampliamente extendido sin embargo cada vez más gente (yo me incluyo) piensa que es un sistema demasiado engorroso, difícil, lento y poco compatible.
Pros:
- Altamente configurable
- Muy extendido
Contras:
- Poca portabilidad entre sistemas No-UNIX
- Realiza demasiados tests (verifica TODO, y TODO es TODO)
- Muy lento al configurar
- Mala retrocompatibilidad
./configure && make
CMake
(Mi sistema preferido) CMake es un sistema que viene a suplir las carencias de Autotools en muchos aspectos como su pésima retrocompatibilidad y portabilidad. Mejorando además el sistema de tests que son muy configurables para las necesidades de cada proyecto. Lo cierto es que cada vez más proyectos usan CMake como por ejemplo KDE, PortAudio, Ogre3D, etc. Podemos reconocer este tipo de sistemas gracias a un archivo CMakeLists.txt que generará un Makefile o un proyecto para Eclipse o CodeBlocks
Pros:
- Rápido
- Gran soporte multiplataforma
- Se pueden definir los test de una manera muy personalizable
Contras:
- Difícil de entender al principio
- Se debe trabajar con una abstracción que al principio puede asustar
- Poco extendido aunque poco a poco va a más
cmake . && make
QMake
QMake es un sistema diseñado por Trolltech para compilar proyectos hechos en Qt. De este modo qmake enfatiza mucho en Qt y suele ser el formato usado por IDEs como QtCreator. Es bastante popular en proyectos Qt pero no se encuentra fuera de este entorno:
Pros:
- Muy bien integrado con Qt
- Rápido
- Buena multiplataforma dentro de Qt
Contras:
- Poco común fuera de aplicaciones Qt
qmake . && make
SCons
SCons es un sistema basado en Python para compilar los proyectos de C/C++. Al contrario que Autotools, CMake o QMake; SCons no construye un Makefile. SCons es muy modificable pero es quizá el más lento en operaciones sencillas
Pros:
- Fácil modificación
- Realiza los test justos
Contras:
- Poco extendido
- Lento
scons
Boost.Jam
Boost.Jam es una versión de Perforce Jam que se usa en las populares librerías de C++ Boost, aunque el sistema de compilación puede usarse por separado. Al contrario que GNU Make, Boost.Jam usa Jamfiles, que son una versión mejorada de los Makefiles. Son bastante populares en el ambiente BeOS/Zeta/Haiku.
Pros:
- Rápido
- El más corto de escribir
Contras:
- Poco extendido
- Dificultad para realizar tests
bjam
Ninja
Ninja es un sistema desarrollado por Google para proveer de un sistema de compilación ultrarápido diseñado originalmente para ser el del proyecto Chromium. Ninja no está diseñado para ser fácil de modificar, según sus mismos autores se debe buscar un sistema que genere a Ninja. Los recomendados son CMake y gyp.
Pros:
- Muy rápido
Contras:
- Necesitas otro sistema para generar a Ninja
- Poco extendido
ninja
Otros
Puedes usar cualquier otro sistema como por ejemplo tu propio script de Bash o de Python. También hay generadores de otros lenguajes no-nativos que pueden ser usados como Gradle, Maven, gyp, etc.
Make no es un sistema de compilacion, es un generador de binarios (o targets) desde su codigo fuente. Tambien se puede usar como ejecutador de tareas.
Difiero contigo en que el BSD make es mas amplio en funcionalidades, el GNU make es mas completo, tiene mas funcionalidades. Y lo digo por experiencia propia, en BSD siempre tengo que instalar GNU make porque el make de BSD es muy sencillo en comparación con el de GNU.
Concuerdo contigo en que Autotools es bastante engorroso, prefiero usar solamente el Makefile. Los makefiles generados por Autotools son difíciles de debugear.
Saludos!
¡Gracias por comentar!
Desde mi opinión GNU make ha sido siempre más tradicional y fiel al programa original make y BSD make siempre ha sido más innovador pero puede ser que yo me haya fijado en otras cosas al hacer la comparación.
Realmente las autotools son un problema de cabeza muy grande. Como colaborador del sistema operativo Haiku he tenido que portar software con autotools y es un infierno. No son pocos casos los que terminaba antes creando el Makefile o el CMakeLists.txt antes que arreglar ese estropicio.
Yo actualmente estoy utilizando Premake4, muy configurable y simple basado en scripts en Lua. Echale un ojo si no lo conoces.
Felicidades por el artículo, simple y conciso, excelente referencia.
‘make check’ sirve para revisar la compilacion despues de usar make
Saludes