make (укр. зробити) — утиліта для автоматичної побудови програм. Дії, які має виконати make, описують у спеціальних файлах, які називаються Makefile.
Основні відомості
Makefile задає послідовність дій, які мають бути виконані для побудови програми. В основному ця послідовність складається з викликів команд компілятора, компонувальника та файлової системи.
Основною особливістю утиліти make є те, що вона виконує дії лише з тими файлами, які змінилися з часу попереднього виклику програми. Отже, час на перебудову програми значно скорочується.
Походження
До створення make, системи побудови програм у Unix складалися з різних скриптів, що супроводжували початковий код програм.
Утиліту make створив 1977 року [en], який працював тоді у Bell Labs.
Для обробки залежностей розроблено багато утиліт, але make — одна з найпоширеніших, у першу чергу тому, що вона включена в Unix, починаючи з версії PWB/UNIX (for Programmer's Workbench), яка містила інструменти для розробки програмного забезпечення.
Сучасні версії
Існує декілька версій make, які базуються на оригіналі або ж написані заново, що застосовують однакові формати файлів і базові принципи й алгоритми, а також містять деякі поліпшення й розширення. Наприклад:
- BSD make, заснована на роботі Адама де Бура (Adam de Boor) над версією make, із можливістю паралельної побудови; у тій чи іншій формі вона перейшла в FreeBSD, NetBSD і OpenBSD.
- GNU make — входить до більшості дистрибутивів GNU/Linux і часто застосовується у поєднанні з GNU build system.
POSIX містить стандарт основних можливостей утиліти make[], з тим чи іншим ступенем сумісності реалізований у різних версіях make. Як правило, прості make-файли можуть бути успішно виконані різними версіями make.
Застосування
make [-f make-файл] [мета] ...
Якщо опцію -f не задано, застосовується назва файлу за умовчанням — Makefile (однак, у різних реалізаціях make крім того можуть перевірятися й інші файли, наприклад GNUmakefile).
make відкриває файл, зчитує правила й виконує команди, необхідні для досягнення зазначеної мети (англ. target).
Якщо при запуску make явно не задано мету, то буде оброблятися перша мета в make-файлі, назва якої не починається з символу «.».
Make-файл
make виконує команди відповідно до правил, заданих у файлі. Цей файл називається make-файл (makefile, мейкфайл). Здебільшого, make-файл описує, яким чином слід компілювати й компонувати програму.
make-файл складається з правил і змінних. Правила описують залежності й мають такий синтаксис:
мета1 [мета2] ...: компонент1 [компонент2] ... Tab ↹команда1 Tab ↹команда2 ...
Рядки, в яких записано команди, мають починатися з символу табуляції.
Правило повідомляє make про залежність мети (вона може бути не одна) (мета1, мета2) від компонентів (компонент1, компонент2). І мета і компонента зазвичай є файлами, тоді послідовність команд (команда1, команда2) будує файл-мету із файлів-компонент. Утім, мета може бути не файлом, а результатом виконання команд. Наприклад, мета clean у make-файлах для компіляції програм зазвичай видаляє всі файли, створені в процесі компіляції.
make ніяк не перевіряє вміст файлів компоненти чи мети. Зазначення списку файлів-компонент потрібно тільки для того, щоб make переконалася в наявності цих файлів перед початком виконання команд, та для відстеження залежностей між файлами. Для цього утиліта перевіряє час їх останньої зміни.
Приклад
Нехай програма на C складається з двох файлів коду — main.c
та lib.c
—, й одного файлу заголовків — defines.h
, який включається в обидва файли коду.
Тоді для створення program необхідно з пар (main.c
defines.h
) та (lib.c
defines.h
) створити об'єктні файли (main.o
і lib.o
), а потім злінкувати їх у program
. При збірці вручну потрібно дати такі команди:
cc -c main.c defines.h cc -c lib.c defines.h cc -o program main.o lib.o
Якщо в процесі розробки програми у файл defines.h
внесено зміни, то потрібно перекомпілювати обидва файли й виконати лінкування, а якщо змінюється лише lib.c
, то повторну компіляцію main.о
можна не виконувати.
Таким чином, для кожного файлу, який утворюється в процесі компіляції, можна вказати, на основі яких файлів, а також за допомогою якої команди він створюється. Програма make на основі цих даних:
- Збирає з цієї інформації правильну послідовність команд для отримання необхідних кінцевих файлів;
- Ініціює створення визначеного в правилах файлу, якщо такого файлу не існує або ж він старіший за файли, від яких залежить.
Для програми program
достатньо написати такий make-файл:
program: main.o lib.o cc -o program main.o lib.o main.o lib.o: defines.h
Варто відзначити низку особливостей. У назві другої мети вказано два файли і для цієї мети не задано команду компіляції. Крім того, ніде явно не задано залежність об'єктних файлів від «*.c»-файлів. Справа в тому, що make має вбудовані правила для отримання файлів із певними розширеннями. Так, якщо метою є об'єктний файл (розширення «.о») при виявленні відповідного файлу з розширенням «.с» буде викликано компілятор «сс -с
» із зазначенням у параметрах цього «.с»-файлу і всіх файлів, від яких він залежить[].
Змінні
Синтаксис для визначення змінних:
змінна = значення
Значенням може бути довільна послідовність символів, включаючи пробіли і звернення до значень інших змінних.
Із застосуванням змінних можна модифікувати вищенаведений make-файл таким чином:
OBJ = main.o lib.o program: $(OBJ) cc -o program $(OBJ) $(OBJ): defines.h
Слід зазначити, що для змінних застосовується так зване ліниве обчислення — значення обчислюється тільки в момент звернення до змінної (а не в момент її визначення). Наприклад, якщо задати мету all для такого make-файлу:
foo = $(bar) bar = $(ugh) ugh = Що? all: echo $(foo)
то на екран буде виведено рядок «Що?».
Припустимо, що до вищезгаданого проекту додано другий файл заголовків lib.h
, який включається тільки в lib.c
. Тоді make-файл збільшиться на один рядок:
lib.o: lib.h
Таким чином, один цільовий файл можна вказати як мету у кількох правилах. Повний список залежностей для файлу буде складено зі списків залежностей для кожної мети, у яких його вказано, однак створення такого файлу буде здійснюватися тільки один раз.
Зноски
- . [en] Base Specifications Issue 7, 2016 Edition. Архів оригіналу за 28 грудня 2017. Процитовано 24 жовтня 2017.
Посилання
- BSD Make man page
- GNU Make [ 5 липня 2006 у Wayback Machine.]
- The GNU make manual [ 25 листопада 2008 у Wayback Machine.]
- FreeBSD make manual page [ 22 грудня 2013 у Wayback Machine.]
- OPUS Makefile Tutorial [ 11 грудня 2008 у Wayback Machine.]
- What’s Wrong With GNU make? [ 13 серпня 2016 у Wayback Machine.]
- Advanced Auto-Dependency Generation [ 25 грудня 2008 у Wayback Machine.].
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
make ukr zrobiti utilita dlya avtomatichnoyi pobudovi program Diyi yaki maye vikonati make opisuyut u specialnih fajlah yaki nazivayutsya Makefile Osnovni vidomostiMakefile zadaye poslidovnist dij yaki mayut buti vikonani dlya pobudovi programi V osnovnomu cya poslidovnist skladayetsya z viklikiv komand kompilyatora komponuvalnika ta fajlovoyi sistemi Osnovnoyu osoblivistyu utiliti make ye te sho vona vikonuye diyi lishe z timi fajlami yaki zminilisya z chasu poperednogo vikliku programi Otzhe chas na perebudovu programi znachno skorochuyetsya PohodzhennyaDo stvorennya make sistemi pobudovi program u Unix skladalisya z riznih skriptiv sho suprovodzhuvali pochatkovij kod program Utilitu make stvoriv 1977 roku en yakij pracyuvav todi u Bell Labs Dlya obrobki zalezhnostej rozrobleno bagato utilit ale make odna z najposhirenishih u pershu chergu tomu sho vona vklyuchena v Unix pochinayuchi z versiyi PWB UNIX for Programmer s Workbench yaka mistila instrumenti dlya rozrobki programnogo zabezpechennya Suchasni versiyiIsnuye dekilka versij make yaki bazuyutsya na originali abo zh napisani zanovo sho zastosovuyut odnakovi formati fajliv i bazovi principi j algoritmi a takozh mistyat deyaki polipshennya j rozshirennya Napriklad BSD make zasnovana na roboti Adama de Bura Adam de Boor nad versiyeyu make iz mozhlivistyu paralelnoyi pobudovi u tij chi inshij formi vona perejshla v FreeBSD NetBSD i OpenBSD GNU make vhodit do bilshosti distributiviv GNU Linux i chasto zastosovuyetsya u poyednanni z GNU build system POSIX mistit standart osnovnih mozhlivostej utiliti make vidsutnye v dzhereli z tim chi inshim stupenem sumisnosti realizovanij u riznih versiyah make Yak pravilo prosti make fajli mozhut buti uspishno vikonani riznimi versiyami make Zastosuvannyamake f make fajl meta Yaksho opciyu f ne zadano zastosovuyetsya nazva fajlu za umovchannyam Makefile odnak u riznih realizaciyah make krim togo mozhut pereviryatisya j inshi fajli napriklad GNUmakefile make vidkrivaye fajl zchituye pravila j vikonuye komandi neobhidni dlya dosyagnennya zaznachenoyi meti angl target Yaksho pri zapusku make yavno ne zadano metu to bude obroblyatisya persha meta v make fajli nazva yakoyi ne pochinayetsya z simvolu Make fajlmake vikonuye komandi vidpovidno do pravil zadanih u fajli Cej fajl nazivayetsya make fajl makefile mejkfajl Zdebilshogo make fajl opisuye yakim chinom slid kompilyuvati j komponuvati programu make fajl skladayetsya z pravil i zminnih Pravila opisuyut zalezhnosti j mayut takij sintaksis meta1 meta2 komponent1 komponent2 Tab komanda1 Tab komanda2 Ryadki v yakih zapisano komandi mayut pochinatisya z simvolu tabulyaciyi Pravilo povidomlyaye make pro zalezhnist meti vona mozhe buti ne odna meta1 meta2 vid komponentiv komponent1 komponent2 I meta i komponenta zazvichaj ye fajlami todi poslidovnist komand komanda1 komanda2 buduye fajl metu iz fajliv komponent Utim meta mozhe buti ne fajlom a rezultatom vikonannya komand Napriklad meta clean u make fajlah dlya kompilyaciyi program zazvichaj vidalyaye vsi fajli stvoreni v procesi kompilyaciyi make niyak ne pereviryaye vmist fajliv komponenti chi meti Zaznachennya spisku fajliv komponent potribno tilki dlya togo shob make perekonalasya v nayavnosti cih fajliv pered pochatkom vikonannya komand ta dlya vidstezhennya zalezhnostej mizh fajlami Dlya cogo utilita pereviryaye chas yih ostannoyi zmini Priklad Nehaj programa na C skladayetsya z dvoh fajliv kodu main c ta lib c j odnogo fajlu zagolovkiv defines h yakij vklyuchayetsya v obidva fajli kodu Todi dlya stvorennya program neobhidno z par main c defines h ta lib c defines h stvoriti ob yektni fajli main o i lib o a potim zlinkuvati yih u program Pri zbirci vruchnu potribno dati taki komandi cc c main c defines h cc c lib c defines h cc o program main o lib o Yaksho v procesi rozrobki programi u fajl defines h vneseno zmini to potribno perekompilyuvati obidva fajli j vikonati linkuvannya a yaksho zminyuyetsya lishe lib c to povtornu kompilyaciyu main o mozhna ne vikonuvati Takim chinom dlya kozhnogo fajlu yakij utvoryuyetsya v procesi kompilyaciyi mozhna vkazati na osnovi yakih fajliv a takozh za dopomogoyu yakoyi komandi vin stvoryuyetsya Programa make na osnovi cih danih Zbiraye z ciyeyi informaciyi pravilnu poslidovnist komand dlya otrimannya neobhidnih kincevih fajliv Iniciyuye stvorennya viznachenogo v pravilah fajlu yaksho takogo fajlu ne isnuye abo zh vin starishij za fajli vid yakih zalezhit Dlya programi program dostatno napisati takij make fajl program main o lib o cc o program main o lib o main o lib o defines h Varto vidznachiti nizku osoblivostej U nazvi drugoyi meti vkazano dva fajli i dlya ciyeyi meti ne zadano komandu kompilyaciyi Krim togo nide yavno ne zadano zalezhnist ob yektnih fajliv vid c fajliv Sprava v tomu sho make maye vbudovani pravila dlya otrimannya fajliv iz pevnimi rozshirennyami Tak yaksho metoyu ye ob yektnij fajl rozshirennya o pri viyavlenni vidpovidnogo fajlu z rozshirennyam s bude viklikano kompilyator ss s iz zaznachennyam u parametrah cogo s fajlu i vsih fajliv vid yakih vin zalezhit dzherelo Zminni Sintaksis dlya viznachennya zminnih zminna znachennya Znachennyam mozhe buti dovilna poslidovnist simvoliv vklyuchayuchi probili i zvernennya do znachen inshih zminnih Iz zastosuvannyam zminnih mozhna modifikuvati vishenavedenij make fajl takim chinom OBJ main o lib o program OBJ cc o program OBJ OBJ defines h Slid zaznachiti sho dlya zminnih zastosovuyetsya tak zvane linive obchislennya znachennya obchislyuyetsya tilki v moment zvernennya do zminnoyi a ne v moment yiyi viznachennya Napriklad yaksho zadati metu all dlya takogo make fajlu foo bar bar ugh ugh Sho all echo foo to na ekran bude vivedeno ryadok Sho Pripustimo sho do vishezgadanogo proektu dodano drugij fajl zagolovkiv lib h yakij vklyuchayetsya tilki v lib c Todi make fajl zbilshitsya na odin ryadok lib o lib h Takim chinom odin cilovij fajl mozhna vkazati yak metu u kilkoh pravilah Povnij spisok zalezhnostej dlya fajlu bude skladeno zi spiskiv zalezhnostej dlya kozhnoyi meti u yakih jogo vkazano odnak stvorennya takogo fajlu bude zdijsnyuvatisya tilki odin raz Znoski en Base Specifications Issue 7 2016 Edition Arhiv originalu za 28 grudnya 2017 Procitovano 24 zhovtnya 2017 PosilannyaBSD Make man page GNU Make 5 lipnya 2006 u Wayback Machine The GNU make manual 25 listopada 2008 u Wayback Machine FreeBSD make manual page 22 grudnya 2013 u Wayback Machine OPUS Makefile Tutorial 11 grudnya 2008 u Wayback Machine What s Wrong With GNU make 13 serpnya 2016 u Wayback Machine Advanced Auto Dependency Generation 25 grudnya 2008 u Wayback Machine