I'm trying to convert libcsv to use libtool so I can use it on mac os x without mangling the makefile. When I try to run the makefile generated from the tools I get the following error:
~/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
I'm running OS X 10.5. So after a little fossicking about I noticed that the makefile generated has an empty libtool var:
<generated makefile>
LD =
LDFLAGS =
LIBOBJS =
LIBS =
LIBTOOL =
LIPO =
LN_S =
LTLIBOBJS 开发者_开发百科=
<more generated makefile>
If I set LIBTOOL to libtool, then all is well. I assume I've made a mistake in my autoconf or automake files which are below:
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
If it's any help here is part of the 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
So does anyone know what I've done wrong?
Thanks in advance.
I dont have a definite answer for you, but the first thing I'd suggst is to put your AC_OUTPUT
at the end of your configure.ac
, after the LT_INIT
. It's not completely this simple, but it's not far wrong to think of the contents of configure.ac
as expanding in turn to fragments of shell script that are executed in turn. If you emit the configured Makefile
before you've found libtool
, then that could explain LIBTOOL
being empty.
A fairly conventional layout of your configure.ac
would be the following:
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)
I don't think you needed LT_OUTPUT
, and the docs note that AC_PROG_LIBTOOL
is a deprecated synonym for LT_INIT
(so having both is probably asking for trouble).
(Apropos of nothing very much, note that OS X has a command called libtool
, which is nothing to do with GNU Libtool. I'm pretty sure that's not your problem here, but it's a gotcha that's confused people before)
You can try to re-enforce the libtool integration by running libtoolize --force
(I had a lot of trouble with different incomatible libtool versions on different hosts, libtoolize --force helps a lot in such cases). Also watch out the configure output for libtool messages, they must read like this:
checking if libtool supports shared libraries... yes
configure: creating libtool
appending configuration tag "CXX" to libtool
appending configuration tag "F77" to libtool
especially the configure: creating libtool
line must be present in the output.
My configure.ac just has:
LT_INIT([dlopen])
AC_SUBST([LIBTOOL_DEPS])
The LT_OUTPUT is for using libtool for later tests within configure itself, and requires a config.lt to set things up. I've never had to use it, so I don't know all that entails, but it can't hurt to take that line out and see if that fixes your issue.
精彩评论