views:

257

answers:

3

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.

+1  A: 

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.

Rudi
Hi Rudi,Thanks for responding. I re-ran libtoolize --force and observed the following in the output:checking how to hardcode library paths into programs... immediateconfigure: creating ./config.ltconfig.lt: creating libtoolchecking for size_t... yesSame response in the make step though so that hasn't fixed it I'm afraid.
robertpostill
You can run the configure script with more verbose output by executing `sh -x configure`, and search the output for `LIBTOOL=`. Also look for `LIBTOOL=` lines in configure(there should be a `# Always use our own libtool.` line above). BTW: with which version of autoconf was the configure script created(configure --help)? Maybe the regeneration of the build system with newer autoconf+aclocal+automake+libtool tools might help (make a backup first, this step can seriously screw up things).
Rudi
Rudi,Sorry for the delay I hadn't checked to see comments come in. Anyway, ./configure --version returns:$ ./configure --versionconfiguregenerated by GNU Autoconf 2.65Copyright (C) 2009 Free Software Foundation, Inc.This configure script is free software; the Free Software Foundationgives unlimited permission to copy, distribute and modify it.
robertpostill
Also searching for LIBTOOL in configure gets me:grep LIBTOOL configureLIBTOOLLIBTOOL_DEPS="$ltmain"LIBTOOL='$(SHELL) $(top_builddir)/libtool'# ### BEGIN LIBTOOL CONFIG# ### END LIBTOOL CONFIG# ### BEGIN LIBTOOL TAG CONFIG: CXX# ### END LIBTOOL TAG CONFIG: CXX
robertpostill
A: 

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.

Karl Bielefeldt
+2  A: 

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
C_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)

Norman Gray
Norman, thanks so much for that. Moving AC_OUTPUT to the end of the file and then removing AC_PROG_LIBTOOL did the trick.
robertpostill