cups-compiler.m4   [plain text]


dnl
dnl Compiler stuff for CUPS.
dnl
dnl Copyright 2007-2020 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.* | 9.*)
			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