Declare language extensions via `{-# LANGUAGE -#}`
[packages/unix.git] / configure.ac
1 AC_INIT([Haskell unix package], [2.0], [libraries@haskell.org], [unix])
2
3 # Safety check: Ensure that we are in the correct source directory.
4 AC_CONFIG_SRCDIR([include/HsUnix.h])
5
6 AC_ARG_WITH([cc],
7             [C compiler],
8             [CC=$withval])
9 AC_PROG_CC()
10
11 AC_CONFIG_HEADERS([include/HsUnixConfig.h])
12
13 # Is this a Unix system?
14 AC_CHECK_HEADER([dlfcn.h], [BUILD_PACKAGE_BOOL=True], [BUILD_PACKAGE_BOOL=False])
15 AC_SUBST([BUILD_PACKAGE_BOOL])
16
17 AC_C_CONST
18
19 dnl ** Enable large file support.  NB. do this before testing the type of
20 dnl    off_t, because it will affect the result of that test.
21 AC_SYS_LARGEFILE
22
23 AC_CHECK_HEADERS([dirent.h fcntl.h grp.h limits.h pwd.h signal.h string.h])
24 AC_CHECK_HEADERS([sys/resource.h sys/stat.h sys/times.h sys/time.h])
25 AC_CHECK_HEADERS([sys/utsname.h sys/wait.h])
26 AC_CHECK_HEADERS([bsd/libutil.h libutil.h pty.h utmp.h])
27 AC_CHECK_HEADERS([termios.h time.h unistd.h utime.h])
28
29 AC_CHECK_FUNCS([getgrgid_r getgrnam_r getpwnam_r getpwuid_r getpwnam getpwuid])
30 AC_CHECK_FUNCS([getpwent getgrent])
31 AC_CHECK_FUNCS([lchown setenv sysconf unsetenv clearenv])
32 AC_CHECK_FUNCS([nanosleep])
33 AC_CHECK_FUNCS([ptsname])
34 AC_CHECK_FUNCS([setitimer])
35 AC_CHECK_FUNCS([readdir_r])
36 dnl not available on android so check for it
37 AC_CHECK_FUNCS([telldir seekdir])
38
39 AC_CHECK_MEMBERS([struct stat.st_atim])
40 AC_CHECK_MEMBERS([struct stat.st_mtim])
41 AC_CHECK_MEMBERS([struct stat.st_ctim])
42 AC_CHECK_MEMBERS([struct stat.st_atimespec])
43 AC_CHECK_MEMBERS([struct stat.st_mtimespec])
44 AC_CHECK_MEMBERS([struct stat.st_ctimespec])
45 AC_CHECK_MEMBERS([struct stat.st_atimensec])
46 AC_CHECK_MEMBERS([struct stat.st_mtimensec])
47 AC_CHECK_MEMBERS([struct stat.st_ctimensec])
48 AC_CHECK_MEMBERS([struct stat.st_atime_n])
49 AC_CHECK_MEMBERS([struct stat.st_mtime_n])
50 AC_CHECK_MEMBERS([struct stat.st_ctime_n])
51 AC_CHECK_MEMBERS([struct stat.st_uatime])
52 AC_CHECK_MEMBERS([struct stat.st_umtime])
53 AC_CHECK_MEMBERS([struct stat.st_uctime])
54
55 AC_CHECK_MEMBER([struct passwd.pw_gecos], [], [AC_DEFINE([HAVE_NO_PASSWD_PW_GECOS],[],[Ignore the pw_gecos member of passwd where it does not exist])], [[#include <pwd.h>]])
56
57 # Functions for changing file timestamps
58 AC_CHECK_FUNCS([utimensat futimens])
59 AC_CHECK_FUNCS([lutimes futimes])
60
61 # Additional temp functions
62 AC_CHECK_FUNCS([mkstemps mkdtemp])
63
64 # Avoid adding rt if absent or unneeded
65 # shm_open needs -lrt on linux
66 AC_SEARCH_LIBS(shm_open, rt, [AC_CHECK_FUNCS([shm_open shm_unlink])])
67 AS_IF([test "x$ac_cv_search_shm_open" = x-lrt], [EXTRA_LIBS="$EXTRA_LIBS rt"])
68
69 FP_CHECK_CONSTS([SIGABRT SIGALRM SIGBUS SIGCHLD SIGCONT SIGFPE SIGHUP SIGILL SIGINT SIGKILL SIGPIPE SIGQUIT SIGSEGV SIGSTOP SIGTERM SIGTSTP SIGTTIN SIGTTOU SIGUSR1 SIGUSR2 SIGPOLL SIGPROF SIGSYS SIGTRAP SIGURG SIGVTALRM SIGXCPU SIGXFSZ SIG_BLOCK SIG_SETMASK SIG_UNBLOCK], [
70 #if HAVE_SIGNAL_H
71 #include <signal.h>
72 #endif])
73
74 AC_MSG_CHECKING([for _SC_GETGR_R_SIZE_MAX])
75 AC_EGREP_CPP(we_have_that_sysconf_thing,
76 [
77 #include <unistd.h>
78 #ifdef _SC_GETGR_R_SIZE_MAX
79 we_have_that_sysconf_thing
80 #endif
81 ],
82 [AC_MSG_RESULT([yes])
83 AC_DEFINE([HAVE_SC_GETGR_R_SIZE_MAX], [1], [Define to 1 if <unistd.h> defines _SC_GETGR_R_SIZE_MAX.])],
84 [AC_MSG_RESULT([no])])
85
86 AC_MSG_CHECKING([for _SC_GETPW_R_SIZE_MAX])
87 AC_EGREP_CPP(we_have_that_sysconf_thing,
88 [
89 #include <unistd.h>
90 #ifdef _SC_GETPW_R_SIZE_MAX
91 we_have_that_sysconf_thing
92 #endif
93 ],
94 [AC_MSG_RESULT([yes])
95 AC_DEFINE([HAVE_SC_GETPW_R_SIZE_MAX], [1], [Define to 1 if <unistd.h> defines _SC_GETPW_R_SIZE_MAX.])],
96 [AC_MSG_RESULT([no])])
97
98 dnl ---------- usleep ----------
99 dnl --- stolen from guile configure ---
100
101 ### On some systems usleep has no return value.  If it does have one,
102 ### we'd like to return it; otherwise, we'll fake it.
103 AC_CACHE_CHECK([return type of usleep], fptools_cv_func_usleep_return_type,
104   [AC_EGREP_HEADER(changequote(<, >)<void[      ]+usleep>changequote([, ]),
105                    unistd.h,
106                    [fptools_cv_func_usleep_return_type=void],
107                    [fptools_cv_func_usleep_return_type=int])])
108 case "$fptools_cv_func_usleep_return_type" in
109   "void" )
110     AC_DEFINE([USLEEP_RETURNS_VOID], [1], [Define if the system headers declare usleep to return void.])
111   ;;
112 esac
113
114 ###  POSIX.1003.1 unsetenv returns 0 or -1 (EINVAL), but older implementations
115 ###  in common use return void.
116 AC_CACHE_CHECK([return type of unsetenv], fptools_cv_func_unsetenv_return_type,
117   [AC_EGREP_HEADER(changequote(<, >)<void[      ]+unsetenv>changequote([, ]),
118                    stdlib.h,
119                    [fptools_cv_func_unsetenv_return_type=void],
120                    [fptools_cv_func_unsetenv_return_type=int])])
121 case "$fptools_cv_func_unsetenv_return_type" in
122   "void" )
123     AC_DEFINE([UNSETENV_RETURNS_VOID], [1], [Define if stdlib.h declares unsetenv to return void.])
124   ;;
125 esac
126
127 dnl ** sometimes RTLD_NEXT is hidden in #ifdefs we really don't wan to set
128 AC_MSG_CHECKING(for RTLD_NEXT from dlfcn.h)
129 AC_EGREP_CPP(yes,
130 [
131  #include <dlfcn.h>
132  #ifdef RTLD_NEXT
133         yes
134  #endif
135 ], [
136   AC_MSG_RESULT(yes)
137   AC_DEFINE([HAVE_RTLDNEXT], [1], [Define to 1 if we can see RTLD_NEXT in dlfcn.h.])
138 ], [
139   AC_MSG_RESULT(no)
140   ])    
141
142 dnl ** RTLD_DEFAULT isn't available on cygwin
143 AC_MSG_CHECKING(for RTLD_DEFAULT from dlfcn.h)
144 AC_EGREP_CPP(yes,
145 [
146  #include <dlfcn.h>
147  #ifdef RTLD_DEFAULT
148         yes
149  #endif
150 ], [
151   AC_MSG_RESULT(yes)
152   AC_DEFINE([HAVE_RTLDDEFAULT], [1], [Define to 1 if RTLD_DEFAULT is available.])
153 ], [
154   AC_MSG_RESULT(no)
155   ])    
156
157 dnl ** RTLD_LOCAL isn't available on cygwin or openbsd
158 AC_MSG_CHECKING(for RTLD_LOCAL from dlfcn.h)
159 AC_EGREP_CPP(yes,
160 [
161  #include <dlfcn.h>
162  #ifdef RTLD_LOCAL
163         yes
164  #endif
165 ], [
166   AC_MSG_RESULT(yes)
167   AC_DEFINE([HAVE_RTLDLOCAL], [1], [Define to 1 if RTLD_LOCAL is available.])
168 ], [
169   AC_MSG_RESULT(no)
170   ])    
171
172 dnl ** RTLD_GLOBAL isn't available on openbsd
173 AC_MSG_CHECKING(for RTLD_GLOBAL from dlfcn.h)
174 AC_EGREP_CPP(yes,
175 [
176  #include <dlfcn.h>
177  #ifdef RTLD_GLOBAL
178         yes
179  #endif
180 ], [
181   AC_MSG_RESULT(yes)
182   AC_DEFINE([HAVE_RTLDGLOBAL], [1], [Define to 1 if RTLD_GLOBAL is available.])
183 ], [
184   AC_MSG_RESULT(no)
185   ])    
186
187 dnl ** RTLD_NOW isn't available on openbsd
188 AC_MSG_CHECKING(for RTLD_NOW from dlfcn.h)
189 AC_EGREP_CPP(yes,
190 [
191  #include <dlfcn.h>
192  #ifdef RTLD_NOW
193         yes
194  #endif
195 ], [
196   AC_MSG_RESULT(yes)
197   AC_DEFINE([HAVE_RTLDNOW], [1], [Define to 1 if we can see RTLD_NOW in dlfcn.h])
198 ], [
199   AC_MSG_RESULT(no)
200   ])    
201
202 AC_CHECK_FUNCS(openpty,,
203    AC_CHECK_LIB(util,openpty,
204      [AC_DEFINE(HAVE_OPENPTY) EXTRA_LIBS="$EXTRA_LIBS util"],
205      AC_CHECK_LIB(bsd,openpty, [AC_DEFINE(HAVE_OPENPTY) EXTRA_LIBS="$EXTRA_LIBS bsd"])
206    )
207 )
208
209 AC_MSG_CHECKING(for /dev/ptmx)
210 if test -r /dev/ptmx
211 then
212   AC_MSG_RESULT(yes)
213   AC_DEFINE(HAVE_DEV_PTMX, 1,
214   [Define if we have /dev/ptmx.])
215 else
216   AC_MSG_RESULT(no)
217 fi
218
219 AC_MSG_CHECKING(for /dev/ptc)
220 if test -r /dev/ptc
221 then
222   AC_MSG_RESULT(yes)
223   AC_DEFINE(HAVE_DEV_PTC, 1,
224   [Define if we have /dev/ptc.])
225 else
226   AC_MSG_RESULT(no)
227 fi
228
229 # Avoid adding dl if absent or unneeded
230 AC_CHECK_LIB(dl, dlopen, [EXTRA_LIBS="$EXTRA_LIBS dl"])
231
232 # -{l,}pthread goo
233 AC_CANONICAL_TARGET
234
235 AC_SEARCH_LIBS(sem_close, pthread,
236     [EXTRA_LIBS="$EXTRA_LIBS $ac_lib"],
237     [AC_MSG_NOTICE([Not found])])
238
239 AC_SUBST([EXTRA_LIBS])
240 AC_CONFIG_FILES([unix.buildinfo])
241
242 AC_OUTPUT