Soll ich wirklich make benutzen?

7

Irgendwann schnappten sich ein Kollege und ich ein "Beispiel" Makefile aus dem Netz, um unseren Embedded Code für einen xmega Chip zu erstellen. Wir haben die Erfahrung sehr frustrierend gefunden. Keiner von uns ist ein Experte, höchstens ein Neuling. Wir bekommen durch gelegentliche Anpassungen / Anpassungen. Wir verbringen Stunden damit, Handbücher zu schreiben und Pfeile zu werfen, um ernstere Änderungen zu versuchen.

Normalerweise wenn wir bauen, beginnen wir immer mit einem sauberen Alles. Weil die automatische Abhängigkeitsgenerierung nicht zuverlässig zu funktionieren scheint und wir gerade erfahren haben, dass es auf diese Weise sicherer ist. Da es sich um ein eingebettetes Projekt auf einem kleinen Prozessor handelt, fliegt die Kompilierung tatsächlich. Es ist mit einem Augenzwinkern geschehen, was mich zu meiner eigentlichen Frage führt:

Wenn ich make nicht dazu nutze, irgendeine Art von Abhängigkeitsverwaltung zu übernehmen und inkrementelles Bauen zu nutzen, ist es wirklich sinnvoll, es anstelle eines einfachen Shell-Skripts zu verwenden?

Ich bin viel sicherer beim Schreiben von C-Code, Python und guten alten Bash-Skripten. Die letzte Frustration von heute war, eine Handvoll unserer Source-Dateien zu FreeRTOS in Unterverzeichnisse zu verschieben. Der einzige wirkliche Vorteil von make ist, dass es auf OSX installiert ist und dass vi und QtCreator und XCode eine gewisse Fähigkeit haben, in unser Makefile zu integrieren (aber ich könnte ein sehr minimales Makefile erstellen, das hier überbrückt wird).

>     
Travis Griggs 03.01.2013, 00:35
quelle

6 Antworten

2

Dies ist eine Frage, die ich mir vor einiger Zeit gestellt habe. Persönlich verwende ich Python-Skript, um meinen Code für AVR ( link ) zu kompilieren. Ich bin kein Experte, aber ich habe etwas Erfahrung damit. Trotzdem finde ich es frustrierend und für uns braucht es nichts wert, es sei denn du bist sowieso schon ein Experte.

Nicht dass ich irgendjemanden dazu ermutige, aber nichts kann Sie davon abhalten, die gleiche Abhängigkeitsprüfung in Python (Perl, Ruby, Bash ...) zu implementieren, möglicherweise sogar viel mächtiger. Ich glaube, es ist nur eine Frage der Sprachwahl oder was Sie sich wohl fühlen. make ist nur eine Art Programmiersprache und es mag für Anfänger ziemlich dunkel erscheinen.

    
Stefan 03.01.2013, 11:35
quelle
17

Make ist ein ehrwürdiges Expertensystem für die Erstellung von Software. Es wird immer noch stark und ausgiebig verwendet, also ist es ja lohnenswert zu lernen. Sie können das Glück haben, ein Projekt in dem Moment zu haben, das fast augenblicklich aufbaut, aber nach meiner Erfahrung ist dies die Ausnahme nicht die Regel.

Da Abhängigkeitsverfolgung und Aktionsschlussfolgerung der Zweck von Make sind, ist die Verwendung von nur einem Batch-System ein Nullgewinn und stört Sie außerdem beim Erlernen der Verwendung des Tools (Make).

In Ihrem Beitrag klingt es so, als ob Sie mit Make mit Unterverzeichnissen in Konflikt geraten wären. Obwohl es wahrscheinlich Ihr unmittelbares Problem nicht lösen wird, kann dieses Papier: Rekursiv als schädlich ansehen , kann dazu beitragen, die Situation zu erklären, und geben Sie Einblick in den Betrieb von Make selbst.

