Sto cercando di migliorare la soluzione ingenua (regole singole per la compilazione di destinazioni e una aggiuntiva per il collegamento di tutti gli obiettivi precedenti insieme) che ho utilizzato nel mio makefile. Sono venuto con la seguente Makefile (tagliata):Regola target generica per Makefile
.PHONY: clean
BASE_DIR = ../
CC = gcc
CROSS_COMPILE = arm-none-eabi-
CFLAGS =-g -I${BASE_DIR}/include
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib
SOURCES = first.c second.c third.c fourth.c
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = $(OBJECTS:.o=)
all: $(EXECUTABLE)
%:
${CROSS_COMPILE}$(CC) $(CFLAGS) $(LDFLAGS) $*.c -o $*
clean:
rm ${EXECUTABLE}
Questo funziona bene, ma mi piacerebbe separare la compilazione e processi che collegano. Perciò ho cercato di modificarlo come segue:
.PHONY: clean
BASE_DIR = ../
CC = gcc
CROSS_COMPILE = arm-none-eabi-
CFLAGS =-c -g -I${BASE_DIR}/include
LDFLAGS =-L${BASE_DIR}/lib -Ttarget.ld -nostdlib
SOURCES = first.c second.c third.c fourth.c
OBJECTS = $(SOURCES:.c=.o)
EXECUTABLE = $(OBJECTS:.o=)
all : $(EXECUTABLE)
%.o : %.c
@echo "Compiling c file into o file"
${CROSS_COMPILE}$(CC) $(CFLAGS) $< -o [email protected]
% : %.o
@echo "Linking o file into executable"
${CROSS_COMPILE}$(CC) $(LDFLAGS) $< -o [email protected]
clean:
rm ${EXECUTABLE}
Questo funziona ok allora invocando la Makefile come ad esempio make first.o; make first
o se modifico il EXECUTABLE = $(OBJECTS:.o=)
a EXECUTABLE = $(OBJECTS:.o=.out)
e % : %.o
a %.out : %.o
. Se, tuttavia, provo a richiamare la compilazione come make
o make first
, vengono utilizzate le regole implicite.
Ho provato ad usare il manuale di Makefile ma ci sono davvero molte informazioni, mi sono un po 'confuso.
Come posso modificare il Makefile per essere autorizzati a richiamare la costruzione di obiettivi separati come make <target>
o tutti gli obiettivi come make
come lo stesso tempo?
Mi dispiace se la mia descrizione è stata confusa, ho fatto del mio meglio per chiarire. Cosa intendi per "entrambe le regole integrate e le tue regole di pattern sono considerate" regole implicite ""? Le regole che fornisco non sono considerate esplicite? –
No. Le regole esplicite sono regole come 'foo: foo.o': hanno nomi _espliciti di bersagli. Le regole del suffisso ('.c.o') e le regole del modello ('% .o:% .c') non hanno bersagli espliciti; sono regole implicite. Esistono numerose regole implicite fornite di default da make, quelle sono _built-in_ rules. – MadScientist
Rifletti sulla tua domanda: rileggi questa descrizione, cercando di immaginare di non sapere nient'altro sul problema: _Questo funziona bene, quindi invoco il Makefile come ad es. 'make first.o; make first' o se modifico 'EXECUTABLE = $ (OBJECTS: .o =)' in 'EXECUTABLE = $ (OBJECTS: .o = .out)' e '%:% .o' in'% .out:% .o'. Se, comunque, cerco di invocare la compilazione come 'make' o' make first' vengono utilizzate le regole implicite. È davvero chiaro per te? – MadScientist