Blob


1 AC_INIT([telescope], [0.9-current], [telescope@omarpolo.com],
2 [telescope], [gemini://telescope.omarpolo.com])
3 AC_CONFIG_AUX_DIR(etc)
4 AC_CONFIG_LIBOBJ_DIR(compat)
5 AC_CANONICAL_HOST
6 AM_INIT_AUTOMAKE([-Wall foreign subdir-objects])
7 AC_PROG_CC
8 AC_USE_SYSTEM_EXTENSIONS
9 AC_PROG_YACC
11 PKG_PROG_PKG_CONFIG
13 AC_ARG_VAR(HOSTCC, [The C compiler on the host.])
14 AC_ARG_VAR(HOSTCFLAGS, [CFLAGS for the host compiler])
16 test -z "${HOSTCC}" && HOSTCC='$(CC)'
17 test -z "${HOSTCFLAGS}" && HOSTCFLAGS='$(CFLAGS)'
19 AC_ARG_WITH([Werror],
20 AS_HELP_STRING([--with-Werror],
21 [Add the compiler flag -Werror]))
23 AC_ARG_WITH([libimsg],
24 AS_HELP_STRING([--with-libimsg],
25 [Build with imsg-compat library (default: disabled)]))
27 AC_ARG_WITH([libbsd],
28 AS_HELP_STRING([--with-libbsd],
29 [Build with libbsd library (default: disabled)]))
31 AS_IF([test "x$with_libbsd" = "xyes"], [
32 PKG_CHECK_MODULES([libbsd], [libbsd-overlay libbsd-ctor], [
33 CFLAGS="$libbsd_CFLAGS $CFLAGS"
34 LIBS="$libbsd_LIBS $LIBS"
35 ])
36 ])
38 AC_REPLACE_FUNCS([
39 asprintf \
40 err \
41 explicit_bzero \
42 freezero \
43 getdtablecount \
44 getdtablesize \
45 getprogname \
46 memmem \
47 reallocarray \
48 recallocarray \
49 strcasestr \
50 strlcat \
51 strlcpy \
52 strsep \
53 strtonum \
54 setproctitle \
55 ])
57 AC_MSG_CHECKING([for sys/queue.h with TAILQ_FOREACH_SAFE])
58 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
59 #include <sys/queue.h>
60 #include <stddef.h>
61 ], [
62 TAILQ_HEAD(tailhead, entry) head;
63 struct entry {
64 TAILQ_ENTRY(entry) entries;
65 } *np, *nt;
66 TAILQ_INIT(&head);
67 TAILQ_FOREACH_SAFE(np, &head, entries, nt) {
68 /* nop */ ;
69 }
70 return 0;
71 ])], [
72 AC_MSG_RESULT(yes)
73 AC_DEFINE([HAVE_QUEUE_H], 1, [QUEUE_H])
74 ], AC_MSG_RESULT(no))
76 AC_CHECK_DECL(timespecsub,
77 [AC_DEFINE([HAVE_TIMESPECSUB], 1, [have timespecsub])], [],
78 [#include <sys/time.h>])
80 AC_CHECK_DECL(timercmp,
81 [AC_DEFINE([HAVE_TIMERCMP], 1, [have timercmp])], [],
82 [#include <sys/time.h>])
84 dnl can't be used as r-value.
85 AC_MSG_CHECKING([for TIMEVAL_TO_TIMESPEC])
86 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
87 #include <sys/time.h>
88 ], [
89 struct timeval a = {0, 0};
90 struct timespec b;
91 TIMEVAL_TO_TIMESPEC(&a, &b);
92 return (int)b.tv_sec;
93 ])], [
94 AC_MSG_RESULT(yes)
95 AC_DEFINE([HAVE_TIMEVAL_TO_TIMESPEC], 1, [have TIMEVAL_TO_TIMESPEC])
96 ], AC_MSG_RESULT(no))
98 AC_CHECK_HEADER([endian.h], [AC_DEFINE(HAVE_ENDIAN_H, 1, [have endian.h])], [
99 AC_CHECK_HEADER([sys/endian.h],
100 [AC_DEFINE(HAVE_SYS_ENDIAN_H, 1, [have sys/endian.h])], [
101 AC_CHECK_HEADERS([libkern/OSByteOrder.h],
102 [AC_DEFINE(HAVE_LIBKERN_OSBYTEORDER_H, 1, [have OSByteOrder.h])],
103 [AC_MSG_ERROR([can't find compatible endian.h header])],
104 [#include <machine/endian.h>])
105 ])
106 ])
108 AC_CHECK_DECL(PR_SET_NAME, AC_DEFINE([HAVE_PR_SET_NAME], 1, [pr_set_name]), [],
109 [[#include <sys/prctl.h>]])
111 AC_SEARCH_LIBS([initscr], [ncursesw ncurses], [], [
112 AC_MSG_ERROR([requires either ncursesw or ncurses library])
113 ])
115 AC_SEARCH_LIBS([keyname], [ncursesw ncurses tinfow tinfo], [], [
116 AC_MSG_ERROR([requires either ncursesw or ncurses library with terminfo support])
117 ])
119 AC_SEARCH_LIBS([tls_init], [tls], [], [
120 AC_MSG_ERROR([requires libtls])
121 ])
123 PKG_CHECK_MODULES([libgrapheme], [libgrapheme], [
124 AC_SUBST([LIBGRAPHEME], [])
125 CFLAGS="$libgrapheme_CFLAGS $CFLAGS"
126 LIBS="$libgrapheme_LIBS $LIBS"
127 ], [
128 # build the bundled version.
129 AC_SUBST([LIBGRAPHEME], "$srcdir/libgrapheme/libgrapheme.a")
130 CFLAGS="-I$srcdir/libgrapheme $CFLAGS"
131 ])
133 AS_IF([test "x$with_libimsg" = "xyes"], [
134 PKG_CHECK_MODULES([libimsg], [libimsg], [
135 CFLAGS="$libimsg_CFLAGS $CFLAGS"
136 LIBS="$libimsg_LIBS $LIBS"
137 ])
138 ])
140 AC_SEARCH_LIBS([imsg_init], [util], [
141 AC_DEFINE([HAVE_IMSG], 1,
142 [Define to 1 if you have imsg functions (-lutil or -limsg).])
143 ], [
144 AC_LIBOBJ(imsg)
145 AC_LIBOBJ(imsg-buffer)
149 AC_SEARCH_LIBS([ohash_init], [util], [], [
150 AC_LIBOBJ(ohash)
151 AC_LIBOBJ(fmt_scaled)
152 ])
154 AC_CHECK_FUNCS([asr_run])
156 AC_SEARCH_LIBS([RAND_add], [crypto], [:], [
157 AC_MSG_ERROR([can't find libcrypto])
158 ])
160 AC_SEARCH_LIBS([SSL_CTX_new], [ssl], [:], [
161 AC_MSG_ERROR([can't find libssl])
162 ])
164 # Sanity check for Libre/OpenSSL headers vs library mismatch
165 AC_MSG_CHECKING([whether libcrypto headers match the library])
166 AC_RUN_IFELSE([AC_LANG_PROGRAM([[
167 #include <openssl/opensslv.h>
168 #include <openssl/crypto.h>
169 ]], [[
170 return (OpenSSL_version_num() != OPENSSL_VERSION_NUMBER);
171 ]])], [
172 AC_MSG_RESULT([yes])
173 ], [
174 AC_MSG_RESULT([no])
175 AC_MSG_ERROR([libcrypto headers do not match the library.])
176 ], [
177 AC_MSG_WARN([skip (due to cross-compiling)])
178 ])
180 AC_CHECK_HEADERS([linux/landlock.h])
182 dnl after all the function checks, add optional support for -Werror
183 AS_IF([test "x$with_Werror" = "xyes"], [
184 CFLAGS="$CFLAGS -Werror"
185 ])
187 # check compiler flags
188 AC_DEFUN([CC_ADD_CHECK_FLAGS], [
189 AC_MSG_CHECKING([if $CC supports $1 flag])
190 old_CFLAGS="$CFLAGS"
191 CFLAGS="$CFLAGS -Werror $1"
192 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])], [
193 AC_MSG_RESULT(yes)
194 CFLAGS="$old_CFLAGS $1"
195 ], [
196 AC_MSG_RESULT(no)
197 CFLAGS="$old_CFLAGS"
198 ])
199 ])
200 CC_ADD_CHECK_FLAGS([-Wall])
201 CC_ADD_CHECK_FLAGS([-Wextra])
202 CC_ADD_CHECK_FLAGS([-Wmissing-declarations])
203 CC_ADD_CHECK_FLAGS([-Wmissing-prototypes])
204 CC_ADD_CHECK_FLAGS([-Wstrict-prototypes])
205 CC_ADD_CHECK_FLAGS([-Wwrite-strings])
206 CC_ADD_CHECK_FLAGS([-Wno-unused-parameter])
207 CC_ADD_CHECK_FLAGS([-Wno-format-truncation])
208 CC_ADD_CHECK_FLAGS([-Wno-pointer-sign])
209 CC_ADD_CHECK_FLAGS([-Wpointer-arith])
210 CC_ADD_CHECK_FLAGS([-Wsign-compare])
211 CC_ADD_CHECK_FLAGS([-Wcast-align])
213 AC_CONFIG_HEADERS([config.h])
214 AC_CONFIG_FILES([
215 Makefile
216 test/Makefile
217 pages/about_about.gmi
218 pages/about_blank.gmi
219 pages/about_crash.gmi
220 pages/about_help.gmi
221 pages/about_license.gmi
222 pages/about_new.gmi
223 pages/bookmarks.gmi
224 ])
226 AC_OUTPUT