NMake

Тема в разделе "WASM.X64", создана пользователем Mikl___, 13 сен 2025.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111
    Вперед Назад Содержание

    14. Соглашения о make-файлах

    Эта глава описывает соглашения по написанию make-файлов для GNU-программ.

    14.1 Общие соглашения о make-файлах

    Каждый make-файл должен содержать такую строку:
    SHELL = /bin/sh

    во избежание проблем при работе на тех системах, где переменная SHELL могла бы быть унаследована из среды. (Это никогда не является проблемой при работе с GNU-версией программы make.)
    Различные версии программы make имеют несовместимые списки суффиксов и неявные правила, и это иногда создает неразбериху или неправильное поведение. Поэтому хорошей идеей является явная установка списков суффиксов с использованием только тех суффиксов, которые вам нужны в конкретном make-файле, как показано ниже:
    .SUFFIXES:
    .SUFFIXES: .c .o

    Первая строка очищает список суффиксов, вторая представляет все суффиксы, которые могут быть предметом неявных правил в этом make-файле.
    При выполнении команд не закладывайтесь на то, что символ '.' находится в пути. Когда во время работы программы make вам требуется запускать программы, которые являются частью вашего пакета, убедитесь, пожалуйста, что используется './', если построение программы происходит в рамках части программы make или '$(srcdir)/', если файл является неизменяемой частью исходного кода. Если нет ни одного из этих префиксов, то используется текущий путь поиска.
    Различие между './' и '$(srcdir)/' важно при использовании опции '--srcdir', установленной в значение 'configure'. Правило в такой форме:
    foo.1 : foo.man sedscript sed
    p -e sedscript foo.man
    p > foo.1

    не сможет быть выполнено, когда текущий каталог не является исходным каталогом, поскольку файлов 'foo.man' и 'sedscript' нет в текущем каталоге.
    При использовании GNU-версии программы make полагаться на переменную VPATH для поиска исходного файла можно в том случае, когда есть один файл зависимости, поскольку автоматическая переменная программы make '$<' будет представлять исходный файл, где бы она ни находилась. (Многие версии программы make устанавливать переменную '$<' только в неявных правилах.) Цель make-файла, представленная в такой форме:
    foo.o : bar.c
    p $(CC) -I. -I$(srcdir) $(CFLAGS) -c bar.c -o foo.o

    должно вместо этого быть записана в таком виде:
    foo.o : bar.c
    $(CC) -I. -I$(srcdir) $(CFLAGS) -c $< -o $@

    для того, чтобы позволить переменной VPATH корректно работать. Когда цель имеет несколько зависимостей, явное использование ссылки на переменную '$(srcdir)'представляет собой самый легкий способ, заставляющий правило работать правильно. Например, лучше всего, чтобы приведенное выше правило для файла 'foo.1' было написано в таком виде:
    foo.1 : foo.man sedscript sed
    -e $(srcdir)/sedscript
    $(srcdir)/foo.man >
    $@

    14.2 Использование утилит в Makefile.

    Команды, которые пишутся в Makefile (как, впрочем, и в любых других shell-скриптах вроде configure), должны работать в sh, а не в csh. Не следует использовать каких-либо специальных особенностей ksh или bash.
    Скрипт configure и правила Makefile для построения и установки программы не должны использовать никаких утилит кроме следующих:
    cat cmp cp echo egrep expr grep
    ln mkdir mv pwd rm rmdir sed test touch

    Следует использовать только общепринятые опции для этих программ. К примеру, не следует использовать 'mkdir -p', поскольку эта опция хоть и удобна, но большинство систем не поддерживают ее.
    Правила Makefile для построения и установки могут также использовать компиляторы и другие необходимые программы, но их использование должно выполняться через make-переменные для того, чтобы пользователь имел возможность заменить их определение на собственную альтернативу. Вот некоторые из программ, которые мы имеем ввиду:
    ar bison cc flex install ld lex
    make makeinfo ranlib texi2dvi yacc

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

    14.3 Стандартные цели в Make

    Все программы в GNU должны иметь следующие цели в своих Makefile'ах.
    allКомпиляция всей программой. Эта цель должна быть целью по умолчанию. Эта цель не должна перестраивать никакие файлы документации; info-файлы должны включаться в поставку, DVI файлы должны формироваться только по явному запросу.
    installКомпиляция программы и копирование исполнимых файлов, библиотек и т.д. туда, где они должны располагаться для их обычного использования. Если возможно, по этой цели должна выполняться простая проверка того, что программа была правильно установлена.
    Команды должны создать все каталоги, в которых файлы будут установлены, если эти каталоги уже не существуют. Сюда входят каталоги, указанные как значения переменных prefix и exec_prefix, так же, как и все их требуемые подкаталоги. Другой способ выполнить это подразумевает использование цели installdirs, описанной ниже.
    Используйте символ '-' перед любой командой для установки файлов с man-страницами для того, чтобы игнорировались все ошибки. Это нужно для того, чтобы можно было устанавливать программу на систему, в которой не установлена Unix-система man-документов.
    Для установки info-файлов необходимо скопировать их в $(infodir) с $(INSTALL_DATA) (см. Переменные для исполнения команд), и затем выполнить программу install-info (если она имеется). install-info - это скрипт, который выполняет редактирование файла 'dir' системы Info для того, чтобы добавить или обновить элемент меню для данного Info-файла; этот скрипт является частью пакета Texinfo. Далее приводится пример правила для установки Info-файла:
    $(infodir)/foo.info: foo.info
    # There may be a newer info file in . than in srcdir
    -if test -f foo.info; then d=.; \
    else d=$(srcdir); i;
    $(INSTALL_DATA) $$d/foo.info $@ ; \
    # Run install-info only if it exists.
    # Use 'if' instead of just prepending '-' to the
    # line so we notice real errors from install-info.
    # We use '$(SHELL) -c' because some shells do
    # fail gracefuly when there is an unknown command.

    if $(SHELL) -c 'install-info --version' \
    >/dev/null 2>&1; then \
    install-info --infodir=$(infodir) $$d/foo.info; \
    else true; fi
    uninstallВыполняется удаление всех установленных файлов, созданных при исполнении цели 'install' (но не тех файлов, которые создаются при исполнении цели 'all').
    cleanВыполняется удаление тех файлов из текущего каталога, которые были созданы при построении программы. Не удаляются файлы, в которых сохранена конфигурация. Так же сохраняются файлы, которые могут быть получены при построении, но которые тем не менее входят в поставку. Следует удалять .dvi файлы, если они не являются частью поставки.
    distcleanУдаляются все файлы из текущего каталога, которые были созданы при конфигурировании или построении программы. Если Вы распакуете исходные тексты программ, после чего построите программу не создавая самостоятельно каких-либо файлов, то 'make distclean' должно оставить только те файлы, которые входили в поставку.
    mostycleanРаботает так же, как и clean, но оставляет неудаленными некоторые файлы, которые обычно нежелательно перекомпилировать. Например, цель 'mostyclean' для GCC не удаляет файл 'libgcc.a', поскольку его перекомпиляция редко когда бывает нужна, и к тому же занимает много времени.
    realcleanВыполняется удаление из текущего каталога всего, что может быть построено с помощью Makefile. Обычно это включает в себя все то, что удаляется по distclean, исходные файлы на C, полученные с помощью построителя синтаксических анализаторов Bison, таблицу тегов, info-файлы и т.д.
    Имеется одно исключение: 'make realclean' не должен удалять 'configure', даже если 'configure' может быть построен используя правило в Makefile. Более того, 'make realclean' не должен удалять ничего из того, чье существование требуется для выполнения 'configure' и начального исполнения программы.
    TAGSОбновляет таблицу тегов для программы.
    infoВыполняется построение всех требуемых info-файлов. Лучший всего написать правила по следующему образцу:
    info: foo.info
    foo.info: foo.texi chap1.texi chap2.texi

    $(MAKEINFO) $(srcdir)/foo.texi

    Вы должны определить в Makefile переменную MAKEINFO. Она должна запускать программу makeinfo, которая входит в поставку пакета Texinfo.
    dviВыполняется построение DVI-файлов для всей TeXinfo-документации. Пример правил:
    dvi: foo.dvi
    foo.dvi: foo.texi chap1.texi chap2.texi

    $(TEXI2DVI) $(srcdir)/foo.texi

    Вы должны определить переменную TEXI2DVI в Makefile. Она должна запускать программу texi2dvi, которая является частью поставки пакета Texinfo. Можно указать просто зависимости, тогда GNU Make сам предоставит эту команду.
    distВыполняется создание tar-файла, содержащего дистрибутивную поставку этой программы. tar-файл должен быть создан таким образом, чтобы имена файлов в нем начинались с подкаталога, имя которого являлось бы именем поставляемого пакета. Имя может включать в себя номер версии.
    Например, поставка дистрибутивного архива для GCC версии 1.40 должна распаковываться в каталог с именем 'gcc-1.40'.
    Простейший способ выполнить это состоит в создании названного таким образом каталога, и использовании ln или cp для установки соответствующих файлов в него. После чего необходимо выполнить tar для этого подкаталога.
    Цель dist должна явно зависеть от всех файлов, которые не являются исходными, но должны входить в поставку, для того, чтобы убедиться в их актуальности.
    checkВыполняет самотестирование (если предусмотрено). Пользователь должен построить программу перед запуском тестов, но не должен устанавливать программу; Вы должны написать тесты таким образом, чтобы они работали когда программа построена, но не установлена.
    Следующие цели в тех программах, в которых они нужны, должны иметь следующие стандартные имена.
    installcheckВыполняет проверку правильности установки (если соответствующие тесты предусмотрены). Пользователь должен построить и установить программу перед запуском этих тестов. Вы не должны считать, что $(bindir) входит в путь поиска программ.
    installdirsПолезно добавить цель с именем 'installdirs' для создания структуры каталогов, в которых будут установлены файлы. Имеется скрипт, названный 'mkinstalldirs', который подходит для этой цели. Он находится в пакете Texinfo. Вы можете написать правило по следующему образцу:
    # Make sure all installation directories (e.g. $(bindir))
    # actually exists by making them if necessary.
    installdirs: mkinstalldirs

    $(srcdir)/mkinstalldirs $(bindir) $(datadir) \
    $(libdir) $(infodir) \
    $(mandir)

    Вперед Назад Содержание
     
    Последнее редактирование: 24 сен 2025
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111
    Вперед Назад Содержание

    14.4 Переменные для указания команд.

    Makefile должен предоставлять переменные для того, чтобы можно было перекрыть некоторые команды, опции и т.д.
    В частности, Вы должны запускать большинство утилит через переменные. Так, если Вы используете Bison, введите переменную с именем BISON, чье значение по умолчанию установлено как 'BISON=bison', и ссылайтесь на нее $(BISON) везде, где Вам нужно использовать Bison.
    Утилиты управления файлами (такие, как ln, rm, mv и т.д.) не должны выполняться через переменные, поскольку пользователям нет необходимости заменять их другими программами.
    Каждой переменной с именем программы должна соответствовать переменная с опциями, которые должны передаваться этой программе. Следует добавлять 'FLAGS' к имени переменной для программы, чтобы получить имя переменной для опций - например, BISONFLAGS. (Имя CFLAGS является исключением из этого правила, но мы сохраняем его, поскольку оно общепринято.) Используйте CPPFLAGS в любой команде компиляции, которая запускает препроцессор, и LDFLAGS в любой команде компиляции, которая выполняет редактирование связей, так же, как и при явном использовании ld.
    Если имеются опции C-компилятора, которые должны быть использованы для правильной компиляции некоторых файлов, не включайте их в CFLAGS. Пользователи ожидают, что они могут свободно установить CFLAGS сами. Вместо этого, упорядочите передачу таких опций компилятору независимо от CFLAGS, указывая их явно в командах компиляции или определяя неявное правило как здесь:

    CFLAGS = -g
    ALL_CFLAGS = -I. $(CFLAGS)
    .c.o:
    $(CC) -c $(CPPFLAGS) $(ALL_CFLAGS) $<

    Не следует включать опцию -g в CFLAGS, поскольку она не требуется для правильной компиляции. Вы можете рассматривать это умолчание как рекомендуемое. Если пакет установлен так, что он компилируется с использованием GCC по умолчанию, то вы можете включить '-O' в умалчиваемое значение переменной CFLAGS.
    Помещайте CFLAGS последним в команде компиляции, после всех других переменных, содержащих опции компилятора, для того, чтобы пользователь мог использовать CFLAGS для перекрытия опций, указанных в других переменных.
    Каждый Makefile должен определять переменную INSTALL, которая обозначает базовою команду для установки файла в системе.
    Каждый Makefile должен также определять переменные INSTALL_PROGRAM и INSTALL_DATA. (Умолчание для этих переменных должно быть $(INSTALL).) В дальнейшем, эти переменные должны использоваться для установки соответственно исполнимых и неисполнимых файлов. Используйте эти переменные как в примере:

    $(INSTALL_PROGRAM) foo $(bindir)/foo
    $(INSTALL_DATA) libfoo.a $(libdir)/libfoo.a

    Следует всегда указывать в качестве второго аргумента имя файла (не имя каталога). Надо использовать отдельную команду для каждого устанавливаемого файла.

    14.5 Переменные для каталогов

    Каталоги для установки должны всегда именоваться посредством переменных, поскольку это упрощает установку программы в нестандартное место. Стандартные имена для таких переменных следующие:
    prefixПрефикс, используемый для построения значений по умолчанию для переменных, перечисленных ниже. Значение по умолчанию для переменной prefix должно быть '/usr/local' (по крайней мере сейчас).
    exec_prefixПрефикс, используемый при построении значений по умолчанию для некоторых переменных, перечисленных ниже. Значение по умолчанию для переменной exec_prefix должно быть $(prefix).
    Как правило, $(prefix) используется для каталогов, которые содержат машиннозависимые файлы (такие, как исполнимые файлы и библиотеки процедур), в то время как $(prefix) используется для остальных каталогов.
    bindirКаталог для установки исполнимых программ, которые могут быть запущены пользователем. Обычно, это '/usr/local/bin', но должно быть записано как '$(exec_prefix)/bin'
    libdirКаталог для установки исполняемых файлов, которые будут запускаться другими программами, а не пользователем. Объектные файлы и библиотеки объектного кода должны так же попадать в этот каталог. Идея состоит в том, что этот каталог используется для файлов, которые зависят от конкретной архитектуры машины, но не должны находится в пути для команд. Значение для libdir обычно '/usr/local/lib', но должно быть записано как '$(exec_prefix)/lib'.
    datadirКаталог для установки файлов с неизменяемыми данными, которые используются программами во время их работы. Этот каталог используется для файлов, которые не зависят от используемого типа машины. Значение этой переменной обычно '/usr/local/lib', но должно быть записано как '$(prefix)/lib'.
    statedirКаталог для установки файлов с данными, которые программы могут изменять в процессе своей работы. Эти файлы должны быть независимыми от типа используемой машины, и должны допускать разделение их между машинами при сетевой установке. Значение этой переменной обычно '/usr/local/lib', но должно быть записано как '$(prefix)/lib'
    includedirКаталог для установки заголовочных файлов (header-файлов), которые могут быть включены другими пользовательскими программами с помощью директивы препроцессора '#include'. Значение этой переменной обычно '/usr/local/include', но должно быть записано как '$prefix/include'.
    Большинство компиляторов отличных от GCC не выполняют поиск заголовочных файлов в '/usr/local/include', поэтому установка заголовочных файлов в этот каталог целесообразна только для GCC. Иногда это не представляет из себя проблему, так как некоторые библиотеки предназначены для использования исключительно с GCC. Но имеются так же и библиотеки, предназначенные для работы и с другими компиляторами. Они должны устанавливать свои включаемые файлы в два места, одно из которых определено переменной includedir, а другое - oldincludedir.
    oldincludedirКаталог для установки заголовочных файлов для использования с компиляторами, отличными от GCC. Значение этой переменной обычно '/usr/include'.
    Команды Makefile должны проверить, не пусто ли значение переменной oldincludedir. Если оно пусто, они не должны пытаться использовать ее и выполнять повторную установку включаемых файлов.
    Пакет не должен замещать существующие заголовочные файлы в этом каталоге, в случае, если заголовочный файл пришел не из того же пакета. Так, если Ваш пакет Foo предоставляет заголовочный файл 'foo.h', то он должен установить заголовочный файл в каталог, заданный oldincludedir, если (1) foo.h не существует, или (2) foo.h существует и пришел из пакета Foo.
    Для того, чтобы проверить, что foo.h пришел из пакета Foo, поместите специальную строку в этот файл - часть комментария - и проверьте наличие этой строки с помощью команды grep.
    mandirКаталог для установки man-страниц (если они есть) для этого пакета. Переменная должна включать суффикс для соответствующей секции руководства - обычно '1' для утилит. Обычно значение этой переменной '/usr/local/man/man1', но должно быть записано как '$(prefix)/man/man1'
    man1dirКаталог для установки в раздел 1 man-страниц.
    man2dirКаталог для установки в раздел 2 man-страниц.
    Используйте переменные такого рода вместо 'mandir', если пакет должен устанавливать man-страницы более чем в один раздел.
    manextРасширение для имени файла для устанавливаемых man-страниц. Переменная должна содержать точку, за которой следует соответствующая цифра, обычно '.1'.
    man1extРасширение имени файла для установки в раздел 1 man-страниц.
    man2extРасширение имени файла для установки в раздел 2 man-страниц.
    Используйте переменные такого рода вместо 'manext', если пакет должен устанавливать man-страницы более чем в один раздел.
    infodirПеременная должна содержать имя каталога для установки info-файлов для данного пакета. По умолчанию, ее значение должно быть '/usr/local/info', но должно быть записано как '$(prefix)/info'.
    srcdirВ этой переменной должно находится имя каталога, содержащего компилируемые исходные тексты. Значение этой переменной обычно вставляется скриптом configure.
    Пример:

    # Common prefix for installation directories.
    # NOTE: This directory must exist when you start the install.
    prefix = /usr/local
    exec_prefix = $(prefix)
    # Where to put the executable for the command 'gcc'.
    bindir = $(exec_prefix)/bin
    # Where to put the directories used by the compiler.
    libdir = $(exec_prefix)/lib
    # Where to put the Info files.
    infodir = $(prefix)/info
    Если Ваша программа устанавливает большое количество файлов в один из стандартных каталогов, указанных пользователем, целесообразно сгруппировать их в один подкаталог, относящийся к этой программе. Если Вы делаете это, Вы должны создать такие подкаталоги в правиле для цели install.
    Не ожидайте от пользователя указания имени такого подкаталога в заданном им значении переменных, перечисленных выше. Наличие однообразного набора имен переменных для каталогов, в которые будет установлена программа, позволяет пользователю указать точно такие же значения для нескольких различных GNU-пакетов. Для того, чтобы это было полезным, все пакеты должны быть разработаны таким образом, чтобы они правильно использовали значения переменных.
    Вперед Назад Содержание
     
    Последнее редактирование: 24 сен 2025
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.111
    Назад Содержание

    15. Приложение. Комплексный пример Make-файла.

    В этом приложении приводится текст Make-файла для программы tar. Это сравнительно сложный Make-файл.
    Целью по умолчанию в этом Make-файле является 'all', поскольку это первая цель. Интересной особенностью этого Make-файла является то, что файл 'testpad.h' генерируется автоматически с помощью программы 'testpad', которая в свою очередь получается компиляцией файла 'testpad.c'.
    Если Вы наберете 'make' или 'make all', то make создаст исполнимый модуль 'tar', демон 'rmt', который предоставляет доступ к накопителям на магнитной ленте, расположенным на других машинах, и info-файл 'tar.info'.
    Если Вы наберете 'make install', то make не только создаст 'tar', 'rmt' и 'tar.info', но и установит их.
    Если Вы наберете 'make clean', то make удалит все '.o'-файлы, а так же файлы 'tar', 'rmt', 'testpad', testpad.h' и 'core'.
    Если Вы наберете 'make distclean', то make удалит не только файлы, которые удаляются при исполнении цели 'clean', но также и файлы 'TAGS', 'Makefile' и 'config.status'. (Хоть это и неочевидно, файлы 'Makefile' и 'config.status' генерируются пользователем с помощью программы 'configure', которая входит в состав поставки пакета 'tar', но не показана здесь.)
    Если Вы наберете 'make realclean', то make удалит файлы, удаляемые при исполнении цели 'distclean', и info-файлы, которые строятся из исходного файла 'tar.texinfo'.
    Наконец, цели 'shar' и 'dist' строят дистрибутив, используемый для распространения.
    Код (Text):
    1. # Generated automatically from Makefile.in by configure.  
    2. # Un*x Makefile for GNU tar program.  
    3. # Copyright (C) 1991 Free Software Foundation, Inc.  
    4. # This program is free software; you can redistribute  
    5. # it and/or modify it under the terms of the GNU  
    6. # General Public License ...  
    7.  . . .  
    8.   . . .  
    9.        
    10.       SHELL = /bin/sh  
    11.        
    12. #### Start of system configuration section. ####          
    13.       srcdir = .          
    14. # If you use gcc, you should either run the  
    15. # fixincludes script that comes with it or else use  
    16. # gcc with the -traditional option.  Otherwise ioctl  
    17. # calls will be compiled incorrectly on some systems.  
    18.       CC = gcc -O  
    19.       YACC = bison -y  
    20.       INSTALL = /usr/local/bin/install -c  
    21.       INSTALLDATA = /usr/local/bin/install -c -m 644          
    22. # Things you might add to DEFS:  
    23. # -DSTDC_HEADERS        If you have ANSI C headers and  
    24. #                       libraries.  
    25. # -DPOSIX               If you have POSIX.1 headers and  
    26. #                       libraries.  
    27. # -DBSD42               If you have sys/dir.h (unless  
    28. #                       you use -DPOSIX), sys/file.h,  
    29. #                       and st_blocks in `struct stat'.  
    30. # -DUSG                 If you have System V/ANSI C  
    31. #                       string and memory functions  
    32. #                       and headers, sys/sysmacros.h,  
    33. #                       fcntl.h, getcwd, no valloc,  
    34. #                       and ndir.h (unless  
    35. #                       you use -DDIRENT).  
    36. # -DNO_MEMORY_H         If USG or STDC_HEADERS but do not  
    37. #                       include memory.h.  
    38. # -DDIRENT              If USG and you have dirent.h  
    39. #                       instead of ndir.h.  
    40. # -DSIGTYPE=int         If your signal handlers  
    41. #                       return int, not void.  
    42. # -DNO_MTIO             If you lack sys/mtio.h  
    43. #                       (magtape ioctls).  
    44. # -DNO_REMOTE           If you do not have a remote shell  
    45. #                       or rexec.  
    46. # -DUSE_REXEC           To use rexec for remote tape  
    47. #                       operations instead of  
    48. #                       forking rsh or remsh.  
    49. # -DVPRINTF_MISSING     If you lack vprintf function  
    50. #                       (but have _doprnt).  
    51. # -DDOPRNT_MISSING      If you lack _doprnt function.  
    52. #                       Also need to define  
    53. #                       -DVPRINTF_MISSING.  
    54. # -DFTIME_MISSING       If you lack ftime system call.  
    55. # -DSTRSTR_MISSING      If you lack strstr function.  
    56. # -DVALLOC_MISSING      If you lack valloc function.  
    57. # -DMKDIR_MISSING       If you lack mkdir and  
    58. #                       rmdir system calls.  
    59. # -DRENAME_MISSING      If you lack rename system call.  
    60. # -DFTRUNCATE_MISSING   If you lack ftruncate  
    61. #                       system call.  
    62. # -DV7                  On Version 7 Unix (not  
    63. #                       tested in a long time).  
    64. # -DEMUL_OPEN3          If you lack a 3-argument version  
    65. #                       of open, and want to emulate it  
    66. #                       with system calls you do have.  
    67. # -DNO_OPEN3            If you lack the 3-argument open  
    68. #                       and want to disable the tar -k  
    69. #                       option instead of emulating open.  
    70. # -DXENIX               If you have sys/inode.h  
    71. #                       and need it 94 to be included.          
    72.       DEFS =  -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \  
    73.               -DVPRINTF_MISSING -DBSD42  
    74.       # Set this to rtapelib.o unless you defined NO_REMOTE,  
    75.       # in which case make it empty.  
    76.       RTAPELIB = rtapelib.o  
    77.       LIBS =  
    78.       DEF_AR_FILE = /dev/rmt8  
    79.       DEFBLOCKING = 20  
    80.        
    81.       CDEBUG = -g  
    82.       CFLAGS = $(CDEBUG) -I. -I$(srcdir) $(DEFS) \  
    83.               -DDEF_AR_FILE=\"$(DEF_AR_FILE)\" \  
    84.               -DDEFBLOCKING=$(DEFBLOCKING)  
    85.       LDFLAGS = -g  
    86.        
    87.       prefix = /usr/local  
    88.       # Prefix for each installed program,  
    89.       # normally empty or `g'.  
    90.       binprefix =  
    91.        
    92.       # The directory to install tar in.  
    93.       bindir = $(prefix)/bin  
    94.        
    95.       # The directory to install the info files in.  
    96.       infodir = $(prefix)/info  
    97.        
    98.       #### End of system configuration section. ####  
    99.        
    100.       SRC1 =  tar.c create.c extract.c buffer.c \  
    101.               getoldopt.c update.c gnu.c mangle.c  
    102.       SRC2 =  version.c list.c names.c diffarch.c \  
    103.               port.c wildmat.c getopt.c  
    104.       SRC3 =  getopt1.c regex.c getdate.y  
    105.       SRCS =  $(SRC1) $(SRC2) $(SRC3)  
    106.       OBJ1 =  tar.o create.o extract.o buffer.o \  
    107.               getoldopt.o update.o gnu.o mangle.o  
    108.       OBJ2 =  version.o list.o names.o diffarch.o \  
    109.               port.o wildmat.o getopt.o  
    110.       OBJ3 =  getopt1.o regex.o getdate.o $(RTAPELIB)  
    111.       OBJS =  $(OBJ1) $(OBJ2) $(OBJ3)  
    112.       AUX =   README COPYING ChangeLog Makefile.in  \  
    113.               makefile.pc configure configure.in \  
    114.               tar.texinfo tar.info* texinfo.tex \  
    115.               tar.h port.h open3.h getopt.h regex.h \  
    116.               rmt.h rmt.c rtapelib.c alloca.c \  
    117.               msd_dir.h msd_dir.c tcexparg.c \  
    118.               level-0 level-1 backup-specs testpad.c  
    119.        
    120.       all:    tar rmt tar.info  
    121.        
    122.       tar:    $(OBJS)  
    123.               $(CC) $(LDFLAGS) -o $@       $(OBJS) $(LIBS)  
    124.        
    125.       rmt:    rmt.c  
    126.               $(CC) $(CFLAGS) $(LDFLAGS) -o $@       rmt.c  
    127.        
    128.       tar.info: tar.texinfo  
    129.               makeinfo tar.texinfo  
    130.        
    131.       install: all  
    132.               $(INSTALL) tar $(bindir)/$(binprefix)tar  
    133.               -test ! -f rmt || $(INSTALL) rmt /etc/rmt  
    134.               $(INSTALLDATA) $(srcdir)/tar.info* $(infodir)  
    135.        
    136.       $(OBJS): tar.h port.h testpad.h  
    137.       regex.o buffer.o tar.o: regex.h  
    138.       # getdate.y has 8 shift/reduce conflicts.  
    139.        
    140.       testpad.h: testpad  
    141.               ./testpad  
    142.        
    143.       testpad: testpad.o  
    144.               $(CC) -o $@       testpad.o  
    145.        
    146.       TAGS:   $(SRCS)  
    147.               etags $(SRCS)  
    148.        
    149.       clean:  
    150.               rm -f *.o tar rmt testpad testpad.h core  
    151.        
    152.       distclean: clean  
    153.               rm -f TAGS Makefile config.status  
    154.        
    155.       realclean: distclean  
    156.               rm -f tar.info*  
    157.        
    158.       shar: $(SRCS) $(AUX)  
    159.               shar $(SRCS) $(AUX) | compress \  
    160.                 > tar-`sed -e '/version_string/!d' \  
    161.                            -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \  
    162.                            -e q  
    163.                            version.c`.shar.Z  
    164.        
    165.       dist: $(SRCS) $(AUX)  
    166.               echo tar-`sed \  
    167.                    -e '/version_string/!d' \  
    168.                    -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \  
    169.                    -e q  
    170.                    version.c` > .fname  
    171.               -rm -rf `cat .fname`  
    172.               mkdir `cat .fname`  
    173.               ln $(SRCS) $(AUX) `cat .fname`  
    174.               -rm -rf `cat .fname` .fname  
    175.               tar chZf `cat .fname`.tar.Z `cat .fname`  
    176.        
    177.       tar.zoo: $(SRCS) $(AUX)  
    178.               -rm -rf tmp.dir  
    179.               -mkdir tmp.dir  
    180.               -rm tar.zoo  
    181.               for X in $(SRCS) $(AUX) ; do \  
    182.                   echo $$X ; \  
    183.                   sed 's/$$/^M/' $$X \  
    184.                   > tmp.dir/$$X ; done  
    185.               cd tmp.dir ; zoo aM ../tar.zoo *  
    186.               -rm -rf tmp.dir

    Назад Содержание
     
    Последнее редактирование: 23 сен 2025