Home | History | Annotate | Line # | Download | only in m4
      1 dnl Copyright (C) 1997-2024 Free Software Foundation, Inc.
      2 dnl
      3 dnl This program is free software; you can redistribute it and/or modify
      4 dnl it under the terms of the GNU General Public License as published by
      5 dnl the Free Software Foundation; either version 3 of the License, or
      6 dnl (at your option) any later version.
      7 dnl
      8 dnl This program is distributed in the hope that it will be useful,
      9 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
     10 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11 dnl GNU General Public License for more details.
     12 dnl
     13 dnl You should have received a copy of the GNU General Public License
     14 dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15 dnl
     16 dnl Check for various platform settings.
     17 AC_DEFUN([SIM_AC_PLATFORM],
     18 [dnl
     19 dnl Check for common headers.
     20 dnl NB: You can assume C11 headers exist.
     21 dnl NB: We use gnulib from ../gnulib/, so we don't probe headers it provides.
     22 AC_CHECK_HEADERS_ONCE(m4_flatten([
     23   dlfcn.h
     24   fcntl.h
     25   fpu_control.h
     26   termios.h
     27   utime.h
     28   linux/if_tun.h
     29   linux/mii.h
     30   linux/types.h
     31   net/if.h
     32   netinet/in.h
     33   netinet/tcp.h
     34   sys/ioctl.h
     35   sys/mman.h
     36   sys/mount.h
     37   sys/param.h
     38   sys/resource.h
     39   sys/socket.h
     40   sys/statfs.h
     41   sys/termio.h
     42   sys/termios.h
     43   sys/types.h
     44   sys/vfs.h
     45 ]))
     46 AC_HEADER_DIRENT
     47 
     48 dnl NB: We use gnulib from ../gnulib/, so we don't probe functions it provides.
     49 AC_CHECK_FUNCS_ONCE(m4_flatten([
     50   __setfpucw
     51   access
     52   aint
     53   anint
     54   cfgetispeed
     55   cfgetospeed
     56   cfsetispeed
     57   cfsetospeed
     58   chdir
     59   chmod
     60   dup
     61   dup2
     62   execv
     63   execve
     64   fcntl
     65   fork
     66   fstat
     67   fstatfs
     68   ftruncate
     69   getdirentries
     70   getegid
     71   geteuid
     72   getgid
     73   getpid
     74   getppid
     75   getrusage
     76   gettimeofday
     77   getuid
     78   ioctl
     79   kill
     80   link
     81   lseek
     82   lstat
     83   mkdir
     84   mmap
     85   munmap
     86   pipe
     87   posix_fallocate
     88   pread
     89   rmdir
     90   setregid
     91   setreuid
     92   setgid
     93   setuid
     94   sigaction
     95   sigprocmask
     96   sqrt
     97   stat
     98   strsignal
     99   symlink
    100   tcdrain
    101   tcflow
    102   tcflush
    103   tcgetattr
    104   tcgetpgrp
    105   tcsendbreak
    106   tcsetattr
    107   tcsetpgrp
    108   time
    109   truncate
    110   umask
    111   unlink
    112   utime
    113 ]))
    114 
    115 AC_STRUCT_ST_BLKSIZE
    116 AC_STRUCT_ST_BLOCKS
    117 AC_STRUCT_ST_RDEV
    118 AC_STRUCT_TIMEZONE
    119 
    120 AC_CHECK_MEMBERS([[struct stat.st_dev], [struct stat.st_ino],
    121 [struct stat.st_mode], [struct stat.st_nlink], [struct stat.st_uid],
    122 [struct stat.st_gid], [struct stat.st_rdev], [struct stat.st_size],
    123 [struct stat.st_blksize], [struct stat.st_blocks], [struct stat.st_atime],
    124 [struct stat.st_mtime], [struct stat.st_ctime]], [], [],
    125 [[#ifdef HAVE_SYS_TYPES_H
    126 #include <sys/types.h>
    127 #endif
    128 #include <sys/stat.h>]])
    129 
    130 AC_CHECK_TYPES([__int128])
    131 AC_CHECK_TYPES(socklen_t, [], [],
    132 [#include <sys/types.h>
    133 #include <sys/socket.h>
    134 ])
    135 
    136 AC_CHECK_SIZEOF([void *])
    137 
    138 dnl Check for struct statfs.
    139 AC_CACHE_CHECK([for struct statfs],
    140   [sim_cv_struct_statfs],
    141   [AC_TRY_COMPILE([
    142 #include <sys/types.h>
    143 #ifdef HAVE_SYS_PARAM_H
    144 #include <sys/param.h>
    145 #endif
    146 #ifdef HAVE_SYS_MOUNT_H
    147 #include <sys/mount.h>
    148 #endif
    149 #ifdef HAVE_SYS_VFS_H
    150 #include <sys/vfs.h>
    151 #endif
    152 #ifdef HAVE_SYS_STATFS_H
    153 #include <sys/statfs.h>
    154 #endif], [
    155   struct statfs s;
    156 ], [sim_cv_struct_statfs="yes"], [sim_cv_struct_statfs="no"])])
    157 AS_IF([test x"sim_cv_struct_statfs" = x"yes"], [dnl
    158   AC_DEFINE(HAVE_STRUCT_STATFS, 1,
    159 	    [Define if struct statfs is defined in <sys/mount.h>])
    160 ])
    161 
    162 dnl Some System V related checks.
    163 AC_CACHE_CHECK([if union semun defined],
    164   [sim_cv_has_union_semun],
    165   [AC_TRY_COMPILE([
    166 #include <sys/types.h>
    167 #include <sys/ipc.h>
    168 #include <sys/sem.h>], [
    169   union semun arg;
    170 ], [sim_cv_has_union_semun="yes"], [sim_cv_has_union_semun="no"])])
    171 AS_IF([test x"$sim_cv_has_union_semun" = x"yes"], [dnl
    172   AC_DEFINE(HAVE_UNION_SEMUN, 1,
    173 	    [Define if union semun is defined in <sys/sem.h>])
    174 ])
    175 
    176 AC_CACHE_CHECK([whether System V semaphores are supported],
    177   [sim_cv_sysv_sem],
    178   [AC_TRY_COMPILE([
    179   #include <sys/types.h>
    180   #include <sys/ipc.h>
    181   #include <sys/sem.h>
    182 #ifndef HAVE_UNION_SEMUN
    183   union semun {
    184     int val;
    185     struct semid_ds *buf;
    186     ushort *array;
    187   };
    188 #endif], [
    189   union semun arg;
    190   int id = semget(IPC_PRIVATE, 1, IPC_CREAT|0400);
    191   if (id == -1)
    192     return 1;
    193   arg.val = 0; /* avoid implicit type cast to union */
    194   if (semctl(id, 0, IPC_RMID, arg) == -1)
    195     return 1;
    196 ], [sim_cv_sysv_sem="yes"], [sim_cv_sysv_sem="no"])])
    197 AS_IF([test x"$sim_cv_sysv_sem" = x"yes"], [dnl
    198   AC_DEFINE(HAVE_SYSV_SEM, 1, [Define if System V semaphores are supported])
    199 ])
    200 
    201 AC_CACHE_CHECK([whether System V shared memory is supported],
    202   [sim_cv_sysv_shm],
    203   [AC_TRY_COMPILE([
    204 #include <sys/types.h>
    205 #include <sys/ipc.h>
    206 #include <sys/shm.h>], [
    207   int id = shmget(IPC_PRIVATE, 1, IPC_CREAT|0400);
    208   if (id == -1)
    209     return 1;
    210   if (shmctl(id, IPC_RMID, 0) == -1)
    211     return 1;
    212 ], [sim_cv_sysv_shm="yes"], [sim_cv_sysv_shm="no"])])
    213 AS_IF([test x"$sim_cv_sysv_shm" = x"yes"], [dnl
    214   AC_DEFINE(HAVE_SYSV_SHM, 1, [Define if System V shared memory is supported])
    215 ])
    216 
    217 dnl Figure out what type of termio/termios support there is
    218 AC_CACHE_CHECK([for struct termios],
    219   [sim_cv_termios_struct],
    220   [AC_TRY_COMPILE([
    221 #include <sys/types.h>
    222 #include <sys/termios.h>], [
    223   static struct termios x;
    224   x.c_iflag = 0;
    225   x.c_oflag = 0;
    226   x.c_cflag = 0;
    227   x.c_lflag = 0;
    228   x.c_cc[NCCS] = 0;
    229 ], [sim_cv_termios_struct="yes"], [sim_cv_termios_struct="no"])])
    230 if test $sim_cv_termios_struct = yes; then
    231   AC_DEFINE([HAVE_TERMIOS_STRUCTURE], 1, [Define if struct termios exists.])
    232 fi
    233 
    234 if test "$sim_cv_termios_struct" = "yes"; then
    235   AC_CACHE_VAL([sim_cv_termios_cline])
    236   AC_CHECK_MEMBER(
    237     [struct termios.c_line],
    238     [sim_cv_termios_cline="yes"],
    239     [sim_cv_termios_cline="no"], [
    240 #include <sys/types.h>
    241 #include <sys/termios.h>
    242 ])
    243   if test $sim_cv_termios_cline = yes; then
    244     AC_DEFINE([HAVE_TERMIOS_CLINE], 1, [Define if struct termios has c_line.])
    245   fi
    246 else
    247   sim_cv_termios_cline=no
    248 fi
    249 
    250 if test "$sim_cv_termios_struct" != "yes"; then
    251   AC_CACHE_CHECK([for struct termio],
    252     [sim_cv_termio_struct],
    253     [AC_TRY_COMPILE([
    254 #include <sys/types.h>
    255 #include <sys/termio.h>], [
    256   static struct termio x;
    257   x.c_iflag = 0;
    258   x.c_oflag = 0;
    259   x.c_cflag = 0;
    260   x.c_lflag = 0;
    261   x.c_cc[NCC] = 0;
    262 ], [sim_cv_termio_struct="yes"], [sim_cv_termio_struct="no"])])
    263   if test $sim_cv_termio_struct = yes; then
    264     AC_DEFINE([HAVE_TERMIO_STRUCTURE], 1, [Define if struct termio exists.])
    265   fi
    266 else
    267   sim_cv_termio_struct=no
    268 fi
    269 
    270 if test "$sim_cv_termio_struct" = "yes"; then
    271   AC_CACHE_VAL([sim_cv_termio_cline])
    272   AC_CHECK_MEMBER(
    273     [struct termio.c_line],
    274     [sim_cv_termio_cline="yes"],
    275     [sim_cv_termio_cline="no"], [
    276 #include <sys/types.h>
    277 #include <sys/termio.h>
    278 ])
    279   if test $sim_cv_termio_cline = yes; then
    280     AC_DEFINE([HAVE_TERMIO_CLINE], 1, [Define if struct termio has c_line.])
    281   fi
    282 else
    283   sim_cv_termio_cline=no
    284 fi
    285 
    286 dnl Types used by common code
    287 AC_TYPE_GETGROUPS
    288 AC_TYPE_MODE_T
    289 AC_TYPE_OFF_T
    290 AC_TYPE_PID_T
    291 AC_TYPE_SIGNAL
    292 AC_TYPE_SIZE_T
    293 AC_TYPE_UID_T
    294 
    295 LT_INIT
    296 
    297 dnl Libraries.
    298 AC_SEARCH_LIBS([bind], [socket])
    299 AC_SEARCH_LIBS([gethostbyname], [nsl])
    300 AC_SEARCH_LIBS([fabs], [m])
    301 AC_SEARCH_LIBS([log2], [m])
    302 
    303 AC_SEARCH_LIBS([dlopen], [dl])
    304 if test "${ac_cv_search_dlopen}" = "none required" || test "${ac_cv_lib_dl_dlopen}" = "yes"; then
    305   PKG_CHECK_MODULES(SDL, sdl2, [dnl
    306     SDL_CFLAGS="${SDL_CFLAGS} -DHAVE_SDL=2"
    307   ], [
    308     PKG_CHECK_MODULES(SDL, sdl, [dnl
    309       SDL_CFLAGS="${SDL_CFLAGS} -DHAVE_SDL=1"
    310     ], [:])
    311   ])
    312   dnl If we use SDL, we need dlopen support.
    313   AS_IF([test -n "$SDL_CFLAGS"], [dnl
    314     AS_IF([test "$ac_cv_search_dlopen" = no], [dnl
    315       AC_MSG_WARN([SDL support requires dlopen support])
    316     ])
    317   ])
    318 else
    319   SDL_CFLAGS=
    320 fi
    321 dnl We dlopen the libs at runtime, so never pass down SDL_LIBS.
    322 SDL_LIBS=
    323 AC_SUBST(SDL_CFLAGS)
    324 
    325 dnl In the Cygwin environment, we need some additional flags.
    326 AC_CACHE_CHECK([for cygwin], sim_cv_os_cygwin,
    327 [AC_EGREP_CPP(lose, [
    328 #ifdef __CYGWIN__
    329 lose
    330 #endif],[sim_cv_os_cygwin=yes],[sim_cv_os_cygwin=no])])
    331 
    332 dnl Keep in sync with gdb's configure.ac list.
    333 AC_SEARCH_LIBS(tgetent, [termcap tinfo curses ncurses],
    334   [TERMCAP_LIB=$ac_cv_search_tgetent], [TERMCAP_LIB=""])
    335 if test x$sim_cv_os_cygwin = xyes; then
    336   TERMCAP_LIB="${TERMCAP_LIB} -luser32"
    337 fi
    338 AC_SUBST(TERMCAP_LIB)
    339 
    340 dnl We prefer the in-tree readline.  Top-level dependencies make sure
    341 dnl src/readline (if it's there) is configured before src/sim.
    342 if test -r ../readline/Makefile; then
    343   READLINE_LIB=../readline/readline/libreadline.a
    344   READLINE_CFLAGS='-I$(READLINE_SRC)/..'
    345 else
    346   AC_CHECK_LIB(readline, readline, READLINE_LIB=-lreadline,
    347 	       AC_ERROR([the required "readline" library is missing]), $TERMCAP_LIB)
    348   READLINE_CFLAGS=
    349 fi
    350 AC_SUBST(READLINE_LIB)
    351 AC_SUBST(READLINE_CFLAGS)
    352 
    353 dnl Determine whether we have a known getopt prototype in unistd.h
    354 dnl to make sure that we have correct getopt declaration on
    355 dnl include/getopt.h.  The purpose of this is to sync with other Binutils
    356 dnl components and this logic is copied from ld/configure.ac.
    357 AC_MSG_CHECKING(for a known getopt prototype in unistd.h)
    358 AC_CACHE_VAL(sim_cv_decl_getopt_unistd_h,
    359 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <unistd.h>], [extern int getopt (int, char *const*, const char *);])],
    360 sim_cv_decl_getopt_unistd_h=yes, sim_cv_decl_getopt_unistd_h=no)])
    361 AC_MSG_RESULT($sim_cv_decl_getopt_unistd_h)
    362 if test $sim_cv_decl_getopt_unistd_h = yes; then
    363   AC_DEFINE([HAVE_DECL_GETOPT], 1,
    364 	    [Is the prototype for getopt in <unistd.h> in the expected format?])
    365 fi
    366 ])
    367