LINUX.ORG.RU

Ссылка на дириектории производные от $(prefix)

 , , ,


0

1

Привет.
Я читал всякие рукаводства, но так и не понял. Вот например у нас Makefile:

prefix ::= /usr/local
exec_prefix ::= $(prefix)
bindir ::= $(exec_prefix)/bin
datarootdir ::= $(prefix)/share
datadir ::= $(datarootdir)

install:
        ${INSTALL_PROGRAM} -t ${DESTDIR}${bindir} binf
        ${INSTALL_DATA} -t ${DESTDIR}${datadir} datad
Как теперь binf должен ссылаться на datad в программе? в скрипте?
Правильно ли я понимаю, что для скипта ссылка будет выглядеть примерно так:
"$(printf "$0" | sed 's|\(/.*/\).*|\1|')../share/datad"
# т.е. парсим positional parametr $0
а в программе парсим argv[0]?
Допустим так, тогда какой толк задать при установке:
make datadir=any_path/.... install
тогда скрипт/программа не найдёт данные.

★★
Ответ на: комментарий от Harald

Т.е. даже не относительные ссылки (ссылка относительно исполняемого файла)? Ну тогда даже make prefix=~/temp install сломает программу. Из gnu coding standard:

Installers are expected to override these values when calling make (e.g., make prefix=/usr install) or configure (e.g., configure --prefix=/usr). GNU packages should not try to guess which value should be appropriate for these variables on the system they are being installed onto: use the default settings specified here so that all GNU packages behave identically, allowing the installer to achieve any desired layout.

Т.е. ссылка должна быть относительной, не так ли? Но повторю, тогда я не понимаю как это требование совместить с возможностью задать отдельно datadir куда-нибудь в ~/temp, например (не проблема установить, а проблема искать из программы).

Например, по-умолчанию мы ищем данные (внутри бинарника) в ../share/prg/, как извещать программу о том, что была задана datadir? Интересует именно правильная реализация на практике.

pavlick ★★
() автор топика
Ответ на: комментарий от pavlick

Т.е. ссылка должна быть относительной, не так ли?

Я так не думаю. Программа должна использовать значения, заданные при конфигурировании, а не при установке. При установке их можно менять скорее для того, чтобы поставить внутрь какого-нибудь chroot, например, или когда отдельные каталоги примонтированы по особым путям. В GNU helloworld так, наверное, и делается, можно глянуть.

xaizek ★★★★★
()
Ответ на: комментарий от pavlick
-datadir ::= $(datarootdir)
+datadir ::= $(datarootdir)/mybinf
CPPFLAGS = -DDATADIR="\"${datadir}\""

Всё. Я на понял зафига тебе нужны какие-то относительные ссылки и что значит «задать отдельно datadir куда-нибудь в ~/temp».

slovazap ★★★★★
()
Ответ на: комментарий от xaizek

Повртел gnu hello, там после конфигурирования в недрах создаётся файл с содержимиы:

#define PREFIX "/usr/local"
#define EXEC_PREFIX "/usr/local"
#define BINDIR "/usr/local/bin"
#define SBINDIR "/usr/local/sbin"
#define LIBEXECDIR "/usr/local/libexec"
#define DATAROOTDIR "/usr/local/share"
#define DATADIR "/usr/local/share"
#define SYSCONFDIR "/usr/local/etc"
#define SHAREDSTATEDIR "/usr/local/com"
#define LOCALSTATEDIR "/usr/local/var"
#define INCLUDEDIR "/usr/local/include"
#define OLDINCLUDEDIR "/usr/include"
#define DOCDIR "/usr/local/share/doc/hello"
#define INFODIR "/usr/local/share/info"
#define HTMLDIR "/usr/local/share/doc/hello"
#define DVIDIR "/usr/local/share/doc/hello"
#define PDFDIR "/usr/local/share/doc/hello"
#define PSDIR "/usr/local/share/doc/hello"
#define LIBDIR "/usr/local/lib"
#define LISPDIR "/usr/local/share/emacs/site-lisp"
#define LOCALEDIR "/usr/local/share/locale"
#define MANDIR "/usr/local/share/man"
#define PKGDATADIR "/usr/local/share/hello"
#define PKGINCLUDEDIR "/usr/local/include/hello"
#define PKGLIBDIR "/usr/local/lib/hello"
#define PKGLIBEXECDIR "/usr/local/libexec/hello"
Похоже, что я ошибался. ЗЫ: пока помолчу, надо переварить подумать. Благодарю за ответы.

pavlick ★★
() автор топика
Последнее исправление: pavlick (всего исправлений: 1)

В то же время, из документации по autoconf:

20.5 How Do I #define Installation Directories?

...

* Note that all the previous solutions hard wire the absolute name of these directories in the executables, which is not a good property. You may try to compute the names relative to prefix, and try to find prefix at runtime, this way your package is relocatable.

Выходит, что всё же лучше пользоваться относительными ссылками и парсить в argv[0] во время исполнения. Плюсы понятны, но я всего лишь ищу стандртный, рекомендуемый способ ссылаться на все производные от prefix. В эталонном примере задают пути жестко, в доках Autoconf говорят иначе, х.з. как правильно.

pavlick ★★
() автор топика
Последнее исправление: pavlick (всего исправлений: 1)

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

builddir ::= ./build
make_config ::= ${builddir}/makefile_config
override CPPFLAGS += -I ${builddir}
target ::= main

${builddir}/${target}: ${objects} | ${make_config}
${objects}: ${make_config}
${make_config}:
	@printf '#define PREFIX "${prefix}"\n#define EXEC_PREFIX "${exec_prefix}"\n'\
	'#define BINDIR "${bindir}"\n#define SBINDIR "${sbindir}"\n'\
	'#define LIBEXECDIR "${libexecdir}"\n#define DATAROOTDIR "${datarootdir}"\n'\
	'#define DATADIR "${datadir}"\n#define SYSCONFDIR "${sysconfdir}"\n'\
	'#define SHAREDSTATEDIR "${sharedstatedir}"\n#define LOCALSTATEDIR "${localstatedir}"\n'\
	'#define RUNSTATEDIR "${runstatedir}"\n#define INCLUDEDIR "${includedir}"\n'\
	'#define LIBDIR "${libdir}"\n#define INFODIR "${infodir}"\n' > ${make_config}

pavlick ★★
() автор топика
Последнее исправление: pavlick (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.