www.mikrocontroller.net

Forum: Compiler & IDEs Make und Dateidatum


Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

make veranlasst ja nur die (Neu)erzeugung eines Objectfiles, wenn eine
Datei aus der Dependencyliste ein neueres Datum hat, als das zu
erzeugende Objectfile. Soweit korrekt?

Kann ich make dazu bringen auch den Compiler anzuwerfen, wenn das
Dateidatum unterschiedlich zwischen .o und .c/.h ist?

Problem: Wenn ich mehrere ältere Dateien wieder ins Projekt kopiere,
möchte ich diese dann auch tatsächlich mitcompiliert haben, obwohl
deren Datum älter ist. Ich möchte nicht jedesmal jede einzelne Datei
anfassen, und deren Datum umstellen! (zu fehleranfällig; vergesslich).

Ein make all möchte ich aus Zeitgründen vermeiden! (dauert einige
Minuten!)

Wie geht man dabei normalerweise an das Problem heran?

Danke, Andre

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kopiervorgang älterer Dateien mit touch verbinden ...

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht leider nicht, da die Dateien automatisch aus einer
Versionsverwaltung rausfallen. Oder wenn jemand das Touch vergisst,
dann haben wir das Problem wieder... Meine Vorstellung ist, daß das
schon irgendwo am Make angreifen muß - erst damit wärs akzeptabel
sicher.

Weitere Ideen?

Danke, Andre.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Ansatz, den Compiler anzuwerfen, wenn Datum von *.c und *.o
unterschiedlich sind ...

naja, worin besteht jetzt der Unterschied zu 'nem make -all?

Vor allem ist es vollkommen legal und sogar der Regelfall, daß *.o die
neueste von den beteiligten Dateien ist ...

Bietet denn Deine Versionsverwaltung nicht die Möglichkeit,
irgendwelche Prozeduren/Skripte beim "rausfallenlassen" von Dateien
aufzurufen?

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs denn, wenn Du einfach die betreffenden .o-Files vor dem 'make
all' (was nicht make clean all entsprechen sollte!*) löschst?

*) 'make all' sollte eigentlich dafür sorgen, daß alles, was nicht
aktuell ist oder von dem das Ziel nicht existiert, (neu) erzeugt wird
wird.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn 'make all' sich so verhält, dann meinte ich 'make clean all',
in meinem Satz

   naja, worin besteht jetzt der Unterschied zu 'nem make -all?

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, es existiert nicht...

 [15:19:10] $ make -all
make: invalid option -- a
Usage: make [options] [target] ...
Options:
[..]

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Güte. Vergesst den Bindestrich.

Die Aussage sollte dennoch verständlich sein, wenn man denn über den
Tellerrand des Bindestriches hinwegsieht.

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, sorry, das war nicht "Besserwisserisch" gemeint, ich habe Deine
Frage wahrscheinlich nur falsch verstanden. Ich dachte, Du beziehst
Dich dabei auf den Unterscheide zwischen 'make all' und 'make
-all', sorry ;-)

