2017-09-07 1 views
1

Esc Ich muss rekursiv alle Header-Dateien in einer Liste von Verzeichnissen finden. Ich kann nicht herausfinden, wie ich dem Befehl richtig entgehen kann. Ich habe herumgesucht und verschiedene Informationen über Makefiles gefunden, aber ich konnte dieses Problem nicht lösen.Wie Backslash in Makefile-Shell-Funktion

In bash folgendes tut, was ich will:

find path1 path2 path3 -type f \(-name *.hpp -o -name *.h -o *.hxx \) 

In meinem Make-Datei ich ein paar Kombinationen von foreach versucht haben, usw. Zur Zeit dieses habe ich:

INCLUDE_PATHS ?= path1 path2 path3 
MY_HEADERS := $(shell find $(INCLUDE_PATHS) -type f \(-name *.h -o -name *.hpp -o -name *.hxx \)) 

Dies erzeugt:

find: paths must precede expression 
Usage: find [-H] [-L] [-P] [path...] [expression] 

Wenn ich für eine Erweiterung aussehen gerade wie „* .hpp“ es funktioniert gut (ich nehme an, weil die \ (... \) ist nicht benötigt).

Ich habe verschiedene Kombinationen von $ versucht,‘“. \ Die zu entkommen ‚ohne Erfolg \‘ Zeichen in dem Shell-Befehl.

Jede mögliche Hilfe geschätzt wird stark würde.

+0

Oops ... Ich meinte Backslash im Titel. – sjacobs

Antwort

1

Ihr Problem hat nichts mit make oder dem Wert INCLUDE_PATHS zu tun oder wie interpretieren Backslash Zeichen. Das Problem besteht darin, dass Sie Ihre Globbing nicht umgehen und einige lokale Dateien übereinstimmen. Rewrite Ihre Funktion Ihre glob Aussagen zu entkommen, wie folgt aus:

MY_HEADERS := $(shell find $(INCLUDE_PATHS) -type f \(-name \*.h -o -name \*.hpp -o -name \*.hxx \)) 

Ich wäre sehr überrascht, wenn die Original-Befehl funktioniert in Bash ohne diese Zeichen zu zitieren, wenn Sie es aus dem gleichen Verzeichnis ausführen, um die gleichen Inhalte wie Make enthalten .

+0

Das hat funktioniert. Vielen Dank! – sjacobs

0

Die variablen MY_HEADERS wird . richtig, durch $($INCLUDE_PATHS) Aufruf - nicht $ (include_paths) Also Ihr Makefile wäre:

INCLUDE_PATHS ?= path1 path2 path3 
MY_HEADERS := $(shell find $($INCLUDE_PATHS) -type f \(-name *.h -o -name *.hpp -o -name *.hxx \)) 

Sie können weiterhin den Wert der variablen überprüfen:

Das Ausführen dieses Makefile von make zeigt Ihre gewünschte Antwort.

+0

Mein früherer Kommentar betraf einen Tippfehler in meiner ursprünglichen Frage, den ich korrigiert habe. – sjacobs

+0

Ihre Arbeit am Suchpfad ist nicht die Lösung oder relevant. Wenn ich dort nur einen einzelnen Pfad einstelle, dann referenziere eine make-Variable immer noch das gleiche Ergebnis. Das Problem besteht darin, die Optionen für mehrere Namen zu übergeben, bei denen die Zeichen \ (... \) korrekt an die Shell übergeben werden müssen. Mit anderen Worten: 'MY_HEADERS: = $ (shell find $ (INCLUDE_PATHS) -Typ f -name * .hpp))' funktioniert einwandfrei. – sjacobs

+0

Ob "Backslash entkommen" oder nicht war nicht der Grund, warum Sie die ersten Ergebnisse erhalten haben. In Makefile betten wir den gleichen Suchbefehl ein, außer es gibt verschiedene Variablenaufrufkonventionen. – popuptoast

0

Obwohl MadScientist bereits die Frage perfekt beantwortet, könnten Sie Folgendes zu vermeiden, dass die Schale zusammen verwenden:

INCLUDE_PATHS ?= path1 path2 path3 
EXTENSIONS := .h .hpp .hxx 
MY_HEADERS := $(shell find $(INCLUDE_PATHS) -type f \(-name \*.h -o -name \*.hpp -o -name \*.hxx \)) 
$(info $(MY_HEADERS)) 
MY_HEADERS := $(foreach p,$(INCLUDE_PATHS),$(foreach e,$(EXTENSIONS),$(wildcard $(p)/*$(e)))) 
$(info $(MY_HEADERS)) 
Verwandte Themen