Обсуждение: Off-topic: autoconf guru
Is there any autoconf guru? I have lots problems Autoconf + C++ library. if I make CC=CXX, configure can't find libpq,AC_CHECK_LIB(pq, PQexec) because it try link PQexec() - and it is missing if I keep CC as cc AC_TRY_COMPILE([#include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> ], [int a = accept(1, (struct sockaddr *) 0, (int *) 0);], [AC_DEFINE(SOCKET_SIZE_TYPE, int) AC_MSG_RESULT(int)], [AC_DEFINE(SOCKET_SIZE_TYPE, size_t) AC_MSG_RESULT(size_t)]) return wrong result because int always aceptable for C but can cause error for CXX Is there autoconf version modified for work with C++ or I have to patch it's macros by my self ? --- Dmitry Samersoff, dms@wplus.net, ICQ:3161705 http://devnull.wplus.net * There will come soft rains ...
If you check configure.in with PostgreSQL, we use the --with-libs call in order to tell it where to look for 'libraries outside the system norm'...check the code for that, as I believe its what you are looking for, since, in general, the libpq would be outside that 'norm'.. On Thu, 29 Jul 1999, Dmitry Samersoff wrote: > Is there any autoconf guru? > > I have lots problems Autoconf + C++ library. > > if I make CC=CXX, configure can't find libpq, > AC_CHECK_LIB(pq, PQexec) > > because it try link PQexec() - and it is missing > > if I keep CC as cc > AC_TRY_COMPILE([#include <stdlib.h> > #include <sys/types.h> > #include <sys/socket.h> > ], > [int a = accept(1, (struct sockaddr *) 0, (int *) 0);], > [AC_DEFINE(SOCKET_SIZE_TYPE, int) AC_MSG_RESULT(int)], > [AC_DEFINE(SOCKET_SIZE_TYPE, size_t) AC_MSG_RESULT(size_t)]) > > return wrong result because int always aceptable for C but > can cause error for CXX > > Is there autoconf version modified for work with C++ or > I have to patch it's macros by my self ? > > > --- > Dmitry Samersoff, dms@wplus.net, ICQ:3161705 > http://devnull.wplus.net > * There will come soft rains ... > Marc G. Fournier ICQ#7615664 IRC Nick: Scrappy Systems Administrator @ hub.org primary: scrappy@hub.org secondary: scrappy@{freebsd|postgresql}.org
On 29-Jul-99 The Hermit Hacker wrote: > > If you check configure.in with PostgreSQL, we use the --with-libs call in > order to tell it where to look for 'libraries outside the system > norm'...check the code for that, as I believe its what you are looking > for, since, in general, the libpq would be outside that 'norm'.. Thanks, but I mention some other problem - sequence CC=g++AC_CHECK_LIB(pq, PQexec) is espanded by autoconf into ... main(){ PQexec(); } ... that can't be compiled by g++, instead ... main(){ PGconn *conn; const char *query; PQexec(conn,query); } is there a way to correct this problem or I need to rewrite autoconf macros? configure:2672: checking for PQexec in -lpq configure:2691: g++ -o conftest -g -O2 conftest.c -lpq -L/usr/local/pgsql/lib 1>&5 configure:2688: Undefined symbol `PQexec(void)' referenced from text segment collect2: ld returned 1 exit status configure: failed program was: #line 2680 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char PQexec(); int main() { PQexec() ; return 0; } > > > On Thu, 29 Jul 1999, Dmitry Samersoff wrote: > >> Is there any autoconf guru? >> >> I have lots problems Autoconf + C++ library. >> >> if I make CC=CXX, configure can't find libpq, >> AC_CHECK_LIB(pq, PQexec) >> >> because it try link PQexec() - and it is missing >> >> if I keep CC as cc >> AC_TRY_COMPILE([#include <stdlib.h> >> #include <sys/types.h> >> #include <sys/socket.h> >> ], >> [int a = accept(1, (struct sockaddr *) 0, (int *) 0);], >> [AC_DEFINE(SOCKET_SIZE_TYPE, int) AC_MSG_RESULT(int)], >> [AC_DEFINE(SOCKET_SIZE_TYPE, size_t) AC_MSG_RESULT(size_t)]) >> >> return wrong result because int always aceptable for C but >> can cause error for CXX >> >> Is there autoconf version modified for work with C++ or >> I have to patch it's macros by my self ? >> >> >> --- >> Dmitry Samersoff, dms@wplus.net, ICQ:3161705 >> http://devnull.wplus.net >> * There will come soft rains ... >> > > Marc G. Fournier ICQ#7615664 IRC Nick: > Scrappy > Systems Administrator @ hub.org > primary: scrappy@hub.org secondary: > scrappy@{freebsd|postgresql}.org --- Dmitry Samersoff, dms@wplus.net, ICQ:3161705 http://devnull.wplus.net * There will come soft rains ...
Dmitry Samersoff <dms@wplus.net> writes: > if I make CC=CXX, configure can't find libpq, You shouldn't do that. CC is supposed to be a C compiler not a C++ compiler. We have enough cross-platform headaches with the code already ... trying to make it all compile under C++ as well as C is a pushup I don't care to undertake... > if I keep CC as cc > AC_TRY_COMPILE([#include <stdlib.h> > #include <sys/types.h> > #include <sys/socket.h> > ], > [int a = accept(1, (struct sockaddr *) 0, (int *) 0);], > [AC_DEFINE(SOCKET_SIZE_TYPE, int) AC_MSG_RESULT(int)], > [AC_DEFINE(SOCKET_SIZE_TYPE, size_t) AC_MSG_RESULT(size_t)]) > return wrong result because int always aceptable for C but > can cause error for CXX Huh? How can it be a problem for C++? The test snippet is C, and so is the code that is going to be trying to call accept(). > Is there autoconf version modified for work with C++ or > I have to patch it's macros by my self ? I think you have a misconfigured C++ installation, and that you'd be best off directing your attention to fixing that. I have seen libpq++ fail in odd ways when I tried to build Postgres here with a fresh egcs install whose C++ support wasn't right. (IIRC, my problem was that /usr/local/lib/libg++ was an old version not compatible with the new egcs --- but the error messages weren't particularly helpful in diagnosing that...) regards, tom lane
Hi Dmitry, Autoconf can do this out of the box. With the macros AC_LANG_C and AC_LANG_CPLUSPLUS you can switch between C and C++ compiler mode. Here is a small example based on the snippet you provided: AC_PREREQ(2.12)AC_INIT(configure.in) ## Check which C and C++ compiler to use#AC_PROG_CCAC_PROG_CXX ## The following checks are done with the C compiler#AC_LANG_C AC_CHECK_FUNC(accept) ## Now switch over to the C++ compiler for the next test#AC_LANG_CPLUSPLUS AC_MSG_CHECKING(socket size type)AC_TRY_COMPILE([#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>],[int a= accept(1, (struct sockaddr *) 0, (int *) 0);],[AC_DEFINE(SOCKET_SIZE_TYPE, int) AC_MSG_RESULT(int)],[AC_DEFINE(SOCKET_SIZE_TYPE,size_t) AC_MSG_RESULT(size_t)]) ## Switch back to C mode again#AC_LANG_C AC_OUTPUT() Best regards, Patrick -- Patrick van Kleef pkleef@roady.xs4all.nl
Dmitry Samersoff <dms@wplus.net> writes: > CC=g++ That is your problem. Don't do it. Autoconf's job is difficult enough without trying to make all its macros work with either C or C++ compilers. They haven't tried. If you think it is critical that they should try, go off and join the GNU autoconf team. Back to actually solving the problem: you should be letting CC=gcc and CXX=g++ as the system is expecting. I don't know what problem you are trying to solve, but I can assure you that switching those two symbols around is *not* the path to a solution. What happens when you try to build the system without forcing the wrong choice of compilers? regards, tom lane
On 29-Jul-99 Patrick van Kleef wrote: > Hi Dmitry, > > Autoconf can do this out of the box. With the macros AC_LANG_C and > AC_LANG_CPLUSPLUS you can switch between C and C++ compiler mode. Here > is a small example based on the snippet you provided: Thank you very match !!!! It is exactly what I need for !!! > > > AC_PREREQ(2.12) > AC_INIT(configure.in) > > # > # Check which C and C++ compiler to use > # > AC_PROG_CC > AC_PROG_CXX > > # > # The following checks are done with the C compiler > # > AC_LANG_C > > AC_CHECK_FUNC(accept) > > > # > # Now switch over to the C++ compiler for the next test > # > AC_LANG_CPLUSPLUS > > AC_MSG_CHECKING(socket size type) > AC_TRY_COMPILE([#include <stdlib.h> > #include <sys/types.h> > #include <sys/socket.h> > ], > [int a = accept(1, (struct sockaddr *) 0, (int *) 0);], > [AC_DEFINE(SOCKET_SIZE_TYPE, int) AC_MSG_RESULT(int)], > [AC_DEFINE(SOCKET_SIZE_TYPE, size_t) AC_MSG_RESULT(size_t)]) > > # > # Switch back to C mode again > # > AC_LANG_C > > AC_OUTPUT() > > > Best regards, > > Patrick > -- > Patrick van Kleef > pkleef@roady.xs4all.nl --- Dmitry Samersoff, dms@wplus.net, ICQ:3161705 http://devnull.wplus.net * There will come soft rains ...