2008-09-15 4 views
56

Ich habe Make und Makefiles seit vielen Jahren verwendet, und obwohl das Konzept ist solide, die Implementierung hat etwas zu wünschen übrig.Vielversprechende Alternativen zu machen?

Hat jemand irgendwelche gute Alternativen gefunden, um das Problem nicht zu komplizieren?

+0

Wird die Antwort nicht stark davon abhängen, was das Problem ist? Für die Dinge, die ich damit zu tun habe, ist 'make' zu ​​einfach. – reinierpost

+0

Ruby Rake, CoffeeScript Kuchen, Python Scons, Java Ant/Maven, C# MSBuild, Cross-Plattform CMake – Pred

Antwort

23

check out . Zum Beispiel machen Doom 3 und Blender Gebrauch davon.

+0

+1 für SCONS - konzeptionell ähnlich genug, damit es leicht ist, Ihren Kopf herum zu bekommen, aber einige der schlechter gebrochenen Dinge behebt über make (z. B. die Behandlung von Leerzeichen in Namen). – Tom

+0

SCons ist nur Python 2, und nachdem ich Tage mit tring verschwendet habe, um eine Python 3-Version eines in Python und C++ geschriebenen Projekts mit SCons zu kompilieren, würde ich Leuten raten, wegzubleiben. Verwenden Sie einfach CMake, es wird Standard für C++ an diesem Punkt. Wenn Sie ein Python-basiertes Build-System verwenden möchten, verwenden Sie [Meson] (http://mesonbuild.com/). Es läuft schnell und wird aktiv entwickelt, was für SCons nicht gesagt werden kann. – ostrokach

10

Ich empfehle die Verwendung . Es ist das einfachste Tool, das ich gefunden habe.

Andere gute Werkzeuge, die ich verwendet habe, obwohl, wenn Rubin nicht Ihr Ding ist, sind:

  • AAP (Python)
  • SCons (Python)
  • Ant (Java, config in XML, ziemlich komplex)
3

Es hängt irgendwie davon ab, was Sie versuchen zu tun. Wenn alle Sie möchten, ist Make-Stil Zielabhängigkeiten und Befehl Aufruf, dann Make ist eigentlich eines der besseren Werkzeuge für die Aufgabe. :-) Rake ist sehr nett, kann aber für einige einfache Fälle schwerfällig sein. Ant ist natürlich Ausführlichkeit Stadt, aber es hat bessere Unterstützung für den Aufbau Java-ähnliche Sprachen (Scala und Groovy enthalten). Auch Ant ist verfügbar überall. Das ist der Hauptgrund, warum ich es benutze. Da es unter Windows konsistent funktioniert, ist es tatsächlich noch plattformübergreifender als Make.

Wenn Sie Dependency Management für Java-ähnliche Bibliotheken wünschen, ist Maven die kanonische Wahl, aber ich persönlich mag Buildr viel besser. Es ist schneller und viel einfacher anzupassen (es basiert auf Rake). Leider ist es noch nicht so allgegenwärtig wie Maven.

25

Ich habe viele Freunde, die von CMake für Cross-Plattform-Entwicklung schwören:

http://www.cmake.org/

Es ist das Build-System für VTK (unter anderem) verwendet, die eine C++ Bibliothek mit Cross- Plattform Python-, Tcl- und Java-Bindungen. Ich denke, es ist wahrscheinlich die am wenigsten komplizierte Sache, die Sie mit diesen vielen Fähigkeiten finden werden.

Sie könnten immer den Standard autotools versuchen. Automake-Dateien lassen sich sehr einfach zusammenstellen, wenn Sie nur mit Unix arbeiten und wenn Sie bei C/C++ bleiben. Die Integration ist komplizierter und autotools ist bei weitem nicht das einfachste System aller Zeiten.

+6

Beachten Sie, dass CMake nur Makefiles generiert. Also, wenn das Problem mit der Implementierung von GNU Make ist, dass es etwas tun kann, was Sie wollen, dann wird CMake Ihnen wahrscheinlich nicht helfen. Oder Autotools. – Tom