Make erzeugt nicht automatisch Abhängigkeiten. Sie finden zahlreiche Ressourcen im Internet, um automatisch Abhängigkeiten für GNU Make zu generieren. Ich bin mir nicht sicher, ob OSX GNU Make oder BSD Make verwendet (oder auch wenn die BSD-Variante noch existiert). Wenn es das Letztere (BSD) ist, bin ich sicher, dass Sie Rezepte finden können, wie man Abhängigkeiten für BSD-Variante automatisch erzeugt.

Die existenziellere Frage, die ich in diesem Beitrag abschließe, lautet: Ist es wertvoll, dieses alte Werkzeug zu lernen, wenn es meinem Projekt keinen unmittelbaren Nutzen bringt?

Als Antwort würde ich sagen: Ihr kleines Projekt ist die perfekte Gelegenheit, um dieses Werkzeug zu lernen. Wenn Sie mit einem Projekt konfrontiert sind, bei dem eine inkrementelle Kompilierung wirklich Zeit spart, ist die Schmerzschwelle wahrscheinlich viel höher.

Es gibt viele andere Build-Systeme, die entweder ersetzen. Beispiel: Jam , SCons , Rake , oder agiere als Meta-Makefile-Generator: CMake , einige IDEs. Die bloße Anzahl der Ersetzungen ist ein Indiz dafür, dass viele Make unzureichend finden (oder vielleicht sogar nur unangenehm).

Aber ein wenig Wissen über Make dürfte Ihnen auf absehbare Zeit helfen. Es ist möglicherweise auch der erste (oder offensichtlichste) Schritt, um zu verstehen, wie Build-Systeme funktionieren, und die Probleme, die mit der Regelproduktion und der Abhängigkeitsverfolgung verbunden sind.

Viel Glück.

    
Marc Butler 03.01.2013 01:26
quelle
2

Ich hätte persönlich make nicht direkt verwendet, fast unabhängig von der Größe Ihres Systems (das heißt, ich könnte es in seltenen Fällen auf extrem kleinen Systemen verwenden). Ich hätte ein Werkzeug benutzt, das Makefiles für dich erzeugt. Natürlich würden Sie das auf einem OS-Betriebssystem installierte Teil verlieren, aber eine Menge Kopfschmerzen loswerden.

Ich persönlich würde Ihnen empfehlen, sich CMake und Autotools anzuschauen. Persönlich bevorzuge ich CMake, und finde es brillant, während Autotools einige der Kopfschmerzen entfernen, aber einige neue hinzufügen. Entweder eine von ihnen finde ich besser als Makefiles.

Cmake hat auch den Vorteil, dass es plattformübergreifender ist und Makefiles, visuelle Studio-Dateien, code :: block-Dateien und vieles mehr erstellen kann. Es unterstützt auch vollständige Out-of-Source-Builds, dh Sie können einen _build-Ordner erstellen und von dort aus erstellen. Dadurch werden alle generierten Dateien in den _build-Ordner verschoben, anstatt den Quellbaum zu verschmutzen.

EDIT: Um Ihre Frage zu beantworten: Ich würde grundlegende Make-Dateien lernen, um zu verstehen, was es macht. Aber dann wäre ich umgezogen. Also würde ich lernen machen, aber nicht benutzen.

    
martiert 03.01.2013 11:48
quelle
2

Fast jedes nicht-triviale C-Programm, das keine einzelne Kompilierungseinheit ist, hat Abhängigkeiten in sich selbst und fast alle hängen von Systembibliotheken ab.

Sofern Sie nicht vorhaben, ein Skript zu schreiben, das jedes Mal ein sauberes Build ausführt, ist ein Tool zur Abhängigkeitsverwaltung erforderlich, um Ihren Arbeitsablauf in Ordnung zu halten.

make ist die kanonische Wahl und eignet sich gut als Job, wenn Sie einen Weg finden, die Abhängigkeitsregeln automatisch zu generieren.

Das QT-Build-System integriert sich nicht in Makefiles, sondern erstellt es aus einer noch höheren Beschreibung Ihres Projekts. QTCreator ist eines von vielen Werkzeugen, die eine GUI um diesen Prozess herum bereitstellen. Wenn Sie von QTCreator kompilieren, wird tatsächlich die resultierende Makefile aufgerufen. Sie können qmake auch verwenden, um XCode- und Visual Studio-Arbeitsbereichsdateien zu generieren.

