Створення make-файлів
Структура make-файлів
Утиліта make. автоматично визначає які частини великої програми повинні бути перекомпіліровать, і виконує необхідні для цього дії.
Перед тим, як використовувати make. необхідно створити так званий make-файл (makefile), який буде описувати залежності між файлами модульна програми, і містити команди для поновлення цих файлів. Як правило, виконуваний файл програми залежить від об'єктних файлів, які, в свою чергу, виходять в результаті компіляції відповідних файлів з вихідними текстами.
Після того, як потрібний make-файл створений, простий команди:
буде досить для виконання всіх необхідних Перекомпіляція якщо будь-які з вихідних файлів програми були змінені. Використовуючи інформацію з make-файлу, і, знаючи час останньої модефікації файлів, утиліта make вирішує, яких з файлів повинні бути оновлені. Для кожного з цих файлів будуть виконані зазначені в make-файлі команди.
При виклику make. в командному рядку можуть бути задані параметри, які вказують, які файли слід перекомпілювати і яким чином це робити.
Простий make-файл
Простий make-файл складається з "правил" (rules) наступного вигляду:
Зазвичай, мета (target) являє собою ім'я файлу, який генерується в процесі роботи утиліти make. Прикладом можуть служити об'єктні і виконуваний файли збирається програми. Мета також може бути ім'ям деякого дії, яке потрібно виконати (наприклад, clean - очистити).
Пререквізіт (prerequisite) - це файл, який використовується як ісходдние дані для породження мети. Дуже часто мета залежить відразу від декількох файлів.
Команда - це дія, що виконується утилітою make. У правилі може мати декілька команд - кожна на своє власної рядку. Важливе зауваження: рядки, що містять команди обов'язково повинні починатися з символу табуляції! Ігнорування табцляціі це найбільш часто зустрічається помилка багатьох початківців користувачів.
Зазвичай, команди знаходяться в правилах з пререквізітамі і служать для створення файлу-мети, якщо який-небудь з пререквізітов був модефіцірован. Однак, правило, має команди, не обов'язково повинно мати пререквізіти. Наприклад, правило з метою clean ( "очищення"), що містить команди видалення, може не мати пререквізітов.
Правило (rule) описує, коли і яким чином слід оновлювати файли, зазначені в ньому в якості мети. Для створення або поновлення мети, make виконує зазначені в правилі команди, використовуючи пререквізіти в якості вихідних даних. Правило також може описувати яким чином має виконуватися певна дія.
Крім правил, make-файл може містити і інші конструкції, проте, простий make-файл може складатися і з одних лише правил. Правила можуть виглядати більш складними, ніж наведений вище шаблон, проте всі вони більш-менш відповідають йому за структурою.
Нижче наведено приклад простого make-файлу, в якому описується, що виконуваний файл edit залежить від восьми об'єктних файлів, які, в свою чергу, залежать від восьми відповідних вихідних файлів і трьох заголовних файлів.
В даному прикладі, заголовки defs.h включається в усі файли з вихідним текстом. Заголовки command.h включається тільки в ті вихідні файли, які відносяться до команд редагування, а файл buffer.h - тільки в "низькорівневі" файли, безпосередньо оперують буфером редагування.
Для підвищення зручності читання, довгі рядки були розбиті на дві частини за допомогою символу зворотної косої межі, за яким слід новий рядок.
Для того, щоб за допомогою цього make-файлу створити виконуваний файл edit. слід подати команду
Для того, щоб видалити виконуваний і об'єктні файли з директорії проекту, слід виконати команду:
У наведеному прикладі, цілями, зокрема, є об'єктні файли main.o і kbd.o. а також виконуваний файл edit. До пререквізітам відносяться такі файли, як main.c і defs.h. Кожен об'єктний файл, фактично, є одночасно і метою і пререквізітом. Прикладами команд можуть служити cc -c main.c і cc -c kbd.c.
У разі, якщо мета є файлом, цей файл повинен бути перекомпіліровать або перекомпонований щоразу, коли був змінений будь-якої з його пререквізітов. Крім того, будь-які пререквізіти, які самі генеруються автоматично, повинні бути оновлені першими. У нашому прикладі, виконуваний файл edit залежить від восьми об'єктних файлів; об'єктний файл main.o залежить від вихідного файлу main.c і заголовки defs.h.
За кожним рядком, що містить мету і пререквізіти, слід рядок з командою. Ці команди вказують, яким чином треба оновлювати цільової файл. На початку кожного рядка, що містить команду, повинен знаходиться символ табуляції. Саме наявність символу табуляції є ознакою, за яким make відрізняє рядки з командами від інших рядків make-файлу. Майте на увазі, що make не має ні найменшого уявлення про те, як працюють ці команди. Тому, відповідальність за те, що виконуються команди за потрібне чином оновлять цільової файл, цілком лягає на вас. Утиліта make просто виконує зазначені в правилі команди якщо мета потребує оновлення.
Мета clean є не файлом, а ім'ям дії. Оскільки, при звичайній збірці програми ця дія не потрібно, мета clean не є пререквізітом будь-якого з правил. Отже, make не буде "чіпати" це правило, поки ви спеціально про це не попросите. Зауважте, що це правило не тільки не є пререквізітом, але і сама не містить будь-яких пререквізітов. Таким чином, єдине призначення даного правила - виконання зазначених у ньому команд. Цілі, які є не файлами, а іменами дій називаються абстрактними цілями (phony targets). Абстрактні цілі докладно розглядаються в розділі абстрактні цілі. У розділі Помилки при виконанні команд описано, як змусити make ігнорувати помилки, які можуть виникнути при виконанні команди rm і будь-яких інших команд.
Використання змінних
У наведеному вище прикладі, в правилі для edit нам двічі довелося перераховувати список об'єктних файлів програми:
Подібне дублювання значною кількістю помилок. При додаванні в проект нового об'єктного файлу, можна додати його в один список і забути про інший. Для усунення ймовірності подібного ризику і спрощення make-файлу, використовуються змінні. Змінні (variables) дозволяють, один раз визначивши текстовий рядок, потім використовувати її багаторазово в потрібних місцях).
Звичайною практикою при побудові make-файлів є використання змінної з ім'ям objects. OBJECTS. objs. OBJS. obj. або OBJ. яка містить список всіх об'єктних файлів програми. наприклад:
Далі, всякий раз, коли буде необхідний список об'єктних файлів, можна використовувати значення цієї змінної за допомогою запису $ (objects):
Додаткові цілі збірки
Часто в make-файл включаються також і інші цілі крім компіляції:
Суффіксние правила
Суффіксние правила - це інша область, в якій вам потрібно вирішити, чи писати стандартні make-файли або використовувати розширення GNU. Стандартні суффіксние правила набагато ограниченнее, ніж шаблонні правила GNU, але в багатьох ситуаціях стандартні суффіксние правила можуть виявитися корисними. До того ж шаблонні правила можуть підтримуватися не в усіх версіях make. Суффіксние правила виглядають наступним чином:
с.о:
$ (СС) -з $ (CFLAGS) $ (CPPFLAGS) -о $ @ $<
.SUFFIXES. з .про
У цьому правилі говориться (якщо не торкатися зайвих деталей), що make повинна, якщо не було інших явних вказівок, перетворити файл а.с в А.О шляхом запуску прикладеної командного рядка. Кожен файл к.с. буде розглядатися так, ніби він явно внесений до списку як залежності відповідного файлу .про в вашому make-файл.
Це суффіксное правило демонструє іншу можливість make - автоматичні змінні. Зрозуміло, що потрібно знайти спосіб підставити залежність і цільової об'єкт в командний рядок. Автоматична змінна $ @ виступає в якості цільового об'єкта, $<выступает в качестве первой зависимости, а $^ представляет все зависимости.
Існують і інші автоматичні змінні, які розглядаються в керівництві по make. Всі автоматичні змінні можна використовувати в звичайних правилах, а також в суффіксних і шаблонних правилах. Останній рядок прикладу представляє ще одну директиву .SUFFIXES вказує make на те, що к.с. і .про є суфіксами, які повинен використовувати make для знаходження способу перетворити існуючі вихідні файли в необхідні цільові об'єкти.
Шаблонні правила більш потужні і, отже, трохи складніше, ніж суффіксние правила. Нижче наведено приклад еквівалентного шаблонного правила для показаного вище суффіксного правила.
% .про:% к.с.
$ (СС) -з $ (CFLAGS) $ (CPPFLAGS) -о $ @ $<
Більшість великих проектів з відкритим вихідним кодом використовують інструменти Automake, Autoconf і Libtool. Ці інструменти являють собою колекцію знань про особливості різних систем і стандартах спільноти, яка може допомогти в побудові проектів. Таким чином, буде потрібно писати лише трохи коду, специфічного для проекту. Наприклад, Automake пише цільові об'єкти install і uninstall. Autoconf автоматично визначає можливості системи і налаштовує програмне забезпечення для його відповідності системі, a Libtool відстежує відмінності в управлінні спільно використовуваними бібліотеками на різних системах.