Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ace99 en 25 Marzo 2020, 11:52 am



Título: Duda Makefile
Publicado por: ace99 en 25 Marzo 2020, 11:52 am
Buenas tardes/días a todos.

Tengo un programa en c y para ello me he creado un makefile de los más sencillito posible para no andar ejecutando los comandos de ejecución, hasta ahí sin ningún problema, todo funciona bien.

El problema (ciertamente no lo es) es que quiero añadir una funcionalidad al makefile. Quiero que cuando ejecute make info en vez de make me muestre el nombre del/los ejecutables que genere/construya.
 
Código
  1. CC = gcc
  2. # -O para aplicar el optimizador de codigo, -g para poder depurar, -Wall: avisos extra
  3. CFLAGS = -g -Wall
  4. # -lm enlaza la biblioteca matematica, -pthread enlaza la biblioteca de hilos
  5. LIBS = -lm -pthread
  6.  
  7. # $ make
  8. # $ make all
  9. # $ make all
  10. all: ej1 ej2
  11.  
  12. EJ1 = girar
  13. # $ make ej1
  14. ej1: $(EJ1)
  15.  
  16. EJ2 = crear
  17. # $ make ej2
  18. ej2: $(EJ2)
  19.  
  20. girar: girar.o
  21. $(CC) -o $@ $< $(CFLAGS) $(LIBS)
  22. girar.o: girar.c
  23. $(CC) -c -o $@ $< $(CFLAGS)
  24.  
  25.  
  26. crear: crear.o
  27. $(CC) -o $@ $< $(CFLAGS) $(LIBS)
  28. crear.o: crear.c
  29. $(CC) -c -o $@ $< $(CFLAGS)
  30.  
  31. clean:
  32. rm -f *.o
  33.  
  34.  


Título: Re: Duda Makefile
Publicado por: K-YreX en 26 Marzo 2020, 21:01 pm
Lo suyo sería que crearas unas variables para guardar los nombres de los ficheros fuente, objeto y ejecutables y así podrías mostrar luego la variable que guarda los ejecutables cuando ejecutes: make info


Título: Re: Duda Makefile
Publicado por: ace99 en 26 Marzo 2020, 21:26 pm
¿Te refieres a unas variables globales?

¿Y como identificarías que se ha escrito make info en vez de make?,¿al ser un makefile tiene la propiedad de identificarlo? La verdad, es mi primer makefile y no tengo mucha idea de como funciona, estuve buscando por internet sobre make info pero no encontre nada.

Estoy un poco perdido...


Título: Re: Duda Makefile
Publicado por: K-YreX en 26 Marzo 2020, 21:42 pm
Los makefiles tienen la siguiente característica. Cuando tú ejecutas: make, sin nada más, el makefile busca la etiqueta "all:" y crea los archivos que se indican ahí siguiendo las dependencias necesarias para ello (crear primero los códigos objeto *.o y enlazar las librerías).
En cambio si escribes otra palabra después de "make" buscará y realizará las instrucciones que se indiquen en esa etiqueta. Si escribes: make clean, irá a la etiqueta "clean" y lo que hará en tu caso es eliminar todos los códigos objeto: rm -f *.o

Entonces lo que tienes que hacer es otra etiqueta, por ejemplo:
Código:
# El resto del makefile
# ...
info:
    echo "Se pueden construir los ejecutables ejer1 y ejer2"
Esta sería una versión simple en la que escribes a mano el nombre de los ejecutables. Si cambias el nombre de alguno de ellos, tendrías que cambiarlo ahí también.

Una opción sería utilizar variables (como lo son CC, CFLAGS, LIBS, EJ1, EJ2,...) para guardar los nombres de los ficheros y así podrías tener por ejemplo las variables: SRCS, OBJS, BINS,...
Y solo tendrías que cambiar el nombre en BINS para que el makefile esté completamente actualizado.

PD: Te recomendaría usar subdirectorios para los ficheros. Por convención se suelen crear dentro de tu directorio con el proyecto, los subdirectorios: src (contendrá los .cpp o .c), include (contendrá los .hpp o .h), obj (contendrá los .o), bin (contendrá los ejecutables) y doc (contendrá la documentación de tu proyecto en caso de que la quieras generar).
Así en el propio makefile puedes hacer que cada fichero se cree en su lugar correspondiente.


Título: Re: Duda Makefile
Publicado por: ace99 en 26 Marzo 2020, 22:32 pm
Me habían explicado muy por encima lo que pasaba cuando hacías make y todo lo relacionado con el all.

Tu respuesta me ha venido muy pero que muy bien, de verdad.

Muchisimas gracias. ;D