1#                                               -*- Autoconf -*-
2# Process this file with autoconf to produce a configure script.
3
4AC_PREREQ([2.62])
5AC_INIT([istgt], [0.5])
6AC_CONFIG_SRCDIR([src/istgt.c])
7AC_CONFIG_HEADERS([src/config.h])
8
9# Checks for programs.
10AC_PROG_CC([clang gcc cc])
11AC_PROG_INSTALL
12AC_PROG_RANLIB
13AC_PROG_SED
14AC_PROG_MKDIR_P
15
16# clagn with -O3
17if test "$CC" = "clang" && test "$ac_test_CFLAGS" != "set"; then
18  CFLAGS="-g -O3"
19fi
20
21# host OS related
22vboxinc="/usr/local/src/virtualbox/*/include"
23vboxlib="/usr/local/lib/virtualbox"
24AC_SUBST([rctemplate], [""])
25AC_SUBST([rcdir], ['${prefix}/etc/rc.d'])
26AC_CANONICAL_HOST
27case "$host_os" in
28*linux*)
29	tmp="/usr/src/virtualbox/*/include"
30	if test -d "`echo $tmp`"; then
31	    vboxinc=$tmp
32	fi
33	vboxlib="/usr/lib/virtualbox"
34	AC_SUBST([rctemplate], ["istgt_linux.sh.in"])
35	AC_SUBST([rcdir], ['/etc/init.d'])
36	AC_DEFINE([_GNU_SOURCE], 1, [Define if linux host])
37	;;
38*netbsd*)
39	AC_SUBST([rctemplate], ["istgt_netbsd.sh.in"])
40	AC_SUBST([rcdir], ['/etc/rc.d'])
41	;;
42*dragonfly*|*freebsd*)
43	tmp="/usr/ports/emulators/virtualbox-ose/work/*/include"
44	if test -d "`echo $tmp`"; then
45	    vboxinc=$tmp
46	else
47	    tmp="/usr/ports/emulators/virtualbox-ose-legacy/work/*/include"
48	    if test -d "`echo $tmp`"; then
49		vboxinc=$tmp
50	    fi
51	fi
52	vboxlib="/usr/local/lib/virtualbox"
53	AC_SUBST([rctemplate], ["istgt.sh.in"])
54	AC_SUBST([rcdir], ['${prefix}/etc/rc.d'])
55	if test "$mandir" = '${datarootdir}/man'; then
56	    AC_SUBST([mandir], ['${prefix}/man'])
57	fi
58	;;
59esac
60
61# Checks for libraries.
62AC_CHECK_LIB([pthread], [pthread_create])
63AC_CHECK_LIB([md], [MD5Update], ,
64  [AC_CHECK_LIB([crypto], [MD5_Update])])
65AC_CHECK_LIB([cam], [cam_open_spec_device])
66
67# Checks for header files.
68AC_CHECK_HEADERS([arpa/inet.h fcntl.h inttypes.h limits.h netdb.h netinet/in.h stddef.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h syslog.h unistd.h])
69
70# Checks for typedefs, structures, and compiler characteristics.
71AC_C_INLINE
72AC_TYPE_INT32_T
73AC_TYPE_INT64_T
74AC_TYPE_OFF_T
75AC_TYPE_PID_T
76AC_TYPE_SIZE_T
77AC_TYPE_SSIZE_T
78AC_STRUCT_ST_BLOCKS
79AC_TYPE_UINT16_T
80AC_TYPE_UINT32_T
81AC_TYPE_UINT64_T
82AC_TYPE_UINT8_T
83
84# Checks for library functions.
85AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
86AC_FUNC_MALLOC
87AC_FUNC_REALLOC
88AC_CHECK_FUNCS([ftruncate memset realpath socket strcasecmp strchr strncasecmp strspn strtol strtoull])
89
90# check compatibility
91AC_SYS_LARGEFILE
92AC_CHECK_HEADERS([aio.h sched.h uuid.h sys/disk.h sys/disklabel.h])
93AC_CHECK_HEADERS([pthread.h])
94AC_CHECK_HEADERS([pthread_np.h], [], [],
95[#if HAVE_PTHREAD_H
96#include <pthread.h>
97#endif
98])
99AC_CHECK_FUNCS([strlcpy arc4random srandomdev pthread_yield sched_yield])
100AC_CHECK_FUNCS([pthread_set_name_np setproctitle])
101AC_SUBST([MKDEP])
102AC_PATH_PROG([MKDEP], ["mkdep"])
103#if test -z "$MKDEP"; then
104#   AC_PATH_PROG([MKDEP], ["makedepend"])
105#fi
106
107# paths
108configdir="$ac_default_prefix/etc/istgt"
109mediadir="/var/istgt"
110if test "$prefix" != "NONE"; then
111  configdir="$prefix/etc/istgt"
112fi
113AC_ARG_WITH([configdir],
114  AS_HELP_STRING([--with-configdir=DIR], [(default PREFIX/etc/istgt)]),
115  [case $withval in
116    yes|no)
117        ;;
118    *)
119        configdir="$withval"
120        ;;
121  esac])
122AC_SUBST([configdir])
123AC_ARG_WITH([mediadir],
124  AS_HELP_STRING([--with-mediadir=DIR], [(default /var/istgt)]),
125  [case $withval in
126    yes|no)
127        ;;
128    *)
129        mediadir="$withval"
130        ;;
131  esac])
132AC_SUBST([mediadir])
133
134# startup script directory
135AC_ARG_WITH([rcdir],
136  AS_HELP_STRING([--with-rcdir=DIR], [(default PREFIX/etc/rc.d)]),
137  [case $withval in
138    yes|no)
139        ;;
140    *)
141        rcdir="$withval"
142        ;;
143  esac])
144AC_SUBST([rcdir])
145
146# test for -fstack-protector
147saved_CFLAGS="$CFLAGS"
148AC_MSG_CHECKING([whether the C compiler accepts -fstack-protector])
149CFLAGS="$CFLAGS -fstack-protector"
150AC_TRY_COMPILE(,,
151  AC_MSG_RESULT(yes); saved_CFLAGS="$CFLAGS",
152  AC_MSG_RESULT(no))
153CFLAGS="$saved_CFLAGS"
154
155# test for -Wall
156saved_CFLAGS="$CFLAGS"
157AC_MSG_CHECKING([whether the C compiler accepts -Wall])
158CFLAGS="$CFLAGS -Wall"
159AC_TRY_COMPILE(,,
160  AC_MSG_RESULT(yes); saved_CFLAGS="$CFLAGS",
161  AC_MSG_RESULT(no))
162CFLAGS="$saved_CFLAGS"
163
164# test for -Wextra
165saved_CFLAGS="$CFLAGS"
166AC_MSG_CHECKING([whether the C compiler accepts -Wextra])
167CFLAGS="$CFLAGS -Wextra"
168AC_TRY_COMPILE(,,
169  AC_MSG_RESULT(yes); saved_CFLAGS="$CFLAGS",
170  AC_MSG_RESULT(no))
171CFLAGS="$saved_CFLAGS"
172
173# check enable features
174AC_MSG_CHECKING([whether to use debug mode])
175AC_ARG_ENABLE([debug],
176  AS_HELP_STRING([--enable-debug], [enable debug(logging)]),
177  AC_MSG_RESULT(yes); AC_DEFINE([DEBUG], 1, [Define if enable debug]),
178  AC_MSG_RESULT(no))
179AC_SUBST([DEBUG])
180
181AC_MSG_CHECKING([whether to use symlink device])
182AC_ARG_ENABLE([symlink-device],
183  AS_HELP_STRING([--enable-symlink-device], [allow symlink device]),
184  AC_MSG_RESULT(yes); AC_DEFINE([ALLOW_SYMLINK_DEVICE], 1, [Define if enable symlink-device]),
185  AC_MSG_RESULT(no))
186AC_SUBST([ALLOW_SYMLINK_DEVICE])
187
188AC_MSG_CHECKING([which syslog facility to use])
189AC_ARG_WITH([logfacility],
190  AS_HELP_STRING([--with-logfacility], [syslog facility to log with (default "local7")]),
191  [case $with_logfacility in
192    daemon|auth|authpriv|local0|local1|local2|local3|local4|local5|local6|local7)
193        logfacility=$with_logfacility
194        ;;
195    *)  AC_MSG_ERROR(["unsupported facility $with_logfacility"])
196        ;;
197  esac],
198  [logfacility="local7"])
199AC_DEFINE_UNQUOTED([DEFAULT_LOG_FACILITY], ["$logfacility"], [syslog facility])
200AC_MSG_RESULT("$logfacility")
201
202AC_MSG_CHECKING([which syslog priority to use])
203AC_ARG_WITH([logpriority],
204  AS_HELP_STRING([--with-logpriority], [syslog priority to log with (default "info")]),
205  [case $with_logpriority in
206    emerg|alert|crit|err|warning|notice|info|debug)
207        logpriority=$with_logpriority
208        ;;
209    *)  AC_MSG_ERROR(["unsupported priority $with_logpriority"])
210        ;;
211  esac],
212  [logpriority="info"])
213AC_DEFINE_UNQUOTED([DEFAULT_LOG_PRIORITY], ["$logpriority"], [syslog priority])
214AC_MSG_RESULT("$logpriority")
215
216#AC_MSG_CHECKING([whether to use asynchronous io])
217#AC_ARG_WITH([aio],
218#  AS_HELP_STRING([--with-aio], [use aio (default "no")]),
219#  [case $with_aio in
220#    yes)
221#        AC_DEFINE([USE_AIO], 1, [use aio])
222#        AC_MSG_RESULT(yes)
223#        ;;
224#    *)
225#        AC_MSG_RESULT(no)
226#        ;;
227#  esac],
228#  AC_MSG_RESULT(no))
229#AC_SUBST([USE_AIO])
230
231# vbox support
232vbox="no"
233AC_MSG_CHECKING([VirtualBox Virtual Disk support])
234AC_ARG_WITH([vbox],
235  AS_HELP_STRING([--with-vbox=INC], [VirtualBox include]),
236  [case $with_vbox in
237     no)
238         AC_MSG_RESULT([no])
239         ;;
240     yes|*)
241         AC_MSG_RESULT([yes])
242         vbox="yes"
243         if test "$with_vbox" != "yes"; then
244             vboxinc="$with_vbox"
245         fi
246         ;;
247   esac],
248  [AC_MSG_RESULT([no])])
249AC_ARG_WITH([vboxlib],
250  AS_HELP_STRING([--with-vboxlib=LIB], [VirtualBox lib]),
251  [case $with_vboxlib in
252     no)
253         ;;
254     yes|*)
255         vbox="yes"
256         if test "$with_vboxlib" != "yes"; then
257             vboxlib="$with_vboxlib"
258         fi
259         ;;
260   esac],
261  [])
262# vbox support yes?
263if test "$vbox" = "yes"; then
264    vboxinc=`echo $vboxinc`
265    vboxlib=`echo $vboxlib`
266    if test ! -d "$vboxinc"; then
267        AC_MSG_ERROR([not directory: $vboxinc])
268    fi
269    if test ! -d "$vboxlib"; then
270        AC_MSG_ERROR([not directory: $vboxlib])
271    fi
272    CPPFLAGS="$CPPFLAGS -I$vboxinc"
273    LDFLAGS="$LDFLAGS -Wl,-rpath,$vboxlib"
274    LIBS="$LIBS $vboxlib/VBoxDDU.so $vboxlib/VBoxRT.so"
275    AC_DEFINE([USE_VBOXVD], 1, [Use vbox virtual disk support])
276    # define vbox include version
277    changequote(<<, >>)
278    vbox_major=`$SED -e '/^VBOX_VERSION_MAJOR[ 	]*=/!d' -e 's/.*=[^0-9]*\([0-9]*\).*/\1/' $vboxinc/../Config.kmk`
279    vbox_minor=`$SED -e '/^VBOX_VERSION_MINOR[ 	]*=/!d' -e 's/.*=[^0-9]*\([0-9]*\).*/\1/' $vboxinc/../Config.kmk`
280    vbox_build=`$SED -e '/^VBOX_VERSION_BUILD[ 	]*=/!d' -e 's/.*=[^0-9]*\([0-9]*\).*/\1/' $vboxinc/../Config.kmk`
281    changequote([, ])
282    AC_DEFINE_UNQUOTED([ISTGT_VBOXINC_VERSION_MAJOR], [$vbox_major], [VBox include major])
283    AC_DEFINE_UNQUOTED([ISTGT_VBOXINC_VERSION_MINOR], [$vbox_minor], [VBox include minor])
284    AC_DEFINE_UNQUOTED([ISTGT_VBOXINC_VERSION_BUILD], [$vbox_build], [VBox include build])
285fi
286
287# check for PTHREAD_MUTEX_ADAPTIVE_NP
288AC_MSG_CHECKING([for PTHREAD_MUTEX_ADAPTIVE_NP])
289AC_TRY_COMPILE([
290#include <pthread.h>
291],
292[
293	return (PTHREAD_MUTEX_ADAPTIVE_NP);
294],
295[AC_MSG_RESULT([yes])
296AC_DEFINE([HAVE_PTHREAD_MUTEX_ADAPTIVE_NP], [1], [Define 1 if you have the value.])],
297[AC_MSG_RESULT([no])]
298)
299
300AC_CHECK_HEADERS([sys/types.h])
301AC_CHECK_HEADERS([machine/atomic.h], [], [],
302[#if HAVE_SYS_TYPES_H
303#include <sys/types.h>
304#endif
305])
306AC_CHECK_HEADERS([sys/atomic.h])
307
308# for FeeeBSD
309#AC_CHECK_FUNCS([atomic_store_rel_int atomic_load_acq_int])
310#AC_CHECK_FUNCS([atomic_cmpset_ptr atomic_cmpset_64 atomic_cmpset_32])
311
312# for NetBSD
313#AC_CHECK_FUNCS([atomic_swap_uint atomic_or_uint_nv])
314#AC_CHECK_FUNCS([atomic_cas_ptr atomic_cas_64 atomic_cas_32])
315
316atomic="no"
317AC_MSG_CHECKING([for atomic operations])
318AC_TRY_LINK([
319#if HAVE_SYS_TYPES_H
320#include <sys/types.h>
321#endif
322#include <machine/atomic.h>
323],
324[
325	int x, y;
326	atomic_store_rel_int(&x, 1);
327	y = atomic_load_acq_int(&x);
328],
329[AC_DEFINE([USE_ATOMIC], [1], [Use atomic])
330AC_DEFINE([HAVE_ATOMIC_STORE_REL_INT], [1], [Define 1 if you have the function.])
331AC_DEFINE([HAVE_ATOMIC_LOAD_ACQ_INT], [1], [Define 1 if you have the function.])
332atomic="yes"]
333)
334if test $atomic = "no"; then
335AC_TRY_LINK([
336#if HAVE_SYS_TYPES_H
337#include <sys/types.h>
338#endif
339#include <sys/atomic.h>
340],
341[
342	unsigned int x, y;
343	atomic_swap_uint(&x, 1);
344	y = atomic_or_uint_nv(&x, 0);
345],
346[AC_DEFINE([USE_ATOMIC], [1], [Use atomic])
347AC_DEFINE([HAVE_ATOMIC_SWAP_UINT], [1], [Define 1 if you have the function.])
348AC_DEFINE([HAVE_ATOMIC_OR_UINT_NV], [1], [Define 1 if you have the function.])
349atomic="yes"]
350)
351fi
352AC_TRY_LINK([
353#if HAVE_SYS_TYPES_H
354#include <sys/types.h>
355#endif
356#include <sys/atomic.h>
357],
358[
359	membar_producer();
360],
361[AC_DEFINE([HAVE_MEMBAR_PRODUCER], [1], [Define 1 if you have the function.])]
362)
363AC_MSG_RESULT($atomic)
364
365# for gcc builtin
366#AC_CHECK_FUNCS([__sync_fetch_and_add __sync_val_compare_and_swap])
367#AC_CHECK_FUNCS([__sync_synchronize])
368
369gcc_atomic="no"
370AC_MSG_CHECKING([for gcc builtin atomic operations])
371AC_TRY_LINK([
372#if HAVE_SYS_TYPES_H
373#include <sys/types.h>
374#endif
375],
376[
377	unsigned int x, y;
378	y = __sync_fetch_and_add(&x, 0);
379	__sync_val_compare_and_swap(&x, y, 2);
380],
381[AC_DEFINE([USE_GCC_ATOMIC], [1], [Use gcc builtin atomic])
382AC_DEFINE([HAVE_GCC_ATOMIC_FETCH_AND_ADD_UINT], [1], [Define 1 if you have the function.])
383AC_DEFINE([HAVE_GCC_ATOMIC_VAL_COMPARE_AND_SWAP_UINT], [1], [Define 1 if you have the function.])
384gcc_atomic="yes"]
385)
386AC_TRY_LINK([
387#if HAVE_SYS_TYPES_H
388#include <sys/types.h>
389#endif
390],
391[
392	__sync_synchronize();
393],
394[AC_DEFINE([HAVE_GCC_ATOMIC_SYNCHRONIZE], [1], [Define 1 if you have the function.])]
395)
396AC_MSG_RESULT($gcc_atomic)
397
398AC_CONFIG_FILES([Makefile src/Makefile etc/Makefile doc/Makefile])
399AC_CONFIG_FILES([src/build.h])
400AC_OUTPUT
401