+6

CMake erzeugt nicht nur Makefiles. CMake kann viele verschiedene Arten von Build-Dateien erzeugen, die auf verschiedene Compiler und Plattformen abzielen. Persönlich hasse ich CMake, weil die Konfigurationssyntax absolut ekelhaft ist. – Taywee

15

Einige der GNOME-Projekte wurden auf waf migriert.

Es ist Python-basiert, wie Scons, aber auch Standalone - also anstatt andere Entwickler zu benötigen, um Ihr Lieblings-Build-Tool installiert zu haben, kopieren Sie einfach das eigenständige Build-Skript in Ihr Projekt.

-1

Ich bin mir nicht sicher, ob Sie hier die richtige Frage stellen.

Sind Sie nach einem vereinfachten make? In diesem Fall müssen Sie jemanden, der mit make vertraut ist, dazu bringen, eine Reihe von (M | m) Akefiles zu erstellen, die Ihr Problem vereinfachen.

Oder möchten Sie die zugrunde liegende Technologie betrachten? Wollen wir eine Design-by-Contract-Architektur durchsetzen, die in das Code-Design integriert ist? Oder möglicherweise die Sprache selbst, z.B. Ada und sein Konzept von Spezifikationen (Schnittstellen) und Körpern (Implementierungen)?

In welche Richtung werden Sie die möglichen Ergebnisse einer solchen Frage definitiv beeinflussen?

Grundsätzlich neue Wege zum Aufbau von Systemen nur aus jenen Komponenten, die sich wirklich verändert haben, im Vergleich zur Einführung neuer Technologien, die solche Mechanismen eingebaut haben.

Sorry, es ist keine direkte Antwort. Ich wollte nur versuchen, dich dazu zu bringen, einzuschätzen, welchen Weg du gehen willst.

prost,

Rob

+0

Eine einfache Antwort auf eine komplexe Frage ist nicht möglich. Eine stärkere Fokussierung in der Frage würde helfen. –

1

ich immer noch lieber ein paar Alternativen in Betracht gezogen machen, nachdem sie. Wenn Sie Abhängigkeiten automatisch über den Compiler oder etwas wie Fastdep generieren, bleibt nicht mehr viel zu tun. Insbesondere möchte ich nicht, dass mein Build-Skript an die Implementierungssprache gebunden ist, und ich mag es nicht, Dinge in XML zu schreiben, wenn besser lesbare Alternativen verfügbar sind. Ein Werkzeug, das eine allgemeine Sprache verfügbar macht, hat zwar einen Wert, aber eine andere interpretierte Sprache nicht (afaik). What is Wrong with Make? könnte zu Ihrem Standpunkt über die Abkehr von make ansprechen.

/Allan

+0

Ich bevorzuge auch Make; Es ist Moor Standard, überall verfügbar, und es gibt eine vernünftige Chance, dass jeder, der neu im Projekt ist, es schon einmal benutzt hat (oder zumindest eine bessere Chance als alles andere). Aber. Ich habe eine große Codebasis (mehrere tausend C++ - Quelldateien), die für Visual C++ geschrieben ist und die ich unter GCC unter Linux erstellen möchte. Make schien die offensichtliche Wahl für ein Build-Tool zu sein, und wir haben einen schnell-und-schmutzig-Konverter geschrieben, der vcxproj-Dateien analysiert und Makefiles erzeugt. Es war alles super, bis wir es an einem Projekt mit einem Platz im Namen versuchten. Was sollen wir tun? – Tom

+0

Für den Rekord, ich habe mit SCons endete. Da unser Konverter sowieso in Python geschrieben wurde, war es ziemlich einfach, das stattdessen in ein SConscript zu konvertieren. – Tom

10

