Frage

Ich habe eine Make-Datei Vorlage, um ein einzelnes DLL (für ein Plugin-System) zu kompilieren. Die Make-Datei des Benutzers sieht wie folgt aus:

EXTRA_SRCS=file1 file2
include makefile.in

Im makefile.in ich habe:

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

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

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

Das Verfahren sollte beide arbeiten für Windows und Linux, oder zumindest jeder anpassungsfähig sein. Allerdings habe ich nur die GNU-Version von make verwenden.

War es hilfreich?

Lösung

Mit der "Wildcard" Funktion:

$(wildcard *.h)

EDIT: um eine bestimmte Liste übereinstimmen, tun

$(wildcard $(HEADER_FILES))

Es besteht keine Notwendigkeit $ (filter ...) zu verwenden, die Wildcard-Funktion filtert automatisch Dateien, die nicht existieren.

Andere Tipps

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

Was ich tue, ist eine Datei mit der Erweiterung von .d für jede .c oder CPP-Datei erstellen, und „schließen“ die .d-Dateien dann. Ich benutze so etwas in meinem Makefile:

%.d: %.c
        gcc $(INCS) $(CFLAGS) -MM $< -MF $@

%.d: %.cpp
        g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@

ich dann erstellen, um 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 die Art von Verhalten für Sie gehen? Die Schönheit dieser Methode ist, dass selbst wenn Sie für die eigentliche Erstellung eines nicht-GNU-Compiler verwenden, der GNU-Compiler einen guten Job macht die Abhängigkeiten zu berechnen.

Ist die einfache

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

tun, was Sie wollen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top