From 73a4f6dbe70a1b93c11e2d1d6ca68f3522daf434 Mon Sep 17 00:00:00 2001 From: Masahiro Yamada Date: Sun, 10 Dec 2017 01:02:28 +0900 Subject: kbuild: add LEX and YACC variables Allow users to use their favorite lexer / parser generators. This is useful for me to test various flex and bison versions. Signed-off-by: Masahiro Yamada --- scripts/Makefile.lib | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'scripts/Makefile.lib') diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 1ca4dcd..ee528e3 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -193,7 +193,7 @@ ifdef REGENERATE_PARSERS LEX_PREFIX = $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy) quiet_cmd_flex = LEX $@ - cmd_flex = flex -o$@ -L -P $(LEX_PREFIX) $< + cmd_flex = $(LEX) -o$@ -L -P $(LEX_PREFIX) $< .PRECIOUS: $(src)/%.lex.c_shipped $(src)/%.lex.c_shipped: $(src)/%.l @@ -204,7 +204,7 @@ $(src)/%.lex.c_shipped: $(src)/%.l YACC_PREFIX = $(if $(YACC_PREFIX_${baseprereq}),$(YACC_PREFIX_${baseprereq}),yy) quiet_cmd_bison = YACC $@ - cmd_bison = bison -o$@ -t -l -p $(YACC_PREFIX) $< + cmd_bison = $(YACC) -o$@ -t -l -p $(YACC_PREFIX) $< .PRECIOUS: $(src)/%.tab.c_shipped $(src)/%.tab.c_shipped: $(src)/%.y -- cgit v1.1 From 033dba2ec06c47a9fe1b190bc3281058fb20738d Mon Sep 17 00:00:00 2001 From: Masahiro Yamada Date: Sun, 10 Dec 2017 01:02:29 +0900 Subject: 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 --- scripts/Makefile.lib | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'scripts/Makefile.lib') diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index ee528e3..0f9ef3f 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -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 # =========================================================================== -- cgit v1.1 From eea199b445f64c038b1d868bd52700510843ccd6 Mon Sep 17 00:00:00 2001 From: Masahiro Yamada Date: Fri, 12 Jan 2018 00:51:52 +0900 Subject: kbuild: remove unnecessary LEX_PREFIX and YACC_PREFIX Kconfig was the only user of these. With Kconfig converted to use the default 'yy' prefix, we do not need them any more. Signed-off-by: Masahiro Yamada Reviewed-by: Ulf Magnusson --- scripts/Makefile.lib | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'scripts/Makefile.lib') diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 0f9ef3f..5ff2761 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -188,10 +188,8 @@ endef # LEX # --------------------------------------------------------------------------- -LEX_PREFIX = $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy) - quiet_cmd_flex = LEX $@ - cmd_flex = $(LEX) -o$@ -L -P $(LEX_PREFIX) $< + cmd_flex = $(LEX) -o$@ -L $< ifdef REGENERATE_PARSERS .PRECIOUS: $(src)/%.lex.c_shipped @@ -205,10 +203,8 @@ $(filter %.lex.c,$(targets)): $(obj)/%.lex.c: $(src)/%.l FORCE # YACC # --------------------------------------------------------------------------- -YACC_PREFIX = $(if $(YACC_PREFIX_${baseprereq}),$(YACC_PREFIX_${baseprereq}),yy) - quiet_cmd_bison = YACC $@ - cmd_bison = $(YACC) -o$@ -t -l -p $(YACC_PREFIX) $< + cmd_bison = $(YACC) -o$@ -t -l $< ifdef REGENERATE_PARSERS .PRECIOUS: $(src)/%.tab.c_shipped -- cgit v1.1