3 Stimmen

gnu make kopiert viele Dateien an einen einzigen Ort

Diese Frage ähnelt sinngemäß der Frage 2543127 .

Ich habe ein Gnu-Makefile mit einer Liste von Header-Dateien. Jede Headerdatei kann sich in einem anderen Verzeichnis befinden, z.B.,

HEADERS = $(wildcard *.h) $(wildcard foo/*.h) $(wildcard bar/*.h)

und ich möchte, dass das Makefile alle Header in ein Include-Verzeichnis kopiert

INCDIR = ../include

und wenn ein Dummy-Ziel, z.B. ALL, aufgerufen wird, aktualisiert es die Header-Dateien im Include-Verzeichnis entsprechend, d.h.,

.PHONY: ALL
ALL : $(addprefix $(INCDIR)/,$(notdir $(HEADERS)))

Natürlich könnte ich das Gewünschte ganz einfach erreichen, wenn ich wüsste, was die Listen der Verzeichnisse sind. Wenn ich das wüsste, könnte ich einige Regeln (etwas) wie folgt schreiben (nicht ganz korrekt, aber Sie verstehen das Wesentliche):

$(addprefix $(INCDIR)/,$(notdir $(filter foo/%.h,$(HEADERS)))) : %.h : foo/%.h
     @cp -f $< $@

$(addprefix $(INCDIR)/,$(notdir $(filter bar/%.h,$(HEADERS)))) : %.h : bar/%.h
     @cp -f $< $@

$(addprefix $(INCDIR)/,$(notdir $(filter-out bar/%.h,$(filter-out foo/%.h,$(HEADERS))))) : %.h : %.h
     @cp -f $< $@

Es gibt zwei Probleme mit diesem Ansatz: (1) Es wird mühsam, wenn die Anzahl der Verzeichnisse zunimmt und (2) ich schreibe dies in ein makefile include, das keine Verzeichnisse kennt, alles was es weiß, sind die Variablen INCDIR und HEADERS; es kennt die Verzeichnisse foo/, bar/ und ./ nur über $(sort $(dir $(HEADERS)))

Frage: Wie kann ich eine Regel schreiben, die den gewünschten Effekt erzielt, wenn ich nur die Variablen INCDIR und HEADERS zur Verfügung habe?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X