LINUX.ORG.RU

проблема с autotools


0

0

пытаюсь написать autotools-скрипты для готового дерева исходников на С++. собственно дерево такое:

root
    |
    +-src
         |
         +-search_retriever
         +-parser
         +-много других

в root находятся скрипты: Makefile.am, configure.ac. в src - Makefile.ac, далее в каждой папке ниже по Makefile.am и configure.ac configure.ac из корневой папки имеет следующий вид:
AC_PREREQ([2.64])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE
AC_PROG_MAKE_SET
AC_CONFIG_SRCDIR([include/index_builder/DealerList.h])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for header files.
AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h memory.h netinet/in.h stdint.h stdlib.h string.h strings.h sys/param.h sys/socket.h syslog.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T

# Checks for library functions.
AC_FUNC_ERROR_AT_LINE
AC_FUNC_FORK
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_CHECK_FUNCS([atexit inet_ntoa memmove memset setlocale socket strcasecmp strchr strerror strncasecmp strrchr])

AC_CONFIG_FILES([Makefile
		 src/Makefile])

AC_CONFIG_SUBDIRS([src/search_retriever
		   src/parser])
AC_OUTPUT

корневой Makefile.am:
SUBDIRS = src

Makefile.am из папки src:
SUBDIRS = search_retriever parser

configure.ac в каждой из вложенных в src папок примерно следующего вида:
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.64])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE
AC_PROG_MAKE_SET
AC_CONFIG_SRCDIR([ConfigParser.cpp])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.
# FIXME: Replace `main' with a function in `-lboost_regex':
AC_CHECK_LIB([boost_regex], [main])
# FIXME: Replace `main' with a function in `-lmysqlclient_r':
AC_CHECK_LIB([mysqlclient_r], [main])
# FIXME: Replace `main' with a function in `-lpcrecpp':
AC_CHECK_LIB([pcrecpp], [main])
# FIXME: Replace `main' with a function in `-lpthread':
AC_CHECK_LIB([pthread], [main])

# Checks for header files.
AC_CHECK_HEADERS([arpa/inet.h netinet/in.h stdint.h stdlib.h string.h strings.h sys/param.h sys/socket.h syslog.h unistd.h])

# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_INLINE
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T

# Checks for library functions.
AC_FUNC_ERROR_AT_LINE
AC_FUNC_FORK
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_CHECK_FUNCS([atexit inet_ntoa memmove memset setlocale socket strcasecmp strerror strncasecmp strrchr])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT

и Makefile.am очень прост для них:
INCLUDES = -I../../include/search_retriever -I../../include/common -I$(includedir)

AUTOMAKE_OPTIONS = foreign

bin_PROGRAMS = search_retriever

search_retriever_SOURCES = main.cpp ConfigParser.cpp LogFile.cpp SearcherDaemon.cpp libstemmer_utf8.cpp stem_UTF_8_english.cpp \
		Distribution.cpp QueryMatcher.cpp api.cpp stem_UTF_8_russian.cpp utilities.cpp ../common/common.cpp

вобщем проблема в следующем: у меня собирается все отлично, решил залить файло в свн, закоммитил файлы configure.ac (на всякий случай), configure.in, config.h, config.h.in, Makefile.am (так же на всякий случай), Makefile.in из каждой папки. делаю чекаут куда-нибудь, запускаю ./configure из корня, все проходит, запускаю make, он еще раз запускает зачем-то configure в какой-то из папок, начинает один из компонент компилировать (те, что в папке src лежат) - модули собирает нормально, а как дело доходит до линковки - облом. не подключает либы, хотя так русским по белому написано AC_CHECK_LIB. причем в версии не из свна все линкуется замечательно. проблема нумер два, которая мне уже весь мозг съела: при запуске make'а руками в какой-то из директорий компонент make зацикливается, скотина. причем diff'ами смотрел разницу с теми скриптами, которые работают - абсолютно никакой разницы. вывод примерно следующий:
make[4]: Leaving directory `/home/milo/workspace/make_test/src/parser'
make[3]: Leaving directory `/home/milo/workspace/make_test/src/parser'
Making all in crawler_master
make[3]: Entering directory `/home/milo/workspace/make_test/src/crawler_master'
make[4]: Entering directory `/home/milo/workspace/make_test/src/crawler_master'
make[5]: Entering directory `/home/milo/workspace/make_test/src/crawler_master'
....
^Cmake[91]: *** [Makefile.in] Прерывание
make[90]: *** [Makefile.in] Прерывание
make[89]: *** [Makefile.in] Прерывание
make[88]: *** [Makefile.in] Прерывание
make[87]: *** [Makefile.in] Прерывание

очень надеюсь на вашу помощь....


Во-первых, про либы:
AC_CHECK_LIB([boost_regex], [main])
Там же русским языком написано, main надо заменить на функцию из библиотеки.

А во-вторых и в главных, если у вас не будут собираться библиотеки из поддиректорий как самостоятельные проекты, то я бы не делал для них configure - слишком много гемора. Если хочется добавить проверки для каждой библиотеки, то сделайте что-то вроде:
m4_include(src/mylib/check.ac),
а в check.ac запишите конкретные проверки.

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

поддиректории могут собираться как самостоятельные проекты, поэтому для них отдельные configure-скрипты.

AC_CHECK_LIB([boost_regex], [main])
работает отлично. сейчас проблема с зацикливанием меня мучает...

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

configure.in у меня нету файла, в документации о нем говорят как об устарешвем. с зацикливанием проблему вроде как решил: в каждой поддиректории сделал

autoreconf && automake
закоммитил, и все начало восстанавливать в чекаутнутых папках. не могу понять почему так?

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

*все начало собираться в чекаутных папках. заговорился

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

ну вот cmake посмотрел, но переписывать на него все не вариант... только со следующих проектов.

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

к сожалению, cmake не генерирует configure-скрипт, который уж больно нужен...

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