Інструментарій програміста в linux make
Утиліта автоматично визначає, які частини великої програми повинні бути перекомпіліровать і команди для їх перекомпіляції. Найбільш часто make використовується для компіляції C-програм і містить особливості орієнтовані саме на такі завдання, але можна використовувати make будь-якої мовної програмування. Більш того, застосування утиліти make не обмежується програмами. Можна використовувати еe для опису будь-якого завдання, де деякі файли повинні автоматично породжуватися з інших завжди, коли ті змінюються.
Перш ніж використовувати make. необхідно створити файл під назвою make-файлом. який описує стосунки між файлами Вашої програми і містить команди для поновлення кожного файлу. Зазвичай виконуваний файл залежить від об'єктних файлів, які, в свою чергу, залежать від вихідних файлів і файлів заголовків. Для імені make-файлу рекомендується назва GNUmakefile. makefile або Makefile. причому пошук йде саме в зазначеному порядку. Якщо необхідно використовувати нестандартне ім'я, то його можна передати явно через опцію -f.
Коли make-файл вже написаний, досить виконати в каталозі в якому він знаходиться команду make. Простий make-файл складається з правил (інструкцій) наступного вигляду:
ЗМІННА = ЗНАЧЕННЯ. МЕТА. ЗАЛЕЖНІСТЬ. КОМАНДА 1
КОМАНДА 2 ЗМІННА = ЗНАЧЕННЯ. МЕТА. ЗАЛЕЖНІСТЬ. КОМАНДА 1 КОМАНДА 2
і т.д.
make [Опції] [Мінлива = 'abc'] [Мета]
Квадратні дужки означають необов'язковість присутності даної частини.
Мета - ім'я мети, яку треба виконати.
Мінлива = 'abc' -переопределеніе змінних. Значення змінних введених в командному рядку мають більший пріоритет, ніж визначення в make-файлі.
Опції:
-f file - явне завдання імені make-файлу. якщо завдання опущено, то шукаються файли GNUmakefile. makefile або Makefile.
-n - імітація дій без реального виконання, служить для налагодження.
-t - зміна часу модифікації мети без реального виконання.
-q - перевірка на необхідність оновлення мети без реального виконання.
Правила написання Makefile
Порядок правил є несуттєвим. За замовчуванням головною метою make є мета першого правила в першому make-файл. Якщо в першому правилі є кілька цілей, то тільки перша мета береться в якості мети за замовчуванням. Мета, що починається з точки, не використовується як мета за замовчуванням, якщо вона не містить один або більше символу '/' тобто визначає шлях до файлу; крім того, за замовчуванням не використовуються цілі, що визначають шаблонні правила.
Як ЦІЛІ або ЗАЛЕЖНО може використовуватися список файлів через пробіл або шаблон в стилі shell.
Шаблони інтерпретуються в момент виконання правила, при присвоєнні змінним інтерпретація шаблону не відбувається, для присвоювання списку файлів змінної використовується спеціальна функція wildcard.
objects: = $ (wildcard * .o
edit: * .o
cc -o edit * .o
Для автоматичної генерації залежностей від файлів заголовків в мові СІ можна використовувати команду gcc -M file.c або gcc -MM file.c. Другий варіант не генерує залежності від системних заголовків файлів. У команді можна використовувати автоматичні змінні. Ці змінні мають значення, заново обчислені для кожного виконуваного правила на основі мети і залежностей правила.
Використання дій за замовчуванням.
#default target - file edit
edit. main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
cc -o edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
main.o. main.c defs.h
cc -c main.c
kbd.o. kbd.c defs.h command.h
cc -c kbd.c
command.o. command.c defs.h command.h
cc -c command.c
display.o. display.c defs.h buffer.h
cc -c display.c
insert.o. insert.c defs.h buffer.h
cc -c insert.c
search.o. search.c defs.h buffer.h
cc -c search.c
files.o. files.c defs.h buffer.h command.h
cc -c files.c
utils.o. utils.c defs.h
cc -c utils.c
clean.
rm edit main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
За замовчуванням, make починає з першого правила (не рахуючи правил, імена цілей у яких починаються з '.'). Це називається головною метою за замовчуванням. У нашому випадку це правило edit. Якщо файл edit новіше ніж об'єктні файли, від яких він залежить, то нічого не станеться. В іншому випадку, перш ніж make зможе повністю обробити це правило, він повинен рекурсивно обробити правила для файлів, від яких залежить edit. Кожен з цих файлів обробляється відповідно до своїх власних правилом. Перекомпіляція повинна бути проведена, якщо вихідний файл або будь-який з заголовків файлів, згаданих серед залежностей, оновлений пізніше, ніж об'єктний файл, або якщо об'єктний файл не існує.
Правила clean не відповідає ніякого створюваного файлу і, відповідно, clean ні від чого не залежить і сама не входить в список залежностей. При запуску за замовчуванням clean викликатися не буде. Для його виконання необхідно явно вказати мету при запуску make: make clean
Для скорочення запису можна використовувати змінні і дії за замовчуванням (неявні правила)
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit. $ (Objects)
cc -o edit $ (objects)
main.o. defs.h
kbd.o. defs.h command.h
command.o. defs.h command.h
display.o. defs.h buffer.h
insert.o. defs.h buffer.h
search.o. defs.h buffer.h
files.o. defs.h buffer.h command.h
utils.o. defs.h
.PHONY. clean
clean.
-rm edit $ (objects)
Мінлива objects дозволила використовувати один раз написаний список об'єктних файлів, а для об'єктних файлів в make вбудовано неявне правило за замовчуванням
file.c: file.o cc -c file.c
Спеціальна мета .PHONY є вбудованої в make і визначає свої залежності як цілі-імена, яким немає відповідності у вигляді файлів. Якщо дане правило пропустити, то створення в поточному каталозі файлу з ім'ям clean заблокує виконання make clean.
Використання правил за замовчуванням дозволяє змінити стиль записів залежностей:
objects = main.o kbd.o command.o display.o \
insert.o search.o files.o utils.o
edit. $ (Objects)
cc -o edit $ (objects)
$ (Objects). defs.h
kbd.o command.o files.o. command.h
display.o insert.o search.o files.o. buffer.h
Даний запис вказує, що всі об'єктні файли залежать від заголовки defs.h. але для деяких з них перевіряються додаткові залежності.