| … | |
… | |
| 27 | AC_FUNC_ALLOCA |
27 | AC_FUNC_ALLOCA |
| 28 | AC_HEADER_DIRENT |
28 | AC_HEADER_DIRENT |
| 29 | AC_HEADER_STDC |
29 | AC_HEADER_STDC |
| 30 | AC_HEADER_SYS_WAIT |
30 | AC_HEADER_SYS_WAIT |
| 31 | AC_CHECK_HEADERS([ \ |
31 | AC_CHECK_HEADERS([ \ |
| 32 | fcntl.h limits.h memory.h stddef.h \ |
32 | fcntl.h limits.h memory.h stddef.h \ |
| 33 | stdlib.h string.h strings.h sys/file.h \ |
33 | stdlib.h string.h strings.h sys/file.h \ |
| 34 | sys/param.h sys/time.h unistd.h utime.h \ |
34 | sys/param.h sys/time.h unistd.h utime.h \ |
| 35 | ]) |
35 | ]) |
| 36 | |
36 | |
| 37 | dnl Checks for typedefs, structures, and compiler characteristics. |
37 | dnl Checks for typedefs, structures, and compiler characteristics. |
| 38 | AC_C_CONST |
38 | AC_C_CONST |
| 39 | AC_TYPE_UID_T |
39 | AC_TYPE_UID_T |
| … | |
… | |
| 47 | AC_FUNC_LSTAT |
47 | AC_FUNC_LSTAT |
| 48 | AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK |
48 | AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK |
| 49 | AC_TYPE_SIGNAL |
49 | AC_TYPE_SIGNAL |
| 50 | AC_FUNC_STAT |
50 | AC_FUNC_STAT |
| 51 | AC_CHECK_FUNCS([ \ |
51 | AC_CHECK_FUNCS([ \ |
| 52 | bzero ftruncate getcwd lchown memmove \ |
52 | bzero ftruncate getcwd lchown memmove \ |
| 53 | memcpy memset mkdir pathconf realpath \ |
53 | memcpy memset mkdir pathconf realpath \ |
| 54 | rmdir setenv strcasecmp strchr strdup \ |
54 | rmdir setenv strcasecmp strchr strdup \ |
| 55 | strerror strndup strrchr strspn strstr \ |
55 | strerror strndup strrchr strspn strstr \ |
| 56 | ]) |
56 | ]) |
| 57 | |
57 | |
| 58 | dnl Some libc's like those on bsd have dlopen() in libc, and not libdl |
58 | dnl Some libc's like those on bsd have dlopen() in libc, and not libdl |
| 59 | AC_CHECK_LIB([dl], [dlopen], |
59 | AC_CHECK_LIB([dl], [dlopen], |
| 60 | [have_libdl="yes"], |
60 | [have_libdl="yes"], |
| 61 | [have_libdl="no"] |
61 | [have_libdl="no"] |
| 62 | ) |
62 | ) |
| 63 | if test x"$have_libdl" = xyes ; then |
63 | if test x"$have_libdl" = xyes ; then |
| 64 | LIBDL="-ldl" |
64 | LIBDL="-ldl" |
| 65 | AC_SUBST([LIBDL]) |
65 | AC_SUBST([LIBDL]) |
| 66 | DL_LIB="dl" |
66 | DL_LIB="dl" |
| 67 | else |
67 | else |
| 68 | DL_LIB="c" |
68 | DL_LIB="c" |
| 69 | AC_CHECK_LIB([c], [dlopen], |
69 | AC_CHECK_LIB([c], [dlopen], |
| 70 | [], |
70 | [], |
| 71 | [AC_MSG_ERROR([Unable to determine library providing dlopen])] |
71 | [AC_MSG_ERROR([Unable to determine library providing dlopen])] |
| 72 | ) |
72 | ) |
| 73 | fi |
73 | fi |
| 74 | |
74 | |
| 75 | dnl uClibc doesn't currently provide dlvsym() so lets |
75 | dnl uClibc doesn't currently provide dlvsym() so lets |
| 76 | dnl verify the toolchain supports it |
76 | dnl verify the toolchain supports it |
| 77 | AC_CHECK_LIB([$DL_LIB], [dlvsym], |
77 | AC_CHECK_LIB([$DL_LIB], [dlvsym], |
| 78 | [AC_DEFINE([HAVE_DLVSYM], [1], [libdl supports dlvsym])], |
78 | [AC_DEFINE([HAVE_DLVSYM], [1], [libdl supports dlvsym])], |
| 79 | [AC_DEFINE([HAVE_DLVSYM], [0], [libdl does not support dlvsym])] |
79 | [AC_DEFINE([HAVE_DLVSYM], [0], [libdl does not support dlvsym])] |
| 80 | ) |
80 | ) |
| 81 | |
81 | |
| 82 | dnl when using libc5, (f)trucate's offset argument type is size_t with |
82 | dnl when using libc5, (f)trucate's offset argument type is size_t with |
| 83 | dnl libc5, but it's off_t with libc6 (glibc2). |
83 | dnl libc5, but it's off_t with libc6 (glibc2). |
| 84 | AC_MSG_CHECKING([truncate argument type]) |
84 | AC_MSG_CHECKING([truncate argument type]) |
| 85 | TRUNC_ARG_TYPE=`echo '#include <unistd.h>' | $CC -E - | grep -q 'truncate.*size_t'` |
85 | TRUNC_ARG_TYPE=`echo '#include <unistd.h>' | $CC -E - | grep -q 'truncate.*size_t'` |
| 86 | if test "$TRUNC_ARG_TYPE"x != x ; then |
86 | if test "$TRUNC_ARG_TYPE"x != x ; then |
| 87 | AC_MSG_RESULT([size_t]) |
87 | AC_MSG_RESULT([size_t]) |
| 88 | AC_DEFINE([TRUNCATE_T], [size_t], [truncate arg type]) |
88 | AC_DEFINE([TRUNCATE_T], [size_t], [truncate arg type]) |
| 89 | else |
89 | else |
| 90 | AC_MSG_RESULT([off_t]) |
90 | AC_MSG_RESULT([off_t]) |
| 91 | AC_DEFINE([TRUNCATE_T], [off_t], [truncate arg type]) |
91 | AC_DEFINE([TRUNCATE_T], [off_t], [truncate arg type]) |
| 92 | fi |
92 | fi |
| 93 | |
93 | |
| 94 | dnl Check if libc provides RTLD_NEXT |
94 | dnl Check if libc provides RTLD_NEXT |
| 95 | AC_MSG_CHECKING([for RTLD_NEXT]) |
95 | AC_MSG_CHECKING([for RTLD_NEXT]) |
| 96 | AC_TRY_COMPILE([ |
96 | AC_TRY_COMPILE([ |
| 97 | #define _GNU_SOURCE |
97 | #define _GNU_SOURCE |
| 98 | #include <dlfcn.h> |
98 | #include <dlfcn.h> |
| 99 | ], [ |
99 | ], [ |
| 100 | #if !defined(RTLD_NEXT) |
100 | #if !defined(RTLD_NEXT) |
| 101 | # error no RTLD_NEXT |
101 | # error no RTLD_NEXT |
| 102 | #endif |
102 | #endif |
| 103 | |
103 | ], |
| 104 | int |
|
|
| 105 | main (void) |
|
|
| 106 | { |
|
|
| 107 | return 0; |
|
|
| 108 | } |
|
|
| 109 | ], |
|
|
| 110 | [have_rtld_next="yes"], |
104 | [have_rtld_next="yes"], |
| 111 | [have_rtld_next="no"] |
105 | [have_rtld_next="no"] |
| 112 | ) |
106 | ) |
| 113 | AC_MSG_RESULT([$have_rtld_next]) |
107 | AC_MSG_RESULT([$have_rtld_next]) |
| 114 | AM_CONDITIONAL([HAVE_RTLD_NEXT], [test x"$have_rtld_next" = xyes]) |
108 | AM_CONDITIONAL([HAVE_RTLD_NEXT], [test x"$have_rtld_next" = xyes]) |
| 115 | |
109 | |
| 116 | dnl we need to handle symbols differently based upon their version, |
110 | dnl we need to handle symbols differently based upon their version, |
| 117 | dnl but we have to know which symbols the libc supports first |
111 | dnl but we have to know which symbols the libc supports first |
| 118 | AC_MSG_CHECKING([libc path]) |
112 | AC_MSG_CHECKING([libc path]) |
| 119 | echo "int main(void) { return 0; }" > libctest.c |
113 | echo "int main(void) { return 0; }" > libctest.c |
| 120 | $CC -Wall -o libctest libctest.c |
|
|
| 121 | LIBC_PATH=`$CC $CFLAGS -Wl,-verbose -o libctest libctest.c 2>&1 | \ |
114 | LIBC_PATH=`$CC $CFLAGS -Wl,-verbose -o libctest libctest.c 2>&1 | \ |
| 122 | $AWK '/attempt to open/ { if (($4 ~ /\/libc\.so/) && ($5 == "succeeded")) LIBC = $4; }; END {print LIBC}'` |
115 | $AWK '/attempt to open/ { if (($4 ~ /\/libc\.so/) && ($5 == "succeeded")) LIBC = $4; }; END {print LIBC}'` |
| 123 | rm -f libctest.c |
116 | rm -f libctest* |
| 124 | if test "$LIBC_PATH"x = x || ! test -r "$LIBC_PATH"; then |
117 | if test "$LIBC_PATH"x = x || ! test -r "$LIBC_PATH"; then |
| 125 | AC_MSG_ERROR([Unable to determine LIBC PATH]) |
118 | AC_MSG_ERROR([Unable to determine LIBC PATH]) |
| 126 | fi |
119 | fi |
| 127 | AC_MSG_RESULT([$LIBC_PATH]) |
120 | AC_MSG_RESULT([$LIBC_PATH]) |
| 128 | AC_SUBST([LIBC_PATH]) |
121 | AC_SUBST([LIBC_PATH]) |
| 129 | |
122 | |
| 130 | dnl when intercepting libc calls, we have to know the name of the |
123 | dnl when intercepting libc calls, we have to know the name of the |
| 131 | dnl libc to load and search with dl*() calls |
124 | dnl libc to load and search with dl*() calls |
| 132 | AC_MSG_CHECKING([libc version]) |
125 | AC_MSG_CHECKING([libc version]) |
| 133 | dnl the sed script at the end here looks funny but it's ok ... |
126 | dnl the sed script at the end here looks funny but it's ok ... |
| 134 | dnl they're m4 escape sequences for left and right brackets |
127 | dnl they're m4 escape sequences for left and right brackets |
|
|
128 | echo "int main(void) { return 0; }" > libctest.c |
|
|
129 | $CC -Wall -o libctest libctest.c |
| 135 | LIBC_VERSION=`readelf -d libctest | grep NEEDED.*libc\\.so | $AWK '{print $NF}' | sed -e 's:\@<:@::' -e 's:\@:>@::'` |
130 | LIBC_VERSION=`readelf -d libctest | grep NEEDED.*libc\\.so | $AWK '{print $NF}' | sed -e 's:\@<:@::' -e 's:\@:>@::'` |
|
|
131 | rm -f libctest* |
| 136 | if test "$LIBC_VERSION"x = x ; then |
132 | if test "$LIBC_VERSION"x = x ; then |
| 137 | AC_MSG_ERROR([Unable to determine LIBC VERSION]) |
133 | AC_MSG_ERROR([Unable to determine LIBC VERSION]) |
| 138 | fi |
134 | fi |
| 139 | rm -f libctest |
|
|
| 140 | AC_MSG_RESULT([$LIBC_VERSION]) |
135 | AC_MSG_RESULT([$LIBC_VERSION]) |
| 141 | AC_DEFINE_UNQUOTED([LIBC_VERSION], ["$LIBC_VERSION"], [Name of libc to hook into]) |
136 | AC_DEFINE_UNQUOTED([LIBC_VERSION], ["$LIBC_VERSION"], [Name of libc to hook into]) |
| 142 | |
137 | |
| 143 | dnl check if we have 32bit or 64bit output |
138 | dnl check if we have 32bit or 64bit output |
| 144 | AC_ARG_ENABLE([multilib], |
139 | AC_ARG_ENABLE([multilib], |
| 145 | AS_HELP_STRING([--enable-multilib], |
140 | AS_HELP_STRING([--enable-multilib], |
| 146 | [enable building for multilib setups (default=disabled)]), |
141 | [enable building for multilib setups (default=disabled)]), |
| 147 | [enable_multilib="$enableval"], |
142 | [enable_multilib="$enableval"], |
| 148 | [enable_multilib="no"] |
143 | [enable_multilib="no"] |
| 149 | ) |
144 | ) |
| 150 | |
145 | |
| 151 | if test x"$enable_multilib" != xno ; then |
146 | if test x"$enable_multilib" != xno ; then |
| 152 | AC_DEFINE([SB_HAVE_MULTILIB], [1], [Have multilib enabled system]) |
147 | AC_DEFINE([SB_HAVE_MULTILIB], [1], [Have multilib enabled system]) |
| 153 | fi |
148 | fi |
| 154 | |
149 | |
| 155 | AC_OUTPUT([ |
150 | AC_OUTPUT([ |
| 156 | Makefile |
151 | Makefile |
| 157 | scripts/Makefile |
152 | scripts/Makefile |
| 158 | data/Makefile |
153 | data/Makefile |
| 159 | src/Makefile |
154 | src/Makefile |
| 160 | ]) |
155 | ]) |
|
|
156 | |