lkml.org 
[lkml]   [2003]   [Oct]   [2]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
DateThu, 2 Oct 2003 10:37:28 +0200
FromJörn Engel <>
Subject[PATCH v4] check headers for complete includes, etc.
On Wed, 1 October 2003 23:09:26 +0200, Sam Ravnborg wrote:
> On Wed, Oct 01, 2003 at 08:01:14PM +0200, Jörn Engel wrote:
> > > > Doesn't work in include/, there is no include/Makefile.  But lib/ is a
> > hack, I agree.
> 
> Sigh, OK.

Things can be so simple: touch include/Makefile :)

> > > So we need something like the following here: (untested)
> > > > > > > > +headercheck: prepare-all> > > > +	$(PERL) scripts/checkheader.pl $(if $(KBUILD_VERBOSE),-verbose)
> > > > +> > Forgot that KBUILD_VERBOSE is always defined.> Try:> $(if $(KBUILD_VERBOSE:0=),--verbose)

Works, except for one oddity/bug.  Not defining V=something on the
command line sets KBUILD_VERBOSE = "0 ".  Note the space behind the 0.
Suggestions?

> prepare-all exist in BK-latest.> The purpose is to create the asm-$(ARCH) -> asm symlink.
> Add an dependency on include/asm, that should do it.

Too lazy to move to BK-Latest for now.  Dependency on include/asm it
is. :)

One more thing: Since the Makefile target is *check, not check*, I've
renamed the script to headercheck.pl.  This is inconsistent with the
existing scripts, but makes more sense to me.  Hope you don't mind.

Jörn

-- 
Time? What's that? Time is only worth what you do with it.
-- Theo de Raadt

--- /dev/null	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.0-test5/scripts/headercheck.pl	2003-10-02 10:27:54.000000000 +0200
@@ -0,0 +1,65 @@
+#!/usr/bin/perl -w
+use strict;
+use Getopt::Long;
+
+Getopt::Long::Configure("no_auto_abbrev");	# Could cause unexpected things
+Getopt::Long::Configure("bundling");		# We want -sA to work
+Getopt::Long::Configure("no_ignore_case");	# We don't want -a == -A
+
+my $verbose = 0;
+
+GetOptions('v|verbose' => \$verbose) || die("bad options");
+
+
+sub prune($)
+{
+	my $h = shift;
+	chomp($h);
+	open(HDR, "include/$h")
+		or return;
+	while (<HDR>) {
+		if ($_ =~ /^#\s*define\s+PRAGMA_INDIRECT_HEADER\s/) {
+			return;
+		}
+	}
+	close(HDR);
+	return $h;
+}
+
+my @headers = sort(map({prune($_);} `(cd include/ &&
+	[ -d linux/ ] && find linux/ -name "*.h" &&
+	[ -d asm/ ] && find asm/ -name "*.h")`)); # XXX this is fragile
+my $basename = "include/headercheck";
+system("touch", "include/Makefile");
+
+foreach my $h (@headers) {
+	close(STDERR);
+	open(STDERR, ">", "$basename.err");
+
+	open(HC, '>', "$basename.c");
+	print(HC "#include <$h>\n");
+	close(HC);
+
+	# tests
+	if (system("make", "$basename.o") != 0) {
+		print("WARNING: header doesn't build standalone: $h\n");
+		if ($verbose) {
+			system("cat", "$basename.err");
+		}
+		next;
+	}
+
+	my $symbols = `nm $basename.o`;
+	if ($symbols !~ /^$/) {
+		print("WARNING: Symbols may be declared: $h:\n");
+		if ($verbose) {
+			print("$symbols");
+		}
+	}
+} continue {
+	# cleanup
+	unlink("$basename.c");
+	unlink("$basename.err");
+	unlink("$basename.o");
+}
+unlink("system/Makefile");
--- linux-2.6.0-test5/Makefile~headercheck	2003-10-02 10:27:19.000000000 +0200
+++ linux-2.6.0-test5/Makefile	2003-10-02 10:35:27.000000000 +0200
@@ -833,6 +833,9 @@
 		-name '*.[hcS]' -type f -print | sort \
 		| xargs $(PERL) -w scripts/checkconfig.pl
 
+headercheck: include/asm
+	$(PERL) scripts/headercheck.pl $(if $(KBUILD_VERBOSE:0=),--verbose)
+
 includecheck:
 	find * $(RCS_FIND_IGNORE) \
 		-name '*.[hcS]' -type f -print | sort \
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 13:49    [from the cache]
©2003-2008