Пример написания и использования Makefile

Сначала про настройку окружения

Сборка из нескольких файлов

Make

Проблемы многофайловой сборки: вручную муторно, сценарий делает много лишнего

  1. Перекомпиляция только обновлённых исходников
    • Построение графа зависимостей и подграфа пересборки
  2. Удаление генератов
    • В том числе того, что разработчик считает генератом

  3. Скриптование / code reuse приёмов сборки
    • в т. ч. уникальных для проекта

ТАБУЛЯЦИИ!

Gnu make

(есть много, но этот популярнее всех остальных, вместе взатых)

Литература по GNU Make

Пример

Начнём с таких вот файлов:

prog.c

fun.c

   1 #include "outlib.h"
   2 int main(int argc, char *argv[]) {
   3        Count = argc;
   4  output("<INIT>");
   5      output(argc>1 ? argv[1] : "<NOPE>");
   6   output("<DONE>");
   7      return 0;
   8 }

   1 #include <stdio.h>
   2 #include "outlib.h"
   3 void output(char *str) {
   4         printf("%d: %s
   5 ", Count++, str);
   6 }

const.c

outlib.h

   1 int Count=0;

   1 void output(char *);
   2 extern int Count;

  1. Их можно собрать в один файл просто с помощью cc *.c -o prog

  2. Напишем простейший Makefile для этого:
       1 prog:   const.c fun.c prog.c
       2         cc const.c fun.c prog.c -o prog
       3 
       4 clean:
       5         rm -f prog a.out 
    
    • Помните о табах!
    • Заодно сделаем цель clean. Пробуем make, make clean.

  3. Так можно и скриптом было сделать. Обеспечим раздельную компиляцию и компоновку.
       1 prog:   const.o fun.o prog.o
       2         cc const.o fun.o prog.o -o prog
       3 
       4 fun.o:  fun.c 
       5         cc fun.c -c -o fun.o
       6 
       7 prog.o: prog.c 
       8         cc prog.c -c -o prog.o
       9 
      10 const.o:        const.c 
      11         cc const.c -c -o const.o
      12 
      13 clean:
      14         rm -f prog a.out *.o
      15  
    
    • Кстати, вот альтернативная форма, в которой нет табуляций.