Browse Source

tools/ccanlint: detect more unmentioned dependencies.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Rusty Russell 11 years ago
parent
commit
c9d946d07a

+ 4 - 5
tools/ccanlint/tests/depends_accurate.c

@@ -53,10 +53,9 @@ static bool check_dep_includes(struct manifest *m,
 		if (has_dep(m, deps, used, mod))
 		if (has_dep(m, deps, used, mod))
 			continue;
 			continue;
 
 
-		/* FIXME: we can't be sure about
-		 * conditional includes, so don't
-		 * complain. */
-		if (!li[i].cond) {
+		/* FIXME: we can't be sure about conditional includes,
+		 * so don't complain (handle common case of idempotent wrap) */
+		if (!li[i].cond || li[i].cond == f->idempotent_cond) {
 			score_file_error(score, f, i+1,
 			score_file_error(score, f, i+1,
 					 "%s not listed in _info", mod);
 					 "%s not listed in _info", mod);
 			ok = false;
 			ok = false;
@@ -138,7 +137,7 @@ struct ccanlint depends_accurate = {
 	.key = "depends_accurate",
 	.key = "depends_accurate",
 	.name = "Module's CCAN dependencies are the only CCAN files #included",
 	.name = "Module's CCAN dependencies are the only CCAN files #included",
 	.check = check_depends_accurate,
 	.check = check_depends_accurate,
-	.needs = "depends_exist test_depends_exist"
+	.needs = "depends_exist test_depends_exist headers_idempotent"
 };
 };
 
 
 REGISTER_TEST(depends_accurate);
 REGISTER_TEST(depends_accurate);

+ 8 - 3
tools/ccanlint/tests/headers_idempotent.c

@@ -125,9 +125,10 @@ static void check_idem(struct ccan_file *f, struct score *score)
 	if (!f->lines[i])
 	if (!f->lines[i])
 		return;
 		return;
 
 
-	/* We expect a condition on this line. */
+	/* We expect a condition around this line. */
 	if (!line_info[i].cond) {
 	if (!line_info[i].cond) {
-		score_file_error(score, f, i+1, "Expected #ifndef");
+		score_file_error(score, f, first_preproc_line+1,
+				 "Expected #ifndef");
 		return;
 		return;
 	}
 	}
 
 
@@ -136,7 +137,8 @@ static void check_idem(struct ccan_file *f, struct score *score)
 	/* We expect the condition to be ! IFDEF <symbol>. */
 	/* We expect the condition to be ! IFDEF <symbol>. */
 	if (line_info[i].cond->type != PP_COND_IFDEF
 	if (line_info[i].cond->type != PP_COND_IFDEF
 	    || !line_info[i].cond->inverse) {
 	    || !line_info[i].cond->inverse) {
-		score_file_error(score, f, i+1, "Expected #ifndef");
+		score_file_error(score, f, first_preproc_line+1,
+				 "Expected #ifndef");
 		return;
 		return;
 	}
 	}
 
 
@@ -157,6 +159,9 @@ static void check_idem(struct ccan_file *f, struct score *score)
 		return;
 		return;
 	}
 	}
 
 
+	/* Record this for use in depends_accurate */
+	f->idempotent_cond = line_info[i].cond;
+
 	/* Rest of code should all be covered by that conditional. */
 	/* Rest of code should all be covered by that conditional. */
 	for (i++; f->lines[i]; i++) {
 	for (i++; f->lines[i]; i++) {
 		unsigned int val = 0;
 		unsigned int val = 0;

+ 2 - 0
tools/manifest.c

@@ -78,6 +78,8 @@ struct ccan_file *new_ccan_file(const void *ctx, const char *dir,
 	f->fullname = path_join(f, dir, f->name);
 	f->fullname = path_join(f, dir, f->name);
 	f->contents = NULL;
 	f->contents = NULL;
 	f->simplified = NULL;
 	f->simplified = NULL;
+	f->idempotent_cond = NULL;
+
 	return f;
 	return f;
 }
 }
 
 

+ 3 - 0
tools/manifest.h

@@ -80,6 +80,9 @@ struct ccan_file {
 
 
 	/* Simplified stream (lowercase letters and single spaces) */
 	/* Simplified stream (lowercase letters and single spaces) */
 	char *simplified;
 	char *simplified;
+
+	/* Condition for idempotent wrapper (filled by headers_idempotent) */
+	struct pp_conditions *idempotent_cond;
 };
 };
 
 
 /* A new ccan_file, with the given dir and name (either can be take()). */
 /* A new ccan_file, with the given dir and name (either can be take()). */