Blob


1 AC_INIT([telescope], [0.10.1-current], [telescope@omarpolo.com],
2 [telescope], [gemini://telescope-browser.org])
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 # AC_PROC_YACC sets the environment variable $YACC for a suitable program to
12 # use, but doesn't check to see if it exists. Test for this -- if it's not
13 # present, error out.
14 AC_CHECK_PROG(found_yacc, $YACC, yes, no)
15 AS_IF([test "x$found_yacc" = "xno"], [AC_MSG_ERROR("yacc/bison not found")])
17 PKG_PROG_PKG_CONFIG
19 AC_ARG_VAR(HOSTCC, [The C compiler on the host.])
20 AC_ARG_VAR(HOSTCFLAGS, [CFLAGS for the host compiler])
22 test -z "${HOSTCC}" && HOSTCC='$(CC)'
23 test -z "${HOSTCFLAGS}" && HOSTCFLAGS='$(CFLAGS)'
25 AC_MSG_CHECKING([platform])
26 case "$host_os" in
27 *darwin*)
28 PLATFORM=darwin
29 ;;
30 *linux*)
31 PLATFORM=linux
32 ;;
33 *freebsd*)
34 PLATFORM=freebsd
35 ;;
36 *openbsd*)
37 PLATFORM=openbsd
38 ;;
39 *)
40 PLATFORM=unknown
41 ;;
42 esac
43 AC_MSG_RESULT($PLATFORM)
44 AC_SUBST(PLATFORM)
46 AC_ARG_WITH([Werror],
47 AS_HELP_STRING([--with-Werror],
48 [Add the compiler flag -Werror]))
50 AC_ARG_WITH([libimsg],
51 AS_HELP_STRING([--with-libimsg],
52 [Build with imsg-compat library (default: disabled)]))
54 AC_ARG_WITH([libbsd],
55 AS_HELP_STRING([--with-libbsd],
56 [Build with libbsd library (default: disabled)]))
58 AC_ARG_WITH([default-editor],
59 AS_HELP_STRING([--with-default-editor],
60 [Set the default editor to use (default: ed)]),
61 [DEFAULT_EDITOR=$withval],
62 [DEFAULT_EDITOR=ed])
63 AC_MSG_NOTICE([Using default-editor: $DEFAULT_EDITOR])
64 AC_DEFINE_UNQUOTED([DEFAULT_EDITOR], ["$DEFAULT_EDITOR"], [The default editor])
66 DEFAULT_OPENER=xdg-open
67 AS_IF([test "x$platform" = "xdarwin"], [
68 DEFAULT_OPENER=open
69 ])
71 AC_ARG_WITH([default-opener],
72 AS_HELP_STRING([--with-default-opener],
73 [Set the default program to use (default: $DEFAULT_OPENER)]),
74 [DEFAULT_OPENER=$withval])
75 AC_MSG_NOTICE([Using default-opener: $DEFAULT_OPENER])
76 AC_DEFINE_UNQUOTED([DEFAULT_OPENER], ["$DEFAULT_OPENER"], [The default opener])
78 AC_CHECK_HEADERS([ \
79 libutil.h \
80 util.h \
81 ])
83 AS_IF([test "x$with_libbsd" = "xyes"], [
84 PKG_CHECK_MODULES([libbsd], [libbsd-overlay libbsd-ctor], [
85 CFLAGS="$libbsd_CFLAGS $CFLAGS"
86 LIBS="$libbsd_LIBS $LIBS"
87 ])
88 ])
90 if test "x$PLATFORM" = "xdarwin"; then
91 export LDFLAGS="-L/opt/homebrew/opt/libressl/lib $LDFLAGS"
92 export CPPFLAGS="-I/opt/homebrew/opt/libressl/include $CPPFLAGS"
93 export PKG_CONFIG_PATH="/opt/homebrew/opt/libressl/lib/pkgconfig $PKG_CONFIG_PATH"
94 fi
96 AC_REPLACE_FUNCS([
97 asprintf \
98 err \
99 explicit_bzero \
100 fgetln \
101 fparseln \
102 freezero \
103 getdtablecount \
104 getdtablesize \
105 getprogname \
106 memmem \
107 reallocarray \
108 recallocarray \
109 strcasestr \
110 strlcat \
111 strlcpy \
112 strsep \
113 strtonum \
114 setproctitle \
115 ])
117 AC_MSG_CHECKING([for sys/queue.h with TAILQ_FOREACH_SAFE])
118 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
119 #include <sys/queue.h>
120 #include <stddef.h>
121 ], [
122 TAILQ_HEAD(tailhead, entry) head;
123 struct entry {
124 TAILQ_ENTRY(entry) entries;
125 } *np, *nt;
126 TAILQ_INIT(&head);
127 TAILQ_FOREACH_SAFE(np, &head, entries, nt) {
128 /* nop */ ;
130 return 0;
131 ])], [
132 AC_MSG_RESULT(yes)
133 AC_DEFINE([HAVE_QUEUE_H], 1, [QUEUE_H])
134 ], AC_MSG_RESULT(no))
136 AC_CHECK_DECL(timespecsub,
137 [AC_DEFINE([HAVE_TIMESPECSUB], 1, [have timespecsub])], [],
138 [#include <sys/time.h>])
140 AC_CHECK_DECL(timercmp,
141 [AC_DEFINE([HAVE_TIMERCMP], 1, [have timercmp])], [],
142 [#include <sys/time.h>])
144 dnl can't be used as r-value.
145 AC_MSG_CHECKING([for TIMEVAL_TO_TIMESPEC])
146 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
147 #include <sys/time.h>
148 ], [
149 struct timeval a = {0, 0};
150 struct timespec b;
151 TIMEVAL_TO_TIMESPEC(&a, &b);
152 return (int)b.tv_sec;
153 ])], [
154 AC_MSG_RESULT(yes)
155 AC_DEFINE([HAVE_TIMEVAL_TO_TIMESPEC], 1, [have TIMEVAL_TO_TIMESPEC])
156 ], AC_MSG_RESULT(no))
158 AC_CHECK_HEADER([endian.h], [AC_DEFINE(HAVE_ENDIAN_H, 1, [have endian.h])], [
159 AC_CHECK_HEADER([sys/endian.h],
160 [AC_DEFINE(HAVE_SYS_ENDIAN_H, 1, [have sys/endian.h])], [
161 AC_CHECK_HEADERS([libkern/OSByteOrder.h],
162 [AC_DEFINE(HAVE_LIBKERN_OSBYTEORDER_H, 1, [have OSByteOrder.h])],
163 [AC_MSG_ERROR([can't find compatible endian.h header])],
164 [#include <machine/endian.h>])
165 ])
166 ])
168 AC_CHECK_DECL(PR_SET_NAME, AC_DEFINE([HAVE_PR_SET_NAME], 1, [pr_set_name]), [],
169 [[#include <sys/prctl.h>]])
171 AC_SEARCH_LIBS([initscr], [ncursesw ncurses], [], [
172 AC_MSG_ERROR([requires either ncursesw or ncurses library])
173 ])
175 AC_SEARCH_LIBS([keyname], [ncursesw ncurses tinfow tinfo], [], [
176 AC_MSG_ERROR([requires either ncursesw or ncurses library with terminfo support])
177 ])
179 AC_SEARCH_LIBS([tls_init], [tls], [found_tls=yes], [found_tls=no])
181 AS_IF([test "x$found_tls" = "xno"], [
182 PKG_CHECK_MODULES([libtls], [libtls], [
183 CFLAGS="$libtls_CFLAGS $CFLAGS"
184 LIBS="$libtls_LIBS $LIBS"
185 ], [AC_MSG_ERROR([libtls not found.])])
186 ])
188 PKG_CHECK_MODULES([libgrapheme], [libgrapheme], [
189 AC_SUBST([LIBGRAPHEME], [])
190 CFLAGS="$libgrapheme_CFLAGS $CFLAGS"
191 LIBS="$libgrapheme_LIBS $LIBS"
192 ], [
193 # build the bundled version.
194 AC_SUBST([LIBGRAPHEME], "$srcdir/libgrapheme/libgrapheme.a")
195 CFLAGS="-I$srcdir/libgrapheme $CFLAGS"
196 ])
198 AS_IF([test "x$with_libimsg" = "xyes"], [
199 PKG_CHECK_MODULES([libimsg], [libimsg], [
200 CFLAGS="$libimsg_CFLAGS $CFLAGS"
201 LIBS="$libimsg_LIBS $LIBS"
202 ])
203 ])
205 AC_SEARCH_LIBS([imsgbuf_init], [util], [
206 AC_DEFINE([HAVE_IMSG], 1,
207 [Define to 1 if you have imsg functions (-lutil or -limsg).])
208 ], [
209 AC_LIBOBJ(imsg)
210 AC_LIBOBJ(imsg-buffer)
214 AC_SEARCH_LIBS([ohash_init], [util], [], [
215 AC_LIBOBJ(ohash)
216 AC_LIBOBJ(fmt_scaled)
217 ])
219 AC_CHECK_FUNCS([asr_run])
221 AC_SEARCH_LIBS([RAND_add], [crypto], [:], [
222 AC_MSG_ERROR([can't find libcrypto])
223 ])
225 AS_IF([test "x$PLATFORM" != "xdarwin"], [
226 AC_SEARCH_LIBS([SSL_CTX_new], [ssl], [:], [
227 AC_MSG_ERROR([can't find libssl])
228 ])
229 ])
231 # Sanity check for Libre/OpenSSL headers vs library mismatch
232 AC_MSG_CHECKING([whether libcrypto headers match the library])
233 AC_RUN_IFELSE([AC_LANG_PROGRAM([[
234 #include <openssl/opensslv.h>
235 #include <openssl/crypto.h>
236 ]], [[
237 return (OpenSSL_version_num() != OPENSSL_VERSION_NUMBER);
238 ]])], [
239 AC_MSG_RESULT([yes])
240 ], [
241 AC_MSG_RESULT([no])
242 AC_MSG_ERROR([libcrypto headers do not match the library.])
243 ], [
244 AC_MSG_WARN([skip (due to cross-compiling)])
245 ])
247 AC_CHECK_HEADERS([linux/landlock.h])
249 dnl after all the function checks, add optional support for -Werror
250 AS_IF([test "x$with_Werror" = "xyes"], [
251 CFLAGS="$CFLAGS -Werror"
252 ])
254 # check compiler flags
255 AC_DEFUN([CC_ADD_CHECK_FLAGS], [
256 AC_MSG_CHECKING([if $CC supports $1 flag])
257 old_CFLAGS="$CFLAGS"
258 CFLAGS="$CFLAGS -Werror $1"
259 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],[])], [
260 AC_MSG_RESULT(yes)
261 CFLAGS="$old_CFLAGS $1"
262 ], [
263 AC_MSG_RESULT(no)
264 CFLAGS="$old_CFLAGS"
265 ])
266 ])
267 CC_ADD_CHECK_FLAGS([-Wall])
268 CC_ADD_CHECK_FLAGS([-Wextra])
269 CC_ADD_CHECK_FLAGS([-Wmissing-declarations])
270 CC_ADD_CHECK_FLAGS([-Wmissing-prototypes])
271 CC_ADD_CHECK_FLAGS([-Wstrict-prototypes])
272 CC_ADD_CHECK_FLAGS([-Wwrite-strings])
273 CC_ADD_CHECK_FLAGS([-Wno-unused-parameter])
274 CC_ADD_CHECK_FLAGS([-Wno-format-truncation])
275 CC_ADD_CHECK_FLAGS([-Wno-pointer-sign])
276 CC_ADD_CHECK_FLAGS([-Wno-unused-result])
277 CC_ADD_CHECK_FLAGS([-Wpointer-arith])
278 CC_ADD_CHECK_FLAGS([-Wsign-compare])
279 CC_ADD_CHECK_FLAGS([-Wcast-align])
281 AC_CONFIG_HEADERS([config.h])
282 AC_CONFIG_FILES([
283 Makefile
284 test/Makefile
285 pages/about_about.gmi
286 pages/about_blank.gmi
287 pages/about_crash.gmi
288 pages/about_help.gmi
289 pages/about_license.gmi
290 pages/about_new.gmi
291 pages/bookmarks.gmi
292 ])
294 AC_OUTPUT