1.3. Автоматизация процесса с помощью GNU-утилиты make

1.3. Автоматизация процесса с помощью GNU-утилиты make

Те, кто программируют в Windows, привыкли работать в той или иной интегрированной среде разработки. Программист добавляет в нее исходные файлы, а среда автоматически создает проект. Аналогичные среды доступны и в Linux, но мы не будем рассматривать их. Вместо этого мы научим читателей работать с GNU-утилитой make, знакомой большинству Linux-программистов. Она позволяет автоматически перекомпилировать программу.

Основная идея утилиты make проста. Ей указываются целевые модули, участвующие в процессе построения исполняемого файла, и правила, по которым протекает этот процесс. Также задаются зависимости, определяющие, когда конкретный целевой модуль должен быть перестроен.

В нашем тестовом проекте reciprocal три очевидных целевых модуля: reciprocal.o, main.o и сама программа reciprocal. Правила нам уже известны: это рассмотренные выше командные строки. А вот над зависимостями нужно немного подумать. Ясно, что файл reciprocal зависит от файлов reciprocal.o и main.o, поскольку нельзя скомпоновать программу, не создав оба объектных файла. Последние должны перестраиваться при изменении соответствующих исходных файлов. Нельзя также забывать о файле reciprocal.hpp: он включается в оба исходных файла, поэтому его изменение тоже затрагивает объектные файлы.

Помимо очевидных целевых модулей должен также существовать модуль clean. Он предназначен для удаления всех сгенерированных объектных файлов и программ, чтобы можно было начать все сначала. Правило для данного модуля включает команду rm, удаляющую перечисленные файлы.

Чтобы передать всю эту информацию утилите make, необходимо создать файл Makefile. Его содержимое будет таким:

reciprocal: main.o reciprocal.o

       g++ $(CFLAGS) -о reciprocal main.o reciprocal.o

main.o: main.c reciprocal.hpp

        gcc $(CFLAGS) -c main.c

reciprocal.o: reciprocal.cpp reciprocal.hpp

        g++ $(CFLAGS) -c reciprocal.cpp

clean:

        rm -f *.o reciprocal

Целевые модули перечислены слева. За именем модуля следует двоеточие и существующие зависимости. В следующей строке указано правило, по которому создается модуль (назначение записи $(CFLAGS) мы пока проигнорируем). Строка правила должна начинаться с символа табуляции, иначе утилита make проинтерпретирует ее неправильно.

Если удалить созданные нами выше объектные файлы и ввести

% make

будет получен следующий результат:

% make

gcc -c main.c

g++ -c reciprocal.cpp

g++ -o reciprocal main.o reciprocal.o

Утилита make автоматически создала объектные файлы и скомпоновала их. Попробуйте теперь внести какое-нибудь простейшее изменение в файл main.c и снова запустить утилиту. Вот что произойдет:

% make

gcc -с main.c

g++ -о reciprocal main.o reciprocal.o

Как видите, утилита make повторно создала файл main.o и перекомпоновала программу, но не стала перекомпилировать файл reciprocal.cpp, так как в этом не было необходимости.

Запись $(CFLAGS) обозначает переменную утилиты make. Ее можно определить либо в файле Makefile, либо в командной строке. Утилита подставит на место переменной реальное значение во время выполнения правила. Вот как, например, можно осуществить перекомпиляцию с включённой оптимизацией:

% make clean

rm -f *.o reciprocal

% make CFLAGS=-O2

gcc -O2 -c main.c

g++ -O2 -c reciprocal.cpp

g++ -O2 -o reciprocal main.o reciprocal.o

Обратите внимание на то, что вместо записи $(CFLAGS) в правилах появился флаг -O2.

В этом разделе мы рассмотрели лишь самые основные возможности утилиты make. Чтобы получить о ней более подробную информацию, обратитесь к интерактивной документации, введя такую команду:

% info make

В документации можно найти полезные сведения о том, как упростить управление файлом Makefile, уменьшить число необходимых правил и автоматически вычислять зависимости.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Make

