summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2017-12-09 11:02:29 -0500
committerMasahiro Yamada <yamada.masahiro@socionext.com>2017-12-15 21:12:53 -0500
commit033dba2ec06c47a9fe1b190bc3281058fb20738d (patch)
treed187e007d9082ab05d482238f9d2e7ddc937c37d
parent73a4f6dbe70a1b93c11e2d1d6ca68f3522daf434 (diff)
kbuild: prepare to remove C files pre-generated by flex and bison
In Linux build system convention, pre-generated files are version- controlled with a "_shipped" suffix. During the kernel building, they are simply shipped (copied) removing the suffix. This approach can reduce external tool dependency for the kernel build, but it is tedious to manually regenerate such artifacts from developers' point of view. (We need to do "make REGENERATE_PARSERS=1" every time we touch real source files such as *.l, *.y) Some months ago, I sent out RFC patches to run flex, bison, and gperf during the build. In the review and test, Linus noticed gperf-3.1 had changed the lookup function prototype. Then, the use of gperf in kernel was entirely removed by commit bb3290d91695 ("Remove gperf usage from toolchain"). This time, I tested several versions of flex and bison, and I was not hit by any compatibility issue except a flaw in flex-2.6.3; if you generate lexer for dtc and genksyms with flex-2.6.3, you will see "yywrap redefined" warning. This was not intentional, but a bug, fixed by flex-2.6.4. Otherwise, both flex and bison look fairly stable for a long time. This commit prepares some build rules to remove the _shipped files. Also, document minimal requirement for flex and bison. Rationale for the minimal version: The -Wmissing-prototypes option of GCC warns "no previous prototype" for lexers generated by flex-2.5.34 or older, so I chose 2.5.35 as the required version for flex. Flex-2.5.35 was released in 2008. Bison looks more stable. I did not see any problem with bison-2.0, released in 2004. I did not test bison-1.x, but bison-2.0 should be old enough. Tested flex versions: 2.5.35 2.5.36 2.5.37 2.5.39 2.6.0 2.6.1 2.6.2 2.6.3 (*) 2.6.4 (*) flex-2.6.3 causes "yywrap redefined" warning Tested bison versions: 2.0 2.1 2.2 2.3 2.4 2.4.1 2.5.1 2.6 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.7 2.7.1 3.0 3.0.1 3.0.2 3.0.3 3.0.4 Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
-rw-r--r--Documentation/process/changes.rst25
-rw-r--r--scripts/Makefile.lib20
2 files changed, 42 insertions, 3 deletions
diff --git a/Documentation/process/changes.rst b/Documentation/process/changes.rst
index 560beaef5a7c..81cdb528ad46 100644
--- a/Documentation/process/changes.rst
+++ b/Documentation/process/changes.rst
@@ -32,6 +32,8 @@ you probably needn't concern yourself with isdn4k-utils.
32GNU C 3.2 gcc --version 32GNU C 3.2 gcc --version
33GNU make 3.81 make --version 33GNU make 3.81 make --version
34binutils 2.20 ld -v 34binutils 2.20 ld -v
35flex 2.5.35 flex --version
36bison 2.0 bison --version
35util-linux 2.10o fdformat --version 37util-linux 2.10o fdformat --version
36module-init-tools 0.9.10 depmod -V 38module-init-tools 0.9.10 depmod -V
37e2fsprogs 1.41.4 e2fsck -V 39e2fsprogs 1.41.4 e2fsck -V
@@ -79,6 +81,19 @@ The build system has, as of 4.13, switched to using thin archives (`ar T`)
79rather than incremental linking (`ld -r`) for built-in.o intermediate steps. 81rather than incremental linking (`ld -r`) for built-in.o intermediate steps.
80This requires binutils 2.20 or newer. 82This requires binutils 2.20 or newer.
81 83
84Flex
85----
86
87Since Linux 4.16, the build system generates lexical analyzers
88during build. This requires flex 2.5.35 or later.
89
90
91Bison
92-----
93
94Since Linux 4.16, the build system generates parsers
95during build. This requires bison 2.0 or later.
96
82Perl 97Perl
83---- 98----
84 99
@@ -333,6 +348,16 @@ Binutils
333 348
334- <https://www.kernel.org/pub/linux/devel/binutils/> 349- <https://www.kernel.org/pub/linux/devel/binutils/>
335 350
351Flex
352----
353
354- <https://github.com/westes/flex/releases>
355
356Bison
357-----
358
359- <ftp://ftp.gnu.org/gnu/bison/>
360
336OpenSSL 361OpenSSL
337------- 362-------
338 363
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index ee528e30f80f..0f9ef3fbbaf5 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -186,8 +186,6 @@ $(foreach m, $(notdir $1), \
186 $(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s))))))) 186 $(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s)))))))
187endef 187endef
188 188
189ifdef REGENERATE_PARSERS
190
191# LEX 189# LEX
192# --------------------------------------------------------------------------- 190# ---------------------------------------------------------------------------
193LEX_PREFIX = $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy) 191LEX_PREFIX = $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy)
@@ -195,9 +193,15 @@ LEX_PREFIX = $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy)
195quiet_cmd_flex = LEX $@ 193quiet_cmd_flex = LEX $@
196 cmd_flex = $(LEX) -o$@ -L -P $(LEX_PREFIX) $< 194 cmd_flex = $(LEX) -o$@ -L -P $(LEX_PREFIX) $<
197 195
196ifdef REGENERATE_PARSERS
198.PRECIOUS: $(src)/%.lex.c_shipped 197.PRECIOUS: $(src)/%.lex.c_shipped
199$(src)/%.lex.c_shipped: $(src)/%.l 198$(src)/%.lex.c_shipped: $(src)/%.l
200 $(call cmd,flex) 199 $(call cmd,flex)
200endif
201
202.PRECIOUS: $(obj)/%.lex.c
203$(filter %.lex.c,$(targets)): $(obj)/%.lex.c: $(src)/%.l FORCE
204 $(call if_changed,flex)
201 205
202# YACC 206# YACC
203# --------------------------------------------------------------------------- 207# ---------------------------------------------------------------------------
@@ -206,19 +210,29 @@ YACC_PREFIX = $(if $(YACC_PREFIX_${baseprereq}),$(YACC_PREFIX_${baseprereq}),yy)
206quiet_cmd_bison = YACC $@ 210quiet_cmd_bison = YACC $@
207 cmd_bison = $(YACC) -o$@ -t -l -p $(YACC_PREFIX) $< 211 cmd_bison = $(YACC) -o$@ -t -l -p $(YACC_PREFIX) $<
208 212
213ifdef REGENERATE_PARSERS
209.PRECIOUS: $(src)/%.tab.c_shipped 214.PRECIOUS: $(src)/%.tab.c_shipped
210$(src)/%.tab.c_shipped: $(src)/%.y 215$(src)/%.tab.c_shipped: $(src)/%.y
211 $(call cmd,bison) 216 $(call cmd,bison)
217endif
218
219.PRECIOUS: $(obj)/%.tab.c
220$(filter %.tab.c,$(targets)): $(obj)/%.tab.c: $(src)/%.y FORCE
221 $(call if_changed,bison)
212 222
213quiet_cmd_bison_h = YACC $@ 223quiet_cmd_bison_h = YACC $@
214 cmd_bison_h = bison -o/dev/null --defines=$@ -t -l -p $(YACC_PREFIX) $< 224 cmd_bison_h = bison -o/dev/null --defines=$@ -t -l -p $(YACC_PREFIX) $<
215 225
226ifdef REGENERATE_PARSERS
216.PRECIOUS: $(src)/%.tab.h_shipped 227.PRECIOUS: $(src)/%.tab.h_shipped
217$(src)/%.tab.h_shipped: $(src)/%.y 228$(src)/%.tab.h_shipped: $(src)/%.y
218 $(call cmd,bison_h) 229 $(call cmd,bison_h)
219
220endif 230endif
221 231
232.PRECIOUS: $(obj)/%.tab.h
233$(filter %.tab.h,$(targets)): $(obj)/%.tab.h: $(src)/%.y FORCE
234 $(call if_changed,bison_h)
235
222# Shipped files 236# Shipped files
223# =========================================================================== 237# ===========================================================================
224 238