summaryrefslogtreecommitdiff
path: root/tools/compat/configure.ac
blob: 2cc723e36f30a69bcbe3e061216aca44d057ad78 (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
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
#	$NetBSD: configure.ac,v 1.104 2023/05/30 18:54:21 lukem 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])
AC_CONFIG_MACRO_DIR([buildaux])

m4_pattern_forbid([^AX_])
m4_pattern_forbid([^NB_])

# 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([NB_NETBSD], [dnl
      AC_BEFORE([$0], [AC_COMPILE_IFELSE])dnl
      AC_BEFORE([$0], [AC_RUN_IFELSE])dnl
      AC_MSG_CHECKING([for NetBSD])
      AC_EGREP_CPP(yes,
      [#ifdef __NetBSD__
	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])])
])dnl NB_NETBSD

NB_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 stdio_ext.h \
	getopt.h features.h malloc.h sys/poll.h pthread.h stddef.h sys/uio.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 \
	libgen.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,,
	[echo '#include "nbtool_config.h"' >include/$ac_header.new
	echo '#include "'$srcdir/../../common/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])
AC_CHECK_HEADERS(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_TYPES([uchar_t, ushort_t, uint_t, ulong_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>])

AC_MSG_CHECKING([for enum uio_rw])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/types.h>
#ifdef HAVE_SYS_UIO_H
#include <sys/uio.h>
#endif]],
[[enum uio_rw rw;]])],
[AC_MSG_RESULT(yes)
 AC_DEFINE([HAVE_ENUM_UIO_RW], 1,
    [Define if you have the enum uio_rw type.])],
[AC_MSG_RESULT(no)])

AC_MSG_CHECKING([for enum uio_seg])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/types.h>
#ifdef HAVE_SYS_UIO_H
#include <sys/uio.h>
#endif]],
[[enum uio_seg seg;]])],
[AC_MSG_RESULT(yes)
 AC_DEFINE([HAVE_ENUM_UIO_SEG], 1,
    [Define if you have the enum uio_seg type.])],
[AC_MSG_RESULT(no)])

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
AC_DEFUN([NB_CHECK_INTTYPE], [dnl
	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]))
	])
])dnl NB_CHECK_INTTYPE

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([asprintf, asnprintf, vasprintf, vasnprintf, vsnprintf, fgetln, fparseln,
	fpurge, getdelim, getline, snprintf],,, [
#include <stdio.h>
])

AC_CHECK_DECLS([atoll, heapsort, mkdtemp, mkstemp, reallocarr, reallocarray,
	getsubopt, setenv, strtoi, strtoll, strtou, setprogname,
	getprogname],,, [
#include <stdlib.h>
])

AC_CHECK_DECLS([basename, dirname],,, [
#include <libgen.h>
])

AC_CHECK_DECLS([raise_default_signal],,, [
#include <util.h>
])

AC_CHECK_DECLS([issetugid, pread, pwrite],,, [
#include <unistd.h>
])

AC_CHECK_DECLS([strmode],,, [
#include <unistd.h>
#include <string.h>
])

AC_CHECK_DECLS([isblank],,, [
#include <ctype.h>
])


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 \
	dispatch_semaphore_create \
	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 reallocarray setenv \
	setgroupent setprogname setpassent \
	snprintb_m snprintf strlcat strlcpy strmode \
	strcasecmp strncasecmp 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([strcasecmp, strncasecmp, strlcpy, strlcat, strndup,
		strnlen, strsep],,,[
#include <string.h>
])
AC_CHECK_DECLS([strsuftoll, mi_vector_hash],,,[#include <stdlib.h>])
AC_CHECK_DECLS([lchflags, lchmod, lchown],,,[
#include <sys/stat.h>
#include <unistd.h>
])

AC_CHECK_DECLS([err, errc, errx, verrc, verrx, warn, warnc, warnx, vwarnc,
		vwarnx],,,[
#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])]
    )
])

dnl
dnl Set per-warning CC_* variables if supported by HOST_CC.
dnl

dnl clang needs to fail if given an unknown -WWARN.
cc_fail_unknown=
AX_CHECK_COMPILE_FLAG([-Werror=unknown-warning-option],
 [AS_VAR_APPEND([cc_fail_unknown], [-Werror=unknown-warning-option])])

AC_DEFUN([NB_CC_FLAG], [dnl
m4_pushdef([NB_FLAG], [$1])
dnl gcc ignores unknown -Wno-WARN but will fail unknown equivalent -WWARN.
m4_pushdef([NB_WFLAG], m4_bpatsubst(NB_FLAG, [^-Wno-], [-W]))
m4_pushdef([NB_VAR], [CC]m4_translit(NB_FLAG, [-a-z], [_A-Z]))
AX_CHECK_COMPILE_FLAG(NB_WFLAG, [AS_VAR_SET(NB_VAR,NB_FLAG)], [], [$cc_fail_unknown])
AC_SUBST(NB_VAR)
m4_append([NB_CC_FLAG_VARS], NB_VAR, [ ])
m4_popdef([NB_FLAG])
m4_popdef([NB_WFLAG])
m4_popdef([NB_VAR])
]) dnl NB_CC_FLAG

dnl Disable use of pre-compiled headers on Darwin.
NB_CC_FLAG([-no-cpp-precomp])

dnl Detect HOST_CC support for <bsd.own.mk> CC_* warnings
NB_CC_FLAG([-Wno-format-truncation])
NB_CC_FLAG([-Wno-maybe-uninitialized])
NB_CC_FLAG([-Wno-stringop-overflow])
NB_CC_FLAG([-Wno-stringop-truncation])

AC_OUTPUT()

dnl Display results
dnl
AC_MSG_NOTICE([========= Configuration results =========])
AC_MSG_NOTICE([CC                              $CC])
m4_foreach_w([NB_VAR], NB_CC_FLAG_VARS, [dnl
AC_MSG_NOTICE(m4_format([%-32s],NB_VAR)[$NB_VAR])
])
AC_MSG_NOTICE([LIBS                            $LIBS])
AC_MSG_NOTICE([=========================================])