Операционная система UNIX. Руководство программиста


Архивные библиотеки - часть 2


Полезно в деталях рассмотреть, как make обрабатывает следующую конструкцию:

projlib: projlib(pfile1.o) @echo projlib up-to-date

Предположим, что объектный файл, содержащийся в библиотеке, по сравнению с pfile1.c устарел. Кроме того, файл pfile1.o отсутствует.

Выполняются следующие действия:

make projlib.

  • При выполнении make projlib сначала проверить все файлы, от которых зависит projlib.
  • Архив projlib зависит от элемента projlib(pfile1.o), который необходимо сгенерировать.
  • Перед тем как генерировать элемент projlib(pfile1.o), проверить все файлы, от которых он зависит. (Таких файлов нет.)
  • Использовать встроенные правила для того, чтобы попытаться создать projlib(pfile1.o). (Встроенного правила нет.) Отметим, что цепочка projlib(pfile1.o) содержит скобки для того, чтобы указать на суффикс целевого файла .a. В конце имени архива projlib суффикс .a явным образом не написан, но скобки его подразумевают. В этом смысле суффикс .a жестко запаян в make.
  • Разбить имя projlib(pfile1.o) на projlib и pfile1.o. Определить два макроса: $@(=projlib) и $*(=pfile1).
  • Попытаться найти правило .X.a и файл $*.X. Первый .X (в списке .SUFFIXES), который удовлетворяет этим условиям, это .c; поэтому выбирается правило .c.a и файл - pfile1.c. Установить $< равным pfile1.c и выполнить данное правило. В действительности make должен откомпилировать pfile1.c.
  • Обновить библиотеку. Выполнить команду, соответствующую projlib: зависимости, то есть

    @echo projlib up-to-date

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

projlib(pfile1.o): $(INCDIR)/stdio.h pfile1.c

На случай использования подобной конструкции предусмотрен макрос для ссылки на имя элемента архива. Всякий раз, когда вычисляется макрос $@, вычисляется и $%. Если текущего элемента архива нет, $% полагается равным пустой цепочке. Если элемент архива существует, то $% равно выражению в скобках.




- Начало -  - Назад -  - Вперед -