summaryrefslogtreecommitdiff
path: root/tools/compat/configure.ac
blob: 95e66c197aa2e93523e4c54b9b704e8c92ac6c3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
#	$NetBSD: configure.ac,v 1.84 2015/07/26 14:01:53 kamil Exp $
#
# Autoconf definition file for libnbcompat.
#
# When you edit configure.ac:
# 0. Create the tools versions of autoconf and autoheader:
#        cd ${SRCDIR} && build.sh -V MKMAINTAINERTOOLS=yes tools
#    (This might not work if you try it after editing configure.ac.)
# 1. edit configure.ac
# 2. Regenerate "configure" and "nbtool_config.h.in" from "configure.ac":
#        cd ${SRCDIR}/tools/compat && ${TOOLDIR}/bin/nbmake-${MACHINE} regen
#    (Please don't use a non-tools version of autoconf or autoheader.)
# 3. Test that the tools still build:
#        mv ${TOOLDIR} ${TOOLDIR}.bak
#        cd ${SRCDIR} && build.sh -V MKMAINTAINERTOOLS=yes tools
# 4. cvs commit files that you edited.
# 5. Regen again, to pick up changed RCS IDs from the above commit:
#        cd ${SRCDIR}/tools/compat && ${TOOLDIR}/bin/nbmake-${MACHINE} regen
# 6. cvs commit files that were generated.
#

AC_INIT([libnbcompat], [noversion], [lib-bug-people@NetBSD.org])
AC_CONFIG_HEADERS(nbtool_config.h)
AC_CONFIG_FILES(defs.mk)

