Forum: Mikrocontroller und Digitale Elektronik AVR C-Programm ohne Make-File. Größere Nachteile?


von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Moin!

Mir ist das mit dem Make-File oft zu umständlich, deswegen verwende ich 
nicht immer eines. Muss ich mit größeren Nachteilen rechnen?

Mir ist klar, dass es dann schwierig wird, wenn ich mehr als eine 
Quelldatei im Projekt habe. Aber oft habe ich da nur eine einzige. Sind 
Probleme zu erwarten?

(Ich verwende keine IDE, übersetze immer nur per gcc-Kommando.)

von Peter II (Gast)


Lesenswert?

Markus Weber schrieb:
> (Ich verwende keine IDE, übersetze immer nur per gcc-Kommando.)

und was ist an einem make Aufruf schwerer also mehre gcc befehle 
hintereinander aufzurufen?

Compiler
Umwandleln nach hex
übertragen

von Irgendwer (Gast)


Lesenswert?

Dann musst du halt den ganzen Rattenschwanz an Parametern für die 
einzelnen Tools jedesmal von neuem eintippen mit der entsprechend großen 
Gefahr sich dabei auch mal zu vertippen.

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Irgendwer schrieb:
> Dann musst du halt den ganzen Rattenschwanz an Parametern für die
> einzelnen Tools jedesmal von neuem eintippen mit der entsprechend großen
> Gefahr sich dabei auch mal zu vertippen.

Oder er schreibt diesen Rattenschwanz in eine Batch-Datei ;-)

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Ein Make erzegt auch nur eine Kommandozeile für den GCC. Man kann daher 
auch direkt die Kommandozeile hinschreiben.
Und wenn man das in einer Batch macht, ist es auch nicht mehr 
Schreibaufwand.
Man kann in der Batch zusätzlich DOS-Befehle ausführen, z.B. Beep oder 
Abbruch bei Fehlern.

Markus Weber schrieb:
> Mir ist klar, dass es dann schwierig wird, wenn ich mehr als eine
> Quelldatei im Projekt habe.

Man kann auch einfach *.c übergeben, dann werden alle C-Files im 
aktuellen Verzeichnis compiliert und gelinkt.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Der größte Nachteil von Batch Files ist für mich, dass man damit auf 
Unix Systemen nichts anfangen kann.

Ich benutze für alle meine Projkete immer das gleiche makefile. Da passe 
ich nur wenige Zeile projektspezifisch an. Deswegen ist der Aufwand 
vernachlässigbar.

Wenn ich allerdings nur unter Windows entwicklen würde und dieses ganze 
Multi-Plattform zeugs für mich kein Thema wäre, dann hätte ich micht mit 
Make warscheinlich nie auseinander gesetzt und auch Batch Dateien 
benutzt.

von Karl H. (kbuchegg)


Lesenswert?

Markus Weber schrieb:
> Moin!
>
> Mir ist das mit dem Make-File oft zu umständlich,

jetzt muss ich aber schon fragen, was an einem makefile umständlich ist.

OK, voll ausgefuchste makefiles sind schon recht umfangreich.
Aber: wenn sonst schon nichts anderes, dann kannst du dir mit einem 
makfile Tipparbeit ersparen. Ob du deine Kommandos in ein Batch-File 
schreibst oder in ein makfile ist letzten Endes ja egal.

Ein Makefile ist im einfachsten Fall eine ganz einfache Sache. Das sind 
einfach nur Aufzählungen von 'Regeln' nach dem Muster
1
Zieldatei: Quelldatei(en)
2
<tab>Kommando das auszuführen ist, um die Zieldatei neu zu erstellen

ist nichts weiter angegeben, dann ist die erste vorgefundene Regel im 
makefile das zu erzeugende Target, d.h. dort beginnt alles.
Make vergleicht einfach nur das Filedatum der Zieldatei mit den 
Filedaten der Quelldatei(en) und wenn eine der Quelldateie(en) neuer als 
die Zieldatei ist, dann wird das angegebene Kommando ausgeführt. Vorher 
sieht make allerdings noch nach, ob es für die jeweiligen Quelldateien 
selbst wieder eine Regel gibt.

