summaryrefslogtreecommitdiff
path: root/contrib/libarchive_autodetect-st_lib_archive.m4
blob: 4419e888f240106f4ef7e47ee69bd5977bd4ddad (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
dnl
dnl @synopsis ST_LIB_ARCHIVE([ENABLED-DEFAULT])
dnl
dnl This macro figures out what's necessary to link a program against an
dnl instance of the BSD libarchive package by Tim Kientzle.
dnl 
dnl See http://people.freebsd.org/~kientzle/libarchive/ for more info.
dnl
dnl It exports and substitutes the variables LIBARCHIVE_LIBS, LIBARCHIVE_LDFLAGS,
dnl and LIBARCHIVE_CPPFLAGS to appropriate values for the identified instance of
dnl libarchive.  The values are AC_SUBST'd, so a user could, for example, simply
dnl include @LIBARCHIVE_CPPFLAGS@ in the definition of AM_CPPFLAGS in a Makefile.am.
dnl
dnl ENABLED-DEFAULT is either "yes" or "no" and determines whether the default value
dnl is --with-libarchive or --without-libarchive.  It is not possible to specify a
dnl default directory.  More simply, any reasonable choice for a default should just
dnl go into the auto-detect list.
dnl
dnl The macro defines the symbol HAVE_LIBARCHIVE if the library is found. You
dnl should use autoheader to include a definition for this symbol in a config.h
dnl file. Sample usage in a C/C++ source is as follows:
dnl
dnl   #ifdef HAVE_LIBARCHIVE
dnl   #include <archive.h>
dnl   #endif /* HAVE_LIBARCHIVE */
dnl
dnl @category InstalledPackages
dnl @author Andre Stechert <andre@splunk.com>
dnl @version 2006-04-20
dnl @license GPLWithACException

AC_DEFUN([ST_LIB_ARCHIVE],
[
#
# Handle input from the configurer and blend with the requirements from the maintainer.
# We go through the trouble of creating a second set of variables other than the with_foo
# variables in order to be sure that error/corner cases have been cleaned up.
#
# After this statement, three trusted variable are defined.
#
# st_lib_archive_ENABLED will be either "yes" or "no".  its value determines whether
# or not we bother with the rest of the checks and whether or not we export a
# bunch of variables.
#
# st_lib_archive_LOCATION will be either "auto" or "defined".  if it is "auto", then
# we try a bunch of standard locations.  if it is "defined", then we just try the value
# provided in st_lib_archive_DIR.
#
# st_lib_archive_DIR will contain the string provided by the user, provided that it's
# actually a directory.
#
AC_MSG_CHECKING([if libarchive is wanted])
AC_ARG_WITH([libarchive],
	AS_HELP_STRING([--with-libarchive=DIR], [libarchive installation directory]),
	[if test "x$with_libarchive" = "xno" ; then
		st_lib_archive_ENABLED=no
	elif test "x$with_libarchive" = "xyes" ; then
		st_lib_archive_ENABLED=yes
		st_lib_archive_LOCATION=auto
	else
		st_lib_archive_ENABLED=yes
		st_lib_archive_LOCATION=defined
		if test -d "$with_libarchive" ; then
			st_lib_archive_DIR="$with_libarchive"
		else
			AC_MSG_ERROR([$with_libarchive is not a directory])
		fi
	fi],
	[if test "x$1" = "xno" ; then
		st_lib_archive_ENABLED=no
	elif test "x$1" = "xyes" ; then
		st_lib_archive_ENABLED=yes
	else
		st_lib_archive_ENABLED=yes
	fi])

if test "$st_lib_archive_ENABLED" = "yes" ; then
	AC_MSG_RESULT([yes])
#
# After this statement, one trusted variable is defined.
#
# st_lib_archive_LIB will be either "lib" or "lib64", depending on whether the configurer
# specified 32, 64.  The default is "lib".
#
	AC_MSG_CHECKING([whether to use lib or lib64])
	AC_ARG_WITH([libarchive-bits],
		AS_HELP_STRING([--with-libarchive-bits=32/64], [if 64, look in /lib64 on hybrid systems]),
		[if test "x$with_libarchive_bits" = "x32" ; then
			st_lib_archive_LIB=lib
		elif test "x$with_libarchive_bits" = "x64" ; then
			st_lib_archive_LIB=lib64
		else
			AC_MSG_ERROR([the argument must be either 32 or 64])
		fi],
		[st_lib_archive_LIB=lib])
	AC_MSG_RESULT($st_lib_archive_LIB)
#
# Save the environment before verifying libarchive availability
#
	st_lib_archive_SAVECPPFLAGS="$CPPFLAGS"
	st_lib_archive_SAVELDFLAGS="$LDFLAGS"
	AC_LANG_SAVE
	AC_LANG_C

	if test "x$st_lib_archive_LOCATION" = "xdefined" ; then
		CPPFLAGS="-I$st_lib_archive_DIR/include $st_lib_archive_SAVECPPFLAGS"
		LDFLAGS="-L$st_lib_archive_DIR/$st_lib_archive_LIB $st_lib_archive_SAVELDFLAGS"
		AC_CHECK_LIB(archive, archive_read_new, [st_lib_archive_found_lib=yes], [st_lib_archive_found_lib=no])
		AC_CHECK_HEADER(archive.h, [st_lib_archive_found_hdr=yes], [st_lib_archive_found_hdr=no])
		if test "x$st_lib_archive_found_lib" = "xyes" && test "x$st_lib_archive_found_hdr" = "xyes"; then
			LIBARCHIVE_CPPFLAGS="-I$dir/include"
			LIBARCHIVE_LDFLAGS="-L$dir/$st_lib_archive_LIB"
		else
			AC_MSG_ERROR([could not find libarchive in the requested location])
		fi
	else
		#
		# These are the common install directories for Linux, FreeBSD, Solaris, and Mac.
		#
		for dir in /usr /usr/local /usr/sfw /opt/csw /opt/local /sw
		do
			if test -d "$dir" ; then
				CPPFLAGS="-I$dir/include $st_lib_archive_SAVECPPFLAGS"
				LDFLAGS="-L$dir/$st_lib_archive_LIB $st_lib_archive_SAVELDFLAGS"
				AC_CHECK_LIB(archive, archive_read_new, [st_lib_archive_found_lib=yes], [st_lib_archive_found_lib=no])
				AC_CHECK_HEADER(archive.h, [st_lib_archive_found_hdr=yes], [st_lib_archive_found_hdr=no])
				if test "x$st_lib_archive_found_lib" = "xyes" && test "x$st_lib_archive_found_hdr" = "xyes"; then
					LIBARCHIVE_CPPFLAGS="-I$dir/include"
					LIBARCHIVE_LDFLAGS="-L$dir/$st_lib_archive_LIB"
					break
				fi
			fi
		done
	fi

	if test "x$st_lib_archive_found_hdr" = "xyes" && test "x$st_lib_archive_found_lib" = "xyes" ; then
		LIBARCHIVE_LIBS="-larchive"
		AC_DEFINE([HAVE_LIBARCHIVE], [1], [Defined to 1 if libarchive is available for use.])
		AC_SUBST(LIBARCHIVE_LIBS)
		AC_SUBST(LIBARCHIVE_CPPFLAGS)
		AC_SUBST(LIBARCHIVE_LDFLAGS)
	fi

#
# Restore the environment now that we're done.
#
	AC_LANG_RESTORE
	CPPFLAGS="$st_lib_archive_SAVECPPFLAGS"
	LDFLAGS="$st_lib_archive_SAVELDFLAGS"
else
	AC_MSG_RESULT([no])
fi
AM_CONDITIONAL(LIBARCHIVE, test "x$st_lib_archive_found_lib" = "xyes" && test "x$st_lib_archive_found_hdr" = "xyes")
])