2010-12-01 9 views
16

nehme ich an einer Make-Datei arbeitete und ich habe die folgende Variablendeklaration an der Spitze:Wie verwendet man eine Variablenliste als Ziel in einem Makefile?

FILES = file1.cpp file2.cpp file3.cpp 

Jetzt nehme ich an jeden der mit einem speziellen Befehl kompilieren will, ohne jedes Ziel wie folgt festgelegt wird:

file1.o : file1.cpp 
    custom_command file1.cpp 
file2.o : file2.cpp 
    custom_command file2.cpp 
file3.o : file3.cpp 
    custom_command file3.cpp 

Gibt es einen besseren Weg, dies mit der oben angegebenen $(FILES) Variable zu tun?

Etwas wie:

$(FILES:.cpp=.o) : $(FILES) 
    custom_command $(FILES) 

... nur muss er dies in der $(FILES) Variable für jede Datei tun.

Antwort

29

Ja. Es gibt sogenannte Musterregeln. Ein Beispiel hierfür ist die am einfachsten zu verstehen:

%.o: %.cpp 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

(nicht vergessen, dass Makefiles erfordern Tabs). Diese Regel beschreibt, wie eine Objektdatei aus einer cpp-Datei erstellt wird.

Wenn Sie nicht über eine so breite Regel wollen, können Sie verwenden, was statische Muster genannt werden:

objects = file1.o file2.o file3.o 

all: $(objects) 

$(objects): %.o: %.cpp 
     $(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o [email protected] 

Hier ist der Abschnitt auf static pattern rules und pattern rules in der GNU-Handbuch machen.

6

Sie können tun, wie in der folgenden:

SRCS=a.c b.c 
OBJS=$(SRCS:.c=.o) 

$(OBJS): $(SRCS) 
     cc -c -o a.o a.c 
     cc -c -o b.o b.c 

aber müssen Sie daran denken, dass die Abhängigkeiten sind komplett - es wird davon ausgegangen, dass a.o auf b.c abhängt, wie gut das ist wahrscheinlich nicht der Fall.

Was sind Sie wahrscheinlich nach ist eine einzige Regel, wie ein Dateityp in einen anderen drehen:

SRCS=a.c b.c 
OBJS=$(SRCS:.c=.o) 

all: $(OBJS) 

.c.o: 
     gcc -c -o [email protected] $< 

.c.o ist eine solche Regel, die, was eine .c-Datei in ein .o auszuführen heißt es Befehle drehen Datei. Im tatsächlichen Befehl wird [email protected] durch das spezifische Ziel ersetzt und $< wird durch den Namen der ersten Voraussetzung ersetzt.

Es gibt viele andere automatische Variablen Sie sie verwenden können, suchen Sie mit info make oder suchen Sie nach einem guten Buch auf make wenn Sie die verfügbaren info Sachen nicht haben.

+0

Ja, das ist ziemlich genau das, was ich versuche zu tun. –

+0

Eine weitere Möglichkeit, Abhängigkeiten genau anzugeben, besteht in der Verwendung von [sekundäre Erweiterung] (https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html) der Voraussetzungen (GNU Make specific feature). – ruvim

1
SRCS = a.c b.c 
OBJS = $(SRCS:.c=.o) 

.c.o: 
     ${CC} ${CFLAGS} -c -o [email protected] $< 

Obwohl $< ist nicht ganz tragbar (IIRC, bsdmake hat die Bedeutung von $^ und $< genau vertauscht, was gmake Anwendungen), ist dies das Standardrezept für .c.o, die in der Tat in jeder Implementierung wären.