From patchwork Fri Jun 3 17:16:52 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Lacombe X-Patchwork-Id: 847902 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter2.kernel.org (8.14.4/8.14.3) with ESMTP id p53HGPXU024572 for ; Fri, 3 Jun 2011 17:17:09 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751513Ab1FCRRJ (ORCPT ); Fri, 3 Jun 2011 13:17:09 -0400 Received: from mail-yw0-f46.google.com ([209.85.213.46]:57991 "EHLO mail-yw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750990Ab1FCRRI (ORCPT ); Fri, 3 Jun 2011 13:17:08 -0400 Received: by ywe9 with SMTP id 9so837274ywe.19 for ; Fri, 03 Jun 2011 10:17:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=3bBMolJeIydJHrfjcj+STZ20HnYi3tN5kSBsq3BtKCc=; b=GXSNKyxaEE+i23Ck8NDbOzozmVPfSsLzyu4NvfeBLayUt7ouaCQV32hgIRDHnqSlyZ MB9AaXTIKPhZhE5OuxXPJRlzY7nDuoQnsbPA4jJ0P6TsflIoyJKuWJ2zueHokWqrJMYa gpnu8d+LvqLhPZNCzDvOh3h0TDTT8qnjoW1wc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=xAczcJcQbA616G+7JEg7xWDfKY+eURLjkHrYhVUpzC2t6VDutyLAAo9ifDDY7TMZ3F s3jJoYdM+/LWi53TTIWjRODI0GkyW5sWCIDetWhz8NofwmcGfks4WdbsyxC2/ZJXR4jE uxLmCHoQLzh90BZ46rJDYL8YREmFteYaFYYBA= Received: by 10.147.100.20 with SMTP id c20mr12436yam.5.1307121427262; Fri, 03 Jun 2011 10:17:07 -0700 (PDT) Received: from localhost.localdomain (76-10-146-236.dsl.teksavvy.com [76.10.146.236]) by mx.google.com with ESMTPS id o47sm1446539yhn.72.2011.06.03.10.17.03 (version=SSLv3 cipher=OTHER); Fri, 03 Jun 2011 10:17:05 -0700 (PDT) From: Arnaud Lacombe To: linux-kbuild@vger.kernel.org Cc: Michal Marek , Arnaud Lacombe Subject: [RFCv3] Kbuild: factor parser rules Date: Fri, 3 Jun 2011 13:16:52 -0400 Message-Id: <1307121412-6314-1-git-send-email-lacombar@gmail.com> X-Mailer: git-send-email 1.7.3.4.574.g608b.dirty In-Reply-To: <1306138239-13440-1-git-send-email-lacombar@gmail.com> References: <1306138239-13440-1-git-send-email-lacombar@gmail.com> Sender: linux-kbuild-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter2.kernel.org [140.211.167.43]); Fri, 03 Jun 2011 17:17:10 +0000 (UTC) Hi Michal, Here is some update concerning the parser generation merge. I do not repost the whole serie as it may be overkill. You can find the latest branch at: git://github.com/lacombar/linux-2.6.git kbuild-implicit-parser-rule You'll find an updated diff between v2 [rebased on top of v3.0-rc1] and v3 below. Changes since v2: - allow a parser to specify the prefix to be used. This will allow for multiple parser to use the implicit rules, which was not previously possible, as it was using the `yy' default. - drop the zconf prefix changes - add a `baseprereq' global to kbuild, which mimics `basetarget' - rebase on top of v3.0-rc1 Changes since v1: - include scripts/dtc/' parser in the scope of the patchset - do not rename any parser source - make lexer file name consistent, ie. name it %.lex.c, not lex.%.c - rebase on top of v2.6.39 I am still not a huge fan of the {YACC,LEX}_PREFIX_ naming, if you got a better idea, it is most welcome ! Regards, - Arnaud Arnaud Lacombe (11): kbuild: add `baseprereq' kbuild: add implicit rules for parser generation genksyms: pass hash and lookup functions name and target language though the input file genksyms: migrate parser to implicit rules genksym: regen parser kconfig: constify `kconf_id_lookup' kconfig: kill no longer needed reference to YYDEBUG kconfig: migrate parser to implicit rules kconfig: regen parser dtc: migrate parser to implicit rules dtc: regen parser --- scripts/Kbuild.include | 4 ++++ scripts/Makefile.lib | 5 +++-- scripts/kconfig/Makefile | 3 +++ scripts/kconfig/lkc.h | 2 +- scripts/kconfig/zconf.l | 16 ++++++++-------- scripts/kconfig/zconf.y | 28 ++++++++++++++-------------- 6 files changed, 33 insertions(+), 25 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index be39cd1..d897278 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -21,6 +21,10 @@ depfile = $(subst $(comma),_,$(dot-target).d) basetarget = $(basename $(notdir $@)) ### +# filename of first prerequisite with directory and extension stripped +baseprereq = $(basename $(notdir $<)) + +### # Escape single quote for use in echo statements escsq = $(subst $(squote),'\$(squote)',$1) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 104d53f5..f76d9ba 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -171,14 +171,15 @@ $(src)/%.hash.c_shipped: $(src)/%.gperf # LEX # --------------------------------------------------------------------------- quiet_cmd_flex = LEX $@ - cmd_flex = flex -o$@ -L $< + cmd_flex = flex -o$@ -L -P $(if $(LEX_PREFIX_${baseprereq}),$(LEX_PREFIX_${baseprereq}),yy) $< + $(src)/%.lex.c_shipped: $(src)/%.l $(call cmd,flex) # YACC # --------------------------------------------------------------------------- quiet_cmd_bison = YACC $@ - cmd_bison = bison -o$@ -d -t -l $< + cmd_bison = bison -o$@ -d -t -l -p $(if $(YACC_PREFIX_${baseprereq}),$(YACC_PREFIX_${baseprereq}),yy) $< $(src)/%.tab.c_shipped: $(src)/%.y $(call cmd,bison) diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 536012d..0b4276c 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile @@ -223,6 +223,9 @@ HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(srctree)/$(src)/check.sh $(HOSTCC) HOSTCFLAGS_zconf.lex.o := -I$(src) HOSTCFLAGS_zconf.tab.o := -I$(src) +LEX_PREFIX_zconf := zconf +YACC_PREFIX_zconf := zconf + HOSTLOADLIBES_qconf = $(KC_QT_LIBS) -ldl HOSTCXXFLAGS_qconf.o = $(KC_QT_CFLAGS) -D LKC_DIRECT_LINK diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index 9fab6d3..f34a0a9 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -68,7 +68,7 @@ struct kconf_id { enum symbol_type stype; }; -extern int yydebug; +extern int zconfdebug; int zconfparse(void); void zconfdump(FILE *out); diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l index 9ca6e5f..98aad53 100644 --- a/scripts/kconfig/zconf.l +++ b/scripts/kconfig/zconf.l @@ -101,11 +101,11 @@ n [A-Za-z0-9_] current_pos.file = current_file; current_pos.lineno = current_file->lineno; if (id && id->flags & TF_COMMAND) { - yylval.id = id; + zconflval.id = id; return id->token; } alloc_string(yytext, yyleng); - yylval.string = text; + zconflval.string = text; return T_WORD; } . @@ -134,11 +134,11 @@ n [A-Za-z0-9_] ({n}|[-/.])+ { const struct kconf_id *id = kconf_id_lookup(yytext, yyleng); if (id && id->flags & TF_PARAM) { - yylval.id = id; + zconflval.id = id; return id->token; } alloc_string(yytext, yyleng); - yylval.string = text; + zconflval.string = text; return T_WORD; } #.* /* comment */ @@ -152,7 +152,7 @@ n [A-Za-z0-9_] { [^'"\\\n]+/\n { append_string(yytext, yyleng); - yylval.string = text; + zconflval.string = text; return T_WORD_QUOTE; } [^'"\\\n]+ { @@ -160,7 +160,7 @@ n [A-Za-z0-9_] } \\.?/\n { append_string(yytext + 1, yyleng - 1); - yylval.string = text; + zconflval.string = text; return T_WORD_QUOTE; } \\.? { @@ -169,7 +169,7 @@ n [A-Za-z0-9_] \'|\" { if (str == yytext[0]) { BEGIN(PARAM); - yylval.string = text; + zconflval.string = text; return T_WORD_QUOTE; } else append_string(yytext, 1); @@ -252,7 +252,7 @@ void zconf_starthelp(void) static void zconf_endhelp(void) { - yylval.string = text; + zconflval.string = text; BEGIN(INITIAL); } diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index 157d31f..f661b4c 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -21,10 +21,10 @@ int cdebug = PRINTD; -extern int yylex(void); +extern int zconflex(void); static void zconfprint(const char *err, ...); static void zconf_error(const char *err, ...); -static void yyerror(const char *err); +static void zconferror(const char *err); static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken); struct symbol *symbol_hash[SYMBOL_HASHSIZE]; @@ -499,12 +499,12 @@ void conf_parse(const char *name) modules_sym->flags |= SYMBOL_AUTO; rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL); - if (getenv("ZCONF_DEBUG")) { - extern int yydebug; - yydebug = 1; - } - yyparse(); - if (yynerrs) +#if YYDEBUG + if (getenv("ZCONF_DEBUG")) + zconfdebug = 1; +#endif + zconfparse(); + if (zconfnerrs) exit(1); if (!modules_sym->prop) { struct property *prop; @@ -519,9 +519,9 @@ void conf_parse(const char *name) menu_finalize(&rootmenu); for_all_symbols(i, sym) { if (sym_check_deps(sym)) - yynerrs++; + zconfnerrs++; } - if (yynerrs) + if (zconfnerrs) exit(1); sym_set_change_count(1); } @@ -546,7 +546,7 @@ static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtok if (id->token != endtoken) { zconf_error("unexpected '%s' within %s block", kconf_id_strings + id->name, zconf_tokenname(starttoken)); - yynerrs++; + zconfnerrs++; return false; } if (current_menu->file != current_file) { @@ -555,7 +555,7 @@ static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtok fprintf(stderr, "%s:%d: location of the '%s'\n", current_menu->file->name, current_menu->lineno, zconf_tokenname(starttoken)); - yynerrs++; + zconfnerrs++; return false; } return true; @@ -576,7 +576,7 @@ static void zconf_error(const char *err, ...) { va_list ap; - yynerrs++; + zconfnerrs++; fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); va_start(ap, err); vfprintf(stderr, err, ap); @@ -584,7 +584,7 @@ static void zconf_error(const char *err, ...) fprintf(stderr, "\n"); } -static void yyerror(const char *err) +static void zconferror(const char *err) { fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); }