Browse Source

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.
Rusty Russell 14 years ago
parent
commit
08eb7e5a37
1 changed files with 19 additions and 12 deletions
  1. 19 12
      tools/manifest.c

+ 19 - 12
tools/manifest.c

@@ -196,6 +196,22 @@ static void sort_files(struct list_head *list)
 	talloc_free(files);
 	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 *get_manifest(const void *ctx, const char *dir)
 {
 {
 	struct manifest *m;
 	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");
 		errx(1, "I don't expect to be run from the root directory");
 	m->basename++;
 	m->basename++;
 
 
-	/* We expect the ccan dir to be two levels above module dir. */
 	if (!ccan_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, "");
 	add_files(m, "");