Der Unterschied zwischen 'make all' und 'make clean all' ist, daß
daß zuerst das Target 'clean' "gemacht" (ausgeführt/whatever) wird.
Dieses Target ist dafür Zuständig, alle erzeugten Dateien und was sonst
noch so während dem make-Prozess anfällt, wieder zu vernichten! Das
muss man natürlich in diesem Target Konfigurieren, hier ein Beispiel:

  $(REMOVE) $(TARGET).hex
  $(REMOVE) $(TARGET).eep
  $(REMOVE) $(TARGET).cof
  $(REMOVE) $(TARGET).elf
  $(REMOVE) $(TARGET).map
  $(REMOVE) $(TARGET).sym
  $(REMOVE) $(TARGET).lss
  $(REMOVE) $(OBJ)
  $(REMOVE) $(LST)
  $(REMOVE) $(SRC:.c=.s)
  $(REMOVE) $(SRC:.c=.d)
  $(REMOVE) .dep/*

Auf der Kommandozeile sieht das dann so aus:

rm -f main.hex
rm -f main.eep
rm -f main.cof
rm -f main.elf
rm -f main.map
rm -f main.sym
rm -f main.lss
rm -f main.o
rm -f main.lst
rm -f main.s
rm -f main.d
rm -f .dep/*

Wenn ich mir jetzt die Abhängigkeit von main.c und main.o ansehe, dann
wird schnell klar, daß main.o nicht existiert und somit erstellt werden
muss. Ist main.o vorhanden und aktueller (neuer) als main.c, gibt es
nichts für dieses Target zu tun, ist es älter, wird es ebenfalls
erstellt...

Autor: Andre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe gerade festgestellt, daß meine Forderung nach unterschiedlichem
Dateidatum (.o und .c/.h) ja garnicht funktionieren kann, da diese
immer unterschiedlich sind...

> naja, worin besteht jetzt der Unterschied zu 'nem make -all?
Mein gewünschter Unterschied wäre, daß dann nur die Dateien compiliert
würden, die sich auch tatsächlich geändert hätten - ob die nun älter
oder neuer geworden sind, sollte egal sein. Aber das geht ja nicht, wie
ich in meinem einleitenden Satz (eben) festgestellt habe. :-(

> Vor allem ist es vollkommen legal und sogar der Regelfall, daß *.o
> die neueste von den beteiligten Dateien ist ...
genau das - und deswegen is meine Idee leider nix.

> Bietet denn Deine Versionsverwaltung nicht die Möglichkeit,
> irgendwelche Prozeduren/Skripte beim "rausfallenlassen" von
Dateien
> aufzurufen?
würde das Problem bei handkopierten Dateien auch nicht beheben. ->
nicht 100% dicht.

> Wie wärs denn, wenn Du einfach die betreffenden .o-Files vor
> dem 'make all' löschst?
ginge natürlich, erfordert aber wieder daß daran gedacht wird -> wieder
fehleranfällig...

Aber ich sehe schon - da gibt's keine gescheite Lösung, muß wohl doch
ein Script beim Auschecken die Dateien "anfassen", und es muß halt
nach einem manuellen Copy unbedingt ein kompletter Rebuild durchgeführt
werden.

Oder?

Danke, Andre

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest allenfalls ein -zusätzliches- Werkzeug verwenden, das für
jede zum Projekt gehörende Source-Datei (*.c, *.h) deren Zeitstempel
speichert und bei Abweichungen in egal welcher Richtung gegenüber
gespeicherten Zeitstempeln resultierende *.o-Dateien löscht.

Dazu brauchst Du allerdings auch einen Dependency-Generator, der
herausfindet, welche Headerdatei um wieviele Ecken von welcher
*.c-Datei eingebunden wird.

Ob es derartige Werkzeuge bereits gibt, entzieht sich meiner Kenntnis,
aber so etwas lässt sich sicherlich auch auf skript-Ebene hinbekommen
(mit 'ner Datenbank im Hintergrund).

Viel Spaß.

@Oldbug:
Dann ist ja gut. Haben wir nur etwas aneinander vorbei gedacht, macht
auch nichts. Danke für die Aufklärung, genau so meinte ich's.

Gewinnst Du auch den Eindruck, daß der hier herrschende Tonfall in den
letzten Wochen deutlich rauher geworden ist?
(das bezieht sich explizit nicht auf Beiträge in diesem Thread!)

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, naja, also es ist schon in letzter Zeit so, daß sich einige sehr
schnell ...ähm... angep* fühlen ;)

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Oldbug: D'accord. Ob das am Wetter liegt? Vielleicht schlägt das ja
auch auf die Frisur?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, elektrostatische Aufladungen durch das nahende Gewitter =>
Haare stehen ab.  Anschließend Regen => Wuschelkopf.

:-)

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg:
Du dürftest da aber recht wenig erfahrung mit haben, wenn ich mich
recht erinnere!?!? :-)

Was mir sinst noch so durch den Kopf ging: jeder erwischt schon mal den
"falschen Ton" und bei der Anzahl User, die sich hier auf der Seite
rumtreiben, kann sich sowas auch schon mal häufen. Von daher: einfach
mal ignorieren hilft oft ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.