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.