Forum: Compiler & IDEs Mit sed string einfügen


von Bronko P. (bronko99)


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?

von Marcus H. (mharnisch) Benutzerseite


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

von Bronko P. (bronko99)


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.

von Marcus H. (mharnisch) Benutzerseite


Lesenswert?

Bronko Pavel schrieb:
> Es geht einzig darum in die von gcc generierten .d Files diesen String
> voranzustellen.
1
sed 's/^/$(TEMPDIR)\//' ...

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

--
Marcus

von Bronko P. (bronko99)


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

von Marcus H. (mharnisch) Benutzerseite


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

von Bronko P. (bronko99)


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...

von A. W. (uracolix)


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.

von Bronko P. (bronko99)


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

von A. W. (uracolix)


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/"

von Bronko P. (bronko99)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.