xref: /OK3568_Linux_fs/kernel/tools/scripts/Makefile.include (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyunifneq ($(O),)
3*4882a593Smuzhiyunifeq ($(origin O), command line)
4*4882a593Smuzhiyun	dummy := $(if $(shell cd $(PWD); test -d $(O) || echo $(O)),$(error O=$(O) does not exist),)
5*4882a593Smuzhiyun	ABSOLUTE_O := $(shell cd $(PWD); cd $(O) ; pwd)
6*4882a593Smuzhiyun	OUTPUT := $(ABSOLUTE_O)/$(if $(subdir),$(subdir)/)
7*4882a593Smuzhiyun	COMMAND_O := O=$(ABSOLUTE_O)
8*4882a593Smuzhiyunifeq ($(objtree),)
9*4882a593Smuzhiyun	objtree := $(O)
10*4882a593Smuzhiyunendif
11*4882a593Smuzhiyunendif
12*4882a593Smuzhiyunendif
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun# check that the output directory actually exists
15*4882a593Smuzhiyunifneq ($(OUTPUT),)
16*4882a593SmuzhiyunOUTDIR := $(shell cd $(OUTPUT) && pwd)
17*4882a593Smuzhiyun$(if $(OUTDIR),, $(error output directory "$(OUTPUT)" does not exist))
18*4882a593Smuzhiyunendif
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun#
21*4882a593Smuzhiyun# Include saner warnings here, which can catch bugs:
22*4882a593Smuzhiyun#
23*4882a593SmuzhiyunEXTRA_WARNINGS := -Wbad-function-cast
24*4882a593SmuzhiyunEXTRA_WARNINGS += -Wdeclaration-after-statement
25*4882a593SmuzhiyunEXTRA_WARNINGS += -Wformat-security
26*4882a593SmuzhiyunEXTRA_WARNINGS += -Wformat-y2k
27*4882a593SmuzhiyunEXTRA_WARNINGS += -Winit-self
28*4882a593SmuzhiyunEXTRA_WARNINGS += -Wmissing-declarations
29*4882a593SmuzhiyunEXTRA_WARNINGS += -Wmissing-prototypes
30*4882a593SmuzhiyunEXTRA_WARNINGS += -Wnested-externs
31*4882a593SmuzhiyunEXTRA_WARNINGS += -Wno-system-headers
32*4882a593SmuzhiyunEXTRA_WARNINGS += -Wold-style-definition
33*4882a593SmuzhiyunEXTRA_WARNINGS += -Wpacked
34*4882a593SmuzhiyunEXTRA_WARNINGS += -Wredundant-decls
35*4882a593SmuzhiyunEXTRA_WARNINGS += -Wstrict-prototypes
36*4882a593SmuzhiyunEXTRA_WARNINGS += -Wswitch-default
37*4882a593SmuzhiyunEXTRA_WARNINGS += -Wswitch-enum
38*4882a593SmuzhiyunEXTRA_WARNINGS += -Wundef
39*4882a593SmuzhiyunEXTRA_WARNINGS += -Wwrite-strings
40*4882a593SmuzhiyunEXTRA_WARNINGS += -Wformat
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun# Makefiles suck: This macro sets a default value of $(2) for the
43*4882a593Smuzhiyun# variable named by $(1), unless the variable has been set by
44*4882a593Smuzhiyun# environment or command line. This is necessary for CC and AR
45*4882a593Smuzhiyun# because make sets default values, so the simpler ?= approach
46*4882a593Smuzhiyun# won't work as expected.
47*4882a593Smuzhiyundefine allow-override
48*4882a593Smuzhiyun  $(if $(or $(findstring environment,$(origin $(1))),\
49*4882a593Smuzhiyun            $(findstring command line,$(origin $(1)))),,\
50*4882a593Smuzhiyun    $(eval $(1) = $(2)))
51*4882a593Smuzhiyunendef
52*4882a593Smuzhiyun
53*4882a593Smuzhiyunifneq ($(LLVM),)
54*4882a593Smuzhiyun$(call allow-override,CC,clang)
55*4882a593Smuzhiyun$(call allow-override,AR,llvm-ar)
56*4882a593Smuzhiyun$(call allow-override,LD,ld.lld)
57*4882a593Smuzhiyun$(call allow-override,CXX,clang++)
58*4882a593Smuzhiyun$(call allow-override,STRIP,llvm-strip)
59*4882a593Smuzhiyunelse
60*4882a593Smuzhiyun# Allow setting various cross-compile vars or setting CROSS_COMPILE as a prefix.
61*4882a593Smuzhiyun$(call allow-override,CC,$(CROSS_COMPILE)gcc)
62*4882a593Smuzhiyun$(call allow-override,AR,$(CROSS_COMPILE)ar)
63*4882a593Smuzhiyun$(call allow-override,LD,$(CROSS_COMPILE)ld)
64*4882a593Smuzhiyun$(call allow-override,CXX,$(CROSS_COMPILE)g++)
65*4882a593Smuzhiyun$(call allow-override,STRIP,$(CROSS_COMPILE)strip)
66*4882a593Smuzhiyunendif
67*4882a593Smuzhiyun
68*4882a593SmuzhiyunCC_NO_CLANG := $(shell $(CC) -dM -E -x c /dev/null | grep -Fq "__clang__"; echo $$?)
69*4882a593Smuzhiyun
70*4882a593Smuzhiyunifneq ($(LLVM),)
71*4882a593SmuzhiyunHOSTAR  ?= llvm-ar
72*4882a593SmuzhiyunHOSTCC  ?= clang
73*4882a593SmuzhiyunHOSTLD  ?= ld.lld
74*4882a593Smuzhiyunelse
75*4882a593SmuzhiyunHOSTAR  ?= ar
76*4882a593SmuzhiyunHOSTCC  ?= gcc
77*4882a593SmuzhiyunHOSTLD  ?= ld
78*4882a593Smuzhiyunendif
79*4882a593Smuzhiyun
80*4882a593Smuzhiyunifeq ($(CC_NO_CLANG), 1)
81*4882a593SmuzhiyunEXTRA_WARNINGS += -Wstrict-aliasing=3
82*4882a593Smuzhiyunendif
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun# Hack to avoid type-punned warnings on old systems such as RHEL5:
85*4882a593Smuzhiyun# We should be changing CFLAGS and checking gcc version, but this
86*4882a593Smuzhiyun# will do for now and keep the above -Wstrict-aliasing=3 in place
87*4882a593Smuzhiyun# in newer systems.
88*4882a593Smuzhiyun# Needed for the __raw_cmpxchg in tools/arch/x86/include/asm/cmpxchg.h
89*4882a593Smuzhiyun#
90*4882a593Smuzhiyun# See https://lkml.org/lkml/2006/11/28/253 and https://gcc.gnu.org/gcc-4.8/changes.html,
91*4882a593Smuzhiyun# that takes into account Linus's comments (search for Wshadow) for the reasoning about
92*4882a593Smuzhiyun# -Wshadow not being interesting before gcc 4.8.
93*4882a593Smuzhiyun
94*4882a593Smuzhiyunifneq ($(filter 3.%,$(MAKE_VERSION)),)  # make-3
95*4882a593SmuzhiyunEXTRA_WARNINGS += -fno-strict-aliasing
96*4882a593SmuzhiyunEXTRA_WARNINGS += -Wno-shadow
97*4882a593Smuzhiyunelse
98*4882a593SmuzhiyunEXTRA_WARNINGS += -Wshadow
99*4882a593Smuzhiyunendif
100*4882a593Smuzhiyun
101*4882a593Smuzhiyunifneq ($(findstring $(MAKEFLAGS), w),w)
102*4882a593SmuzhiyunPRINT_DIR = --no-print-directory
103*4882a593Smuzhiyunelse
104*4882a593SmuzhiyunNO_SUBDIR = :
105*4882a593Smuzhiyunendif
106*4882a593Smuzhiyun
107*4882a593Smuzhiyunifneq ($(findstring s,$(filter-out --%,$(MAKEFLAGS))),)
108*4882a593Smuzhiyun  silent=1
109*4882a593Smuzhiyunendif
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun#
112*4882a593Smuzhiyun# Define a callable command for descending to a new directory
113*4882a593Smuzhiyun#
114*4882a593Smuzhiyun# Call by doing: $(call descend,directory[,target])
115*4882a593Smuzhiyun#
116*4882a593Smuzhiyundescend = \
117*4882a593Smuzhiyun	+mkdir -p $(OUTPUT)$(1) && \
118*4882a593Smuzhiyun	$(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) $(2)
119*4882a593Smuzhiyun
120*4882a593SmuzhiyunQUIET_SUBDIR0  = +$(MAKE) $(COMMAND_O) -C # space to separate -C and subdir
121*4882a593SmuzhiyunQUIET_SUBDIR1  =
122*4882a593Smuzhiyun
123*4882a593Smuzhiyunifneq ($(silent),1)
124*4882a593Smuzhiyun  ifneq ($(V),1)
125*4882a593Smuzhiyun	QUIET_CC       = @echo '  CC       '$@;
126*4882a593Smuzhiyun	QUIET_CC_FPIC  = @echo '  CC FPIC  '$@;
127*4882a593Smuzhiyun	QUIET_CLANG    = @echo '  CLANG    '$@;
128*4882a593Smuzhiyun	QUIET_AR       = @echo '  AR       '$@;
129*4882a593Smuzhiyun	QUIET_LINK     = @echo '  LINK     '$@;
130*4882a593Smuzhiyun	QUIET_MKDIR    = @echo '  MKDIR    '$@;
131*4882a593Smuzhiyun	QUIET_GEN      = @echo '  GEN      '$@;
132*4882a593Smuzhiyun	QUIET_SUBDIR0  = +@subdir=
133*4882a593Smuzhiyun	QUIET_SUBDIR1  = ;$(NO_SUBDIR) \
134*4882a593Smuzhiyun			  echo '  SUBDIR   '$$subdir; \
135*4882a593Smuzhiyun			 $(MAKE) $(PRINT_DIR) -C $$subdir
136*4882a593Smuzhiyun	QUIET_FLEX     = @echo '  FLEX     '$@;
137*4882a593Smuzhiyun	QUIET_BISON    = @echo '  BISON    '$@;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun	descend = \
140*4882a593Smuzhiyun		+@echo	       '  DESCEND  '$(1); \
141*4882a593Smuzhiyun		mkdir -p $(OUTPUT)$(1) && \
142*4882a593Smuzhiyun		$(MAKE) $(COMMAND_O) subdir=$(if $(subdir),$(subdir)/$(1),$(1)) $(PRINT_DIR) -C $(1) $(2)
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun	QUIET_CLEAN    = @printf '  CLEAN    %s\n' $1;
145*4882a593Smuzhiyun	QUIET_INSTALL  = @printf '  INSTALL  %s\n' $1;
146*4882a593Smuzhiyun	QUIET_UNINST   = @printf '  UNINST   %s\n' $1;
147*4882a593Smuzhiyun  endif
148*4882a593Smuzhiyunendif
149*4882a593Smuzhiyun
150*4882a593Smuzhiyunpound := \#
151