3 dnl Version not hardcoded here. Fetched later from ares_version.h
4 AC_INIT([c-ares], [1.11.0],
5 [c-ares mailing list: http://cool.haxx.se/mailman/listinfo/c-ares])
9 CARES_OVERRIDE_AUTOCONF
11 AC_CONFIG_SRCDIR([ares_ipv6.h])
12 AC_CONFIG_HEADERS([ares_config.h ares_build.h])
13 AC_CONFIG_MACRO_DIR([m4])
15 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
17 CARES_CHECK_OPTION_DEBUG
18 CARES_CHECK_OPTION_OPTIMIZE
19 CARES_CHECK_OPTION_WARNINGS
20 CARES_CHECK_OPTION_WERROR
21 CARES_CHECK_OPTION_CURLDEBUG
22 CARES_CHECK_OPTION_SYMBOL_HIDING
23 CARES_CHECK_OPTION_EXPOSE_STATICS
25 XC_CHECK_PATH_SEPARATOR
27 dnl SED is mandatory for configure process and libtool.
28 dnl Set it now, allowing it to be changed later.
29 AC_PATH_PROG([SED], [sed], [not_found],
30 [$PATH:/usr/bin:/usr/local/bin])
31 if test -z "$SED" || test "$SED" = "not_found"; then
32 AC_MSG_ERROR([sed not found in PATH. Cannot continue without sed.])
36 dnl GREP is mandatory for configure process and libtool.
37 dnl Set it now, allowing it to be changed later.
38 AC_PATH_PROG([GREP], [grep], [not_found],
39 [$PATH:/usr/bin:/usr/local/bin])
40 if test -z "$GREP" || test "$GREP" = "not_found"; then
41 AC_MSG_ERROR([grep not found in PATH. Cannot continue without grep.])
45 dnl EGREP is mandatory for configure process and libtool.
46 dnl Set it now, allowing it to be changed later.
47 if echo a | ($GREP -E '(a|b)') >/dev/null 2>&1; then
48 AC_MSG_CHECKING([for egrep])
50 AC_MSG_RESULT([$EGREP])
52 AC_PATH_PROG([EGREP], [egrep], [not_found],
53 [$PATH:/usr/bin:/usr/local/bin])
55 if test -z "$EGREP" || test "$EGREP" = "not_found"; then
56 AC_MSG_ERROR([egrep not found in PATH. Cannot continue without egrep.])
60 dnl AR is mandatory for configure process and libtool.
61 dnl This is target dependent, so check it as a tool.
62 AC_PATH_TOOL([AR], [ar], [not_found],
63 [$PATH:/usr/bin:/usr/local/bin])
64 if test -z "$AR" || test "$AR" = "not_found"; then
65 AC_MSG_ERROR([ar not found in PATH. Cannot continue without ar.])
71 dnl Remove non-configure distributed ares_build.h
72 if test -f ${srcdir}/ares_build.h; then
73 rm -f ${srcdir}/ares_build.h
77 dnl Detect the canonical host and target build environment
81 dnl Get system canonical name
82 AC_DEFINE_UNQUOTED(OS, "${host}", [cpu-machine-OS])
88 dnl This defines _ALL_SOURCE for AIX
89 CARES_CHECK_AIX_ALL_SOURCE
91 dnl Our configure and build reentrant settings
92 CARES_CONFIGURE_THREAD_SAFE
93 CARES_CONFIGURE_REENTRANT
95 dnl check for how to do large files
100 AC_DEFINE(ETC_INET, 1, [if a /etc/inet dir is being used])
107 # Automake conditionals based on libtool related checks
110 AM_CONDITIONAL([CARES_LT_SHLIB_USE_VERSION_INFO],
111 [test "x$xc_lt_shlib_use_version_info" = 'xyes'])
112 AM_CONDITIONAL([CARES_LT_SHLIB_USE_NO_UNDEFINED],
113 [test "x$xc_lt_shlib_use_no_undefined" = 'xyes'])
114 AM_CONDITIONAL([CARES_LT_SHLIB_USE_MIMPURE_TEXT],
115 [test "x$xc_lt_shlib_use_mimpure_text" = 'xyes'])
118 # Due to libtool and automake machinery limitations of not allowing
119 # specifying separate CPPFLAGS or CFLAGS when compiling objects for
120 # inclusion of these in shared or static libraries, we are forced to
121 # build using separate configure runs for shared and static libraries
122 # on systems where different CPPFLAGS or CFLAGS are mandatory in order
123 # to compile objects for each kind of library. Notice that relying on
124 # the '-DPIC' CFLAG that libtool provides is not valid given that the
125 # user might for example choose to build static libraries with PIC.
129 # Make our Makefile.am files use the staticlib CPPFLAG only when strictly
130 # targeting a static library and not building its shared counterpart.
133 AM_CONDITIONAL([USE_CPPFLAG_CARES_STATICLIB],
134 [test "x$xc_lt_build_static_only" = 'xyes'])
137 # Make staticlib CPPFLAG variable and its definition visible in output
138 # files unconditionally, providing an empty definition unless strictly
139 # targeting a static library and not building its shared counterpart.
142 CPPFLAG_CARES_STATICLIB=
143 if test "x$xc_lt_build_static_only" = 'xyes'; then
144 CPPFLAG_CARES_STATICLIB='-DCARES_STATICLIB'
146 AC_SUBST([CPPFLAG_CARES_STATICLIB])
148 dnl **********************************************************************
149 dnl platform/compiler/architecture specific checks/flags
150 dnl **********************************************************************
153 CARES_SET_COMPILER_BASIC_OPTS
154 CARES_SET_COMPILER_DEBUG_OPTS
155 CARES_SET_COMPILER_OPTIMIZE_OPTS
156 CARES_SET_COMPILER_WARNING_OPTS
158 if test "$compiler_id" = "INTEL_UNIX_C"; then
160 if test "$compiler_num" -ge "1000"; then
161 dnl icc 10.X or later
162 CFLAGS="$CFLAGS -shared-intel"
163 elif test "$compiler_num" -ge "900"; then
165 CFLAGS="$CFLAGS -i-dynamic"
170 CARES_CHECK_COMPILER_HALT_ON_ERROR
171 CARES_CHECK_COMPILER_ARRAY_SIZE_NEGATIVE
172 CARES_CHECK_COMPILER_PROTOTYPE_MISMATCH
173 CARES_CHECK_COMPILER_SYMBOL_HIDING
175 CARES_CHECK_CURLDEBUG
176 AM_CONDITIONAL(CURLDEBUG, test x$want_curldebug = xyes)
178 dnl **********************************************************************
179 dnl Compilation based checks should not be done before this point.
180 dnl **********************************************************************
182 dnl **********************************************************************
183 dnl Make sure that our checks for headers windows.h winsock.h winsock2.h
184 dnl and ws2tcpip.h take precedence over any other further checks which
185 dnl could be done later using AC_CHECK_HEADER or AC_CHECK_HEADERS for
186 dnl this specific header files. And do them before its results are used.
187 dnl **********************************************************************
189 CURL_CHECK_HEADER_WINDOWS
190 CURL_CHECK_NATIVE_WINDOWS
191 case X-"$ac_cv_native_windows" in
193 CURL_CHECK_HEADER_WINSOCK
194 CURL_CHECK_HEADER_WINSOCK2
195 CURL_CHECK_HEADER_WS2TCPIP
198 ac_cv_header_winsock_h="no"
199 ac_cv_header_winsock2_h="no"
200 ac_cv_header_ws2tcpip_h="no"
204 dnl **********************************************************************
205 dnl Checks for libraries.
206 dnl **********************************************************************
210 dnl gethostbyname without lib or in the nsl lib?
211 AC_CHECK_FUNC(gethostbyname,
212 [HAVE_GETHOSTBYNAME="1"
214 [ AC_CHECK_LIB(nsl, gethostbyname,
215 [HAVE_GETHOSTBYNAME="1"
220 if test "$HAVE_GETHOSTBYNAME" != "1"
222 dnl gethostbyname in the socket lib?
223 AC_CHECK_LIB(socket, gethostbyname,
224 [HAVE_GETHOSTBYNAME="1"
225 LIBS="$LIBS -lsocket"
229 dnl At least one system has been identified to require BOTH nsl and socket
230 dnl libs at the same time to link properly.
231 if test "$HAVE_GETHOSTBYNAME" != "1"
233 AC_MSG_CHECKING([for gethostbyname with both nsl and socket libs])
234 my_ac_save_LIBS=$LIBS
235 LIBS="-lnsl -lsocket $LIBS"
243 HAVE_GETHOSTBYNAME="1"
246 LIBS=$my_ac_save_LIBS
250 if test "$HAVE_GETHOSTBYNAME" != "1"
252 dnl This is for winsock systems
253 if test "$ac_cv_header_windows_h" = "yes"; then
254 if test "$ac_cv_header_winsock_h" = "yes"; then
257 winsock_LIB="-lwinsock"
260 winsock_LIB="-lwsock32"
264 if test "$ac_cv_header_winsock2_h" = "yes"; then
265 winsock_LIB="-lws2_32"
267 if test ! -z "$winsock_LIB"; then
268 my_ac_save_LIBS=$LIBS
269 LIBS="$winsock_LIB $LIBS"
270 AC_MSG_CHECKING([for gethostbyname in $winsock_LIB])
273 #ifdef HAVE_WINDOWS_H
274 #ifndef WIN32_LEAN_AND_MEAN
275 #define WIN32_LEAN_AND_MEAN
278 #ifdef HAVE_WINSOCK2_H
279 #include <winsock2.h>
281 #ifdef HAVE_WINSOCK_H
287 gethostbyname("www.dummysite.com");
291 HAVE_GETHOSTBYNAME="1"
295 LIBS=$my_ac_save_LIBS
301 if test "$HAVE_GETHOSTBYNAME" != "1"
303 dnl This is for Minix 3.1
304 AC_MSG_CHECKING([for gethostbyname for Minix 3])
307 /* Older Minix versions may need <net/gen/netdb.h> here instead */
310 gethostbyname("www.dummysite.com");
314 HAVE_GETHOSTBYNAME="1"
320 if test "$HAVE_GETHOSTBYNAME" != "1"
322 dnl This is for eCos with a stubbed DNS implementation
323 AC_MSG_CHECKING([for gethostbyname for eCos])
329 gethostbyname("www.dummysite.com");
333 HAVE_GETHOSTBYNAME="1"
339 if test "$HAVE_GETHOSTBYNAME" != "1"
341 dnl gethostbyname in the net lib - for BeOS
342 AC_CHECK_LIB(net, gethostbyname,
343 [HAVE_GETHOSTBYNAME="1"
349 if test "$HAVE_GETHOSTBYNAME" != "1"; then
350 AC_MSG_ERROR([couldn't find libraries for gethostbyname()])
353 dnl resolv lib for iPhone
354 AS_IF([test "x$host_vendor" = "xapple"], [
355 AC_MSG_CHECKING([for iPhone target])
358 #include "TargetConditionals.h"
360 #if TARGET_OS_IPHONE == 0
361 #error Not an iPhone target
367 AC_SEARCH_LIBS([res_servicename], [resolv], [
368 AC_DEFINE([CARES_USE_LIBRESOLV], [1], [Use resolver library to configure cares])
370 AC_MSG_ERROR([Unable to find libresolv which is required for iPhone targets])
378 AC_CHECK_FUNC(strcasecmp, , [ AC_CHECK_LIB(resolve, strcasecmp) ])
380 if test "$ac_cv_lib_resolve_strcasecmp" = "$ac_cv_func_strcasecmp"; then
381 AC_CHECK_LIB(resolve, strcasecmp,
382 [LIBS="-lresolve $LIBS"],
386 ac_cv_func_strcasecmp="no"
388 CARES_CHECK_LIBS_CONNECT
390 dnl **********************************************************************
391 dnl In case that function clock_gettime with monotonic timer is available,
392 dnl check for additional required libraries.
393 dnl **********************************************************************
394 CURL_CHECK_LIBS_CLOCK_GETTIME_MONOTONIC
396 AC_MSG_CHECKING([whether to use libgcc])
397 AC_ARG_ENABLE(libgcc,
398 AC_HELP_STRING([--enable-libgcc],[use libgcc when linking]),
399 [ case "$enableval" in
411 dnl Let's hope this split URL remains working:
412 dnl http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/aixprggd/ \
413 dnl genprogc/thread_quick_ref.htm
416 dnl **********************************************************************
417 dnl Back to "normal" configuring
418 dnl **********************************************************************
420 dnl Checks for header files.
423 CURL_CHECK_HEADER_MALLOC
424 CURL_CHECK_HEADER_MEMORY
426 dnl check for a few basic system headers we need
447 arpa/nameser_compat.h \
449 dnl to do if not found
455 #ifdef HAVE_SYS_TYPES_H
456 #include <sys/types.h>
458 #ifdef HAVE_SYS_TIME_H
459 #include <sys/time.h>
461 dnl We do this default-include simply to make sure that the nameser_compat.h
462 dnl header *REALLY* can be include after the new nameser.h. It seems AIX 5.1
463 dnl (and others?) is not designed to allow this.
464 #ifdef HAVE_ARPA_NAMESER_H
465 #include <arpa/nameser.h>
468 dnl *Sigh* these are needed in order for net/if.h to get properly detected.
469 #ifdef HAVE_SYS_SOCKET_H
470 #include <sys/socket.h>
472 #ifdef HAVE_NETINET_IN_H
473 #include <netinet/in.h>
478 dnl Checks for typedefs, structures, and compiler characteristics.
482 CURL_CHECK_STRUCT_TIMEVAL
484 AC_CHECK_SIZEOF(size_t)
485 AC_CHECK_SIZEOF(long)
487 AC_CHECK_SIZEOF(short)
488 AC_CHECK_SIZEOF(time_t)
490 AC_CHECK_TYPE(long long,
491 [AC_DEFINE(HAVE_LONGLONG, 1,
492 [Define to 1 if the compiler supports the 'long long' data type.])]
496 if test "xyes" = "x$longlong"; then
497 AC_MSG_CHECKING([if numberLL works])
501 long long val = 1000LL;
505 AC_DEFINE(HAVE_LL, 1, [if your compiler supports LL])
513 AC_CHECK_TYPE(ssize_t, ,
514 AC_DEFINE(ssize_t, int, [the signed version of size_t]))
516 # check for bool type
517 AC_CHECK_TYPE([bool],[
518 AC_DEFINE(HAVE_BOOL_T, 1,
519 [Define to 1 if bool is an available type.])
521 #ifdef HAVE_SYS_TYPES_H
522 #include <sys/types.h>
524 #ifdef HAVE_STDBOOL_H
529 CARES_CONFIGURE_ARES_SOCKLEN_T
533 TYPE_SOCKADDR_STORAGE
540 CURL_CHECK_FUNC_RECVFROM
542 CURL_CHECK_MSG_NOSIGNAL
544 CARES_CHECK_FUNC_CLOSESOCKET
545 CARES_CHECK_FUNC_CLOSESOCKET_CAMEL
546 CARES_CHECK_FUNC_CONNECT
547 CARES_CHECK_FUNC_FCNTL
548 CARES_CHECK_FUNC_FREEADDRINFO
549 CARES_CHECK_FUNC_GETADDRINFO
550 CARES_CHECK_FUNC_GETENV
551 CARES_CHECK_FUNC_GETHOSTBYADDR
552 CARES_CHECK_FUNC_GETHOSTBYNAME
553 CARES_CHECK_FUNC_GETHOSTNAME
554 CARES_CHECK_FUNC_GETSERVBYPORT_R
555 CARES_CHECK_FUNC_INET_NET_PTON
556 CARES_CHECK_FUNC_INET_NTOP
557 CARES_CHECK_FUNC_INET_PTON
558 CARES_CHECK_FUNC_IOCTL
559 CARES_CHECK_FUNC_IOCTLSOCKET
560 CARES_CHECK_FUNC_IOCTLSOCKET_CAMEL
561 CARES_CHECK_FUNC_SETSOCKOPT
562 CARES_CHECK_FUNC_SOCKET
563 CARES_CHECK_FUNC_STRCASECMP
564 CARES_CHECK_FUNC_STRCMPI
565 CARES_CHECK_FUNC_STRDUP
566 CARES_CHECK_FUNC_STRICMP
567 CARES_CHECK_FUNC_STRNCASECMP
568 CARES_CHECK_FUNC_STRNCMPI
569 CARES_CHECK_FUNC_STRNICMP
570 CARES_CHECK_FUNC_WRITEV
573 dnl check for AF_INET6
574 CARES_CHECK_CONSTANT(
577 #ifdef HAVE_WINDOWS_H
578 #ifndef WIN32_LEAN_AND_MEAN
579 #define WIN32_LEAN_AND_MEAN
582 #ifdef HAVE_WINSOCK2_H
583 #include <winsock2.h>
586 #ifdef HAVE_SYS_TYPES_H
587 #include <sys/types.h>
589 #ifdef HAVE_SYS_SOCKET_H
590 #include <sys/socket.h>
594 AC_DEFINE_UNQUOTED(HAVE_PF_INET6,1,[Define to 1 if you have PF_INET6.])
597 dnl check for PF_INET6
598 CARES_CHECK_CONSTANT(
601 #ifdef HAVE_WINDOWS_H
602 #ifndef WIN32_LEAN_AND_MEAN
603 #define WIN32_LEAN_AND_MEAN
606 #ifdef HAVE_WINSOCK2_H
607 #include <winsock2.h>
610 #ifdef HAVE_SYS_TYPES_H
611 #include <sys/types.h>
613 #ifdef HAVE_SYS_SOCKET_H
614 #include <sys/socket.h>
618 AC_DEFINE_UNQUOTED(HAVE_AF_INET6,1,[Define to 1 if you have AF_INET6.])
622 dnl check for the in6_addr structure
626 #ifdef HAVE_WINDOWS_H
627 #ifndef WIN32_LEAN_AND_MEAN
628 #define WIN32_LEAN_AND_MEAN
631 #ifdef HAVE_WINSOCK2_H
632 #include <winsock2.h>
633 #ifdef HAVE_WS2TCPIP_H
634 #include <ws2tcpip.h>
638 #ifdef HAVE_SYS_TYPES_H
639 #include <sys/types.h>
641 #ifdef HAVE_NETINET_IN_H
642 #include <netinet/in.h>
646 AC_DEFINE_UNQUOTED(HAVE_STRUCT_IN6_ADDR,1,[Define to 1 if you have struct in6_addr.])
649 dnl check for the sockaddr_in6 structure
653 #ifdef HAVE_WINDOWS_H
654 #ifndef WIN32_LEAN_AND_MEAN
655 #define WIN32_LEAN_AND_MEAN
658 #ifdef HAVE_WINSOCK2_H
659 #include <winsock2.h>
660 #ifdef HAVE_WS2TCPIP_H
661 #include <ws2tcpip.h>
665 #ifdef HAVE_SYS_TYPES_H
666 #include <sys/types.h>
668 #ifdef HAVE_NETINET_IN_H
669 #include <netinet/in.h>
673 AC_DEFINE_UNQUOTED(HAVE_STRUCT_SOCKADDR_IN6,1,
674 [Define to 1 if you have struct sockaddr_in6.]) ac_have_sockaddr_in6=yes
677 AC_CHECK_MEMBER(struct sockaddr_in6.sin6_scope_id,
678 AC_DEFINE_UNQUOTED(HAVE_SOCKADDR_IN6_SIN6_SCOPE_ID,1,
679 [Define to 1 if your struct sockaddr_in6 has sin6_scope_id.])
683 #ifdef HAVE_WINDOWS_H
684 #ifndef WIN32_LEAN_AND_MEAN
685 #define WIN32_LEAN_AND_MEAN
688 #ifdef HAVE_WINSOCK2_H
689 #include <winsock2.h>
690 #ifdef HAVE_WS2TCPIP_H
691 #include <ws2tcpip.h>
695 #ifdef HAVE_SYS_TYPES_H
696 #include <sys/types.h>
698 #ifdef HAVE_NETINET_IN_H
699 #include <netinet/in.h>
704 dnl check for the addrinfo structure
705 AC_CHECK_MEMBER(struct addrinfo.ai_flags,
706 AC_DEFINE_UNQUOTED(HAVE_STRUCT_ADDRINFO,1,
707 [Define to 1 if you have struct addrinfo.]),,
710 #ifdef HAVE_WINDOWS_H
711 #ifndef WIN32_LEAN_AND_MEAN
712 #define WIN32_LEAN_AND_MEAN
715 #ifdef HAVE_WINSOCK2_H
716 #include <winsock2.h>
717 #ifdef HAVE_WS2TCPIP_H
718 #include <ws2tcpip.h>
722 #ifdef HAVE_SYS_TYPES_H
723 #include <sys/types.h>
725 #ifdef HAVE_NETINET_IN_H
726 #include <netinet/in.h>
728 #ifdef HAVE_SYS_SOCKET_H
729 #include <sys/socket.h>
739 AC_CHECK_FUNCS([bitncmp \
745 AC_MSG_CHECKING([deeper for $func])
753 eval "ac_cv_func_$func=yes"
754 AC_DEFINE_UNQUOTED(XC_SH_TR_CPP([HAVE_$func]), [1],
755 [Define to 1 if you have the $func function.])
757 AC_MSG_RESULT([but still no])
762 AC_CHECK_SIZEOF(struct in6_addr, ,
765 #ifdef HAVE_WINDOWS_H
766 #ifndef WIN32_LEAN_AND_MEAN
767 #define WIN32_LEAN_AND_MEAN
770 #ifdef HAVE_WINSOCK2_H
771 #include <winsock2.h>
772 #ifdef HAVE_WS2TCPIP_H
773 #include <ws2tcpip.h>
777 #ifdef HAVE_SYS_TYPES_H
778 #include <sys/types.h>
780 #ifdef HAVE_SYS_SOCKET_H
781 #include <sys/socket.h>
783 #ifdef HAVE_NETINET_IN_H
784 #include <netinet/in.h>
790 AC_CHECK_SIZEOF(struct in_addr, ,
793 #ifdef HAVE_WINDOWS_H
794 #ifndef WIN32_LEAN_AND_MEAN
795 #define WIN32_LEAN_AND_MEAN
798 #ifdef HAVE_WINSOCK2_H
799 #include <winsock2.h>
800 #ifdef HAVE_WS2TCPIP_H
801 #include <ws2tcpip.h>
805 #ifdef HAVE_SYS_TYPES_H
806 #include <sys/types.h>
808 #ifdef HAVE_SYS_SOCKET_H
809 #include <sys/socket.h>
811 #ifdef HAVE_NETINET_IN_H
812 #include <netinet/in.h>
819 dnl Check if the getnameinfo function is available
820 dnl and get the types of five of its arguments.
821 CURL_CHECK_FUNC_GETNAMEINFO
825 [AC_DEFINE(ARES_BIG_ENDIAN, 1,
826 [define this if ares is built for a big endian system])],
828 [AC_MSG_WARN([couldn't figure out endianess, assuming little endian!])]
831 dnl Check for user-specified random device
833 AC_HELP_STRING([--with-random=FILE],
834 [read randomness from FILE (default=/dev/urandom)]),
835 [ RANDOM_FILE="$withval" ],
837 dnl Check for random device. If we're cross compiling, we can't
838 dnl check, and it's better to assume it doesn't exist than it is
839 dnl to fail on AC_CHECK_FILE or later.
840 if test "$cross_compiling" = "no"; then
841 AC_CHECK_FILE("/dev/urandom", [ RANDOM_FILE="/dev/urandom"] )
843 AC_MSG_WARN([cannot check for /dev/urandom while cross compiling; assuming none])
848 if test -n "$RANDOM_FILE" && test X"$RANDOM_FILE" != Xno ; then
849 AC_SUBST(RANDOM_FILE)
850 AC_DEFINE_UNQUOTED(RANDOM_FILE, "$RANDOM_FILE",
851 [a suitable file/device to read random data from])
854 CARES_CHECK_OPTION_NONBLOCKING
855 CARES_CHECK_NONBLOCKING_SOCKET
857 CARES_CONFIGURE_SYMBOL_HIDING
859 CARES_PRIVATE_LIBS="$LIBS"
860 AC_SUBST(CARES_PRIVATE_LIBS)
862 CARES_CFLAG_EXTRAS=""
863 if test X"$want_werror" = Xyes; then
864 CARES_CFLAG_EXTRAS="-Werror"
866 AC_SUBST(CARES_CFLAG_EXTRAS)
868 dnl squeeze whitespace out of some variables
876 squeeze CARES_PRIVATE_LIBS
880 if test "x$cross_compiling" = "xno"; then
881 AC_CONFIG_SUBDIRS([test])
884 AC_CONFIG_FILES([Makefile libcares.pc])
886 XC_AMEND_DISTCLEAN(['.'])