Viewing: lustre-toolchain.m4

# SPDX-License-Identifier: GPL-2.0

#
# This file is part of Lustre, http://www.lustre.org/
#
# config/lustre-toolchain.m4
#
# Configure the global compiler flags and toolchain settings
#

#
# LTC_LLVM_TOOLCHAIN
#
# Read LLVM and LLVM_IAS env variables and set CC and friends
# based on their values
#
AC_DEFUN([LTC_LLVM_TOOLCHAIN], [
AC_ARG_VAR(LLVM, "Enable LLVM toolchain")
AC_ARG_VAR(LLVM_IAS, "Disable LLVM integrated assembler")

if [[ -n "$LLVM" ]]; then

if [[ -z "${LLVM##*/*}" ]]; then
LLVM_PREFIX="$LLVM"
fi

if [[ -z "${LLVM##*-*}" ]]; then
LLVM_SUFFIX="$LLVM"
fi

HOSTCC="$LLVM_PREFIX"clang"$LLVM_SUFFIX"
HOSTCXX="$LLVM_PREFIX"clang++"$LLVM_SUFFIX"
CC="$LLVM_PREFIX"clang"$LLVM_SUFFIX"
CXX="$LLVM_PREFIX"clang++"$LLVM_SUFFIX"
LD="$LLVM_PREFIX"ld.lld"$LLVM_SUFFIX"
AR="$LLVM_PREFIX"llvm-ar"$LLVM_SUFFIX"
NM="$LLVM_PREFIX"llvm-nm"$LLVM_SUFFIX"
OBJCOPY="$LLVM_PREFIX"llvm-objcopy"$LLVM_SUFFIX"
OBJDUMP="$LLVM_PREFIX"llvm-objdump"$LLVM_SUFFIX"
READELF="$LLVM_PREFIX"llvm-readelf"$LLVM_SUFFIX"
STRIP="$LLVM_PREFIX"llvm-strip"$LLVM_SUFFIX"

if [[ "$LLVM_IAS" == "0" ]]; then
CC="$CC -fno-integrated-as"
fi

fi
]) # LTC_LLVM_TOOLCHAIN

#
# LTC_CONFIG_ERROR
#
# Simple flag to make compiler flags very lax, for
# development purposes
#
AC_DEFUN([LTC_CONFIG_ERROR], [
AC_ARG_ENABLE([strict-errors],
    AS_HELP_STRING([--disable-strict-errors], [Disable strict error C flags]))

AS_IF([test "x$enable_strict_errors" != "xno"], [
AS_IF([test $target_cpu == "i686" -o $target_cpu == "x86_64"], [
CFLAGS="$CFLAGS -Wall -Werror"
])
], [
CFLAGS="$CFLAGS -Wall -Wno-error -Wno-error=incompatible-function-pointer-types -Wno-error=incompatible-pointer-types"
])
]) # LTC_CONFIG_ERROR

#
# LTC_PROG_CC
#
# checks on the C compiler
#
AC_DEFUN([LTC_PROG_CC], [
AC_PROG_RANLIB
AC_CHECK_TOOL(LD, [ld], [no])
AC_CHECK_TOOL(OBJDUMP, [objdump], [no])
AC_CHECK_TOOL(STRIP, [strip], [no])

# ---------  unsigned long long sane? -------
AC_CHECK_SIZEOF(unsigned long long, 0)
AS_IF([test $ac_cv_sizeof_unsigned_long_long != 8],
	[AC_MSG_ERROR([we assume that sizeof(unsigned long long) == 8.])])

AS_IF([test $target_cpu = powerpc64], [
	AC_MSG_WARN([set compiler with -m64])
	CFLAGS="$CFLAGS -m64"
	CC="$CC -m64"
])

# libcfs/include for util headers, lustre/include for liblustreapi and friends
# UAPI headers from OpenSFS are included if modules support is enabled, otherwise
# it will use the native kernel implementation.
CPPFLAGS="-I$PWD/lnet/utils/ -I$PWD/include -I$PWD/include/uapi $CPPFLAGS"

CCASFLAGS="-Wall -fPIC -D_GNU_SOURCE"
AC_SUBST(CCASFLAGS)

# everyone builds against lnet and lustre kernel headers
EXTRA_KCFLAGS="$EXTRA_KCFLAGS -g -I$PWD/lnet/include -I$PWD/lustre/include -I$PWD/include"
AC_SUBST(EXTRA_KCFLAGS)
]) # LTC_PROG_CC

#
# LTC_CC_NO_FORMAT_TRUNCATION
#
# Check if gcc supports -Wno-format-truncation
# To supress many warnings with gcc7
#
AC_DEFUN([LTC_CC_NO_FORMAT_TRUNCATION], [
	AC_MSG_CHECKING([for -Wno-format-truncation support])

	saved_flags="$CFLAGS"
	CFLAGS="-Werror -Wno-format-truncation"

	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
		EXTRA_KCFLAGS="$EXTRA_KCFLAGS -Wno-format-truncation"
		AC_SUBST(EXTRA_KCFLAGS)
		AC_MSG_RESULT([yes])
	], [
		AC_MSG_RESULT([no])
	])

	CFLAGS="$saved_flags"
]) # LTC_CC_NO_FORMAT_TRUNCATION

#
# LTC_CC_NO_STRINGOP_TRUNCATION
#
# Check if gcc supports -Wno-stringop-truncation
# To supress many warnings with gcc8
#
AC_DEFUN([LTC_CC_NO_STRINGOP_TRUNCATION], [
	AC_MSG_CHECKING([for -Wno-stringop-truncation support])

	saved_flags="$CFLAGS"
	CFLAGS="-Werror -Wno-stringop-truncation"

	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
		EXTRA_KCFLAGS="$EXTRA_KCFLAGS -Wno-stringop-truncation"
		AC_SUBST(EXTRA_KCFLAGS)
		AC_MSG_RESULT([yes])
	], [
		AC_MSG_RESULT([no])
	])

	CFLAGS="$saved_flags"
]) # LTC_CC_NO_STRINGOP_TRUNCATION

#
# LTC_CC_NO_STRINGOP_OVERFLOW
#
# Check if gcc supports -Wno-stringop-overflow
# To supress many warnings with gcc8
#
AC_DEFUN([LTC_CC_NO_STRINGOP_OVERFLOW], [
	AC_MSG_CHECKING([for -Wno-stringop-overflow support])

	saved_flags="$CFLAGS"
	CFLAGS="-Werror -Wno-stringop-overflow"

	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
		EXTRA_KCFLAGS="$EXTRA_KCFLAGS -Wno-stringop-overflow"
		AC_SUBST(EXTRA_KCFLAGS)
		TEST_RESULT="yes"
		AC_MSG_RESULT([yes])
	], [
		AC_MSG_RESULT([no])
	])

	CFLAGS="$saved_flags"
	AM_CONDITIONAL(NO_STRINGOP_OVERFLOW, test x$TEST_RESULT = xyes)
]) # LTC_CC_NO_STRINGOP_OVERFLOW

#
# LTC_CC_NO_GNU
#
# Check if compiler supports -Wno-gnu
# To suppress warnings about valid GNU extensions used in the kernel
#
AC_DEFUN([LTC_CC_NO_GNU], [
	AC_MSG_CHECKING([for -Wno-gnu support])

	saved_flags="$CFLAGS"
	CFLAGS="-Werror -Wno-gnu"

	AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], [
		EXTRA_KCFLAGS="$EXTRA_KCFLAGS -Wno-gnu"
		AC_SUBST(EXTRA_KCFLAGS)
		EXTRA_CFLAGS="$EXTRA_CFLAGS -Wno-gnu"
		AC_SUBST(EXTRA_CFLAGS)
		AC_MSG_RESULT([yes])
	], [
		AC_MSG_RESULT([no])
	])

	CFLAGS="$saved_flags"
]) # LTC_CC_NO_GNU

#
# LTC_TOOLCHAIN_CONFIGURE
#
# main configure steps
#
AC_DEFUN([LTC_TOOLCHAIN_CONFIGURE], [
AC_REQUIRE([LTC_LLVM_TOOLCHAIN])
AC_REQUIRE([AC_PROG_CC])
AC_REQUIRE([AC_PROG_CXX])

AM_PROG_AS
AC_CHECK_TOOLS(AR, ar)
LTC_PROG_CC

LTC_CONFIG_ERROR

LTC_CC_NO_FORMAT_TRUNCATION
LTC_CC_NO_STRINGOP_TRUNCATION
LTC_CC_NO_STRINGOP_OVERFLOW
LTC_CC_NO_GNU

if test $ac_test_CFLAGS; then
	CFLAGS=$ac_save_CFLAGS
fi

CFLAGS="$CFLAGS $EXTRA_CFLAGS"
]) # LTC_TOOLCHAIN_CONFIGURE

#
# LTC_TOOLCHAIN_STATUS
#
# main configure steps
#
AC_DEFUN([LTC_TOOLCHAIN_STATUS], [
cat <<_ACEOF

CC:            $CC
CFLAGS:        $CFLAGS
EXTRA_CFLAGS:  $EXTRA_CFLAGS

EXTRA_KCFLAGS: $EXTRA_KCFLAGS

LD:            $LD

CXX:           $CXX
CPPFLAGS:      $CPPFLAGS

Type 'make' to build Lustre.
_ACEOF
]) # LTC_TOOLCHAIN_STATUS