En este breve artículo vamos a mostrar cómo usar CMAKE para compilar programas de cualquier complejidad.
Para ello vamos a utilizar la herramienta g++ como compilador (en el resto de ejemplos vamos a tratar de usar siempre g++).
Comencemos por generar un archivo de código fuente en C++ como el ejemplo que se presenta a continuación:
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; }
Si necesitas una breve introducción a C++ puedes empezar por aquí.
Llama a este archivo de código fuente hello.cpp.
Ahora necesitarás un archivo CMAKE por lo que puedes crear uno escribiendo lo siguiente desde la consola:
touch Makefile
Con el siguiente contenido:
CC = g++ all: hello hello: hello.o ${CC} -o hello hello.o hello.o: hello.cpp ${CC} -c hello.cpp clean: rm hello.o hello
Es importante señalar que se deben usar tabulaciones en vez de espacios para indentar los comandos.
A pesar de que se trata de un simple programa Hello World! el ejemplo resulta útil para ver como se estructura un archivo makefile.
De forma simplificada, se puede decir que un archivo makefile define una serie de reglas, que se componen de prerrequisitos y comandos.
La primera regla, all, tiene como prerrequisito a hello. Esta regla carece de comando.
La segunda regla, hello, tiene como prerrequisito a hello.o y como comando:
${CC} -o hello hello.o
La tercera regla, hello.o, tiene como prerrequisito al archivo hello.cpp y un comando para compilar:
${CC} -c hello.cpp
La última regla, clean, tiene como comando una instrucción para eliminar tanto hello como hello.o forzando así una nueva compilación en la próxima ejecución.
Ahora por lo tanto podríamos compilar el programa sin problemas mediante el archivo makefile que hemos creado introduciendo el comando:
make
Lo cuál nos dejaría el binario compilado y enlazado, solamente tendríamos que ejecutarlo con:
./hello
Este ejemplo únicamente nos ha mostrado unos conceptos muy básicos sobre los archivos makefile y la utilidad make
. Otros casos de uso más complejos son:
- Uso de macros: Un makefile permite el uso de macros, que aparecen como variables. Éstas a su vez pueden ser usadas para dar más modularidad al makefile, como por ejemplo:
- Macros para las librerías dinámicas usadas en el programa:
LIBS = -lasd -lfgh
- Macro para el compilador:
COMPILER = GCC
- Puedes usar como referencia esas macros en cualquier parte del makefile:
${COMPILER} o ${LIBS}
- Macros para las librerías dinámicas usadas en el programa:
- Cuando tecleas
make
en la terminal, la primera regla definida el el makefile será ejecutada. En nuestro ejemplo era all. Si lo hubiéramos cambiado por clean por ejemplo se habría ejecutado esa regla. Como norma general siempre es deseable ejecutarmake
con algún parámetro a continuación, por ejemplo:make clean
.
¡Si tienes alguna pregunta no dudes en dejar tus comentarios!