diff options
Diffstat (limited to 'scripts/includemocs')
-rwxr-xr-x | scripts/includemocs | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/scripts/includemocs b/scripts/includemocs new file mode 100755 index 00000000..32df1b20 --- /dev/null +++ b/scripts/includemocs @@ -0,0 +1,102 @@ +#! /usr/bin/env perl + +use strict; +use Cwd; +use File::Find; + +my %dir2files=(); +my $cppExt=" cpp cc cxx C c++ "; +my $cppFiles="*.cpp *.cc *.cxx *.C *.c++"; + +sub collectthing() +{ + if (/\.([^.]+)$/) { + my $ext=$1; + if (" h H hh hxx h++ " =~ / $ext /) { + my $line=`grep -l '^[{ \t]*Q_OBJECT' $_ 2> /dev/null`; + chomp($line); + if ($line) { + $dir2files{$File::Find::dir}->{headers}->{$_} = 1; + } + } elsif ($cppExt =~ / $ext /) { + $dir2files{$File::Find::dir}->{sources}->{$_} = 1; + } + } +} + +sub checkdir($) +{ + my ($dir)=@_; + chdir($dir); + my $hdrs=$dir2files{$dir}->{headers}; + my $srcs=$dir2files{$dir}->{sources}; + foreach my $h (keys %$hdrs) { + (my $name=$h) =~ s/\.[^.]+$//; + my @answer = `grep -l "^#include[ ]*.$name\.moc." $cppFiles 2> /dev/null`; + if (@answer == 0) { + my $s; + foreach my $e (split(/\s+/, $cppExt)) { + if (exists $srcs->{$name.".".$e}) { + $s=$dir."/".$name.".".$e; last; + } + } + if ($s) { + print "echo >> $s ;\n"; + print "echo '#include \"$name.moc\"' >> $s ;\n"; + } else { + print "echo \"can't guess a C++ file for $dir/$h\" ;\n"; + } + } + } +} + +find (\&collectthing, cwd()); + +foreach my $k (keys %dir2files) { + print STDERR "Directory $k:\n headers=["; + print STDERR join(", ", keys %{$dir2files{$k}->{headers}}); + print STDERR "]\n sources=["; + print STDERR join(", ", keys %{$dir2files{$k}->{sources}}); + print STDERR "]\n"; + checkdir($k); +} + +=head1 NAME + +includemocs -- handle mocifyable headers, whose .moc file is nowhere included. + +=head1 SYNOPSIS + + includemocs + +=head1 DESCRIPTION + +Header files declaring a QObject descendant have to be run through moc to +produce a .moc file. This .moc file has to be compiled, for which two +possibilities exists: compile it separately, or #include it in the C++ file +implementing that above mentioned class. The latter is more efficient in term +of compilation speed. + +This script searches in the current directory and its subdirs for header files +declaring a QObject descendant class. If it finds some, it looks, if there is +a C++ file containing an '#include' for the generated .moc file. If thats not +the case, it tries to guess into which C++ file that '#include' is placed best +(based on the filename). If it fails to guess a proper place, it mentions +that. + +On stdout commands are ouput, suitable for a shell, which, when +evaluated, add the suggested '#include' at the end of the files. + +On stderr some informational messages are printed. + +=head1 EXAMPLES + + cd kdebase ; includemocs + cd kdebase ; `eval includemocs 2> /dev/null` + +=head1 AUTHOR + +Michael Matz <matz@ifh.de> + +=cut + |