Try omit-local-package (#116)
[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 dnl androids bionic doesn't have mkstemps
77 # We explicilty check for android, as the check AC_CHECK_FUNCS performs returns "yes" for mkstemps
78 # when targetting android. See similar conditionals for seekdir and telldir.
79 AS_CASE([$target_os],[*-android*],[AC_CHECK_FUNCS([mkdtemp])],[AC_CHECK_FUNCS([mkstemps mkdtemp])])
80
81 # Functions for file synchronization and allocation control
82 AC_CHECK_FUNCS([fsync])
83
84 # On OSX linking against 'fdatasync' succeeds, but that doesn't pick
85 # the expected the POSIX 'fdatasync' function.  So make sure that we
86 # also have a function declaration in scope, in addition to being able
87 # to link against 'fdatasync'.
88 AC_CHECK_DECLS([fdatasync],[AC_CHECK_FUNCS([fdatasync])])
89
90
91 AC_CHECK_FUNCS([posix_fadvise posix_fallocate])
92
93 # Some termios(3) functions known to be missing sometimes (see also #55)
94 AC_CHECK_DECLS([tcdrain],[AC_DEFINE([HAVE_TCDRAIN],[1],[Define to 1 if you have the `tcdrain' function.])],[],[AC_INCLUDES_DEFAULT
95 #ifdef HAVE_TERMIOS_H
96 #include <termios.h>
97 #endif
98 ])
99
100 AC_CHECK_DECLS([ctermid],[AC_DEFINE([HAVE_CTERMID],[1],[Define to 1 if you have the `ctermid' function.])],[],[AC_INCLUDES_DEFAULT
101 #ifdef HAVE_TERMIOS_H
102 #include <termios.h>
103 #endif
104 ])
105
106 # Avoid adding rt if absent or unneeded
107 # shm_open needs -lrt on linux
108 AC_SEARCH_LIBS(shm_open, rt, [AC_CHECK_FUNCS([shm_open shm_unlink])])
109 AS_IF([test "x$ac_cv_search_shm_open" = x-lrt], [EXTRA_LIBS="$EXTRA_LIBS rt"])
110
111 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], [
112 #if HAVE_SIGNAL_H
113 #include <signal.h>
114 #endif])
115
116 AC_MSG_CHECKING([for _SC_GETGR_R_SIZE_MAX])
117 AC_EGREP_CPP(we_have_that_sysconf_thing,
118 [
119 #include <unistd.h>
120 #ifdef _SC_GETGR_R_SIZE_MAX
121 we_have_that_sysconf_thing
122 #endif
123 ],
124 [AC_MSG_RESULT([yes])
125 AC_DEFINE([HAVE_SC_GETGR_R_SIZE_MAX], [1], [Define to 1 if <unistd.h> defines _SC_GETGR_R_SIZE_MAX.])],
126 [AC_MSG_RESULT([no])])
127
128 AC_MSG_CHECKING([for _SC_GETPW_R_SIZE_MAX])
129 AC_EGREP_CPP(we_have_that_sysconf_thing,
130 [
131 #include <unistd.h>
132 #ifdef _SC_GETPW_R_SIZE_MAX
133 we_have_that_sysconf_thing
134 #endif
135 ],
136 [AC_MSG_RESULT([yes])
137 AC_DEFINE([HAVE_SC_GETPW_R_SIZE_MAX], [1], [Define to 1 if <unistd.h> defines _SC_GETPW_R_SIZE_MAX.])],
138 [AC_MSG_RESULT([no])])
139
140 dnl ---------- usleep ----------
141 dnl --- stolen from guile configure ---
142
143 ### On some systems usleep has no return value.  If it does have one,
144 ### we'd like to return it; otherwise, we'll fake it.
145 AC_CACHE_CHECK([return type of usleep], fptools_cv_func_usleep_return_type,
146   [AC_EGREP_HEADER(changequote(<, >)<void[      ]+usleep>changequote([, ]),
147                    unistd.h,
148                    [fptools_cv_func_usleep_return_type=void],
149                    [fptools_cv_func_usleep_return_type=int])])
150 case "$fptools_cv_func_usleep_return_type" in
151   "void" )
152     AC_DEFINE([USLEEP_RETURNS_VOID], [1], [Define if the system headers declare usleep to return void.])
153   ;;
154 esac
155
156 ###  POSIX.1003.1 unsetenv returns 0 or -1 (EINVAL), but older implementations
157 ###  in common use return void.
158 AC_CACHE_CHECK([return type of unsetenv], fptools_cv_func_unsetenv_return_type,
159   [AC_EGREP_HEADER(changequote(<, >)<void[      ]+unsetenv>changequote([, ]),
160                    stdlib.h,
161                    [fptools_cv_func_unsetenv_return_type=void],
162                    [fptools_cv_func_unsetenv_return_type=int])])
163 case "$fptools_cv_func_unsetenv_return_type" in
164   "void" )
165     AC_DEFINE([UNSETENV_RETURNS_VOID], [1], [Define if stdlib.h declares unsetenv to return void.])
166   ;;
167 esac
168
169 dnl On some hosts (e.g. SuSe and Ubuntu Linux) RTLD_NEXT and RTLD_DEFAULT are
170 dnl not visible without setting _GNU_SOURCE, which we really don't want to.
171 dnl Also see comments in System/Posix/DynamicLinker/Prim.hsc.
172 AC_MSG_CHECKING(for RTLD_NEXT from dlfcn.h)
173 AC_EGREP_CPP(yes,
174 [
175  #include <dlfcn.h>
176  #ifdef RTLD_NEXT
177         yes
178  #endif
179 ], [
180   AC_MSG_RESULT(yes)
181   AC_DEFINE([HAVE_RTLDNEXT], [1], [Define to 1 if we can see RTLD_NEXT in dlfcn.h.])
182 ], [
183   AC_MSG_RESULT(no)
184   ])    
185
186 AC_MSG_CHECKING(for RTLD_DEFAULT from dlfcn.h)
187 AC_EGREP_CPP(yes,
188 [
189  #include <dlfcn.h>
190  #ifdef RTLD_DEFAULT
191         yes
192  #endif
193 ], [
194   AC_MSG_RESULT(yes)
195   AC_DEFINE([HAVE_RTLDDEFAULT], [1], [Define to 1 if RTLD_DEFAULT is available.])
196 ], [
197   AC_MSG_RESULT(no)
198   ])    
199
200 AC_CHECK_FUNCS(openpty,,
201    AC_CHECK_LIB(util,openpty,
202      [AC_DEFINE(HAVE_OPENPTY) EXTRA_LIBS="$EXTRA_LIBS util"],
203      AC_CHECK_LIB(bsd,openpty, [AC_DEFINE(HAVE_OPENPTY) EXTRA_LIBS="$EXTRA_LIBS bsd"])
204    )
205 )
206
207 AC_MSG_CHECKING(for /dev/ptmx)
208 if test -r /dev/ptmx
209 then
210   AC_MSG_RESULT(yes)
211   AC_DEFINE(HAVE_DEV_PTMX, 1,
212   [Define if we have /dev/ptmx.])
213 else
214   AC_MSG_RESULT(no)
215 fi
216
217 AC_MSG_CHECKING(for /dev/ptc)
218 if test -r /dev/ptc
219 then
220   AC_MSG_RESULT(yes)
221   AC_DEFINE(HAVE_DEV_PTC, 1,
222   [Define if we have /dev/ptc.])
223 else
224   AC_MSG_RESULT(no)
225 fi
226
227 # Avoid adding dl if absent or unneeded
228 AC_SEARCH_LIBS([dlopen], [dl], [EXTRA_LIBS="$EXTRA_LIBS $ac_lib"])
229
230 # -{l,}pthread goo
231 AC_CANONICAL_TARGET
232
233 AC_SEARCH_LIBS(sem_close, pthread,
234     [EXTRA_LIBS="$EXTRA_LIBS $ac_lib"],
235     [AC_MSG_NOTICE([Not found])])
236
237 AC_SUBST([EXTRA_LIBS])
238 AC_CONFIG_FILES([unix.buildinfo])
239
240 AC_OUTPUT