Warning, /sdk/kde-dev-scripts/includemocs is written in an unsupported language. File is not indexed.

0001 #! /usr/bin/env perl
0002 
0003 use strict;
0004 use Cwd;
0005 use File::Find;
0006 
0007 my $qmake_mode=0;
0008 $qmake_mode = 1 if (`ls -1 *.pro 2>/dev/null`);
0009 # qmake-like naming also applied to kde frameworks 5, i.e. anything using cmake-automoc
0010 $qmake_mode = 1 if (defined $ARGV[0] && $ARGV[0] eq '-cmake');
0011 
0012 my %dir2files=();
0013 my $cppExt=" cpp cc cxx C c++ ";
0014 my $cppFiles="*.cpp *.cc *.cxx *.C *.c++";
0015 
0016 sub collectthing()
0017 {
0018   if (/\.([^.]+)$/) {
0019     my $ext=$1;
0020     if (" h H hh hxx h++ " =~ / $ext /) {
0021       my $line=`grep -l '^[{ \t]*Q_OBJECT' $_ 2> /dev/null`;
0022            chomp($line);
0023       if ($line) {
0024         $dir2files{$File::Find::dir}->{headers}->{$_} = 1;
0025       }
0026     } elsif ($cppExt =~ / $ext /) {
0027       $dir2files{$File::Find::dir}->{sources}->{$_} = 1;
0028     }
0029   }
0030 }
0031 
0032 sub checkdir($)
0033 {
0034   my ($dir)=@_;
0035   chdir($dir);
0036   my $hdrs=$dir2files{$dir}->{headers};
0037   my $srcs=$dir2files{$dir}->{sources};
0038   foreach my $h (keys %$hdrs) {
0039     (my $name=$h) =~ s/\.[^.]+$//;
0040     my $mocfile = "$name.moc";
0041     $mocfile = "moc_$name.cpp" if ($qmake_mode);
0042     my @answer = `grep -l "^#include[ ]*.$mocfile." $cppFiles 2> /dev/null`;
0043     if (@answer == 0) {
0044       my $s;
0045       foreach my $e (split(/\s+/, $cppExt)) {
0046         if (exists $srcs->{$name.".".$e}) {
0047           $s=$dir."/".$name.".".$e; last;
0048         }
0049       }
0050       if ($s) {
0051         print "echo >> $s ;\n";
0052         print "echo '#include \"$mocfile\"' >> $s ;\n";
0053       } else {
0054         print "echo \"can't guess a C++ file for $dir/$h\" ;\n";
0055       }
0056     }
0057   }
0058 }
0059 
0060 find (\&collectthing, cwd());
0061 
0062 foreach my $k (keys %dir2files) {
0063   print STDERR "Directory $k:\n  headers=[";
0064   print STDERR join(", ", keys %{$dir2files{$k}->{headers}});
0065   print STDERR "]\n  sources=[";
0066   print STDERR join(", ", keys %{$dir2files{$k}->{sources}});
0067   print STDERR "]\n";
0068   checkdir($k);
0069 }
0070 
0071 =head1 NAME
0072 
0073 includemocs -- handle mocifyable headers, whose .moc file is nowhere included.
0074 
0075 =head1 SYNOPSIS
0076 
0077         includemocs
0078 
0079 =head1 DESCRIPTION
0080 
0081 Header files declaring a QObject descendant have to be run through moc to
0082 produce a .moc file.  This .moc file has to be compiled, for which two
0083 possibilities exists: compile it separately, or #include it in the C++ file
0084 implementing that above mentioned class.  The latter is more efficient in term
0085 of compilation speed.
0086 
0087 This script searches in the current directory and its subdirs for header files
0088 declaring a QObject descendant class.  If it finds some, it looks, if there is
0089 a C++ file containing an '#include' for the generated .moc file.  If thats not
0090 the case, it tries to guess into which C++ file that '#include' is placed best
0091 (based on the filename).  If it fails to guess a proper place, it mentions
0092 that.
0093 
0094 On stdout commands are ouput, suitable for a shell, which, when
0095 evaluated, add the suggested '#include' at the end of the files.
0096 
0097 On stderr some informational messages are printed.
0098 
0099 =head1 EXAMPLES
0100 
0101         cd kdebase ; includemocs
0102         cd kdebase ; `eval includemocs 2> /dev/null`
0103 
0104 =head1 AUTHOR
0105 
0106 Michael Matz <matz@ifh.de>
0107 
0108 =cut
0109