Makefile для самих маленьких
Не дуже строгий переклад матеріалу mrbook.org/tutorials/make/ Мені свого часу дуже не вистачило подібної методички для розуміння базових речей про make. Думаю, буде хоч комусь цікаво. Хоча ця технологія і відмирає, але все одно використовується в дуже багатьох проектах. Карми на хаб «Переклади» не вистачило, як тільки з'явиться можливість - додам і туди. Якщо є помилки в оформленні, то прошу вказати на них. Буду виправляти.
Компілювати проект ручками - заняття досить втомлива, особливо коли вихідних файлів стає більше одного, і для кожного з них треба кожен раз набивати команди компіляції і компонування. Але не все так погано. Зараз ми будемо вчитися створювати і використовувати Мейкфайли. Makefile - це набір інструкцій для програми make, яка допомагає збирати програмний проект буквально в один дотик.
Для практики знадобиться створити мікроскопічний проект а-ля Hello World з чотирьох файлів в одному каталозі:
програма make
якщо запустити
make
то програма спробує знайти файл з ім'ям по замовчування makefile в поточному каталозі і виконати інструкції з нього. Якщо в поточному каталозі є кілька мейкфайлов, то можна вказати на потрібний ось таким чином:
make -f MyMakefile
Є ще безліч інших параметрів, нам поки не потрібних. Про них можна дізнатися в ман-сторінці.
процес складання
Компілятор бере файли з вихідним кодом і отримує з них об'єктні файли. Потім лінковщік бере об'єктні файли і отримує з них виконуваний файл. Збірка = компіляція + лінковка.
компіляція руками
Найпростіший спосіб зібрати програму:
g ++ main.cpp hello.cpp factorial.cpp -o hello
Кожен раз набирати таке незручно, тому будемо автоматизувати.
Найпростіший Мейкфайл
У ньому повинні бути такі частини:
Для нашого прикладу мейкфайл буде виглядати так:
Зверніть увагу, що рядок з командою повинна починатися з табуляції! Збережіть це під ім'ям Makefile-1 в каталозі з проектом і запустіть збірку командою make -f Makefile-1
У першому прикладі мета називається all. Це мета за замовчуванням для мейкфайла, яка буде виконуватися, якщо ніяка інша мета не вказана явно. Також у цієї мети в цьому прикладі немає ніяких залежностей, так що make відразу приступає до виконання потрібної команди. А команда в свою чергу запускає компілятор.
Використання залежностей
Використовувати кілька цілей в одному мейкфайле корисно для великих проектів. Це пов'язано з тим, що при зміні одного файлу не знадобиться збирати заново весь проект, а можна буде обійтися перезбирання тільки зміненої частини. приклад:
Це треба зберегти під ім'ям Makefile-2 все в тому ж каталозі
Тепер у мети all є тільки залежність, але немає команди. В цьому випадку make при виклику послідовно виконає всі зазначені в файлі залежності цієї мети.
Ще додалася нова мета clean. Вона традиційно використовується для швидкого очищення всіх результатів складання проекту. Очищення запускається так: make -f Makefile-2 clean
Змінні широко використовуються в мейкфайлах. Наприклад, це зручний спосіб врахувати можливість того, що проект збиратимуть іншим компілятором або з іншими опціями.
Це Makefile-3
Змінні - дуже зручна штука. Для їх використання треба просто присвоїти їм значення до моменту їх використання. Після цього можна підставляти їх значення в потрібне місце ось таким способом: $ (VAR)