Forum: Mikrocontroller und Digitale Elektronik IDE, Makefile, Debugger usw.


von Anfänger (Gast)


Lesenswert?

Hallo Leute,

also ich bin kein totaler Anfänger, ich bastl und programmier schon seit 
paar Jahren. Aber eine Sache hat sich mir immer verschlossen, da ich nur 
mit schönen bunten IDEs gearbeitet habe: Makefiles

Ich weis wofür sie gut sind, hab schon paar mal (versucht) welche 
nachzuvollziehen aber hab noch NIE eines geschrieben.

Dabei frag ich mich dauernd - Wozu die Dinger? (wahrscheinlich weil ich 
doch was nicht ganz verstanden habe)

Ich bekomm den Brückenschlag zwischen einer IDE und Makefiles nicht hin. 
In der IDE sehe ich im jeweiligen Projekt alle Dateien, die zum Programm 
gehören und kompiliert werden. Ein paar werden noch von externen 
Verzeichnissen eingebunden zB. io.h

Wenn ich im AtmelStudio auf "Build" klicke, erstellt dann die IDE ein 
makefile entsprechend den Dateien die zum Projekt gehören, und ruft dann 
"make all" auf???

THEMA DEBUGGEN:
ich weis, dass man den Buildvorgang auch aus der Komandozeile starten 
kann und hab ich auch schon paarmal gemacht. Aber debuggen geht ja dann 
nicht mehr oder? *.hex ist fertig, wird drauf geflasht und dann tut der 
Controller oder tut eben nicht.
Das heist für mich: Wenn ich mit Makefiles arbeite kann ich nicht 
debuggen -> Makefiles sind böse. ABER warum arbeiten dann nahezu alle, 
die bisl besser programmieren können mit Makefiles?? Programmieren die 
keine Fehler und müssen deshalb nicht debuggen? ;-)

Kann bitte jemand bisl Licht ins Dunkle bringen

Gruß Stefan

von Reinhard Kern (Gast)


Lesenswert?

Anfänger schrieb:
> Kann bitte jemand bisl Licht ins Dunkle bringen

Erst mal nur ein wenig:

Makefiles sind eigentlich ScriptDateien mit Anweisungen wie DOS/Windows 
.BAT. Als Besonderheit enthalten sie Abhängigkeiten der Art "wenn das 
Sourcefile jünger ist als das Objectfile, wirf den Compiler an, um das 
Objectfile neu zu erzeugen". Das spart Arbeit, weil immer nur das 
ausgeführt wird, was nach Änderungen nötig ist (vorausgesetzt, das 
Makefile ist korrekt - das ist eine Aufgabe für sich). Bemerkbar macht 
sich die Ersparnis aber nur bei grossen Projekten, bei einem Embedded 
System kann man auch einfach alles neu machen (= Build All), und dafür 
könnte man sich auch ein normales BAT-File schreiben. So ein Build hat 
früher mal Stunden gebraucht (mit Lochstreifen), dann Minuten, und heute 
noch so 1..2 Sekunden.

Ein Vorteil bei direkter Bearbeitung des Makefiles ist, dass man 
Zwischenschritte einplanen kann, die die IDE garnicht vorsieht - ich 
habe zum Beispiel eine Software geschrieben, die Standard-Texte durch 
eine andere Sprache ersetzt, die macht dann aus einer internationalen 
Datei eine russische oder spanische, und wird im Makefile als allerstes 
aufgerufen, wenn diese Datei verändert wurde.

Mit dem Debugger hat das so gut wie nichts zu tun, beim Debuggen ist das 
Programm immer fertig und geladen. Nur ist meistens zum Debuggen eine 
besondere Ausführung der Übersetzung nötig, so dass z.B. die 
Zeilennummern des Programms in irgendeiner Form enthalten sind - die 
kann der Debugger dann lesen und damit den Cursor in der entsprechenden 
Source-Datei setzen. In einer IDE muss man zwischen Debug-Version und 
Release-Version wählen.

Das ist bequem aber nicht inbedingt nötigt, Hardcore-Progarmmierer 
können auch debuggen mit nichts als dem Programm im Speicher und dem 
Listing auf dem Tisch.

Gruss Reinhard

von temp (Gast)


Lesenswert?

Die Antwort aus meiner Sicht auf die Frage ist ganz einfach. Die 
Industrie glaubt nicht, dass es einen nennenswerten Markt für einen 
guten Debugger ohne den restlichen Kram der IDEs gibt. Eigentlich ja nur 
ein vernünftiges Frontend für den gdb der in der Regel überall verwendet 
wird. Die Opensource Lösungen decken den Controllerbereich nicht richtig 
ab und die Klötze wie Eclipse oder Netbeans sind nur zum Debuggen 
einfach zu fett. Auch in einem Debugfrontend steckt eine Menge Arbeit 
wenn man viele verschiedene Controller und deren Perepherie unterstützen 
will. Wenn man sich einmal mit den makefiles richtig beschäftigt hat und 
unter vielen verschiedenen Systemen oder Controllerfamilien arbeitet, 
lernt man die vielen IDEs hassen. Man hat sich dann für einen guten 
Editor entschieden und schreibt Programme für Windows,Linux, Controller 
u.s.w. immer in der selben Art und Weise. Nur beim Debuggen gibt es 
nichts universelles. Leider.

von Axel S. (a-za-z0-9)


Lesenswert?

Anfänger schrieb:

> also ich bin kein totaler Anfänger, ich bastl und programmier schon seit
> paar Jahren. Aber eine Sache hat sich mir immer verschlossen, da ich nur
> mit schönen bunten IDEs gearbeitet habe: Makefiles
>
> Ich weis wofür sie gut sind

Das bezweifle ich ehrlich gesagt ein bisschen.

> hab schon paar mal (versucht) welche
> nachzuvollziehen aber hab noch NIE eines geschrieben.
>
> Dabei frag ich mich dauernd - Wozu die Dinger?
> Ich bekomm den Brückenschlag zwischen einer IDE und Makefiles nicht hin.

Kein Wunder. IDE und Makefile sind ziemlich gegesätzliche Ansätze.

Vielleicht erstmal, was Makefiles nicht sind:

- sie haben nichts mit dem Debuggen zu tun
- es sind keine Skripts

Die Aufgabe, die das Programm make in Verbindung mit einem Makefile 
löst, ist das Compilieren und Linken eines Projekts aus den 
Quelldateien.

Make ist dabei ein sehr generischer Ansatz und kann für so ziemlich 
alles verwendet werden, wo aus einer Menge Eingabefiles eine Menge 
Ausgabefiles erzeugt werden (ggf. auch in mehreren Schritten).

Beispiel: meine Diplomarbeit habe ich in Latex geschrieben und einige 
Diagramme wurden mit Maple erzeugt. Ein Makefile hat damals die 
Maple-Skripte durch Maple gejagt um die Diagramme zu erzeugen, dann die 
Latex-Files durch tex gedreht, und anschließend mit dvips alles in ein 
hypsches Postskript-File verpackt.

Ein wichtiges Feature von make ist, daß es versucht Arbeit zu sparen. 
Wenn z.B. dein Programm aus 3 .c Files besteht und du nach dem letzten 
make-Lauf nur eins davon geändert hast, dann compiliert make nur dieses 
eine und verwendet für die anderen die .o Files aus dem letzten Lauf. 
Bei großem Projekten (z.B. Linux-Kernel) ist das sehr wichtig.

make ist auch nicht allein auf weiter Flur. Es gibt Alternativprogramme, 
z.B. ant in der Java-Welt. Oder cook als generischer make-Ersatz.

Zurück zum Thema µC:

die Schritte zum Bauen eines Projektes sind im wesentlichen:

- compilieren aller Quellfiles zu Objektcode. Hier werden evtl. 
verschiedene Compiler (C, C++, Assembler, ...) benötigt
- linken der Objektfiles und der verwendeten Libraries zum Target
- evtl. Postprocessing wie das Erzeugen von .hex und .eep Ladefiles

Eine IDE "weiß", wie das alles zusammenhängt und sobald du deine Quellen 
zum Projekt getan hast und gesagt hast welche externen Libs du brauchst, 
kann die IDE selber Compiler und Linker entsprechend aufrufen. Manche 
IDEs schalten hier make ein, indem sie ein Makefile generieren und das 
dann durch make jagen. Aber das ist eher die Ausnahme als die Regel.

Die IDE-Verweigerer unter uns verwenden hingegen direkt ein Makefile. 
Die Details werde ich hier weglassen (kannst du in der Doku von z.B. GNU 
make nachlesen). Oder hier: AVR-GCC-Tutorial/Exkurs Makefiles

