Home | History | Annotate | Line # | Download | only in dist
configure revision 1.6
      1 #!/bin/sh
      2 #
      3 # Copyright (c) 2014, 2015, 2016 Ingo Schwarze <schwarze (at] 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 
     17 set -e
     18 DIR="`dirname "$0"`"
     19 
     20 [ -w config.log ] && mv config.log config.log.old
     21 [ -w config.h   ] && mv config.h config.h.old
     22 
     23 # Output file descriptor usage:
     24 # 1 (stdout): config.h, Makefile.local
     25 # 2 (stderr): original stderr, usually to the console
     26 # 3: config.log
     27 
     28 exec 3> config.log
     29 echo "config.log: writing..."
     30 
     31 # --- default settings -------------------------------------------------
     32 # Initialize all variables here,
     33 # such that nothing can leak in from the environment.
     34 
     35 MANPATH_DEFAULT="/usr/share/man:/usr/X11R6/man:/usr/local/man"
     36 OSNAME=
     37 MAKEFLAGS=
     38 
     39 CC=`printf "all:\\n\\t@echo \\\$(CC)\\n" | make -f -`
     40 CFLAGS="-g -W -Wall -Wstrict-prototypes -Wno-unused-parameter -Wwrite-strings"
     41 LDADD=
     42 LDFLAGS=
     43 LD_OHASH=
     44 LD_SQLITE3=
     45 STATIC="-static"
     46 
     47 BUILD_DB=1
     48 BUILD_CGI=0
     49 
     50 HAVE_DIRENT_NAMLEN=
     51 HAVE_ERR=
     52 HAVE_FTS=
     53 HAVE_GETLINE=
     54 HAVE_GETSUBOPT=
     55 HAVE_ISBLANK=
     56 HAVE_MKDTEMP=
     57 HAVE_MMAP=
     58 HAVE_PLEDGE=
     59 HAVE_PROGNAME=
     60 HAVE_REALLOCARRAY=
     61 HAVE_REWB_BSD=
     62 HAVE_REWB_SYSV=
     63 HAVE_SANDBOX_INIT=
     64 HAVE_STRCASESTR=
     65 HAVE_STRINGLIST=
     66 HAVE_STRLCAT=
     67 HAVE_STRLCPY=
     68 HAVE_STRPTIME=
     69 HAVE_STRSEP=
     70 HAVE_STRTONUM=
     71 HAVE_VASPRINTF=
     72 HAVE_WCHAR=
     73 
     74 HAVE_SQLITE3=
     75 HAVE_SQLITE3_ERRSTR=
     76 HAVE_OHASH=
     77 HAVE_MANPATH=
     78 
     79 PREFIX="/usr/local"
     80 BINDIR=
     81 SBINDIR=
     82 INCLUDEDIR=
     83 LIBDIR=
     84 MANDIR=
     85 HOMEBREWDIR=
     86 
     87 WWWPREFIX="/var/www"
     88 HTDOCDIR=
     89 CGIBINDIR=
     90 
     91 BINM_APROPOS="apropos"
     92 BINM_MAKEWHATIS="makewhatis"
     93 BINM_MAN="man"
     94 BINM_SOELIM="soelim"
     95 BINM_WHATIS="whatis"
     96 MANM_MAN="man"
     97 MANM_MANCONF="man.conf"
     98 MANM_MDOC="mdoc"
     99 MANM_ROFF="roff"
    100 MANM_EQN="eqn"
    101 MANM_TBL="tbl"
    102 
    103 INSTALL="install"
    104 INSTALL_PROGRAM=
    105 INSTALL_LIB=
    106 INSTALL_MAN=
    107 INSTALL_DATA=
    108 
    109 # --- manual settings from configure.local -----------------------------
    110 
    111 if [ -r ./configure.local ]; then
    112 	echo "configure.local: reading..." 1>&2
    113 	echo "configure.local: reading..." 1>&3
    114 	cat ./configure.local 1>&3
    115 	. ./configure.local
    116 else
    117 	echo "configure.local: no (fully automatic configuration)" 1>&2
    118 	echo "configure.local: no (fully automatic configuration)" 1>&3
    119 fi
    120 echo 1>&3
    121 
    122 # --- tests for config.h  ----------------------------------------------
    123 
    124 COMP="${CC} ${CFLAGS} -Wno-unused -Werror"
    125 
    126 # Check whether this HAVE_ setting is manually overridden.
    127 # If yes, use the override, if no, do not decide anything yet.
    128 # Arguments: lower-case test name, manual value
    129 ismanual() {
    130 	[ -z "${2}" ] && return 1
    131 	echo "${1}: manual (${2})" 1>&2
    132 	echo "${1}: manual (${2})" 1>&3
    133 	echo 1>&3
    134 	return 0
    135 }
    136 
    137 # Run a single autoconfiguration test.
    138 # In case of success, enable the feature.
    139 # In case of failure, do not decide anything yet.
    140 # Arguments: lower-case test name, upper-case test name, additional CFLAGS
    141 singletest() {
    142 	cat 1>&3 << __HEREDOC__
    143 ${1}: testing...
    144 ${COMP} ${3} -o test-${1} test-${1}.c
    145 __HEREDOC__
    146 
    147 	if ${COMP} ${3} -o "test-${1}" "${DIR}/test-${1}.c" 1>&3 2>&3; then
    148 		echo "${1}: ${CC} succeeded" 1>&3
    149 	else
    150 		echo "${1}: ${CC} failed with $?" 1>&3
    151 		echo 1>&3
    152 		return 1
    153 	fi
    154 
    155 	if ./test-${1} 1>&3 2>&3; then
    156 		echo "${1}: yes" 1>&2
    157 		echo "${1}: yes" 1>&3
    158 		echo 1>&3
    159 		eval HAVE_${2}=1
    160 		rm "test-${1}"
    161 		return 0
    162 	else
    163 		echo "${1}: execution failed with $?" 1>&3
    164 		echo 1>&3
    165 		rm "test-${1}"
    166 		return 1
    167 	fi
    168 }
    169 
    170 # Run a complete autoconfiguration test, including the check for
    171 # a manual override and disabling the feature on failure.
    172 # Arguments: lower case name, upper case name, additional CFLAGS
    173 runtest() {
    174 	eval _manual=\${HAVE_${2}}
    175 	ismanual "${1}" "${_manual}" && return 0
    176 	singletest "${1}" "${2}" "${3}" && return 0
    177 	echo "${1}: no" 1>&2
    178 	eval HAVE_${2}=0
    179 	return 1
    180 }
    181 
    182 # --- library functions ---
    183 runtest dirent-namlen	DIRENT_NAMLEN	|| true
    184 runtest err		ERR		|| true
    185 runtest fts		FTS		|| true
    186 runtest getline		GETLINE		|| true
    187 runtest getsubopt	GETSUBOPT	|| true
    188 runtest isblank		ISBLANK		|| true
    189 runtest mkdtemp		MKDTEMP		|| true
    190 runtest mmap		MMAP		|| true
    191 runtest pledge		PLEDGE		|| true
    192 runtest sandbox_init	SANDBOX_INIT	|| true
    193 runtest progname	PROGNAME	|| true
    194 runtest reallocarray	REALLOCARRAY	|| true
    195 runtest rewb-bsd	REWB_BSD	|| true
    196 runtest rewb-sysv	REWB_SYSV	|| true
    197 runtest strcasestr	STRCASESTR	|| true
    198 runtest stringlist	STRINGLIST	|| true
    199 runtest strlcat		STRLCAT		|| true
    200 runtest strlcpy		STRLCPY		|| true
    201 runtest strptime	STRPTIME	|| true
    202 runtest strsep		STRSEP		|| true
    203 runtest strtonum	STRTONUM	|| true
    204 runtest vasprintf	VASPRINTF	|| true
    205 runtest wchar		WCHAR		|| true
    206 
    207 # --- sqlite3 ---
    208 if [ ${BUILD_DB} -eq 0 ]; then
    209 	echo "BUILD_DB=0 (manual)" 1>&2
    210 	echo "BUILD_DB=0 (manual)" 1>&3
    211 	echo 1>&3
    212 	HAVE_SQLITE3=0
    213 elif ismanual sqlite3 "${HAVE_SQLITE3}"; then
    214 	if [ -z "${LD_SQLITE3}" ]; then
    215 		LD_SQLITE3="-lsqlite3"
    216 	fi
    217 elif [ -n "${LD_SQLITE3}" ]; then
    218 	runtest sqlite3 SQLITE3 "${LD_SQLITE3}" || true
    219 elif singletest sqlite3 SQLITE3 "-lsqlite3"; then
    220 	LD_SQLITE3="-lsqlite3"
    221 elif runtest sqlite3 SQLITE3 \
    222 		"-I/usr/local/include -L/usr/local/lib -lsqlite3"; then
    223 	LD_SQLITE3="-L/usr/local/lib -lsqlite3"
    224 	CFLAGS="${CFLAGS} -I/usr/local/include"
    225 fi
    226 if [ ${HAVE_SQLITE3} -eq 0 ]; then
    227 	LD_SQLITE3=
    228 	if [ ${BUILD_DB} -gt 0 ]; then
    229 		echo "BUILD_DB=0 (no sqlite3)" 1>&2
    230 		echo "BUILD_DB=0 (no sqlite3)" 1>&3
    231 		echo 1>&3
    232 		BUILD_DB=0
    233 	fi
    234 fi
    235 
    236 # --- sqlite3_errstr ---
    237 if [ ${BUILD_DB} -eq 0 ]; then
    238 	HAVE_SQLITE3_ERRSTR=1
    239 elif ismanual sqlite3_errstr "${HAVE_SQLITE3_ERRSTR}"; then
    240 	:
    241 else
    242 	runtest sqlite3_errstr SQLITE3_ERRSTR "${LD_SQLITE3}" || true
    243 fi
    244 
    245 # --- ohash ---
    246 if ismanual ohash "${HAVE_OHASH}"; then
    247 	:
    248 elif [ -n "${LD_OHASH}" ]; then
    249 	runtest ohash OHASH "${LD_OHASH}" || true
    250 elif singletest ohash OHASH; then
    251 	:
    252 elif runtest ohash OHASH "-lutil"; then
    253 	LD_OHASH="-lutil"
    254 fi
    255 if [ "${HAVE_OHASH}" -eq 0 ]; then
    256 	LD_OHASH=
    257 fi
    258 
    259 # --- LDADD ---
    260 LDADD="${LDADD} ${LD_SQLITE3} ${LD_OHASH} -lz"
    261 echo "LDADD=\"${LDADD}\"" 1>&2
    262 echo "LDADD=\"${LDADD}\"" 1>&3
    263 echo 1>&3
    264 
    265 # --- manpath ---
    266 if ismanual manpath "${HAVE_MANPATH}"; then
    267 	:
    268 elif manpath 1>&3 2>&3; then
    269 	echo "manpath: yes" 1>&2
    270 	echo "manpath: yes" 1>&3
    271 	echo 1>&3
    272 	HAVE_MANPATH=1
    273 else
    274 	echo "manpath: no" 1>&2
    275 	echo "manpath: no" 1>&3
    276 	echo 1>&3
    277 	HAVE_MANPATH=0
    278 fi
    279 
    280 # --- write config.h ---
    281 
    282 exec > config.h
    283 
    284 cat << __HEREDOC__
    285 #ifdef __cplusplus
    286 #error "Do not use C++.  See the INSTALL file."
    287 #endif
    288 
    289 #ifndef MANDOC_CONFIG_H
    290 #define MANDOC_CONFIG_H
    291 
    292 #ifdef HAVE_NBTOOL_CONFIG_H
    293 #include "nbtool_config.h"
    294 #endif
    295 
    296 #if defined(__linux__) || defined(__MINT__)
    297 #define _GNU_SOURCE	/* See test-*.c what needs this. */
    298 #endif
    299 
    300 __HEREDOC__
    301 
    302 [ ${HAVE_GETLINE} -eq 0 -o ${HAVE_REALLOCARRAY} -eq 0 -o \
    303   ${HAVE_STRLCAT} -eq 0 -o ${HAVE_STRLCPY} -eq 0 ] \
    304 	&& echo "#include <sys/types.h>"
    305 [ ${HAVE_VASPRINTF} -eq 0 ] && echo "#include <stdarg.h>"
    306 [ ${HAVE_GETLINE} -eq 0 ] && echo "#include <stdio.h>"
    307 
    308 echo
    309 echo "#define MAN_CONF_FILE \"/etc/${MANM_MANCONF}\""
    310 echo "#define MANPATH_DEFAULT \"${MANPATH_DEFAULT}\""
    311 [ -n "${OSNAME}" ] && echo "#define OSNAME \"${OSNAME}\""
    312 [ -n "${HOMEBREWDIR}" ] && echo "#define HOMEBREWDIR \"${HOMEBREWDIR}\""
    313 
    314 cat << __HEREDOC__
    315 #ifndef HAVE_NBTOOL_CONFIG_H
    316 #define HAVE_DIRENT_NAMLEN ${HAVE_DIRENT_NAMLEN}
    317 #define HAVE_ERR ${HAVE_ERR}
    318 #define HAVE_FTS ${HAVE_FTS}
    319 #define HAVE_GETLINE ${HAVE_GETLINE}
    320 #define HAVE_GETSUBOPT ${HAVE_GETSUBOPT}
    321 #define HAVE_ISBLANK ${HAVE_ISBLANK}
    322 #define HAVE_MKDTEMP ${HAVE_MKDTEMP}
    323 #define HAVE_MMAP ${HAVE_MMAP}
    324 #define HAVE_PLEDGE ${HAVE_PLEDGE}
    325 #define HAVE_PROGNAME ${HAVE_PROGNAME}
    326 #define HAVE_REALLOCARRAY ${HAVE_REALLOCARRAY}
    327 #define HAVE_REWB_BSD ${HAVE_REWB_BSD}
    328 #define HAVE_REWB_SYSV ${HAVE_REWB_SYSV}
    329 #define HAVE_SANDBOX_INIT ${HAVE_SANDBOX_INIT}
    330 #define HAVE_STRCASESTR ${HAVE_STRCASESTR}
    331 #define HAVE_STRINGLIST ${HAVE_STRINGLIST}
    332 #define HAVE_STRLCAT ${HAVE_STRLCAT}
    333 #define HAVE_STRLCPY ${HAVE_STRLCPY}
    334 #define HAVE_STRPTIME ${HAVE_STRPTIME}
    335 #define HAVE_STRSEP ${HAVE_STRSEP}
    336 #define HAVE_STRTONUM ${HAVE_STRTONUM}
    337 #define HAVE_VASPRINTF ${HAVE_VASPRINTF}
    338 #define HAVE_WCHAR ${HAVE_WCHAR}
    339 #define HAVE_SQLITE3 ${HAVE_SQLITE3}
    340 #define HAVE_SQLITE3_ERRSTR ${HAVE_SQLITE3_ERRSTR}
    341 #define HAVE_OHASH ${HAVE_OHASH}
    342 #define HAVE_MANPATH ${HAVE_MANPATH}
    343 #endif
    344 
    345 #define BINM_APROPOS "${BINM_APROPOS}"
    346 #define BINM_MAKEWHATIS "${BINM_MAKEWHATIS}"
    347 #define BINM_MAN "${BINM_MAN}"
    348 #define BINM_SOELIM "${BINM_SOELIM}"
    349 #define BINM_WHATIS "${BINM_WHATIS}"
    350 
    351 __HEREDOC__
    352 
    353 if [ ${HAVE_ERR} -eq 0 ]; then
    354 	echo "extern	void	  err(int, const char *, ...);"
    355 	echo "extern	void	  errx(int, const char *, ...);"
    356 	echo "extern	void	  warn(const char *, ...);"
    357 	echo "extern	void	  warnx(const char *, ...);"
    358 fi
    359 
    360 [ ${HAVE_GETLINE} -eq 0 ] && \
    361 	echo "extern	ssize_t	  getline(char **, size_t *, FILE *);"
    362 
    363 [ ${HAVE_GETSUBOPT} -eq 0 ] && \
    364 	echo "extern	int	  getsubopt(char **, char * const *, char **);"
    365 
    366 if [ ${HAVE_ISBLANK} -eq 0 ]; then
    367 	echo "#undef isblank"
    368 	echo "extern	int	  isblank(int);"
    369 fi
    370 
    371 [ ${HAVE_MKDTEMP} -eq 0 ] && \
    372 	echo "extern	char	 *mkdtemp(char *);"
    373 
    374 if [ ${HAVE_PROGNAME} -eq 0 ]; then
    375 	echo "extern 	const char *getprogname(void);"
    376 	echo "extern	void	  setprogname(const char *);"
    377 fi
    378 
    379 [ ${HAVE_REALLOCARRAY} -eq 0 ] && \
    380 	echo "extern	void	 *reallocarray(void *, size_t, size_t);"
    381 
    382 [ ${BUILD_DB} -gt 0 -a ${HAVE_SQLITE3_ERRSTR} -eq 0 ] &&
    383 	echo "extern	const char *sqlite3_errstr(int);"
    384 
    385 [ ${HAVE_STRCASESTR} -eq 0 ] && \
    386 	echo "extern	char	 *strcasestr(const char *, const char *);"
    387 
    388 [ ${HAVE_STRLCAT} -eq 0 ] && \
    389 	echo "extern	size_t	  strlcat(char *, const char *, size_t);"
    390 
    391 [ ${HAVE_STRLCPY} -eq 0 ] && \
    392 	echo "extern	size_t	  strlcpy(char *, const char *, size_t);"
    393 
    394 [ ${HAVE_STRSEP} -eq 0 ] && \
    395 	echo "#undef strsep"
    396 	echo "extern	char	 *strsep(char **, const char *);"
    397 
    398 [ ${HAVE_STRTONUM} -eq 0 ] && \
    399 	echo "extern	long long strtonum(const char *, long long, long long, const char **);"
    400 
    401 [ ${HAVE_VASPRINTF} -eq 0 ] && \
    402 	echo "extern	int	  vasprintf(char **, const char *, va_list);"
    403 
    404 echo
    405 echo "#endif /* MANDOC_CONFIG_H */"
    406 
    407 echo "config.h: written" 1>&2
    408 echo "config.h: written" 1>&3
    409 
    410 # --- tests for Makefile.local -----------------------------------------
    411 
    412 exec > Makefile.local
    413 
    414 [ -z "${BINDIR}"     ] && BINDIR="${PREFIX}/bin"
    415 [ -z "${SBINDIR}"    ] && SBINDIR="${PREFIX}/sbin"
    416 [ -z "${INCLUDEDIR}" ] && INCLUDEDIR="${PREFIX}/include/mandoc"
    417 [ -z "${LIBDIR}"     ] && LIBDIR="${PREFIX}/lib/mandoc"
    418 [ -z "${MANDIR}"     ] && MANDIR="${PREFIX}/man"
    419 
    420 [ -z "${HTDOCDIR}"   ] && HTDOCDIR="${WWWPREFIX}/htdocs"
    421 [ -z "${CGIBINDIR}"  ] && CGIBINDIR="${WWWPREFIX}/cgi-bin"
    422 
    423 [ -z "${INSTALL_PROGRAM}" ] && INSTALL_PROGRAM="${INSTALL} -m 0555"
    424 [ -z "${INSTALL_LIB}"     ] && INSTALL_LIB="${INSTALL} -m 0444"
    425 [ -z "${INSTALL_MAN}"     ] && INSTALL_MAN="${INSTALL} -m 0444"
    426 [ -z "${INSTALL_DATA}"    ] && INSTALL_DATA="${INSTALL} -m 0444"
    427 
    428 if [ ${BUILD_DB} -eq 0 -a ${BUILD_CGI} -gt 0 ]; then
    429 	echo "BUILD_CGI=0 (no BUILD_DB)" 1>&2
    430 	echo "BUILD_CGI=0 (no BUILD_DB)" 1>&3
    431 	BUILD_CGI=0
    432 fi
    433 
    434 BUILD_TARGETS="base-build"
    435 [ ${BUILD_CGI} -gt 0 ] && BUILD_TARGETS="${BUILD_TARGETS} cgi-build"
    436 INSTALL_TARGETS="base-install"
    437 [ ${BUILD_DB}  -gt 0 ] && INSTALL_TARGETS="${INSTALL_TARGETS} db-install"
    438 [ ${BUILD_CGI} -gt 0 ] && INSTALL_TARGETS="${INSTALL_TARGETS} cgi-install"
    439 
    440 cat << __HEREDOC__
    441 BUILD_TARGETS	= ${BUILD_TARGETS}
    442 INSTALL_TARGETS	= ${INSTALL_TARGETS}
    443 CC		= ${CC}
    444 CFLAGS		= ${CFLAGS}
    445 LDADD		= ${LDADD}
    446 LDFLAGS		= ${LDFLAGS}
    447 STATIC		= ${STATIC}
    448 PREFIX		= ${PREFIX}
    449 BINDIR		= ${BINDIR}
    450 SBINDIR		= ${SBINDIR}
    451 INCLUDEDIR	= ${INCLUDEDIR}
    452 LIBDIR		= ${LIBDIR}
    453 MANDIR		= ${MANDIR}
    454 WWWPREFIX	= ${WWWPREFIX}
    455 HTDOCDIR	= ${HTDOCDIR}
    456 CGIBINDIR	= ${CGIBINDIR}
    457 BINM_APROPOS	= ${BINM_APROPOS}
    458 BINM_MAKEWHATIS	= ${BINM_MAKEWHATIS}
    459 BINM_MAN	= ${BINM_MAN}
    460 BINM_SOELIM	= ${BINM_SOELIM}
    461 BINM_WHATIS	= ${BINM_WHATIS}
    462 MANM_MAN	= ${MANM_MAN}
    463 MANM_MANCONF	= ${MANM_MANCONF}
    464 MANM_MDOC	= ${MANM_MDOC}
    465 MANM_ROFF	= ${MANM_ROFF}
    466 MANM_EQN	= ${MANM_EQN}
    467 MANM_TBL	= ${MANM_TBL}
    468 INSTALL		= ${INSTALL}
    469 INSTALL_PROGRAM	= ${INSTALL_PROGRAM}
    470 INSTALL_LIB	= ${INSTALL_LIB}
    471 INSTALL_MAN	= ${INSTALL_MAN}
    472 INSTALL_DATA	= ${INSTALL_DATA}
    473 __HEREDOC__
    474 
    475 [ ${BUILD_DB} -gt 0 ] && \
    476 	echo "MAIN_OBJS	= \$(BASE_OBJS) \$(DB_OBJS)"
    477 
    478 echo "Makefile.local: written" 1>&2
    479 echo "Makefile.local: written" 1>&3
    480 
    481 exit 0
    482