Из книги Linux From Scratch автора Бикманс Герард

Make Официальная ссылкаMake (3.79.1): ftp://ftp.gnu.org/gnu/make/Содержимое MakeПоследняя проверка: версия 3.79.1.ПрограммыmakeОписанияmakemake автоматически определяет, какие части объемной программы нуждаются в рекомпиляции, и выполняет все необходимые для этого команды.Зависимости MakeПоследняя


Завершение процесса с помощью команды KILL

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

Завершение процесса с помощью команды KILL В SQL Server администратор может удалить процесс, например пользовательское подключение или блокировку базы данных, с помощью команды KILL. Обычно эта команда применяется для чрезвычайного прекращения пользовательского сеанса,


15.4. Утилита make : автоматизация процедур

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

15.4. Утилита make: автоматизация процедур Сами по себе исходные коды программ не делают приложения. Также важен способ их компоновки и упаковки для распространения. Операционная система Unix предоставляет инструментальное средство для частичной автоматизации данных


15.4.4.2. I make

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

15.4.4.2. Imake Утилита Imake была написана в попытке автоматизировать создание make-файлов для системы X Window. Она надстраивается на makedepend для решения как проблемы вывода зависимостей, так и проблемы переносимости.Imake-система эффективно заменяет традиционные make-файлы 1make-файлами,


15.4. Утилита make : автоматизация процедур

Из книги Веб-Самоделкин. Как самому создать сайт быстро и профессионально автора Гладкий Алексей Анатольевич

15.4. Утилита make: автоматизация процедур Сами по себе исходные коды программ не делают приложения. Также важен способ их компоновки и упаковки для распространения. Операционная система Unix предоставляет инструментальное средство для частичной автоматизации данных


Автоматизация некоторых действий с помощью Мастеров

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Автоматизация некоторых действий с помощью Мастеров Как мы уже могли убедиться, процесс создания веб-страниц в программе CatsHtml довольно прост: нужно лишь грамотно пользоваться соответствующими инструментами, и при необходимости вручную вносить требуемые корректировки


4.2. make

Из книги C++. Сборник рецептов автора Диггинс Кристофер


1.15. Сборка простого приложения «Hello, World» с помощью GNU make

Из книги Самоучитель работы на Macintosh автора Скрылина Софья

1.15. Сборка простого приложения «Hello, World» с помощью GNU make ПроблемаВы хотите с помощью GNU make собрать простую программу «Hello, World», подобную приведенной в примере 1.4.РешениеПрежде чем вы напишете свой первый make-файл, вы должны познакомиться с терминологией, make-файл состоит из


3.6.2. Прожиг с помощью Дисковой утилиты

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

3.6.2. Прожиг с помощью Дисковой утилиты Прожиг с помощью Дисковой утилиты — это универсальный способ записи, который позволяет дописывать и перезаписывать компакт-диск, создавая предварительно его образ.Чтобы перезаписать диск, выполните следующие действия:1. Создать


Глава 29 Автоматизация работы с помощью документов

Из книги автора

Глава 29 Автоматизация работы с помощью документов В данной главе рассматриваются вопросы, связанные с оформлением документов. Мы подробно остановимся на приемах быстрой работы, которые существенно облегчают труд бухгалтера.• Алгоритм учета товаров• Заказ


10.5. Автоматизация выполнения заданий с помощью планировщика

Из книги автора

10.5. Автоматизация выполнения заданий с помощью планировщика Планировщик заданий позволяет автоматически запускать определенные программы в заданное время или при наступлении определенных событий. Планировщик заданий – это важный компонент системы, поскольку с его


22.2. Автоматизация задач с помощью bash

Из книги автора

22.2. Автоматизация задач с помощью bash Представим, что нам нужно выполнить резервное копирование всех важных файлов, для чего создать архивы каталогов /etc, /home и /usr. Понятно, что понадобятся три команды вида: tar — cvjf имя_архива. tar.bz2 каталог Затем требуется записать все эти три