Im Prinzip besteht ein Makefile aus zwei Arten von von Deklarationen:

1. Definition von make-Variablen. Viele davon habe magische Namen, z.B. 
CC für den C-Compiler und CFLAGS für die Kommandozeilenoptionen für den 
C-Compiler.

2. Regeln. Eine Regel beschreibt dabei einerseits Abhängigkeiten der 
Files voneinander, als auch wie man aus dem Quellfile das Zielfile 
erzeugt. Beispiel:
1
foo.o: foo.c
2
  $(CC) $(CFLAGS) -c foo.c -o foo.o

das ist die Regel für die Erzeugung von foo.o. Es ist abhängig von foo.c 
- wenn make also ein neueres foo.c als foo.o findet, weiß es daß es 
foo.o neu erzeugen muß. Die nächste Zeile verwendet dann die magischen 
Variablen für den C-Compiler, um foo.c zu foo.o zu compilieren.

Was die Sache für Anfänger etwas sperrig macht, sind zum einen die 
vielen magischen Variablen und zum anderen die Tatsache, daß make 
unheimlich viele Regeln bereits eingebaut hat. Obige Regel für .c -> .o 
ist z.B. eingebaut.

In der Praxis sieht ein Makefile meist so aus, daß man ganz oben seine 
Quelldateien auflistet. Darunter gibt man noch an, für welchen 
Controller man das ganze bauen will und evtl. noch die 
Optimierungsstufe.

Der ganze Rest darunter sind dann Regeln, die normalerweise immer gleich 
sind. Deswegen schreibt man Makefiles seltenst komplett neu, sondern 
verwendet ein altes und paßt nur die wenigen Stellen an, die sich 
gändert haben. Auch gibt es Makefile-Generatoren wie mfile für 
AVR-Projekte.

Soweit im Telegrammstil ertmal das wichtigste. Es gäbe noch viel mehr, 
wie Default-Targets, wie man make depend automatisiert usw. usf.


HTH, XL

von Anfänger (Gast)


Lesenswert?

Danke für die Antworten, einiges kannte ich schon, einiges war neu
Wenn ich doch nur das heute gelernte behalten könnte^^

Axel Schwenke schrieb:
> Manche IDEs schalten hier make ein, indem sie ein Makefile generieren und
> das dann durch make jagen. Aber das ist eher die Ausnahme als die Regel.

Du meinst sowas wie Eclipse?

Gruß Stefan

von Kein Name (Gast)


Lesenswert?

Lass dich nicht verwirren.

Das hat schlicht und einfach historische Gründe. Früher, als es noch 
keine IDEs gab, hatten die Programmierer das Makefile selbst 
geschrieben.

Bei der Entwicklung der IDEs war es dann einfacher, das alte Makefile zu 
behalten.

Debugging? Irgendwas hast du da falsch aufgerufen. Früher war ein "make 
debug" üblich. Danach konnte man den Debugger benutzen.

von W.S. (Gast)


Lesenswert?

Axel Schwenke schrieb:
> - es sind keine Skripts

Ach Axel, da liegst du ganz falsch.
Makefiles SIND Skripte.

Dummerweise sind es solche, die nur von ihrem jeweiligen Make-Programm 
(fast hätte ich 'make.exe' geschrieben :-) verstanden werden. Es gibt 
leider eine eher unübersichtliche Anzahl verschiedener Makes, die alle 
ihr eigenes Süppchen kochen und demzufolge ist Babylon angesagt. Ich 
z.B. hab das Babylon notgedrungen (und nicht aus freien Stücken!) auf 
meinem Rechner in der Firma. Wenn ich mich recht entsinne, sind das bei 
mir so um die 7 oder 8 Makes, und wenn man selbige nicht aus einer 
Batchdatei heraus aufruft, wo man zuvor fein säuberlich den Suchpfad 
passend eingerichtet hat, geht garnix.

Das Blöde an Make und Makefiles ist, daß es eben jeweils eine eigene 
Skriptsprache ist, die man erst mal erlernen und dann im Kopf behalten 
muß, um sowas richtig zu schreiben.

Für Leute, die beruflich eher ne Art Monokultur betreiben, ist das 
sicherlich kein Problem.

