32f7174d375c33cf799b1a6e297b38676bc2dc36
[packages/unix.git] / configure.ac
1 AC_PREREQ([2.60])
2 AC_INIT([Haskell unix package], [2.0], [libraries@haskell.org], [unix])
3
4 # Safety check: Ensure that we are in the correct source directory.
5 AC_CONFIG_SRCDIR([include/HsUnix.h])
6
7 AC_PROG_CC
8
9 dnl make extensions visible to allow feature-tests to detect them lateron
10 AC_USE_SYSTEM_EXTENSIONS
11
12 AC_CONFIG_HEADERS([include/HsUnixConfig.h])
13
14 # Is this a Unix system?
15 AC_CHECK_HEADER([dlfcn.h], [BUILD_PACKAGE_BOOL=True], [BUILD_PACKAGE_BOOL=False])
16 AC_SUBST([BUILD_PACKAGE_BOOL])
17
18 AC_C_CONST
19
20 dnl ** Enable large file support.  NB. do this before testing the type of
21 dnl    off_t, because it will affect the result of that test.
22 dnl
23 dnl WARNING: It's essential this check agrees with HsBaseConfig.h as otherwise
24 dnl          the definitions of COff/coff_t don't line up
25 AC_SYS_LARGEFILE
26
27 AC_CHECK_HEADERS([dirent.h fcntl.h grp.h limits.h pwd.h signal.h string.h])
28 AC_CHECK_HEADERS([sys/resource.h sys/stat.h sys/times.h sys/time.h])
29 AC_CHECK_HEADERS([sys/utsname.h sys/wait.h])
30 AC_CHECK_HEADERS([bsd/libutil.h libutil.h pty.h utmp.h])
31 AC_CHECK_HEADERS([termios.h time.h unistd.h utime.h])
32
33 AC_CHECK_FUNCS([getgrgid_r getgrnam_r getpwnam_r getpwuid_r getpwnam getpwuid])
34 AC_CHECK_FUNCS([getpwent getgrent])
35 AC_CHECK_FUNCS([lchown setenv sysconf unsetenv clearenv])
36 AC_CHECK_FUNCS([nanosleep])
37 AC_CHECK_FUNCS([ptsname])
38 AC_CHECK_FUNCS([setitimer])
39 AC_CHECK_FUNCS([readdir_r])
40
41 dnl not available on android so check for it
42 AC_CANONICAL_TARGET
43 AS_CASE([$target_os],[*-android*],[],[AC_CHECK_FUNCS([telldir seekdir])])
44
45 dnl When available, _NSGetEnviron() (defined in <crt_externs.h>) is
46 dnl the preferred way to access environ(7)
47 AC_CHECK_FUNCS([_NSGetEnviron])
48
49 dnl This is e.g. available as a GNU extension in glibc 2.11+
50 AC_CHECK_DECLS([execvpe])
51 AC_CHECK_FUNCS([execvpe])
52
53 AC_CHECK_MEMBERS([struct stat.st_atim])
54 AC_CHECK_MEMBERS([struct stat.st_mtim])
55 AC_CHECK_MEMBERS([struct stat.st_ctim])
56 AC_CHECK_MEMBERS([struct stat.st_atimespec])
57 AC_CHECK_MEMBERS([struct stat.st_mtimespec])
58 AC_CHECK_MEMBERS([struct stat.st_ctimespec])
59 AC_CHECK_MEMBERS([struct stat.st_atimensec])
60 AC_CHECK_MEMBERS([struct stat.st_mtimensec])
61 AC_CHECK_MEMBERS([struct stat.st_ctimensec])
62 AC_CHECK_MEMBERS([struct stat.st_atime_n])
63 AC_CHECK_MEMBERS([struct stat.st_mtime_n])
64 AC_CHECK_MEMBERS([struct stat.st_ctime_n])
65 AC_CHECK_MEMBERS([struct stat.st_uatime])
66 AC_CHECK_MEMBERS([struct stat.st_umtime])
67 AC_CHECK_MEMBERS([struct stat.st_uctime])
68
69 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>]])
70
71 # Functions for changing file timestamps
72 AC_CHECK_FUNCS([utimensat futimens])
73 AC_CHECK_FUNCS([lutimes futimes])
74
75 # Additional temp functions
76 AC_CHECK_FUNCS([mkstemps mkdtemp])
77
78 # Functions for file synchronization and allocation control
79 AC_CHECK_FUNCS([fsync])
80
81 # On OSX linking against 'fdatasync' succeeds, but that doesn't pick
82 # the expected the POSIX 'fdatasync' function.  So make sure that we
83 # also have a function declaration in scope, in addition to being able
84 # to link against 'fdatasync'.
85 AC_CHECK_DECLS([fdatasync],[AC_CHECK_FUNCS([fdatasync])])
86
87
88 AC_CHECK_FUNCS([posix_fadvise posix_fallocate])
89
90 # Some termios(3) functions known to be missing sometimes (see also #55)
91 AC_CHECK_DECLS([tcdrain],[AC_DEFINE([HAVE_TCDRAIN],[1],[Define to 1 if you have the `tcdrain' function.])],[],[AC_INCLUDES_DEFAULT
92 #ifdef HAVE_TERMIOS_H
93 #include <termios.h>
94 #endif
95 ])
96
97 AC_CHECK_DECLS([ctermid],[AC_DEFINE([HAVE_CTERMID],[1],[Define to 1 if you have the `ctermid' function.])],[],[AC_INCLUDES_DEFAULT
98 #ifdef HAVE_TERMIOS_H
99 #include <termios.h>
100 #endif
101 ])
102
103 # Avoid adding rt if absent or unneeded
104 # shm_open needs -lrt on linux
105 AC_SEARCH_LIBS(shm_open, rt, [AC_CHECK_FUNCS([shm_open shm_unlink])])
106 AS_IF([test "x$ac_cv_search_shm_open" = x-lrt], [EXTRA_LIBS="$EXTRA_LIBS rt"])
107
108 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 SIGINFO SIGWINCH], [
109 #if HAVE_SIGNAL_H
110 #include <signal.h>
111 #endif])
112
113 AC_MSG_CHECKING([for _SC_GETGR_R_SIZE_MAX])
114 AC_EGREP_CPP(we_have_that_sysconf_thing,
115 [
116 #include <unistd.h>
117 #ifdef _SC_GETGR_R_SIZE_MAX
118 we_have_that_sysconf_thing
119 #endif
120 ],
121 [AC_MSG_RESULT([yes])
122 AC_DEFINE([HAVE_SC_GETGR_R_SIZE_MAX], [1], [Define to 1 if <unistd.h> defines _SC_GETGR_R_SIZE_MAX.])],
123 [AC_MSG_RESULT([no])])
124
125 AC_MSG_CHECKING([for _SC_GETPW_R_SIZE_MAX])
126 AC_EGREP_CPP(we_have_that_sysconf_thing,
127 [
128 #include <unistd.h>
129 #ifdef _SC_GETPW_R_SIZE_MAX
130 we_have_that_sysconf_thing
131 #endif
132 ],
133 [AC_MSG_RESULT([yes])
134 AC_DEFINE([HAVE_SC_GETPW_R_SIZE_MAX], [1], [Define to 1 if <unistd.h> defines _SC_GETPW_R_SIZE_MAX.])],
135 [AC_MSG_RESULT([no])])
136
137 dnl ---------- usleep ----------
138 dnl --- stolen from guile configure ---
139
140 ### On some systems usleep has no return value.  If it does have one,
141 ### we'd like to return it; otherwise, we'll fake it.
142 AC_CACHE_CHECK([return type of usleep], fptools_cv_func_usleep_return_type,
143   [AC_EGREP_HEADER(changequote(<, >)<void[      ]+usleep>changequote([, ]),
144                    unistd.h,
145                    [fptools_cv_func_usleep_return_type=void],
146                    [fptools_cv_func_usleep_return_type=int])])
147 case "$fptools_cv_func_usleep_return_type" in
148   "void" )
149     AC_DEFINE([USLEEP_RETURNS_VOID], [1], [Define if the system headers declare usleep to return void.])
150   ;;
151 esac
152
153 ###  POSIX.1003.1 unsetenv returns 0 or -1 (EINVAL), but older implementations
154 ###  in common use return void.
155 AC_CACHE_CHECK([return type of unsetenv], fptools_cv_func_unsetenv_return_type,
156   [AC_EGREP_HEADER(changequote(<, >)<void[      ]+unsetenv>changequote([, ]),
157                    stdlib.h,
158                    [fptools_cv_func_unsetenv_return_type=void],
159                    [fptools_cv_func_unsetenv_return_type=int])])
160 case "$fptools_cv_func_unsetenv_return_type" in
161   "void" )
162     AC_DEFINE([UNSETENV_RETURNS_VOID], [1], [Define if stdlib.h declares unsetenv to return void.])
163   ;;
164 esac
165
166 dnl On some hosts (e.g. SuSe and Ubuntu Linux) RTLD_NEXT and RTLD_DEFAULT are
167 dnl not visible without setting _GNU_SOURCE, which we really don't want to.
168 dnl Also see comments in System/Posix/DynamicLinker/Prim.hsc.
169 AC_MSG_CHECKING(for RTLD_NEXT from dlfcn.h)
170 AC_EGREP_CPP(yes,
171 [
172  #include <dlfcn.h>
173  #ifdef RTLD_NEXT
174         yes
175  #endif
176 ], [
177   AC_MSG_RESULT(yes)
178   AC_DEFINE([HAVE_RTLDNEXT], [1], [Define to 1 if we can see RTLD_NEXT in dlfcn.h.])
179 ], [
180   AC_MSG_RESULT(no)
181   ])    
182
183 AC_MSG_CHECKING(for RTLD_DEFAULT from dlfcn.h)
184 AC_EGREP_CPP(yes,
185 [
186  #include <dlfcn.h>
187  #ifdef RTLD_DEFAULT
188         yes
189  #endif
190 ], [
191   AC_MSG_RESULT(yes)
192   AC_DEFINE([HAVE_RTLDDEFAULT], [1], [Define to 1 if RTLD_DEFAULT is available.])
193 ], [
194   AC_MSG_RESULT(no)
195   ])    
196
197 AC_CHECK_FUNCS(openpty,,
198    AC_CHECK_LIB(util,openpty,
199      [AC_DEFINE(HAVE_OPENPTY) EXTRA_LIBS="$EXTRA_LIBS util"],
200      AC_CHECK_LIB(bsd,openpty, [AC_DEFINE(HAVE_OPENPTY) EXTRA_LIBS="$EXTRA_LIBS bsd"])
201    )
202 )
203
204 AC_MSG_CHECKING(for /dev/ptmx)
205 if test -r /dev/ptmx
206 then
207   AC_MSG_RESULT(yes)
208   AC_DEFINE(HAVE_DEV_PTMX, 1,
209   [Define if we have /dev/ptmx.])
210 else
211   AC_MSG_RESULT(no)
212 fi
213
214 AC_MSG_CHECKING(for /dev/ptc)
215 if test -r /dev/ptc
216 then
217   AC_MSG_RESULT(yes)
218   AC_DEFINE(HAVE_DEV_PTC, 1,
219   [Define if we have /dev/ptc.])
220 else
221   AC_MSG_RESULT(no)
222 fi
223
224 # Avoid adding dl if absent or unneeded
225 AC_SEARCH_LIBS([dlopen], [dl], [EXTRA_LIBS="$EXTRA_LIBS $ac_lib"])
226
227 # -{l,}pthread goo
228 AC_CANONICAL_TARGET
229
230 AC_SEARCH_LIBS(sem_close, pthread,
231     [EXTRA_LIBS="$EXTRA_LIBS $ac_lib"],
232     [AC_MSG_NOTICE([Not found])])
233
234 AC_SUBST([EXTRA_LIBS])
235 AC_CONFIG_FILES([unix.buildinfo])
236
237 AC_OUTPUT