2008-10-30 25 views
13

Ich habe eine Makefile-Vorlage, um eine einzelne DLL (für ein Plugin-System) zu kompilieren. Die Make-Datei des Benutzers sieht wie folgt aus:Überprüfen, ob eine Datei in einem Makefile vorhanden ist

EXTRA_SRCS=file1 file2 
include makefile.in 

Im makefile.in ich habe:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS)) 

Wo plugin.os ist die Haupt-C++ Datei kompiliert werden. Btw, enden die Dateien sind .os die Objektdateien für gemeinsam genutzte Bibliothek zusammengestellt sind (das heißt mit gcc die -fpic Option)

Nun, das Problem ist, dass die zusätzlichen Quellen werden wahrscheinlich (aber nicht notwendigerweise) Header-Dateien werden. Im Idealfall möchte ich sie als Abhängigkeiten für das Ziel plugin.os und die file.cpp hinzufügen, aber nur wenn sie existieren.

Die Methode sollte sowohl für Windows als auch für Linux funktionieren oder zumindest anpassungsfähig sein. Allerdings verwende ich nur die GNU-Version von make.

Antwort

18

Verwenden Sie die "Wildcard" Funktion:

$(wildcard *.h) 

EDIT: um eine bestimmte Liste übereinstimmen, tun

$(wildcard $(HEADER_FILES)) 

Es gibt keine Notwendigkeit $ zu verwenden (Filter ...), Die Wildcard-Funktion filtert automatisch Dateien, die nicht existieren.

+0

das ist nicht das, was ich will ... Ich habe eine spezifische Liste von .h-Datei zum Testen für ... – PierreBdR

+0

Das ist in Ordnung, Sie müssen keine Platzhalter verwenden. Verwende $ (Wildcard $ (HEADER_FILES)) – JesperE

4

Sie haben nicht angegeben, welche Compiler Sie verwenden, aber wenn Sie Zugriff auf gcc/g ++ haben, können Sie die Option -MM verwenden.

Was ich mache, ist eine Datei mit der Erweiterung von .d für jede .c oder .cpp-Datei zu erstellen, und dann die .d-Dateien "einzuschließen". Ich benutze so etwas in meinem Makefile:

%.d: %.c 
     gcc $(INCS) $(CFLAGS) -MM $< -MF [email protected] 

%.d: %.cpp 
     g++ $(INCS) $(CXXFLAGS) -MM $< -MF [email protected] 

Ich erstelle dann die Abhängigkeiten wie folgt aus:

C_DEPS=$(C_SRCS:.c=.d) 
CPP_DEPS=$(CPP_SRCS:.cpp=.d) 
DEPS=$(C_DEPS) $(CPP_DEPS) 

und dies am Ende des Makefiles:

include $(DEPS) 

Ist das der Art von Verhalten, das du anstrebst? Das Schöne an dieser Methode ist, dass selbst wenn Sie einen Nicht-GNU-Compiler für das eigentliche Kompilieren verwenden, die GNU-Compiler die Abhängigkeiten gut berechnen.

+0

Ich würde lieber makeflie Generation vermeiden ... aber danke! – PierreBdR

2

Ist die einfache

$(filter $(wildcard *.h),$(HEADER_FILES)) 

tun, was Sie wollen?

+0

mmhh .. Ich kannte diesen Filterbefehl nicht! was macht es? – PierreBdR

+0

Lesen Make-Dokumentation (Info-Seiten, nicht Manpage): $ (Filter PATTERNS, TEXT) ist die Wörter in TEXT, die mindestens eines der PATTERNS entsprechen. (PATTERN erzeugt Dateimuster, keine Regexes, daher muss ein einfacher Dateiname exakt übereinstimmen.) – ephemient

Verwandte Themen