lkml.org 
[lkml]   [2007]   [May]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subject[PATCH] headercheck: add dependency check and improve speed
Modified Makfile.headerinst so all files in a dir is checked with
one call to checkhdr.pl script.

The file check is used as marker when last run was executed.
And the file .check.cmd contains a list of dependencies used
by make to determine if a new check should be executed.

The perl script was named check* to follow same naming
as other check scripts.

The speedup is > 10 seconds for a build with headercheck enabled.

Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
---

This version works on powerpc.
The assignment of checkfile had to move below the point where we check for biarch.

Sam

lib/Kconfig.debug | 1 +
scripts/Makefile.headersinst | 55 +++++++++++++++++++++++------------------
scripts/checkhdr.pl | 53 ++++++++++++++++++++++++++++++++++++++++
scripts/hdrcheck.sh | 10 -------
4 files changed, 85 insertions(+), 34 deletions(-)
create mode 100644 scripts/checkhdr.pl
delete mode 100755 scripts/hdrcheck.sh

diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index fbc5c62..596f973 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -70,6 +70,7 @@ config HEADERS_CHECK
relevant for userspace, say 'Y', and check the headers
exported to $(INSTALL_HDR_PATH) (usually 'usr/include' in
your build tree), to make sure they're suitable.
+ Note: Enabling this check requires perl to be installed

config DEBUG_KERNEL
bool "Kernel debugging"
diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
index 8cd6301..6d74b54 100644
--- a/scripts/Makefile.headersinst
+++ b/scripts/Makefile.headersinst
@@ -28,7 +28,7 @@ ifeq (,$(patsubst include/asm/%,,$(obj)/))
# both sets of Kbuild files; we'll generate anything which is mentioned in
# _either_ arch, and recurse into subdirectories which are mentioned in either
# arch. Since some directories may exist in one but not the other, we must
-# use $(wildcard...).
+# use $(wildcard...).
GENASM := 1
archasm := $(subst include/asm,asm-$(ARCH),$(obj))
altarchasm := $(subst include/asm,asm-$(ALTARCH),$(obj))
@@ -39,7 +39,7 @@ endif

include $(KBUILDFILES)

-include scripts/Kbuild.include
+include scripts/Kbuild.include

# If this is include/asm-$(ARCH) and there's no $(ALTARCH), then
# override $(_dst) so that we install to include/asm directly.
@@ -50,28 +50,29 @@ ifeq ($(obj)$(ALTARCH),include/asm-$(ARCH)$(BIASMDIR))
_dst := include/asm
endif

+# file generated during checktime listing depfiles and incfiles
+depsfile := $(INSTALL_HDR_PATH)/$(_dst)/.check.cmd
+checkfile := $(INSTALL_HDR_PATH)/$(_dst)/check
+
+
header-y := $(sort $(header-y))
unifdef-y := $(sort $(unifdef-y))
subdir-y := $(patsubst %/,%,$(filter %/, $(header-y)))
header-y := $(filter-out %/, $(header-y))
header-y := $(filter-out $(unifdef-y),$(header-y))

-# stamp files for header checks
-check-y := $(patsubst %,.check.%,$(header-y) $(unifdef-y) $(objhdr-y))
+# All files to check for this dir
+check-y := $(header-y) $(unifdef-y) $(objhdr-y)

