1#!/bin/sh 2# 3# Id: configure,v 1.61 2017/02/18 12:24:24 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_DEFAULT="/usr/share/man:/usr/X11R6/man:/usr/local/man" 39OSNAME= 40MAKEFLAGS= 41UTF8_LOCALE= 42 43if [ -z "${CC}" ]; then 44 CC=`printf "all:\\n\\t@echo \\\$(CC)\\n" | env -i make -sf -` 45fi 46CFLAGS="-g -W -Wall -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings" 47CFLAGS="${CFLAGS} -Wno-unused-parameter" 48LDADD= 49LDFLAGS= 50LD_NANOSLEEP= 51LD_OHASH= 52LD_RECVMSG= 53STATIC="-static" 54 55BUILD_CGI=0 56BUILD_CATMAN=0 57INSTALL_LIBMANDOC=0 58 59HAVE_CMSG= 60HAVE_CMSG_XPG42=0 61HAVE_DIRENT_NAMLEN= 62HAVE_EFTYPE= 63HAVE_ENDIAN= 64HAVE_ERR= 65HAVE_FTS= 66HAVE_FTS_COMPARE_CONST= 67HAVE_GETLINE= 68HAVE_GETSUBOPT= 69HAVE_ISBLANK= 70HAVE_MKDTEMP= 71HAVE_NANOSLEEP= 72HAVE_NTOHL= 73HAVE_O_DIRECTORY= 74HAVE_OHASH= 75HAVE_PATH_MAX= 76HAVE_PLEDGE= 77HAVE_PROGNAME= 78HAVE_REALLOCARRAY= 79HAVE_RECVMSG= 80HAVE_REWB_BSD= 81HAVE_REWB_SYSV= 82HAVE_SANDBOX_INIT= 83HAVE_STRCASESTR= 84HAVE_STRINGLIST= 85HAVE_STRLCAT= 86HAVE_STRLCPY= 87HAVE_STRPTIME= 88HAVE_STRSEP= 89HAVE_STRTONUM= 90HAVE_SYS_ENDIAN= 91HAVE_VASPRINTF= 92HAVE_WCHAR= 93 94PREFIX="/usr/local" 95BINDIR= 96SBINDIR= 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 rewb-bsd REWB_BSD || true 235runtest rewb-sysv REWB_SYSV || true 236runtest strcasestr STRCASESTR || true 237runtest stringlist STRINGLIST || true 238runtest strlcat STRLCAT || true 239runtest strlcpy STRLCPY || true 240runtest strptime STRPTIME || true 241runtest strsep STRSEP || true 242runtest strtonum STRTONUM || true 243runtest vasprintf VASPRINTF || true 244 245if [ ${HAVE_ENDIAN} -eq 0 -a \ 246 ${HAVE_SYS_ENDIAN} -eq 0 -a \ 247 ${HAVE_NTOHL} -eq 0 ]; then 248 echo "FATAL: no endian conversion functions found" 1>&2 249 echo "FATAL: no endian conversion functions found" 1>&3 250 exit 1 251fi 252 253if ismanual fts FTS ${HAVE_FTS}; then 254 HAVE_FTS_COMPARE_CONST=0 255elif runtest fts FTS_COMPARE_CONST -DFTS_COMPARE_CONST; then 256 HAVE_FTS=1 257else 258 runtest fts FTS || true 259fi 260 261# --- wide character and locale support --- 262if get_locale; then 263 runtest wchar WCHAR -DUTF8_LOCALE=\"${UTF8_LOCALE}\" || true 264else 265 HAVE_WCHAR=0 266 echo "wchar: no (no UTF8_LOCALE)" 1>&2 267 echo "wchar: no (no UTF8_LOCALE)" 1>&3 268fi 269 270# --- nanosleep --- 271if [ -n "${LD_NANOSLEEP}" ]; then 272 runtest nanosleep NANOSLEEP "${LD_NANOSLEEP}" || true 273elif singletest nanosleep NANOSLEEP; then 274 : 275elif runtest nanosleep NANOSLEEP "-lrt"; then 276 LD_NANOSLEEP="-lrt" 277fi 278if [ "${HAVE_NANOSLEEP}" -eq 0 ]; then 279 echo "FATAL: nanosleep: no" 1>&2 280 echo "FATAL: nanosleep: no" 1>&3 281 exit 1 282fi 283 284if [ ${BUILD_CATMAN} -gt 0 ]; then 285 # --- recvmsg --- 286 if [ -n "${LD_RECVMSG}" ]; then 287 runtest recvmsg RECVMSG "${LD_RECVMSG}" || true 288 elif singletest recvmsg RECVMSG; then 289 : 290 elif runtest recvmsg RECVMSG "-lsocket"; then 291 LD_RECVMSG="-lsocket" 292 fi 293 if [ "${HAVE_RECVMSG}" -eq 0 ]; then 294 echo "FATAL: recvmsg: no" 1>&2 295 echo "FATAL: recvmsg: no" 1>&3 296 echo "Without recvmsg(2), you cannot BUILD_CATMAN." 1>&2 297 exit 1 298 fi 299 300 # --- cmsg --- 301 if singletest cmsg CMSG; then 302 : 303 elif runtest cmsg CMSG "-D_XPG4_2"; then 304 HAVE_CMSG_XPG42=1 305 fi 306 if [ "${HAVE_CMSG}" -eq 0 ]; then 307 echo "FATAL: cmsg: no" 1>&2 308 echo "FATAL: cmsg: no" 1>&3 309 echo "Without CMSG_FIRSTHDR(3), you cannot BUILD_CATMAN." 1>&2 310 exit 1 311 fi 312fi 313 314# --- ohash --- 315if ismanual ohash OHASH "${HAVE_OHASH}"; then 316 : 317elif [ -n "${LD_OHASH}" ]; then 318 runtest ohash OHASH "${LD_OHASH}" || true 319elif singletest ohash OHASH; then 320 : 321elif runtest ohash OHASH "-lutil"; then 322 LD_OHASH="-lutil" 323fi 324if [ "${HAVE_OHASH}" -eq 0 ]; then 325 LD_OHASH= 326fi 327 328# --- LDADD --- 329LDADD="${LDADD} ${LD_NANOSLEEP} ${LD_RECVMSG} ${LD_OHASH} -lz" 330echo "LDADD=\"${LDADD}\"" 1>&2 331echo "LDADD=\"${LDADD}\"" 1>&3 332echo 1>&3 333 334# --- write config.h --- 335 336exec > config.h 337 338cat << __HEREDOC__ 339#ifdef __cplusplus 340#error "Do not use C++. See the INSTALL file." 341#endif 342 343#if !defined(__GNUC__) || (__GNUC__ < 4) 344#define __attribute__(x) 345#endif 346 347#ifdef HAVE_NBTOOL_CONFIG_H 348#include "nbtool_config.h" 349#endif 350 351#if defined(__linux__) || defined(__MINT__) 352#define _GNU_SOURCE /* See test-*.c what needs this. */ 353#endif 354 355__HEREDOC__ 356 357[ ${HAVE_GETLINE} -eq 0 -o ${HAVE_REALLOCARRAY} -eq 0 -o \ 358 ${HAVE_STRLCAT} -eq 0 -o ${HAVE_STRLCPY} -eq 0 ] \ 359 && echo "#include <sys/types.h>" 360[ ${HAVE_VASPRINTF} -eq 0 ] && echo "#include <stdarg.h>" 361[ ${HAVE_GETLINE} -eq 0 ] && echo "#include <stdio.h>" 362 363echo 364echo "#define MAN_CONF_FILE \"/etc/${MANM_MANCONF}\"" 365echo "#define MANPATH_DEFAULT \"${MANPATH_DEFAULT}\"" 366[ -n "${OSNAME}" ] && echo "#define OSNAME \"${OSNAME}\"" 367[ -n "${UTF8_LOCALE}" ] && echo "#define UTF8_LOCALE \"${UTF8_LOCALE}\"" 368[ -n "${HOMEBREWDIR}" ] && echo "#define HOMEBREWDIR \"${HOMEBREWDIR}\"" 369[ ${HAVE_EFTYPE} -eq 0 ] && echo "#ifndef EFTYPE" && \ 370 echo "#define EFTYPE EINVAL" && echo "#endif" 371[ ${HAVE_O_DIRECTORY} -eq 0 ] && echo "#define O_DIRECTORY 0" 372[ ${HAVE_PATH_MAX} -eq 0 ] && echo "#define PATH_MAX 4096" 373if [ ${HAVE_ENDIAN} -eq 0 -a ${HAVE_SYS_ENDIAN} -eq 0 ]; then 374 echo "#define be32toh ntohl" 375 echo "#define htobe32 htonl" 376fi 377 378cat << __HEREDOC__ 379#ifndef HAVE_NBTOOL_CONFIG_H 380#define HAVE_CMSG_XPG42 ${HAVE_CMSG_XPG42} 381#define HAVE_DIRENT_NAMLEN ${HAVE_DIRENT_NAMLEN} 382#define HAVE_ENDIAN ${HAVE_ENDIAN} 383#define HAVE_ERR ${HAVE_ERR} 384#define HAVE_FTS ${HAVE_FTS} 385#define HAVE_FTS_COMPARE_CONST ${HAVE_FTS_COMPARE_CONST} 386#define HAVE_GETLINE ${HAVE_GETLINE} 387#define HAVE_GETSUBOPT ${HAVE_GETSUBOPT} 388#define HAVE_ISBLANK ${HAVE_ISBLANK} 389#define HAVE_MKDTEMP ${HAVE_MKDTEMP} 390#define HAVE_NTOHL ${HAVE_NTOHL} 391#define HAVE_PLEDGE ${HAVE_PLEDGE} 392#define HAVE_PROGNAME ${HAVE_PROGNAME} 393#define HAVE_REALLOCARRAY ${HAVE_REALLOCARRAY} 394#define HAVE_REWB_BSD ${HAVE_REWB_BSD} 395#define HAVE_REWB_SYSV ${HAVE_REWB_SYSV} 396#define HAVE_SANDBOX_INIT ${HAVE_SANDBOX_INIT} 397#define HAVE_STRCASESTR ${HAVE_STRCASESTR} 398#define HAVE_STRINGLIST ${HAVE_STRINGLIST} 399#define HAVE_STRLCAT ${HAVE_STRLCAT} 400#define HAVE_STRLCPY ${HAVE_STRLCPY} 401#define HAVE_STRPTIME ${HAVE_STRPTIME} 402#define HAVE_STRSEP ${HAVE_STRSEP} 403#define HAVE_STRTONUM ${HAVE_STRTONUM} 404#define HAVE_SYS_ENDIAN ${HAVE_SYS_ENDIAN} 405#define HAVE_VASPRINTF ${HAVE_VASPRINTF} 406#define HAVE_WCHAR ${HAVE_WCHAR} 407#define HAVE_OHASH ${HAVE_OHASH} 408#endif 409 410#define BINM_APROPOS "${BINM_APROPOS}" 411#define BINM_CATMAN "${BINM_CATMAN}" 412#define BINM_MAKEWHATIS "${BINM_MAKEWHATIS}" 413#define BINM_MAN "${BINM_MAN}" 414#define BINM_SOELIM "${BINM_SOELIM}" 415#define BINM_WHATIS "${BINM_WHATIS}" 416 417__HEREDOC__ 418 419if [ ${HAVE_ERR} -eq 0 ]; then 420 echo "extern void err(int, const char *, ...);" 421 echo "extern void errx(int, const char *, ...);" 422 echo "extern void warn(const char *, ...);" 423 echo "extern void warnx(const char *, ...);" 424fi 425 426[ ${HAVE_GETLINE} -eq 0 ] && \ 427 echo "extern ssize_t getline(char **, size_t *, FILE *);" 428 429[ ${HAVE_GETSUBOPT} -eq 0 ] && \ 430 echo "extern int getsubopt(char **, char * const *, char **);" 431 432if [ ${HAVE_ISBLANK} -eq 0 ]; then 433 echo "#undef isblank" 434 echo "extern int isblank(int);" 435fi 436 437[ ${HAVE_MKDTEMP} -eq 0 ] && \ 438 echo "extern char *mkdtemp(char *);" 439 440if [ ${HAVE_PROGNAME} -eq 0 ]; then 441 echo "extern const char *getprogname(void);" 442 echo "extern void setprogname(const char *);" 443fi 444 445[ ${HAVE_REALLOCARRAY} -eq 0 ] && \ 446 echo "extern void *reallocarray(void *, size_t, size_t);" 447 448[ ${HAVE_STRCASESTR} -eq 0 ] && \ 449 echo "extern char *strcasestr(const char *, const char *);" 450 451[ ${HAVE_STRLCAT} -eq 0 ] && \ 452 echo "extern size_t strlcat(char *, const char *, size_t);" 453 454[ ${HAVE_STRLCPY} -eq 0 ] && \ 455 echo "extern size_t strlcpy(char *, const char *, size_t);" 456 457if [ ${HAVE_STRSEP} -eq 0 ]; then 458 echo "#undef strsep" 459 echo "extern char *strsep(char **, const char *);" 460fi 461 462[ ${HAVE_STRTONUM} -eq 0 ] && \ 463 echo "extern long long strtonum(const char *, long long, long long, const char **);" 464 465[ ${HAVE_VASPRINTF} -eq 0 ] && \ 466 echo "extern int vasprintf(char **, const char *, va_list);" 467 468echo "config.h: written" 1>&2 469echo "config.h: written" 1>&3 470 471# --- tests for Makefile.local ----------------------------------------- 472 473exec > Makefile.local 474 475[ -z "${BINDIR}" ] && BINDIR="${PREFIX}/bin" 476[ -z "${SBINDIR}" ] && SBINDIR="${PREFIX}/sbin" 477[ -z "${INCLUDEDIR}" ] && INCLUDEDIR="${PREFIX}/include/mandoc" 478[ -z "${LIBDIR}" ] && LIBDIR="${PREFIX}/lib/mandoc" 479[ -z "${MANDIR}" ] && MANDIR="${PREFIX}/man" 480 481[ -z "${HTDOCDIR}" ] && HTDOCDIR="${WWWPREFIX}/htdocs" 482[ -z "${CGIBINDIR}" ] && CGIBINDIR="${WWWPREFIX}/cgi-bin" 483 484[ -z "${INSTALL_PROGRAM}" ] && INSTALL_PROGRAM="${INSTALL} -m 0555" 485[ -z "${INSTALL_LIB}" ] && INSTALL_LIB="${INSTALL} -m 0444" 486[ -z "${INSTALL_MAN}" ] && INSTALL_MAN="${INSTALL} -m 0444" 487[ -z "${INSTALL_DATA}" ] && INSTALL_DATA="${INSTALL} -m 0444" 488 489BUILD_TARGETS= 490[ ${BUILD_CGI} -gt 0 ] && BUILD_TARGETS="man.cgi" 491[ ${BUILD_CATMAN} -gt 0 ] && \ 492 BUILD_TARGETS="${BUILD_TARGETS} mandocd catman" 493INSTALL_TARGETS= 494[ ${INSTALL_LIBMANDOC} -gt 0 ] && INSTALL_TARGETS="lib-install" 495[ ${BUILD_CGI} -gt 0 ] && INSTALL_TARGETS="${INSTALL_TARGETS} cgi-install" 496[ ${BUILD_CATMAN} -gt 0 ] && \ 497 INSTALL_TARGETS="${INSTALL_TARGETS} catman-install" 498 499cat << __HEREDOC__ 500BUILD_TARGETS = ${BUILD_TARGETS} 501INSTALL_TARGETS = ${INSTALL_TARGETS} 502CC = ${CC} 503CFLAGS = ${CFLAGS} 504LDADD = ${LDADD} 505LDFLAGS = ${LDFLAGS} 506STATIC = ${STATIC} 507PREFIX = ${PREFIX} 508BINDIR = ${BINDIR} 509SBINDIR = ${SBINDIR} 510INCLUDEDIR = ${INCLUDEDIR} 511LIBDIR = ${LIBDIR} 512MANDIR = ${MANDIR} 513WWWPREFIX = ${WWWPREFIX} 514HTDOCDIR = ${HTDOCDIR} 515CGIBINDIR = ${CGIBINDIR} 516BINM_APROPOS = ${BINM_APROPOS} 517BINM_CATMAN = ${BINM_CATMAN} 518BINM_MAKEWHATIS = ${BINM_MAKEWHATIS} 519BINM_MAN = ${BINM_MAN} 520BINM_SOELIM = ${BINM_SOELIM} 521BINM_WHATIS = ${BINM_WHATIS} 522MANM_MAN = ${MANM_MAN} 523MANM_MANCONF = ${MANM_MANCONF} 524MANM_MDOC = ${MANM_MDOC} 525MANM_ROFF = ${MANM_ROFF} 526MANM_EQN = ${MANM_EQN} 527MANM_TBL = ${MANM_TBL} 528INSTALL = ${INSTALL} 529INSTALL_PROGRAM = ${INSTALL_PROGRAM} 530INSTALL_LIB = ${INSTALL_LIB} 531INSTALL_MAN = ${INSTALL_MAN} 532INSTALL_DATA = ${INSTALL_DATA} 533LN = ${LN} 534__HEREDOC__ 535 536echo "Makefile.local: written" 1>&2 537echo "Makefile.local: written" 1>&3 538 539exit 0 540