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