Я прочитав кілька навчальних посібників щодо Makefiles, але для мене все ще незрозуміло, на що позначається ціль "усе" і що вона робить.
Якісь ідеї?
Я прочитав кілька навчальних посібників щодо Makefiles, але для мене все ще незрозуміло, на що позначається ціль "усе" і що вона робить.
Якісь ідеї?
Відповіді:
Збірка, як це розуміє Makefile, складається з безлічі цілей. Наприклад, для створення проекту, який може знадобитися
Якщо ви реалізували цей робочий процес за допомогою makefile, ви можете зробити кожну з цілей окремо. Наприклад, якщо ви писали
make file1.o
він створив би лише той файл, якщо потрібно.
Ім'я allне вказано. Це просто умовна назва; alltarget позначає, що якщо ви будете викликати його, make зробить все необхідне для повного складання . Зазвичай це фіктивна ціль, яка не створює жодних файлів, а залежить лише від інших файлів. Для прикладу, наведеного вище, створення всього необхідного - це створення виконавчих файлів, інші файли витягуються як залежності. Тож у makefile це виглядає приблизно так:
all: executable1 executable2
alltarget, як правило, є першим у makefile, оскільки якщо ви просто пишете makeв командному рядку, не вказуючи ціль, він створить першу ціль. І ви очікуєте, що це буде all.
allзазвичай також є .PHONYціллю. Дізнайтеся більше тут .
Посібник для GNU Make дає чітке визначення allу своєму переліку стандартних цілей .
Якщо автор Makefile дотримується цієї конвенції, то ціль allповинна:
makeслід робити те ж саме make all.Для досягнення 1 allзазвичай визначають як .PHONYціль, яка залежить від виконуваних файлів, які формують всю програму:
.PHONY : all
all : executable
Для досягнення 2 allслід або бути першою ціллю, визначеною у файлі make, або бути призначеною як мета за замовчуванням:
.DEFAULT_GOAL := all
Не впевнений, що це означає щось особливе. Це лише умова, що ви надаєте правило "все", і зазвичай воно використовується для перерахування всіх підцілей, необхідних для створення всього проекту, звідси і назва "всі". Єдине, в чому особливе - це те, що часто люди ставлять це в якості першої цілі в makefile, а це означає, що лише ввівши «зробити», це зробить те саме, що і «зробити все».
Цільове "все" є прикладом фіктивної цілі - на диску немає нічого, що називається "все". Це означає, що коли ви робите "зробити все", make завжди думає, що це потрібно для його створення, і тому виконує всі команди для цієї мети. Ці команди, як правило, є тими, що створюють усі кінцеві продукти, про які знає makefile, але вони можуть робити все, що завгодно.
Інші приклади фіктивних цілей - "чисті" та "встановлені", і вони працюють аналогічно.
Якщо ви ще цього не прочитали, вам слід прочитати посібник з виготовлення GNU , який також є чудовим посібником.