| dnl |
| dnl Compiler stuff for CUPS. |
| dnl |
| dnl Copyright 2007-2018 by Apple Inc. |
| dnl Copyright 1997-2007 by Easy Software Products, all rights reserved. |
| dnl |
| dnl Licensed under Apache License v2.0. See the file "LICENSE" for more information. |
| dnl |
| |
| dnl Clear the debugging and non-shared library options unless the user asks |
| dnl for them... |
| INSTALL_STRIP="" |
| AC_SUBST(INSTALL_STRIP) |
| |
| AC_ARG_WITH(optim, [ --with-optim set optimization flags ], |
| OPTIM="$withval", |
| OPTIM="") |
| AC_SUBST(OPTIM) |
| |
| AC_ARG_ENABLE(debug, [ --enable-debug build with debugging symbols]) |
| AC_ARG_ENABLE(debug_guards, [ --enable-debug-guards build with memory allocation guards]) |
| AC_ARG_ENABLE(debug_printfs, [ --enable-debug-printfs build with CUPS_DEBUG_LOG support]) |
| AC_ARG_ENABLE(unit_tests, [ --enable-unit-tests build and run unit tests]) |
| |
| dnl For debugging, keep symbols, otherwise strip them... |
| if test x$enable_debug = xyes -a "x$OPTIM" = x; then |
| OPTIM="-g" |
| else |
| INSTALL_STRIP="-s" |
| fi |
| |
| dnl Debug printfs can slow things down, so provide a separate option for that |
| if test x$enable_debug_printfs = xyes; then |
| CFLAGS="$CFLAGS -DDEBUG" |
| CXXFLAGS="$CXXFLAGS -DDEBUG" |
| fi |
| |
| dnl Debug guards use an extra 4 bytes for some structures like strings in the |
| dnl string pool, so provide a separate option for that |
| if test x$enable_debug_guards = xyes; then |
| CFLAGS="$CFLAGS -DDEBUG_GUARDS" |
| CXXFLAGS="$CXXFLAGS -DDEBUG_GUARDS" |
| fi |
| |
| dnl Unit tests take up time during a compile... |
| if test x$enable_unit_tests = xyes; then |
| if test "$build" != "$host"; then |
| AC_MSG_ERROR([Sorry, cannot build unit tests when cross-compiling.]) |
| fi |
| |
| UNITTESTS="unittests" |
| else |
| UNITTESTS="" |
| fi |
| AC_SUBST(UNITTESTS) |
| |
| dnl Setup general architecture flags... |
| AC_ARG_WITH(archflags, [ --with-archflags set default architecture flags ]) |
| AC_ARG_WITH(ldarchflags, [ --with-ldarchflags set program architecture flags ]) |
| |
| if test -z "$with_archflags"; then |
| ARCHFLAGS="" |
| else |
| ARCHFLAGS="$with_archflags" |
| fi |
| |
| if test -z "$with_ldarchflags"; then |
| if test "$host_os_name" = darwin; then |
| # Only create Intel programs by default |
| LDARCHFLAGS="`echo $ARCHFLAGS | sed -e '1,$s/-arch ppc64//'`" |
| else |
| LDARCHFLAGS="$ARCHFLAGS" |
| fi |
| else |
| LDARCHFLAGS="$with_ldarchflags" |
| fi |
| |
| AC_SUBST(ARCHFLAGS) |
| AC_SUBST(LDARCHFLAGS) |
| |
| dnl Read-only data/program support on Linux... |
| AC_ARG_ENABLE(relro, [ --enable-relro build with the GCC relro option]) |
| |
| dnl Clang/GCC address sanitizer... |
| AC_ARG_ENABLE(sanitizer, [ --enable-sanitizer build with AddressSanitizer]) |
| |
| dnl Update compiler options... |
| CXXLIBS="${CXXLIBS:=}" |
| AC_SUBST(CXXLIBS) |
| |
| PIEFLAGS="" |
| AC_SUBST(PIEFLAGS) |
| |
| RELROFLAGS="" |
| AC_SUBST(RELROFLAGS) |
| |
| WARNING_OPTIONS="" |
| AC_SUBST(WARNING_OPTIONS) |
| |
| if test -n "$GCC"; then |
| # Add GCC-specific compiler options... |
| |
| # Address sanitizer is a useful tool to use when developing/debugging |
| # code but adds about 2x overhead... |
| if test x$enable_sanitizer = xyes; then |
| # Use -fsanitize=address with debugging... |
| OPTIM="$OPTIM -g -fsanitize=address" |
| else |
| # Otherwise use the Fortify enhancements to catch any unbounded |
| # string operations... |
| CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2" |
| CXXFLAGS="$CXXFLAGS -D_FORTIFY_SOURCE=2" |
| fi |
| |
| # Default optimization options... |
| if test -z "$OPTIM"; then |
| # Default to optimize-for-size and debug |
| OPTIM="-Os -g" |
| fi |
| |
| # Generate position-independent code as needed... |
| if test $PICFLAG = 1; then |
| OPTIM="-fPIC $OPTIM" |
| fi |
| |
| # The -fstack-protector option is available with some versions of |
| # GCC and adds "stack canaries" which detect when the return address |
| # has been overwritten, preventing many types of exploit attacks. |
| AC_MSG_CHECKING(whether compiler supports -fstack-protector) |
| OLDCFLAGS="$CFLAGS" |
| CFLAGS="$CFLAGS -fstack-protector" |
| AC_TRY_LINK(,, |
| if test "x$LSB_BUILD" = xy; then |
| # Can't use stack-protector with LSB binaries... |
| OPTIM="$OPTIM -fno-stack-protector" |
| else |
| OPTIM="$OPTIM -fstack-protector" |
| fi |
| AC_MSG_RESULT(yes), |
| AC_MSG_RESULT(no)) |
| CFLAGS="$OLDCFLAGS" |
| |
| if test "x$LSB_BUILD" != xy; then |
| # The -fPIE option is available with some versions of GCC and |
| # adds randomization of addresses, which avoids another class of |
| # exploits that depend on a fixed address for common functions. |
| # |
| # Not available to LSB binaries... |
| AC_MSG_CHECKING(whether compiler supports -fPIE) |
| OLDCFLAGS="$CFLAGS" |
| case "$host_os_name" in |
| darwin*) |
| CFLAGS="$CFLAGS -fPIE -Wl,-pie" |
| AC_TRY_COMPILE(,,[ |
| PIEFLAGS="-fPIE -Wl,-pie" |
| AC_MSG_RESULT(yes)], |
| AC_MSG_RESULT(no)) |
| ;; |
| |
| *) |
| CFLAGS="$CFLAGS -fPIE -pie" |
| AC_TRY_COMPILE(,,[ |
| PIEFLAGS="-fPIE -pie" |
| AC_MSG_RESULT(yes)], |
| AC_MSG_RESULT(no)) |
| ;; |
| esac |
| CFLAGS="$OLDCFLAGS" |
| fi |
| |
| # Add useful warning options for tracking down problems... |
| WARNING_OPTIONS="-Wall -Wno-format-y2k -Wunused -Wno-unused-result -Wsign-conversion" |
| |
| # Test GCC version for certain warning flags since -Werror |
| # doesn't trigger... |
| gccversion=`$CC --version | head -1 | awk '{print $NF}'` |
| case "$gccversion" in |
| 7.* | 8.*) |
| WARNING_OPTIONS="$WARNING_OPTIONS -Wno-format-truncation -Wno-tautological-compare" |
| ;; |
| esac |
| |
| # Additional warning options for development testing... |
| if test -d .git; then |
| WARNING_OPTIONS="-Werror -Wno-error=deprecated-declarations $WARNING_OPTIONS" |
| fi |
| else |
| # Add vendor-specific compiler options... |
| case $host_os_name in |
| sunos*) |
| # Solaris |
| if test -z "$OPTIM"; then |
| OPTIM="-xO2" |
| fi |
| |
| if test $PICFLAG = 1; then |
| OPTIM="-KPIC $OPTIM" |
| fi |
| ;; |
| *) |
| # Running some other operating system; inform the user |
| # they should contribute the necessary options via |
| # Github... |
| echo "Building CUPS with default compiler optimizations; contact the CUPS developers on Github" |
| echo "(https://github.com/apple/cups/issues) with the uname and compiler options needed for" |
| echo "your platform, or set the CFLAGS and LDFLAGS environment variables before running" |
| echo "configure." |
| ;; |
| esac |
| fi |
| |
| # Add general compiler options per platform... |
| case $host_os_name in |
| linux*) |
| # glibc 2.8 and higher breaks peer credentials unless you |
| # define _GNU_SOURCE... |
| OPTIM="$OPTIM -D_GNU_SOURCE" |
| |
| # The -z relro option is provided by the Linux linker command to |
| # make relocatable data read-only. |
| if test x$enable_relro = xyes; then |
| RELROFLAGS="-Wl,-z,relro,-z,now" |
| fi |
| ;; |
| esac |