Aber für alle anderen ist es eben noch eine zusätzliche Sache, die man 
lernen und handhaben muß - oder gar mehrere zusätzliche Sachen. Da ist 
es einem sehr viel lieber, entweder eine passende IDE zu benutzen oder 
sich einmal ne simple Batchdatei zusammenzuschreiben - das ist 
dramatisch einfacher als ein Makefiles.

Und wozu das Ganze?

Ich sag's mal ganz provokativ: Für Mikrocontroller-Angelegenheiten, die 
hier in diesem Forum diskutiert werden, ist Make völlig obsolet, ein 
Fall für die Tonne. Die paar Quelldateien, die üblicherweise zu einer 
typischen Geräte-Firmware dazugehören, kann man mit jedem 
Übersetzungslauf ALLE übersetzen und die vor 30 Jahren mal angedachte 
Zeitersparnis durch selektives Übersetzen per Make macht bei den 
heutigen PC-Geschwindigkeiten keinen Sinn mehr. Ich schätze sogar, daß 
deine Diplomarbeit auch nicht schlechter ausgefallen wäre, wenn du kein 
Make verwendet hättest. Als ich diplomierte, gab's noch kein Make, da 
wurden Diplome per Schreibmaschine getippt und Dissertationen in ne 
Druckerei gegeben und Programme noch auf Lochband gestanzt. Was hab ich 
damals an Lochband aufgerollt! Wahrscheinlich mehr als einmal um den 
Äquator. TAR stammt aus dieser Zeit. TapeArchiver. Der TAR-Header 
(256xnul und dann alles oktal) spiegelt noch jetzt die Verhältnisse am 
Lochbandstanzer wider.

Abschließend ein Wort an unseren Anfänger: Es ist 1000 mal besser, seine 
grauen Zellen mit wichtigeren Dingen zu füllen als sich mit Make und 
Konsorten zu befassen. Make macht kein einziges Software-Projekt besser.

W.S.

von Axel S. (a-za-z0-9)


Lesenswert?

W.S. schrieb:
> Axel Schwenke schrieb:
>> - es sind keine Skripts
>
> Ach Axel, da liegst du ganz falsch.
> Makefiles SIND Skripte.

Nur wenn man den Begriff Skript sehr weit faßt. Im Gegensatz zu 
klassischen Skriptsprachen (insbesondere den angesprochenen .BAT 
Dateien) benutzt make einen deklarativen Ansatz.

> Es gibt
> leider eine eher unübersichtliche Anzahl verschiedener Makes, die alle
> ihr eigenes Süppchen kochen und demzufolge ist Babylon angesagt.

Stimmt, ist aber eine vollkommen andere Baustelle.

Eine Ursache für den Wildwuchs ist, daß make genauso wie ein C-Compiler 
klassisch ein proprietäres Stück Software war, das oft genug nicht 
unerheblich Geld kostete. Erst die GNU Leute haben das aufgebrochen und 
es ist mir eine große Freude sagen zu können, das GNU make heute der 
de-facto Standard ist (auch wenn das einige Leute schlecht finden; 
bescheuerterweise besteht deren "Lösung" dann immer darin, entweder ein 
weiteres make Derivat  [ z.B. Jörg Schillings smake ] oder einen 
Ersatz a'la ant oder cook zu propagieren - sie bekämpfen also den 
Wildwuchs mit noch mehr Wildwuchs - sehr clever)

> es einem sehr viel lieber, entweder eine passende IDE zu benutzen oder
> sich einmal ne simple Batchdatei zusammenzuschreiben - das ist
> dramatisch einfacher als ein Makefiles.

Mal abgesehen davon, daß IDEs noch viel proprietärer sind als Makefiles 
- sie sind auch nicht ansatzweise so mächtig. Ein Bekannter hat mal die 
These von der Erhaltung der Gemeinheit aufgestellt: sprich daß Dinge 
die kompliziert sind, kompliziert bleiben, egal auf welche Weise man sie 
angeht. Für das Problem, das make löst, scheint mir das zuzutreffen. 
Jede korrekte Lösung wird zwangsläufig einen nicht vermeidbaren Grad an 
Komplexität haben.

> Ich sag's mal ganz provokativ: Für Mikrocontroller-Angelegenheiten, die
> hier in diesem Forum diskutiert werden, ist Make völlig obsolet, ein
> Fall für die Tonne.

Deine Meinung muß ich dir wohl lassen. Auch wenn ich sie nicht teile.


XL

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.