Пример написания и использования Makefile
Начнём с таких вот файлов:
prog.c |
fun.c |
|
|
const.c |
outlib.h |
1 int Count=0;
|
|
Их можно собрать в один файл просто с помощью cc *.c -o prog
- Напишем простейший Makefile для этого:
- Помните о табах!
Заодно сделаем цель clean. Пробуем make, make clean.
- Так можно и скриптом было сделать. Обеспечим раздельную компиляцию и компоновку.
- Раздельная компиляция работает:
1 $ make clean 2 rm -f prog a.out *.o 3 $ make prog 4 cc const.c -c -o const.o 5 cc fun.c -c -o fun.o 6 cc prog.c -c -o prog.o 7 cc const.o fun.o prog.o -o prog 8 $ touch fun.c 9 $ make prog 10 cc fun.c -c -o fun.o 11 cc const.o fun.o prog.o -o prog 12 $ touch fun.o 13 $ make prog 14 cc const.o fun.o prog.o -o prog 15
- Кстати, вот альтернативная форма, в которой нет табуляций. Она малочитаема, не будем ей пользоваться:
- (а табуляции и пробелы становятся обычными разделителями)
- И ещё одна. На этот раз полями рецепта определяются не табуляции, а тильды (а табуляции и пробелы становятся обычными разделителями):
- Раздельная компиляция работает:
Хорошо бы задать правило по умолчанию, как делать .o файлы из .c.
Конструкции, начинающиеся с $ — подстановки значения некоторых переменных Make:
$@ означает цель (похожа на цель в тире)
$< означает первую из зависимостей
$^ означает список всех зависимостей
- В Make есть и нормальные переменные, только их подстановка должна заключаться в круглые скобки. Заодно усложним и нашу программу.
prog.c
fun.c
|
|
const.c |
outlib.h |
1 int Count=0;
|
|
Makefile |
|
|
Следуя традиции, мы разделили генераты на совсем ненужные (TRASH и собственно целевые файлы проекта (GENERATES), которые всё равно стоит удалять, если в репозитории должны остаться только исходники