# Autoheader header and footer
AH_TOP([/*      $][NetBSD$    */
 
#ifndef __NETBSD_NBTOOL_CONFIG_H__
#define __NETBSD_NBTOOL_CONFIG_H__])

AH_BOTTOM([#include "compat_defs.h"
#endif /* !__NETBSD_NBTOOL_CONFIG_H__ */])

AC_DEFUN([AC_NETBSD],
[AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
      AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
      AC_MSG_CHECKING([for NetBSD or MINIX3])
      AC_EGREP_CPP(yes,
      [#if defined(__NetBSD__) || defined(__minix)
	yes
	#endif
	],
	[AC_MSG_RESULT([yes])
	 AC_DEFINE([_POSIX_SOURCE], 1, [Define for NetBSD headers.])
	 AC_DEFINE([_POSIX_C_SOURCE], 200112L, [Define for NetBSD headers.])
	 AC_DEFINE([_XOPEN_SOURCE], 600, [Define for NetBSD headers.])],
	[AC_MSG_RESULT([no])])
])# AC_NETBSD

AC_NETBSD
AC_PATH_PROG(BSHELL, sh, )
if test x"$BSHELL" = x; then
	AC_MSG_ERROR([sh must be somewhere on \$PATH])
fi
AC_DEFINE_UNQUOTED([PATH_BSHELL], "$BSHELL", [Path to sh(1).])

AC_C_BIGENDIAN
AC_HEADER_STDC

# Confirm existence of zlib.  (This is available as a default install
# option on many OS's; this could be added as a reachover build in the
# future.)
AC_CHECK_HEADER(zlib.h,,
	AC_MSG_ERROR([zlib must be installed in a compiler-visible path]))
AC_CHECK_LIB(z, gzdopen,,
	AC_MSG_ERROR([zlib must be installed in a compiler-visible path]))

# Make sure certain required headers are available.
# These are not necessarily required by the code, but they are not
# currently conditionalized.
AC_CHECK_HEADERS(sys/ioctl.h sys/mman.h sys/param.h \
	sys/socket.h sys/stat.h sys/time.h sys/types.h sys/utsname.h \
	sys/wait.h assert.h ctype.h errno.h fcntl.h grp.h limits.h locale.h \
	netdb.h pwd.h signal.h stdarg.h stdio.h stdlib.h string.h \
	termios.h unistd.h,,
	AC_MSG_ERROR([standard system header file not found]))

# Find headers that may not be available.
AC_HEADER_DIRENT
AC_CHECK_HEADERS(sys/mtio.h sys/sysmacros.h sys/syslimits.h \
	getopt.h features.h malloc.h sys/poll.h pthread.h stddef.h rpc/types.h)
AC_CHECK_HEADERS(sys/bswap.h machine/bswap.h sys/cdefs.h machine/endian.h \
	sys/endian.h sys/featuretest.h err.h inttypes.h libgen.h paths.h \
	stdint.h util.h resolv.h arpa/nameser.h,,
	[test -f include/$ac_header || touch include/$ac_header])
AC_CHECK_HEADERS(rpc/types.h netconfig.h,,
	[echo '#include "nbtool_config.h"' >include/$ac_header.new
	echo '#include "'$srcdir/../../include/$ac_header'"' \
		>>include/$ac_header.new
	if cmp include/$ac_header.new include/$ac_header >/dev/null 2>&1; then
		rm -f include/$ac_header.new
	else
		mv -f include/$ac_header.new include/$ac_header
	fi])

# Typedefs.
AC_TYPE_SIZE_T
AC_CHECK_TYPES([id_t, long long, u_long, u_char, u_short, u_int, u_quad_t])
AC_CHECK_TYPE(socklen_t, [AC_DEFINE([HAVE_SOCKLEN_T], 1,
			  [Define if you have the socklen_t type.])],,
[#include <sys/types.h>
#ifdef HAVE_RPC_TYPES_H
#include <rpc/types.h>
#endif
#include <sys/socket.h>])

dnl XXX - This is UGLY.  Need a better way to homogenize the bitsized types,
dnl including use of compiler primitive types via AC_CHECK_SIZEOF.
dnl
define([NB_CHECK_INTTYPE], [
	AC_CHECK_TYPE(uint][$1][_t,, [
		AC_CHECK_TYPE(u_int][$1][_t,
			AC_DEFINE(uint][$1][_t, u_int][$1][_t, \
			          [Define if you have u_int][$1][_t, but not uint][$1][_t.]),
			AC_MSG_ERROR([cannot find a suitable type for uint][$1][_t]))
	])
	AC_CHECK_TYPE(u_int][$1][_t,, [
		AC_CHECK_TYPE(uint][$1][_t,
			AC_DEFINE(u_int][$1][_t, uint][$1][_t, \
				  [Define if you have uint][$1][_t, but not u_int][$1][_t.]),
			AC_MSG_ERROR([cannot find a suitable type for u_int][$1][_t]))
	])
])

NB_CHECK_INTTYPE(8)
NB_CHECK_INTTYPE(16)
NB_CHECK_INTTYPE(32)
NB_CHECK_INTTYPE(64)

# Struct members.
AC_CHECK_MEMBERS([DIR.dd_fd, DIR.__dd_fd, struct dirent.d_namlen],,,
[#include <sys/types.h>
#include <dirent.h>])
AC_CHECK_MEMBERS([struct stat.st_flags, struct stat.st_gen,
	struct stat.st_birthtime, struct stat.st_birthtimensec,
	struct stat.st_atim, struct stat.st_mtimensec],,, 
	[#include <sys/stat.h>])
AC_CHECK_MEMBERS(struct statvfs.f_iosize,,, [#include <sys/statvfs.h>])
AC_CHECK_MEMBERS(struct tm.tm_gmtoff,,, [#include <time.h>])

# Global variable decls.
AC_CHECK_DECLS([optind, optreset],,, [
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
])
AC_CHECK_DECLS(sys_signame,,, [#include <signal.h>])

# Library functions (where a .h check isn't enough).
AC_FUNC_ALLOCA
AC_CHECK_FUNCS(atoll asprintf asnprintf basename devname dirfd dirname \
	dprintf esetfunc fgetln flock fpurge __fpurge futimes getline \
	getopt getopt_long group_from_gid gid_from_group \
	heapsort isblank issetugid lchflags lchmod lchown lutimes mkstemp \
	mkdtemp poll pread putc_unlocked pwcache_userdb pwcache_groupdb \
	pwrite raise_default_signal random reallocarr setenv \
	setgroupent setprogname setpassent \
	snprintb_m snprintf strlcat strlcpy strmode \
	strndup strnlen strsep strsuftoll strtoi strtoll strtou \
	user_from_uid uid_from_user vasprintf vasnprintf vsnprintf)

AC_CHECK_DECLS([user_from_uid, uid_from_user, pwcache_userdb],,,[
#include <pwd.h>
])
AC_CHECK_DECLS([group_from_gid, gid_from_group, pwcache_groupdb],,,[
#include <grp.h>
])
AC_CHECK_DECLS([strndup, strnlen],,,[#include <string.h>])
AC_CHECK_DECLS([strsuftoll],,,[#include <stdlib.h>])
AC_CHECK_DECLS([lchflags, lchmod, lchown],,,[
#include <sys/stat.h>
#include <unistd.h>
])

AC_CHECK_DECLS([errc, verrc, warnc, vwarnc],,, [
#ifdef HAVE_ERR_H
#include <err.h>
#endif
])

AC_CHECK_DECLS([htobe16, htobe32, htobe64, htole16, htole32, htole64,
		be16toh, be32toh, be64toh, le16toh, le32toh, le64toh],,,
		[#include <sys/types.h>])

AC_CHECK_DECLS([bswap16, bswap32, bswap64],,, [#include <machine/bswap.h>])

AC_CHECK_DECLS([be16enc, le16enc, be16dec, le16dec, be32enc, le32enc,
		be32dec, le32dec, be64enc, le64enc, be64dec, le64dec],,,
		[#include <sys/endian.h>])

AC_CHECK_DECLS([fstatvfs],,, [#include <sys/statvfs.h>])

AC_CHECK_DECLS([setgroupent, setpassent],,, [
#include <sys/types.h>
#include <grp.h>
#include <pwd.h>
])

# regcomp() and regexec() are also names of functions in the old V8
# regexp package.  To avoid them, we need to find out who has regfree().

dnl # Cygwin: We *MUST* look at -lregex *before* the "no libs" condition.
dnl # Thus AC_CHECK_LIB(regex...) comes first, and AC_SEARCHLIBS next.
AC_CHECK_LIB(regex, regfree)
AC_SEARCH_LIBS(regfree, rx posix)

AC_CHECK_LIB(rt, clock_gettime)

AC_CHECK_FUNCS(fparseln, [
    AC_MSG_CHECKING(if fparseln seems to work)
    AC_RUN_IFELSE(
        [AC_LANG_SOURCE([[
#define _NETBSD_SOURCE
#include <stdio.h>
#include <stdlib.h>
#define CONFTEST	"conftest.fparseln"
#define COMMENT		'#'
int
main(void)
{
	static const char delim[3] = { '\0', '\0', COMMENT };
	FILE *fp;
	char *ptr;
	fp = fopen(CONFTEST, "w+");
	if (fp != NULL) {
		unlink(CONFTEST);
		ungetc(COMMENT, fp);
		ptr = fparseln(fp, NULL, NULL, delim,
		    FPARSELN_UNESCALL);
		fclose(fp);
		if (ptr == NULL)
			exit(0);
	}
	exit(1);
}
        ]])],
        [AC_MSG_RESULT(yes)],
        [AC_MSG_RESULT(no)
         AC_DEFINE(BROKEN_FPARSELN, 1,
            [Define to 1 if your `fparseln' function is broken.])],
        [AC_MSG_WARN([cross compiling: not checking farseln])]
    )
])

# Variables substituted via @VARNAME@ in defs.mk.in
AC_SUBST(HAVE_PTHREAD_H, $ac_cv_header_pthread_h)

AC_OUTPUT