diff options
author | Raimo Niskanen <[email protected]> | 2011-11-24 18:22:34 +0100 |
---|---|---|
committer | Raimo Niskanen <[email protected]> | 2011-11-29 09:41:36 +0100 |
commit | 5643ef4f4203734cdc4f6c7fe9898d288d721fb8 (patch) | |
tree | 29abef0495acf4a7d1d0fc4deeeb6b2a4aebe47a | |
parent | 06554482af2de923e8b5c2849f315138cada24e3 (diff) | |
download | otp-5643ef4f4203734cdc4f6c7fe9898d288d721fb8.tar.gz otp-5643ef4f4203734cdc4f6c7fe9898d288d721fb8.tar.bz2 otp-5643ef4f4203734cdc4f6c7fe9898d288d721fb8.zip |
Work around gcc linking with own view of default libs on Solaris
Also use 64-bit lib when necessary, specify runtime lib path
for secondary dependency libs, and better check before using
SIOCGIFHWADDR.
-rw-r--r-- | erts/configure.in | 57 | ||||
-rw-r--r-- | erts/emulator/drivers/common/inet_drv.c | 2 |
2 files changed, 53 insertions, 6 deletions
diff --git a/erts/configure.in b/erts/configure.in index 992df948cf..699e30c297 100644 --- a/erts/configure.in +++ b/erts/configure.in @@ -1482,6 +1482,58 @@ AC_CHECK_HEADERS(fcntl.h limits.h unistd.h syslog.h dlfcn.h ieeefp.h \ net/errno.h malloc.h arpa/nameser.h libdlpi.h \ pty.h util.h utmp.h langinfo.h poll.h sdkddkver.h) +AC_CHECK_MEMBERS([struct ifreq.ifr_hwaddr], [], [], + [#ifdef __WIN32__ + #else + #ifdef VXWORKS + #else + #include <net/if.h> + #endif + #endif + ]) + +dnl ---------------------------------------------------------------------- +dnl Check the availability for libdlpi +dnl ---------------------------------------------------------------------- +AC_CHECK_LIB(dlpi, dlpi_open) +if test x"$ac_cv_lib_dlpi_dlpi_open" = x"no"; then + unset -v ac_cv_lib_dlpi_dlpi_open + dnl Try again now with -L/lib (or ditto 64) as argument to linker since + dnl gcc makes /usr/ccs/bin/ld ignore the crle configured linker default paths + dnl typically causing dlpi not being found on Solaris et.al + save_ldflags="$LDFLAGS" + try_dlpi_lib=/lib + if test x"$ac_cv_sizeof_void_p" = x"8"; then + if test -d /lib64; then + try_dlpi_lib=/lib64 + elif test -d /lib/64; then + try_dlpi_lib=/lib/64 + fi + fi + if test ! -f "$try_dlpi_lib/libdlpi.so" && \ + test -f "$try_dlpi_lib/libdlpi.so.1" + then + dnl It looks like there is a missing symlink + dnl - let's be helpful and notify the user + dnl NOTE this help is far from perfect e.g if there would be no + dnl *.so.1 but a *.so.1.123 or *.so.2 this will be no help + AC_MSG_ERROR( + [Your OS installation is missing a symbolic link. + Maybe it lacks some development package(s)... + It can anyhow be fixed with the following command: + # ln -s libdlpi.so.1 $try_dlpi_lib/libdlpi.so + ]) + fi + LDFLAGS="-L$try_dlpi_lib -R$try_dlpi_lib $LDFLAGS" + unset -v try_dlpi_lib + AC_MSG_NOTICE([Extending the search to include /lib]) + AC_CHECK_LIB(dlpi, dlpi_open) + if test x"$ac_cv_lib_dlpi_dlpi_open" = x"no"; then + LDFLAGS="$save_ldflags" + fi + unset -v save_ldflags +fi + AC_CHECK_HEADER(sys/resource.h, [AC_DEFINE(HAVE_SYS_RESOURCE_H, 1, [Define to 1 if you have the <sys/resource.h> header file]) @@ -4304,11 +4356,6 @@ AH_BOTTOM([ ]) dnl ---------------------------------------------------------------------- -dnl Check the availability for libdlpi -dnl ---------------------------------------------------------------------- -AC_CHECK_LIB(dlpi, dlpi_open) - -dnl ---------------------------------------------------------------------- dnl Output the result. dnl ---------------------------------------------------------------------- diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c index 455006533e..9dbe66170d 100644 --- a/erts/emulator/drivers/common/inet_drv.c +++ b/erts/emulator/drivers/common/inet_drv.c @@ -4301,7 +4301,7 @@ static int inet_ctl_ifget(inet_descriptor* desc, char* buf, int len, sptr += alen; } } -#elif defined(SIOCGIFHWADDR) +#elif defined(SIOCGIFHWADDR) && defined(HAVE_STRUCT_IFREQ_IFR_HWADDR) if (ioctl(desc->s, SIOCGIFHWADDR, (char *)&ifreq) < 0) break; buf_check(sptr, s_end, 1+2+IFHWADDRLEN); |