Perché Makefile?

Compilare i file del codice sorgente può essere stancante, soprattutto quando devi includere diversi file sorgente e digitare il comando di compilazione ogni volta che devi compilare. I makefile sono la soluzione per semplificare questo compito.

I makefile sono file di formato speciale che aiutano a costruire e gestire i progetti automaticamente.

Ad esempio, supponiamo di avere i seguenti file sorgente.

  • main.cpp
  • hello.cpp
  • factorial.cpp
  • functions.h

main.cpp

Di seguito è riportato il codice per il file sorgente main.cpp -

#include <iostream>

using namespace std;

#include "functions.h"

int main(){
   print_hello();
   cout << endl;
   cout << "The factorial of 5 is " << factorial(5) << endl;
   return 0;
}

hello.cpp

Il codice fornito di seguito è per il file sorgente hello.cpp -

#include <iostream>

using namespace std;

#include "functions.h"

void print_hello(){
   cout << "Hello World!";
}

factorial.cpp

Il codice per factorial.cpp è fornito di seguito:

#include "functions.h"

int factorial(int n){
   
   if(n!=1){
      return(n * factorial(n-1));
   } else return 1;
}

functions.h

Quello che segue è il codice per fnctions.h -

void print_hello();
int factorial(int n);

Il modo più banale per compilare i file e ottenere un eseguibile è eseguire il comando -

gcc  main.cpp hello.cpp factorial.cpp -o hello

Questo comando genera hello binary. In questo esempio abbiamo solo quattro file e conosciamo la sequenza delle chiamate di funzione. Quindi, è possibile digitare il comando precedente e preparare un binario finale.

Tuttavia, per un progetto di grandi dimensioni in cui abbiamo migliaia di file di codice sorgente, diventa difficile mantenere le build binarie.

Il makecomando consente di gestire programmi di grandi dimensioni o gruppi di programmi. Quando si inizia a scrivere programmi di grandi dimensioni, si nota che la ricompilazione di programmi di grandi dimensioni richiede più tempo rispetto alla ricompilazione di programmi brevi. Inoltre, noti che di solito lavori solo su una piccola sezione del programma (come una singola funzione) e gran parte del programma rimanente rimane invariato.

Nella sezione successiva, vediamo come preparare un makefile per il nostro progetto.