Was sind die Vorteile von "make" für kleine Projekte? [geschlossen]

8

Ich habe gesehen, dass makedies für große Projekte nützlich ist, insbesondere für verwirrende Abhängigkeiten, die in a beschrieben sind Makefile, und auch für den Workflow. Ich habe keine Vorteile für die Verwendung makefür kleine Projekte gehört. Sind da irgendwelche?

Goodwin Lu
quelle
2
Optimismus für Wachstum? :) gute Gewohnheiten? Dies könnte in Meinungsgebiet verirren.
Jeff Schaller
Geben Sie ein make, um die Antwort zu finden. Erstellen Sie eine anständige Vorlage Makefile und bearbeiten Sie einfach die Variable der Quelldateien. Sie müssen den ganzen Jazz nicht tippen.
user2497
Sie sind eine Art Albtraum für große Projekte, also würde ich ehrlich sagen, dass sie nur für kleine Projekte gut sind;)
Eevee
Ich könnte Makefiles verwenden, aber ich nicht. Ich habe meinen Quellcode für mein größtes (persönliches) Projekt in 10 Dateien aufgeteilt, die erste neu kompiliert und die erste enthält #includes für die anderen neun. Bei der Geschwindigkeit der Neukompilierung ist es mir egal, ob jedes Mal alles neu kompiliert wird.
Jennifer
1
Faulheit :-) makeist ein viel schneller zu tippender Befehl als die meisten anderen, selbst wenn Sie kein intelligentes Makefile erstellen, um Abhängigkeiten sauber zu behandeln :-)
Stephen Harris

Antworten:

11

Im Gegensatz zu was?

Angenommen, Sie haben ein Programm, das Sie in zwei Dateien aufgeteilt haben, die Sie fantasievoll benannt haben file1.cund  file2.c. Sie können das Programm kompilieren, indem Sie es ausführen

cc file1.c file2.c -o yourprogram

Dies erfordert jedoch, dass beide Dateien jedes Mal neu kompiliert werden, auch wenn sich nur eine geändert hat. Sie können die Kompilierungsschritte in zerlegen

cc -c file1.c
cc -c file2.c
cc    file1.o file2.o -o yourprogram

Wenn Sie dann eine der Dateien bearbeiten, kompilieren Sie nur diese Datei neu (und führen Sie den Verknüpfungsschritt aus, unabhängig davon, was Sie geändert haben). Aber was ist, wenn Sie eine Datei und dann die andere bearbeiten und vergessen, dass Sie beide Dateien bearbeitet und versehentlich nur eine neu kompiliert haben?

Selbst für nur zwei Dateien stehen dort Befehle im Wert von etwa 60 Zeichen zur Verfügung. Das Tippen wird schnell mühsam. OK, sicher, Sie könnten sie in ein Skript einfügen, aber dann können Sie jedes Mal wieder neu kompilieren. Oder Sie schreiben ein wirklich ausgefallenes, kompliziertes Skript, das überprüft, welche Datei (en) geändert wurden, und nur die erforderlichen Kompilierungen vornimmt. Sehen Sie, wohin ich damit gehe?

G-Man sagt "Reinstate Monica"
quelle
Für sehr kleine Projekte gcc -O3 -march=native -fwhole-program *.c ist dies grundsätzlich in Ordnung für einen Bearbeitungs- / Kompilierungs- / Profilzyklus. Sie möchten jedoch weiterhin ein Makefile, das andere Benutzer verwenden können. Die Möglichkeit -fwhole-program, alles zusammen zu kompilieren, macht Spaß, -fltobietet Ihnen aber normalerweise fast die gleichen Optimierungen.
Peter Cordes
2
Sobald ich anfange, der Compiler-Befehlszeile Schalter hinzuzufügen (selbst für eine Quelldatei), fällt es mir schwer, sie beim nächsten Mal zu merken. Gelegentlich werde ich nur einen Kommentar in die Quelldatei einfügen, aber an diesem Punkt sollte ich nur ein Makefile verwenden ...
Roger Lipscombe
@ger Lipscombe: Und wenn Sie für verschiedene Umgebungen kompilieren müssen, müssen Sie lediglich einige Makros in Ihrem Makefile definieren. Und mit ein wenig Kreativität können Sie den Befehl make an eine Funktionstaste des Editors anhängen, die Ausgabe in einer Datei erfassen und mit einer anderen Taste an die Position von Fehlern bringen ...
jamesqf
15

Viele andere Leute beschäftigen sich mit den Details komplexerer Makefiles und der damit verbundenen Komplexität. Ich benutze Makefiles normalerweise aus einem ganz anderen Grund:

