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 bb3290d916
("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>
This commit is contained in:
parent
73a4f6dbe7
commit
033dba2ec0
@ -32,6 +32,8 @@ you probably needn't concern yourself with isdn4k-utils.
|
||||
GNU C 3.2 gcc --version
|
||||
GNU make 3.81 make --version
|
||||
binutils 2.20 ld -v
|
||||
flex 2.5.35 flex --version
|
||||
bison 2.0 bison --version
|
||||
util-linux 2.10o fdformat --version
|
||||
module-init-tools 0.9.10 depmod -V
|
||||
e2fsprogs 1.41.4 e2fsck -V
|
||||
@ -79,6 +81,19 @@ The build system has, as of 4.13, switched to using thin archives (`ar T`)
|
||||
rather than incremental linking (`ld -r`) for built-in.o intermediate steps.
|
||||
This requires binutils 2.20 or newer.
|
||||
|
||||
Flex
|
||||
----
|
||||
|
||||
Since Linux 4.16, the build system generates lexical analyzers
|
||||
during build. This requires flex 2.5.35 or later.
|
||||
|
||||
|
||||
Bison
|
||||
-----
|
||||
|
||||
Since Linux 4.16, the build system generates parsers
|
||||
during build. This requires bison 2.0 or later.
|
||||
|
||||
Perl
|
||||
----
|
||||
|
||||
@ -333,6 +348,16 @@ Binutils
|
||||
|
||||
- <https://www.kernel.org/pub/linux/devel/binutils/>
|
||||
|
||||
Flex
|
||||
----
|
||||
|
||||
- <https://github.com/westes/flex/releases>
|
||||
|
||||
Bison
|
||||
-----
|
||||
|
||||
- <ftp://ftp.gnu.org/gnu/bison/>
|
||||
|
||||
OpenSSL
|
||||
-------
|
||||
|
||||
|
@ -186,8 +186,6 @@ $(foreach m, $(notdir $1), \
|
||||
$(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s)))))))
|
||||
endef
|
||||
|
||||
ifdef REGENERATE_PARSERS
|
||||
|
||||
# LEX
|
||||
# ---------------------------------------------------------------------------
|
||||
LEX_PREFIX = $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy)
|
||||
@ -195,9 +193,15 @@ LEX_PREFIX = $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy)
|
||||
quiet_cmd_flex = LEX $@
|
||||
cmd_flex = $(LEX) -o$@ -L -P $(LEX_PREFIX) $<
|
||||
|
||||
ifdef REGENERATE_PARSERS
|
||||
.PRECIOUS: $(src)/%.lex.c_shipped
|
||||
$(src)/%.lex.c_shipped: $(src)/%.l
|
||||
$(call cmd,flex)
|
||||
endif
|
||||
|
||||
.PRECIOUS: $(obj)/%.lex.c
|
||||
$(filter %.lex.c,$(targets)): $(obj)/%.lex.c: $(src)/%.l FORCE
|
||||
$(call if_changed,flex)
|
||||
|
||||
# YACC
|
||||
# ---------------------------------------------------------------------------
|
||||
@ -206,19 +210,29 @@ YACC_PREFIX = $(if $(YACC_PREFIX_${baseprereq}),$(YACC_PREFIX_${baseprereq}),yy)
|
||||
quiet_cmd_bison = YACC $@
|
||||
cmd_bison = $(YACC) -o$@ -t -l -p $(YACC_PREFIX) $<
|
||||
|
||||
ifdef REGENERATE_PARSERS
|
||||
.PRECIOUS: $(src)/%.tab.c_shipped
|
||||
$(src)/%.tab.c_shipped: $(src)/%.y
|
||||
$(call cmd,bison)
|
||||
endif
|
||||
|
||||
.PRECIOUS: $(obj)/%.tab.c
|
||||
$(filter %.tab.c,$(targets)): $(obj)/%.tab.c: $(src)/%.y FORCE
|
||||
$(call if_changed,bison)
|
||||
|
||||
quiet_cmd_bison_h = YACC $@
|
||||
cmd_bison_h = bison -o/dev/null --defines=$@ -t -l -p $(YACC_PREFIX) $<
|
||||
|
||||
ifdef REGENERATE_PARSERS
|
||||
.PRECIOUS: $(src)/%.tab.h_shipped
|
||||
$(src)/%.tab.h_shipped: $(src)/%.y
|
||||
$(call cmd,bison_h)
|
||||
|
||||
endif
|
||||
|
||||
.PRECIOUS: $(obj)/%.tab.h
|
||||
$(filter %.tab.h,$(targets)): $(obj)/%.tab.h: $(src)/%.y FORCE
|
||||
$(call if_changed,bison_h)
|
||||
|
||||
# Shipped files
|
||||
# ===========================================================================
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user