Das ist alles.
D.h. ein makfile muss nicht mit Makros und weiß der Teufel was 
ausgestattet sein. Du schreibst einfach die Kommandos, die du auch jetzt 
ausführst in eine Datei namens 'makefile', rückst das Kommando mit einem 
Tabulator ein (das ist wichtig) und ergänzt davor noch jeweils eine 
Zeile, welches File mit diesem Kommando aus welchen anderen Files 
erzeugt wird. Dein bisheriges 'letztes Kommando' setzt du noch an den 
Anfang des Makefiles und das wars dann auch schon. DU hast dein erstes 
makefile erzeugt.
In Zukunft kannst du dann einfach make an der Command-Line eingeben und 
make findet anhand der Regeln und der Filedaten raus was es zu tun gibt 
und führt die Aktionen aus, indem sie die von dir hingeschriebenen 
Kommandos genau so an die Command Line übergibt, wie es auch passieren 
würde, wenn du sie eintippst.

Das ist der einfachste Fall der Verwendung von make. Alles darüber 
hinausgehende ist dann nur noch Komfortfunktion, wie zb. dass man 
Compilerflags nur an einer Stelle angibt anstatt in jeder Regel erneut, 
etc. etc.

Aber wenn du die Kommandos zur Erzeugung deines HEX-Files bis jetzt 
händisch eingegeben hast oder die in einem Batch-File stehen, dann 
kannst du die genausogut auch in ein makefile schreiben. Das Aufwand ist 
im Falle eines Batch-Files nahezu der gleiche und im Fall einer jedes 
mal erneuten händischen Eingabe in die Command Line massiv weniger.

: Bearbeitet durch User
von Karol B. (johnpatcher)


Lesenswert?

Markus Weber schrieb:
> Mir ist klar, dass es dann schwierig wird, wenn ich mehr als eine
> Quelldatei im Projekt habe. Aber oft habe ich da nur eine einzige.

Dann sind deine Projekte entweder trivial klein, oder aber du machst 
keinen Gebrauch von Kapselung. Damit gestaltet sich die Wartung und die 
Wiederverwendung einzelner Module als schwierig.

Und sobald du mehrere Dateien bzw. Module hast, machen Makefiles schon 
Sinn, Oder man überlasst das Ganze seiner IDE ;).

Mit freundlichen Grüßen,
Karol Babioch

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Rene Schube schrieb:
> Oder er schreibt diesen Rattenschwanz in eine Batch-Datei ;-)

Ähm, ja. :-) Ich bin nämlich ziemlich faul.

Danke für eure Antworten und Karl Heinz für die ausführliche 
Beschreibung!
Viele Einsteiger (wie ich anfangs auch) werden durch die Komplexität des 
Muster-Makefiles erst einmal überrollt.

Natürlich ist Make ein leistungsfähiges Tool, das bei großen Projekten 
mit zig Dateien so richtig in Schwung kommt. Für mich ist es aber zu 
aufwändig, ich bin ja schon zu faul, die Befehle fürs Übersetzen und 
Übertragen einzeln aufzurufen.

von Karol B. (johnpatcher)


Lesenswert?

Markus Weber schrieb:
> ich bin ja schon zu faul, die Befehle fürs Übersetzen und
> Übertragen einzeln aufzurufen.

Ein Grund mehr der für die Verwendung einer IDE spricht ;).

Mit freundlichen Grüßen,
Karol Babioch

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


Lesenswert?

Makefiles sind nicht schwer. Vielleicht etwas ungewohnt.

Speziell für den Bereich avr-gcc gibt es das schnuckelige Tool mfile, 
das dank tcl+Tk auf so ziemlich allen Plattformen läuft und eine GUI 
hat. Damit können sich dann auch make-Legastheniker ein Makefile 
zusammenklicken.

Artikel dazu: Mfile

Ich mache es ähnlich wie ein Vorposter: immer das gleiche Makefile und 
nur die paar Zeilen anpassen, die spezifisch für das Projekt sind.


XL

von Quack (Gast)


Lesenswert?

Axel Schwenke schrieb:
> Makefiles sind nicht schwer.

Richtige Makesfiles sind richtig schwer.

