При преобразовании в libtool automake и autoconf не могут найти libtool - PullRequest
4 голосов
/ 02 июля 2010

Я пытаюсь преобразовать libcsv для использования libtool, чтобы я мог использовать его на Mac OS X, не искажая make-файл.Когда я пытаюсь запустить make-файл, сгенерированный из инструментов, я получаю следующую ошибку:

~/software/libcsv (gnu_tools) $ make 
tag=CC   --mode=compile gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\"
-DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"libcsv\" 
-DVERSION=\"3.0.1\" -I.     -g -O2 -MT libcsv.lo -MD -MP -MF .deps/libcsv.Tpo -c -o libcsv.lo  
libcsv.c
/bin/sh: --mode=compile: command not found
make: [libcsv.lo] Error 127 (ignored)
mv -f .deps/libcsv.Tpo .deps/libcsv.Plo
mv: rename .deps/libcsv.Tpo to .deps/libcsv.Plo: No such file or directory
make: *** [libcsv.lo] Error 1

Я использую OS X 10.5.Итак, после небольшого фокса по поводу того, что я заметил, что сгенерированный make-файл имеет пустую переменную libtool:

<generated makefile>
LD = 
LDFLAGS = 
LIBOBJS = 
LIBS = 
LIBTOOL = 
LIPO = 
LN_S = 
LTLIBOBJS = 
<more generated makefile>

Если я установлю LIBTOOL на libtool, то все будет хорошо.Я предполагаю, что допустил ошибку в своих файлах autoconf или automake, которые приведены ниже:

Makefile.am
lib_LTLIBRARIES = libcsv.la
libcsv_la_SOURCES = libcsv.c
include_HEADERS = csv.h
libcsv_la_LDFLAGS = -version-info 3:1:0
ACLOCAL_AMFLAGS = -I m4

configure.ac
dn1 Process this file with autoconf to produce a configure script.
AC_INIT(libcsv.c)
AM_INIT_AUTOMAKE(libcsv, 3.0.1)
AC_PROG_CC
AC_OUTPUT(Makefile)
AC_PROG_LIBTOOL
AC_CONFIG_MACRO_DIR([m4])
AC_CHECK_FUNCS([strerror])
AC_FUNC_MALLOC
C_PROG_RANLIB
AC_PROG_CXX
LT_INIT
LT_OUTPUT
AC_TYPE_SIZE_T

Если вам нужна помощь, это часть config.log:

## ------------------ ##
## Running config.lt. ##
## ------------------ ##
config.lt:680: creating libtool
configure:17115: checking for size_t
configure:17115: gcc -c -g -O2  conftest.c >&5
configure:17115: $? = 0
configure:17115: gcc -c -g -O2  conftest.c >&5
conftest.c: In function 'main':
conftest.c:62: error: syntax error before ')' token
configure:17115: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| #define PACKAGE "libcsv"
| #define VERSION "3.0.1"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_DLFCN_H 1
| #define LT_OBJDIR ".libs/"
| #define HAVE_STRERROR 1
| #define HAVE_STDLIB_H 1
| #define HAVE_MALLOC 1
| /* end confdefs.h.  */
| #include <stdio.h>
| #ifdef HAVE_SYS_TYPES_H
| # include <sys/types.h>
| #endif
| #ifdef HAVE_SYS_STAT_H
| # include <sys/stat.h>
| #endif
| #ifdef STDC_HEADERS
| # include <stdlib.h>
| # include <stddef.h>
| #else
| # ifdef HAVE_STDLIB_H
| #  include <stdlib.h>
| # endif
| #endif
| #ifdef HAVE_STRING_H
| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
| #  include <memory.h>
| # endif
| # include <string.h>
| #endif
| #ifdef HAVE_STRINGS_H
| # include <strings.h>
| #endif
| #ifdef HAVE_INTTYPES_H
| # include <inttypes.h>
| #endif
| #ifdef HAVE_STDINT_H
| # include <stdint.h>
| #endif
| #ifdef HAVE_UNISTD_H
| # include <unistd.h>
| #endif
| int
| main ()
| {
| if (sizeof ((size_t)))
|       return 0;
|   ;
|   return 0;
| }
configure:17115: result: yes

ИтакКто-нибудь знает, что я сделал не так?

Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 13 июля 2010

У меня нет определенного ответа для вас, но первое, что я бы посоветовал, это поставить ваш AC_OUTPUT в конце вашего configure.ac, после LT_INIT.Это не полностью это так просто, но не так уж и неправильно думать, что содержимое configure.ac расширяется по очереди до фрагментов сценария оболочки, которые выполняются по очереди.Если вы отправите сконфигурированный Makefile до того, как обнаружите libtool, то это может объяснить, что LIBTOOL пуст.

Довольно обычный макет вашего configure.ac будет следующим:

dnl Process this file with autoconf to produce a configure script.
AC_INIT(libcsv.c)
AM_INIT_AUTOMAKE(libcsv, 3.0.1)
AC_CONFIG_MACRO_DIR([m4])

dnl find programs
AC_PROG_CC
AC_PROG_CXX
LT_INIT
AC_PROG_RANLIB

dnl check functionality
AC_CHECK_FUNCS([strerror])
AC_FUNC_MALLOC
AC_TYPE_SIZE_T

AC_OUTPUT(Makefile)

Я не думаю, что вам нужно LT_OUTPUT, и документы отмечают, что AC_PROG_LIBTOOL является устаревшим синонимом LT_INIT (поэтому наличие обоих, вероятно, вызывает проблемы).

(Кстати, ничего особенного, обратите внимание, что в OS X есть команда под названием libtool, которая не имеет ничего общего с GNU Libtool. Я почти уверен, что это не ваша проблема, но дело в том, чтосмущенные люди раньше)

1 голос
/ 07 июля 2010

Вы можете попытаться усилить интеграцию с libtool, запустив libtoolize --force (у меня было много проблем с разными несовместимыми версиями libtool на разных хостах, libtoolize --force очень помогает в таких случаях).Также обратите внимание на вывод конфигурации для сообщений libtool, они должны выглядеть следующим образом:

checking if libtool supports shared libraries... yes
configure: creating libtool
appending configuration tag "CXX" to libtool
appending configuration tag "F77" to libtool

особенно строка configure: creating libtool должна присутствовать в выводе.

0 голосов
/ 12 июля 2010

Мой файл configure.ac содержит:

LT_INIT([dlopen])
AC_SUBST([LIBTOOL_DEPS])

LT_OUTPUT предназначен для использования libtool для последующих тестов в самой конфигурации, и для его настройки требуется config.lt. Мне никогда не приходилось им пользоваться, поэтому я не знаю всего, что влечет за собой, но это не помешает, если взять эту строку и посмотреть, решит ли это вашу проблему.

...