# Work out what needs to be removed
oldheaders := $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$(wildcard $(INSTALL_HDR_PATH)/$(_dst)/*.h))
-unwanted := $(filter-out $(header-y) $(unifdef-y) $(objhdr-y),$(oldheaders))
-
-oldcheckstamps := $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,%,$(wildcard $(INSTALL_HDR_PATH)/$(_dst)/.check.*.h))
-unwanted += $(filter-out $(check-y),$(oldcheckstamps))
+unwanted := $(filter-out $(check-y),$(oldheaders))

# Prefix them all with full paths to $(INSTALL_HDR_PATH)
-header-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(header-y))
-unifdef-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(unifdef-y))
-objhdr-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(objhdr-y))
-check-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(check-y))
-
+header-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(header-y))
+unifdef-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(unifdef-y))
+objhdr-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(objhdr-y))
+check-y := $(patsubst %,$(INSTALL_HDR_PATH)/$(_dst)/%,$(check-y))

ifdef ALTARCH
ifeq ($(obj),include/asm-$(ARCH))
@@ -96,9 +97,9 @@ quiet_cmd_unifdef = UNIFDEF $(patsubst $(INSTALL_HDR_PATH)/%,%,$@)
cmd_unifdef = $(UNIFDEF) $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/%,$(srctree)/$(obj)/%,$@) \
| $(HDRSED) > $@ || :

-quiet_cmd_check = CHECK $(patsubst $(INSTALL_HDR_PATH)/$(_dst)/.check.%,$(_dst)/%,$@)
- cmd_check = $(CONFIG_SHELL) $(srctree)/scripts/hdrcheck.sh \
- $(INSTALL_HDR_PATH)/include $(subst /.check.,/,$@) $@
+quiet_cmd_check = CHECK $(words $(check-y)) files in $(_dst)
+ cmd_check = $(PERL) $(srctree)/scripts/checkhdr.pl \
+ $(INSTALL_HDR_PATH)/include $(depsfile) $(check-y)

quiet_cmd_remove = REMOVE $(_dst)/$@
cmd_remove = rm -f $(INSTALL_HDR_PATH)/$(_dst)/$@
@@ -137,17 +138,22 @@ echo "\#endif /* $$STUBDEF */" ; \
.PHONY: __headersinst __headerscheck

ifdef HDRCHECK
-__headerscheck: $(subdir-y) $(check-y)
- @true
+__headerscheck: $(subdir-y) $(checkfile)
+ $(Q):

-$(check-y) : $(INSTALL_HDR_PATH)/$(_dst)/.check.%.h : $(INSTALL_HDR_PATH)/$(_dst)/%.h
- $(call cmd,check)
+.PHONY: FORCE
+$(checkfile): FORCE
+ $(if $?, $(call cmd,check))
+ $(Q)touch $(checkfile)

-# Other dependencies for $(check-y)
-include /dev/null $(wildcard $(check-y))
+# Include autogenerated file listing depfiles and incfiles
+ifneq ($(wildcard $(depsfile)),)
+ include $(depsfile)
+endif

-# ... but leave $(check-y) as .PHONY for now until those deps are actually correct.
-.PHONY: $(check-y)
+$(checkfile) : $(depfiles)
+# dummy rule - cannot be made
+$(depfiles) : ;

else
# Rules for installing headers
@@ -192,3 +198,4 @@ altarch-dir: $(subdir-y) $(header-y) $(unifdef-y) $(objhdr-y)
.PHONY: $(subdir-y)
$(subdir-y):
$(Q)$(MAKE) $(hdrinst)=$(obj)/$@ dst=$(_dst)/$@ rel=../$(rel)
+
diff --git a/scripts/checkhdr.pl b/scripts/checkhdr.pl
new file mode 100644
index 0000000..bad7dd7
--- /dev/null
+++ b/scripts/checkhdr.pl
@@ -0,0 +1,53 @@
+#!/usr/bin/perl
+#
+# checkhdr.pl check that all files included by a file exists
+#
+# Usage: dir depfile [files...]
+# dir: dir to look for included files
+# depfile: file to write out which files was parsed and used by the parsed file
+# files...: list of files to check
+#
+# The script reads the supplied file line by line and for each include statement
+# it checks if the included file actually exists.
+#
+# Only include files located in asm* and linux* are checked. The rest are assumed
+# to be system include files.
+# The depfile has a list of unique filenames - make does not allow duplicates
+
+my ($dir, $depfile, @files) = @ARGV;
+
+my $includere = qr/^\s*#\s*include\s+<(.*)>/;
+my $ret = 0;
+my $lineno = 0;
+my @depfiles;
+
+foreach $file (@files) {
+ open(FILE, "< $file") or die "$file: $!\n";
+ push(@depfiles, $file);
+ $lineno = 0;
+ while ($line = <FILE>) {
+ $lineno++;
+ if ($line =~ m/$includere/) {
+ my $inc = $1;
+ if ($inc =~ m/^asm/ || $inc =~ m/^linux/) {
+ if (!(stat($dir . "/" . $inc))) {
+ print STDERR "$file:$lineno: included file '$inc' is not exported\n";
+ $ret = 1;
+ }
+ push(@depfiles, $dir . "/" . $inc);
+ }
+ }
+ }
+ close(FILE);
+}
+open(DEPFILE, "> $depfile") or die "$depfile: $!\n";
+print DEPFILE "depfiles := \\\n";
+
+@dep_unique{@depfiles} = ();
+@dep_unique_list = sort keys %dep_unique;
+foreach $f (@dep_unique_list) {
+ print DEPFILE " $f \\\n";
+}
+print DEPFILE "\n";
+close(DEPFILE);
+exit($ret);
diff --git a/scripts/hdrcheck.sh b/scripts/hdrcheck.sh
deleted file mode 100755
index 3159858..0000000
--- a/scripts/hdrcheck.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-for FILE in `grep '^[ \t]*#[ \t]*include[ \t]*<' $2 | cut -f2 -d\< | cut -f1 -d\> | egrep ^linux\|^asm` ; do
- if [ ! -r $1/$FILE ]; then
- echo $2 requires $FILE, which does not exist in exported headers
- exit 1
- fi
-done
-# FIXME: List dependencies into $3
-touch $3
--
1.5.1.rc3.20.gaa453
-
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: 2007-05-23 20:47    [W:0.069 / U:0.876 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site