Ich habe schon viele Leute getroffen, die meinten, make sei nicht 
schwierig. Aber noch keinen, der es wirklich beherrscht haette.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Axel Schwenke schrieb:
> Artikel dazu: Mfile

Danke! Schau ich mir mal an.

Karol Babioch schrieb:
> Ein Grund mehr der für die Verwendung einer IDE spricht ;).

Ist ja dann noch komplexer als ein Makefile. Wenn ich überlege, was es 
bei Eclipse und Anjuta alles einzustellen gab... Aber ok, wenn es mal 
läuft, dann ist es wirklich bequem.

Oben kam der Einwand zum Thema Kapselung: Völlig richtig, C sieht da 
Module in Form von einzelnen Dateien vor. Gibt es dazu eine Alternative? 
Bis jetzt realisiere ich die Kapselung durch entsprechende 
Namenskonventionen, die dann eben strikt eingehalten werden müssen.

Ich verfolge jetzt mal den Weg mit den direkten Kommandos weiter. Bin 
dabei, sie in die Quelldatei reinzubasteln.

Werd nachher eine Wiki-Seite dazu anlegen. Schadet ja nicht. :-)

Falls sich jemand mit Windows gut auskennt, kann er gerne helfen, ich 
hab mehr so die Linux-Brille auf.

von Karol B. (johnpatcher)


Lesenswert?

Markus Weber schrieb:
> ich
> hab mehr so die Linux-Brille auf.

Dort sind Make-Files aber täglich Brot. Wenn man solche Dinge nicht 
automatisiert, dann schleichen sich eher oder später Fehler ein.

Mit freundlichen Grüßen,
Karol Babioch

von Falk B. (falk)


Lesenswert?

Nimm AVR Studio (Windows), dort braucht man nicht viel einzustellen und 
für 99,9% aller Projekte reicht das.

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Karol Babioch schrieb:
> Dort sind Make-Files aber täglich Brot.

Stimmt – ich mag sie trotzdem nicht sonderlich. :-)

Falk Brunner schrieb:
> Nimm AVR Studio (Windows), dort braucht man nicht viel
> einzustellen und
> für 99,9% aller Projekte reicht das.

Dann lieber ein Makefile bauen als mit Windows arbeiten zu müssen. ;-)

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

So, hab die Beschreibung ins Wiki gehängt:

C ohne Makefile

Kritik und Verbesserungen willkommen!

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


Lesenswert?

Quack schrieb:
> Axel Schwenke schrieb:
>> Makefiles sind nicht schwer.
>
> Richtige Makesfiles sind richtig schwer.
>
> Ich habe schon viele Leute getroffen, die meinten, make sei nicht
> schwierig. Aber noch keinen, der es wirklich beherrscht haette.

Das beweist höchstens, daß du zu wenig oder doch zumindest die falschen 
Leute kennst :)

Viel schwerer als das Makefile selber, sind die Abhängigkeiten von der 
Umgebung. GNU make ist ja beileibe nicht die einzige Implementierung. 
Und dann operiert make auch nicht im leeren Raum. Die Kunst ist dann 
nicht, "make clean" die richtigen Files löschen zu lassen, sondern das 
plattformspezifische "Lösche-eine-Datei" Kommando zu verwenden.

Aus diesem Grund gibt es auch so viele Projekte rund um make: cmake, GNU 
autotools, xmkmf. Oder Alternativen, die besser sein wollen: SCons, 
cook, ant uvm.

Was die meisten Anfänger überfordert, ist wieviel make auch ganz alleine 
schon weiß. Man kann make durchaus ganz ohne Makefile verwenden:
1
$ls
2
hello.c
3
$cat hello.c 
4
#include <stdio.h>
5
int main(void) {printf("Hello World!\n");}
6
$make hello
7
cc     hello.c   -o hello
8
$./hello 
9
Hello World!

Daß Makefiles für µC-Programme komplexer als normal sind, liegt u.a. 
genau daran. Schließlich muß man make eine Menge Regeln, die es 
eigentlich schon kennt, neu beibringen. Weil der Compiler ein 
Crosscompiler ist und nicht der System-Compiler. Oder weil das Ziel ein 
Flash-Image ist und kein ausführbares File. etc. pp


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.