Gibt es eine einfache Möglichkeit, ein einzelnes Rezept auf mehrere Musterregeln anzuwenden?Makefile einzelnes Rezept für mehrere Muster
Betrachten Sie diese Verzeichnisstruktur
|- src
| - file1.cpp
|- test
| - file2.cpp
| - file3.cpp
| - metrics
| - file4.cpp
| - file5.cpp
Ich möchte eine einzige Musterregel schreiben alle CPP-Dateien in dem Testverzeichnis zu kompilieren. Hier ist, was ich habe jetzt:
$(OBJS)/%.o: test/%.cpp
@mkdir -p $(OBJS)
g++ $(FLAGS) $(CPPFLAGS) -c $< -o [email protected]
$(OBJS)/%.o: test/metrics/%.cpp
@mkdir -p $(OBJS)
g++ $(FLAGS) $(CPPFLAGS) -I test -c $< -o [email protected]
TEST_CPP := $(wildcard test/*.cpp) $(wildcard test/**/*.cpp)
TEST_OBJ := $(addprefix $(OBJS)/,$(notdir $(TEST_CPP:.cpp=.o)))
$(BIN)/testRunner: $(TEST_OBJ)
@mkdir -p $(BIN)
g++ $(FLAGS) $(CPPFLAGS) $^ $(LIBS) -o [email protected]
Ich möchte das Rezept für die Objektdateien zu wiederholen. Ich stelle mir die Lösung wie folgt aussehen würde:
$(OBJS)/%.o: test/%.cpp
$(OBJS)/%.o: test/metrics/%.cpp
@mkdir -p $(OBJS)
g++ $(FLAGS) $(CPPFLAGS) -c $< -o [email protected]
(Im Moment der objs Verzeichnis ist flach, aber, ich habe kein Problem, die Quelle Verzeichnisstruktur zu duplizieren, wenn das das Makefile vereinfacht.)
Gibt es eine Möglichkeit VPATH nur auf bestimmte Regeln anzuwenden? Angenommen, ich möchte ein anderes Flags/Bibliotheken/Includes für die "Test" .o-Dateien als für die "Produkt" .o-Dateien. Ich könnte separate Musterregeln für '$ (OBJS)/test /% .o' und' $ (OBJS)/production /% .o' einrichten; Aber gibt es dann eine Möglichkeit, Musterübereinstimmungen für .o-Dateien in '$ (OBJS)/test' auf Quellen in'/test' zu beschränken? – Zack
'VPATH' ist global, aber Sie können die' vpath' Direktive wie 'vpath $ (OBJS)/test /% .o test' (und ebenfalls für die Produktion) verwenden. –
Sie können 'vpath' nicht so verwenden: Das Muster in' vpath' gilt für die Liste der gesuchten Namen, nicht für die Liste der Ziele. Mit anderen Worten, Ihr Beispiel sagt make, dass es nach .o-Dateien in 'test', nicht nach' .cpp'-Dateien suchen soll. – MadScientist