xref: /NextBSD/contrib/mdocml/configure (revision 287e3b14e9552995def1802ec9c5034f4adf28ec)
1#!/bin/sh
2#
3# Copyright (c) 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
4#
5# Permission to use, copy, modify, and distribute this software for any
6# purpose with or without fee is hereby granted, provided that the above
7# copyright notice and this permission notice appear in all copies.
8#
9# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
17set -e
18
19[ -e config.log ] && mv config.log config.log.old
20[ -e config.h   ] && mv config.h config.h.old
21
22# Output file descriptor usage:
23# 1 (stdout): config.h, Makefile.local
24# 2 (stderr): original stderr, usually to the console
25# 3: config.log
26
27exec 3> config.log
28echo "config.log: writing..."
29
30# --- default settings -------------------------------------------------
31# Initialize all variables here,
32# such that nothing can leak in from the environment.
33
34OSNAME=
35
36CC=`printf "all:\\n\\t@echo \\\$(CC)\\n" | make -f -`
37CFLAGS="-g -W -Wall -Wstrict-prototypes -Wno-unused-parameter -Wwrite-strings"
38DBLIB=
39STATIC="-static"
40
41BUILD_DB=1
42BUILD_CGI=0
43
44HAVE_DIRENT_NAMLEN=
45HAVE_FGETLN=
46HAVE_FTS=
47HAVE_GETSUBOPT=
48HAVE_MMAP=
49HAVE_REALLOCARRAY=
50HAVE_STRCASESTR=
51HAVE_STRLCAT=
52HAVE_STRLCPY=
53HAVE_STRPTIME=
54HAVE_STRSEP=
55HAVE_STRTONUM=
56HAVE_WCHAR=
57
58HAVE_SQLITE3=
59HAVE_SQLITE3_ERRSTR=
60HAVE_OHASH=
61HAVE_MANPATH=
62
63PREFIX="/usr/local"
64BINDIR=
65SBINDIR=
66INCLUDEDIR=
67LIBDIR=
68MANDIR=
69EXAMPLEDIR=
70HOMEBREWDIR=
71
72WWWPREFIX="/var/www"
73HTDOCDIR=
74CGIBINDIR=
75
76BINM_APROPOS="apropos"
77BINM_MAN="man"
78BINM_WHATIS="whatis"
79BINM_MAKEWHATIS="makewhatis"
80MANM_MAN="man"
81MANM_MDOC="mdoc"
82MANM_ROFF="roff"
83MANM_EQN="eqn"
84MANM_TBL="tbl"
85
86INSTALL="install"
87INSTALL_PROGRAM=
88INSTALL_LIB=
89INSTALL_MAN=
90INSTALL_DATA=
91
92# --- manual settings from configure.local -----------------------------
93
94if [ -e ./configure.local ]; then
95	echo "configure.local: reading..." 1>&2
96	echo "configure.local: reading..." 1>&3
97	cat ./configure.local 1>&3
98	. ./configure.local
99else
100	echo "configure.local: no (fully automatic configuration)" 1>&2
101	echo "configure.local: no (fully automatic configuration)" 1>&3
102fi
103echo 1>&3
104
105# --- tests for config.h  ----------------------------------------------
106
107COMP="${CC} ${CFLAGS} -Wno-unused -Werror"
108
109# Check whether this HAVE_ setting is manually overridden.
110# If yes, use the override, if no, do not decide anything yet.
111# Arguments: lower-case test name, manual value
112ismanual() {
113	[ -z "${2}" ] && return 1
114	echo "${1}: manual (${2})" 1>&2
115	echo "${1}: manual (${2})" 1>&3
116	echo 1>&3
117	return 0
118}
119
120# Run a single autoconfiguration test.
121# In case of success, enable the feature.
122# In case of failure, do not decide anything yet.
123# Arguments: lower-case test name, upper-case test name, additional CFLAGS
124singletest() {
125	cat 1>&3 << __HEREDOC__
126${1}: testing...
127${COMP} ${3} -o test-${1} test-${1}.c
128__HEREDOC__
129
130	if ${COMP} ${3} -o "test-${1}" "test-${1}.c" 1>&3 2>&3; then
131		echo "${1}: ${CC} succeeded" 1>&3
132	else
133		echo "${1}: ${CC} failed with $?" 1>&3
134		echo 1>&3
135		return 1
136	fi
137
138	if ./test-${1} 1>&3 2>&3; then
139		echo "${1}: yes" 1>&2
140		echo "${1}: yes" 1>&3
141		echo 1>&3
142		eval HAVE_${2}=1
143		rm "test-${1}"
144		return 0
145	else
146		echo "${1}: execution failed with $?" 1>&3
147		echo 1>&3
148		rm "test-${1}"
149		return 1
150	fi
151}
152
153# Run a complete autoconfiguration test, including the check for
154# a manual override and disabling the feature on failure.
155# Arguments: lower case name, upper case name, additional CFLAGS
156runtest() {
157	eval _manual=\${HAVE_${2}}
158	ismanual "${1}" "${_manual}" && return 0
159	singletest "${1}" "${2}" "${3}" && return 0
160	echo "${1}: no" 1>&2
161	eval HAVE_${2}=0
162	return 1
163}
164
165# --- library functions ---
166runtest dirent-namlen	DIRENT_NAMLEN	|| true
167runtest fgetln		FGETLN		|| true
168runtest fts		FTS		|| true
169runtest getsubopt	GETSUBOPT	|| true
170runtest mmap		MMAP		|| true
171runtest reallocarray	REALLOCARRAY	|| true
172runtest strcasestr	STRCASESTR	|| true
173runtest strlcat		STRLCAT		|| true
174runtest strlcpy		STRLCPY		|| true
175runtest strptime	STRPTIME	|| true
176runtest strsep		STRSEP		|| true
177runtest strtonum	STRTONUM	|| true
178runtest wchar		WCHAR		|| true
179
180# --- sqlite3 ---
181DETECTLIB=
182if [ ${BUILD_DB} -eq 0 ]; then
183	echo "BUILD_DB=0 (manual)" 1>&2
184	echo "BUILD_DB=0 (manual)" 1>&3
185	echo 1>&3
186	HAVE_SQLITE3=0
187elif ismanual sqlite3 "${HAVE_SQLITE3}"; then
188	DETECTLIB="-lsqlite3"
189elif [ -n "${DBLIB}" ]; then
190	runtest sqlite3 SQLITE3 "${DBLIB}" || true
191elif singletest sqlite3 SQLITE3 "-lsqlite3"; then
192	DETECTLIB="-lsqlite3"
193elif runtest sqlite3 SQLITE3 \
194		"-I/usr/local/include -L/usr/local/lib -lsqlite3"; then
195	DETECTLIB="-L/usr/local/lib -lsqlite3"
196	CFLAGS="${CFLAGS} -I/usr/local/include"
197fi
198if [ ${BUILD_DB} -gt 0 -a ${HAVE_SQLITE3} -eq 0 ]; then
199	echo "BUILD_DB=0 (no sqlite3)" 1>&2
200	echo "BUILD_DB=0 (no sqlite3)" 1>&3
201	echo 1>&3
202	BUILD_DB=0
203fi
204
205# --- sqlite3_errstr ---
206if [ ${BUILD_DB} -eq 0 ]; then
207	HAVE_SQLITE3_ERRSTR=1
208elif ismanual sqlite3_errstr "${HAVE_SQLITE3_ERRSTR}"; then
209	:
210elif [ -n "${DBLIB}" ]; then
211	runtest sqlite3_errstr SQLITE3_ERRSTR "${DBLIB}" || true
212else
213	runtest sqlite3_errstr SQLITE3_ERRSTR "${DETECTLIB}" || true
214fi
215
216# --- ohash ---
217if [ ${BUILD_DB} -eq 0 ]; then
218	HAVE_OHASH=1
219elif ismanual ohash "${HAVE_OHASH}"; then
220	:
221elif [ -n "${DBLIB}" ]; then
222	runtest ohash OHASH "${DBLIB}" || true
223elif singletest ohash OHASH; then
224	:
225elif runtest ohash OHASH "-lutil"; then
226	DETECTLIB="${DETECTLIB} -lutil"
227fi
228
229# --- DBLIB ---
230if [ ${BUILD_DB} -eq 0 ]; then
231	DBLIB=
232elif [ -z "${DBLIB}" ]; then
233	DBLIB="${DETECTLIB}"
234	echo "DBLIB=\"${DBLIB}\"" 1>&2
235	echo "DBLIB=\"${DBLIB}\"" 1>&3
236	echo 1>&3
237fi
238
239# --- manpath ---
240if ismanual manpath "${HAVE_MANPATH}"; then
241	:
242elif manpath 1>&3 2>&3; then
243	echo "manpath: yes" 1>&2
244	echo "manpath: yes" 1>&3
245	echo 1>&3
246	HAVE_MANPATH=1
247else
248	echo "manpath: no" 1>&2
249	echo "manpath: no" 1>&3
250	echo 1>&3
251	HAVE_MANPATH=0
252fi
253
254# --- write config.h ---
255
256exec > config.h
257
258cat << __HEREDOC__
259#ifndef MANDOC_CONFIG_H
260#define MANDOC_CONFIG_H
261
262#if defined(__linux__) || defined(__MINT__)
263#define _GNU_SOURCE	/* See test-*.c what needs this. */
264#endif
265
266__HEREDOC__
267
268[ ${HAVE_FGETLN} -eq 0 -o ${HAVE_REALLOCARRAY} -eq 0 -o \
269  ${HAVE_STRLCAT} -eq 0 -o ${HAVE_STRLCPY} -eq 0 ] \
270	&& echo "#include <sys/types.h>"
271[ ${HAVE_FGETLN} -eq 0 ] && echo "#include <stdio.h>"
272
273echo
274[ -n "${OSNAME}" ] && echo "#define OSNAME \"${OSNAME}\""
275[ -n "${HOMEBREWDIR}" ] && echo "#define HOMEBREWDIR \"${HOMEBREWDIR}\""
276
277cat << __HEREDOC__
278#define HAVE_DIRENT_NAMLEN ${HAVE_DIRENT_NAMLEN}
279#define HAVE_FGETLN ${HAVE_FGETLN}
280#define HAVE_FTS ${HAVE_FTS}
281#define HAVE_GETSUBOPT ${HAVE_GETSUBOPT}
282#define HAVE_MMAP ${HAVE_MMAP}
283#define HAVE_REALLOCARRAY ${HAVE_REALLOCARRAY}
284#define HAVE_STRCASESTR ${HAVE_STRCASESTR}
285#define HAVE_STRLCAT ${HAVE_STRLCAT}
286#define HAVE_STRLCPY ${HAVE_STRLCPY}
287#define HAVE_STRPTIME ${HAVE_STRPTIME}
288#define HAVE_STRSEP ${HAVE_STRSEP}
289#define HAVE_STRTONUM ${HAVE_STRTONUM}
290#define HAVE_WCHAR ${HAVE_WCHAR}
291#define HAVE_SQLITE3 ${HAVE_SQLITE3}
292#define HAVE_SQLITE3_ERRSTR ${HAVE_SQLITE3_ERRSTR}
293#define HAVE_OHASH ${HAVE_OHASH}
294#define HAVE_MANPATH ${HAVE_MANPATH}
295
296#define BINM_APROPOS "${BINM_APROPOS}"
297#define BINM_MAN "${BINM_MAN}"
298#define BINM_WHATIS "${BINM_WHATIS}"
299#define BINM_MAKEWHATIS "${BINM_MAKEWHATIS}"
300
301#if !defined(__BEGIN_DECLS)
302#  ifdef __cplusplus
303#  define	__BEGIN_DECLS		extern "C" {
304#  else
305#  define	__BEGIN_DECLS
306#  endif
307#endif
308#if !defined(__END_DECLS)
309#  ifdef __cplusplus
310#  define	__END_DECLS		}
311#  else
312#  define	__END_DECLS
313#  endif
314#endif
315
316__HEREDOC__
317
318[ ${HAVE_FGETLN} -eq 0 ] && \
319	echo "extern	char	 *fgetln(FILE *, size_t *);"
320
321[ ${HAVE_GETSUBOPT} -eq 0 ] && \
322	echo "extern	int	  getsubopt(char **, char * const *, char **);"
323
324[ ${HAVE_REALLOCARRAY} -eq 0 ] && \
325	echo "extern	void	 *reallocarray(void *, size_t, size_t);"
326
327[ ${BUILD_DB} -gt 0 -a ${HAVE_SQLITE3_ERRSTR} -eq 0 ] &&
328	echo "extern	const char *sqlite3_errstr(int);"
329
330[ ${HAVE_STRCASESTR} -eq 0 ] && \
331	echo "extern	char	 *strcasestr(const char *, const char *);"
332
333[ ${HAVE_STRLCAT} -eq 0 ] && \
334	echo "extern	size_t	  strlcat(char *, const char *, size_t);"
335
336[ ${HAVE_STRLCPY} -eq 0 ] && \
337	echo "extern	size_t	  strlcpy(char *, const char *, size_t);"
338
339[ ${HAVE_STRSEP} -eq 0 ] && \
340	echo "extern	char	 *strsep(char **, const char *);"
341
342[ ${HAVE_STRTONUM} -eq 0 ] && \
343	echo "extern	long long strtonum(const char *, long long, long long, const char **);"
344
345echo
346echo "#endif /* MANDOC_CONFIG_H */"
347
348echo "config.h: written" 1>&2
349echo "config.h: written" 1>&3
350
351# --- tests for Makefile.local -----------------------------------------
352
353exec > Makefile.local
354
355[ -z "${BINDIR}"     ] && BINDIR="${PREFIX}/bin"
356[ -z "${SBINDIR}"    ] && SBINDIR="${PREFIX}/sbin"
357[ -z "${INCLUDEDIR}" ] && INCLUDEDIR="${PREFIX}/include/mandoc"
358[ -z "${LIBDIR}"     ] && LIBDIR="${PREFIX}/lib/mandoc"
359[ -z "${MANDIR}"     ] && MANDIR="${PREFIX}/man"
360[ -z "${EXAMPLEDIR}" ] && EXAMPLEDIR="${PREFIX}/share/examples/mandoc"
361
362[ -z "${HTDOCDIR}"   ] && HTDOCDIR="${WWWPREFIX}/htdocs"
363[ -z "${CGIBINDIR}"  ] && CGIBINDIR="${WWWPREFIX}/cgi-bin"
364
365[ -z "${INSTALL_PROGRAM}" ] && INSTALL_PROGRAM="${INSTALL} -m 0555"
366[ -z "${INSTALL_LIB}"     ] && INSTALL_LIB="${INSTALL} -m 0444"
367[ -z "${INSTALL_MAN}"     ] && INSTALL_MAN="${INSTALL} -m 0444"
368[ -z "${INSTALL_DATA}"    ] && INSTALL_DATA="${INSTALL} -m 0444"
369
370if [ ${BUILD_DB} -eq 0 -a ${BUILD_CGI} -gt 0 ]; then
371	echo "BUILD_CGI=0 (no BUILD_DB)" 1>&2
372	echo "BUILD_CGI=0 (no BUILD_DB)" 1>&3
373	BUILD_CGI=0
374fi
375
376BUILD_TARGETS="base-build"
377[ ${BUILD_CGI} -gt 0 ] && BUILD_TARGETS="${BUILD_TARGETS} cgi-build"
378INSTALL_TARGETS="base-install"
379[ ${BUILD_DB}  -gt 0 ] && INSTALL_TARGETS="${INSTALL_TARGETS} db-install"
380[ ${BUILD_CGI} -gt 0 ] && INSTALL_TARGETS="${INSTALL_TARGETS} cgi-install"
381
382cat << __HEREDOC__
383BUILD_TARGETS	= ${BUILD_TARGETS}
384INSTALL_TARGETS	= ${INSTALL_TARGETS}
385CFLAGS		= ${CFLAGS}
386DBLIB		= ${DBLIB}
387STATIC		= ${STATIC}
388PREFIX		= ${PREFIX}
389BINDIR		= ${BINDIR}
390SBINDIR		= ${SBINDIR}
391INCLUDEDIR	= ${INCLUDEDIR}
392LIBDIR		= ${LIBDIR}
393MANDIR		= ${MANDIR}
394EXAMPLEDIR	= ${EXAMPLEDIR}
395WWWPREFIX	= ${WWWPREFIX}
396HTDOCDIR	= ${HTDOCDIR}
397CGIBINDIR	= ${CGIBINDIR}
398BINM_APROPOS	= ${BINM_APROPOS}
399BINM_MAN	= ${BINM_MAN}
400BINM_WHATIS	= ${BINM_WHATIS}
401BINM_MAKEWHATIS	= ${BINM_MAKEWHATIS}
402MANM_MAN	= ${MANM_MAN}
403MANM_MDOC	= ${MANM_MDOC}
404MANM_ROFF	= ${MANM_ROFF}
405MANM_EQN	= ${MANM_EQN}
406MANM_TBL	= ${MANM_TBL}
407INSTALL		= ${INSTALL}
408INSTALL_PROGRAM	= ${INSTALL_PROGRAM}
409INSTALL_LIB	= ${INSTALL_LIB}
410INSTALL_MAN	= ${INSTALL_MAN}
411INSTALL_DATA	= ${INSTALL_DATA}
412__HEREDOC__
413
414[ ${BUILD_DB} -gt 0 ] && \
415	echo "MAIN_OBJS	= \$(BASE_OBJS) \$(DB_OBJS)"
416
417echo "Makefile.local: written" 1>&2
418echo "Makefile.local: written" 1>&3
419
420exit 0
421