Большинство этих переменных имеют значения, основанные на префиксе или exec_prefix. Предполагается, что выходные переменные каталога сохраняют их нерасширенными: обычно «@ datarootdir @» заменяется на «$ {prefix} / share», а не «/ usr / local / share», а «@ datadir @» заменяется на « $ {datarootdir} '.
Это поведение предписано стандартами кодирования GNU, поэтому, когда пользователь запускает:
' make '
, он все еще может указать другой префикс от указанного для настройки; в этом случае при необходимости пакет должен жестко кодировать зависимости, соответствующие префиксу, указанному в make.
'make install'
она может указать другой место установки, в этом случае пакет должен по-прежнему зависеть от места, в котором он был скомпилирован (т. е. никогда не перекомпилироваться при запуске 'make install'). Это чрезвычайно важная функция, так как многие люди могут решить установить все файлы пакета, сгруппированные вместе, а затем установить туда ссылки из конечных местоположений.
Для поддержки этих функций важно, чтобы datarootdir оставался определенным как '$ {prefix} / share', чтобы его значение можно было расширить на основе текущего значения префикса.
Следствие заключается в том, что вы не должны использовать эти переменные, кроме как в make-файлах. Например, вместо того, чтобы пытаться оценить datadir в configure и жестко кодировать его в make-файлах, используя, например, 'AC_DEFINE_UNQUOTED ([DATADIR], ["$ datadir"], [Data directory.])', Вы должны добавить -DDATADIR = ' $ (datadir) 'к определению CPPFLAGS в вашем make-файле (AM_CPPFLAGS, если вы также используете Automake).
Аналогично, вам не следует полагаться на AC_CONFIG_FILES для замены bindir и друзей в сценариях оболочки и других файлах ; вместо этого пусть заставляют управлять их заменой. Например, Autoconf отправляет шаблоны своих сценариев оболочки, заканчивающиеся на «.in», и использует фрагмент make-файла, подобный следующему, для создания сценариев, таких как autoheader и autom4te:
edit = sed \
-e 's|@bindir[@]|$(bindir)|g' \
-e 's|@pkgdatadir[@]|$(pkgdatadir)|g' \
-e 's|@prefix[@]|$(prefix)|g'
autoheader autom4te: Makefile
rm -f $@ $@.tmp
srcdir=''; \
test -f ./$@.in || srcdir=$(srcdir)/; \
$(edit) $${srcdir}$@.in >$@.tmp
chmod +x $@.tmp
chmod a-w $@.tmp
mv $@.tmp $@
autoheader: $(srcdir)/autoheader.in
autom4te: $(srcdir)/autom4te.in