index.html (3869B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5 <meta name="viewport" content="width=device-width, initial-scale=1" /> 6 <title>De las herramientas make y cmake</title> 7 <link rel="icon" type="image/png" href="/favicon.png" /> 8 <link rel="stylesheet" type="text/css" href="../article.css" /> 9 </head> 10 <body> 11 <header> 12 <p class="title">De las herramientas make y cmake</p> 13 <p class="date">1 de mayo de 2016 • fjbalon</p> 14 </header> 15 <p>Make es una herramienta de gestión de dependencias usada en entornos de la familia UNIX. Es una buena práctica para compilar de forma automatizada códigos compuestos y complejos, por ejemplo en códigos compuestos de códigos C en distintos ficheros con distintos ficheros de cabecera <emb>.h</emb>.</p> 16 <p>Para preparar el funcionamiento de make es necesario crear un fichero, en el cual se especifica y se configura todo lo necesario para el proceso. Este fichero es denominado makefile. Podemos decir que son las instrucciones que make debe realizar.</p> 17 <p>Como añadido, make entiende los formatos y extensiones, dando una respuesta apropiada a cada tipo de archivo.</p> 18 <p>El formato genérico para un makefile es el siguiente:</p> 19 <pre><code>VARIABLES 20 ... 21 22 OBJETIVO: DEPENDENCIAS 23 COMANDO 24 ...</code></pre> 25 <p>Un makefile simple para realizar con make la compilación de un programa C sería similar al siguiente:</p> 26 <pre><code>hola: hola.c 27 gcc -o hola hola.c -I.\end{lstlisting} 28 29 Podemos mejorarlo aún más para que sólo compile los ficheros que han cambiado desde el 30 último make, para ello sería similar al siguiente: 31 32 \begin{lstlisting}[language=make] 33 # Vease el cambio de los ficheros .c a .o. 34 # Internamente make sabe que los .o son .c 35 # y asi los busca y compila; ignorando los 36 # encabezados. 37 CC=gcc 38 CFLAGS=-I. 39 40 hola: hola.o 41 $(CC) -o hola hola.o</code></pre> 42 <p>En este caso si hiciéramos cambios en alguna de las cabeceras <emb>.h</emb> make no recompilaría los códigos C <emb>.c</emb>. Si quisiéramos, como generalmente debería ser, que esto ocurriese:</p> 43 <pre><code>CC=gcc 44 CFLAGS=-I. 45 DEPS = hola.h 46 47 %.o: %.c $(DEPS) 48 $(CC) -c -o $@ $< $(CFLAGS) 49 50 hola: hola.o 51 $(CC) -o hola hola.o</code></pre> 52 <p>Podemos mejorar el makefile añadiéndole más acciones, como una acción \textit{clean} para limpiar la compilación.</p> 53 <pre><code>CC=gcc 54 CFLAGS=-I. 55 DEPS = hola.h 56 57 %.o: %.c $(DEPS) 58 $(CC) -c -o $@ $< $(CFLAGS) 59 60 hola: hola.o 61 $(CC) -o hola hola.o 62 63 clean: 64 rm -f hola hola.o</code></pre> 65 <p>E incluso podemos hacerlo más genérico y escalable declarando los nombres de los ficheros en forma de variable:</p> 66 <pre><code>CC=gcc 67 CFLAGS=-I. 68 DEPS = hola.h 69 OBJ = hola.o 70 71 %.o: %.c $(DEPS) 72 $(CC) -c -o $@ $< $(CFLAGS) 73 74 hola: $(OBJ) 75 $(CC) -o $@ $^ $(CFLAGS) 76 77 # Podemos usar .PHONY para indicarle a 78 # make que el target clean en este caso 79 # es ficticio y no debe crear fichero; 80 # ya que si existiera un fichero llamado 81 # clean en el directorio no trabajaria. 82 .PHONY: clean 83 clean: 84 rm -f $(ODIR)</code></pre> 85 <p>Por otro lado, el <b>procedimiento CMake</b> (véase <a href="https://cmake.org">cmake.org</a>) o <i>Cross Platform Make</i> es una utilidad multiplataforma de automatización de código, que permite construir, probar y empaquetar el software. Es, en otras palabras, una suite de herramientas independientes de más alto nivel que make, y que facilita la compilación de programas C. Por ejemplo, para un fichero CMake <emb>CMakeList</emb>:</p> 86 <pre><code># Version minima requerida 87 cmake_minimum_required (VERSION 2.8) 88 # Nombre del proyecto 89 project (Hola) 90 # Ficheros a agregar 91 add_executable(hola hola.c)</code></pre> 92 <p>Para ejecutar CMake simplemente llamamos a su comando propio seguido del fichero CMake: <emb>cmake CMakeList</emb>. La salida de este comando será un makefile.</p> 93 </body> 94 </html>