[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
FreeBSD link failures on lutil_getopt (ITS#2094)
Full_Name: Brian Candler
Version: 2.0.26
OS: FreeBSD-4.6.2-RELEASE
URL: ftp://ftp.openldap.org/incoming/brian-candler-020920.patch
Submission from: (NULL) (212.139.129.125)
Compilation of 2.0.26 under FreeBSD-4.6.2 and FreeBSD-4.4 fails as follows:
cc -g -O2 -I../../include -I../../include -c test.c
/bin/sh /u/home/brian/build/openldap-2.0.26/libtool --mode=link cc -g -O2
-I../../include -I../../include
-L/u/home/brian/build/openldap-2.0.26/libraries -o ltest test.o -lldap -llber
-llutil -lssl -lcrypto -lssl -lcrypto
cc -g -O2 -I../../include -I../../include
-L/u/home/brian/build/openldap-2.0.26/libraries -o ltest test.o -lldap -llber
-llutil -lssl -lcrypto -lssl -lcrypto
test.o: In function `main':
/u/home/brian/build/openldap-2.0.26/libraries/libldap/test.c(.text+0x549):
undefined reference to `lutil_optarg'
/u/home/brian/build/openldap-2.0.26/libraries/libldap/test.c(.text+0x55e):
undefined reference to `lutil_optarg'
/u/home/brian/build/openldap-2.0.26/libraries/libldap/test.c(.text+0x565):
undefined reference to `lutil_optarg'
/u/home/brian/build/openldap-2.0.26/libraries/libldap/test.c(.text+0x575):
undefined reference to `lutil_optarg'
/u/home/brian/build/openldap-2.0.26/libraries/libldap/test.c(.text+0x591):
undefined reference to `lutil_optarg'
/u/home/brian/build/openldap-2.0.26/libraries/libldap/test.c(.text+0x5b6):
undefined reference to `lutil_getopt'
/u/home/brian/build/openldap-2.0.26/libraries/libldap/test.c(.text+0x5d0):
undefined reference to `lutil_optind'
/u/home/brian/build/openldap-2.0.26/libraries/libldap/test.c(.text+0x5e1):
undefined reference to `lutil_optind'
/u/home/brian/build/openldap-2.0.26/libraries/libldap/test.c(.text+0x5eb):
undefined reference to `lutil_optind'
*** Error code 1
The problem appears to be autoconf related. On my system:
include/portable.h:/* #undef HAVE_GETOPT_H */
which means it will use getopt-compat.h. However in libraries/liblutil/Makefile
getopt.o is not included in OBJS:
SRCS = base64.c debug.c entropy.c sasl.c signal.c \
md5.c passwd.c sha1.c getpass.c lockf.c utils.c sockpair.c \
getopt.c $(UNIX_SRCS)
OBJS = base64.o debug.o entropy.o sasl.o signal.o \
md5.o passwd.o sha1.o getpass.o lockf.o utils.o sockpair.o \
$(UNIX_OBJS)
Hence liblutil doesn't include this object file, and thus the link failure.
The following patch appears to fix it:
--- openldap-2.0.26/configure.in.orig Fri Sep 20 16:47:58 2002
+++ openldap-2.0.26/configure.in Fri Sep 20 16:48:11 2002
@@ -2110,6 +2110,7 @@
if test "$ac_cv_func_getopt" != yes; then
LIBSRCS="$LIBSRCS getopt.c"
+ LIBOBJS="$LIBOBJS getopt.o"
fi
dnl ----------------------------------------------------------------
However the build then fails at a later point:
cc -g -O2 -I../../include -I../../include -c slapd-tester.c
/bin/sh /u/home/brian/build/openldap-2.0.26/libtool --mode=link cc -g -O2
-I../../include -I../../include
-L/u/home/brian/build/openldap-2.0.26/libraries -o slapd-tester slapd-tester.o
-lldap -llber -lssl -lcrypto -lcrypt
mkdir .libs
cc -g -O2 -I../../include -I../../include
-L/u/home/brian/build/openldap-2.0.26/libraries -o slapd-tester slapd-tester.o
-lldap -llber -lssl -lcrypto -lcrypt
slapd-tester.o: In function `main':
/u/home/brian/build/openldap-2.0.26/tests/progs/slapd-tester.c(.text+0x139):
undefined reference to `lutil_optarg'
/u/home/brian/build/openldap-2.0.26/tests/progs/slapd-tester.c(.text+0x155):
undefined reference to `lutil_optarg'
/u/home/brian/build/openldap-2.0.26/tests/progs/slapd-tester.c(.text+0x171):
undefined reference to `lutil_optarg'
/u/home/brian/build/openldap-2.0.26/tests/progs/slapd-tester.c(.text+0x18d):
undefined reference to `lutil_optarg'
/u/home/brian/build/openldap-2.0.26/tests/progs/slapd-tester.c(.text+0x1a9):
undefined reference to `lutil_optarg'
slapd-tester.o(.text+0x1c1):/u/home/brian/build/openldap-2.0.26/tests/progs/slapd-tester.c:
more undefined references to `lutil_optarg' follow
slapd-tester.o: In function `main':
/u/home/brian/build/openldap-2.0.26/tests/progs/slapd-tester.c(.text+0x233):
undefined reference to `lutil_getopt'
*** Error code 1
This time because it forgot to link against -llutil. Second patch:
--- openldap-2.0.26/tests/progs/Makefile.in.orig Fri Jan 4 20:38:37
2002
+++ openldap-2.0.26/tests/progs/Makefile.in Fri Sep 20 17:12:32 2002
@@ -12,7 +12,7 @@
LDAP_INCDIR= ../../include
LDAP_LIBDIR= ../../libraries
-XLIBS = -lldap -llber
+XLIBS = -lldap -llber -llutil
XXLIBS = $(SECURITY_LIBS) $(LUTIL_LIBS)
# build-tools: FORCE
and this time it does appear to compile and link properly.
However, the other issue is that FreeBSD has getopt so why wasn't it
detected and used?
configure:4525: checking for getopt.h
configure:4535: cc -E conftest.c >/dev/null 2>conftest.out
configure:4531: getopt.h: No such file or directory
configure: failed program was:
#line 4530 "configure"
#include "confdefs.h"
#include <getopt.h>
Ah. The reason is that FreeBSD does not have a getopt.h header, it is declared
in unistd.h instead (the getopt function is in libc). Actually I also have the
libgnugetopt port installed, which _does_ have a getopt.h, but it is in
/usr/local/include and is also not detected.
Fixing this properly is beyond my level of autoconf experience...
Regards,
Brian Candler.