scripts/config: support includes relative to the currently processed file
authorJo-Philipp Wich <jow@openwrt.org>
Fri, 12 Dec 2014 12:29:58 +0000 (12:29 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Fri, 12 Dec 2014 12:29:58 +0000 (12:29 +0000)
When the initial glob() attempt on a path specified with "source" statement
yields no result, then retry the globbing on the same path with the directory
part of the currently processed file prepended.

This allows us to reference Config.in files relative to their parent instead
of relative to the top dir.

Signed-off-by: Jo-Philipp Wich <jow@openwrt.org>
SVN-Revision: 43652

scripts/config/zconf.l
scripts/config/zconf.lex.c_shipped

index 3aef45983aa1f1cc979ad2298ac7de0492cb1dfd..1dd765817a78e7da5701dd04d096737895f145ad 100644 (file)
@@ -343,6 +343,7 @@ void zconf_nextfile(const char *name)
        glob_t gl;
        int err;
        int i;
+       char path[PATH_MAX], *p;
 
        err = glob(name, GLOB_ERR | GLOB_MARK, NULL, &gl);
 
@@ -352,6 +353,15 @@ void zconf_nextfile(const char *name)
                gl.gl_pathc = 0;
        }
 
+       if (err == GLOB_NOMATCH) {
+               p = strdup(current_file->name);
+               if (p) {
+                       snprintf(path, sizeof(path), "%s/%s", dirname(p), name);
+                       err = glob(path, GLOB_ERR | GLOB_MARK, NULL, &gl);
+                       free(p);
+               }
+       }
+
        if (err) {
                const char *reason = "unknown error";
 
index 766549fbfed1dd56f8c4b119002e9718ed2dc2fd..c938b2fae6966b34530e8b1a3cbe00c1b0a46ace 100644 (file)
@@ -2399,6 +2399,7 @@ void zconf_nextfile(const char *name)
        glob_t gl;
        int err;
        int i;
+       char path[PATH_MAX], *p;
 
        err = glob(name, GLOB_ERR | GLOB_MARK, NULL, &gl);
 
@@ -2408,6 +2409,16 @@ void zconf_nextfile(const char *name)
                gl.gl_pathc = 0;
        }
 
+       if (err == GLOB_NOMATCH) {
+               p = strdup(current_file->name);
+               if (p) {
+                       snprintf(path, sizeof(path), "%s/%s", dirname(p), name);
+                       fprintf(stderr, "TRY:%s\n", path);
+                       err = glob(path, GLOB_ERR | GLOB_MARK, NULL, &gl);
+                       free(p);
+               }
+       }
+
        if (err) {
                const char *reason = "unknown error";