Ich möchte mich an nichts erinnern.

Auch wenn Ihr Projekt wirklich langweilig und einfach ist und Sie Makefiles nicht "richtig" verwenden:

all:
    gcc main.c -o project

Ich muss nicht darüber nachdenken oder es anders behandeln als ein komplexeres Projekt:

all:
    gcc libA.c libB.c main.c -o project2

Oder wenn ich Flags angegeben habe (z. B. -O2), muss ich mich nicht daran erinnern, was sie waren.

Wenn Sie mit einem einfachen Makefile beginnen und später Dinge zusammenführen / umgestalten müssen, müssen Sie nicht daran denken, jedes Projekt anders zu erstellen.

Stack Tracer
quelle
Ich benutze Makefiles auch in nicht kompilierten Projekten. Ich erstelle 'falsche' Regeln, die komplexe Befehle ausführen, die nur für das betreffende Verzeichnis relevant sind. Beispiel: Bereinigung, Installation an den richtigen Orten, Installation von Docker-Images. Es macht es einfach einfacher.
Anthony
5

Selbst bei kleinen Projekten kann es hilfreich sein, die Abhängigkeitslogik unter Kontrolle zu halten und Builds zu automatisieren. Ich habe es auch verwendet, um Installationen und Deinstallationen auszulösen, also war es ein Hauptschalter, der die Bühne zurücksetzte.


quelle
3

Wenn Sie Ihre App aus zwei Quellen ( .cDateien) verknüpfen , müssen Sie nicht jede Datei neu kompilieren, sondern nur die geänderte, wenn Sie make verwenden.

Außerdem werde ich Ihnen ein Beispiel aus der BSD-Welt geben. Sie haben ein Framework für systembasierte Makefiles. Sie bieten Ihnen Pfade zu Systemverzeichnissen und haben Ziele für die Installation Ihrer Software und Handbuchseiten.

Zum Beispiel haben Sie gerade beer.cApp und Handbuch dafür geschrieben beer.6. Sie erstellen Makefile:

PROG=   beer
MAN=    beer.6

.include <bsd.prog.mk>

..und anrufen make install. Es kompiliert und installiert Ihre App automatisch /usr/binund kompiliert und installiert Ihre Manpage an der Stelle, an der manSie sie finden können. Sie haben gerade Ihre App mit einem einfachen Befehl installiert!

Sehr praktisch und absolut transparent für alle, die mit BSD vertraut sind. Viel besser als manuelles Skript.

user996142
quelle
1

Beispiel Makefilefür mein sehr kleines Projekt:getPixelColor

Es macht genau das, was sein Name sagt, und nimmt zwei optionale Argumente, die Koordinaten.

Mir gefällt besonders, wie die Dinge dort abhängig werden.

COORDS ?= 0 0

CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f

BIN := getPixelColor
SRC := $(BIN).cpp

$(BIN): $(SRC)
    $(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)

.PHONY: clean
clean:
    $(RM) $(BIN)

.PHONY: run
run: $(BIN)
    ./$(BIN) $(COORDS)

Wie Sie sehen, kann es alles tun, was Sie brauchen, ohne etwas extra einzugeben:


Verwendungszweck

Sie können es folgendermaßen ausführen:

  1. Bereinigen Sie die alte Binärdatei:

    make clean
  2. Kompilieren Sie eine neue Binärdatei:

    make
  3. Führen Sie die ausführbare Datei auf zwei Arten aus:

    • die Standardkoordinaten [0,0]

      make run     # equals COORDS='0 0'
    • beliebige Koordinaten

      COORDS='5 6' make run

Makefiles können manchmal sehr hilfreich sein. Je größer das Projekt, desto größer der Nutzen. Aber selbst damit erspart Ihnen mein kleinstes C ++ - Projekt, wie Sie an Beispielen sehen können, viele Kopfschmerzen.

LinuxSecurityFreak
quelle
0

makeist ziemlich zuverlässig verfügbar. Wenn Sie Ihr Projekt mit a verteilen makefile, erhalten Benutzer eine einfache Referenz, wie Sie Aufgaben auf die gleiche Weise wie Sie ausführen können. Das makefilekann für mehr als nur Kompilierung sein.

Nehmen Sie zum Beispiel ein Projekt, das nicht kompiliert werden muss. Ich erinnere mich, dass ich an einem Python-Projekt gearbeitet habe, das einen Befehl make zum Löschen aller .pycDateien, einen Befehl make zum Ausführen der Tests, einen Befehl zum Herunterladen einer Kopie der statischen Daten vom Entwicklungsserver usw. hatte.

Adam Barnes
quelle