Browse Source

ccanlint: recurse to get -l options.

If a dependent module needs -l options, we don't notice.  Fix that, now
we have one.
Rusty Russell 13 years ago
parent
commit
fa7a78f9d3

+ 3 - 4
tools/ccanlint/tests/examples_compile.c

@@ -107,13 +107,12 @@ static char *example_obj_list(struct manifest *m, struct ccan_file *f)
 /* FIXME: Test with reduced features! */
 static char *lib_list(const struct manifest *m)
 {
-	unsigned int i, num;
+	unsigned int i;
 	char **libs;
 	char *ret = talloc_strdup(m, "");
 
-	libs = get_libs(m, m->dir, &num,
-			&m->info_file->compiled[COMPILE_NORMAL]);
-	for (i = 0; i < num; i++)
+	libs = get_libs(m, m->dir, true, get_or_compile_info);
+	for (i = 0; libs[i]; i++)
 		ret = talloc_asprintf_append(ret, "-l%s ", libs[i]);
 	return ret;
 }

+ 4 - 4
tools/ccanlint/tests/module_links.c

@@ -43,12 +43,12 @@ static char *obj_list(const struct manifest *m)
 
 static char *lib_list(const struct manifest *m)
 {
-	unsigned int i, num;
-	char **libs = get_libs(m, ".",
-			       &num, &m->info_file->compiled[COMPILE_NORMAL]);
+	unsigned int i;
+	char **libs;
 	char *ret = talloc_strdup(m, "");
 
-	for (i = 0; i < num; i++)
+	libs = get_libs(m, m->dir, true, get_or_compile_info);
+	for (i = 0; libs[i]; i++)
 		ret = talloc_asprintf_append(ret, "-l%s ", libs[i]);
 	return ret;
 }

+ 4 - 4
tools/ccanlint/tests/tests_compile.c

@@ -54,12 +54,12 @@ char *test_obj_list(const struct manifest *m, bool link_with_module,
 
 char *lib_list(const struct manifest *m, enum compile_type ctype)
 {
-	unsigned int i, num;
-	char **libs = get_libs(m, m->dir, &num,
-			       &m->info_file->compiled[ctype]);
+	unsigned int i;
+	char **libs;
 	char *ret = talloc_strdup(m, "");
 
-	for (i = 0; i < num; i++)
+	libs = get_libs(m, m->dir, true, get_or_compile_info);
+	for (i = 0; libs[i]; i++)
 		ret = talloc_asprintf_append(ret, "-l%s ", libs[i]);
 	return ret;
 }

+ 45 - 13
tools/depends.c

@@ -214,23 +214,55 @@ get_all_deps(const void *ctx, const char *dir,
 	return deps;
 }
 
-char **get_libs(const void *ctx, const char *dir,
-		unsigned int *num, char **infofile)
+/* Can return NULL: _info may not support 'libs'. */
+static char **get_one_libs(const void *ctx, const char *dir,
+			   char *(*get_info)(const void *ctx, const char *dir))
+{
+	char *cmd, **lines;
+
+	cmd = talloc_asprintf(ctx, "%s libs", get_info(ctx, dir));
+	lines = lines_from_cmd(cmd, "%s", cmd);
+	/* Strip final NULL. */
+	if (lines)
+		lines = talloc_realloc(NULL, lines, char *,
+				       talloc_array_length(lines)-1);
+	return lines;
+}
+
+char **get_libs(const void *ctx, const char *dir, bool recurse,
+		char *(*get_info)(const void *ctx, const char *dir))
 {
-	char **libs, *cmd;
+	char **deps, **libs;
+	unsigned int i, len;
+
+	libs = get_one_libs(ctx, dir, get_info);
+	len = talloc_array_length(libs);
 
-	if (!*infofile) {
-		*infofile = compile_info(ctx, dir);
-		if (!*infofile)
-			errx(1, "Could not compile _info for '%s'", dir);
+	if (recurse) {
+		deps = get_deps(ctx, dir, true, get_info);
+		for (i = 0; deps[i]; i++) {
+			char **newlibs, *subdir;
+			size_t newlen;
+
+			if (!strstarts(deps[i], "ccan/"))
+				continue;
+
+			subdir = talloc_asprintf(ctx, "%s/%s",
+						 talloc_dirname(ctx, dir),
+						 deps[i] + strlen("ccan/"));
+
+			newlibs = get_one_libs(ctx, subdir, get_info);
+			newlen = talloc_array_length(newlibs);
+			libs = talloc_realloc(ctx, libs, char *, len + newlen);
+			memcpy(&libs[len], newlibs,
+			       sizeof(newlibs[0])*newlen);
+			len += newlen;
+		}
 	}
 
-	cmd = talloc_asprintf(ctx, "%s libs", *infofile);
-	libs = lines_from_cmd(cmd, "%s", cmd);
-	if (!libs)
-		err(1, "Could not run '%s'", cmd);
-	/* FIXME: Do we need num arg? */
-	*num = talloc_array_length(libs) - 1;
+	/* Append NULL entry. */
+	libs = talloc_realloc(ctx, libs, char *, len + 1);
+	libs[len] = NULL;
 	return libs;
 }
 

+ 2 - 2
tools/tools.h

@@ -30,8 +30,8 @@ char **get_deps(const void *ctx, const char *dir, bool recurse,
 char **get_safe_ccan_deps(const void *ctx, const char *dir, bool recurse);
 
 /* This also needs to compile the info file. */
-char **get_libs(const void *ctx, const char *dir,
-		unsigned int *num, char **infofile);
+char **get_libs(const void *ctx, const char *dir, bool recurse,
+		char *(*get_info)(const void *ctx, const char *dir));
 
 /* From tools.c */
 /* If set, print all commands run, all output they give and exit status. */