Das QT-Build-System ist eigentlich eine ziemlich gute Wahl für eingebettete Projekte, auch wenn QT nicht verwendet wird, da es relativ einfach ist, es für die Cross-Compilierung einzurichten.

    
marko 03.01.2013 01:19
quelle
1

Es sei denn, Sie benutzen eine IDE, make ist wirklich das De-facto-Werkzeug für diese Art von Ding, es sei denn, Sie wollen weiter gehen und automake oder ähnliches benutzen. Ich denke, das ist zu viel für Ihren Fall.

Die automatische Abhängigkeitsgenerierung ist etwas schwierig, aber Sie können im Allgemeinen ein Rezept im Internet finden, das funktioniert. Ich bin mir nicht sicher, welches spezifische Problem Sie hatten, aber vielleicht ist das eine eigene Frage wert.

Es könnte sein, dass ein Bash-Skript für Ihre Bedürfnisse ausreicht; Wenn das stimmt, dann geh. Da Sie mit Python besser vertraut sind, möchten Sie vielleicht auch etwas wie SCons sehen.

Ich habe ein gutes Stück Makefile-Arbeit gemacht, aber ich bin gerade dabei, zu Rake zu wechseln. Ich finde die Kraft von Ruby unter der Haube, um meinen Bedürfnissen besser gerecht zu werden als make.

    
Randy Coulman 03.01.2013 01:07
quelle
0

Wenn Sie jedes Mal einen vollständigen Build erstellen, führt die Verwendung von make, um jedes Mal genau die gleiche Befehlsfolge auszuführen, zu keinem wirklichen Vorteil. Make ist jedoch ein extrem leistungsfähiges System, und Sie machen einen Fehler, es zu meiden. Make summiert sich zu einer ganzen Menge mehr, als Sie hoffen können, zusammen mit benutzerdefinierten "Python-Build-Skripten" zu erstellen.

  1. Auch wenn dieses Projekt klein genug ist, um schnell von Grund auf neu zu erstellen, werden Sie bald etwas Größeres anpacken. Make ist mit einem einfachen Anwendungsfall einfacher zu erlernen als mit einem komplexen Anwendungsfall. Sie sagen, dass "automatische Abhängigkeitsgenerierung nicht zuverlässig funktioniert": Wenn Sie die Abhängigkeiten korrekt definieren, ist make extrem zuverlässig. Es muss also ein Fehler in Ihrem Setup sein (mehr dazu unten).

  2. Make ist nützlich, auch wenn Sie immer von Grund auf neu erstellen: Anstatt ein paar kleine Build-Skripte zu erstellen, können Sie das Makefile als Container für alle Build-bezogenen Befehle verwenden, alle davon gesteuert Symbolische Variablen: Wenn Sie beispielsweise eine Variable wie ALLSOURCE haben, können Sie sie mit Pseudozielen verwenden, die eine Zip-Datei, einen Ctags-Index usw. erstellen ( make clean funktioniert auch so). Wenn Sie separate Batch-Skripte für alles schreiben, werden Sie versuchen, sie bei der Entwicklung Ihres Projekts zu aktualisieren - und sie werden Ihr Verzeichnis ohne Grund durcheinander bringen.

Aber die Abhängigkeiten funktionieren nicht zuverlässig, sagen Sie. Ich vermute, dass es ein Fehler war, mit dem Skript eines anderen zu beginnen: Es hat wahrscheinlich zu viel getan, was Sie nicht brauchen und nicht ganz verstehen. Beginnen Sie mit einem sauberen Makefile, fügen Sie Ziele für die von Ihnen generierten Binärdateien hinzu und schreiben Sie eigene Abhängigkeiten. Halte es einfach; Wenn Ihr Projekt so einfach zu erstellen ist, dass Sie sogar daran denken, Ihr eigenes Skript zu erstellen, sollte es einfach sein, ein Makefile dafür zu schreiben. Wenn Sie nicht weiterkommen, stellen Sie hier spezifische Fragen.

    
alexis 26.01.2013 20:45
quelle

Tags und Links