Portable build framework for OpenNTPD
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

268 lines
9.0 KiB

  1. #
  2. # Copyright (c) 2014-2015 Brent Cook
  3. # Parts based on configure.ac from Portable OpenNTPD:
  4. # Copyright (c) 2004-2008 Darren Tucker
  5. # which itself was based on configure.ac from OpenSSH:
  6. # Copyright (c) 1999-2004 Damien Miller
  7. #
  8. # Permission to use, copy, modify, and distribute this software for any
  9. # purpose with or without fee is hereby granted, provided that the above
  10. # copyright notice and this permission notice appear in all copies.
  11. #
  12. # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  13. # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  14. # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  15. # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  16. # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  17. # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  18. # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19. AC_INIT([OpenNTPD], m4_esyscmd([tr -d '\n' < VERSION]))
  20. AC_CANONICAL_HOST
  21. AM_INIT_AUTOMAKE([subdir-objects foreign])
  22. AC_CONFIG_MACRO_DIR([m4])
  23. m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
  24. AC_PROG_CC
  25. AC_PROG_CC_STDC
  26. AM_PROG_CC_C_O
  27. AC_PROG_LIBTOOL
  28. AC_PROG_YACC
  29. CFLAGS="$CFLAGS -Wall -std=gnu99 -fno-strict-aliasing"
  30. case $host_os in
  31. *darwin*)
  32. HOST_OS=darwin
  33. AC_DEFINE(SETEUID_BREAKS_SETUID,[],[setuid after seteuid does not work])
  34. AC_DEFINE(BROKEN_SETREUID,[], [Broken setreuid])
  35. AC_DEFINE(BROKEN_SETREGID,[], [Broken setregid])
  36. AC_DEFINE(YYSTYPE_IS_DECLARED,[], [Broken bison])
  37. AC_DEFINE([SPT_TYPE], [SPT_REUSEARGV])
  38. ;;
  39. *freebsd*)
  40. HOST_OS=freebsd
  41. AC_SUBST([PROG_LDADD], ['-lthr'])
  42. ;;
  43. *linux*)
  44. HOST_OS=linux
  45. CFLAGS="$CFLAGS -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE"
  46. AC_DEFINE([SPT_TYPE], [SPT_REUSEARGV])
  47. ;;
  48. *netbsd*)
  49. HOST_OS=netbsd
  50. ;;
  51. *openbsd*)
  52. HOST_OS=openbsd
  53. AC_DEFINE([HAVE_ATTRIBUTE__BOUNDED__], [1], [OpenBSD has __bounded__])
  54. AC_DEFINE([HAVE_ATTRIBUTE__DEAD], [1], [OpenBSD has __dead])
  55. ;;
  56. *solaris*)
  57. HOST_OS=solaris
  58. CFLAGS="$CFLAGS -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 -DBSD_COMP"
  59. AC_SUBST([PLATFORM_LDADD], ['-lnsl -lsocket'])
  60. ;;
  61. *) ;;
  62. esac
  63. AM_CONDITIONAL([HOST_DARWIN], [test x$HOST_OS = xdarwin])
  64. AM_CONDITIONAL([HOST_FREEBSD], [test x$HOST_OS = xfreebsd])
  65. AM_CONDITIONAL([HOST_LINUX], [test x$HOST_OS = xlinux])
  66. AM_CONDITIONAL([HOST_NETBSD], [test x$HOST_OS = xnetbsd])
  67. AM_CONDITIONAL([HOST_OPENBSD], [test x$HOST_OS = xopenbsd])
  68. AM_CONDITIONAL([HOST_SOLARIS], [test x$HOST_OS = xsolaris])
  69. AC_CHECK_FUNC([dl_iterate_phdr],,
  70. [AC_SEARCH_LIBS([dl_iterate_phdr],[dl])])
  71. save_cflags="$CFLAGS"
  72. CFLAGS=-Wno-pointer-sign
  73. AC_MSG_CHECKING([whether CC supports -Wno-pointer-sign])
  74. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
  75. [AC_MSG_RESULT([yes])]
  76. [AM_CFLAGS=-Wno-pointer-sign],
  77. [AC_MSG_RESULT([no])]
  78. )
  79. CFLAGS="$save_cflags $AM_CFLAGS"
  80. AC_MSG_CHECKING([if compiling with clang])
  81. AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[
  82. #ifndef __clang__
  83. not clang
  84. #endif
  85. ]])],
  86. [AC_MSG_RESULT([yes])]
  87. [CLANG_FLAGS=-Qunused-arguments],
  88. [AC_MSG_RESULT([no])]
  89. )
  90. CFLAGS="$CFLAGS $CLANG_CFLAGS"
  91. LDFLAGS="$LDFLAGS $CLANG_FLAGS"
  92. # check functions that are expected to be in libc
  93. AC_CHECK_FUNCS([adjfreq ntp_adjtime adjtimex])
  94. AC_CHECK_FUNCS([arc4random arc4random_uniform asprintf explicit_bzero])
  95. AC_CHECK_FUNCS([closefrom daemon getentropy memmem poll reallocarray])
  96. AC_CHECK_FUNCS([setproctitle setgroups])
  97. AC_CHECK_FUNCS([setregid setresgid setreuid setresuid])
  98. AC_CHECK_FUNCS([strlcat strlcpy strtonum sysconf])
  99. # check auxiliary libraries that might contain other functions
  100. AC_SEARCH_LIBS([arc4random], [crypto])
  101. AC_SEARCH_LIBS([clock_getres],[rt posix4])
  102. AC_SEARCH_LIBS([clock_gettime],[rt posix4])
  103. AC_SEARCH_LIBS([ibuf_open], [util])
  104. AC_CHECK_FUNCS([arc4random ibuf_open])
  105. AC_CHECK_FUNCS([clock_gettime clock_getres])
  106. # check for libtls
  107. AC_SEARCH_LIBS([tls_config_set_ca_mem],[tls],
  108. [LIBS="$LIBS -ltls -lssl -lcrypto"],,[-lssl -lcrypto])
  109. AC_CHECK_FUNCS([tls_config_set_ca_mem])
  110. # check if libtls uses 3-argument tls_write
  111. AC_CACHE_CHECK([if tls_write takes 3 arguments], ac_cv_have_tls_write_3_arg, [
  112. AC_LINK_IFELSE([AC_LANG_PROGRAM([[
  113. #include <tls.h>
  114. size_t outlen;
  115. ]], [[ tls_write(NULL, NULL, 0); ]])],
  116. [ ac_cv_have_tls_write_3_arg="yes" ],
  117. [ ac_cv_have_tls_write_3_arg="no"
  118. ])
  119. ])
  120. AC_ARG_ENABLE([https-constraint],
  121. AS_HELP_STRING([--disable-https-constraint],
  122. [Disable HTTPS Constraint Functionality]))
  123. AM_CONDITIONAL([HAVE_LIBTLS],
  124. [test "x$ac_cv_func_tls_config_set_ca_mem" = xyes \
  125. -a "x$ac_cv_have_tls_write_3_arg" = xyes \
  126. -a "x$enable_https_constraint" != xno])
  127. if test "x$ac_cv_func_tls_config_set_ca_mem" = xyes \
  128. -a "x$ac_cv_have_tls_write_3_arg" = xyes \
  129. -a "x$enable_https_constraint" != xno; then
  130. AC_DEFINE([HAVE_LIBTLS], [yes])
  131. fi
  132. # Share test results with automake
  133. AM_CONDITIONAL([HAVE_ADJFREQ], [test "x$ac_cv_func_adjfreq" = xyes])
  134. AM_CONDITIONAL([HAVE_ARC4RANDOM], [test "x$ac_cv_func_arc4random" = xyes])
  135. AM_CONDITIONAL([HAVE_ARC4RANDOM_UNIFORM], [test "x$ac_cv_func_arc4random_uniform" = xyes])
  136. AM_CONDITIONAL([HAVE_ASPRINTF], [test "x$ac_cv_func_asprintf" = xyes])
  137. AM_CONDITIONAL([HAVE_CLOSEFROM], [test "x$ac_cv_func_closefrom" = xyes])
  138. AM_CONDITIONAL([HAVE_CLOCK_GETRES], [test "x$ac_cv_func_clock_getres" = xyes])
  139. AM_CONDITIONAL([HAVE_CLOCK_GETTIME], [test "x$ac_cv_func_clock_gettime" = xyes])
  140. AM_CONDITIONAL([HAVE_DAEMON], [test "x$ac_cv_func_daemon" = xyes])
  141. AM_CONDITIONAL([HAVE_EXPLICIT_BZERO], [test "x$ac_cv_func_explicit_bzero" = xyes])
  142. AM_CONDITIONAL([HAVE_GETENTROPY], [test "x$ac_cv_func_getentropy" = xyes])
  143. AM_CONDITIONAL([HAVE_IFADDRS_H], [test "x$ac_cv_header_ifaddrs_h" = xyes])
  144. AM_CONDITIONAL([HAVE_IMSG], [test "x$ac_cv_func_ibuf_open" = xyes])
  145. AM_CONDITIONAL([HAVE_MEMMEM], [test "x$ac_cv_func_memmem" = xyes])
  146. AM_CONDITIONAL([HAVE_POLL], [test "x$ac_cv_func_poll" = xyes])
  147. AM_CONDITIONAL([HAVE_REALLOCARRAY], [test "x$ac_cv_func_reallocarray" = xyes])
  148. AM_CONDITIONAL([HAVE_SETGROUPS], [test "x$ac_cv_func_setgroups" = xyes])
  149. AM_CONDITIONAL([HAVE_SETRESGID], [test "x$ac_cv_func_setresgid" = xyes])
  150. AM_CONDITIONAL([HAVE_SETRESUID], [test "x$ac_cv_func_setresuid" = xyes])
  151. AM_CONDITIONAL([HAVE_SETPROCTITLE], [test "x$ac_cv_func_setproctitle" = xyes])
  152. AM_CONDITIONAL([HAVE_STRLCAT], [test "x$ac_cv_func_strlcat" = xyes])
  153. AM_CONDITIONAL([HAVE_STRLCPY], [test "x$ac_cv_func_strlcpy" = xyes])
  154. AM_CONDITIONAL([HAVE_STRTONUM], [test "x$ac_cv_func_strtonum" = xyes])
  155. AM_CONDITIONAL([HAVE_SYSCONF], [test "x$ac_cv_func_sysconf" = xyes])
  156. # overrides for arc4random implementations with known issues
  157. AM_CONDITIONAL([HAVE_ARC4RANDOM],
  158. [test "x$HOST_OS" != xdarwin \
  159. -a "x$HOST_OS" != xfreebsd \
  160. -a "x$HOST_OS" != xnetbsd \
  161. -a "x$ac_cv_func_arc4random" = xyes])
  162. AM_CONDITIONAL([HAVE_ARC4RANDOM_UNIFORM],
  163. [test "x$HOST_OS" != xdarwin \
  164. -a "x$HOST_OS" != xfreebsd \
  165. -a "x$HOST_OS" != xnetbsd \
  166. -a "x$ac_cv_func_arc4random_uniform" = xyes])
  167. AC_CACHE_CHECK([if libc defines __progname], ac_cv_libc_defines___progname, [
  168. AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],
  169. [[ extern char *__progname; printf("%s", __progname); ]])],
  170. [ ac_cv_libc_defines___progname="yes" ],
  171. [ ac_cv_libc_defines___progname="no"
  172. ])
  173. ])
  174. if test "x$ac_cv_libc_defines___progname" = "xyes" ; then
  175. AC_DEFINE([HAVE___PROGNAME], [1], [Define if libc defines __progname])
  176. fi
  177. AC_CACHE_CHECK([whether va_copy exists], ac_cv_have_va_copy, [
  178. AC_LINK_IFELSE([AC_LANG_PROGRAM([[
  179. #include <stdarg.h>
  180. va_list x,y;
  181. ]], [[ va_copy(x,y); ]])],
  182. [ ac_cv_have_va_copy="yes" ],
  183. [ ac_cv_have_va_copy="no"
  184. ])
  185. ])
  186. if test "x$ac_cv_have_va_copy" = "xyes" ; then
  187. AC_DEFINE([HAVE_VA_COPY], [1], [Define if va_copy exists])
  188. fi
  189. AC_CACHE_CHECK([whether __va_copy exists], ac_cv_have___va_copy, [
  190. AC_LINK_IFELSE([AC_LANG_PROGRAM([[
  191. #include <stdarg.h>
  192. va_list x,y;
  193. ]], [[ __va_copy(x,y); ]])],
  194. [ ac_cv_have___va_copy="yes" ], [ ac_cv_have___va_copy="no"
  195. ])
  196. ])
  197. if test "x$ac_cv_have___va_copy" = "xyes" ; then
  198. AC_DEFINE([HAVE___VA_COPY], [1], [Define if __va_copy exists])
  199. fi
  200. AC_CHECK_HEADERS([sys/sysctl.h err.h ifaddrs.h paths.h])
  201. AC_CHECK_HEADERS([sys/sensors.h],
  202. AM_CONDITIONAL(HAVE_SENSORS, true),
  203. AM_CONDITIONAL(HAVE_SENSORS, false)
  204. )
  205. AC_CHECK_MEMBERS([struct sockaddr_in.sin_len], , ,
  206. [ #include <netdb.h>
  207. #include <netinet/in.h>
  208. #include <sys/socket.h> ]
  209. )
  210. AC_ARG_WITH([privsep-user],
  211. AS_HELP_STRING([--with-privsep-user=user],
  212. [Privilege separation user for ntpd to use]),
  213. PRIVSEP_USER="$withval",
  214. PRIVSEP_USER="_ntp"
  215. )
  216. AC_DEFINE_UNQUOTED(NTPD_USER, "$PRIVSEP_USER", [Unprivileged user])
  217. AC_SUBST(PRIVSEP_USER)
  218. AC_ARG_WITH([privsep-path],
  219. AS_HELP_STRING([--with-privsep-path=path],
  220. [Privilege separation chroot path to check on install]),
  221. PRIVSEP_PATH="$withval",
  222. PRIVSEP_PATH="/var/empty"
  223. )
  224. AC_SUBST(PRIVSEP_PATH)
  225. AC_ARG_WITH([cacert],
  226. AS_HELP_STRING([--with-cacert=path],
  227. [CA certificate location for HTTPS constraint validation]),
  228. CONSTRAINT_CA="$withval",
  229. CONSTRAINT_CA="/etc/ssl/cert.pem"
  230. )
  231. AC_DEFINE_UNQUOTED(CONSTRAINT_CA, "$CONSTRAINT_CA", [CA certificate path])
  232. AC_CONFIG_FILES([
  233. Makefile
  234. include/Makefile
  235. compat/Makefile
  236. src/Makefile
  237. ])
  238. AC_OUTPUT