# Configure script for c++tools # Copyright (C) 2020-2022 Free Software Foundation, Inc. # Written by Nathan Sidwell while at FaceBook # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; see the file COPYING3. If not see # . # C++ has grown a C++20 mapper server. This may be used to provide # and/or learn and/or build required modules. This sample server # shows how the protocol introduced by wg21.link/p1184 may be used. # By default g++ uses an in-process mapper. sinclude(../config/acx.m4) sinclude(../config/ax_lib_socket_nsl.m4) AC_INIT(c++tools) AC_CONFIG_SRCDIR([server.cc]) # Determine the noncanonical names used for directories. ACX_NONCANONICAL_TARGET AC_CANONICAL_SYSTEM AC_PROG_INSTALL test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' AC_SUBST(INSTALL_PROGRAM) AC_PROG_CXX MISSING=`cd $ac_aux_dir && ${PWDCMD-pwd}`/missing AC_CHECK_PROGS([AUTOCONF], [autoconf], [$MISSING autoconf]) AC_CHECK_PROGS([AUTOHEADER], [autoheader], [$MISSING autoheader]) AC_LANG(C++) dnl Enabled by default AC_MSG_CHECKING([whether to build C++ tools]) AC_ARG_ENABLE(c++-tools, [AS_HELP_STRING([--enable-c++-tools], [build auxiliary c++ tools])], cxx_aux_tools=$enableval, cxx_aux_tools=yes) AC_MSG_RESULT($cxx_aux_tools) CXX_AUX_TOOLS="$cxx_aux_tools" AC_SUBST(CXX_AUX_TOOLS) AC_ARG_ENABLE([maintainer-mode], AS_HELP_STRING([--enable-maintainer-mode], [enable maintainer mode. Add rules to rebuild configurey bits]),, [enable_maintainer_mode=no]) case "$enable_maintainer_mode" in yes) maintainer_mode=yes ;; no) maintainer_mode=no ;; *) AC_MSG_ERROR([unknown maintainer mode $enable_maintainer_mode]) ;; esac AC_MSG_CHECKING([maintainer-mode]) AC_MSG_RESULT([$maintainer_mode]) test "$maintainer_mode" = yes && MAINTAINER=yes AC_SUBST(MAINTAINER) # Handle configuration of checking; for the tools in this directory we # default to release checking and stricter checks do not change this. AC_ARG_ENABLE(checking, [AS_HELP_STRING([[--enable-checking[=LIST]]], [enable expensive run-time checks. With LIST, enable only specific categories of checks. Categories are: yes,no,all,none,release.])], [ac_checking_flags="${enableval}"],[ # Default to checking. ac_checking_flags=yes ]) IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="$IFS," for check in release $ac_checking_flags do case $check in # these set all the flags to specific states yes|all|release|assert) ac_assert_checking=1 ; ;; no|none) ac_assert_checking= ; ;; *) ;; esac done IFS="$ac_save_IFS" if test x$ac_assert_checking != x ; then AC_DEFINE(ENABLE_ASSERT_CHECKING, 1, [Define if you want assertions enabled. This is a cheap check.]) fi # Check whether --enable-default-pie was given. AC_ARG_ENABLE(default-pie, [AS_HELP_STRING([--enable-default-pie], [enable Position Independent Executable as default])], [PIEFLAG=-fPIE], [PIEFLAG=]) AC_SUBST([PIEFLAG]) # Check if O_CLOEXEC is defined by fcntl AC_CACHE_CHECK(for O_CLOEXEC, ac_cv_o_cloexec, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]], [[ return open ("/dev/null", O_RDONLY | O_CLOEXEC);]])], [ac_cv_o_cloexec=yes],[ac_cv_o_cloexec=no])]) if test $ac_cv_o_cloexec = yes; then AC_DEFINE(HOST_HAS_O_CLOEXEC, 1, [Define if O_CLOEXEC supported by fcntl.]) fi AC_CHECK_HEADERS(sys/mman.h) # C++ Modules would like some networking features to provide the mapping # server. You can still use modules without them though. # The following network-related checks could probably do with some # Windows and other non-linux defenses and checking. # Local socket connectivity wants AF_UNIX networking # Check for AF_UNIX networking AC_CACHE_CHECK(for AF_UNIX, ac_cv_af_unix, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include #include #include ]],[[ sockaddr_un un; un.sun_family = AF_UNSPEC; int fd = socket (AF_UNIX, SOCK_STREAM, 0); connect (fd, (sockaddr *)&un, sizeof (un));]])], [ac_cv_af_unix=yes], [ac_cv_af_unix=no])]) if test $ac_cv_af_unix = yes; then AC_DEFINE(HAVE_AF_UNIX, 1, [Define if AF_UNIX supported.]) fi # Remote socket connectivity wants AF_INET6 networking # Check for AF_INET6 networking AC_CACHE_CHECK(for AF_INET6, ac_cv_af_inet6, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include #include #include ]],[[ sockaddr_in6 in6; in6.sin6_family = AF_UNSPEC; struct addrinfo *addrs = 0; struct addrinfo hints; hints.ai_flags = 0; hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = 0; hints.ai_canonname = 0; hints.ai_addr = 0; hints.ai_next = 0; int e = getaddrinfo ("localhost", 0, &hints, &addrs); const char *str = gai_strerror (e); freeaddrinfo (addrs); int fd = socket (AF_INET6, SOCK_STREAM, 0); connect (fd, (sockaddr *)&in6, sizeof (in6));]])], [ac_cv_af_inet6=yes], [ac_cv_af_inet6=no])]) if test $ac_cv_af_inet6 = yes; then AC_DEFINE(HAVE_AF_INET6, 1, [Define if AF_INET6 supported.]) fi # Efficient server response wants epoll # Check for epoll_create, epoll_ctl, epoll_pwait AC_CACHE_CHECK(for epoll, ac_cv_epoll, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]],[[ int fd = epoll_create (1); epoll_event ev; ev.events = EPOLLIN; ev.data.fd = 0; epoll_ctl (fd, EPOLL_CTL_ADD, 0, &ev); epoll_pwait (fd, 0, 0, -1, 0);]])], [ac_cv_epoll=yes], [ac_cv_epoll=no])]) if test $ac_cv_epoll = yes; then AC_DEFINE(HAVE_EPOLL, 1, [Define if epoll_create, epoll_ctl, epoll_pwait provided.]) fi # If we can't use epoll, try pselect. # Check for pselect AC_CACHE_CHECK(for pselect, ac_cv_pselect, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]],[[ pselect (0, 0, 0, 0, 0, 0);]])], [ac_cv_pselect=yes], [ac_cv_pselect=no])]) if test $ac_cv_pselect = yes; then AC_DEFINE(HAVE_PSELECT, 1, [Define if pselect provided.]) fi # And failing that, use good old select. # If we can't even use this, the server is serialized. # Check for select AC_CACHE_CHECK(for select, ac_cv_select, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]],[[ select (0, 0, 0, 0, 0);]])], [ac_cv_select=yes], [ac_cv_select=no])]) if test $ac_cv_select = yes; then AC_DEFINE(HAVE_SELECT, 1, [Define if select provided.]) fi # Avoid some fnctl calls by using accept4, when available. # Check for accept4 AC_CACHE_CHECK(for accept4, ac_cv_accept4, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include ]],[[ int err = accept4 (1, 0, 0, SOCK_NONBLOCK);]])], [ac_cv_accept4=yes], [ac_cv_accept4=no])]) if test $ac_cv_accept4 = yes; then AC_DEFINE(HAVE_ACCEPT4, 1, [Define if accept4 provided.]) fi # For better server messages, look for a way to stringize network addresses # Check for inet_ntop AC_CACHE_CHECK(for inet_ntop, ac_cv_inet_ntop, [ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #include ]],[[ sockaddr_in6 in6; char buf[INET6_ADDRSTRLEN]; const char *str = inet_ntop (AF_INET6, &in6, buf, sizeof (buf));]])], [ac_cv_inet_ntop=yes], [ac_cv_inet_ntop=no])]) if test $ac_cv_inet_ntop = yes; then AC_DEFINE(HAVE_INET_NTOP, 1, [Define if inet_ntop provided.]) fi # Determine what GCC version number to use in filesystem paths. GCC_BASE_VER # Solaris needs libsocket and libnsl for socket functions before 11.4. # libcody uses those. save_LIBS="$LIBS" LIBS= AX_LIB_SOCKET_NSL NETLIBS="$LIBS" LIBS="$save_LIBS" AC_SUBST(NETLIBS) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT