Quali sono i vantaggi dell'utilizzo di `make` per piccoli progetti? [chiuso]


8

Ho visto che makeè utile per grandi progetti, in particolare con dipendenze confuse descritte in a Makefile, e anche per aiutare con il flusso di lavoro. Non ho sentito alcun vantaggio nell'utilizzo makeper piccoli progetti. Ci sono?


2
ottimismo per la crescita? :) buone abitudini? Questo potrebbe vagare nel territorio dell'opinione pubblica.
Jeff Schaller

digita makeper scoprire la risposta. crea un modello decente Makefile e modifica semplicemente la sua variabile dei file sorgente. non c'è bisogno di digitare tutto quel jazz.
user2497

sono un po 'un incubo per grandi progetti, quindi onestamente, direi che sono buoni solo per piccoli progetti;)
Eevee

Potrei usare i makefile, ma non lo faccio. Ho diviso il mio codice sorgente per il mio più grande progetto (personale) in 10 file, ricompilato il primo e il primo ha #includes per gli altri nove. Con la velocità della ricompilazione, non mi importa se tutto viene ricompilato ogni volta.
Jennifer

1
Pigrizia :-) makeè un comando molto più veloce da digitare rispetto alla maggior parte degli altri, anche se non si crea un Makefile intelligente per gestire le dipendenze in modo pulito :-)
Stephen Harris

Risposte:


11

Al contrario di cosa?

Supponiamo di avere un programma che hai diviso in due file, che hai chiamato in modo fantasioso file1.cfile2.c. È possibile compilare il programma eseguendo

cc file1.c file2.c -o yourprogram

Ma questo richiede di ricompilare entrambi i file ogni volta, anche se solo uno è cambiato. È possibile scomporre i passaggi della compilazione in

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

e quindi, quando modifichi uno dei file, ricompila solo quel file (ed esegui il passaggio di collegamento indipendentemente da ciò che hai modificato). Ma cosa succede se si modifica un file e poi l'altro e si dimentica di aver modificato entrambi i file e di averne ricompilato accidentalmente solo uno?

Inoltre, anche solo per due file, hai circa 60 caratteri di comandi lì. Diventa rapidamente noioso da scrivere. OK, certo, potresti metterli in uno script, ma poi sei tornato a ricompilare ogni volta. Oppure potresti scrivere uno script davvero elaborato e complicato che controlla quali file sono stati modificati e fa solo le compilazioni necessarie. Vedi dove sto andando con questo?


Per progetti molto piccoli, in gcc -O3 -march=native -fwhole-program *.c pratica va bene per un ciclo di modifica / compilazione / profilo. Ma vuoi comunque un Makefile da usare per altre persone. Essere in grado di usare -fwhole-programè un vantaggio divertente di compilare tutto insieme, ma -fltonormalmente ti dà praticamente le stesse ottimizzazioni.
Peter Cordes,

2
Una volta che ho iniziato ad aggiungere opzioni alla riga di comando del compilatore (anche per un file sorgente), trovo difficile ricordarle la prossima volta. Di tanto in tanto metto solo un commento nel file sorgente, ma a quel punto dovrei semplicemente usare un Makefile ...
Roger Lipscombe

@ger Lipscombe: E se devi compilare per ambienti diversi, è semplice come definire alcune macro nel tuo makefile. E con un po 'di creatività, puoi agganciare il comando make a un tasto funzione dell'editor, catturare l'output in un file e usare un altro tasto per metterti nella posizione di eventuali errori ...
jamesqf

15

Molte altre persone stanno entrando nei dettagli di makefile più complessi e molta della complessità che ne deriva. In genere uso i makefile per un motivo completamente diverso:

Non voglio ricordare niente.

Anche se il tuo progetto è davvero noioso e semplice e non usi i makefile "correttamente":

all:
    gcc main.c -o project

Non ho bisogno di pensarci o di trattarlo in modo diverso rispetto a un progetto più complesso:

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

O se ho specificato flag (ad es. -O2) Non ho bisogno di ricordare quali fossero.

Inoltre, se inizi con un semplice makefile e devi unire / refactificare le cose in un secondo momento, non devi ricordarti di costruire ogni progetto in modo diverso.


Uso i makefile anche in progetti non compilati. Creo regole "false" che eseguono comandi complessi rilevanti solo per la directory in questione. Ad esempio: pulizia, installazione nelle posizioni giuste, installazione di immagini docker. Rende solo più facile.
Anthony

5

Anche con piccoli progetti può essere utile tenere sotto controllo la logica delle dipendenze e le build automatizzate. L'ho usato anche per innescare installazioni e disinstallazioni, quindi era un interruttore principale che ripristinava lo stage.


3

Se colleghi la tua app da 2 fonti ( .cfile), non è necessario ricompilare ogni file, ma solo quello modificato se stai usando make.

Inoltre, ti darò un esempio dal mondo BSD. Hanno un framework di Makefile basati sul sistema. Ti forniscono percorsi per le directory di sistema e hanno obiettivi per installare il tuo software e le pagine del manuale.

Ad esempio, hai appena scritto beer.capp e manuale per questo chiamato beer.6. Si crea Makefile:

PROG=   beer
MAN=    beer.6

.include <bsd.prog.mk>

..e chiama make install. Compila e installa automaticamente la tua app /usr/bine compila e installa la tua pagina man nel luogo in cui è manpossibile trovarla. Hai appena installato la tua app con un semplice comando!

Molto conveniente e assolutamente trasparente per chiunque abbia familiarità con BSD. Molto meglio dello script manuale.


1

Esempio Makefileper il mio progetto molto piccolo:getPixelColor

Fa esattamente quello che dice il suo nome, prendendo due argomenti opzionali, le coordinate.

Mi piace soprattutto il modo in cui le cose diventano dipendenti lì.

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)

Come puoi vedere, può fare tutto il necessario, senza digitare nulla in più:


uso

Puoi eseguirlo in questi modi:

  1. Pulisci il vecchio binario:

    make clean
  2. Compila un nuovo binario:

    make
  3. Esegui l'eseguibile in 2 modi:

    • le coordinate predefinite [0,0]

      make run     # equals COORDS='0 0'
    • eventuali coordinate

      COORDS='5 6' make run

I makefile possono essere estremamente utili a volte. Più grande è il progetto, maggiore è il vantaggio. Ma anche con quello il mio più piccolo progetto C ++, come puoi vedere negli esempi, ti fa risparmiare un sacco di mal di testa.


0

makeè abbastanza affidabile. Se distribuisci il tuo progetto con un makefile, gli utenti avranno un semplice riferimento su come eseguire le attività nello stesso modo in cui lo fai. La makefilepuò essere per più di una semplice compilazione.

Prendi un progetto che non richiede compilazione, per esempio. Ricordo di aver lavorato su un progetto Python che aveva un comando make per cancellare tutti i .pycfile, un comando make per eseguire i test, uno per scaricare una copia dei dati statici dal server di sviluppo, ecc.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.