1#!/bin/sh 2# 3# $Id: configure,v 1.64 2017/07/01 09:47:30 schwarze Exp $ 4# 5# Copyright (c) 2014, 2015, 2016, 2017 Ingo Schwarze <schwarze@openbsd.org> 6# 7# Permission to use, copy, modify, and distribute this software for any 8# purpose with or without fee is hereby granted, provided that the above 9# copyright notice and this permission notice appear in all copies. 10# 11# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 19set -e 20 21[ -w config.log ] && mv config.log config.log.old 22[ -w config.h ] && mv config.h config.h.old 23 24# Output file descriptor usage: 25# 1 (stdout): config.h, Makefile.local 26# 2 (stderr): original stderr, usually to the console 27# 3: config.log 28 29exec 3> config.log 30echo "config.log: writing..." 31 32# --- default settings ------------------------------------------------- 33# Initialize all variables here, 34# such that nothing can leak in from the environment. 35 36SOURCEDIR=`dirname "$0"` 37 38MANPATH_BASE="/usr/share/man:/usr/X11R6/man" 39MANPATH_DEFAULT="/usr/share/man:/usr/X11R6/man:/usr/local/man" 40OSNAME= 41UTF8_LOCALE= 42 43CC=`printf "all:\\n\\t@echo \\\$(CC)\\n" | env -i make -sf -` 44CFLAGS="-g -W -Wall -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings" 45CFLAGS="${CFLAGS} -Wno-unused-parameter" 46LDADD= 47LDFLAGS= 48LD_NANOSLEEP= 49LD_OHASH= 50LD_RECVMSG= 51STATIC="-static" 52 53BUILD_CGI=0 54BUILD_CATMAN=0 55INSTALL_LIBMANDOC=0 56 57HAVE_CMSG= 58HAVE_CMSG_XPG42=0 59HAVE_DIRENT_NAMLEN= 60HAVE_EFTYPE= 61HAVE_ENDIAN= 62HAVE_ERR= 63HAVE_FTS= 64HAVE_FTS_COMPARE_CONST= 65HAVE_GETLINE= 66HAVE_GETSUBOPT= 67HAVE_ISBLANK= 68HAVE_MKDTEMP= 69HAVE_NANOSLEEP= 70HAVE_NTOHL= 71HAVE_O_DIRECTORY= 72HAVE_OHASH= 73HAVE_PATH_MAX= 74HAVE_PLEDGE= 75HAVE_PROGNAME= 76HAVE_REALLOCARRAY= 77HAVE_RECALLOCARRAY= 78HAVE_RECVMSG= 79HAVE_REWB_BSD= 80HAVE_REWB_SYSV= 81HAVE_SANDBOX_INIT= 82HAVE_STRCASESTR= 83HAVE_STRINGLIST= 84HAVE_STRLCAT= 85HAVE_STRLCPY= 86HAVE_STRPTIME= 87HAVE_STRSEP= 88HAVE_STRTONUM= 89HAVE_SYS_ENDIAN= 90HAVE_VASPRINTF= 91HAVE_WCHAR= 92 93PREFIX="/usr/local" 94BINDIR= 95SBINDIR= 96BIN_FROM_SBIN= 97INCLUDEDIR= 98LIBDIR= 99MANDIR= 100HOMEBREWDIR= 101 102WWWPREFIX="/var/www" 103HTDOCDIR= 104CGIBINDIR= 105 106BINM_APROPOS="apropos" 107BINM_CATMAN="catman" 108BINM_MAKEWHATIS="makewhatis" 109BINM_MAN="man" 110BINM_SOELIM="soelim" 111BINM_WHATIS="whatis" 112MANM_MAN="man" 113MANM_MANCONF="man.conf" 114MANM_MDOC="mdoc" 115MANM_ROFF="roff" 116MANM_EQN="eqn" 117MANM_TBL="tbl" 118 119INSTALL="install" 120INSTALL_PROGRAM= 121INSTALL_LIB= 122INSTALL_MAN= 123INSTALL_DATA= 124LN="ln -f" 125 126# --- manual settings from configure.local ----------------------------- 127 128if [ -r ./configure.local ]; then 129 echo "configure.local: reading..." 1>&2 130 echo "configure.local: reading..." 1>&3 131 cat ./configure.local 1>&3 132 . ./configure.local 133else 134 echo "configure.local: no (fully automatic configuration)" 1>&2 135 echo "configure.local: no (fully automatic configuration)" 1>&3 136fi 137echo 1>&3 138 139# --- tests for config.h ---------------------------------------------- 140 141COMP="${CC} ${CFLAGS} -Wno-unused -Werror" 142 143# Check whether this HAVE_ setting is manually overridden. 144# If yes, use the override, if no, do not decide anything yet. 145# Arguments: lower-case test name, manual value 146ismanual() { 147 [ -z "${3}" ] && return 1 148 echo "${1}: manual (HAVE_${2}=${3})" 1>&2 149 echo "${1}: manual (HAVE_${2}=${3})" 1>&3 150 echo 1>&3 151 return 0 152} 153 154# Run a single autoconfiguration test. 155# In case of success, enable the feature. 156# In case of failure, do not decide anything yet. 157# Arguments: lower-case test name, upper-case test name, additional CFLAGS 158singletest() { 159 cat 1>&3 << __HEREDOC__ 160${1}${3}: testing... 161${COMP} -o test-${1} test-${1}.c ${3} 162__HEREDOC__ 163 164 if ${COMP} -o "test-${1}" "${SOURCEDIR}/test-${1}.c" ${3} 1>&3 2>&3 165 then 166 echo "${1}${3}: ${CC} succeeded" 1>&3 167 else 168 echo "${1}${3}: ${CC} failed with $?" 1>&3 169 echo 1>&3 170 return 1 171 fi 172 173 if ./test-${1} 1>&3 2>&3; then 174 echo "${1}${3}: yes" 1>&2 175 echo "${1}${3}: yes" 1>&3 176 echo 1>&3 177 eval HAVE_${2}=1 178 rm "test-${1}" 179 return 0 180 else 181 echo "${1}${3}: execution failed with $?" 1>&3 182 echo 1>&3 183 rm "test-${1}" 184 return 1 185 fi 186} 187 188# Run a complete autoconfiguration test, including the check for 189# a manual override and disabling the feature on failure. 190# Arguments: lower case name, upper case name, additional CFLAGS 191runtest() { 192 eval _manual=\${HAVE_${2}} 193 ismanual "${1}" "${2}" "${_manual}" && return 0 194 singletest "${1}" "${2}" "${3}" && return 0 195 echo "${1}${3}: no" 1>&2 196 eval HAVE_${2}=0 197 return 1 198} 199 200# Select a UTF-8 locale. 201get_locale() { 202 [ -n "${HAVE_WCHAR}" ] && [ "${HAVE_WCHAR}" -eq 0 ] && return 0 203 ismanual UTF8_LOCALE UTF8_LOCALE "$UTF8_LOCALE" && return 0 204 echo "UTF8_LOCALE: testing..." 1>&3 205 UTF8_LOCALE=`locale -a | grep -i '^en_US\.UTF-*8$' | head -n 1` 206 if [ -z "${UTF8_LOCALE}" ]; then 207 UTF8_LOCALE=`locale -a | grep -i '\.UTF-*8' | head -n 1` 208 [ -n "${UTF8_LOCALE}" ] || return 1 209 fi 210 echo "UTF8_LOCALE=${UTF8_LOCALE}" 1>&2 211 echo "UTF8_LOCALE=${UTF8_LOCALE}" 1>&3 212 echo 1>&3 213 return 0; 214} 215 216 217# --- library functions --- 218runtest dirent-namlen DIRENT_NAMLEN || true 219runtest be32toh ENDIAN || true 220runtest be32toh SYS_ENDIAN -DSYS_ENDIAN || true 221runtest EFTYPE EFTYPE || true 222runtest err ERR || true 223runtest getline GETLINE || true 224runtest getsubopt GETSUBOPT || true 225runtest isblank ISBLANK || true 226runtest mkdtemp MKDTEMP || true 227runtest ntohl NTOHL || true 228runtest O_DIRECTORY O_DIRECTORY || true 229runtest PATH_MAX PATH_MAX || true 230runtest pledge PLEDGE || true 231runtest sandbox_init SANDBOX_INIT || true 232runtest progname PROGNAME || true 233runtest reallocarray REALLOCARRAY || true 234runtest recallocarray RECALLOCARRAY || true 235runtest rewb-bsd REWB_BSD || true 236runtest rewb-sysv REWB_SYSV || true 237runtest strcasestr STRCASESTR || true 238runtest stringlist STRINGLIST || true 239runtest strlcat STRLCAT || true 240runtest strlcpy STRLCPY || true 241runtest strptime STRPTIME || true 242runtest strsep STRSEP || true 243runtest strtonum STRTONUM || true 244runtest vasprintf VASPRINTF || true 245 246if [ ${HAVE_ENDIAN} -eq 0 -a \ 247 ${HAVE_SYS_ENDIAN} -eq 0 -a \ 248 ${HAVE_NTOHL} -eq 0 ]; then 249 echo "FATAL: no endian conversion functions found" 1>&2 250 echo "FATAL: no endian conversion functions found" 1>&3 251 exit 1 252fi 253 254if ismanual fts FTS ${HAVE_FTS}; then 255 HAVE_FTS_COMPARE_CONST=0 256elif runtest fts FTS_COMPARE_CONST -DFTS_COMPARE_CONST; then 257 HAVE_FTS=1 258else 259 runtest fts FTS || true 260fi 261 262# --- wide character and locale support --- 263if get_locale; then 264 runtest wchar WCHAR -DUTF8_LOCALE=\"${UTF8_LOCALE}\" || true 265else 266 HAVE_WCHAR=0 267 echo "wchar: no (no UTF8_LOCALE)" 1>&2 268 echo "wchar: no (no UTF8_LOCALE)" 1>&3 269fi 270 271# --- nanosleep --- 272if [ -n "${LD_NANOSLEEP}" ]; then 273 runtest nanosleep NANOSLEEP "${LD_NANOSLEEP}" || true 274elif singletest nanosleep NANOSLEEP; then 275 : 276elif runtest nanosleep NANOSLEEP "-lrt"; then 277 LD_NANOSLEEP="-lrt" 278fi 279if [ "${HAVE_NANOSLEEP}" -eq 0 ]; then 280 echo "FATAL: nanosleep: no" 1>&2 281 echo "FATAL: nanosleep: no" 1>&3 282 exit 1 283fi 284 285if [ ${BUILD_CATMAN} -gt 0 ]; then 286 # --- recvmsg --- 287 if [ -n "${LD_RECVMSG}" ]; then 288 runtest recvmsg RECVMSG "${LD_RECVMSG}" || true 289 elif singletest recvmsg RECVMSG; then 290 : 291 elif runtest recvmsg RECVMSG "-lsocket"; then 292 LD_RECVMSG="-lsocket" 293 fi 294 if [ "${HAVE_RECVMSG}" -eq 0 ]; then 295 echo "FATAL: recvmsg: no" 1>&2 296 echo "FATAL: recvmsg: no" 1>&3 297 echo "Without recvmsg(2), you cannot BUILD_CATMAN." 1>&2 298 exit 1 299 fi 300 301 # --- cmsg --- 302 if singletest cmsg CMSG; then 303 : 304 elif runtest cmsg CMSG "-D_XPG4_2"; then 305 HAVE_CMSG_XPG42=1 306 fi 307 if [ "${HAVE_CMSG}" -eq 0 ]; then 308 echo "FATAL: cmsg: no" 1>&2 309 echo "FATAL: cmsg: no" 1>&3 310 echo "Without CMSG_FIRSTHDR(3), you cannot BUILD_CATMAN." 1>&2 311 exit 1 312 fi 313fi 314 315# --- ohash --- 316if ismanual ohash OHASH "${HAVE_OHASH}"; then 317 : 318elif [ -n "${LD_OHASH}" ]; then 319 runtest ohash OHASH "${LD_OHASH}" || true 320elif singletest ohash OHASH; then 321 : 322elif runtest ohash OHASH "-lutil"; then 323 LD_OHASH="-lutil" 324fi 325if [ "${HAVE_OHASH}" -eq 0 ]; then 326 LD_OHASH= 327fi 328 329# --- LDADD --- 330LDADD="${LDADD} ${LD_NANOSLEEP} ${LD_RECVMSG} ${LD_OHASH} -lz" 331echo "LDADD=\"${LDADD}\"" 1>&2 332echo "LDADD=\"${LDADD}\"" 1>&3 333echo 1>&3 334 335# --- write config.h --- 336 337exec > config.h 338 339cat << __HEREDOC__ 340#ifdef __cplusplus 341#error "Do not use C++. See the INSTALL file." 342#endif 343 344#if !defined(__GNUC__) || (__GNUC__ < 4) 345#define __attribute__(x) 346#endif 347 348#if defined(__linux__) || defined(__MINT__) 349#define _GNU_SOURCE /* See test-*.c what needs this. */ 350#endif 351 352__HEREDOC__ 353 354[ ${HAVE_GETLINE} -eq 0 -o \ 355 ${HAVE_REALLOCARRAY} -eq 0 -o ${HAVE_RECALLOCARRAY} -eq 0 -o \ 356 ${HAVE_STRLCAT} -eq 0 -o ${HAVE_STRLCPY} -eq 0 ] \ 357 && echo "#include <sys/types.h>" 358[ ${HAVE_VASPRINTF} -eq 0 ] && echo "#include <stdarg.h>" 359[ ${HAVE_GETLINE} -eq 0 ] && echo "#include <stdio.h>" 360 361echo 362echo "#define MAN_CONF_FILE \"/etc/${MANM_MANCONF}\"" 363echo "#define MANPATH_BASE \"${MANPATH_BASE}\"" 364echo "#define MANPATH_DEFAULT \"${MANPATH_DEFAULT}\"" 365[ -n "${OSNAME}" ] && echo "#define OSNAME \"${OSNAME}\"" 366[ -n "${UTF8_LOCALE}" ] && echo "#define UTF8_LOCALE \"${UTF8_LOCALE}\"" 367[ -n "${HOMEBREWDIR}" ] && echo "#define HOMEBREWDIR \"${HOMEBREWDIR}\"" 368[ ${HAVE_EFTYPE} -eq 0 ] && echo "#define EFTYPE EINVAL" 369[ ${HAVE_O_DIRECTORY} -eq 0 ] && echo "#define O_DIRECTORY 0" 370[ ${HAVE_PATH_MAX} -eq 0 ] && echo "#define PATH_MAX 4096" 371if [ ${HAVE_ENDIAN} -eq 0 -a ${HAVE_SYS_ENDIAN} -eq 0 ]; then 372 echo "#define be32toh ntohl" 373 echo "#define htobe32 htonl" 374fi 375 376cat << __HEREDOC__ 377#define HAVE_CMSG_XPG42 ${HAVE_CMSG_XPG42} 378#define HAVE_DIRENT_NAMLEN ${HAVE_DIRENT_NAMLEN} 379#define HAVE_ENDIAN ${HAVE_ENDIAN} 380#define HAVE_ERR ${HAVE_ERR} 381#define HAVE_FTS ${HAVE_FTS} 382#define HAVE_FTS_COMPARE_CONST ${HAVE_FTS_COMPARE_CONST} 383#define HAVE_GETLINE ${HAVE_GETLINE} 384#define HAVE_GETSUBOPT ${HAVE_GETSUBOPT} 385#define HAVE_ISBLANK ${HAVE_ISBLANK} 386#define HAVE_MKDTEMP ${HAVE_MKDTEMP} 387#define HAVE_NTOHL ${HAVE_NTOHL} 388#define HAVE_PLEDGE ${HAVE_PLEDGE} 389#define HAVE_PROGNAME ${HAVE_PROGNAME} 390#define HAVE_REALLOCARRAY ${HAVE_REALLOCARRAY} 391#define HAVE_RECALLOCARRAY ${HAVE_RECALLOCARRAY} 392#define HAVE_REWB_BSD ${HAVE_REWB_BSD} 393#define HAVE_REWB_SYSV ${HAVE_REWB_SYSV} 394#define HAVE_SANDBOX_INIT ${HAVE_SANDBOX_INIT} 395#define HAVE_STRCASESTR ${HAVE_STRCASESTR} 396#define HAVE_STRINGLIST ${HAVE_STRINGLIST} 397#define HAVE_STRLCAT ${HAVE_STRLCAT} 398#define HAVE_STRLCPY ${HAVE_STRLCPY} 399#define HAVE_STRPTIME ${HAVE_STRPTIME} 400#define HAVE_STRSEP ${HAVE_STRSEP} 401#define HAVE_STRTONUM ${HAVE_STRTONUM} 402#define HAVE_SYS_ENDIAN ${HAVE_SYS_ENDIAN} 403#define HAVE_VASPRINTF ${HAVE_VASPRINTF} 404#define HAVE_WCHAR ${HAVE_WCHAR} 405#define HAVE_OHASH ${HAVE_OHASH} 406 407#define BINM_APROPOS "${BINM_APROPOS}" 408#define BINM_CATMAN "${BINM_CATMAN}" 409#define BINM_MAKEWHATIS "${BINM_MAKEWHATIS}" 410#define BINM_MAN "${BINM_MAN}" 411#define BINM_SOELIM "${BINM_SOELIM}" 412#define BINM_WHATIS "${BINM_WHATIS}" 413 414__HEREDOC__ 415 416if [ ${HAVE_ERR} -eq 0 ]; then 417 echo "extern void err(int, const char *, ...);" 418 echo "extern void errx(int, const char *, ...);" 419 echo "extern void warn(const char *, ...);" 420 echo "extern void warnx(const char *, ...);" 421fi 422 423[ ${HAVE_GETLINE} -eq 0 ] && \ 424 echo "extern ssize_t getline(char **, size_t *, FILE *);" 425 426[ ${HAVE_GETSUBOPT} -eq 0 ] && \ 427 echo "extern int getsubopt(char **, char * const *, char **);" 428 429[ ${HAVE_ISBLANK} -eq 0 ] && \ 430 echo "extern int isblank(int);" 431 432[ ${HAVE_MKDTEMP} -eq 0 ] && \ 433 echo "extern char *mkdtemp(char *);" 434 435if [ ${HAVE_PROGNAME} -eq 0 ]; then 436 echo "extern const char *getprogname(void);" 437 echo "extern void setprogname(const char *);" 438fi 439 440[ ${HAVE_REALLOCARRAY} -eq 0 ] && \ 441 echo "extern void *reallocarray(void *, size_t, size_t);" 442 443[ ${HAVE_RECALLOCARRAY} -eq 0 ] && \ 444 echo "extern void *recallocarray(void *, size_t, size_t, size_t);" 445 446[ ${HAVE_STRCASESTR} -eq 0 ] && \ 447 echo "extern char *strcasestr(const char *, const char *);" 448 449[ ${HAVE_STRLCAT} -eq 0 ] && \ 450 echo "extern size_t strlcat(char *, const char *, size_t);" 451 452[ ${HAVE_STRLCPY} -eq 0 ] && \ 453 echo "extern size_t strlcpy(char *, const char *, size_t);" 454 455[ ${HAVE_STRSEP} -eq 0 ] && \ 456 echo "extern char *strsep(char **, const char *);" 457 458[ ${HAVE_STRTONUM} -eq 0 ] && \ 459 echo "extern long long strtonum(const char *, long long, long long, const char **);" 460 461[ ${HAVE_VASPRINTF} -eq 0 ] && \ 462 echo "extern int vasprintf(char **, const char *, va_list);" 463 464echo "config.h: written" 1>&2 465echo "config.h: written" 1>&3 466 467# --- tests for Makefile.local ----------------------------------------- 468 469exec > Makefile.local 470 471[ -z "${BINDIR}" ] && BINDIR="${PREFIX}/bin" 472[ -z "${SBINDIR}" ] && SBINDIR="${PREFIX}/sbin" 473[ -z "${BIN_FROM_SBIN}" ] && BIN_FROM_SBIN="../bin" 474[ -z "${INCLUDEDIR}" ] && INCLUDEDIR="${PREFIX}/include/mandoc" 475[ -z "${LIBDIR}" ] && LIBDIR="${PREFIX}/lib/mandoc" 476[ -z "${MANDIR}" ] && MANDIR="${PREFIX}/man" 477 478[ -z "${HTDOCDIR}" ] && HTDOCDIR="${WWWPREFIX}/htdocs" 479[ -z "${CGIBINDIR}" ] && CGIBINDIR="${WWWPREFIX}/cgi-bin" 480 481[ -z "${INSTALL_PROGRAM}" ] && INSTALL_PROGRAM="${INSTALL} -m 0555" 482[ -z "${INSTALL_LIB}" ] && INSTALL_LIB="${INSTALL} -m 0444" 483[ -z "${INSTALL_MAN}" ] && INSTALL_MAN="${INSTALL} -m 0444" 484[ -z "${INSTALL_DATA}" ] && INSTALL_DATA="${INSTALL} -m 0444" 485 486BUILD_TARGETS= 487[ ${BUILD_CGI} -gt 0 ] && BUILD_TARGETS="man.cgi" 488[ ${BUILD_CATMAN} -gt 0 ] && \ 489 BUILD_TARGETS="${BUILD_TARGETS} mandocd catman" 490INSTALL_TARGETS= 491[ ${INSTALL_LIBMANDOC} -gt 0 ] && INSTALL_TARGETS="lib-install" 492[ ${BUILD_CGI} -gt 0 ] && INSTALL_TARGETS="${INSTALL_TARGETS} cgi-install" 493[ ${BUILD_CATMAN} -gt 0 ] && \ 494 INSTALL_TARGETS="${INSTALL_TARGETS} catman-install" 495 496cat << __HEREDOC__ 497BUILD_TARGETS = ${BUILD_TARGETS} 498INSTALL_TARGETS = ${INSTALL_TARGETS} 499CC = ${CC} 500CFLAGS = ${CFLAGS} 501LDADD = ${LDADD} 502LDFLAGS = ${LDFLAGS} 503STATIC = ${STATIC} 504PREFIX = ${PREFIX} 505BINDIR = ${BINDIR} 506SBINDIR = ${SBINDIR} 507BIN_FROM_SBIN = ${BIN_FROM_SBIN} 508INCLUDEDIR = ${INCLUDEDIR} 509LIBDIR = ${LIBDIR} 510MANDIR = ${MANDIR} 511WWWPREFIX = ${WWWPREFIX} 512HTDOCDIR = ${HTDOCDIR} 513CGIBINDIR = ${CGIBINDIR} 514BINM_APROPOS = ${BINM_APROPOS} 515BINM_CATMAN = ${BINM_CATMAN} 516BINM_MAKEWHATIS = ${BINM_MAKEWHATIS} 517BINM_MAN = ${BINM_MAN} 518BINM_SOELIM = ${BINM_SOELIM} 519BINM_WHATIS = ${BINM_WHATIS} 520MANM_MAN = ${MANM_MAN} 521MANM_MANCONF = ${MANM_MANCONF} 522MANM_MDOC = ${MANM_MDOC} 523MANM_ROFF = ${MANM_ROFF} 524MANM_EQN = ${MANM_EQN} 525MANM_TBL = ${MANM_TBL} 526INSTALL = ${INSTALL} 527INSTALL_PROGRAM = ${INSTALL_PROGRAM} 528INSTALL_LIB = ${INSTALL_LIB} 529INSTALL_MAN = ${INSTALL_MAN} 530INSTALL_DATA = ${INSTALL_DATA} 531LN = ${LN} 532__HEREDOC__ 533 534echo "Makefile.local: written" 1>&2 535echo "Makefile.local: written" 1>&3 536 537exit 0 538