1 |
AC_PREREQ([2.59]) |
2 |
AC_INIT([sandbox], [1.2.20alpha1], [sandbox@gentoo.org]) |
3 |
AM_INIT_AUTOMAKE |
4 |
AC_CONFIG_HEADER([config.h]) |
5 |
|
6 |
dnl Checks for programs. |
7 |
AC_PROG_CC |
8 |
AC_ISC_POSIX |
9 |
AC_PROG_INSTALL |
10 |
AC_PROG_MAKE_SET |
11 |
AC_PROG_AWK |
12 |
AC_CHECK_PROGS([READELF], [readelf eu-readelf], [false]) |
13 |
|
14 |
AC_ENABLE_SHARED |
15 |
AC_DISABLE_STATIC |
16 |
dnl Next four lines is a hack to prevent libtool checking for CXX/F77 |
17 |
m4_undefine([AC_PROG_CXX]) |
18 |
m4_defun([AC_PROG_CXX],[]) |
19 |
m4_undefine([AC_PROG_F77]) |
20 |
m4_defun([AC_PROG_F77],[]) |
21 |
AC_PROG_LIBTOOL |
22 |
|
23 |
AC_PREFIX_DEFAULT([/usr]) |
24 |
|
25 |
dnl Checks for libraries. |
26 |
dnl Checks for header files. |
27 |
AC_FUNC_ALLOCA |
28 |
AC_HEADER_DIRENT |
29 |
AC_HEADER_STDC |
30 |
AC_HEADER_SYS_WAIT |
31 |
AC_CHECK_HEADERS([ \ |
32 |
fcntl.h limits.h memory.h stddef.h \ |
33 |
stdlib.h string.h strings.h sys/file.h \ |
34 |
sys/param.h sys/time.h unistd.h utime.h \ |
35 |
]) |
36 |
|
37 |
dnl Checks for typedefs, structures, and compiler characteristics. |
38 |
AC_C_CONST |
39 |
AC_TYPE_UID_T |
40 |
AC_TYPE_MODE_T |
41 |
AC_TYPE_SIZE_T |
42 |
AC_CHECK_TYPES([ptrdiff_t]) |
43 |
|
44 |
dnl Checks for library functions. |
45 |
AC_FUNC_CHOWN |
46 |
AC_FUNC_FORK |
47 |
AC_FUNC_LSTAT |
48 |
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK |
49 |
AC_TYPE_SIGNAL |
50 |
AC_FUNC_STAT |
51 |
AC_CHECK_FUNCS([ \ |
52 |
bzero ftruncate getcwd lchown memmove \ |
53 |
memcpy memset mkdir pathconf realpath \ |
54 |
rmdir setenv strcasecmp strchr strdup \ |
55 |
strerror strndup strrchr strspn strstr \ |
56 |
strtok_r \ |
57 |
]) |
58 |
dnl For librcutil |
59 |
AC_CHECK_FUNCS([remove]) |
60 |
|
61 |
dnl Check if gcc provides va_copy or __va_copy (for librcutil) |
62 |
AC_MSG_CHECKING([for va_copy]) |
63 |
AC_TRY_COMPILE([ |
64 |
#include <stdarg.h> |
65 |
], [ |
66 |
va_list ap, aq; |
67 |
va_copy(ap, aq); |
68 |
], |
69 |
[va_copy="va_copy"], |
70 |
[AC_TRY_COMPILE([ |
71 |
#include <stdarg.h> |
72 |
], [ |
73 |
va_list ap, aq; |
74 |
__va_copy(ap, aq); |
75 |
], |
76 |
[va_copy="__va_copy"], |
77 |
[AC_MSG_ERROR([Unable to determine name of va_copy macro])] |
78 |
)] |
79 |
) |
80 |
AC_MSG_RESULT([$va_copy]) |
81 |
if test x"$va_copy" != xva_copy ; then |
82 |
AC_DEFINE_UNQUOTED([va_copy], [$va_copy], |
83 |
[Define to name of va_copy macro proviced by gcc if its not `va_copy'.] |
84 |
) |
85 |
fi |
86 |
|
87 |
dnl Verify people aren't doing stupid shit |
88 |
if test x"$enable_static" != xno ; then |
89 |
AC_MSG_ERROR([dont be a Kumba, building a libsandbox.a is stupid]) |
90 |
fi |
91 |
if test x"$enable_shared" != xyes ; then |
92 |
AC_MSG_ERROR([dont be a Kumba, omitting a libsandbox.so is stupid]) |
93 |
fi |
94 |
if echo $CFLAGS | $EGREP -e -static >/dev/null 2>&1; then |
95 |
AC_MSG_ERROR([dont be a Kumba, using -static in CFLAGS is stupid]) |
96 |
fi |
97 |
if echo $LDFLAGS | $EGREP -e -static >/dev/null 2>&1; then |
98 |
AC_MSG_ERROR([dont be a Kumba, using -static in LDFLAGS is stupid]) |
99 |
fi |
100 |
|
101 |
dnl Some libc's like those on bsd have dlopen() in libc, and not libdl |
102 |
AC_CHECK_LIB([dl], [dlopen], |
103 |
[have_libdl="yes"], |
104 |
[have_libdl="no"] |
105 |
) |
106 |
if test x"$have_libdl" = xyes ; then |
107 |
LIBDL="-ldl" |
108 |
AC_SUBST([LIBDL]) |
109 |
DL_LIB="dl" |
110 |
else |
111 |
DL_LIB="c" |
112 |
AC_CHECK_LIB([c], [dlopen], |
113 |
[], |
114 |
[AC_MSG_ERROR([Unable to determine library providing dlopen])] |
115 |
) |
116 |
fi |
117 |
|
118 |
dnl uClibc doesn't currently provide dlvsym() so lets |
119 |
dnl verify the toolchain supports it |
120 |
AC_CHECK_LIB([$DL_LIB], [dlvsym], |
121 |
[AC_DEFINE([HAVE_DLVSYM], [1], [libdl supports dlvsym])], |
122 |
[AC_DEFINE([HAVE_DLVSYM], [0], [libdl does not support dlvsym])] |
123 |
) |
124 |
|
125 |
dnl when using libc5, (f)trucate's offset argument type is size_t with |
126 |
dnl libc5, but it's off_t with libc6 (glibc2). |
127 |
AC_MSG_CHECKING([truncate argument type]) |
128 |
TRUNC_ARG_TYPE=`echo '#include <unistd.h>' | $CC -E - | grep -q 'truncate.*size_t'` |
129 |
if test "$TRUNC_ARG_TYPE"x != x ; then |
130 |
AC_MSG_RESULT([size_t]) |
131 |
AC_DEFINE([TRUNCATE_T], [size_t], [truncate arg type]) |
132 |
else |
133 |
AC_MSG_RESULT([off_t]) |
134 |
AC_DEFINE([TRUNCATE_T], [off_t], [truncate arg type]) |
135 |
fi |
136 |
|
137 |
dnl Check if libc provides RTLD_NEXT |
138 |
AC_MSG_CHECKING([for RTLD_NEXT]) |
139 |
AC_TRY_COMPILE([ |
140 |
#define _GNU_SOURCE |
141 |
#include <dlfcn.h> |
142 |
], [ |
143 |
#if !defined(RTLD_NEXT) |
144 |
# error no RTLD_NEXT |
145 |
#endif |
146 |
], |
147 |
[have_rtld_next="yes"], |
148 |
[have_rtld_next="no"] |
149 |
) |
150 |
AC_MSG_RESULT([$have_rtld_next]) |
151 |
if test x"$have_rtld_next" = xyes ; then |
152 |
AC_DEFINE([HAVE_RTLD_NEXT], [1], [Have RTLD_NEXT enabled libc]) |
153 |
fi |
154 |
|
155 |
dnl we need to handle symbols differently based upon their version, |
156 |
dnl but we have to know which symbols the libc supports first |
157 |
AC_MSG_CHECKING([libc path]) |
158 |
echo "int main(void) { return 0; }" > libctest.c |
159 |
$CC $CFLAGS -Wl,-verbose -o libctest libctest.c &> libctest.log |
160 |
cat libctest.log 1>&AS_MESSAGE_LOG_FD |
161 |
LIBC_PATH=`$AWK '/attempt to open/ { if (($4 ~ /\/libc\.so/) && ($5 == "succeeded")) LIBC = $4; }; END {print LIBC}' libctest.log` |
162 |
rm -f libctest* |
163 |
if test x"$LIBC_PATH" = x || ! test -r "$LIBC_PATH" ; then |
164 |
AC_MSG_ERROR([Unable to determine LIBC PATH ($LIBC_PATH)]) |
165 |
fi |
166 |
AC_MSG_RESULT([$LIBC_PATH]) |
167 |
AC_SUBST([LIBC_PATH]) |
168 |
|
169 |
dnl when intercepting libc calls, we have to know the name of the |
170 |
dnl libc to load and search with dl*() calls |
171 |
AC_MSG_CHECKING([libc version]) |
172 |
dnl the sed script at the end here looks funny but it's ok ... |
173 |
dnl they're m4 escape sequences for left and right brackets |
174 |
echo "int main(void) { return 0; }" > libctest.c |
175 |
$CC -Wall -o libctest libctest.c |
176 |
LIBC_VERSION=`$READELF -d libctest | grep NEEDED.*libc\\.so | $AWK '{print $NF}' | sed -e 's:\@<:@::' -e 's:\@:>@::'` |
177 |
rm -f libctest* |
178 |
if test "$LIBC_VERSION"x = x ; then |
179 |
AC_MSG_ERROR([Unable to determine LIBC VERSION]) |
180 |
fi |
181 |
AC_MSG_RESULT([$LIBC_VERSION]) |
182 |
AC_DEFINE_UNQUOTED([LIBC_VERSION], ["$LIBC_VERSION"], [Name of libc to hook into]) |
183 |
|
184 |
dnl check if we have 32bit or 64bit output |
185 |
AC_ARG_ENABLE([multilib], |
186 |
AS_HELP_STRING([--enable-multilib], |
187 |
[enable building for multilib setups (default=disabled)]), |
188 |
[enable_multilib="$enableval"], |
189 |
[enable_multilib="no"] |
190 |
) |
191 |
|
192 |
if test x"$enable_multilib" != xno ; then |
193 |
AC_DEFINE([SB_HAVE_MULTILIB], [1], [Have multilib enabled system]) |
194 |
fi |
195 |
|
196 |
SANDBOX_DEFINES='-DETCDIR="\"$(sysconfdir)\"" -DLIBSANDBOX_PATH="\"$(libdir)\"" -DSANDBOX_BASHRC_PATH="\"$(pkgdatadir)\""' |
197 |
AC_SUBST([SANDBOX_DEFINES]) |
198 |
|
199 |
AC_OUTPUT([ |
200 |
Makefile |
201 |
scripts/Makefile |
202 |
etc/Makefile |
203 |
data/Makefile |
204 |
libsbutil/Makefile |
205 |
src/Makefile |
206 |
]) |