1 dnl ***********************************
2 dnl *** include special GLib macros ***
3 dnl ***********************************
4 builtin(include, acglib.m4)dnl
6 # require autoconf 2.13
9 # Process this file with autoconf to produce a configure script.
12 # Save this value here, since automake will set cflags later
13 cflags_set=${CFLAGS+set}
15 # we rewrite this file
16 rm -f glibconfig-sysdefs.h
18 dnl we to AC_DIVERT_PUSH/AC_DIVERT_POP these variable definitions so they
19 dnl are available for $ac_help expansion (don't we all *love* autoconf?)
20 AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl
22 # The following version number definitions apply to GLib and GModule
23 # as a whole, so if changes occoured in either of them, they are both
24 # treated with the same interface and binary age.
27 # GLIB_MICRO_VERSION += 1;
28 # GLIB_INTERFACE_AGE += 1;
29 # GLIB_BINARY_AGE += 1;
30 # if any functions have been added, set GLIB_INTERFACE_AGE to 0.
31 # if backwards compatibility has been broken,
32 # set GLIB_BINARY_AGE and GLIB_INTERFACE_AGE to 0.
39 GLIB_VERSION=$GLIB_MAJOR_VERSION.$GLIB_MINOR_VERSION.$GLIB_MICRO_VERSION
43 AC_SUBST(GLIB_MAJOR_VERSION)
44 AC_SUBST(GLIB_MINOR_VERSION)
45 AC_SUBST(GLIB_VERSION)
46 AC_SUBST(GLIB_INTERFACE_AGE)
47 AC_SUBST(GLIB_BINARY_AGE)
50 LT_RELEASE=$GLIB_MAJOR_VERSION.$GLIB_MINOR_VERSION
51 LT_CURRENT=`expr $GLIB_MICRO_VERSION - $GLIB_INTERFACE_AGE`
52 LT_REVISION=$GLIB_INTERFACE_AGE
53 LT_AGE=`expr $GLIB_BINARY_AGE - $GLIB_INTERFACE_AGE`
62 AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define)
64 # Specify a configuration file
65 AM_CONFIG_HEADER(config.h)
67 AC_DEFINE_UNQUOTED(GLIB_MAJOR_VERSION, $GLIB_MAJOR_VERSION)
68 AC_DEFINE_UNQUOTED(GLIB_MINOR_VERSION, $GLIB_MINOR_VERSION)
69 AC_DEFINE_UNQUOTED(GLIB_MICRO_VERSION, $GLIB_MICRO_VERSION)
70 AC_DEFINE_UNQUOTED(GLIB_INTERFACE_AGE, $GLIB_INTERFACE_AGE)
71 AC_DEFINE_UNQUOTED(GLIB_BINARY_AGE, $GLIB_BINARY_AGE)
73 dnl Initialize libtool
76 dnl Initialize maintainer mode
81 AC_MSG_CHECKING(for the BeOS)
84 AC_DEFINE(GLIB_NATIVE_BEOS, 1)
85 glib_native_beos="yes"
86 AC_MSG_RESULT([$glib_native_beos])
90 AC_MSG_RESULT($glib_native_beos)
94 dnl figure debugging default, prior to $ac_help setup
96 AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)dnl
97 if test `expr $GLIB_MINOR_VERSION \% 2` = 1 ; then
100 debug_default=minimum
104 dnl declare --enable-* args and collect ac_help strings
105 AC_ARG_ENABLE(debug, [ --enable-debug=[no/minimum/yes] turn on debugging [default=$debug_default]],,enable_debug=$debug_default)
106 AC_ARG_ENABLE(mem_check, [ --enable-mem-check turn on malloc/free sanity checking [default=no]],,enable_mem_check=no)
107 AC_ARG_ENABLE(mem_profile, [ --enable-mem-profile turn on malloc profiling atexit [default=no]],,enable_mem_profile=no)
108 AC_ARG_ENABLE(ansi, [ --enable-ansi turn on strict ansi [default=no]],
110 AC_ARG_ENABLE(threads, [ --enable-threads turn on basic thread support [default=yes]
111 ([=no] will override --with-threads)],,enable_threads=yes)
113 if test "x$enable_threads" != "xyes"; then
117 AC_MSG_CHECKING(whether to enable memory checking)
118 if test "x$enable_mem_check" = "xyes"; then
119 AC_DEFINE(ENABLE_MEM_CHECK, 1)
120 AC_SUBST(ENABLE_MEM_CHECK)
126 AC_MSG_CHECKING(whether to enable memory profiling)
127 if test "x$enable_mem_profile" = "xyes"; then
128 AC_DEFINE(ENABLE_MEM_PROFILE, 1)
129 AC_SUBST(ENABLE_MEM_PROFILE)
135 if test "x$enable_debug" = "xyes"; then
136 test "$cflags_set" = set || CFLAGS="$CFLAGS -g"
137 GLIB_DEBUG_FLAGS="-DG_ENABLE_DEBUG"
139 if test "x$enable_debug" = "xno"; then
140 GLIB_DEBUG_FLAGS="-DG_DISABLE_ASSERT -DG_DISABLE_CHECKS"
144 AC_DEFINE_UNQUOTED(G_COMPILED_WITH_DEBUGGING, "${enable_debug}")
146 # Checks for programs.
152 if test "x$GCC" = "xyes"; then
154 *[\ \ ]-Wall[\ \ ]*) ;;
155 *) CFLAGS="$CFLAGS -Wall" ;;
158 if test "x$enable_ansi" = "xyes"; then
160 *[\ \ ]-ansi[\ \ ]*) ;;
161 *) CFLAGS="$CFLAGS -ansi" ;;
165 *[\ \ ]-pedantic[\ \ ]*) ;;
166 *) CFLAGS="$CFLAGS -pedantic" ;;
172 dnl DU4 native cc currently needs -std1 for ANSI mode (instead of K&R)
173 AC_MSG_CHECKING([for extra flags to get ANSI library prototypes])
176 AC_TRY_RUN([#include <math.h>
177 int main (void) { return (log(1) != log(1.)); }],
178 AC_MSG_RESULT(none needed),
179 glib_save_CFLAGS=$CFLAGS
180 CFLAGS="$CFLAGS -std1"
181 AC_TRY_RUN([#include <math.h>
182 int main (void) { return (log(1) != log(1.)); }],
183 AC_MSG_RESULT(-std1),
185 CFLAGS=$glib_save_CFLAGS
187 [No ANSI prototypes found in library. (-std1 didn't work.)])
192 dnl NeXTStep cc seems to need this
193 AC_MSG_CHECKING([for extra flags for POSIX compliance])
194 AC_TRY_COMPILE([#include <dirent.h>], [DIR *dir;],
195 AC_MSG_RESULT(none needed),
196 glib_save_CFLAGS=$CFLAGS
197 CFLAGS="$CFLAGS -posix"
198 AC_TRY_COMPILE([#include <dirent.h>], [DIR *dir;],
199 AC_MSG_RESULT(-posix),
201 CFLAGS=$glib_save_CFLAGS
202 AC_MSG_WARN([Could not determine POSIX flag. (-posix didn't work.)])))
204 # Checks for header files.
207 # Checks for library functions.
210 AC_CHECK_FUNCS(atexit on_exit)
212 AC_CHECK_SIZEOF(char)
213 AC_CHECK_SIZEOF(short)
214 AC_CHECK_SIZEOF(long)
216 AC_CHECK_SIZEOF(void *)
217 AC_CHECK_SIZEOF(long long)
219 if test x$ac_cv_sizeof_long_long = x8; then
220 # long long is a 64 bit integer.
221 AC_MSG_CHECKING(for format to printf and scanf a gint64)
222 AC_CACHE_VAL(glib_cv_long_long_format,[
223 AC_TRY_RUN([#include <stdio.h>
226 long long b, a = -0x3AFAFAFAFAFAFAFALL;
228 sprintf (buffer, "%llu", a);
229 sscanf (buffer, "%llu", &b);
233 glib_cv_long_long_format=ll,
234 glib_cv_long_long_format=q)])
235 AC_MSG_RESULT(%${glib_cv_long_long_format}i)
238 dnl long doubles were not used, and a portability problem
242 dnl AC_C_INLINE is useless to us since it bails out too early, we need to
243 dnl truely know which ones of `inline', `__inline' and `__inline__' are
244 dnl actually supported.
245 AC_MSG_CHECKING(for __inline)
246 AC_CACHE_VAL(glib_cv_has__inline,[
248 __inline int foo () { return 0; }
249 int main () { return foo (); }
251 glib_cv_has__inline=yes
253 glib_cv_has__inline=no
256 AC_MSG_RESULT($glib_cv_has__inline)
257 case x$glib_cv_has__inline in
258 xyes) AC_DEFINE(G_HAVE___INLINE)
260 AC_MSG_CHECKING(for __inline__)
261 AC_CACHE_VAL(glib_cv_has__inline__,[
263 __inline__ int foo () { return 0; }
264 int main () { return foo (); }
266 glib_cv_has__inline__=yes
268 glib_cv_has__inline__=no
271 AC_MSG_RESULT($glib_cv_has__inline__)
272 case x$glib_cv_has__inline__ in
273 xyes) AC_DEFINE(G_HAVE___INLINE__)
275 AC_MSG_CHECKING(for inline)
276 AC_CACHE_VAL(glib_cv_hasinline,[
278 inline int foo () { return 0; }
279 int main () { return foo (); }
281 glib_cv_hasinline=yes
286 AC_MSG_RESULT($glib_cv_hasinline)
287 case x$glib_cv_hasinline in
288 xyes) AC_DEFINE(G_HAVE_INLINE)
291 dnl for bytesex stuff
294 dnl header file checks
295 AC_CHECK_HEADERS(float.h, AC_DEFINE(HAVE_FLOAT_H))
296 AC_CHECK_HEADERS(limits.h, AC_DEFINE(HAVE_LIMITS_H))
297 AC_CHECK_HEADERS(pwd.h, AC_DEFINE(HAVE_PWD_H))
298 AC_CHECK_HEADERS(sys/param.h, AC_DEFINE(HAVE_SYS_PARAM_H))
299 AC_CHECK_HEADERS(sys/poll.h, AC_DEFINE(HAVE_SYS_POLL_H))
300 AC_CHECK_HEADERS(sys/select.h, AC_DEFINE(HAVE_SYS_SELECT_H))
301 AC_CHECK_HEADERS(sys/time.h, AC_DEFINE(HAVE_SYS_TIME_H))
302 AC_CHECK_HEADERS(sys/times.h, AC_DEFINE(HAVE_SYS_TIMES_H))
303 AC_CHECK_HEADERS(unistd.h, AC_DEFINE(HAVE_UNISTD_H))
304 AC_CHECK_HEADERS(values.h, AC_DEFINE(HAVE_VALUES_H))
306 # Check for some functions
307 AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf strcasecmp strncasecmp poll)
309 # Check if bcopy can be used for overlapping copies, if memmove isn't found.
310 # The check is borrowed from the PERL Configure script.
311 if test "$ac_cv_func_memmove" != "yes"; then
312 AC_CACHE_CHECK(whether bcopy can handle overlapping copies,
313 glib_cv_working_bcopy,[AC_TRY_RUN([
315 char buf[128], abc[128], *b;
317 bcopy("abcdefghijklmnopqrstuvwxyz0123456789", abc, 36);
318 for (align = 7; align >= 0; align--) {
319 for (len = 36; len; len--) {
320 b = buf+align; bcopy(abc, b, len);
321 for (off = 1; off <= len; off++) {
322 bcopy(b, b+off, len); bcopy(b+off, b, len);
323 if (bcmp(b, abc, len)) return(1);
328 }],glib_cv_working_bcopy=yes,glib_cv_working_bcopy=no)])
329 if test "$glib_cv_working_bcopy" == "yes"; then
330 AC_DEFINE(HAVE_WORKING_BCOPY)
334 # Check for sys_errlist
335 AC_MSG_CHECKING(for sys_errlist)
337 extern char *sys_errlist[];
339 sys_errlist[sys_nerr-1][0] = 0;
340 ], glib_ok=yes, glib_ok=no)
341 AC_MSG_RESULT($glib_ok)
342 if test $glib_ok = no; then
343 AC_DEFINE(NO_SYS_ERRLIST)
346 # Check for sys_siglist
347 AC_MSG_CHECKING(for sys_siglist)
349 extern char *sys_siglist[];
350 strlen (sys_siglist[0]);
351 ], glib_ok=yes, glib_ok=no)
352 AC_MSG_RESULT($glib_ok)
353 if test $glib_ok = no; then
354 AC_DEFINE(NO_SYS_SIGLIST)
357 # Check for sys_siglist decl (see Tue Jan 19 00:44:24 1999 in changelog)
358 AC_MSG_CHECKING(for sys_siglist declaration)
359 AC_TRY_COMPILE([#include <signal.h>], [
360 strlen (sys_siglist[0]);
361 ], glib_ok=yes, glib_ok=no)
362 AC_MSG_RESULT($glib_ok)
363 if test $glib_ok = no; then
364 AC_DEFINE(NO_SYS_SIGLIST_DECL)
367 # Check if <sys/select.h> needs to be included for fd_set
368 AC_MSG_CHECKING([for fd_set])
369 AC_TRY_COMPILE([#include <sys/types.h>],
370 [fd_set readMask, writeMask;], gtk_ok=yes, gtk_ok=no)
371 if test $gtk_ok = yes; then
372 AC_MSG_RESULT([yes, found in sys/types.h])
374 AC_HEADER_EGREP(fd_set, sys/select.h, gtk_ok=yes)
375 if test $gtk_ok = yes; then
376 AC_DEFINE(HAVE_SYS_SELECT_H)
377 AC_MSG_RESULT([yes, found in sys/select.h])
384 dnl *** check for sane realloc() ***
385 AC_MSG_CHECKING(whether realloc (NULL,) will work)
386 AC_CACHE_VAL(glib_cv_sane_realloc,[
390 return realloc (0, sizeof (int)) == 0;
392 glib_cv_sane_realloc=yes
393 AC_DEFINE(REALLOC_0_WORKS)
395 glib_cv_sane_realloc=no
398 AC_MSG_RESULT($glib_cv_sane_realloc)
401 dnl **********************
402 dnl *** va_copy checks ***
403 dnl **********************
404 dnl we currently check for all three va_copy possibilities, so we get
405 dnl all results in config.log for bug reports.
406 AC_MSG_CHECKING(for an implementation of va_copy())
407 AC_CACHE_VAL(glib_cv_va_copy,[
410 void f (int i, ...) {
411 va_list args1, args2;
413 va_copy (args2, args1);
414 if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
416 va_end (args1); va_end (args2);
427 AC_MSG_RESULT($glib_cv_va_copy)
428 AC_MSG_CHECKING(for an implementation of __va_copy())
429 AC_CACHE_VAL(glib_cv___va_copy,[
432 void f (int i, ...) {
433 va_list args1, args2;
435 __va_copy (args2, args1);
436 if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
438 va_end (args1); va_end (args2);
444 glib_cv___va_copy=yes
449 AC_MSG_RESULT($glib_cv___va_copy)
450 AC_MSG_CHECKING(whether va_lists can be copied by value)
451 AC_CACHE_VAL(glib_cv_va_val_copy,[
454 void f (int i, ...) {
455 va_list args1, args2;
458 if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
460 va_end (args1); va_end (args2);
466 glib_cv_va_val_copy=yes
468 glib_cv_va_val_copy=no
471 if test "x$glib_cv_va_copy" = "xyes"; then
472 AC_DEFINE(G_VA_COPY, va_copy)
473 else if test "x$glib_cv___va_copy" = "xyes"; then
474 AC_DEFINE(G_VA_COPY, __va_copy)
477 if test "x$glib_cv_va_val_copy" = "xno"; then
478 AC_DEFINE(G_VA_COPY_AS_ARRAY)
480 AC_MSG_RESULT($glib_cv_va_val_copy)
483 dnl ***********************
484 dnl *** g_module checks ***
485 dnl ***********************
488 G_MODULE_PLUGIN_LIBS=
490 dnl G_MODULE_IMPL= don't reset, so cmd-line can override
491 G_MODULE_NEED_USCORE=0
492 G_MODULE_HAVE_DLERROR=0
493 dnl *** dlopen() and dlsym() in system libraries
494 if test -z "$G_MODULE_IMPL"; then
495 AC_CHECK_FUNC(dlopen,
497 G_MODULE_IMPL=G_MODULE_IMPL_DL
501 dnl *** load_image (BeOS)
502 if test -z "$G_MODULE_IMPL" -a "x$glib_native_beos" = "xyes"; then
503 AC_CHECK_LIB(root, load_image,
504 G_MODULE_LIBS="-lbe -lroot -lglib"
505 G_MODULE_LIBS_EXTRA="-L\$(top_builddir_full)/.libs"
506 G_MODULE_PLUGIN_LIBS="-L\$(top_builddir_full)/gmodule/.libs -lgmodule"
507 G_MODULE_IMPL=G_MODULE_IMPL_BEOS
510 dnl *** dlopen() and dlsym() in libdl
511 if test -z "$G_MODULE_IMPL"; then
512 AC_CHECK_LIB(dl, dlopen,
513 AC_CHECK_LIB(dl, dlsym,
515 G_MODULE_IMPL=G_MODULE_IMPL_DL
519 dnl *** shl_load() in libdld (HP-UX)
520 if test -z "$G_MODULE_IMPL"; then
521 AC_MSG_CHECKING(how to export all symbols)
522 SAVED_LDFLAGS=$LDFLAGS
523 LDFLAGS="$LDFLAGS -Wl,-E"
524 AC_TRY_LINK(,[ return 0; ],
525 [ G_MODULE_LDFLAGS="-Wl,-E" ],[
526 LDFLAGS="$SAVED_LDFLAGS -bexpall"
527 AC_TRY_LINK(,[ return 0; ],
528 G_MODULE_LDFLAGS="-bexpall",
529 G_MODULE_LDFLAGS="none"
532 LDFLAGS=$SAVED_LDFLAGS
533 AC_MSG_RESULT($G_MODULE_LDFLAGS)
534 if test "x$G_MODULE_LDFLAGS" = "xnone"; then
537 AC_CHECK_LIB(dld, shl_load,
539 G_MODULE_IMPL=G_MODULE_IMPL_DLD
542 dnl *** additional checks for G_MODULE_IMPL_DL
543 if test "$G_MODULE_IMPL" = "G_MODULE_IMPL_DL"; then
546 G_MODULE_LDFLAGS='-rdynamic'
550 LDFLAGS_orig="$LDFLAGS"
551 LIBS="$LIBS $G_MODULE_LIBS"
552 LDFLAGS="$LDFLAGS $G_MODULE_LDFLAGS"
553 dnl *** check whether we need preceeding underscores
554 AC_MSG_CHECKING(for preceeding underscore in symbols)
555 AC_CACHE_VAL(glib_cv_uscore,[
558 int glib_underscore_test (void) { return 42; }
560 void *f1 = (void*)0, *f2 = (void*)0, *handle;
561 handle = dlopen ((void*)0, 0);
563 f1 = dlsym (handle, "glib_underscore_test");
564 f2 = dlsym (handle, "_glib_underscore_test");
565 } return (!f2 || f1);
570 rm -f plugin.c plugin.o plugin.lo
572 AC_MSG_RESULT($glib_cv_uscore)
573 if test "x$glib_cv_uscore" = "xyes"; then
574 G_MODULE_NEED_USCORE=1
576 G_MODULE_NEED_USCORE=0
579 LDFLAGS="$LDFLAGS_orig"
580 dnl *** check for having dlerror()
581 AC_CHECK_FUNC(dlerror,
582 G_MODULE_HAVE_DLERROR=1,
583 G_MODULE_HAVE_DLERROR=0)
586 dnl *** done, have e got an implementation?
587 if test -z "$G_MODULE_IMPL"; then
590 AC_SUBST(G_MODULE_IMPL)
591 AC_SUBST(G_MODULE_LIBS)
592 AC_SUBST(G_MODULE_LIBS_EXTRA)
593 AC_SUBST(G_MODULE_PLUGIN_LIBS)
594 AC_SUBST(G_MODULE_LDFLAGS)
595 AC_SUBST(G_MODULE_HAVE_DLERROR)
596 AC_SUBST(G_MODULE_NEED_USCORE)
597 AC_SUBST(GLIB_DEBUG_FLAGS)
600 dnl ***********************
601 dnl *** g_thread checks ***
602 dnl ***********************
604 AC_ARG_WITH(threads, [ --with-threads=[none/posix/dce/solaris] specify a thread implementation to use],
605 if test "x$with_threads" = x; then
608 want_threads=$with_threads
611 if test "x$enable_threads" = "xno"; then
614 if test "x$want_threads" = "xnone"; then
618 dnl error and warning message
619 dnl *************************
621 THREAD_NO_IMPLEMENTATION="You do not have any known thread system on your
622 computer. GLib will not have a default thread implementation."
624 FLAG_DOES_NOT_WORK="I can't find the MACRO, that enables thread safety on your
625 platform (normaly it's "_REENTRANT"). I'll not use any flag on
626 compilation now, but then your programs might not work.
627 Please provide information on how it is done on your system."
629 LIBS_NOT_FOUND_1="I can't find the libraries for the thread implementation
632 LIBS_NOT_FOUND_2=". Please choose another thread implementation or
633 provide information on your thread implementation.
634 You can also run 'configure --disable-threads'
635 to compile without thread support."
637 FUNC_NO_GETPWUID_R="the 'g_get_(user_name|real_name|home_dir|tmp_dir)'
638 functions will not be MT-safe during their first call because
639 there is no working 'getpwuid_r' on your system."
641 FUNC_NO_LOCALTIME_R="the 'g_date_set_time' function will not be MT-safe
642 because there is no 'localtime_r' on your system."
644 dnl determination of thread implementation
645 dnl ***************************************
648 if test "x$want_threads" = xyes || test "x$want_threads" = xsolaris; then
651 AC_CHECK_LIB(thread, cond_init, have_threads=solaris)
655 if test "x$want_threads" = xyes || test "x$want_threads" = xposix \
656 || test "x$want_threads" = xdce; then
657 # -D_POSIX4A_DRAFT10_SOURCE is for DG/UX
658 # -U_OSF_SOURCE if for Digital UNIX 4.0d
659 GTHREAD_COMPILE_IMPL_DEFINES="-D_POSIX4A_DRAFT10_SOURCE -U_OSF_SOURCE"
660 glib_save_CPPFLAGS="$CPPFLAGS"
661 CPPFLAGS="$CPPFLAGS $GTHREAD_COMPILE_IMPL_DEFINES"
662 if test "x$have_threads" = xnone; then
663 AC_EGREP_HEADER([[^a-zA-Z_]pthread_attr_init[^a-zA-Z_]],
667 if test "x$have_threads" = xnone; then
668 AC_EGREP_HEADER([[^a-zA-Z_]pthread_attr_create[^a-zA-Z_]],
672 CPPFLAGS="$glib_save_CPPFLAGS"
675 AC_MSG_CHECKING(for thread implementation)
677 if test "x$have_threads" = xnone && test "x$want_threads" != xno; then
678 AC_MSG_RESULT(none available)
679 AC_MSG_WARN($THREAD_NO_IMPLEMENTATION)
681 AC_MSG_RESULT($have_threads)
685 dnl determination of G_THREAD_LIBS
686 dnl ******************************
693 case $have_threads in
696 glib_save_LIBS="$LIBS"
697 for thread_lib in "" pthread pthreads c_r thread dce; do
698 # This is not AC_CHECK_LIB to also work with function
699 # name mangling in header files.
700 if test x"$thread_lib" = x; then
704 add_thread_lib="-l$thread_lib"
705 IN=" in -l$thread_lib"
708 LIBS="$glib_save_LIBS $add_thread_lib"
710 AC_MSG_CHECKING(for pthread_join$IN)
711 AC_TRY_LINK([#include <pthread.h>],
712 [pthread_join(NULL,NULL)],
714 G_THREAD_LIBS="$add_thread_lib"
718 LIBS="$glib_save_LIBS"
719 mutex_has_default=yes
720 mutex_default_type='pthread_mutex_t'
721 mutex_default_init='PTHREAD_MUTEX_INITIALIZER'
722 mutex_header_file='pthread.h'
723 if test "x$have_threads" = "xposix"; then
724 g_threads_impl="POSIX"
729 AC_SUBST(GTHREAD_COMPILE_IMPL_DEFINES)
733 AC_CHECK_LIB(thread, cond_init, G_THREAD_LIBS="-lthread")
734 mutex_has_default=yes
735 mutex_default_type='mutex_t'
736 mutex_default_init="DEFAULTMUTEX"
737 mutex_header_file='thread.h'
738 g_threads_impl="SOLARIS"
741 g_threads_impl="NONE"
744 g_threads_impl="NONE"
749 if test "x$G_THREAD_LIBS" = xerror; then
750 AC_MSG_ERROR($LIBS_NOT_FOUND_1$have_threads$LIBS_NOT_FOUND_2)
755 G_THREAD_LIBS="-lbe -lroot -lglib "
756 G_THREAD_LIBS_EXTRA="-L\$(top_builddir_full)/.libs"
763 AC_MSG_CHECKING(thread related libraries)
764 AC_MSG_RESULT($G_THREAD_LIBS)
766 dnl determination of G_THREAD_CFLAGS
767 dnl ********************************
769 if test x"$enable_threads" = xyes; then
771 G_THREAD_CFLAGS="$G_THREAD_CFLAGS -D_REENTRANT" # good default guess
775 G_THREAD_CFLAGS="$G_THREAD_CFLAGS -D_THREAD_SAFE"
776 if test x"$GCC" = xyes; then
777 G_THREAD_CFLAGS="$G_THREAD_CFLAGS -mthreads"
781 G_THREAD_CFLAGS="$G_THREAD_CFLAGS -D_THREAD_SAFE"
783 # FreeBSD 2.2.x shiped with gcc 2.7.2.x, which doesn't support
788 # if we are not finding the ctime_r function, then we probably are
789 # not using the proper multithread flag
790 old_CPPFLAGS=$CPPFLAGS
791 CPPFLAGS="$CPPFLAGS $G_THREAD_CFLAGS"
792 # Note: Digital UNIX 4.0d #defines ctime_r to _Pctime_r for gcc.
793 AC_EGREP_HEADER([[^a-zA-Z_](_P)?ctime_r[^a-zA-Z_]], time.h, ,
795 AC_MSG_WARN($FLAG_DOES_NOT_WORK))
796 CPPFLAGS=$old_CPPFLAGS
798 AC_MSG_CHECKING(thread related cflags)
800 AC_MSG_RESULT($G_THREAD_CFLAGS)
805 dnl check for mt safe function variants and some posix functions
806 dnl ************************************************************
808 if test x"$enable_threads" = xyes; then
809 glib_save_LIBS="$LIBS"
810 glib_save_CFLAGS="$CFLAGS"
811 # we are not doing the following for now, as this might require glib
812 # to always be linked with the thread libs on some platforms.
813 # LIBS="$LIBS $G_THREAD_LIBS"
814 CFLAGS="$CFLAGS $G_THREAD_CFLAGS"
815 AC_CHECK_FUNCS(localtime_r)
816 if test "$ac_cv_header_pwd_h" = "yes"; then
817 AC_MSG_CHECKING([for getpwuid_r])
818 AC_CACHE_VAL(ac_cv_func_getpwuid_r,
819 [AC_TRY_RUN([#include <errno.h>
820 int main () { char buffer[10000], *pointer;
821 char getpwuid_r (long, void*, void*,
824 getpwuid_r (0, &buffer, &buffer,
825 sizeof (buffer), &pointer);
826 return errno == ENOSYS;}],
827 [ac_cv_func_getpwuid_r=yes],
828 [ac_cv_func_getpwuid_r=no])])
829 if test "$ac_cv_func_getpwuid_r" = yes; then
831 AC_DEFINE(HAVE_GETPWUID_R)
835 if test "$ac_cv_func_getpwuid_r" = "yes"; then
836 AC_MSG_CHECKING(whether getpwuid_r is posix like)
837 # getpwuid_r(0, NULL, NULL, 0) is the signature on
838 # solaris, if that is not found, the prog below won't
839 # compile, then the posix signature is assumed as
841 AC_TRY_COMPILE([#include <pwd.h>],
842 [getpwuid_r(0, NULL, NULL, 0);],
845 AC_DEFINE(HAVE_GETPWUID_R_POSIX)])
848 LIBS="$LIBS $G_THREAD_LIBS"
849 if test x"$have_threads" = xposix; then
850 GLIB_SIZEOF([#include <pthread.h>],
853 # This is not AC_CHECK_FUNC to also work with function
854 # name mangling in header files.
855 AC_MSG_CHECKING(for pthread_attr_setstacksize)
856 AC_TRY_LINK([#include <pthread.h>],
857 [pthread_attr_setstacksize(NULL,0)],
859 AC_DEFINE(HAVE_PTHREAD_ATTR_SETSTACKSIZE)],
861 # If sched_get_priority_min(SCHED_OTHER) returns something
862 # negative, we ignore it. This happens on Solaris.
863 AC_MSG_CHECKING(for minimal/maximal thread priority)
864 AC_TRY_RUN([#include <pthread.h>
866 { return sched_get_priority_min(SCHED_OTHER) < 0;}],
867 [posix_priority_min="sched_get_priority_min(SCHED_OTHER)"
868 posix_priority_max="sched_get_priority_max(SCHED_OTHER)"],
869 [posix_priority_min=none])
870 if test x"$posix_priority_min" = xnone; then
871 AC_EGREP_CPP(PX_PRIO_MIN,[#include <pthread.h>
873 posix_priority_min=PX_PRIO_MIN
874 posix_priority_max=PX_PRIO_MAX])
876 if test x"$posix_priority_min" = xnone; then
877 AC_EGREP_CPP(PRI_OTHER_MIN,[#include <pthread.h>
879 posix_priority_min=PRI_OTHER_MIN
880 posix_priority_max=PRI_OTHER_MAX])
882 if test x"$posix_priority_min" = xnone; then
886 posix_priority_max=127
890 if test x"$posix_priority_min" = xnone; then
891 AC_MSG_RESULT(none found)
892 AC_MSG_WARN($POSIX_NO_PRIORITIES)
896 AC_MSG_RESULT($posix_priority_min/$posix_priority_max)
898 AC_DEFINE_UNQUOTED(POSIX_MIN_PRIORITY,$posix_priority_min)
899 AC_DEFINE_UNQUOTED(POSIX_MAX_PRIORITY,$posix_priority_max)
900 posix_yield_func=none
901 AC_MSG_CHECKING(for posix yield function)
902 for yield_func in pthread_yield_np pthread_yield sched_yield \
904 AC_TRY_LINK([#include <pthread.h>],
906 [posix_yield_func="$yield_func"
909 if test x"$posix_yield_func" = xnone; then
910 AC_MSG_RESULT(none found)
911 AC_MSG_WARN($POSIX_NO_YIELD)
912 posix_yield_func="g_thread_sleep(1000)"
914 AC_MSG_RESULT($posix_yield_func)
915 posix_yield_func="$posix_yield_func()"
917 AC_DEFINE_UNQUOTED(POSIX_YIELD_FUNC,$posix_yield_func)
919 LIBS="$glib_save_LIBS"
920 CFLAGS="$glib_save_CFLAGS"
922 # now spit out all the warnings.
923 if test "$ac_cv_func_getpwuid_r" != "yes"; then
924 AC_MSG_WARN($FUNC_NO_GETPWUID_R)
926 if test "$ac_cv_func_localtime_r" != "yes"; then
927 AC_MSG_WARN($FUNC_NO_LOCALTIME_R)
931 AC_DEFINE_UNQUOTED(G_THREAD_SOURCE,"gthread-$have_threads.c")
932 AC_SUBST(G_THREAD_CFLAGS)
933 AC_SUBST(G_THREAD_LIBS)
934 AC_SUBST(G_THREAD_LIBS_EXTRA)
936 CFLAGS="$CFLAGS $G_THREAD_CFLAGS"
938 dnl **********************************************
939 dnl *** GDefaultMutex setup and initialization ***
940 dnl **********************************************
942 dnl if mutex_has_default = yes, we also got
943 dnl mutex_default_type, mutex_default_init and mutex_header_file
944 GLIB_IF_VAR_EQ(mutex_has_default, yes,
945 GLIB_SIZEOF([#include <$mutex_header_file>],
949 GLIB_BYTE_CONTENTS([#include <$mutex_header_file>],
952 $glib_cv_sizeof_gmutex,
954 if test x"$have_threads" = xposix; then
955 GLIB_BYTE_CONTENTS([#define __USE_GNU
956 #include <$mutex_header_file>],
959 $glib_cv_sizeof_gmutex,
960 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP)
966 dnl ****************************************
967 dnl *** GLib POLL* compatibility defines ***
968 dnl ****************************************
970 [#include <sys/types.h>
971 #include <sys/poll.h>],
972 POLLIN:1 POLLOUT:4 POLLPRI:2 POLLERR:8 POLLHUP:16 POLLNVAL:32,
973 glibconfig-sysdefs.h,
977 dnl ******************************
978 dnl *** output the whole stuff ***
979 dnl ******************************
983 ## Generate `glibconfig.h' in two cases
984 ## 1. `config.status' is run either explicitly, or via configure.
985 ## Esp. not when it is run in `Makefile' to generate makefiles and
987 ## 2. CONFIG_OTHER is set explicitly
989 ## Case 1 is difficult. We know that `automake' sets one of
990 ## CONFIG_FILES or CONFIG_HEADERS to empty. This heuristic works
991 ## only when AM_CONFIG_HEADER is set, however.
993 if test -n "${CONFIG_FILES}" && test -n "${CONFIG_HEADERS}"; then
994 # Both CONFIG_FILES and CONFIG_HEADERS are non-empty ==> Case 1
995 CONFIG_OTHER=${CONFIG_OTHER:-glibconfig.h}
997 case "$CONFIG_OTHER" in
999 echo creating glibconfig.h
1000 outfile=glibconfig.h-tmp
1001 cat > $outfile <<\_______EOF
1004 * This is a generated file. Please modify `configure.in'
1007 #ifndef GLIBCONFIG_H
1008 #define GLIBCONFIG_H
1012 #endif /* __cplusplus */
1016 if test x$glib_limits_h = xyes; then
1017 echo '#include <limits.h>' >> $outfile
1019 if test x$glib_float_h = xyes; then
1020 echo '#include <float.h>' >> $outfile
1022 if test x$glib_values_h = xyes; then
1023 echo '#include <values.h>' >> $outfile
1025 if test x$g_mutex_header_file != x; then
1026 echo '#include <'"$g_mutex_header_file"'>' >> $outfile
1028 if test x$glib_sys_poll_h = xyes; then
1029 echo '#define GLIB_HAVE_SYS_POLL_H' >> $outfile
1032 cat >> $outfile <<_______EOF
1034 #define G_MINFLOAT $glib_mf
1035 #define G_MAXFLOAT $glib_Mf
1036 #define G_MINDOUBLE $glib_md
1037 #define G_MAXDOUBLE $glib_Md
1038 #define G_MINSHORT $glib_ms
1039 #define G_MAXSHORT $glib_Ms
1040 #define G_MAXUSHORT $glib_Mus
1041 #define G_MININT $glib_mi
1042 #define G_MAXINT $glib_Mi
1043 #define G_MAXUINT $glib_Mui
1044 #define G_MINLONG $glib_ml
1045 #define G_MAXLONG $glib_Ml
1046 #define G_MAXULONG $glib_Mul
1051 ### this should always be true in a modern C/C++ compiler
1052 cat >>$outfile <<_______EOF
1053 typedef signed char gint8;
1054 typedef unsigned char guint8;
1058 if test -n "$gint16"; then
1059 cat >>$outfile <<_______EOF
1060 typedef signed $gint16 gint16;
1061 typedef unsigned $gint16 guint16;
1062 #define G_GINT16_FORMAT $gint16_format
1063 #define G_GUINT16_FORMAT $guint16_format
1068 if test -n "$gint32"; then
1069 cat >>$outfile <<_______EOF
1070 typedef signed $gint32 gint32;
1071 typedef unsigned $gint32 guint32;
1072 #define G_GINT32_FORMAT $gint32_format
1073 #define G_GUINT32_FORMAT $guint32_format
1078 if test -n "$gint64"; then
1079 cat >>$outfile <<_______EOF
1080 ${glib_warning_guard}#define G_HAVE_GINT64 1
1082 ${glib_extension}typedef signed $gint64 gint64;
1083 ${glib_extension}typedef unsigned $gint64 guint64;
1085 #define G_GINT64_FORMAT $gint64_format
1086 #define G_GUINT64_FORMAT $guint64_format
1087 #define G_GINT64_CONSTANT(val) $gint64_constant
1092 if test -z "$glib_unknown_void_p"; then
1093 cat >>$outfile <<_______EOF
1095 #define GPOINTER_TO_INT(p) ((gint) ${glib_gpi_cast} (p))
1096 #define GPOINTER_TO_UINT(p) ((guint) ${glib_gpui_cast} (p))
1098 #define GINT_TO_POINTER(i) ((gpointer) ${glib_gpi_cast} (i))
1099 #define GUINT_TO_POINTER(u) ((gpointer) ${glib_gpui_cast} (u))
1102 echo '#error SIZEOF_VOID_P unknown - This should never happen' >>$outfile
1107 cat >>$outfile <<_______EOF
1115 #define G_HAVE_INLINE 1
1116 #else /* !__cplusplus */
1118 #endif /* !__cplusplus */
1122 if test x$g_mutex_has_default = xyes; then
1123 cat >>$outfile <<_______EOF
1124 $g_enable_threads_def G_THREADS_ENABLED
1125 #define G_THREADS_IMPL_$g_threads_impl_def
1126 typedef struct _GStaticMutex GStaticMutex;
1127 struct _GStaticMutex
1129 struct _GMutex *runtime_mutex;
1131 char pad[$g_mutex_sizeof];
1132 double dummy_double;
1133 void *dummy_pointer;
1137 #define G_STATIC_MUTEX_INIT { NULL, { { $g_mutex_contents} } }
1138 #define g_static_mutex_get_mutex(mutex) \
1139 (g_thread_use_default_impl ? ((GMutex*) &((mutex)->aligned_pad_u)) : \
1140 g_static_mutex_get_mutex_impl (&((mutex)->runtime_mutex)))
1143 cat >>$outfile <<_______EOF
1144 $g_enable_threads_def G_THREADS_ENABLED
1145 #define G_THREADS_IMPL_$g_threads_impl_def
1146 typedef struct _GMutex* GStaticMutex;
1147 #define G_STATIC_MUTEX_INIT NULL
1148 #define g_static_mutex_get_mutex(mutex) (g_static_mutex_get_mutex_impl (mutex))
1151 if test x$g_recmutex_contents != xno -a \
1152 x$g_recmutex_contents != x; then
1153 # the definition of GStaticRecMutex is not done via
1154 # typedef GStaticMutex GStaticRecMutex to avoid silent
1155 # compilation, when a GStaticRecMutex is used where a
1156 # GStaticMutex should have been used and vice versa,
1157 # because that micht fail on other platforms.
1158 cat >>$outfile <<_______EOF
1159 typedef struct _GStaticRecMutex GStaticRecMutex;
1160 struct _GStaticRecMutex
1162 struct _GMutex *runtime_mutex;
1164 char pad[$g_mutex_sizeof];
1165 double dummy_double;
1166 void *dummy_pointer;
1170 #define G_STATIC_REC_MUTEX_INIT { NULL, { { $g_recmutex_contents} } }
1171 #define g_static_rec_mutex_lock(mutex) g_static_mutex_lock (mutex)
1172 #define g_static_rec_mutex_trylock(mutex) g_static_mutex_trylock (mutex)
1173 #define g_static_rec_mutex_unlock(mutex) g_static_mutex_unlock (mutex)
1174 #define g_static_rec_mutex_get_mutex(mutex) (mutex)
1180 if test -n "$gint64"; then
1181 g_bit_sizes="$g_bit_sizes 64"
1183 for bits in $g_bit_sizes; do
1184 cat >>$outfile <<_______EOF
1185 #define GINT${bits}_TO_${g_bs_native}(val) ((gint${bits}) (val))
1186 #define GUINT${bits}_TO_${g_bs_native}(val) ((guint${bits}) (val))
1187 #define GINT${bits}_TO_${g_bs_alien}(val) ((gint${bits}) GUINT${bits}_SWAP_LE_BE (val))
1188 #define GUINT${bits}_TO_${g_bs_alien}(val) (GUINT${bits}_SWAP_LE_BE (val))
1192 cat >>$outfile <<_______EOF
1193 #define GLONG_TO_LE(val) ((glong) GINT${glongbits}_TO_LE (val))
1194 #define GULONG_TO_LE(val) ((gulong) GUINT${glongbits}_TO_LE (val))
1195 #define GLONG_TO_BE(val) ((glong) GINT${glongbits}_TO_BE (val))
1196 #define GULONG_TO_BE(val) ((gulong) GUINT${glongbits}_TO_BE (val))
1197 #define GINT_TO_LE(val) ((gint) GINT${gintbits}_TO_LE (val))
1198 #define GUINT_TO_LE(val) ((guint) GUINT${gintbits}_TO_LE (val))
1199 #define GINT_TO_BE(val) ((gint) GINT${gintbits}_TO_BE (val))
1200 #define GUINT_TO_BE(val) ((guint) GUINT${gintbits}_TO_BE (val))
1201 #define G_BYTE_ORDER $g_byte_order
1205 if test -r glibconfig-sysdefs.h; then
1206 cat glibconfig-sysdefs.h >>$outfile
1209 cat >>$outfile <<_______EOF
1212 #endif /* __cplusplus */
1214 #endif /* GLIBCONFIG_H */
1218 if cmp -s $outfile glibconfig.h; then
1219 echo glibconfig.h is unchanged
1222 mv $outfile glibconfig.h
1227 # Note that if two cases are the same, case goes with the first one.
1228 # Note also that this is inside an AC_OUTPUT_COMMAND. We do not depend
1229 # on variable expansion in case labels. Look at the generated config.status
1233 x$ac_cv_header_float_h)
1235 glib_mf=FLT_MIN glib_Mf=FLT_MAX
1236 glib_md=DBL_MIN glib_Md=DBL_MAX
1238 x$ac_cv_header_values_h)
1240 glib_mf=MINFLOAT glib_Mf=MAXFLOAT
1241 glib_md=MINDOUBLE glib_Md=MAXDOUBLE
1246 x$ac_cv_header_limits_h)
1248 glib_ms=SHRT_MIN glib_Ms=SHRT_MAX glib_Mus=USHRT_MAX
1249 glib_mi=INT_MIN glib_Mi=INT_MAX glib_Mui=UINT_MAX
1250 glib_ml=LONG_MIN glib_Ml=LONG_MAX glib_Mul=ULONG_MAX
1252 x$ac_cv_header_values_h)
1254 glib_ms=MINSHORT glib_Ms=MAXSHORT glib_Mus="(((gushort)G_MAXSHORT)*2+1)"
1255 glib_mi=MININT glib_Mi=MAXINT glib_Mui="(((guint)G_MAXINT)*2+1)"
1256 glib_ml=MINLONG glib_Ml=MAXLONG glib_Mul="(((gulong)G_MAXLONG)*2+1)"
1260 if test x$ac_cv_header_sys_poll_h = xyes ; then
1265 $ac_cv_sizeof_short)
1267 gint16_format='"hi"'
1268 guint16_format='"hu"'
1273 guint16_format='"u"'
1277 $ac_cv_sizeof_short)
1279 gint32_format='"hi"'
1280 guint32_format='"hu"'
1285 guint32_format='"u"'
1289 gint32_format='"li"'
1290 guint32_format='"lu"'
1297 guint64_format='"u"'
1300 gint64_constant='(val)'
1304 gint64_format='"li"'
1305 guint64_format='"lu"'
1308 gint64_constant='(val##L)'
1310 $ac_cv_sizeof_long_long)
1312 gint64_format='"'$glib_cv_long_long_format'i"'
1313 guint64_format='"'$glib_cv_long_long_format'u"'
1314 glib_extension='G_GNUC_EXTENSION '
1315 glib_warning_guard="
1316 #if defined (__GNUC__) && __GNUC__ >= 2 && __GNUC_MINOR__ >= 8
1317 # define G_GNUC_EXTENSION __extension__
1319 # define G_GNUC_EXTENSION
1323 gint64_constant='(G_GNUC_EXTENSION (val##LL))'
1327 gintbits=`expr $ac_cv_sizeof_int \* 8`
1328 glongbits=`expr $ac_cv_sizeof_long \* 8`
1331 case $ac_cv_sizeof_void_p in
1332 $ac_cv_sizeof_int) glib_gpi_cast='' glib_gpui_cast='' ;;
1333 $ac_cv_sizeof_long) glib_gpi_cast='(glong)' glib_gpui_cast='(gulong)' ;;
1334 *) glib_unknown_void_p=yes ;;
1339 x$ac_cv_func_atexit)
1341 #ifdef NeXT /* @#%@! NeXTStep */
1342 # define g_ATEXIT(proc) (!atexit (proc))
1344 # define g_ATEXIT(proc) (atexit (proc))
1347 x$ac_cv_func_on_exit)
1349 #define g_ATEXIT(proc) (on_exit ((void (*)(int, void*))(proc), NULL))"
1354 x$ac_cv_func_memmove)
1356 #define g_memmove(d,s,n) G_STMT_START { memmove ((d), (s), (n)); } G_STMT_END'
1358 x$glib_cv_working_bcopy)
1360 /* memmove isn't available, but bcopy can copy overlapping memory regions */
1361 #define g_memmove(d,s,n) G_STMT_START { bcopy ((s), (d), (n)); } G_STMT_END"
1365 /* memmove isn't found and bcopy can't copy overlapping memory regions,
1366 * so we have to roll our own copy routine. */
1367 void g_memmove (void* dest, const void * src, unsigned long len);"
1372 #define GLIB_MAJOR_VERSION $GLIB_MAJOR_VERSION
1373 #define GLIB_MINOR_VERSION $GLIB_MINOR_VERSION
1374 #define GLIB_MICRO_VERSION $GLIB_MICRO_VERSION
1378 x$glib_cv_va_copy) glib_vacopy='#define G_VA_COPY va_copy' ;;
1379 x$glib_cv___va_copy) glib_vacopy='#define G_VA_COPY __va_copy' ;;
1383 if test x$glib_cv_va_val_copy = xno; then
1384 glib_vacopy="\$glib_vacopy
1385 #define G_VA_COPY_AS_ARRAY 1"
1388 if test x$glib_cv_hasinline = xyes; then
1389 glib_inline='#define G_HAVE_INLINE 1'
1391 if test x$glib_cv_has__inline = xyes; then
1392 glib_inline="\$glib_inline
1393 #define G_HAVE___INLINE 1"
1395 if test x$glib_cv_has__inline__ = xyes; then
1396 glib_inline="\$glib_inline
1397 #define G_HAVE___INLINE__ 1"
1401 x$ac_cv_c_bigendian)
1402 g_byte_order=G_BIG_ENDIAN
1407 g_byte_order=G_LITTLE_ENDIAN
1413 case x$enable_threads in
1414 xyes) g_enable_threads_def="#define";;
1415 *) g_enable_threads_def="#undef ";;
1418 g_threads_impl_def=$g_threads_impl
1420 g_mutex_has_default="$mutex_has_default"
1421 g_mutex_sizeof="$glib_cv_sizeof_gmutex"
1422 g_mutex_contents="$glib_cv_byte_contents_gmutex"
1423 g_recmutex_contents="$glib_cv_byte_contents_grecmutex"
1425 if test "x$glib_native_beos" = "xyes"; then
1426 glib_native_beos_def="\$glib_native_beos_def
1427 #define GLIB_NATIVE_BEOS 1"
1435 gmodule/gmoduleconf.h
1440 ],[case "$CONFIG_FILES" in
1441 *glib-config*)chmod +x glib-config;;
1444 echo " *** IMPORTANT *** "
1446 echo "This is a development version of GLib. You should be using a stable"
1447 echo "version, which is available at ftp://ftp.gtk.org/pub/gtk/v1.2/. The"
1448 echo "version you just configured is meant for developers of GLib only:"
1450 echo " * You should not base stable software on this version of GLib."
1451 echo " * GNOME developers should use a stable version of GLib."
1453 echo "Distributions should *NOT* ship a development package of this GLib."
1454 echo "Do not ship the headers and do not ship the glib-config script. These"
1455 echo "things will conflict with the stable 1.2 series. Package only enough"
1456 echo "to satisfy the requirements of some other package. Package only the"
1457 echo "library itself. Doing otherwise will do no favors to the community."
1459 echo "If you install this version of GLib, we strongly recommend that you"
1460 echo "install it in a different prefix than GLib 1.2. Use --prefix as an"
1461 echo "argument to configure to do this. Otherwise, you will not be able to"
1462 echo "do development with GLib 1.2 any longer."
1464 echo " *** You should be using GLib 1.2 instead. ***"