mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

      MAKE(1)                                                 MAKE(1)

      НАЗВАНИЕ
              make - поддержка,  обновление  и  восстановление  групп
              программ

      СИНТАКСИС
   make  [-f make-файл] [-p] [-i] [-k] [-s] [-r] [-n] [-b] [-e] [-u] [-t] [-q]
	 [целевой_файл ...]

      ОПИСАНИЕ
              Утилита 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), $(






 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк