diff mbox

[2/2] kconfig: add optional file sourcing patch to serie

Message ID 1467711737-5651-2-git-send-email-david.corvoysier@intel.com
State Rejected
Headers show

Commit Message

David Corvoysier July 5, 2016, 9:42 a.m. UTC
This just adds the git formatted patch of the optional file sourcing
commit to the existing patch serie that is used to rebase against the
Kernel upstream Kconfig.

Signed-off-by: David Corvoysier <david.corvoysier@intel.com>
---
 ...-added-support-for-optional-file-sourcing.patch | 1293 ++++++++++++++++++++
 support/kconfig/patches/series                     |    1 +
 2 files changed, 1294 insertions(+)
 create mode 100644 support/kconfig/patches/18-kconfig-added-support-for-optional-file-sourcing.patch
diff mbox

Patch

diff --git a/support/kconfig/patches/18-kconfig-added-support-for-optional-file-sourcing.patch b/support/kconfig/patches/18-kconfig-added-support-for-optional-file-sourcing.patch
new file mode 100644
index 0000000..5c6c2ee
--- /dev/null
+++ b/support/kconfig/patches/18-kconfig-added-support-for-optional-file-sourcing.patch
@@ -0,0 +1,1293 @@ 
+From d77b59b056c8109ffaa6ea141fc6fb095d315de3 Mon Sep 17 00:00:00 2001
+From: David Corvoysier <david.corvoysier@intel.com>
+Date: Mon, 4 Jul 2016 15:55:15 +0200
+Subject: [PATCH] kconfig: added support for optional file sourcing
+
+Following the GNU Make pattern for sourcing files, add a new '-source'
+keyword that will fail silently if the target file does not exist.
+
+The _shipped versions of bison, flex and gperf zconf files have been
+regenerated manually with the following commands:
+
+flex -ozconf.lex.ci_shipped -L -P zconf ./zconf.l
+bison -ozconf.tab.c_shipped -t -l -p zconf ./zconf.y
+gperf -t --output-file ./zconf.hash.c_shipped -a -C -E -g -k '1,3,$' -p
+-t ./zconf.gperf
+
+Signed-off-by: David Corvoysier <david.corvoysier@intel.com>
+---
+ support/kconfig/lkc.h                |   1 +
+ support/kconfig/zconf.gperf          |   1 +
+ support/kconfig/zconf.hash.c_shipped |  68 +++--
+ support/kconfig/zconf.l              |  21 +-
+ support/kconfig/zconf.lex.c_shipped  |  72 ++++-
+ support/kconfig/zconf.tab.c_shipped  | 564 ++++++++++++++++++-----------------
+ support/kconfig/zconf.y              |   5 +
+ 7 files changed, 406 insertions(+), 326 deletions(-)
+
+diff --git a/support/kconfig/lkc.h b/support/kconfig/lkc.h
+index 09f4edf..7b23125 100644
+--- a/support/kconfig/lkc.h
++++ b/support/kconfig/lkc.h
+@@ -74,6 +74,7 @@ extern int zconfdebug;
+ int zconfparse(void);
+ void zconfdump(FILE *out);
+ void zconf_starthelp(void);
++bool zconf_fexists(const char *name);
+ FILE *zconf_fopen(const char *name);
+ void zconf_initscan(const char *name);
+ void zconf_nextfile(const char *name);
+diff --git a/support/kconfig/zconf.gperf b/support/kconfig/zconf.gperf
+index f14ab41..0561b25 100644
+--- a/support/kconfig/zconf.gperf
++++ b/support/kconfig/zconf.gperf
+@@ -16,6 +16,7 @@ mainmenu,	T_MAINMENU,	TF_COMMAND
+ menu,		T_MENU,		TF_COMMAND
+ endmenu,	T_ENDMENU,	TF_COMMAND
+ source,		T_SOURCE,	TF_COMMAND
++-source,	T_MINUSSOURCE,	TF_COMMAND
+ choice,		T_CHOICE,	TF_COMMAND
+ endchoice,	T_ENDCHOICE,	TF_COMMAND
+ comment,	T_COMMENT,	TF_COMMAND
+diff --git a/support/kconfig/zconf.hash.c_shipped b/support/kconfig/zconf.hash.c_shipped
+index 40df000..3a65f3a 100644
+--- a/support/kconfig/zconf.hash.c_shipped
++++ b/support/kconfig/zconf.hash.c_shipped
+@@ -50,7 +50,7 @@ kconf_id_hash (register const char *str, register unsigned int len)
+       73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+       73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+       73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+-      73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
++      73, 73, 73, 73, 73, 25, 73, 73, 73, 73,
+       73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+       73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+       73, 73, 73, 73, 73, 73, 73, 73, 73, 73,
+@@ -112,6 +112,7 @@ struct kconf_id_strings_t
+     char kconf_id_strings_str33[sizeof("env")];
+     char kconf_id_strings_str35[sizeof("range")];
+     char kconf_id_strings_str36[sizeof("choice")];
++    char kconf_id_strings_str37[sizeof("-source")];
+     char kconf_id_strings_str39[sizeof("bool")];
+     char kconf_id_strings_str41[sizeof("source")];
+     char kconf_id_strings_str42[sizeof("visible")];
+@@ -147,6 +148,7 @@ static const struct kconf_id_strings_t kconf_id_strings_contents =
+     "env",
+     "range",
+     "choice",
++    "-source",
+     "bool",
+     "source",
+     "visible",
+@@ -170,7 +172,7 @@ kconf_id_lookup (register const char *str, register unsigned int len)
+ {
+   enum
+     {
+-      TOTAL_KEYWORDS = 32,
++      TOTAL_KEYWORDS = 33,
+       MIN_WORD_LENGTH = 2,
+       MAX_WORD_LENGTH = 14,
+       MIN_HASH_VALUE = 2,
+@@ -180,87 +182,89 @@ kconf_id_lookup (register const char *str, register unsigned int len)
+   static const struct kconf_id wordlist[] =
+     {
+       {-1}, {-1},
+-#line 25 "scripts/kconfig/zconf.gperf"
++#line 26 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,		T_IF,		TF_COMMAND|TF_PARAM},
+-#line 36 "scripts/kconfig/zconf.gperf"
++#line 37 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str3,		T_TYPE,		TF_COMMAND, S_INT},
+       {-1},
+-#line 26 "scripts/kconfig/zconf.gperf"
++#line 27 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,		T_ENDIF,	TF_COMMAND},
+       {-1},
+-#line 29 "scripts/kconfig/zconf.gperf"
++#line 30 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,	T_DEFAULT,	TF_COMMAND, S_UNKNOWN},
+-#line 31 "scripts/kconfig/zconf.gperf"
++#line 32 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,	T_TYPE,		TF_COMMAND, S_TRISTATE},
+-#line 20 "scripts/kconfig/zconf.gperf"
++#line 21 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,	T_ENDCHOICE,	TF_COMMAND},
+       {-1}, {-1},
+-#line 32 "scripts/kconfig/zconf.gperf"
++#line 33 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,	T_DEFAULT,	TF_COMMAND, S_TRISTATE},
+-#line 35 "scripts/kconfig/zconf.gperf"
++#line 36 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,	T_DEFAULT,	TF_COMMAND, S_BOOLEAN},
+-#line 45 "scripts/kconfig/zconf.gperf"
++#line 46 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,	T_OPT_DEFCONFIG_LIST,TF_OPTION},
+       {-1}, {-1},
+-#line 43 "scripts/kconfig/zconf.gperf"
++#line 44 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,		T_ON,		TF_PARAM},
+-#line 28 "scripts/kconfig/zconf.gperf"
++#line 29 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,	T_OPTIONAL,	TF_COMMAND},
+       {-1}, {-1},
+-#line 42 "scripts/kconfig/zconf.gperf"
++#line 43 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,		T_OPTION,	TF_COMMAND},
+ #line 17 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,	T_ENDMENU,	TF_COMMAND},
+ #line 15 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,	T_MAINMENU,	TF_COMMAND},
+       {-1},
+-#line 23 "scripts/kconfig/zconf.gperf"
++#line 24 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str25,	T_MENUCONFIG,	TF_COMMAND},
+       {-1},
+-#line 44 "scripts/kconfig/zconf.gperf"
++#line 45 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,	T_OPT_MODULES,	TF_OPTION},
+       {-1},
+ #line 16 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29,		T_MENU,		TF_COMMAND},
+       {-1},
+-#line 39 "scripts/kconfig/zconf.gperf"
++#line 40 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,		T_SELECT,	TF_COMMAND},
+-#line 21 "scripts/kconfig/zconf.gperf"
++#line 22 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,	T_COMMENT,	TF_COMMAND},
+-#line 46 "scripts/kconfig/zconf.gperf"
++#line 47 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,		T_OPT_ENV,	TF_OPTION},
+       {-1},
+-#line 40 "scripts/kconfig/zconf.gperf"
++#line 41 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,		T_RANGE,	TF_COMMAND},
+-#line 19 "scripts/kconfig/zconf.gperf"
++#line 20 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36,		T_CHOICE,	TF_COMMAND},
+-      {-1}, {-1},
+-#line 33 "scripts/kconfig/zconf.gperf"
++#line 19 "scripts/kconfig/zconf.gperf"
++      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,	T_MINUSSOURCE,	TF_COMMAND},
++      {-1},
++#line 34 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39,		T_TYPE,		TF_COMMAND, S_BOOLEAN},
+       {-1},
+ #line 18 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,		T_SOURCE,	TF_COMMAND},
+-#line 41 "scripts/kconfig/zconf.gperf"
++#line 42 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,	T_VISIBLE,	TF_COMMAND},
+-#line 37 "scripts/kconfig/zconf.gperf"
++#line 38 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43,		T_TYPE,		TF_COMMAND, S_HEX},
+       {-1}, {-1},
+-#line 22 "scripts/kconfig/zconf.gperf"
++#line 23 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46,		T_CONFIG,	TF_COMMAND},
+-#line 34 "scripts/kconfig/zconf.gperf"
++#line 35 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47,	T_TYPE,		TF_COMMAND, S_BOOLEAN},
+       {-1}, {-1}, {-1},
+-#line 38 "scripts/kconfig/zconf.gperf"
++#line 39 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str51,		T_TYPE,		TF_COMMAND, S_STRING},
+       {-1}, {-1},
+-#line 24 "scripts/kconfig/zconf.gperf"
++#line 25 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str54,		T_HELP,		TF_COMMAND},
+       {-1},
+-#line 30 "scripts/kconfig/zconf.gperf"
++#line 31 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str56,		T_PROMPT,	TF_COMMAND},
+       {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+       {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+-#line 27 "scripts/kconfig/zconf.gperf"
++#line 28 "scripts/kconfig/zconf.gperf"
+       {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str72,	T_DEPENDS,	TF_COMMAND}
+     };
+ 
+@@ -282,5 +286,5 @@ kconf_id_lookup (register const char *str, register unsigned int len)
+     }
+   return 0;
+ }
+-#line 47 "scripts/kconfig/zconf.gperf"
++#line 48 "scripts/kconfig/zconf.gperf"
+ 
+diff --git a/support/kconfig/zconf.l b/support/kconfig/zconf.l
+index 1a9f53e..f7babf4 100644
+--- a/support/kconfig/zconf.l
++++ b/support/kconfig/zconf.l
+@@ -68,7 +68,7 @@ static void alloc_string(const char *str, int size)
+ }
+ %}
+ 
+-n	[A-Za-z0-9_]
++n	[A-Za-z0-9_-]
+ 
+ %%
+ 	int str = 0;
+@@ -254,6 +254,25 @@ static void zconf_endhelp(void)
+ 	BEGIN(INITIAL);
+ }
+ 
++/*
++ * Check if a file with the following name exists:
++ * ./name
++ * $(srctree)/name
++ * The latter is used when srctree is separate from objtree
++ * when compiling the kernel.
++ * Returns true if the file exists, false otherwise.
++ */
++bool zconf_fexists(const char *name)
++{
++	const char *file_name = sym_expand_string_value(name);
++	FILE* f = zconf_fopen(file_name);
++	free((void*)file_name);
++	if (f) {
++		fclose(f);
++		return true;
++	}
++	return false;
++}
+ 
+ /*
+  * Try to open specified file with following names:
+diff --git a/support/kconfig/zconf.lex.c_shipped b/support/kconfig/zconf.lex.c_shipped
+index a0521aa..2561bc8 100644
+--- a/support/kconfig/zconf.lex.c_shipped
++++ b/support/kconfig/zconf.lex.c_shipped
+@@ -72,7 +72,6 @@ typedef int flex_int32_t;
+ typedef unsigned char flex_uint8_t; 
+ typedef unsigned short int flex_uint16_t;
+ typedef unsigned int flex_uint32_t;
+-#endif /* ! C99 */
+ 
+ /* Limits of integral types. */
+ #ifndef INT8_MIN
+@@ -103,6 +102,8 @@ typedef unsigned int flex_uint32_t;
+ #define UINT32_MAX             (4294967295U)
+ #endif
+ 
++#endif /* ! C99 */
++
+ #endif /* ! FLEXINT_H */
+ 
+ #ifdef __cplusplus
+@@ -159,7 +160,15 @@ typedef unsigned int flex_uint32_t;
+ 
+ /* Size of default input buffer. */
+ #ifndef YY_BUF_SIZE
++#ifdef __ia64__
++/* On IA-64, the buffer size is 16k, not 8k.
++ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
++ * Ditto for the __ia64__ case accordingly.
++ */
++#define YY_BUF_SIZE 32768
++#else
+ #define YY_BUF_SIZE 16384
++#endif /* __ia64__ */
+ #endif
+ 
+ /* The state buf must be large enough to hold one state per character in the main buffer.
+@@ -384,12 +393,12 @@ static yyconst flex_int16_t yy_nxt[][17] =
+ 
+     {
+        11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+-       16,   16,   16,   18,   16,   16,   16
++       16,   18,   16,   18,   16,   16,   16
+     },
+ 
+     {
+        11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+-       16,   16,   16,   18,   16,   16,   16
++       16,   18,   16,   18,   16,   16,   16
+ 
+     },
+ 
+@@ -462,7 +471,7 @@ static yyconst flex_int16_t yy_nxt[][17] =
+ 
+     {
+        11,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+-      -18,  -18,  -18,   44,  -18,  -18,  -18
++      -18,   44,  -18,   44,  -18,  -18,  -18
+     },
+ 
+     {
+@@ -551,7 +560,7 @@ static yyconst flex_int16_t yy_nxt[][17] =
+ 
+     {
+        11,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+-      -35,   57,   57,   57,  -35,  -35,  -35
++      -35,   58,   57,   57,  -35,  -35,  -35
+     },
+ 
+     {
+@@ -560,13 +569,13 @@ static yyconst flex_int16_t yy_nxt[][17] =
+     },
+ 
+     {
+-       11,  -37,  -37,   58,  -37,  -37,  -37,  -37,  -37,  -37,
++       11,  -37,  -37,   59,  -37,  -37,  -37,  -37,  -37,  -37,
+       -37,  -37,  -37,  -37,  -37,  -37,  -37
+     },
+ 
+     {
+        11,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+-      -38,  -38,  -38,  -38,  -38,  -38,   59
++      -38,  -38,  -38,  -38,  -38,  -38,   60
+     },
+ 
+     {
+@@ -597,7 +606,7 @@ static yyconst flex_int16_t yy_nxt[][17] =
+ 
+     {
+        11,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
+-      -44,  -44,  -44,   44,  -44,  -44,  -44
++      -44,   44,  -44,   44,  -44,  -44,  -44
+ 
+     },
+ 
+@@ -660,17 +669,17 @@ static yyconst flex_int16_t yy_nxt[][17] =
+ 
+     {
+        11,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,
+-      -56,   60,   57,   57,  -56,  -56,  -56
++      -56,   61,   57,   57,  -56,  -56,  -56
+     },
+ 
+     {
+        11,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+-      -57,   57,   57,   57,  -57,  -57,  -57
++      -57,   58,   57,   57,  -57,  -57,  -57
+     },
+ 
+     {
+        11,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,
+-      -58,  -58,  -58,  -58,  -58,  -58,  -58
++      -58,   58,   57,   57,  -58,  -58,  -58
+     },
+ 
+     {
+@@ -681,7 +690,12 @@ static yyconst flex_int16_t yy_nxt[][17] =
+ 
+     {
+        11,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,
+-      -60,   57,   57,   57,  -60,  -60,  -60
++      -60,  -60,  -60,  -60,  -60,  -60,  -60
++    },
++
++    {
++       11,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,
++      -61,   58,   57,   57,  -61,  -61,  -61
+     },
+ 
+     } ;
+@@ -710,14 +724,15 @@ struct yy_trans_info
+ 	flex_int32_t yy_verify;
+ 	flex_int32_t yy_nxt;
+ 	};
+-static yyconst flex_int16_t yy_accept[61] =
++static yyconst flex_int16_t yy_accept[62] =
+     {   0,
+         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        34,    5,    4,    2,    3,    7,    8,    6,   32,   29,
+        31,   24,   28,   27,   26,   22,   17,   13,   16,   20,
+        22,   11,   12,   19,   19,   14,   22,   22,    4,    2,
+         3,    3,    1,    6,   32,   29,   31,   30,   24,   23,
+-       26,   25,   15,   20,    9,   19,   19,   21,   10,   18
++       26,   25,   15,   20,    9,   19,   19,   19,   21,   10,
++       18
+     } ;
+ 
+ static yyconst flex_int32_t yy_ec[256] =
+@@ -912,7 +927,12 @@ static int input (void );
+ 
+ /* Amount of stuff to slurp up with each read. */
+ #ifndef YY_READ_BUF_SIZE
++#ifdef __ia64__
++/* On IA-64, the buffer size is 16k, not 8k */
++#define YY_READ_BUF_SIZE 16384
++#else
+ #define YY_READ_BUF_SIZE 8192
++#endif /* __ia64__ */
+ #endif
+ 
+ /* Copy whatever the last rule matched to the standard output. */
+@@ -2058,8 +2078,8 @@ YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr )
+ 
+ /** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
+  * scan from a @e copy of @a bytes.
+- * @param bytes the byte buffer to scan
+- * @param len the number of bytes in the buffer pointed to by @a bytes.
++ * @param yybytes the byte buffer to scan
++ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+  * 
+  * @return the newly allocated buffer state object.
+  */
+@@ -2312,6 +2332,26 @@ static void zconf_endhelp(void)
+ }
+ 
+ /*
++ * Check if a file with the following name exists:
++ * ./name
++ * $(srctree)/name
++ * The latter is used when srctree is separate from objtree
++ * when compiling the kernel.
++ * Returns true if the file exists, false otherwise.
++ */
++bool zconf_fexists(const char *name)
++{
++	const char *file_name = sym_expand_string_value(name);
++	FILE* f = zconf_fopen(file_name);
++	free((void*)file_name);
++	if (f) {
++		fclose(f);
++		return true;
++	}
++	return false;
++}
++
++/*
+  * Try to open specified file with following names:
+  * ./name
+  * $(srctree)/name
+diff --git a/support/kconfig/zconf.tab.c_shipped b/support/kconfig/zconf.tab.c_shipped
+index f343030..747a1ef 100644
+--- a/support/kconfig/zconf.tab.c_shipped
++++ b/support/kconfig/zconf.tab.c_shipped
+@@ -137,35 +137,36 @@ static struct menu *current_menu, *current_entry;
+      T_MENU = 259,
+      T_ENDMENU = 260,
+      T_SOURCE = 261,
+-     T_CHOICE = 262,
+-     T_ENDCHOICE = 263,
+-     T_COMMENT = 264,
+-     T_CONFIG = 265,
+-     T_MENUCONFIG = 266,
+-     T_HELP = 267,
+-     T_HELPTEXT = 268,
+-     T_IF = 269,
+-     T_ENDIF = 270,
+-     T_DEPENDS = 271,
+-     T_OPTIONAL = 272,
+-     T_PROMPT = 273,
+-     T_TYPE = 274,
+-     T_DEFAULT = 275,
+-     T_SELECT = 276,
+-     T_RANGE = 277,
+-     T_VISIBLE = 278,
+-     T_OPTION = 279,
+-     T_ON = 280,
+-     T_WORD = 281,
+-     T_WORD_QUOTE = 282,
+-     T_UNEQUAL = 283,
+-     T_CLOSE_PAREN = 284,
+-     T_OPEN_PAREN = 285,
+-     T_EOL = 286,
+-     T_OR = 287,
+-     T_AND = 288,
+-     T_EQUAL = 289,
+-     T_NOT = 290
++     T_MINUSSOURCE = 262,
++     T_CHOICE = 263,
++     T_ENDCHOICE = 264,
++     T_COMMENT = 265,
++     T_CONFIG = 266,
++     T_MENUCONFIG = 267,
++     T_HELP = 268,
++     T_HELPTEXT = 269,
++     T_IF = 270,
++     T_ENDIF = 271,
++     T_DEPENDS = 272,
++     T_OPTIONAL = 273,
++     T_PROMPT = 274,
++     T_TYPE = 275,
++     T_DEFAULT = 276,
++     T_SELECT = 277,
++     T_RANGE = 278,
++     T_VISIBLE = 279,
++     T_OPTION = 280,
++     T_ON = 281,
++     T_WORD = 282,
++     T_WORD_QUOTE = 283,
++     T_UNEQUAL = 284,
++     T_CLOSE_PAREN = 285,
++     T_OPEN_PAREN = 286,
++     T_EOL = 287,
++     T_OR = 288,
++     T_AND = 289,
++     T_EQUAL = 290,
++     T_NOT = 291
+    };
+ #endif
+ 
+@@ -417,20 +418,20 @@ union yyalloc
+ /* YYFINAL -- State number of the termination state.  */
+ #define YYFINAL  11
+ /* YYLAST -- Last index in YYTABLE.  */
+-#define YYLAST   290
++#define YYLAST   296
+ 
+ /* YYNTOKENS -- Number of terminals.  */
+-#define YYNTOKENS  36
++#define YYNTOKENS  37
+ /* YYNNTS -- Number of nonterminals.  */
+ #define YYNNTS  50
+ /* YYNRULES -- Number of rules.  */
+-#define YYNRULES  118
++#define YYNRULES  119
+ /* YYNRULES -- Number of states.  */
+-#define YYNSTATES  191
++#define YYNSTATES  194
+ 
+ /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+ #define YYUNDEFTOK  2
+-#define YYMAXUTOK   290
++#define YYMAXUTOK   291
+ 
+ #define YYTRANSLATE(YYX)						\
+   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+@@ -467,7 +468,7 @@ static const yytype_uint8 yytranslate[] =
+        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+-      35
++      35,    36
+ };
+ 
+ #if YYDEBUG
+@@ -483,67 +484,67 @@ static const yytype_uint16 yyprhs[] =
+      143,   146,   150,   153,   155,   159,   160,   163,   166,   169,
+      172,   175,   180,   184,   187,   192,   193,   196,   200,   202,
+      206,   207,   210,   213,   216,   220,   224,   228,   230,   234,
+-     235,   238,   241,   244,   248,   252,   255,   258,   261,   262,
+-     265,   268,   271,   276,   277,   280,   283,   286,   287,   290,
+-     292,   294,   297,   300,   303,   305,   308,   309,   312,   314,
+-     318,   322,   326,   329,   333,   337,   339,   341,   342
++     235,   238,   241,   244,   248,   252,   256,   259,   262,   265,
++     266,   269,   272,   275,   280,   281,   284,   287,   290,   291,
++     294,   296,   298,   301,   304,   307,   309,   312,   313,   316,
++     318,   322,   326,   330,   333,   337,   341,   343,   345,   346
+ };
+ 
+ /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
+ static const yytype_int8 yyrhs[] =
+ {
+-      37,     0,    -1,    81,    38,    -1,    38,    -1,    63,    39,
+-      -1,    39,    -1,    -1,    39,    41,    -1,    39,    55,    -1,
+-      39,    67,    -1,    39,    80,    -1,    39,    26,     1,    31,
+-      -1,    39,    40,     1,    31,    -1,    39,     1,    31,    -1,
+-      16,    -1,    18,    -1,    19,    -1,    21,    -1,    17,    -1,
+-      22,    -1,    20,    -1,    23,    -1,    31,    -1,    61,    -1,
+-      71,    -1,    44,    -1,    46,    -1,    69,    -1,    26,     1,
+-      31,    -1,     1,    31,    -1,    10,    26,    31,    -1,    43,
+-      47,    -1,    11,    26,    31,    -1,    45,    47,    -1,    -1,
+-      47,    48,    -1,    47,    49,    -1,    47,    75,    -1,    47,
+-      73,    -1,    47,    42,    -1,    47,    31,    -1,    19,    78,
+-      31,    -1,    18,    79,    82,    31,    -1,    20,    83,    82,
+-      31,    -1,    21,    26,    82,    31,    -1,    22,    84,    84,
+-      82,    31,    -1,    24,    50,    31,    -1,    -1,    50,    26,
+-      51,    -1,    -1,    34,    79,    -1,     7,    85,    31,    -1,
+-      52,    56,    -1,    80,    -1,    53,    58,    54,    -1,    -1,
+-      56,    57,    -1,    56,    75,    -1,    56,    73,    -1,    56,
+-      31,    -1,    56,    42,    -1,    18,    79,    82,    31,    -1,
+-      19,    78,    31,    -1,    17,    31,    -1,    20,    26,    82,
+-      31,    -1,    -1,    58,    41,    -1,    14,    83,    81,    -1,
+-      80,    -1,    59,    62,    60,    -1,    -1,    62,    41,    -1,
+-      62,    67,    -1,    62,    55,    -1,     3,    79,    81,    -1,
+-       4,    79,    31,    -1,    64,    76,    74,    -1,    80,    -1,
+-      65,    68,    66,    -1,    -1,    68,    41,    -1,    68,    67,
+-      -1,    68,    55,    -1,     6,    79,    31,    -1,     9,    79,
+-      31,    -1,    70,    74,    -1,    12,    31,    -1,    72,    13,
+-      -1,    -1,    74,    75,    -1,    74,    31,    -1,    74,    42,
+-      -1,    16,    25,    83,    31,    -1,    -1,    76,    77,    -1,
+-      76,    31,    -1,    23,    82,    -1,    -1,    79,    82,    -1,
+-      26,    -1,    27,    -1,     5,    31,    -1,     8,    31,    -1,
+-      15,    31,    -1,    31,    -1,    81,    31,    -1,    -1,    14,
+-      83,    -1,    84,    -1,    84,    34,    84,    -1,    84,    28,
+-      84,    -1,    30,    83,    29,    -1,    35,    83,    -1,    83,
+-      32,    83,    -1,    83,    33,    83,    -1,    26,    -1,    27,
+-      -1,    -1,    26,    -1
++      38,     0,    -1,    82,    39,    -1,    39,    -1,    64,    40,
++      -1,    40,    -1,    -1,    40,    42,    -1,    40,    56,    -1,
++      40,    68,    -1,    40,    81,    -1,    40,    27,     1,    32,
++      -1,    40,    41,     1,    32,    -1,    40,     1,    32,    -1,
++      17,    -1,    19,    -1,    20,    -1,    22,    -1,    18,    -1,
++      23,    -1,    21,    -1,    24,    -1,    32,    -1,    62,    -1,
++      72,    -1,    45,    -1,    47,    -1,    70,    -1,    27,     1,
++      32,    -1,     1,    32,    -1,    11,    27,    32,    -1,    44,
++      48,    -1,    12,    27,    32,    -1,    46,    48,    -1,    -1,
++      48,    49,    -1,    48,    50,    -1,    48,    76,    -1,    48,
++      74,    -1,    48,    43,    -1,    48,    32,    -1,    20,    79,
++      32,    -1,    19,    80,    83,    32,    -1,    21,    84,    83,
++      32,    -1,    22,    27,    83,    32,    -1,    23,    85,    85,
++      83,    32,    -1,    25,    51,    32,    -1,    -1,    51,    27,
++      52,    -1,    -1,    35,    80,    -1,     8,    86,    32,    -1,
++      53,    57,    -1,    81,    -1,    54,    59,    55,    -1,    -1,
++      57,    58,    -1,    57,    76,    -1,    57,    74,    -1,    57,
++      32,    -1,    57,    43,    -1,    19,    80,    83,    32,    -1,
++      20,    79,    32,    -1,    18,    32,    -1,    21,    27,    83,
++      32,    -1,    -1,    59,    42,    -1,    15,    84,    82,    -1,
++      81,    -1,    60,    63,    61,    -1,    -1,    63,    42,    -1,
++      63,    68,    -1,    63,    56,    -1,     3,    80,    82,    -1,
++       4,    80,    32,    -1,    65,    77,    75,    -1,    81,    -1,
++      66,    69,    67,    -1,    -1,    69,    42,    -1,    69,    68,
++      -1,    69,    56,    -1,     6,    80,    32,    -1,     7,    80,
++      32,    -1,    10,    80,    32,    -1,    71,    75,    -1,    13,
++      32,    -1,    73,    14,    -1,    -1,    75,    76,    -1,    75,
++      32,    -1,    75,    43,    -1,    17,    26,    84,    32,    -1,
++      -1,    77,    78,    -1,    77,    32,    -1,    24,    83,    -1,
++      -1,    80,    83,    -1,    27,    -1,    28,    -1,     5,    32,
++      -1,     9,    32,    -1,    16,    32,    -1,    32,    -1,    82,
++      32,    -1,    -1,    15,    84,    -1,    85,    -1,    85,    35,
++      85,    -1,    85,    29,    85,    -1,    31,    84,    30,    -1,
++      36,    84,    -1,    84,    33,    84,    -1,    84,    34,    84,
++      -1,    27,    -1,    28,    -1,    -1,    27,    -1
+ };
+ 
+ /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+ static const yytype_uint16 yyrline[] =
+ {
+-       0,   103,   103,   103,   105,   105,   107,   109,   110,   111,
+-     112,   113,   114,   118,   122,   122,   122,   122,   122,   122,
+-     122,   122,   126,   127,   128,   129,   130,   131,   135,   136,
+-     142,   150,   156,   164,   174,   176,   177,   178,   179,   180,
+-     181,   184,   192,   198,   208,   214,   220,   223,   225,   236,
+-     237,   242,   251,   256,   264,   267,   269,   270,   271,   272,
+-     273,   276,   282,   293,   299,   309,   311,   316,   324,   332,
+-     335,   337,   338,   339,   344,   351,   358,   363,   371,   374,
+-     376,   377,   378,   381,   389,   396,   403,   409,   416,   418,
+-     419,   420,   423,   431,   433,   434,   437,   444,   446,   451,
+-     452,   455,   456,   457,   461,   462,   465,   466,   469,   470,
+-     471,   472,   473,   474,   475,   478,   479,   482,   483
++       0,   104,   104,   104,   106,   106,   108,   110,   111,   112,
++     113,   114,   115,   119,   123,   123,   123,   123,   123,   123,
++     123,   123,   127,   128,   129,   130,   131,   132,   136,   137,
++     143,   151,   157,   165,   175,   177,   178,   179,   180,   181,
++     182,   185,   193,   199,   209,   215,   221,   224,   226,   237,
++     238,   243,   252,   257,   265,   268,   270,   271,   272,   273,
++     274,   277,   283,   294,   300,   310,   312,   317,   325,   333,
++     336,   338,   339,   340,   345,   352,   359,   364,   372,   375,
++     377,   378,   379,   382,   386,   394,   401,   408,   414,   421,
++     423,   424,   425,   428,   436,   438,   439,   442,   449,   451,
++     456,   457,   460,   461,   462,   466,   467,   470,   471,   474,
++     475,   476,   477,   478,   479,   480,   483,   484,   487,   488
+ };
+ #endif
+ 
+@@ -553,22 +554,23 @@ static const yytype_uint16 yyrline[] =
+ static const char *const yytname[] =
+ {
+   "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
+-  "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
+-  "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
+-  "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", "T_SELECT", "T_RANGE",
+-  "T_VISIBLE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL",
+-  "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", "T_EQUAL",
+-  "T_NOT", "$accept", "input", "start", "stmt_list", "option_name",
+-  "common_stmt", "option_error", "config_entry_start", "config_stmt",
+-  "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
+-  "config_option", "symbol_option", "symbol_option_list",
+-  "symbol_option_arg", "choice", "choice_entry", "choice_end",
+-  "choice_stmt", "choice_option_list", "choice_option", "choice_block",
+-  "if_entry", "if_end", "if_stmt", "if_block", "mainmenu_stmt", "menu",
+-  "menu_entry", "menu_end", "menu_stmt", "menu_block", "source_stmt",
+-  "comment", "comment_stmt", "help_start", "help", "depends_list",
+-  "depends", "visibility_list", "visible", "prompt_stmt_opt", "prompt",
+-  "end", "nl", "if_expr", "expr", "symbol", "word_opt", 0
++  "T_SOURCE", "T_MINUSSOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT",
++  "T_CONFIG", "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF",
++  "T_DEPENDS", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", "T_SELECT",
++  "T_RANGE", "T_VISIBLE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE",
++  "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND",
++  "T_EQUAL", "T_NOT", "$accept", "input", "start", "stmt_list",
++  "option_name", "common_stmt", "option_error", "config_entry_start",
++  "config_stmt", "menuconfig_entry_start", "menuconfig_stmt",
++  "config_option_list", "config_option", "symbol_option",
++  "symbol_option_list", "symbol_option_arg", "choice", "choice_entry",
++  "choice_end", "choice_stmt", "choice_option_list", "choice_option",
++  "choice_block", "if_entry", "if_end", "if_stmt", "if_block",
++  "mainmenu_stmt", "menu", "menu_entry", "menu_end", "menu_stmt",
++  "menu_block", "source_stmt", "comment", "comment_stmt", "help_start",
++  "help", "depends_list", "depends", "visibility_list", "visible",
++  "prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr", "symbol",
++  "word_opt", 0
+ };
+ #endif
+ 
+@@ -580,25 +582,25 @@ static const yytype_uint16 yytoknum[] =
+        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+-     285,   286,   287,   288,   289,   290
++     285,   286,   287,   288,   289,   290,   291
+ };
+ # endif
+ 
+ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+ static const yytype_uint8 yyr1[] =
+ {
+-       0,    36,    37,    37,    38,    38,    39,    39,    39,    39,
+-      39,    39,    39,    39,    40,    40,    40,    40,    40,    40,
+-      40,    40,    41,    41,    41,    41,    41,    41,    42,    42,
+-      43,    44,    45,    46,    47,    47,    47,    47,    47,    47,
+-      47,    48,    48,    48,    48,    48,    49,    50,    50,    51,
+-      51,    52,    53,    54,    55,    56,    56,    56,    56,    56,
+-      56,    57,    57,    57,    57,    58,    58,    59,    60,    61,
+-      62,    62,    62,    62,    63,    64,    65,    66,    67,    68,
+-      68,    68,    68,    69,    70,    71,    72,    73,    74,    74,
+-      74,    74,    75,    76,    76,    76,    77,    78,    78,    79,
+-      79,    80,    80,    80,    81,    81,    82,    82,    83,    83,
+-      83,    83,    83,    83,    83,    84,    84,    85,    85
++       0,    37,    38,    38,    39,    39,    40,    40,    40,    40,
++      40,    40,    40,    40,    41,    41,    41,    41,    41,    41,
++      41,    41,    42,    42,    42,    42,    42,    42,    43,    43,
++      44,    45,    46,    47,    48,    48,    48,    48,    48,    48,
++      48,    49,    49,    49,    49,    49,    50,    51,    51,    52,
++      52,    53,    54,    55,    56,    57,    57,    57,    57,    57,
++      57,    58,    58,    58,    58,    59,    59,    60,    61,    62,
++      63,    63,    63,    63,    64,    65,    66,    67,    68,    69,
++      69,    69,    69,    70,    70,    71,    72,    73,    74,    75,
++      75,    75,    75,    76,    77,    77,    77,    78,    79,    79,
++      80,    80,    81,    81,    81,    82,    82,    83,    83,    84,
++      84,    84,    84,    84,    84,    84,    85,    85,    86,    86
+ };
+ 
+ /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+@@ -612,10 +614,10 @@ static const yytype_uint8 yyr2[] =
+        2,     3,     2,     1,     3,     0,     2,     2,     2,     2,
+        2,     4,     3,     2,     4,     0,     2,     3,     1,     3,
+        0,     2,     2,     2,     3,     3,     3,     1,     3,     0,
+-       2,     2,     2,     3,     3,     2,     2,     2,     0,     2,
+-       2,     2,     4,     0,     2,     2,     2,     0,     2,     1,
+-       1,     2,     2,     2,     1,     2,     0,     2,     1,     3,
+-       3,     3,     2,     3,     3,     1,     1,     0,     1
++       2,     2,     2,     3,     3,     3,     2,     2,     2,     0,
++       2,     2,     2,     4,     0,     2,     2,     2,     0,     2,
++       1,     1,     2,     2,     2,     1,     2,     0,     2,     1,
++       3,     3,     3,     2,     3,     3,     1,     1,     0,     1
+ };
+ 
+ /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
+@@ -623,177 +625,177 @@ static const yytype_uint8 yyr2[] =
+    means the default is an error.  */
+ static const yytype_uint8 yydefact[] =
+ {
+-       6,     0,   104,     0,     3,     0,     6,     6,    99,   100,
+-       0,     1,     0,     0,     0,     0,   117,     0,     0,     0,
+-       0,     0,     0,    14,    18,    15,    16,    20,    17,    19,
+-      21,     0,    22,     0,     7,    34,    25,    34,    26,    55,
+-      65,     8,    70,    23,    93,    79,     9,    27,    88,    24,
+-      10,     0,   105,     2,    74,    13,     0,   101,     0,   118,
+-       0,   102,     0,     0,     0,   115,   116,     0,     0,     0,
+-     108,   103,     0,     0,     0,     0,     0,     0,     0,    88,
+-       0,     0,    75,    83,    51,    84,    30,    32,     0,   112,
+-       0,     0,    67,     0,     0,    11,    12,     0,     0,     0,
+-       0,    97,     0,     0,     0,    47,     0,    40,    39,    35,
+-      36,     0,    38,    37,     0,     0,    97,     0,    59,    60,
+-      56,    58,    57,    66,    54,    53,    71,    73,    69,    72,
+-      68,   106,    95,     0,    94,    80,    82,    78,    81,    77,
+-      90,    91,    89,   111,   113,   114,   110,   109,    29,    86,
+-       0,   106,     0,   106,   106,   106,     0,     0,     0,    87,
+-      63,   106,     0,   106,     0,    96,     0,     0,    41,    98,
+-       0,     0,   106,    49,    46,    28,     0,    62,     0,   107,
+-      92,    42,    43,    44,     0,     0,    48,    61,    64,    45,
+-      50
++       6,     0,   105,     0,     3,     0,     6,     6,   100,   101,
++       0,     1,     0,     0,     0,     0,     0,   118,     0,     0,
++       0,     0,     0,     0,    14,    18,    15,    16,    20,    17,
++      19,    21,     0,    22,     0,     7,    34,    25,    34,    26,
++      55,    65,     8,    70,    23,    94,    79,     9,    27,    89,
++      24,    10,     0,   106,     2,    74,    13,     0,   102,     0,
++       0,   119,     0,   103,     0,     0,     0,   116,   117,     0,
++       0,     0,   109,   104,     0,     0,     0,     0,     0,     0,
++       0,    89,     0,     0,    75,    83,    84,    51,    85,    30,
++      32,     0,   113,     0,     0,    67,     0,     0,    11,    12,
++       0,     0,     0,     0,    98,     0,     0,     0,    47,     0,
++      40,    39,    35,    36,     0,    38,    37,     0,     0,    98,
++       0,    59,    60,    56,    58,    57,    66,    54,    53,    71,
++      73,    69,    72,    68,   107,    96,     0,    95,    80,    82,
++      78,    81,    77,    91,    92,    90,   112,   114,   115,   111,
++     110,    29,    87,     0,   107,     0,   107,   107,   107,     0,
++       0,     0,    88,    63,   107,     0,   107,     0,    97,     0,
++       0,    41,    99,     0,     0,   107,    49,    46,    28,     0,
++      62,     0,   108,    93,    42,    43,    44,     0,     0,    48,
++      61,    64,    45,    50
+ };
+ 
+ /* YYDEFGOTO[NTERM-NUM].  */
+ static const yytype_int16 yydefgoto[] =
+ {
+-      -1,     3,     4,     5,    33,    34,   108,    35,    36,    37,
+-      38,    74,   109,   110,   157,   186,    39,    40,   124,    41,
+-      76,   120,    77,    42,   128,    43,    78,     6,    44,    45,
+-     137,    46,    80,    47,    48,    49,   111,   112,    81,   113,
+-      79,   134,   152,   153,    50,     7,   165,    69,    70,    60
++      -1,     3,     4,     5,    34,    35,   111,    36,    37,    38,
++      39,    76,   112,   113,   160,   189,    40,    41,   127,    42,
++      78,   123,    79,    43,   131,    44,    80,     6,    45,    46,
++     140,    47,    82,    48,    49,    50,   114,   115,    83,   116,
++      81,   137,   155,   156,    51,     7,   168,    71,    72,    62
+ };
+ 
+ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+    STATE-NUM.  */
+-#define YYPACT_NINF -90
++#define YYPACT_NINF -92
+ static const yytype_int16 yypact[] =
+ {
+-       4,    42,   -90,    96,   -90,   111,   -90,    15,   -90,   -90,
+-      75,   -90,    82,    42,   104,    42,   110,   107,    42,   115,
+-     125,    -4,   121,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+-     -90,   162,   -90,   163,   -90,   -90,   -90,   -90,   -90,   -90,
+-     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+-     -90,   139,   -90,   -90,   138,   -90,   142,   -90,   143,   -90,
+-     152,   -90,   164,   167,   168,   -90,   -90,    -4,    -4,    77,
+-     -18,   -90,   177,   185,    33,    71,   195,   247,   236,    -2,
+-     236,   171,   -90,   -90,   -90,   -90,   -90,   -90,    41,   -90,
+-      -4,    -4,   138,    97,    97,   -90,   -90,   186,   187,   194,
+-      42,    42,    -4,   196,    97,   -90,   219,   -90,   -90,   -90,
+-     -90,   210,   -90,   -90,   204,    42,    42,   199,   -90,   -90,
+-     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+-     -90,   222,   -90,   223,   -90,   -90,   -90,   -90,   -90,   -90,
+-     -90,   -90,   -90,   -90,   215,   -90,   -90,   -90,   -90,   -90,
+-      -4,   222,   228,   222,    -5,   222,    97,    35,   229,   -90,
+-     -90,   222,   232,   222,    -4,   -90,   135,   233,   -90,   -90,
+-     234,   235,   222,   240,   -90,   -90,   237,   -90,   239,   -13,
+-     -90,   -90,   -90,   -90,   244,    42,   -90,   -90,   -90,   -90,
+-     -90
++      17,    73,   -92,     7,   -92,   104,   -92,    19,   -92,   -92,
++     -11,   -92,    37,    73,    65,    73,    73,   -17,    74,    73,
++     -10,    80,    25,    86,   -92,   -92,   -92,   -92,   -92,   -92,
++     -92,   -92,   134,   -92,   163,   -92,   -92,   -92,   -92,   -92,
++     -92,   -92,   -92,   -92,   -92,   -92,   -92,   -92,   -92,   -92,
++     -92,   -92,   133,   -92,   -92,   156,   -92,   158,   -92,   160,
++     161,   -92,   166,   -92,   172,   180,   181,   -92,   -92,    25,
++      25,   237,    28,   -92,   183,   184,    23,    71,   190,   247,
++     233,   -13,   233,   162,   -92,   -92,   -92,   -92,   -92,   -92,
++     -92,    40,   -92,    25,    25,   156,   119,   119,   -92,   -92,
++     186,   187,   195,    73,    73,    25,   220,   119,   -92,   249,
++     -92,   -92,   -92,   -92,   241,   -92,   -92,   228,    73,    73,
++     234,   -92,   -92,   -92,   -92,   -92,   -92,   -92,   -92,   -92,
++     -92,   -92,   -92,   -92,   257,   -92,   219,   -92,   -92,   -92,
++     -92,   -92,   -92,   -92,   -92,   -92,   -92,   239,   -92,   -92,
++     -92,   -92,   -92,    25,   257,   243,   257,   199,   257,   119,
++      27,   245,   -92,   -92,   257,   246,   257,    25,   -92,   248,
++     251,   -92,   -92,   252,   254,   257,   253,   -92,   -92,   255,
++     -92,   258,   142,   -92,   -92,   -92,   -92,   259,    73,   -92,
++     -92,   -92,   -92,   -92
+ };
+ 
+ /* YYPGOTO[NTERM-NUM].  */
+ static const yytype_int16 yypgoto[] =
+ {
+-     -90,   -90,   269,   271,   -90,    23,   -70,   -90,   -90,   -90,
+-     -90,   243,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -48,
+-     -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,   -90,
+-     -90,   -20,   -90,   -90,   -90,   -90,   -90,   206,   205,   -68,
+-     -90,   -90,   169,    -1,    27,    -7,   118,   -66,   -89,   -90
++     -92,   -92,   282,   286,   -92,    50,   -74,   -92,   -92,   -92,
++     -92,   256,   -92,   -92,   -92,   -92,   -92,   -92,   -92,   -22,
++     -92,   -92,   -92,   -92,   -92,   -92,   -92,   -92,   -92,   -92,
++     -92,   -15,   -92,   -92,   -92,   -92,   -92,   215,   214,   -70,
++     -92,   -92,   177,    -1,    79,    -7,   110,   -68,   -91,   -92
+ };
+ 
+ /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+    positive, shift that token.  If negative, reduce the rule which
+    number is the opposite.  If YYTABLE_NINF, syntax error.  */
+-#define YYTABLE_NINF -86
++#define YYTABLE_NINF -87
+ static const yytype_int16 yytable[] =
+ {
+-      10,    88,    89,    54,   146,   147,   119,     1,   122,   164,
+-      93,   141,    56,   142,    58,   156,    94,    62,     1,    90,
+-      91,   131,    65,    66,   144,   145,    67,    90,    91,   132,
+-     127,    68,   136,   -31,    97,     2,   154,   -31,   -31,   -31,
+-     -31,   -31,   -31,   -31,   -31,    98,    52,   -31,   -31,    99,
+-     -31,   100,   101,   102,   103,   104,   -31,   105,   129,   106,
+-     138,   173,    92,   141,   107,   142,   174,   172,     8,     9,
+-     143,   -33,    97,    90,    91,   -33,   -33,   -33,   -33,   -33,
+-     -33,   -33,   -33,    98,   166,   -33,   -33,    99,   -33,   100,
+-     101,   102,   103,   104,   -33,   105,    11,   106,   179,   151,
+-     123,   126,   107,   135,   125,   130,     2,   139,     2,    90,
+-      91,    -5,    12,    55,   161,    13,    14,    15,    16,    17,
+-      18,    19,    20,    65,    66,    21,    22,    23,    24,    25,
+-      26,    27,    28,    29,    30,    57,    59,    31,    61,    -4,
+-      12,    63,    32,    13,    14,    15,    16,    17,    18,    19,
+-      20,    64,    71,    21,    22,    23,    24,    25,    26,    27,
+-      28,    29,    30,    72,    73,    31,   180,    90,    91,    52,
+-      32,   -85,    97,    82,    83,   -85,   -85,   -85,   -85,   -85,
+-     -85,   -85,   -85,    84,   190,   -85,   -85,    99,   -85,   -85,
+-     -85,   -85,   -85,   -85,   -85,    85,    97,   106,    86,    87,
+-     -52,   -52,   140,   -52,   -52,   -52,   -52,    98,    95,   -52,
+-     -52,    99,   114,   115,   116,   117,    96,   148,   149,   150,
+-     158,   106,   155,   159,    97,   163,   118,   -76,   -76,   -76,
+-     -76,   -76,   -76,   -76,   -76,   160,   164,   -76,   -76,    99,
+-      13,    14,    15,    16,    17,    18,    19,    20,    91,   106,
+-      21,    22,    14,    15,   140,    17,    18,    19,    20,   168,
+-     175,    21,    22,   177,   181,   182,   183,    32,   187,   167,
+-     188,   169,   170,   171,   185,   189,    53,    51,    32,   176,
+-      75,   178,   121,     0,   133,   162,     0,     0,     0,     0,
+-     184
++      10,    91,    92,    55,   122,   149,   150,    11,   125,   144,
++      61,   134,    57,   145,    59,    60,   159,    65,    64,   135,
++       1,     2,     1,   -31,   100,   147,   148,   -31,   -31,   -31,
++     -31,   -31,   -31,   -31,   -31,   -31,   101,   157,   -31,   -31,
++     102,   -31,   103,   104,   105,   106,   107,   -31,   108,     2,
++     109,    53,    67,    68,   176,   110,    69,    96,   130,   177,
++     139,    70,   144,    97,    95,   132,   145,   141,   175,    56,
++     146,   -33,   100,    93,    94,   -33,   -33,   -33,   -33,   -33,
++     -33,   -33,   -33,   -33,   101,   169,   -33,   -33,   102,   -33,
++     103,   104,   105,   106,   107,   -33,   108,    58,   109,   182,
++       8,     9,   154,   110,    -5,    12,    63,    66,    13,    14,
++      15,    16,    17,    18,    19,    20,    21,   164,    73,    22,
++      23,    24,    25,    26,    27,    28,    29,    30,    31,   126,
++     129,    32,   138,    -4,    12,    74,    33,    13,    14,    15,
++      16,    17,    18,    19,    20,    21,    67,    68,    22,    23,
++      24,    25,    26,    27,    28,    29,    30,    31,   128,   133,
++      32,   142,   -86,   100,    75,    33,   -86,   -86,   -86,   -86,
++     -86,   -86,   -86,   -86,   -86,    93,    94,   -86,   -86,   102,
++     -86,   -86,   -86,   -86,   -86,   -86,   -86,   193,    53,   109,
++      84,   100,    85,    86,   143,   -52,   -52,   -52,    87,   -52,
++     -52,   -52,   -52,   101,    88,   -52,   -52,   102,   117,   118,
++     119,   120,    89,    90,   167,    98,    99,   109,   151,   152,
++     100,   153,   121,   -76,   -76,   -76,   -76,   -76,   -76,   -76,
++     -76,   -76,    93,    94,   -76,   -76,   102,    13,    14,    15,
++      16,    17,    18,    19,    20,    21,   109,   158,    22,    23,
++     161,   143,    14,    15,    16,   162,    18,    19,    20,    21,
++     163,   166,    22,    23,   170,    33,   172,   173,   174,     2,
++      93,    94,   167,    94,   179,   171,   181,   178,   180,    33,
++     183,    93,    94,   184,   185,   187,   186,   190,   188,    54,
++     191,   192,    52,   124,    77,   136,   165
+ };
+ 
+ #define yypact_value_is_default(yystate) \
+-  ((yystate) == (-90))
++  ((yystate) == (-92))
+ 
+ #define yytable_value_is_error(yytable_value) \
+   YYID (0)
+ 
+-static const yytype_int16 yycheck[] =
++static const yytype_uint8 yycheck[] =
+ {
+-       1,    67,    68,    10,    93,    94,    76,     3,    76,    14,
+-      28,    81,    13,    81,    15,   104,    34,    18,     3,    32,
+-      33,    23,    26,    27,    90,    91,    30,    32,    33,    31,
+-      78,    35,    80,     0,     1,    31,   102,     4,     5,     6,
+-       7,     8,     9,    10,    11,    12,    31,    14,    15,    16,
+-      17,    18,    19,    20,    21,    22,    23,    24,    78,    26,
+-      80,    26,    69,   133,    31,   133,    31,   156,    26,    27,
+-      29,     0,     1,    32,    33,     4,     5,     6,     7,     8,
+-       9,    10,    11,    12,   150,    14,    15,    16,    17,    18,
+-      19,    20,    21,    22,    23,    24,     0,    26,   164,   100,
+-      77,    78,    31,    80,    77,    78,    31,    80,    31,    32,
+-      33,     0,     1,    31,   115,     4,     5,     6,     7,     8,
+-       9,    10,    11,    26,    27,    14,    15,    16,    17,    18,
+-      19,    20,    21,    22,    23,    31,    26,    26,    31,     0,
+-       1,    26,    31,     4,     5,     6,     7,     8,     9,    10,
+-      11,    26,    31,    14,    15,    16,    17,    18,    19,    20,
+-      21,    22,    23,     1,     1,    26,    31,    32,    33,    31,
+-      31,     0,     1,    31,    31,     4,     5,     6,     7,     8,
+-       9,    10,    11,    31,   185,    14,    15,    16,    17,    18,
+-      19,    20,    21,    22,    23,    31,     1,    26,    31,    31,
+-       5,     6,    31,     8,     9,    10,    11,    12,    31,    14,
+-      15,    16,    17,    18,    19,    20,    31,    31,    31,    25,
+-       1,    26,    26,    13,     1,    26,    31,     4,     5,     6,
+-       7,     8,     9,    10,    11,    31,    14,    14,    15,    16,
+-       4,     5,     6,     7,     8,     9,    10,    11,    33,    26,
+-      14,    15,     5,     6,    31,     8,     9,    10,    11,    31,
+-      31,    14,    15,    31,    31,    31,    31,    31,    31,   151,
+-      31,   153,   154,   155,    34,    31,     7,     6,    31,   161,
+-      37,   163,    76,    -1,    79,   116,    -1,    -1,    -1,    -1,
+-     172
++       1,    69,    70,    10,    78,    96,    97,     0,    78,    83,
++      27,    24,    13,    83,    15,    16,   107,    27,    19,    32,
++       3,    32,     3,     0,     1,    93,    94,     4,     5,     6,
++       7,     8,     9,    10,    11,    12,    13,   105,    15,    16,
++      17,    18,    19,    20,    21,    22,    23,    24,    25,    32,
++      27,    32,    27,    28,    27,    32,    31,    29,    80,    32,
++      82,    36,   136,    35,    71,    80,   136,    82,   159,    32,
++      30,     0,     1,    33,    34,     4,     5,     6,     7,     8,
++       9,    10,    11,    12,    13,   153,    15,    16,    17,    18,
++      19,    20,    21,    22,    23,    24,    25,    32,    27,   167,
++      27,    28,   103,    32,     0,     1,    32,    27,     4,     5,
++       6,     7,     8,     9,    10,    11,    12,   118,    32,    15,
++      16,    17,    18,    19,    20,    21,    22,    23,    24,    79,
++      80,    27,    82,     0,     1,     1,    32,     4,     5,     6,
++       7,     8,     9,    10,    11,    12,    27,    28,    15,    16,
++      17,    18,    19,    20,    21,    22,    23,    24,    79,    80,
++      27,    82,     0,     1,     1,    32,     4,     5,     6,     7,
++       8,     9,    10,    11,    12,    33,    34,    15,    16,    17,
++      18,    19,    20,    21,    22,    23,    24,   188,    32,    27,
++      32,     1,    32,    32,    32,     5,     6,     7,    32,     9,
++      10,    11,    12,    13,    32,    15,    16,    17,    18,    19,
++      20,    21,    32,    32,    15,    32,    32,    27,    32,    32,
++       1,    26,    32,     4,     5,     6,     7,     8,     9,    10,
++      11,    12,    33,    34,    15,    16,    17,     4,     5,     6,
++       7,     8,     9,    10,    11,    12,    27,    27,    15,    16,
++       1,    32,     5,     6,     7,    14,     9,    10,    11,    12,
++      32,    27,    15,    16,   154,    32,   156,   157,   158,    32,
++      33,    34,    15,    34,   164,    32,   166,    32,    32,    32,
++      32,    33,    34,    32,    32,   175,    32,    32,    35,     7,
++      32,    32,     6,    78,    38,    81,   119
+ };
+ 
+ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+    symbol of state STATE-NUM.  */
+ static const yytype_uint8 yystos[] =
+ {
+-       0,     3,    31,    37,    38,    39,    63,    81,    26,    27,
+-      79,     0,     1,     4,     5,     6,     7,     8,     9,    10,
+-      11,    14,    15,    16,    17,    18,    19,    20,    21,    22,
+-      23,    26,    31,    40,    41,    43,    44,    45,    46,    52,
+-      53,    55,    59,    61,    64,    65,    67,    69,    70,    71,
+-      80,    39,    31,    38,    81,    31,    79,    31,    79,    26,
+-      85,    31,    79,    26,    26,    26,    27,    30,    35,    83,
+-      84,    31,     1,     1,    47,    47,    56,    58,    62,    76,
+-      68,    74,    31,    31,    31,    31,    31,    31,    83,    83,
+-      32,    33,    81,    28,    34,    31,    31,     1,    12,    16,
+-      18,    19,    20,    21,    22,    24,    26,    31,    42,    48,
+-      49,    72,    73,    75,    17,    18,    19,    20,    31,    42,
+-      57,    73,    75,    41,    54,    80,    41,    55,    60,    67,
+-      80,    23,    31,    74,    77,    41,    55,    66,    67,    80,
+-      31,    42,    75,    29,    83,    83,    84,    84,    31,    31,
+-      25,    79,    78,    79,    83,    26,    84,    50,     1,    13,
+-      31,    79,    78,    26,    14,    82,    83,    82,    31,    82,
+-      82,    82,    84,    26,    31,    31,    82,    31,    82,    83,
+-      31,    31,    31,    31,    82,    34,    51,    31,    31,    31,
+-      79
++       0,     3,    32,    38,    39,    40,    64,    82,    27,    28,
++      80,     0,     1,     4,     5,     6,     7,     8,     9,    10,
++      11,    12,    15,    16,    17,    18,    19,    20,    21,    22,
++      23,    24,    27,    32,    41,    42,    44,    45,    46,    47,
++      53,    54,    56,    60,    62,    65,    66,    68,    70,    71,
++      72,    81,    40,    32,    39,    82,    32,    80,    32,    80,
++      80,    27,    86,    32,    80,    27,    27,    27,    28,    31,
++      36,    84,    85,    32,     1,     1,    48,    48,    57,    59,
++      63,    77,    69,    75,    32,    32,    32,    32,    32,    32,
++      32,    84,    84,    33,    34,    82,    29,    35,    32,    32,
++       1,    13,    17,    19,    20,    21,    22,    23,    25,    27,
++      32,    43,    49,    50,    73,    74,    76,    18,    19,    20,
++      21,    32,    43,    58,    74,    76,    42,    55,    81,    42,
++      56,    61,    68,    81,    24,    32,    75,    78,    42,    56,
++      67,    68,    81,    32,    43,    76,    30,    84,    84,    85,
++      85,    32,    32,    26,    80,    79,    80,    84,    27,    85,
++      51,     1,    14,    32,    80,    79,    27,    15,    83,    84,
++      83,    32,    83,    83,    83,    85,    27,    32,    32,    83,
++      32,    83,    84,    32,    32,    32,    32,    83,    35,    52,
++      32,    32,    32,    80
+ };
+ 
+ #define yyerrok		(yyerrstatus = 0)
+@@ -1329,7 +1331,7 @@ yydestruct (yymsg, yytype, yyvaluep)
+ 
+   switch (yytype)
+     {
+-      case 53: /* "choice_entry" */
++      case 54: /* "choice_entry" */
+ 
+ 	{
+ 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+@@ -1339,7 +1341,7 @@ yydestruct (yymsg, yytype, yyvaluep)
+ };
+ 
+ 	break;
+-      case 59: /* "if_entry" */
++      case 60: /* "if_entry" */
+ 
+ 	{
+ 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+@@ -1349,7 +1351,7 @@ yydestruct (yymsg, yytype, yyvaluep)
+ };
+ 
+ 	break;
+-      case 65: /* "menu_entry" */
++      case 66: /* "menu_entry" */
+ 
+ 	{
+ 	fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+@@ -1930,20 +1932,28 @@ yyreduce:
+   case 84:
+ 
+     {
++	if (zconf_fexists((yyvsp[(2) - (3)].string)))
++		zconf_nextfile((yyvsp[(2) - (3)].string));
++}
++    break;
++
++  case 85:
++
++    {
+ 	menu_add_entry(NULL);
+ 	menu_add_prompt(P_COMMENT, (yyvsp[(2) - (3)].string), NULL);
+ 	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
+ }
+     break;
+ 
+-  case 85:
++  case 86:
+ 
+     {
+ 	menu_end_entry();
+ }
+     break;
+ 
+-  case 86:
++  case 87:
+ 
+     {
+ 	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
+@@ -1951,14 +1961,14 @@ yyreduce:
+ }
+     break;
+ 
+-  case 87:
++  case 88:
+ 
+     {
+ 	current_entry->help = (yyvsp[(2) - (2)].string);
+ }
+     break;
+ 
+-  case 92:
++  case 93:
+ 
+     {
+ 	menu_add_dep((yyvsp[(3) - (4)].expr));
+@@ -1966,91 +1976,91 @@ yyreduce:
+ }
+     break;
+ 
+-  case 96:
++  case 97:
+ 
+     {
+ 	menu_add_visibility((yyvsp[(2) - (2)].expr));
+ }
+     break;
+ 
+-  case 98:
++  case 99:
+ 
+     {
+ 	menu_add_prompt(P_PROMPT, (yyvsp[(1) - (2)].string), (yyvsp[(2) - (2)].expr));
+ }
+     break;
+ 
+-  case 101:
++  case 102:
+ 
+     { (yyval.id) = (yyvsp[(1) - (2)].id); }
+     break;
+ 
+-  case 102:
++  case 103:
+ 
+     { (yyval.id) = (yyvsp[(1) - (2)].id); }
+     break;
+ 
+-  case 103:
++  case 104:
+ 
+     { (yyval.id) = (yyvsp[(1) - (2)].id); }
+     break;
+ 
+-  case 106:
++  case 107:
+ 
+     { (yyval.expr) = NULL; }
+     break;
+ 
+-  case 107:
++  case 108:
+ 
+     { (yyval.expr) = (yyvsp[(2) - (2)].expr); }
+     break;
+ 
+-  case 108:
++  case 109:
+ 
+     { (yyval.expr) = expr_alloc_symbol((yyvsp[(1) - (1)].symbol)); }
+     break;
+ 
+-  case 109:
++  case 110:
+ 
+     { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol)); }
+     break;
+ 
+-  case 110:
++  case 111:
+ 
+     { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[(1) - (3)].symbol), (yyvsp[(3) - (3)].symbol)); }
+     break;
+ 
+-  case 111:
++  case 112:
+ 
+     { (yyval.expr) = (yyvsp[(2) - (3)].expr); }
+     break;
+ 
+-  case 112:
++  case 113:
+ 
+     { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[(2) - (2)].expr)); }
+     break;
+ 
+-  case 113:
++  case 114:
+ 
+     { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
+     break;
+ 
+-  case 114:
++  case 115:
+ 
+     { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)); }
+     break;
+ 
+-  case 115:
++  case 116:
+ 
+     { (yyval.symbol) = sym_lookup((yyvsp[(1) - (1)].string), 0); free((yyvsp[(1) - (1)].string)); }
+     break;
+ 
+-  case 116:
++  case 117:
+ 
+     { (yyval.symbol) = sym_lookup((yyvsp[(1) - (1)].string), SYMBOL_CONST); free((yyvsp[(1) - (1)].string)); }
+     break;
+ 
+-  case 117:
++  case 118:
+ 
+     { (yyval.string) = NULL; }
+     break;
+diff --git a/support/kconfig/zconf.y b/support/kconfig/zconf.y
+index 08ac041..9478e78 100644
+--- a/support/kconfig/zconf.y
++++ b/support/kconfig/zconf.y
+@@ -47,6 +47,7 @@ static struct menu *current_menu, *current_entry;
+ %token <id>T_MENU
+ %token <id>T_ENDMENU
+ %token <id>T_SOURCE
++%token <id>T_MINUSSOURCE
+ %token <id>T_CHOICE
+ %token <id>T_ENDCHOICE
+ %token <id>T_COMMENT
+@@ -382,6 +383,10 @@ source_stmt: T_SOURCE prompt T_EOL
+ {
+ 	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
+ 	zconf_nextfile($2);
++} | T_MINUSSOURCE prompt T_EOL
++{
++	if (zconf_fexists($2))
++		zconf_nextfile($2);
+ };
+ 
+ /* comment entry */
+-- 
+1.9.1
+
diff --git a/support/kconfig/patches/series b/support/kconfig/patches/series
index e25375e..df58e83 100644
--- a/support/kconfig/patches/series
+++ b/support/kconfig/patches/series
@@ -7,3 +7,4 @@ 
 15-fix-qconf-moc-rule.patch
 16-fix-space-to-de-select-options.patch
 17-kconfig-lxdialog-get-ncurses-CFLAGS-with-pkg-config.patch
+18-kconfig-added-support-for-optional-file-sourcing.patch