Rewrite make_h_tree.pl in shell script

The current usage of make_h_tree.pl adds a build requirement of
/usr/bin/perl that we did not have prior to commit
1d6593e952. Do the same thing in a
bourne shell script instead, so we don't need perl.

Note that this is not as generalized as make_h_tree.pl, but it doesn't
need to be. Specifically, this does not strip a leading ../ from found
include directives (nothing in the tree that includes h/* files uses
this), and header filenames containing whitespace almost certainly do
not work correctly.

The h => sys mapping is also much more hardcoded, but that's all we
were using this for anyway.

Change-Id: If07888abfdb9e8ec822b33abed0bf744b7210a52
Reviewed-on: http://gerrit.openafs.org/6790
Reviewed-by: Russ Allbery <rra@stanford.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementix.org>
This commit is contained in:
Andrew Deason 2012-02-23 18:28:21 -06:00 committed by Derrick Brashear
parent 46e85dd468
commit fb03b1380f
3 changed files with 29 additions and 46 deletions

View File

@ -2131,7 +2131,7 @@ AFSWEB:
h: $(TOP_SRC_AFS)/*.c $(TOP_SRC_VNOPS)/*.c $(TOP_SRC_RX)/*.c
-$(RM) -rf h
@TOP_SRCDIR@/libuafs/make_h_tree.pl $(TOP_SRC_AFS) $(TOP_SRC_VNOPS) \
@TOP_SRCDIR@/libuafs/make_h_tree $(TOP_SRC_AFS) $(TOP_SRC_VNOPS) \
$(TOP_SRC_RX)
setup_common: h

28
src/libuafs/make_h_tree Executable file
View File

@ -0,0 +1,28 @@
#!/bin/sh -e
# make_h_tree
# Generate an h tree that includes the appropriate sys headers
#
# Usage: make_h_tree ${SRC} ...
#
# The source files in the specified directories will be scanned for include
# directives. The h directory will be created under the current directory and
# populated with stubs that include the actual header file for every header
# included by any source file in the ${SRC} directories. Since this script is
# for userspace only, this effectively just makes a file called h/foo.h that
# contains:
# #include <sys/foo.h>
# For every include directive that is found that looks like #include <h/foo.h>
# This is an ugly hack to work around the naming of header files using h
# instead of their proper names elsewhere in the code.
mkdir h
for dir in "$@" ; do
for hsrc in `cat "$dir"/*.c | \
sed -n -e 's|^[ ]*#[ ]*include[ ]*[<"]h/\([^>"/]*\)[>"].*$|\1|p' | \
sort | uniq` ; do
echo "#include <sys/$hsrc>" > h/"$hsrc"
done
done

View File

@ -1,45 +0,0 @@
#!/usr/bin/perl
# make_h_tree.pl
# Generate an h tree that includes the appropriate sys headers
#
# Usage: make_h_tree.pl ${SRC} ...
#
# The specified makefiles will be scanned for variable values. The h
# directory will be created under the current directory and populated with
# stubs that include the actual header file for every header included by any
# source file in the ${SRC} directories. This is an ugly hack to work around
# the naming of header files using h instead of their proper names elsewhere
# in the code.
use IO::File;
if (@ARGV < 1) {
die "Usage: $0 SRC ...\n";
}
%remap = ('h' => 'sys');
foreach $src (keys %remap) {
mkdir($src, 0777) or die "$src: $!\n";
%seen = ();
@q = map { glob ("$_/*.[Sc]") } @ARGV;
while (@q) {
$src = shift @q;
$content = new IO::File($src, O_RDONLY) or die "$src: $!\n";
LINE:
while (<$content>) {
chomp;
if (/^\s*\#\s*include\s*[<\"](?:\.\.\/)?([^\/>\"]*)(.*?)[>\"]/) {
$inc = "$1$2";
if (exists $seen{$inc}) {
next;
} elsif (exists $remap{$1} && $2 !~ /.\//) {
$H = new IO::File("$inc", O_WRONLY|O_CREAT|O_TRUNC, 0666)
or die "$inc: $!\n";
print $H "#include <sys$2>\n";
$H->close() or die "$inc: $!\n";
$seen{$inc} = 1;
}
}
}
}
}