Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Второй способ заключается в применении нескольких макросов в одном make-файле. Дополнительные макросы генерируются добавлением символа

D
для каталога или символа
F
для имени файла к тем макросам, которые мы уже обсуждали. Вы можете переписать встроенное правило с суффиксами .с.о

.c.o:

 $(СС) $(CFLAGS) -с $(@D)/$(<F) -о $(@D)/$(@F)

для компиляции файлов в подкаталоге и сохранения в нем объектных файлов. Затем вы обновляете библиотеку в текущем каталоге с помощью зависимости и правила, наподобие приведенных далее:

mylib.a: mydir/2.o mydir/3.о

 ar -rv mylib.a $?

Вы должны решить, какой из способов предпочтительнее в вашем проекте. Многие проекты просто избегают применения подкаталогов, но это может привести к непомерному разрастанию исходного каталога. Как видно из только что приведенного краткого обзора, команду

make
можно использовать с подкаталогами и сложность возрастает при этом лишь незначительно.

Версия GNU команд make и gcc

Для GNU-команды

make
и GNU-компилятора
gcc
существуют две интересные дополнительные опции.

 Первая — опция

– jN
("jobs") команды
make
. Она позволяет
make
выполнять
N
команд одновременно. Там, где несколько разных частей проекта могут компилироваться независимо, команда
make
запускает несколько правил в одно и то же время. В зависимости от конфигурации вашей системы эта возможность может существенно сократить время, затраченное на перекомпиляцию. Если у вас много исходных файлов, может быть стоит воспользоваться этой опцией. Как правило, небольшие числа, например
– j3
, — хорошая отправная точка. Если вы делите компьютер с другими пользователями, применяйте эту опцию с осторожностью. Другие пользователи могут не одобрить запуск большого количества процессов при каждой вашей компиляции!

Второе полезное дополнение — опция

– MM
для
gcc
. Она формирует список зависимостей в форме, подходящей для команды
make
. В проекте со значительным числом исходных файлов, каждый из которых содержит разные комбинации заголовочных файлов, бывает трудно (но крайне важно) корректно определить зависимости. Если сделать каждый исходный файл зависимым от всех заголовочных файлов, иногда вы будете компилировать файлы напрасно. С другой стороны, если вы пропустите какие-то зависимости, возникнет еще более серьезная проблема, поскольку в этом случае вы не откомпилируете заново те файлы, которые нуждаются в перекомпиляции.

Выполните упражнение 9.5.

Упражнение 9.5. Использование
gcc -MM

В этом упражнении вы примените опцию

– MM
в программе
gcc
для генерации списка зависимостей вашего примера:

$ gcc -MM main.с 2.с 3.с

main.о: main.c a.h

2.о: 2.с a.h b.h

3.o: 3.с b.h c.h

$

Как это работает

Компилятор

gcc
просто просматривает исходные файлы, ищет заголовочные файлы и выводит требующиеся строки зависимостей в формате, готовом к вставке в make- файл. Вы должны лишь сохранить вывод во временном файле и затем вставить его в make-файл, чтобы иметь безошибочный набор зависимостей. Если вы пользуетесь копией, полученной от
gcc
, для появления ошибок в ваших зависимостях просто нет оснований!

Если вы хорошо знакомы с make-файлами, можно попробовать применить средство

makedepend
, которое выполняет функцию, аналогичную опции
– MM
, но вставляет полученный список зависимостей в конец реального заданного вами make-файла.

Перед завершением темы make-файлов, быть может, стоит подчеркнуть, что не следует ограничивать применение make-файлов только компиляцией кода и созданием библиотек. Их можно использовать для автоматизации любой задачи, в которой есть последовательность команд, формирующих из входного файла некоторого типа выходной файл. Типичным "некомпиляционным" применением может быть вызов программ

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

Другая возможность управления вашими сборками или на самом деле другой способ автоматизации задач — утилита ANT. Это средство на базе языка Java, использующее файлы конфигурации, написанные на языке XML. Ее обычно не применяют в ОС Linux для автоматизации создания исполняемых файлов из файлов на языке С, поэтому мы не будем обсуждать ее в книге. Более подробную информацию об ANT можно найти на Web-сайте http://ant.apache.org/.

Управление исходным кодом

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

В среде UNIX есть несколько широко распространенных систем управления исходными файлами:

SCCS (Source Code Control System);

RCS (Revision Control System);

CVS (Concurrent Version System);

Subversion.

SCCS первоначально была системой управления исходным кодом, введенной компанией AT&T в версии System V ОС UNIX, а сейчас она — часть стандарта X/Open. RCS была разработана позже как бесплатная замена SCCS и распространяется Фондом бесплатного программного обеспечения (Free Software foundation). RCS функционально очень похожа на SCCS, но с интуитивно более понятным интерфейсом и некоторыми дополнительными опциями, поэтому система SCCS по большей части вытеснена RCS.

Утилиты RCS обычно включены в дистрибутивы Linux или же их можно загрузить из Интернета вместе с исходными файлами с Web-сайта Фонда бесплатного программного обеспечения со страницы http://directory.fsf.org/rcs.html.

CVS — более передовая, чем SCCS или RCS, система, которая может быть инструментом для совместных разработок на базе Интернета. Ее можно найти в большинстве дистрибутивов Linux или по адресу http://www.nongnu.org/cvs/. У этой системы два существенных преимущества по сравнению с RCS: ее можно применять в сетевых соединениях и она допускает параллельные разработки.

Subversion — новое детище, входящее в блок, проектируемый для замены системы CVS когда-нибудь в будущем. Начальную страницу Web-сайта этой системы можно найти по адресу http://www.subversion.org.

Поделиться:
Популярные книги

Вернадский

Гумилевский Лев Иванович
325. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Вернадский

Технология XSLT

Валиков Алексей Н.
Компьютеры и Интернет:
программирование
5.00
рейтинг книги
Технология XSLT

Волкодав

Семёнова Мария Васильевна
1. Волкодав
Фантастика:
фэнтези
героическая фантастика
9.46
рейтинг книги
Волкодав

Петербург - нуар. Рассказы

Кивинов Андрей Владимирович
Проза:
современная проза
5.40
рейтинг книги
Петербург - нуар. Рассказы

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Ведьмак (сборник)

Сапковский Анджей
Фантастика:
фэнтези
6.67
рейтинг книги
Ведьмак (сборник)

Самвел

Мелик-Акопян Акоп
Проза:
историческая проза
6.60
рейтинг книги
Самвел

Приключения Оливера Твиста. Повести и рассказы

Диккенс Чарльз
82. Библиотека всемирной литературы
Проза:
классическая проза
8.85
рейтинг книги
Приключения Оливера Твиста. Повести и рассказы

Том 5. Рудин. Повести и рассказы 1853-1857

Тургенев Иван Сергеевич
5. Собрание сочинений в двенадцати томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 5. Рудин. Повести и рассказы 1853-1857

Рыцарь Империи

Буревой Андрей
3. Одержимый
Фантастика:
фэнтези
9.39
рейтинг книги
Рыцарь Империи

Ганнибал

Харрис Томас
3. Ганнибал Лектер
Детективы:
триллеры
8.80
рейтинг книги
Ганнибал

Иллюзии

Марч Джессика
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Иллюзии

Танцоры в конце времени

Муркок Майкл Джон
Фантастика:
фантастика: прочее
6.25
рейтинг книги
Танцоры в конце времени

Архивариус

alchoz
Проект «Поттер-Фанфикшн»
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Архивариус