From 08eb7e5a370941feec1d556339a00608925f9cb2 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Mon, 19 Mar 2012 15:44:13 +1030 Subject: [PATCH] tools: determing ccan directory differently Don't assume it's two levels above the module dir, instead look for last "/ccan/" in path. This is an incremental step towards nested module directories. --- tools/manifest.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/tools/manifest.c b/tools/manifest.c index e41c7abc..9de9030b 100644 --- a/tools/manifest.c +++ b/tools/manifest.c @@ -196,6 +196,22 @@ static void sort_files(struct list_head *list) talloc_free(files); } +/* Walk up tp find /ccan/ => ccan directory. */ +static unsigned int ccan_dir_prefix(const char *fulldir) +{ + unsigned int i; + + assert(fulldir[0] == '/'); + for (i = strlen(fulldir) - 1; i > 0; i--) { + if (strncmp(fulldir+i, "/ccan", 5) != 0) + continue; + if (fulldir[i+5] != '\0' && fulldir[i+5] != '/') + continue; + return i + 1; + } + errx(1, "Could not find /ccan/ dir in %s", fulldir); +} + struct manifest *get_manifest(const void *ctx, const char *dir) { struct manifest *m; @@ -249,19 +265,10 @@ struct manifest *get_manifest(const void *ctx, const char *dir) errx(1, "I don't expect to be run from the root directory"); m->basename++; - /* We expect the ccan dir to be two levels above module dir. */ if (!ccan_dir) { - char *p, *dir; - dir = talloc_strdup(NULL, m->dir); - p = strrchr(dir, '/'); - if (!p) - errx(1, "I expect the ccan root directory in ../.."); - *p = '\0'; - p = strrchr(dir, '/'); - if (!p) - errx(1, "I expect the ccan root directory in ../.."); - *p = '\0'; - ccan_dir = dir; + unsigned int prefix = ccan_dir_prefix(m->dir); + + ccan_dir = talloc_strndup(NULL, m->dir, prefix); } add_files(m, ""); -- 2.39.2