MAKE(1) MAKE(1) НАЗВАНИЕ make - поддержка, обновление и восстановление групп программ СИНТАКСИС |make [-f make-файл] [-p] [-i] [-k] [-s] [-r] [-n] [-b] [-e] [-u] [-t] [ | [целевой_файл ...] ОПИСАНИЕ Утилита make позволяет поддерживать, изменять и регене- рировать группы программ. Ниже приведено краткое описа- ние всех опций и некоторых специальных имен: -f make-файл Задание имени файла с описаниями. -p Вывести все макроопределения, а также описания за- висимостей и операций для создания целевых_файлов. -i Игнорировать коды ошибок, возвращаемых запускаемы- ми программами. Этот режим устанавливается также при появлении в файле описаний специального целе- вого имени .IGNORE. -k При ошибке прекращать выполнение команд, связанных с текущей зависимостью, но продолжать обработку других зависимостей. -s Не выводить командные строки перед их выполнением. Этот режим устанавливается также при появлении в файле описаний специального целевого имени .SILENT. -r Не использовать встроенные правила. -n Выводить команды, но не выполнять их. Выводятся даже команды, которые начинаются с @. -b Режим для совместимости со старыми версиями make-файлов. -e В первую очередь используются переменные окруже- ния, а не одноименные макросы make-файлов. -u Вызывает безусловное обновление. -t "Массаж" целевых_файлов: время их создания уста- навливается равным текущему времени; команды, предназначенные для получения целевых_файлов, не выполняются. -q Запрос. Команда make возвращает нулевой или нену- левой код завершения в зависимости от того, нужно ли обновлять целевые_файлы (0, если не нужно). Пе- чать команд подавляется, даже если присутствует опция -n. .DEFAULT Если должен быть сделан файл, но нет ни явных ко- манд, ни соответствующих встроенных правил, то ис- пользуются команды, ассоциированные со специальным целевым именем .DEFAULT, если они существуют. .PRECIOUS Файлы, которые зависят от этого специального име- ни, не удаляются, если работа команды make была прервана или прекращена. .SILENT Дает тот же эффект, что и опция -s. .IGNORE Дает тот же эффект, что и опция -i. Make выполняет команды из make-файла для обновления од- ного или нескольких целевых_файлов, имена которых ука заны в команде. Если отсутствует опция -f, то ищутся файлы makefile, Makefile, и файлы системы управления исходными текстами (SCCS) s.makefile и s.Makefile в указанном порядке. Если вместо make-файла указан -, то это означает стандартный ввод. В командной строке может встретиться более чем одна пара -f make-файл. Команда make обновляет целевой_файл только в том слу чае, если файлы, от которых он зависит, оказываются но- вее в смысле времени модификации (кроме случая, когда была использована опция -u с целью вызвать безусловное обновление). Все файлы, от которых зависит целевой_файл добавляются рекурсивно к списку целевых файлов. От сутствующие файлы считаются требующими обновления. Make-файл состоит из последовательности разделов, опре- деляющих зависимости. Первая строка раздела - непустой список разделенных пробелами имен целевых файлов, затем знак :, затем (возможно пустой) список необходимых фай- лов или зависимостей. Текст, следующий за ; и все пос- ледующие строки, начинающиеся с табуляции, представляет собой команды shell'а, которые необходимо выполнить для обновления целевого файла. Первая строка, которая не начинается с табуляции или #, открывает новое описание зависимости или макроопределение. Команды shell'а могут быть продолжены в следующей строке, если последним сим- волом текущей строки поставить \. Все, что выводит make, кроме начальных символов табуляции, передается shell'у в исходном виде. Например, |echo a\ |b даст |ab как если бы команда выполнялась просто shell'ом. Символы # и перевод_строки обрамляют комментарии. В приведенном ниже make-файле определяется, что pgm за- висит от двух файлов: a.o и b.o, и что они в свою оче редь зависят от соответствующих исходных файлов (a.c и b.c) и общего файла incl.h: |pgm: a.o b.o | cc a.o b.o -o pgm |a.o: incl.h a.c | cc -c a.c |b.o: incl.h b.c | cc -c b.c Командные строки выполняются по одной, каждая своим собственным shell'ом. Чтобы указать, каким shell'ом вы- полнять команду, можно использовать переменную окруже- ния SHELL. Первые один или два символа команды могут быть следующими: -, @, -@, @-. Если присутствует @, то подавляется вывод команды. При указании символа - make игнорирует ошибки. Команда перед ее выполнением выво- дится, если только не указана опция -s, или в make-фай- ле отсутствует вход .SILENT:, или в начале команды не стоит знак @. Опция -n специфицирует вывод команд без их выполнения; однако, если командная строка содержит текст $(MAKE), то она всегда выполняется (см. MAKEFLAGS в пункте Окружение). Если указана опция -t, то изменя ется время последней модификации файлов без выполнения каких-либо команд. К сожалению, при этом не изменяются даты сохранения файлов в библиотеках (см. Библиотеки), а меняется только время последней модификации библиоте- ки. Команды, возвращающие ненулевой код завершения, обычно прекращают выполнение make. Если же указана опция -i или в make-файле присутствует вход .IGNORE:, или ко- мандная строка начинается со знака -, то ошибки игнори- руются. Если указана опция -k, то прекращается обработ- ка текущего раздела, но продолжаются действия, которые не зависят от целевого файла этого раздела. В конце водится сообщение о первоначальных целях, которые не были достигнуты. Опция -b позволяет без ошибок выполнять make-файлы, на- писанные для старой версии make'а. Отличие состоит в том, что в новой версии все строки зависимостей должны содержать (возможно пустые или задаваемые по умолчанию) команды, связанные с ними. В предыдущей версии счита- лось, что неспецифицированная команда является пустой. Сигналы прерывания и выхода вызывают уничтожение целе вого файла, если только он не зависит от специального имени .PRECIOUS. Окружение Команда make читает окружение. Все переменные окружения обрабатываются как макроопределения. Все они читаются и обрабатываются до обработки make-файла и после обработ- ки встроенных правил; поэтому макроопределения из make-файла перекрывают макроопределения из окружения. Если задана опция -e, то переменные из окружения перек рывают макроопределения из make-файла. Суффиксы и свя занные с ними правила из make-файла перекрывают описа- ния суффиксов во встроенных правилах. Переменная окружения MAKEFLAGS обрабатывается как со- держащая любую из допустимых опций (кроме -f и -p), описанных для командной строки. Далее, если такой пере менной в окружении нет, то make создает ее, помещая нее все указанные в командной строке опции, и передает ее всем запускаемым им командам. Таким образом, MAKEFLAGS всегда содержит текущие опции. Эта возмож ность очень полезна, если возникла необходимость отла- дить make-файл для проекта, состоящего из подсистем, для которых есть свои собственные make-файлы. Как уже отмечалось выше (при использовании опции -n) команда $(MAKE) выполняется всегда, следовательно, можно выпол- нить make -n рекурсивно по всему проекту, чтобы посмот- реть, что было бы выполнено при отсутствии опции -n. Это возможно, так как флаг -n помещается в MAKEFLAGS и передается при вызове $(MAKE). Тем самым перед нам один из способов проверить все make-файлы проекта, не выполняя их на самом деле. Включение файлов Если в make-файле строка начинается с цепочки символов include и после нее пробел или табуляция, то остаток строки после подстановки макросов считается именем фай- ла и этот файл будет прочтен и включен в make-файл. Макросы Разделы, имеющие вид цепочка1=цепочка2 являются макроопределениями. В цепочку2 входят все сим волы до начала комментария или до неэкранированного пе ревода строки. Последующие вхождения конструкции $(це- почка1[:подцеп1=[подцеп2]]) заменяются цепочкой2. При этом, если в цепочке2 встречаются подцепочки подцеп1, за которыми следует пробел или табуляция, и подцеп1 на чинается с точки, они заменяются на подцепочку подцеп2. Если имя макроса состоит из одного символа и нет подс- тановок, то круглые скобки можно опускать. Пример ис- пользования подстановок см. в пункте Библиотеки. Внутренние макросы Мake поддерживает пять внутренних макросов, полезных при написании правил построения целевых файлов: $* Этот макрос является именем файла без расширения из текущей зависимости; вычисляется только для подразумеваемых правил (см. Суффиксы). $@ Этот макрос заменяется на полное имя целевого фай- ла; вычисляется только для явно заданных зависи- мостей. $< Вычисляется только для подразумеваемых правил или для правила .DEFAULT. Этот макрос заменяется на имя файла, от которого по умолчанию зависит цел вой файл. Так, в правиле .c.o макрос $< будет за менен на имя файла с расширением .c. Например, правило для изготовления оптимизированного объект- ного файла из файла с расширением .c может быть таким: |.c.o: | cc -c -O $*.c или |.c.o: | cc -c -O $< $? Макрос $? можно использовать в явных правилах make-файла. Этот макрос заменяется на список фай- лов-источников, которые изменялись позднее целево- го файла. $% Этот макрос применяется только тогда, когда целе- вой файл указан в виде библ(файл.o), что означает, что он находится в библиотеке библ. В этом случае $@ заменяется на библ (имя архива), а $% заменяет- ся на настоящее имя файла, файл.o. Четыре из этих макросов имеют альтернативную форму. Ес- ли к любому из этих макросов добавлено F, то он заменя ется на соответствующее макросу имя файла без имени ка- талога; если же добавлено D, то макрос заменяется на остальную часть значения первоначального макроса без последнего символа /, то есть на имя каталога. Так, $(@D) соответствует каталогу из $@. Если каталог не указан, то генерируется текущий каталог (.). Только макрос $? не имеет альтернативной формы. Суффиксы Некоторые файлы (например файлы, имена которых оканчи- ваются на .o) имеют подразумеваемые источники, напри- мер, файлы, имена которых оканчиваются на .c, .s и т.д. Если для этих файлов не указаны команды их модификации в make-файле, но существуют подразумеваемые источники, то они (источники) компилируются для получения требуе- мых файлов. В таких случаях make применяет подразумева- емые (встроенные) правила вывода, позволяющие получить одни файлы из других путем исследования суффиксов и оп- ределения соответствующих команд. Подразумеваемые пра- вила вывода таковы: |.c .c~ .f .f~ .sh .sh~ |.c.o .c.a .c~.o .c~.c .c~.a |.f.o .f.a .f~.o .f~.f .f~.a |.h~.h .s.o .s~.o .s~.s .s~.a .sh~.sh |.l.o .l.c .l~.o .l~.l .l~.c |.y.o .y.c .y~.o .y~.y .y~.c Встроенные правила можно изменять. Чтобы вывести их в виде, пригодном для изменения, нужно воспользоваться командой |make -fp - 2>/dev/null rules Символ ~ (тильда) используется в этих правилах для SCCS-файлов [см. sccsfile(4)]. Так, правило .c~.o трансформирует SCCS C-файл в объектный файл .o. Так как s. в SCCS-файлах является префиксом, то это несовмести- мо с принятым в make способом определения правила по суффиксу. Использование тильды вызывает замену ссылки на файл ссылкой на SCCS-файл. Правила с одним суффиксом (например .c:) описывают, как получить файл x из x.c (то есть второй суффикс пустой). Это полезно для построения целевого файла только из од- ного исходного файла (например, для построения shell-процедуры или простой C-программы). Дополнительные суффиксы даются как список зависимостей для специального имени .SUFFIXES. При этом важен поря- док: первое возможное имя, для которого существуют и файл и правило, используется как имя источника. По умолчанию этот список выглядит так: .SUFFIXES: .o .c .c~ .y .y~ .l .l~ .s .s~ .h~ .h .f .f~ .sh~ .sh Команда, указанная выше для вывода списка встроенных правил, показывает также встроенный список суффиксов. Многократные указания .SUFFIXES: объединяют списки суф- фиксов; указание .SUFFIXES: с пустым списком очищает список суффиксов. Подразумеваемые правила Пример с целевым файлом pgm можно записать короче: |pgm: a.o b.o | cc a.o b.o -o pgm |a.o b.o: incl.h Это возможно, так как make использует набор внутренних правил. Пользователь может добавить правила просто по- местив их в make-файл. Некоторые макросы используются в подразумеваемых прави- лах, чтобы разрешить включение опций в какую-нибудь из получающихся команд. Например, CFLAGS, LFLAFS, и YFLAGS используется для задания опций компиляторам cc(1), lex(1), и yacc(1) соответственно. Для определения зна- чений по умолчанию этих макросов можно снова порекомен- довать описанный ранее метод для просмотра встроенных правил. Подразумеваемые правила можно изменять. Правило созда ния файла с суффиксом .o из файла с суффиксом .c указы- вается как раздел с именем .c.o: и пустым списком зави- симостей. Команды shell'а, связанные с этим именем, оп- ределяют способ получения файла .o из файла .c. Любое имя, в которое не входит символ /, и которое начинается с точки, распознается как имя правила, а не настоящего целевого файла. Библиотеки Если целевой файл или имя из списка зависимостей содер- жит скобки, то оно рассматривается как имя архивной библиотеки, а цепочка символов в скобках - как имя эле мента библиотеки. Так, и библ(файл.o), и $(БИБЛ)(файл.o) обозначают библиотеку, содержащую файл.o (предполагается, что макрос БИБЛ был предвар тельно определен). Выражение $(БИБЛ)(файл1.o файл2.o) недопустимо. Правила обработки библиотечных файлов име- ют вид .XX.a, где XX - суффикс, по которому будет полу- чен элемент библиотеки. К сожалению, в текущей реализ ции требуется, чтобы XX отличался от суффикса элемента библиотеки. Например, нельзя, чтобы библ(файл.o) зави- сел от файл.o явно. Наиболее общее использование интер- фейса работы с библиотеками следующее (предполагается, что исходными являются файлы на языке C): |lib: lib(file1.o) lib(file2.o) lib(file3.o) | @echo lib is now up-to-date |.c.a: | $(CC) -c $(CFLAGS) $< | $(AR) $(ARFLAGS) $@ $*.o | rm -f $*.o Фактически, правило .c.a, приведенное выше, встроено в make. Более интересный, но более ограниченный пример конструкции, поддерживающей работу с библиотеками: |lib: lib(file1.o) lib(file2.o) lib(file3.o) | $(CC) -c $(CFLAGS) $(?:.o=.c) | $(AR) $(ARFLAGS) lib $? | rm $? @echo lib is now up-to-date |.c.a:; Здесь используется режим подстановки расширений макро сов. Список $? определен как множество имен объектных файлов (в библиотеке lib), чьи исходные C-файлы были изменены. Подстановка заменяет .o на .c. (К сожалению, нельзя еще трансформировать в .c~; однако, это может стать возможно в будущем). Заметим также, что запреща- ется правило .c.a:, создающее каждый объектный файл один за другим. Эта конструкция значительно ускоряет обновление библиотек, но становится весьма громоздкой, если библиотека содержит как программы на C, так и на ассемблере. ФАЙЛЫ [Mm]akefile и s.[Mm]akefile /bin/sh СМ. ТАКЖЕ sccsfile(4). cc(1), lex(1), yacc(1), cd(1), sh(1) в Справочнике пользователя. СЮРПРИЗЫ Некоторые команды возвращают ненулевой код завершения и после успешной работы; для преодоления этой трудности используйте опцию -i. Не допускаются файлы с символами =:@ в имени. Команды, непосредственно выполняемые shell'ом, например cd(1), нельзя продолжать на новую строку. Если после слова include находится больше одного пробе- ла, то make не сможет прочитать включаемый файл. Макрос $(a:.o=.c~) не работает. Именованные фильтры поддерживаются плохо. Выражение $(LIB)(file1.o file2.o) синтаксически невер- но. Нельзя построить lib(file.o) из file.o. В текущей версии не распознается опция -u. В текущей версии целевой файл не удаляется, если прои- зошла ошибка. Специальное имя .PRECIOUS не работает. Специальное имя .DEFAULT не работает. Макросы $(@D), $(*D), $(