This file is indexed.

/usr/bin/includemocs is in kdesdk-scripts 4:15.12.3-0ubuntu1.

This file is owned by root:root, with mode 0o755.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
#! /usr/bin/env perl

use strict;
use Cwd;
use File::Find;

my $qmake_mode=0;
$qmake_mode = 1 if (`ls -1 *.pro 2>/dev/null`);
# qmake-like naming also applied to kde frameworks 5, i.e. anything using cmake-automoc
$qmake_mode = 1 if (defined $ARGV[0] && $ARGV[0] eq '-cmake');

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 $mocfile = "$name.moc";
    $mocfile = "moc_$name.cpp" if ($qmake_mode);
    my @answer = `grep -l "^#include[ ]*.$mocfile." $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 \"$mocfile\"' >> $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