Makefile entfernen ../ Pfad
Habe ich Objekt-Dateien kommen in mit Pfade, die könnte wie folgt Aussehen:
'../../src/foo/bar.c'
Möchte ich Ihnen ausgegeben werden, um
'build/src/foo/bar.o'
Derzeit mit:
COBJS := $(notdir $(CFILES))
COBJS := $(patsubst %,$(BUILD)%.o,$(COBJS))
Kann ich erreichen
'build/bar.o'
Dies ist problematisch, wenn zwei beliebige Bibliothek/Projekt enthält den gleichen Klassennamen.
Die Frage ist also, wie kann man das entfernen mehrerer '../' von einem Pfad in Machen. Ich habe versucht, die offensichtliche und naive Ansätze mit keine Ergebnisse.
Update, das folgende match genau ../../und ersetzen Sie es mit dem rest. Das ist perfekt, außer, dass es speziell für ../../. Müssen nur, es zu machen, eine beliebige Anzahl von ../../
COBJS := $(CFILES:../../%=%)
Update,
GELÖST, nur drei Ruf scheuen die Veröffentlichung meiner eigenen Antwort.
COBJS := $(subst ../,,$(CFILES))
- Was ist falsch mit
COBJS := $(subst ../.., build, $(CFILES))
? - Einige Dateien sind nicht immer zwei relative Pfade rückwärts.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie geschrieben in meinem ursprünglichen Frage, und ich habe schließlich eine Antwort.
Die Lösung für diese und wahrscheinlich viele andere Machen, string Ersatz, ist wie folgt:
'subst' nimmt 3 Parameter. $toMatch, $replaceWith, $string.
In diesem Fall $(CFILES) ist die Liste aller .c-Dateien zu kompilieren. Ich ersetzen Sie ".. /" mit nichts.
Versuchen abspath.
Eine einfache Lösung zu deinem problem kann wie folgt sein. Betrachten wir ein einfaches Makefile
Wenn Sie führen Sie den Befehl make.
Erhalten Sie Ausgabe als: