Mit sed string einfügen

OP #2205721
Lesenswert?

Ich komme von Beitrag "Makefile eigener Output/Temp Ordner und Unterordner"

In meinem Makefile habe ich
1
...
2
$(CC) -MM $(INCLUDES) $(CFLAGS) $< > $(TEMPDIR)/$(addsuffix .d, $(notdir $(basename $@)))
3
...

Wie kann ich mittels sed noch "$(TEMPDIR)/" voranstellen?

Ist:
main.o: main.h src1.h

Soll:
TEMP/main.o: main.h src1.h


So ähnlich müsste das doch aussehen:
1
#set -e $(CC) -MM $(INCLUDES) $(CFLAGS) $< | sed -e "1i $(TEMPDIR)"  > $(TEMPDIR)/$(addsuffix .d, $

Oder geht das noch einfacher (mit make Hilfsmitteln)?
Jemand ne Idee?
Persönliche Seite #2205768
Lesenswert?

Bronko Pavel schrieb:
> Wie kann ich mittels sed noch "$(TEMPDIR)/" voranstellen?
>
> Ist:
> main.o: main.h src1.h
>
> Soll:
> TEMP/main.o: main.h src1.h

Du könntest das Verzeichnis schon in einer Liste der zu erzeugenden 
Objekte anfügen und pattern rules schreiben:
1
OBJECTS := main.o...
2

3
OBJECTS := $(addprefix $(TEMPDIR)/, $(OBJECTS))
4

5
%.o : %.c src1.h

Allerdings musste ich irgendwann einsehen, dass es am einfachsten ist, 
das Makefile aus dem Objektverzeichnis aufzurufen. Etwas umständlicher 
(und möglicherweise eleganter) ist es, das Makefile so zu gestalten, 
dass es selbst "erkennt", in welchem Verzeichnis make gestartet wurde 
und dann ggf. in das richtige Verzeichnis wechselt und sich von dort 
nochmal selbst aufruft.

Je nach Tool kann man auch ein Ausgabeverzeichnis (z.B. TEMPDIR) 
angeben, das fällt aber ab einer gewissen Komplexität dann auch 
auseinander, da make die Dependencies nur ein einziges Mal analysiert 
und nicht erneut nach jedem erzeugtem target.

Gruß
Marcus
OP #2205835
Lesenswert?

> Du könntest das Verzeichnis schon in einer Liste der zu erzeugenden
> Objekte anfügen und pattern rules schreiben:
>
> [code]
> OBJECTS := main.o...

Das ist in meinem Makefile schon vorhanden. Ich muss halt die 
vorgegebene Struktur einhalten (siehe Ursprungsthread).
Es geht einzig darum in die von gcc generierten .d Files diesen String 
voranzustellen.
OP #2205895
Lesenswert?

Marcus Harnisch schrieb:
> ..
>
1
> sed 's/^/$(TEMPDIR)\//' ...
2
>
>
Ist das dann so richtig?:
set -e $(CC) -MM $(INCLUDES) $(CFLAGS) $< | sed 's/^/$(TEMPDIR)\//'  > 
$(TEMPDIR)/$(addsuffix .d, $

> Ist aber alles gebastelt. Lass alle erzeugten Dateien in das selbe
> Verzeichnis schreiben und benenne ausgewählte Dateien (hex-file, usw.)
> entsprechend um.
So gebastelt finde ich das nicht :-)

Das war in etwa mein erster Ansatz. Alles im Projektverzeichnis zu 
machen und dann zu verschieben bzw. umzubenennen. Hab ich aber 
verworfen, u.a. weil du dann bei einem Abbruch(gcc hat Fehler erkannt, 
...) die vielen "temporären" Dateien rumliegen hast.

Ich kann die oben genannte Codezeile erst später prüfen, aber ist diese 
so korrekt?

Bronko
Persönliche Seite #2205920
Lesenswert?

Bronko Pavel schrieb:
> verworfen, u.a. weil du dann bei einem Abbruch(gcc hat Fehler erkannt,
> ...) die vielen "temporären" Dateien rumliegen hast.

Wenn Du die .d files nicht rumliegen lassen willst, warum erzeugst Du 
sie dann erst? Der einzige Vorteil dieser Dateien ergibt sich erst bei 
mehrfacher Übersetzung der Quellen nach Änderungen.

--
Marcus
OP #2205970
Lesenswert?

Marcus Harnisch schrieb:
> Wenn Du die .d files nicht rumliegen lassen willst, warum erzeugst Du
> sie dann erst? Der einzige Vorteil dieser Dateien ergibt sich erst bei
> mehrfacher Übersetzung der Quellen nach Änderungen.

Wir reden aneinander vorbei. Natürlich benutze ich die .d Files für die 
Compilierung. Mit temporären Dateien meinte ich vor allem das hex-file, 
.o, .map, ...spielt jetzt keine Rolle mehr.

Die Frage die bleibt, ist ob Codezeile meines letzten Threads so 
funktioniert,? Dann können meine .d Files nämlich in TEMP erzeugt werden 
und dort liegen bleiben...
#2206189
Lesenswert?

Wie waere es, die Variable per command line direkt an make zu 
uebergeben?

Makefile:
1
TEMPDIR=/tmp
2
all:
3
  @echo My .d goes to $(TEMPDIR)

Aufruf ohne Parameter:
1
$ make
2
My .d goes to /tmp

Aufruf mit Parameter:
1
$ make TEMPDIR=/foo
2
My .d goes to /foo

Ansonsten kann man den geneigten Code Reviewer auch damit zum
gruebeln bringen.
1
sed 's#^TEMPDIR.*$#TEMPDIR=/bar#p' Makefile | make -f -
2
My .d goes to /bar

Spass beiseite, ich wuerde die erstere Version vorziehen, da
sie nicht auf sed angewiesen ist.
OP #2206264
Lesenswert?

Danke für die Antworten.
Irgendwie schaffe ich es nicht mein Problem zu beschreiben...

Ich will das gcc meine .d files berücksichtigt, welche nach $(TEMPDIR) 
generiert werden.
Diese werden im Makefile included. Damit sie greifen müssen die dortigen 
Objekte den Prefix "TEMP/" (=$(TEMPDIR)) erhalten.

Die einzige Frage ist, ob der Code so i.O ist:
1
set -e $(CC) -MM $(INCLUDES) $(CFLAGS) $< | sed 's/^/$(TEMPDIR)\//'  >
2
$(TEMPDIR)/$(addsuffix .d, $

Ist:
main.o: main.h src1.h

Soll:
TEMP/main.o: main.h src1.h
#2207152
Lesenswert?

>Die einzige Frage ist, ob der Code so i.O ist:
>set -e $(CC) -MM $(INCLUDES) $(CFLAGS) $< | \
> sed 's/^/$(TEMPDIR)\//'  > $(TEMPDIR)/$(addsuffix .d, $

Nein, der Fluch sieht zwar sehr technisch aus, ist
aber kompletter Unfug und hat mit der Aufgabenstellung
gar nichts zu tun.

Bevor du den ganzen System/Shell-Werkzeugkasten auskippst,
lies doch erstmal was GNUMake (ich nehme an darum handelt es
sich) so leistet, also auf gut neudeutsch: RTFM.

>Soll:
>TEMP/main.o: main.h src1.h

Wie waere es mit
1
TEMPDIR=
2
$(TEMPDIR)main.o: main.h src1.h

und dann "make TEMPDIR=TEMP/"
OP #2207324
Lesenswert?

> Bevor du den ganzen System/Shell-Werkzeugkasten auskippst,
> lies doch erstmal was GNUMake (ich nehme an darum handelt es
> sich) so leistet, also auf gut neudeutsch: RTFM.
Da bin ich schon durch, nur wie so oft kann man es nicht sofort umsetzen 
(Erfahrung).
Wenn das mit GNUmake ohne Einsatz von sed geht, dann her damit.

> und dann "make TEMPDIR=TEMP/"
Ich will make NICHT mit diesem Parameter aufrufen. Wozu auch, $(TEMPDIR) 
ist im Makefile definiert. Hast du den URsprungsthread gelesen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren