| # |
| # This Source Code Form is subject to the terms of the Mozilla Public |
| # License, v. 2.0. If a copy of the MPL was not distributed with this |
| # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| |
| # This sets WARNING_CFLAGS for gcc-like compilers. |
| |
| ifndef CC_IS_CLANG |
| CC_IS_CLANG := $(and $(findstring clang, $(shell $(CC) --version 2>&1)), 1) |
| # Export CC_IS_CLANG to save a shell invocation when recursing. |
| export CC_IS_CLANG |
| endif |
| |
| ifdef CC_IS_CLANG |
| # Clang claims GCC 4.2.1 compatibility, see GCC_VERSION |
| CC_IS_GCC = 1 |
| # Export CC_IS_GCC to save a shell invocation when recursing. |
| export CC_IS_GCC |
| endif |
| |
| ifndef CC_IS_GCC |
| CC_IS_GCC := $(shell $(CC) -x c -E -Wall -Werror /dev/null >/dev/null 2>&1 && echo 1) |
| # Export CC_IS_GCC to save a shell invocation when recursing. |
| export CC_IS_GCC |
| endif |
| |
| ifndef CC_NAME |
| ifeq (1,$(CC_IS_GCC)) |
| CC_NAME := $(shell $(CC) -? 2>&1 >/dev/null | sed -e 's/:.*//;1q') |
| else |
| CC_NAME := $(notdir $(CC)) |
| endif |
| # Export CC_NAME to save a shell invocation when recursing. |
| export CC_NAME |
| endif |
| |
| ifndef GCC_VERSION |
| ifeq (1,$(CC_IS_GCC)) |
| GCC_VERSION := $(subst ., ,$(shell $(CC) -dumpversion || echo x.x.x)) |
| # Export GCC_VERSION to save a shell invocation when recursing. |
| export GCC_VERSION |
| endif |
| endif |
| |
| ifndef WARNING_CFLAGS |
| ifneq (1,$(CC_IS_GCC)) |
| WARNING_CFLAGS = $(NULL) |
| else |
| # This tests to see if enabling the warning is possible before |
| # setting an option to disable it. |
| set_warning = $(shell $(CC) -x c -E -Werror -W$(1) /dev/null >/dev/null 2>&1 && echo -W$(2)$(1)) |
| enable_warning = $(call set_warning,$(1),) |
| disable_warning = $(call set_warning,$(1),no-) |
| |
| WARNING_CFLAGS = -Wall $(call enable_warning,shadow) |
| ifdef CC_IS_CLANG |
| # -Qunused-arguments : clang objects to arguments that it doesn't understand |
| # and fixing this would require rearchitecture |
| WARNING_CFLAGS += -Qunused-arguments |
| # -Wno-parentheses-equality : because clang warns about macro expansions |
| WARNING_CFLAGS += $(call disable_warning,parentheses-equality) |
| ifdef BUILD_OPT |
| # clang is unable to handle glib's expansion of strcmp and similar for optimized |
| # builds, so ignore the resulting errors. |
| # See https://llvm.org/bugs/show_bug.cgi?id=20144 |
| WARNING_CFLAGS += $(call disable_warning,array-bounds) |
| WARNING_CFLAGS += $(call disable_warning,unevaluated-expression) |
| endif |
| endif # if clang |
| |
| ifndef NSS_ENABLE_WERROR |
| ifeq ($(OS_TARGET),Android) |
| # Android lollipop generates the following warning: |
| # error: call to 'sprintf' declared with attribute warning: |
| # sprintf is often misused; please use snprintf [-Werror] |
| # So, just suppress -Werror entirely on Android |
| NSS_ENABLE_WERROR = 0 |
| $(warning OS_TARGET is Android, disabling -Werror) |
| else |
| ifdef CC_IS_CLANG |
| # Clang reports its version as an older gcc, but it's OK |
| NSS_ENABLE_WERROR = 1 |
| else |
| ifneq (,$(filter 4.8 4.9,$(word 1,$(GCC_VERSION)).$(word 2,$(GCC_VERSION)))) |
| NSS_ENABLE_WERROR = 1 |
| endif |
| ifeq (,$(filter 0 1 2 3 4,$(word 1,$(GCC_VERSION)))) |
| NSS_ENABLE_WERROR = 1 |
| endif |
| endif |
| ifndef NSS_ENABLE_WERROR |
| $(warning Unable to find gcc 4.8 or greater, disabling -Werror) |
| NSS_ENABLE_WERROR = 0 |
| endif |
| endif |
| endif #ndef NSS_ENABLE_WERROR |
| |
| ifeq ($(NSS_ENABLE_WERROR),1) |
| WARNING_CFLAGS += -Werror |
| else |
| # Old versions of gcc (< 4.8) don't support #pragma diagnostic in functions. |
| # Use this to disable use of that #pragma and the warnings it suppresses. |
| WARNING_CFLAGS += -DNSS_NO_GCC48 |
| endif |
| endif |
| export WARNING_CFLAGS |
| endif # ndef WARNING_CFLAGS |