Duda Makefile

Iniciado por ace99, 25 Marzo 2020, 11:52 AM

0 Miembros y 1 Visitante están viendo este tema.

ace99

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 (cpp) [Seleccionar]

CC = gcc
# -O para aplicar el optimizador de codigo, -g para poder depurar, -Wall: avisos extra
CFLAGS = -g -Wall
# -lm enlaza la biblioteca matematica, -pthread enlaza la biblioteca de hilos
LIBS = -lm -pthread

# $ make
# $ make all
# $ make all
all: ej1 ej2

EJ1 = girar
# $ make ej1
ej1: $(EJ1)

EJ2 = crear
# $ make ej2
ej2: $(EJ2)

girar: girar.o
$(CC) -o $@ $< $(CFLAGS) $(LIBS)
girar.o: girar.c
$(CC) -c -o $@ $< $(CFLAGS)


crear: crear.o
$(CC) -o $@ $< $(CFLAGS) $(LIBS)
crear.o: crear.c
$(CC) -c -o $@ $< $(CFLAGS)

clean:
rm -f *.o


K-YreX

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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

ace99

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

K-YreX

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:

# 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.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

ace99

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