LINUX.ORG.RU

autoconf + automake


0

0

Есть приложения, использующие tcl/tk >=8.3
Файлы библиотек имеют имена libtcl8.3.so, libtcl8.4.so и.т.п.
То есть для разных версий надо ставить разные ключи линкеру, т.е.
-ltcl8.3 or -ltcl8.4 or что-то ещё.

А как бы мне проверить какой tcl есть и что он работает и результат получить в переменную, чтоб потом тем частям проекта, которым оно нужно добавить нужный ключик?

anonymous

Возьми irc bot eggdrop - у него есть очень детальный configure на определение правильной версии Tcl. Причем, ето где-то 5К текста, т.е. не совсем тривиальная вещь.

BaT ★★★★★
()

Зачем такие сложности? Можно свой configure.in набросать за 5 минут.

Во первых на активную версию всегда указывает соотв. симлинк с расширением so. Так что достаточно будет -ltcl. Кроме того должен быть соотв. файл с расширением la. В нем все имена библиотеки, и ее депенденсы. Они поднимаются когда динамический линкер грузит ентую библиотеку, а также используются при компиляции.

Во вторых есть в /usr/lib скрипт tclConfig.sh в котором версия и все остальное.

Во третьих configure.in может выглядеть так:

AC_DEFUN(AC_CHECK_VERSION, [ prog="$1" version1="$2" version2="$3"

ver1=`echo $version1 | sed 's/\..*//'` mini_ver1=`echo $version1 | sed 's/.\.//' | sed -e 's/\..*//'` micro_ver1=`echo $version1 | sed 's/.*\.//'`

ver2=`echo $version2 | sed 's/\..*//'` mini_ver2=`echo $version2 | sed 's/.\.//' | sed -e 's/\..*//'` micro_ver2=`echo $version2 | sed 's/.*\.//'`

AC_MSG_CHECKING($prog >= $version2) if test "$ver1" -lt "$ver2" -o "$mini_ver1" -lt "$mini_ver2" -o "$micro_ver1" -lt "$micro_ver2"; then AC_MSG_RESULT(no) AC_MSG_ERROR($prog >= $version2 is not installed) fi AC_MSG_RESULT(yes) ])

if [ -f /usr/lib/tclConfig.sh ]; then . /usr/lib/tclConfig.sh else AC_MSG_ERROR(Can't find /usr/lib/tclConfig.sh) fi

AC_CHECK_VERSION(TCL, $TCL_VERSION, 8.3)

Этот макрос проверяет, что установленый tcl больше или равно версии 8.3

Banshee
()

Banshee, ты ведь согласишься, что это хак?

Да, так можно сделать, и оно зачастую будет работать.

А вот у меня, TCL, к примеру в /usr/local/lib и /usr/contrib/lib. Что на это данный скрипт скажет?

В общем, если нужен надежный результат, строчек будет много..

BaT ★★★★★
()

Хорошо. Я немного смухлевал (поленился написать). На самом деле конечно все конфиги ищутся в зависимости от --prefix в configure. То есть если ты все что компилишь сам (например tcl) кладешь в /usr/local, то нужно и configure --prefix=/usr/local. тогда все найдется.

Это не хак а стандартный подход. Можешь проверить, например gtk или все остальные либы. Они поступают исключительно так.

А что, ты предлагаешь проверять все правдоподобные места где может быть установлен tcl? Лучше вопользоваться скриптом, который поставляют разработчики.

Например gtk-config, glib-config, gdk-pixbuf-config, xml-config, gnome-config, nessus-config. Этот список можно продолжать :)) В этих скриптах реальные пути к установленым либам и куча другого полезного. Вот лежать они должны правда в где-то куда указывает PATH, а не так как у tcl.

Кроме того, заметь, что я описал подход позволяющий проверить все что связано c tcl. если речь идет только об том чтобы слинковать прожку с коректной либой, то можно так

AC_CHECK_LIB(tcl, TclInitNotifier, TCL_LIBS="-ltcl", AC_ERROR(Can't find tcl library))

AC_SUBST(TCL_LIBS)

Banshee
()

Banshee:
Thx.
Да не всегда есть этот симлинк :(
Поначалу так и было (-ltcl)
По крайней мере tcl8.3.3 and tcl 8.4.a3 не создают его при установке из
сырцов.

Bat:
Txs. Да, нетривиально :)

IMHO Лучше всего - действительно поискать скрипт tclConfig.sh, а если не
найдет - сделать соответствующий AC_ARG_WITH и пусть пользователь руками
путь к нему вводит.

anonymous
()

Banshee, gtk-config, glib-config, gdk-pixbuf-config, xml-config, gnome-config - vse, v toi ili inoi stepeni soderzhat moi patchi :>

Tak 4to, ne po addresu :)

BaT ★★★★★
()

Ну что тебе сказать мужик :)) молодец. Тем более ты это знаешь, так с чем же ты не согласен?

P.S. Что я не понял чем тебя задел.

Banshee
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.