El documento explica cómo usar Make y archivos Makefile para compilar programas divididos en múltiples archivos y directorios. Se crea un proyecto de ejemplo llamado "holamundo" con varios módulos y se explica cómo crear y llenar los archivos necesarios como Makefile, código fuente y scripts para automatizar la compilación.
el CTE 6 DOCENTES 2 2023-2024abcdefghijoklmnñopqrstuvwxyz
Ejemplo práctico de uso de Makefile en LINUX (Compilando modulos de holamundo con C)
1. Makefile (Archivo de descripción de
compilación)
Iván Luis Jiménez
14 de agosto de 2015
1
2. Introducción
El compilar un programa es sencillo si este consta de un sólo archivo. En la
práctica no es funcional tener un sólo archivo para un programa, tarde o tem-
prano el tamaño del programa se hará inmanejable.
Se dificulta que varios programadores trabajen simultáneamente en el programa,
se debe dividir un programa en varios archivos, pero el hacer esto deficulta su
compilación.
La herramienta make facilita la tarea de compilación de un programa dividido
en varios archivos.
Todo lo mencionado es aplicado a un entorno de desarrollo creado propiamente
por el programador, es decir, sin usar un IDE (entorno de desarrollo integrado).
2
3. Make
Es una utilería de UNIX que genera y ejecuta comandos de shell de UNIX.
Make automáticamente guarda un registro de los archivos que han cambiado y
recompila cuando es necesario. Ahorra tiempo de desarrollo.
Makefile
El make usa un archivo de descripción, conocido como makefile o Makefile, y
algunas plantillas generales para determinar las dependencias entre los archivos.
De este archivo make deduce la información necesaria de la hora de la última
modificación de los archivos como esta registrada en el sistema de archivos.
Como hemos entendido, el makefile o Makefile nos ayudará a decirle a make
como es que debe tratar a un archivo o directorios.
3
4. Hola Mundo!
El objetivo de éste documento es enseñarte cómo compilar varios módulos de un
programa escrito en C usando la herramienta make, auxiliandonos del archivo
makefile. También lo podemos hacer para C++, sólo tendremos que modificar
algunas lineas en el makefile, pero no lo mostraré en éste documento.
En nuestro ejemplo práctico veremos como compilar varios módulos de un pro-
grama escrito en C.
Los módulos estarán en varias carpetas, dependiendo de su función que realizará.
Nos apoyaremos de make y shells scripts para compilar todos los módulos y no
de uno en uno.
Al final se generarán dos ejecutables e imprimirán en terminal un mensaje de
hola mundo y otros mensajes, los verás al finalizar ésta práctica.
4
5. Entorno de Desarrollo
Para esta prática trabajaré con el sistema Linux, ya que éste trae preinstalado
la utilería make. En particular con Kali.
Con el comando:
make␣--version
Veremos la versión de make
Nuestro proyecto debe tener un arbol de directorios como se muestra en la sigu-
iente imagen:
Lo crearemos manualmente:
mkdir␣holamundo
cd␣holamundo
Con el comando mkdir:
creamos la carpeta holamundo.
Con el comando cd:
5
6. estamos ingresando a la carpeta holamundo.
Con los comandos:
ls
cd␣..
con ls podemos listar los directorios
con cd .. podemos retroceder un directorio atrás. Por ejemplo si me encuentro
dentro de la carpeta cv y tecleo cd .. regresaría nuevamente al directorio raíz o
principal de mi proyecto holamundo.
Bueno, ahora que ya sabes como crear una carpeta, ingresar en ella, listar y
moverte sobre los directorios, debes crear todo el árbol de directorios para poder
trabajar con el proyecto holamundo.
Que inicie la acción!
Una vez que tenemos el árbol de directorios creados procedemos a crear los
archivos, iré colocando el código en imagen para que no cometamos el error de
copiar y pegar el código.
Entramos a la carpeta fuente, es en ésta en la cual nos ocuparemos.
Yo sólo tengo cuatro carpetas, ustedes tendrán mas, pero para éste ejemplo
sólo ocuparemos éstas. No se enojen, al contrario, aprendieron.
Ahora entramos a la carpeta holamundo, ustedes no tendrán ningún archivo.
Su tarea ahora será crear los archivos siguientes: compilar.sh, holamundo.c,
LEE.ME, makefile
6
7. vemos que todos tienen extención, menos el makefile. Para crear los archivos
podemos hacerlo de varias maneras, yo les mostraré una.
El programa o modulo de VIM nos permite crear y editar archivos, entre muchas
otras cosas mas, utilizaremos este ya que también es muy fácil de conseguir.
En mi caso ya he creado los archivos.
Para crearlos usaremos la siguiente instrucción:
vim␣nombre_archivo
Vemos que es muy sencillo. Una vez que damos enter, la terminal pasará a
ser un editor de texto:
Si hemos creado el archivo makefile entonces teclearemos el siguiente código
dentro del archivo, para iniciar a escribir teclearemos la tecla i, de esta manera
el editor entenderá que vamos a insertar texto, en la parte inferior veremos un
mensaje que indica el modo en que nos encontramos, normal, insertar, coman-
dos o visual.
En modo normal sólo podemos navegar sobre el archivo pero no podemos editar
nada.
En modo insertar podemos agregar y eliminar texto.
En modo comandos podemos darle instrucciones como guardar, cerrar, y muchas
otras cosas mas.
En modo visual, nos mostrará algunas opciones visuales, cambiar el modo de la
ventana, abrir otro archivo en la misma terminal, etc.
VIM es un mundo. Paso a pasito!
Como dije, colocaremos el siguiente código dentro del archivo makefile:
7
8. De la linea 7 ala 12 estamos definiendo algunos macros, en nuestro lenguaje
sería como “variables”.
Linea 7 : estamos definiendo el compilador, como dije al inicio el ejemplo es-
tará escrito en el Lenguaje C, por lo tanto el compilardor será gcc. La variable
COMPILADOR puede cambiar, puede ser COM, COMPI o como queramos,
sólo que siempre debe ser en mayúsculas y siempre debe ser la primera linea en
el archivo.
Linea 8 : estamos definiendo una variable o macro FUENTE que indicará en
8
9. donde se encuentra cada archivo que vamos a compilar, los archivos .c deben
estar separados por un espacio, en el caso del archivo holamundo.c se encuentra
en el mismo directorio que el makefile por lo tanto no es necesario indicar la ruta,
pero el archivo saludo.c se encuenta en otro directorio, la cual se esta indicando
en la variable RUTA_SALUDO que no se encuentra definida en el makefile,
ésta variable es pasada desde el archivo compilar.sh, mas adelante explicaré este
archivo.
Linea 9 : en ésta linea estamos definiendo el tipo de objetos que vamos a leer
y que tipos de archivos vamos a obtener. En la linea 8 estamos definiendo
FUENTE que es en éste caso todos los archivos con extención .c, es decir, todo
los archivos fuente, seguido de la variable OBJS tenemos un signo igual, pesitos,
la variable FUENTE, dos puntos y la extención .c es decir se complementa el
archivo .c, éste sería el archivo entrante y depués del signo igual tenemos .o, que
vendría siendo el archivo objeto resultante. Con las dos últimas linea explicadas
estaríamos haciendo lo siguiente:
holamundo.c ruta/saludo.c holamudo.o saludo.o
En otras palabras estamos particionando el compilado de todos los archivos .c.
. Si lo hicieramos parte por parte sería:
gcc holamundo.c ruta/saludo.o -o holamundo.o saludo.o
Para ahorrarnos de escribir todo esto y para cada unos de los archivo que con-
forma el proyecto holamundo, realizamos el makefile.
Linea 10 : en ésta linea estamos creando la macro HEADER en la que se
guarda el nombre del archivo header que se incluirá en los archivos holamundo.c
y saludo.c
Linea 11 : en ésta linea estamos creando otra macro llamada LIB, en la que se
le está asignando la cadena util. En la compilación crearemos también librerías,
en nuestro caso propias de nosotros. La librería se llamará util.
Linea 12 : ésta linea guarda la ruta y el nombre del ejecutable final.
Las siguientes lineas son como “métodos”, pero se llaman dependencias, es decir,
están definidos para cuando el usuario al momento de compilar las necesite. De
lado izquierdo de los : tenemos el objetivo y a la derecha están los prerrequisi-
tos.
Para la linea 14 el objetivo sería $(PROG) y los prerrequisitos $(OBJS), después
de esta linea tenemos lo que realiza ésta dependencia, es decir, compilar. La
linea 15 se traducería de la siguiente manera:
gcc␣holamundo.c␣ruta_saludo/saludo.c␣-L␣ruta_lib␣-l␣nombre_lib␣-lm␣-o
Lo que esta haciendo es compilar, con -L indica la ruta de la librería a crear,
-l indica el nombre de la librearía, -lm indica que vamos a incluir una librearía
matemática y -o para cambiar el nombre del archivo de salida.
En la linea 16 se imprime un mensaje en consola, para indicar que a termi-
nado de compilar. El “método” anterior se ejecuta automáticamente al invocar
a MAKE.
Los “métodos” LIMPIA y BORRA se invocan hasta que el usuario los invoque.
9
10. La dependencia en la linea 26 -> .c.o también realiza algo similar a la linea
16, los asteriscos indican que todos los archivos que se encuentren en la ruta
indicada con -I serán compilados y se obtendrá archivos objetos.
Como podemos observar, los métodos sólo eliminan todos los archivos objetos
y el ejecutable.
La última linea no hace nada, simplemente “verifica la compilación”, checa que
exista la ruta de los archivos que se van a incluir.
NOTA: El archivo Makefile contiene una sintaxis, en el ejemplo se ve perfec-
tamente. Para indicar las operaciones de cada macro se debe dar los espacios
con tabuladores. Respetar los espacios que se observan, entre la definición de la
macro o el objetivo, dos puntos y los prerrequisitos.
Espero que hasta este punto ya tengas una idea de lo que es un archivo makefile
y cual es su función.
Ahora pasaremos a crear y llenar el archivo holamundo.c
Este archivo contiene código C. No explicaré el codigo completamente, sólo en
pocas palabras.
Creamos el archivo:
Tecleamos enter y presionamos la tecla i para impezar a teclear el código sigu-
iente:
10
11. Sólo mandamos a invocar los métodos en el método main.
Para guardar los cambios tecleamos :w para guardar los cambios, si queremos
salir del archivo tecleamos :q, si queremos guardar y salir a la vez tecleamos
:wq.
Ahora sigamos con el siguiente archivo, LEE.ME, éste archivo sólo contiene una
pequeña descripción del módulo.
11
12. Y guardamos y salimos del editor.
El últimos archivo de éste módulo es compilar.sh. Dentro de él, tecleamos
el siguiente código:
12
13. Este es un archivo bash, nos permite ejecutar comandos en la terminal, con
esto podemos automatizar operaciones. El comando pwd recoge o muestra la
ubicación actual. El comando cd entra o se ubica en el directorio que se indica
despues de un espacio. Podemos crear variables, las variables en un bash no se
declaran, toman el valor que se les asigne.
Con esto podemos entender el archivo bash. La última linea ejecuta el make,
utilizando el makefile, como ya hemos visto, éste archivo es llamado automáti-
camente al ejecutar make, el archivo bash le manda las variables que estaban
sin crear en el makefile, como podemos observar, despues de la instrucción make
tenemos la asignación de cada variable, y ese valor se le manda al makefile.
De manera general sólo recoge la ubicación de los archivos necesarios y se los
manda al makefile para compilar.
13
14. Ya tenemos todos los archivos de ese modulo. Ahora ya tienes un poco de
práctica para que puedas crear los módulos que hacen falta. Sólo te indicaré
el código que irá en cada archivo y tu iras creando y llenando los archivos. La
explicación es la misma, si entendiste lo anterior, entenderás lo que sigue.
Dentro de la carpeta que se encuenta en holamundo/fuente/saludo esta vacia,
crearemos los siguiente archivos:
compilar.sh␣LEE.ME␣makefile␣saludo.c␣stub.c
El archivo bash compilar.sh tendrá el siguiente código:
El archivo LEE.ME tendrá:
14
18. Ya tenemos listo el modulo saludo. Ahora nos dirijimos a la carpeta lib que
se encuentra en holamundo/fuente/lib y debemos crear los siguientes archivos:
cadena.c␣compilar.sh␣LEE.ME␣makefile␣salir.c
El archivo cadena.c tendrá:
18
30. Ahora nos dirijimos a la carpeta incl que se encuentra en holamundo/fuente/incl
y debemos crear los siguientes archivos:
cadena.h␣holamundo.h␣LEE.ME␣salir.h
El archivo cadena.c tendrá:
30
33. Parece que ya tenemos todo lo necesario para hacer funcionar el proyecto hola-
mundo. Tenemos cuatro carpetas dentro de la carpeta fuente, holamundo, incl,
lib, y saludo, todos menos incl son módulos, la carpeta incl no tiene makefile,
por lo tanto podemos compilar holamundo, lib y saludo.
33
34. Compilación
Para compilarlos haremos lo siguiente:
Recordemos que hay un archivo bash que nos ayudará a compilar. Para ejecutar
un archivo bash con extención .sh podemos hacerlo de varias maneras, dos de
ellas son:
sh␣compilar.sh
./compilar.sh
Cualquiera de las dos funciona igual. Puede ser que el archivo no tenga permisos
para ejecutarse, para darle permisos tecleamos:
chmod␣+x␣compilar.sh
y después volvemos a ejecutarlo con cualquiera de los dos comandos anteriores.
OK. Nos dirijimos a holamundo/fuente/holamundo/ y ejecutamos para compi-
lar el modulo holamundo.
Ejecuta los comandos y muestra el mensaje de “Compilación terminada”, y hace-
mos un ls para ver los archivo nuevos que se acaban de crear, hay un archivo
nuevo llamado holamundo.c y en el directorio holamundo/bin/ hay un archivo
ejecutable llamado holamundo, ya se a creado el ejecutable de ese modulo!.
Si queremos ejecutar las macros BORRA o LIMPIA hacemos lo siguiente:
En vez de teclear ./compilar.sh o sh compilar.sh teclearemos:
make␣BORRA
make␣LIMPIA
Dependiendo de lo que queramos hacer, estos macros no se pueden ejecutar
automáticamente, es por eso que se deben mandar a llamar. Si los hacemos se
34
35. eliminarán todos los archivos que se hallan creado al compilar.
Bueno, ahora nos dirijimos al directorio /holamundo/fuente/saludo/ para com-
pilar el modulo saludo y hacemos lo mismo que lo anterior.
Y ahora nos dirijimos a la ruta /holamundo/fuente/lib/ para compilar ese mod-
ulo y se creen las librerias correspondientes. Hasta este momento en la ruta
/holamundo/bin/ ya se encuentra dos archivo ejecutables. El modulo lib no
creará ejecutables sino mas bien empaquetará las librerías usadas en los módu-
los anteriores, en un archivo .a.
Ejecuación
El archivo que se crea se encuentra en /holamundo/lib/libutil.a
35
36. Con esto ya hemos terminado la compilación de todos los módulos.
Nos dirijimos a /holamundo/bin/ para ver los ejecutables y ver que mensajes
nos muestran. ;-)
En caso de que nos diga permiso denegado, le damos permiso con el comando
visto anteriormente:
chmod␣+x␣holamundo
chmod␣+x␣saludo
Bueno!, eso fue el proyecto de holamundo.
36
37. Si tienes alguna duda mandar correo a: ivanthebest10@gmail.com o ivan_luisj@hotmail.com
Puedes visitar mi blog: ivanovich-hacker.blogspot.mx
Puedes distribuir libremente éste documento. Si deseas copiar y pegar parte
del texto de éste documento debes dar los créditos correspondientes a Iván Luis
Jiménez.
Compilado el 19 de agosto de 2017 con LATEX usando LYX
37