Sistemas de compilación. Más allá del simple configure, make, make install

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.


Deja tu comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*

*

  1. Responsable de los datos: Miguel Ángel Gatón
  2. Finalidad de los datos: Controlar el SPAM, gestión de comentarios.
  3. Legitimación: Tu consentimiento
  4. Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal.
  5. Almacenamiento de los datos: Base de datos alojada en Occentus Networks (UE)
  6. Derechos: En cualquier momento puedes limitar, recuperar y borrar tu información.

      abimaelmartell dijo

    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!

         AdrianArroyoCalle dijo

      ¡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.

      Chuck Daniels dijo

    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.

      Huesos dijo

    ‘make check’ sirve para revisar la compilacion despues de usar make
    Saludes