doit ist ein Python-Tool. Es basiert auf den Konzepten von Build-Tools, ist aber allgemeiner.

  • Sie können festlegen, wie eine Aufgabe/Regel ist up-to-date (nicht nur Zeitstempel überprüft werden Dateien Ziel nicht erforderlich)
  • Abhängigkeiten dynamisch durch andere Aufgaben berechnet werden kann
  • Aktionen sein können Aufgabe python-Funktionen oder Shell-Befehle
+0

danke diese Antwort, Doit sieht aus wie ein erstaunliches Werkzeug – Bedros

0

FlowTracer von RTDA eine gute Wahl ist, dass ich in einem großen Maßstab Umgebung (Zehntausende von Arbeitsplätzen) kommerziell verwendet gesehen: http://www.rtda.com/flowtracer-design-flow-infrastructure-software

Es hat eine GUI, die den Abhängigkeitsgraphen mit farbcodierten Feldern für Jobs und Ovalen für Dateien anzeigt. Wenn die Anzahl der Jobs und Dateien hoch ist, ist ein GUI-basiertes Tool wie FlowTracer sehr wichtig.

Die anfänglichen Kosten für die Einrichtung sind höher als für Make. Es gibt eine Lernkurve, um deinen ersten Flow damit einzurichten. Danach wird es schneller.

4

Achten Sie auf das ninja Build-Tool (v1.8.2. September 2017), die von tup und redo beeinflusst wird.

Der Build-Datei-Generator cmake (zB für Unix Makefiles, Visual Studio, XCode, Eclipse-CDT, ...) erzeugen kann auch ninja Dateien bauen seit Version 2.8.8 (April 2012) und afaik, ninja jetzt gerade ist das Standard-Build-Tool, das von cmake verwendet wird.

Es soll das Tool make übertreffen (bessere Abhängigkeitsverfolgung und ist auch parallelisiert).

cmake ist ein bereits etabliertes Werkzeug. Sie können das Build-Tool später immer auswählen, ohne Ihre Konfigurationsdateien zu ändern. Wenn also in Zukunft ein besserer Build entwickelt wird, der von cmake unterstützt wird, können Sie bequem darauf zugreifen.

Beachten Sie, dass für C/C++ Kompilierung Verbesserung manchmal wegen der Header begrenzt durch den Präprozessor enthalten (insbesondere bei Kopf nur Libs verwenden, zum Beispiel boost & eigen), die hoffentlich durch den Vorschlag modules ersetzt werden (in einer technischen Überprüfung von C++ 11 oder schließlich in C++ 1y). Weitere Informationen zu diesem Problem finden Sie unter presentation.

+3

Bemerkenswerterweise 'tup' hängt von' fuse' ab und hat die Sicherung Kernel-Erweiterung läuft, was meiner Meinung nach die Betreuer sind Nüsse. 'Redo' wurde in zwei Jahren nicht aktualisiert. Ich würde 'Ninja' empfehlen. – mxcl

4

Ich schrieb ein Tool namens sake, das versucht, das Schreiben von Makefile-ähnlichen Dingen sehr einfach zu lesen und zu schreiben.

+0

Interessant; Könntest du uns aber ein paar Informationen geben, warum du denkst, dass Sake einfacher zu lesen und zu schreiben ist?Wir sollten das Projekt nicht installieren müssen, um es zu sehen, es beantwortet die Frage. –

+0

Sicher! Es klang für mich wie ein Teil des Grundes, warum der Autor der ursprünglichen Frage besorgt war, dass die Implementierung von Make "das Problem überkompilieren" wegen der obskuren Syntax von Makefiles. Sake benutzt Dateien, die in YAML geschrieben sind und, was ich von den Eingaben anderer Leute entnehme, viel einfacher zu lesen und zu schreiben. – tonyfischetti

+0

Die Tatsache, dass es die YAML-Syntax verwendet, sollte Teil der Antwort sein, vielleicht mit einer gewissen Ausarbeitung darüber, wie YAML mit der "make" -Syntax kontrastiert. –