summaryrefslogtreecommitdiffstats
path: root/scripts/includemocs
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/includemocs')
-rwxr-xr-xscripts/includemocs102
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
+