.с.а:
$(CC) -с $(CFLAGS)
$< $(AR) $(ARFLAGS) $@ $*.о
Макросы $(AR)и $(ARFLAGS)подразумевают команду arи опции rvсоответственно. Довольно краткая синтаксическая запись информирует команду makeо том, что для включения файла .с в библиотеку .а следует применить два следующих правила:
□ первое правило говорит о том, что команда makeдолжна откомпилировать исходный файл и сформировать объектный файл;
□ второе правило предписывает применить команду arдля модификации библиотеки, заключающейся в добавлении нового объектного файла.
Итак, если у вас есть библиотека fud, содержащая файл bas.o, в первом правиле $<заменяется именем bas.c. Во втором правиле $@заменяется именем библиотеки fud.аи $*заменяется именем bas.
Выполните упражнение 9.4.
Упражнение 9.4. Управление библиотекой
Правила управления библиотеками очень просто применять на практике. В этом упражнении вы измените свое приложение, сохранив файлы 2.o и 3.o в библиотеке mylib.a. Make-файл потребует лишь нескольких изменений и его новый вариант Makefile5 будет выглядеть следующим образом:
all: myapp
# Какой компилятор
CC = gcc
# Куда установить
INSTDIR = /usr/local/bin
# Где хранятся файлы include
INCLUDE =
# Опции для разработки
CFLAGS = -g -Wall -ansi
# Опции для рабочей версии
# CFLAGS = -O -Wall -ansi
# Локальные библиотеки
MYLIB = mylib.a
myapp: main.o $(MYLIB)
$(CC) -o myapp main.o $(MYLIB)
$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
clean:
-rm main.o 2.o 3.o $(MYLIB)
install: myapp
@if [ -d $(INSTDIR) ]; \
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry, $(INSTDIR) does not exist";\
fi
Обратите внимание на то, как вы разрешили правилам по умолчанию выполнить большую часть работы. Теперь проверьте новую версию make-файла:
$ rm -f myapp *.o mylib.a
$ make -f Makefile5
gcc -g -Wall -ansi -с -o main.о main.c
gcc -g -Wall -ansi -с -o 2.о 2.c
ar rv mylib.a 2.o
a - 2.o
gcc -g -Wall -ansi -с -о 3.o 3.c
ar rv mylib.a 3.o
a - 3.о
gcc -o myapp main.о mylib.a
$ touch c.h
$ make -f Makefile5
gcc -g -Wall -ansi -с -о 3.o 3.c
ar rv mylib.a 3.o
r - 3.о
gcc -o myapp main.о mylib.a
$
Как это работает
Сначала вы удаляете все объектные файлы и библиотеку и разрешаете команде makeсоздать файл myapp, что она и делает, откомпилировав и создав библиотеку перед тем, как компоновать файл main.о с библиотекой для создания исполняемого файла myapp. Далее вы тестируете зависимость для файла 3.o, которая информирует команду makeо том, что, если меняется файл c.h, файл 3.c следует заново откомпилировать. Она делает это корректно, откомпилировав файл и обновив библиотеку перед перекомпоновкой, создающей новую версию исполняемого файла myapp.
Более сложная тема: make-файлы и подкаталоги
При работе над большими проектами порой бывает удобно отделить от основных файлов файлы, формирующие библиотеку, и поместить их в подкаталог. С помощью команды makeможно сделать это двумя способами.
Во-первых, можно создать в подкаталоге второй make-файл для компиляции файлов, сохранения их в библиотеке и последующего копирования библиотеки на уровень вверх, в основной каталог. При этом в основном make-файле, хранящемся в каталоге более высокого уровня, есть правило формирования библиотеки, в котором описан запуск второго make-файла следующим образом:
mylib.a:
(cd mylibdirectory;$(MAKE))
Это правило гласит, что вы всегда должны пытаться создать mylib.a с помощью команды make. Когда makeинициирует правило создания библиотеки, она изменяет каталог на mylibdirectory и затем запускает новую команду makeдля управления библиотекой. Поскольку для этого запускается новая командная оболочка, программа, применяющая make-файл, не выполняет команду cd. А командная оболочка, запущенная для выполнения правила построения библиотеки, находится в другом каталоге. Скобки обеспечивают выполнение всего процесса в одной командной оболочке.
Второй способ заключается в применении нескольких макросов в одном make-файле. Дополнительные макросы генерируются добавлением символа Dдля каталога или символа Fдля имени файла к тем макросам, которые мы уже обсуждали. Вы можете переписать встроенное правило с суффиксами .с.о
Читать дальше