[RFD] kconfig - introduce cond-source

From: Sam Ravnborg (sam_at_ravnborg.org)
Date: 07/31/05

  • Next message: Russell King: "Re: Heads up for distro folks: PCMCIA hotplug differences (Re: -rc4: arm broken?)"
    Date:	Sun, 31 Jul 2005 00:01:00 +0200
    To: Roman Zippel <zippel@linux-m68k.org>, kbuild-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org
    
    

    Hi Roman.

    In a couple of cases I have had the need to include a Kconfig file only
    if present.
    The current 'source' directive works as one would expect. It bails out
    if the file is missing.

    Examples where I have missed cond-source:
    - klibc work
    - external modules

            Sam

    Patch below implement a cond-source.

    diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h
    --- a/scripts/kconfig/lkc.h
    +++ b/scripts/kconfig/lkc.h
    @@ -39,6 +39,7 @@ void zconf_starthelp(void);
     FILE *zconf_fopen(const char *name);
     void zconf_initscan(const char *name);
     void zconf_nextfile(const char *name);
    +void zconf_try_nextfile(const char *name);
     int zconf_lineno(void);
     char *zconf_curname(void);
     
    diff --git a/scripts/kconfig/zconf.l b/scripts/kconfig/zconf.l
    --- a/scripts/kconfig/zconf.l
    +++ b/scripts/kconfig/zconf.l
    @@ -91,6 +91,7 @@ n [A-Za-z0-9_]
             "mainmenu" BEGIN(PARAM); return T_MAINMENU;
             "menu" BEGIN(PARAM); return T_MENU;
             "endmenu" BEGIN(PARAM); return T_ENDMENU;
    + "cond-source" BEGIN(PARAM); return T_CONDSOURCE;
             "source" BEGIN(PARAM); return T_SOURCE;
             "choice" BEGIN(PARAM); return T_CHOICE;
             "endchoice" BEGIN(PARAM); return T_ENDCHOICE;
    @@ -299,18 +300,14 @@ void zconf_initscan(const char *name)
             current_file->flags = FILE_BUSY;
     }
     
    -void zconf_nextfile(const char *name)
    +static void zconf_switch_buffer(const char *name, FILE *filp)
     {
             struct file *file = file_lookup(name);
             struct buffer *buf = malloc(sizeof(*buf));
             memset(buf, 0, sizeof(*buf));
     
             current_buf->state = YY_CURRENT_BUFFER;
    - yyin = zconf_fopen(name);
    - if (!yyin) {
    - printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
    - exit(1);
    - }
    + yyin = filp;
             yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
             buf->parent = current_buf;
             current_buf = buf;
    @@ -329,6 +326,27 @@ void zconf_nextfile(const char *name)
             current_file = file;
     }
     
    +void zconf_nextfile(const char *name)
    +{
    + FILE *filp;
    +
    + filp = zconf_fopen(name);
    + if (!filp) {
    + printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
    + exit(1);
    + }
    + zconf_switch_buffer(name, filp);
    +}
    +
    +void zconf_try_nextfile(const char *name)
    +{
    + FILE *filp;
    +
    + filp = zconf_fopen(name);
    + if (filp)
    + zconf_switch_buffer(name, filp);
    +}
    +
     static struct buffer *zconf_endfile(void)
     {
             struct buffer *parent;

    diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y
    --- a/scripts/kconfig/zconf.y
    +++ b/scripts/kconfig/zconf.y
    @@ -44,6 +44,7 @@ static struct menu *current_menu, *curre
     %token T_MENU
     %token T_ENDMENU
     %token T_SOURCE
    +%token T_CONDSOURCE
     %token T_CHOICE
     %token T_ENDCHOICE
     %token T_COMMENT
    @@ -378,15 +379,22 @@ menu_block:
     
     source: T_SOURCE prompt T_EOL
     {
    - $$ = $2;
             printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
    + zconf_nextfile($2);
     };
     
    -source_stmt: source
    +condsource: T_CONDSOURCE prompt T_EOL
     {
    - zconf_nextfile($1);
    + printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
    + zconf_try_nextfile($2);
     };
     
    +source_stmt:
    + source
    + | condsource
    + /* empty */
    +;
    +
     /* comment entry */
     
     comment: T_COMMENT prompt T_EOL
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/


  • Next message: Russell King: "Re: Heads up for distro folks: PCMCIA hotplug differences (Re: -rc4: arm broken?)"

    Relevant Pages

    • [PATCH 2.6.19-rc1 V9] drivers: add LCD support
      ... Adds support for the ks0108 LCD Controller as a device driver. ... +The buffer should be a 128*64 unsigned char array: ... * GNU General Public License for more details. ... +static void cfag12864b_setbit ...
      (Linux-Kernel)
    • [PATCH 2.6.19-rc1 V9] drivers: add LCD support
      ... Adds support for the ks0108 LCD Controller as a device driver. ... +The buffer should be a 128*64 unsigned char array: ... * GNU General Public License for more details. ... +static void cfag12864b_setbit ...
      (Linux-Kernel)
    • [PATCH 2.6.18 V8] drivers: add LCD support
      ... Adds a LCD class for registering LCD devices. ... +The buffer should be a 128*64 unsigned char array: ... * GNU General Public License for more details. ... +static void cfag12864b_setbit ...
      (Linux-Kernel)
    • [PATCH 2.6.18 V7] drivers: add lcd display support
      ... Adds support for the cfag12864b LCD Display as a device driver. ... +The buffer should be a 128*64 unsigned char array: ... * GNU General Public License for more details. ... +static void cfag12864b_setbit ...
      (Linux-Kernel)
    • [PATCH 2.6.18 V6] drivers: add lcd display support
      ... Adds support for the cfag12864b LCD Display as a device driver. ... * GNU General Public License for more details. ... +static void cfag12864b_setbit(unsigned char state, ...
      (Linux-Kernel)