2017-03-23 3 views
0

Ich versuche ein einfaches Makefile zu erstellen, um ein einfaches Projekt zu erstellen, das nicht zu schwer zu pflegen ist.Makefile Mustererkennung funktioniert nicht so wie ich es erwartet habe

Ich möchte Muster-Matching-Regeln verwenden, z. %.o : %.c ; g++ ... wo ich alle Objektdateien habe, die ich kompilieren möchte, abgeleitet von Wildcard-Matched-Quelldateien.

Die Verzeichnisstruktur ist

./src 
./include 
./build/bin 
./build/objs 

Gerade jetzt mein Problem sieht ungefähr so ​​aus.

INCL_DIR = ./include 
SRC_DIR = ./src 

BUILD_DIR = ./build 
BIN_DIR = $(BUILD_DIR)/bin 
OBJ_DIR = $(BUILD_DIR)/objs 

SRCS = $(notdir $(wildcard $(SRC_DIR)/*.cc)) 
OBJS = $(addprefix $(OBJ_DIR)/, $(SRCS:%.cc=%.o)) 

$(BIN_DIR)/program : $(OBJS) 
    $(CXX) $(CXXFLAGS) -I $(INCL_DIR) $^ -o [email protected] 

$(OBJS):%.o : %.cc 
    $(CXX) $(CXXFLAGS) -I $(INCL_DIR) -c $< -o [email protected] 

In der Zeile $(OBJS):%.o : %.cc ein Beispiel Erweiterung von Ziel Regel würde ./build/objs/a.o, die Datei ist in ./src/a.cc auf ./build/objs/a.cc aber die Quelle abhängt.

Also dachte ich, ich könnte das Abhängigkeitsformat wegstreifen, um zu versuchen, ./src/a.cc zu entsprechen, aber die Utilities für Textmanipulationen scheinen nicht auf der Abhängigkeitsseite einer Regel zu arbeiten.

Ich habe versucht, so etwas wie

$(OBJS):%.o : $(SRC_DIR)/$(notdir %.cc) 

oder

$(OBJS):%.o : $(SRC_DIR)/$(*F).cc 

wo $(*F)-a in dem früheren Beispiel Fall erweitern würde, aber es dehnt sich nicht auf etwas, wenn sie als Abhängigkeit aufgeführt.

Ich habe keine Erfahrung mit Makefiles und bin mir nicht sicher, warum meine Versuche nicht funktionieren und würde gerne eine Lösung hören, die mein Problem lösen könnte.

Danke.

+0

Wenn ich verstehe, was Sie fragen, was mir nicht ganz klar ist, können Sie die Pattern-Matching-Regeln nicht wirklich verwenden - Sie müssen die integrierten String-Manipulationsfunktionen verwenden, um Listen von Abhängigkeiten zu erstellen. Ich habe ein paar Artikel über generische Makefiles unter https://latedev.wordpress.com/2014/11/08/generic-makefiles-with-gcc-and-gnu-make/, die helfen können oder nicht. –

+2

Suchen Sie nach etwas wie: '$ (OBJ_DIR) /%. O: $ (SRC_DIR) /%. C'? – blackghost

+0

@John Ich glaube, das würde zu './build/test.o: ./src/./ build/test.cc' expandieren, sollte aber von'./Src/test.cc' abhängig sein. Außerdem würde ich '$ (OBJS) /%. O: ...' bevorzugen, weil ich vielleicht Dateien in weiteren verschachtelten Verzeichnissen in OBJS hinzufügen möchte. – jezzi23

Antwort

0

Die Lösung ist bereits in @ Johns Kommentar. Ich werde versuchen, es etwas genauer zu erklären. Ich werde ein Beispiel mit hello.cc in Ordner src verwenden.

Musterregeln halten das Muster in % Symbol. Wenn im Makefile eine Musterregel vorhanden ist: build/objs/%.o : src/%.cc und Sie die Datei build/objs/hello.o erstellen, wird % den Wert hello tragen. Wenn Ihre Musterregel jedoch $(OBJS):%.o : %.cc lautet, ist das Muster %build/objs/hello und die Abhängigkeitsdatei build/objs/hello.cc fehlt (weil sie in src gespeichert ist, nicht in build/objs).

So Lösung für Sie wäre:

$(OBJS):$(OBJ_DIR)%.o : $(SRC_DIR)%.cc 
    $(CXX) $(CXXFLAGS) -I $(INCL_DIR) -c $< -o [email protected] 

Wenn Sie sicherstellen möchten, wie Muster arbeiten, können Sie Muster Inhalt durch Hinzufügen Linie @echo $* Rezept drucken.

Verwandte Themen