aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2018-05-28 05:21:38 -0400
committerMasahiro Yamada <yamada.masahiro@socionext.com>2018-05-28 14:28:58 -0400
commite08d6de4e5321aefa8ac2ba72d464dd9727365e8 (patch)
treefc6a8d071e235710e604549fe9c64ef5869ce570
parent694c49a7c01cc87194be40cb26404b58b68c291c (diff)
kbuild: remove kbuild cache
The kbuild cache was introduced to remember the result of shell commands, some of which are expensive to compute, such as $(call cc-option,...). However, this turned out not so clever as I had first expected. Actually, it is problematic. For example, "$(CC) -print-file-name" is cached. If the compiler is updated, the stale search path causes build error, which is difficult to figure out. Another problem scenario is cache files could be touched while install targets are running under the root permission. We can patch them if desired, but the build infrastructure is getting uglier and uglier. Now, we are going to move compiler flag tests to the configuration phase. If this is completed, the result of compiler tests will be naturally cached in the .config file. We will not have performance issues of incremental building since this testing only happens at Kconfig time. To start this work with a cleaner code base, remove the kbuild cache first. Revert the following commits: Commit 9a234a2e3843 ("kbuild: create directory for make cache only when necessary") Commit e17c400ae194 ("kbuild: shrink .cache.mk when it exceeds 1000 lines") Commit 4e56207130ed ("kbuild: Cache a few more calls to the compiler") Commit 3298b690b21c ("kbuild: Add a cache for generated variables") Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Reviewed-by: Kees Cook <keescook@chromium.org>
-rw-r--r--Makefile5
-rw-r--r--scripts/Kbuild.include101
2 files changed, 16 insertions, 90 deletions
diff --git a/Makefile b/Makefile
index 56ba070dfa09..02202d324962 100644
--- a/Makefile
+++ b/Makefile
@@ -504,7 +504,7 @@ KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
504KBUILD_AFLAGS += $(call cc-option,-fno-PIE) 504KBUILD_AFLAGS += $(call cc-option,-fno-PIE)
505 505
506# check for 'asm goto' 506# check for 'asm goto'
507ifeq ($(call shell-cached,$(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y) 507ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC) $(KBUILD_CFLAGS)), y)
508 CC_HAVE_ASM_GOTO := 1 508 CC_HAVE_ASM_GOTO := 1
509 KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO 509 KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO
510 KBUILD_AFLAGS += -DCC_HAVE_ASM_GOTO 510 KBUILD_AFLAGS += -DCC_HAVE_ASM_GOTO
@@ -807,7 +807,7 @@ KBUILD_CFLAGS += $(call cc-option,-fdata-sections,)
807endif 807endif
808 808
809# arch Makefile may override CC so keep this after arch Makefile is included 809# arch Makefile may override CC so keep this after arch Makefile is included
810NOSTDINC_FLAGS += -nostdinc -isystem $(call shell-cached,$(CC) -print-file-name=include) 810NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
811CHECKFLAGS += $(NOSTDINC_FLAGS) 811CHECKFLAGS += $(NOSTDINC_FLAGS)
812 812
813# warn about C99 declaration after statement 813# warn about C99 declaration after statement
@@ -1625,7 +1625,6 @@ clean: $(clean-dirs)
1625 -o -name '*.asn1.[ch]' \ 1625 -o -name '*.asn1.[ch]' \
1626 -o -name '*.symtypes' -o -name 'modules.order' \ 1626 -o -name '*.symtypes' -o -name 'modules.order' \
1627 -o -name modules.builtin -o -name '.tmp_*.o.*' \ 1627 -o -name modules.builtin -o -name '.tmp_*.o.*' \
1628 -o -name .cache.mk \
1629 -o -name '*.c.[012]*.*' \ 1628 -o -name '*.c.[012]*.*' \
1630 -o -name '*.ll' \ 1629 -o -name '*.ll' \
1631 -o -name '*.gcno' \) -type f -print | xargs rm -f 1630 -o -name '*.gcno' \) -type f -print | xargs rm -f
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index c7fedc5bfd11..c8156d61678c 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -8,8 +8,6 @@ squote := '
8empty := 8empty :=
9space := $(empty) $(empty) 9space := $(empty) $(empty)
10space_escape := _-_SPACE_-_ 10space_escape := _-_SPACE_-_
11right_paren := )
12left_paren := (
13pound := \# 11pound := \#
14 12
15### 13###
@@ -82,71 +80,6 @@ cc-cross-prefix = \
82 echo $(c); \ 80 echo $(c); \
83 fi))) 81 fi)))
84 82
85# Tools for caching Makefile variables that are "expensive" to compute.
86#
87# Here we want to help deal with variables that take a long time to compute
88# by making it easy to store these variables in a cache.
89#
90# The canonical example here is testing for compiler flags. On a simple system
91# each call to the compiler takes 10 ms, but on a system with a compiler that's
92# called through various wrappers it can take upwards of 100 ms. If we have
93# 100 calls to the compiler this can take 1 second (on a simple system) or 10
94# seconds (on a complicated system).
95#
96# The "cache" will be in Makefile syntax and can be directly included.
97# Any time we try to reference a variable that's not in the cache we'll
98# calculate it and store it in the cache for next time.
99
100# Include values from last time
101make-cache := $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/,$(if $(obj),$(obj)/)).cache.mk
102$(make-cache): ;
103-include $(make-cache)
104
105cached-data := $(filter __cached_%, $(.VARIABLES))
106
107# If cache exceeds 1000 lines, shrink it down to 500.
108ifneq ($(word 1000,$(cached-data)),)
109$(shell tail -n 500 $(make-cache) > $(make-cache).tmp; \
110 mv $(make-cache).tmp $(make-cache))
111endif
112
113create-cache-dir := $(if $(KBUILD_SRC),$(if $(cache-data),,1))
114
115# Usage: $(call __sanitize-opt,Hello=Hola$(comma)Goodbye Adios)
116#
117# Convert all '$', ')', '(', '\', '=', ' ', ',', ':' to '_'
118__sanitize-opt = $(subst $$,_,$(subst $(right_paren),_,$(subst $(left_paren),_,$(subst \,_,$(subst =,_,$(subst $(space),_,$(subst $(comma),_,$(subst :,_,$(1)))))))))
119
120# Usage: $(call shell-cached,shell_command)
121# Example: $(call shell-cached,md5sum /usr/bin/gcc)
122#
123# If we've already seen a call to this exact shell command (even in a
124# previous invocation of make!) we'll return the value. If not, we'll
125# compute it and store the result for future runs.
126#
127# This is a bit of voodoo, but basic explanation is that if the variable
128# was undefined then we'll evaluate the shell command and store the result
129# into the variable. We'll then store that value in the cache and finally
130# output the value.
131#
132# NOTE: The $$(2) here isn't actually a parameter to __run-and-store. We
133# happen to know that the caller will have their shell command in $(2) so the
134# result of "call"ing this will produce a reference to that $(2). The reason
135# for this strangeness is to avoid an extra level of eval (and escaping) of
136# $(2).
137define __run-and-store
138ifeq ($(origin $(1)),undefined)
139 $$(eval $(1) := $$(shell $$(2)))
140ifeq ($(create-cache-dir),1)
141 $$(shell mkdir -p $(dir $(make-cache)))
142 $$(eval create-cache-dir :=)
143endif
144 $$(shell echo '$(1) := $$($(1))' >> $(make-cache))
145endif
146endef
147__shell-cached = $(eval $(call __run-and-store,$(1)))$($(1))
148shell-cached = $(call __shell-cached,__cached_$(call __sanitize-opt,$(1)),$(1))
149
150# output directory for tests below 83# output directory for tests below
151TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/) 84TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)
152 85
@@ -154,36 +87,30 @@ TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)
154# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise) 87# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)
155# Exit code chooses option. "$$TMP" serves as a temporary file and is 88# Exit code chooses option. "$$TMP" serves as a temporary file and is
156# automatically cleaned up. 89# automatically cleaned up.
157__try-run = set -e; \ 90try-run = $(shell set -e; \
158 TMP="$(TMPOUT).$$$$.tmp"; \ 91 TMP="$(TMPOUT).$$$$.tmp"; \
159 TMPO="$(TMPOUT).$$$$.o"; \ 92 TMPO="$(TMPOUT).$$$$.o"; \
160 if ($(1)) >/dev/null 2>&1; \ 93 if ($(1)) >/dev/null 2>&1; \
161 then echo "$(2)"; \ 94 then echo "$(2)"; \
162 else echo "$(3)"; \ 95 else echo "$(3)"; \
163 fi; \ 96 fi; \
164 rm -f "$$TMP" "$$TMPO" 97 rm -f "$$TMP" "$$TMPO")
165
166try-run = $(shell $(__try-run))
167
168# try-run-cached
169# This works like try-run, but the result is cached.
170try-run-cached = $(call shell-cached,$(__try-run))
171 98
172# as-option 99# as-option
173# Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,) 100# Usage: cflags-y += $(call as-option,-Wa$(comma)-isa=foo,)
174 101
175as-option = $(call try-run-cached,\ 102as-option = $(call try-run,\
176 $(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2)) 103 $(CC) $(KBUILD_CFLAGS) $(1) -c -x assembler /dev/null -o "$$TMP",$(1),$(2))
177 104
178# as-instr 105# as-instr
179# Usage: cflags-y += $(call as-instr,instr,option1,option2) 106# Usage: cflags-y += $(call as-instr,instr,option1,option2)
180 107
181as-instr = $(call try-run-cached,\ 108as-instr = $(call try-run,\
182 printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3)) 109 printf "%b\n" "$(1)" | $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" -,$(2),$(3))
183 110
184# __cc-option 111# __cc-option
185# Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586) 112# Usage: MY_CFLAGS += $(call __cc-option,$(CC),$(MY_CFLAGS),-march=winchip-c6,-march=i586)
186__cc-option = $(call try-run-cached,\ 113__cc-option = $(call try-run,\
187 $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4)) 114 $(1) -Werror $(2) $(3) -c -x c /dev/null -o "$$TMP",$(3),$(4))
188 115
189# Do not attempt to build with gcc plugins during cc-option tests. 116# Do not attempt to build with gcc plugins during cc-option tests.
@@ -203,23 +130,23 @@ hostcc-option = $(call __cc-option, $(HOSTCC),\
203 130
204# cc-option-yn 131# cc-option-yn
205# Usage: flag := $(call cc-option-yn,-march=winchip-c6) 132# Usage: flag := $(call cc-option-yn,-march=winchip-c6)
206cc-option-yn = $(call try-run-cached,\ 133cc-option-yn = $(call try-run,\
207 $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n) 134 $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) $(1) -c -x c /dev/null -o "$$TMP",y,n)
208 135
209# cc-disable-warning 136# cc-disable-warning
210# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable) 137# Usage: cflags-y += $(call cc-disable-warning,unused-but-set-variable)
211cc-disable-warning = $(call try-run-cached,\ 138cc-disable-warning = $(call try-run,\
212 $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1))) 139 $(CC) -Werror $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
213 140
214# cc-name 141# cc-name
215# Expands to either gcc or clang 142# Expands to either gcc or clang
216cc-name = $(call shell-cached,$(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc) 143cc-name = $(shell $(CC) -v 2>&1 | grep -q "clang version" && echo clang || echo gcc)
217 144
218# cc-version 145# cc-version
219cc-version = $(call shell-cached,$(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC)) 146cc-version = $(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-version.sh $(CC))
220 147
221# cc-fullversion 148# cc-fullversion
222cc-fullversion = $(call shell-cached,$(CONFIG_SHELL) \ 149cc-fullversion = $(shell $(CONFIG_SHELL) \
223 $(srctree)/scripts/gcc-version.sh -p $(CC)) 150 $(srctree)/scripts/gcc-version.sh -p $(CC))
224 151
225# cc-ifversion 152# cc-ifversion
@@ -232,21 +159,21 @@ cc-if-fullversion = $(shell [ $(cc-fullversion) $(1) $(2) ] && echo $(3) || echo
232 159
233# cc-ldoption 160# cc-ldoption
234# Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both) 161# Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
235cc-ldoption = $(call try-run-cached,\ 162cc-ldoption = $(call try-run,\
236 $(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2)) 163 $(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
237 164
238# ld-option 165# ld-option
239# Usage: LDFLAGS += $(call ld-option, -X) 166# Usage: LDFLAGS += $(call ld-option, -X)
240ld-option = $(call try-run-cached, $(LD) $(LDFLAGS) $(1) -v,$(1),$(2)) 167ld-option = $(call try-run, $(LD) $(LDFLAGS) $(1) -v,$(1),$(2))
241 168
242# ar-option 169# ar-option
243# Usage: KBUILD_ARFLAGS := $(call ar-option,D) 170# Usage: KBUILD_ARFLAGS := $(call ar-option,D)
244# Important: no spaces around options 171# Important: no spaces around options
245ar-option = $(call try-run-cached, $(AR) rc$(1) "$$TMP",$(1),$(2)) 172ar-option = $(call try-run, $(AR) rc$(1) "$$TMP",$(1),$(2))
246 173
247# ld-version 174# ld-version
248# Note this is mainly for HJ Lu's 3 number binutil versions 175# Note this is mainly for HJ Lu's 3 number binutil versions
249ld-version = $(call shell-cached,$(LD) --version | $(srctree)/scripts/ld-version.sh) 176ld-version = $(shell $(LD) --version | $(srctree)/scripts/ld-version.sh)
250 177
251# ld-ifversion 178# ld-ifversion
252# Usage: $(call ld-ifversion, -ge, 22252, y) 179# Usage: $(call ld-ifversion, -ge, 22252, y)