wheresbangtan una son significado que los datos comodines comodin caracter c makefile

una - ¿Cómo usar correctamente los símbolos% o*(asterisco) como marcador de posición en el archivo MAKE?



que es un caracter comodin en una base de datos (1)

Tengo un problema al crear makefile "sin contexto / sin nombre de archivo" para compilar el proyecto C sin especificar nombres de archivo explícitos cada vez que agrego nuevos. Tengo la siguiente estructura de proyecto:

include/ #dir to store all header files lib1.h lib2.h ... src/ # dir of source code obj/ #temporary dir for storing all .o files lib1.o lib2.o ... lib1.c # start with #include "lib1.h" lib2.c # the same ... main.c

Y el siguiente archivo MAKE

# dirs IDIR=include SDIR=src ODIR=src/obj _HEADS=*.h #or maybe % percentage instead? HEADS=$(patsubst %, $(IDIR)/%, $(_HEADS)) _OBJS=*.o OBJS=$(patsubst %, $(ODIR)/%, $(_OBJS)) _CFILES=*.c CFILES=$(patsubst %, $(SDIR)/%, $(_CFILES)) # compiler GCC=gcc CFLAGS=-I$(IDIR) $(OBJS): $(CFILES) $(HEADS) $(GCC) -c -o $@ $< $(CFLAGS) main: $(OBJS) $(GCC) -o $@ $^ $(CFLAGS)

Lo que intento lograr es construir ejecutables si se producen cambios en los archivos * .c o * .h en src/ e include/ folders (no estoy seguro de que los cambios puedan estar en src/obj ). Entonces, la make no compila porque cree que los archivos objeto están "actualizados". Así que probablemente haga algo mal, ya que primero debo verificar los archivos .c y .h.

Además, no estoy seguro (incluso después de leer varios tutoriales) de cómo usar% correctamente y cuál es la diferencia entre usar% y * asterisco. Por ejemplo, vi algo como esto:

%.o: %.c %.h gcc -o foo %@ ...

¿Cómo en el mundo la regla %.o está escrita como el nombre de la regla (supongo que es mejor si son todos nombres simples en lugar de algunas lógicas)? O tiene sentido hacerlo solo si usa marcadores de posición como %@ en la regla real para evitar nombres adicionales "sobrecarga". Por favor, ¿alguien podría explicarme y ayudarme a arreglar mi archivo MAKE? Realmente me equivoqué con estas cosas sutiles ...


* es un comodín que le proporciona una lista y se relaciona con el "caparazón".

% es un comodín interno del archivo MAKE que servirá como un marcador de posición de una manera para cada uno (explicaré a continuación).

Mientras *.c obtiene una lista de todos los archivos c en una variable, puede hacer más con %

%.o: %.c %.h gcc -o foo %@

Esto, por ejemplo, se llama regla de patrón y significa para cada <placeholder>.c <placeholder>.h generar el target <placeholder>.o con la receta correspondiente debajo de él.

Con la regla de patrón, generaría algo como esto

a.o : a.c a.h ... b.o : b.c b.h ... c.o : c.c c.h ...

Lo que estás tratando de hacer sería resultado int

a.o b.o c.o : a.c b.c c.c a.h b.h c.h gcc ....

Si bien esto puede ser válido, tiene dependencias innecesarias. ao no necesita depender de bc por ejemplo

También _CFILES = *.c dará como resultado que "* .c" sea la cadena en la variable, no los archivos reales. Si desea expandir los nombres de archivo reales, debe usar la función comodín

_CFILES := $(wildcard *.c)

ahora

CFILES=$(patsubst %, $(SDIR)/%, $(_CFILES))

también tiene este "para-cada" como placeholer %

esto significa que cada vez que haya % será reemplazado por $(SDIR)/% . Debido a que no tienes un patrón para que coincida % en la columna de patsubst esto se volverá extraño. ¿Qué quieres lograr aquí? Si quieres "cortar" el src del camino, sería al revés

CFILES=$(patsubst $(SRC)%, % , $(_CFILES))

Pero dudo que quieras hacer esto. Debería leer un poco en la documentación del archivo MAKE que está vinculada varias veces aquí. Yo explico bastante.