Як Makefile автоматизують компіляцію GCC і заощаджують ваш час

1

Постійне введення довгих команд gcc – це мука. Ситуація посилюється, коли ви постійно додаєте бібліотеки або вносите зміни до коду. Makefile вирішують цю проблему. Вони автоматизують процес складання, позбавляючи вас необхідності знову і знову вводити одні й самі команди.

Нижче наведено простий приклад Makefile. Він замінює ручну послідовність компіляції.

`

Збережіть цей код у файл на ім’я makefile. Запустіть make для складання виконуваного файлу. Існує одне строге правило. Перед кожним рядком з gcc повинен стояти символ табуляції. Вісім прогалин призведуть до помилки. Інструмент збирання відхиляє такий файл. Усі інші рядки мають починатися з лівого поля.

Розуміння залежностей

У Makefile є два типи рядків. Рядки, що починаються з лівого поля, — це рядки залежностей. Вони визначають відносини між файлами. Рядки, відступлені табуляцією, — це команди, що виконуються. Це можуть бути будь-які допустимі команди UNIX.

Розглянемо цей рядок:
main.o: main.c util.h

Це означає, що main.o залежить від main.c та util.h. Якщо будь-який з вихідних файлів зміниться, виконається команда, яка слідує за нею. Вона перестворить main.o.

Перший рядок у файлі є спеціальним. Вона визначає кінцеву мету (target). У разі це виконуваний файл main. У ній перераховані залежності main.o та util.o. Якщо ці об’єктні файли новіші за вихідні, Make перезбере їх. Потім він зв’яже їх у підсумковий бінарний файл.

`

Ця команда виконується лише тоді, коли змінилися залежності. Якщо нічого не змінилося, Make нічого не робить. У цьому полягає основна перевага. Він пропускає роботу, яку вже виконано.

Чому це важливо для вашого робочого процесу

У великих програмах багато бібліотек та вихідних файлів. Вручну відстежувати, які файли змінилися легко помилитися. Makefile робить це автоматично. Він перезбирає лише те, що потрібно. Ви змінили один файл заголовка. Make перезбере всі вихідні файли, що його включають. Ви змінили допоміжну функцію. Make перезбере тільки цей об’єктний файл і знову зв’яже виконуваний файл.

Вам не обов’язково бути в системі UNIX, щоб використовувати цю логіку. Більшість сучасних компіляторів та середовищ розробки (IDE) включають аналогічні функції. Перевірте документацію компілятора. Шукайте інструменти автоматизації збирання. Вони працюють однаково на внутрішньому рівні.

Це повертає нас до заголовків на кшталт stdio.h. У попередніх прикладах ви вмикали їх, не пояснюючи, навіщо. Це стандартні бібліотеки. Хтось написав їх багато років тому. Вони були надані вам, щоб позбавити необхідності заново винаходити базові функції. Makefile та стандартні бібліотеки є частиною однієї філософії. Вони дозволяють вам зосередитись на логіці, а не на шаблонному коді.

Інструмент настільки гарний, наскільки хороші його правила. Якщо ваші залежності вказані неправильно, Make не перезбере те, що має. Або, що ще гірше, він збере застарілий код. Перевірте символи табуляції. Перевірте правильність імен файлів. Правильно поставте синтаксис, і компілятор візьме на себе основну роботу.

Ви можете поставити запитання, коли ручна компіляція може бути швидше. Для одного файлу можливо. Але як тільки ви вносите зміни в файл заголовка в проекті з безліччю файлів, ручний метод програє. Ви починаєте копіювати команди. Ви починаєте допускати помилки. Ви починаєте гадати, чому main.o не було оновлено.

Перехід від введення команд до визначення правил це реальна вигода. Ви визначаєте стан. Інструмент забезпечує переходи. Це невелика зміна у звичках. Воно окупається при кожному наступному складанні.