¿Por qué esta regla no puede anular la regla implícita predeterminada?
Cuando se invoca make como: make myapp (supongamos que myapp.c está ahí). El make ejecuta el comando predeterminado para compilar y vincular el programa en lugar de los comandos definidos en esta regla implícita:
#... omitted code LCUS=$(LIBS)/libcus.a #... omitted code % : %.o $(LCUS) echo !!! Custom build !!! $(MY_CMD) $< -o $@ $(LCUS)Tomado del manual de make en línea de GNU :
Puede anular una regla implícita integrada (o una que haya definido usted mismo) definiendo una nueva regla de patrón con el mismo destino y requisitos previos, pero con diferentes comandos.
Asumiría que es porque los requisitos previos no son los mismos que la regla implícita.
También tome del manual de make :
La vinculación de un solo archivo de objeto
nse realiza automáticamente desdenoejecutando el vinculador (generalmente llamadold) a través del compilador C. El comando preciso utilizado es$(CC) $(LDFLAGS) no $(LOADLIBES) $(LDLIBS). Esta regla hace lo correcto para un programa simple con solo un archivo fuente. También hará lo correcto si hay varios archivos de objetos (presumiblemente provenientes de varios otros archivos fuente), uno de los cuales tiene un nombre que coincide con el del archivo ejecutable. Por lo tanto,x: yo zocuando
xc,ycyzcexistan, se ejecutará:cc -c xc -o xo cc -c yc -o yo cc -c zc -o zo cc xo yo zo -ox rm -f xo rm -f yo rm -f zo
Básicamente, make entiende las reglas implícitas para los archivos de programa que se generan a partir de archivos .o , pero cuando agrega su biblioteca estática, no las entiende. Una forma sencilla de probar sería eliminar $(LCUS) de sus dependencias (como medida temporal) para ver si luego usa su regla en lugar de la integrada. Si es así, entonces sabes que ese es tu problema. Si simplemente agregar myapp en reemplazo de % es un problema porque desea que la regla genere varios objetivos, puede intentar lo siguiente:
$(APPS): % : %.o $(LCUS) donde $(APPS) es una variable que contiene todas las aplicaciones que desea crear. Esto permitirá que una regla cree varios objetivos. También puede omitir el uso de la variable por completo y colocar una lista separada por espacios. Este es un ejemplo de una regla de patrón estático, puede encontrar más información aquí . La diferencia entre el patrón estático y las reglas implícitas se puede encontrar aquí.
Su regla no es la misma que la regla implícita incorporada, por lo que no la cancela.
Además, make siempre prefiere una regla que no requiera la creación de archivos intermedios a una que sí lo haga. Si crea previamente el archivo .a , make podría usar su regla en su lugar (pero es posible que ni siquiera lo haga).
Si cancela la regla incorporada y deja su regla en su lugar, creo que debería funcionar correctamente.