am_edit
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:87k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #!/usr/bin/perl -w
  2. # Expands the specialised KDE tags in Makefile.in to (hopefully) valid
  3. # make syntax.
  4. # When called without file parameters, we work recursively on all Makefile.in
  5. # in and below the current subdirectory. When called with file parameters,
  6. # only those Makefile.in are changed.
  7. # The currently supported tags are
  8. #
  9. # {program}_METASOURCES
  10. # where you have a choice of two styles
  11. #   {program}_METASOURCES = name1.moc name2.moc ... []
  12. #   {program}_METASOURCES = AUTO
  13. #       The second style requires other tags as well.
  14. #
  15. # To install icons :
  16. #    KDE_ICON = iconname iconname2 ...
  17. #    KDE_ICON = AUTO
  18. #
  19. # For documentation :
  20. #    http://developer.kde.org/documentation/other/developer-faq.html
  21. #
  22. # and more new tags TBD!
  23. #
  24. # The concept (and base code) for this program came from automoc,
  25. # supplied by the following
  26. #
  27. # Matthias Ettrich <ettrich@kde.org>      (The originator)
  28. # Kalle Dalheimer <kalle@kde.org>      (The original implementator)
  29. # Harri Porten  <porten@tu-harburg.de>
  30. # Alex Zepeda  <jazepeda@pacbell.net>
  31. # David Faure <faure@kde.org>
  32. # Stephan Kulow <coolo@kde.org>
  33. # Dirk Mueller <mueller@kde.org>
  34. use Cwd;
  35. use File::Find;
  36. use File::Basename;
  37. # Prototype the functions
  38. sub initialise ();
  39. sub processMakefile ($);
  40. sub updateMakefile ();
  41. sub restoreMakefile ();
  42. sub removeLine ($$);
  43. sub appendLines ($);
  44. sub substituteLine ($$);
  45. sub findMocCandidates ();
  46. sub pruneMocCandidates ($);
  47. sub checkMocCandidates ();
  48. sub addMocRules ();
  49. sub findKcfgFile($);
  50. sub tag_AUTOMAKE ();
  51. sub tag_META_INCLUDES ();
  52. sub tag_METASOURCES ();
  53. sub tag_POFILES ();
  54. sub tag_DOCFILES ();
  55. sub tag_LOCALINSTALL();
  56. sub tag_IDLFILES();
  57. sub tag_UIFILES();
  58. sub tag_KCFGFILES();
  59. sub tag_SUBDIRS();
  60. sub tag_ICON();
  61. sub tag_CLOSURE();
  62. sub tag_NO_UNDEFINED();
  63. sub tag_NMCHECK();
  64. sub tag_DIST();
  65. sub tag_KDEINIT();
  66. # Some global globals...
  67. $verbose    = 0;        # a debug flag
  68. $thisProg   = "$0";     # This programs name
  69. $topdir     = cwd();    # The current directory
  70. @makefiles  = ();       # Contains all the files we'll process
  71. @foreignfiles = ();
  72. $start      = (times)[0]; # some stats for testing - comment out for release
  73. $version    = "v0.2";
  74. $errorflag  = 0;
  75. $cppExt     = "(cpp|cc|cxx|C|c\+\+)";
  76. $hExt       = "(h|H|hh|hxx|hpp|h\+\+)";
  77. $progId     = "KDE tags expanded automatically by " . basename($thisProg);
  78. $automkCall = "n";
  79. $printname  = "";  # used to display the directory the Makefile is in
  80. $use_final  = 1;        # create code for --enable-final
  81. $cleantarget = "clean";
  82. $dryrun     = 0;
  83. $pathoption = 0;
  84. $foreign_libtool = 0;
  85. while (defined ($ARGV[0]))
  86. {
  87.     $_ = shift;
  88.     if (/^--version$/)
  89.     {
  90.         print STDOUT "n";
  91.         print STDOUT basename($thisProg), " $versionn",
  92.                 "This is really free software, unencumbered by the GPL.n",
  93.                 "You can do anything you like with it except sueing me.n",
  94.                 "Copyright 1998 Kalle Dalheimer <kalle@kde.org>n",
  95.                 "Concept, design and unnecessary questions about perln",
  96.                 "       by Matthias Ettrich <ettrich@kde.org>nn",
  97.                 "Making it useful by Stephan Kulow <coolo@kde.org> andn",
  98.                 "Harri Porten <porten@kde.org>n",
  99.                 "Updated (Feb-1999), John Birch <jb.nz@writeme.com>n",
  100.                 "Fixes and Improvements by Dirk Mueller <mueller@kde.org>n",
  101.         "Current Maintainer Stephan Kulownn";
  102.         exit 0;
  103.     }
  104.     elsif (/^--verbose$|^-v$/)
  105.     {
  106.         $verbose = 1;       # Oh is there a problem...?
  107.     }
  108.     elsif (/^(?:-p|--path=)(.+)$/)
  109.     {
  110.         my $p = $1;
  111.         $thisProg = $p . "/". basename($thisProg);
  112.         warn ("$thisProg doesn't existn")      if (!(-f $thisProg));
  113.         $thisProg .= " -p".$p;
  114.         $pathoption=1;
  115.     }
  116.     elsif (/^--help$|^-h$/)
  117.     {
  118.         print STDOUT "Usage $thisProg [OPTION] ... [dir/Makefile.in]...n",
  119.                 "n",
  120.                 "Patches dir/Makefile.in generated by automaken",
  121.                 "(where dir can be an absolute or relative directory name)n",
  122.                 "n",
  123.                 "  -v, --verbose      verbosely list files processedn",
  124.                 "  -h, --help         print this help, then exitn",
  125.                 "  --version          print version number, then exitn",
  126.                 "  -p, --path=        use the path to am_edit if the pathn",
  127.                 "                     called from is not the one to be usedn",
  128.         "  --no-final         don't patch for --enable-finaln";
  129.         exit 0;
  130.     }
  131.     elsif (/^--no-final$/)
  132.     {
  133. $use_final = 0;
  134.         $thisProg .= " --no-final";
  135.     }
  136.     elsif (/^--foreign-libtool$/)
  137.     {
  138.         $foreign_libtool = 1;
  139.         $thisProg .= " --foreign-libtool";
  140.     }
  141.     elsif (/^-n$/)
  142.     {
  143.      $dryrun = 1;
  144.     }
  145.     else
  146.     {
  147.         # user selects what input files to check
  148.         # add full path if relative path is given
  149.         $_ = cwd()."/".$_   if (! /^//);
  150.         print "User wants $_n" if ($verbose);
  151.         push (@makefiles, $_);
  152.     }
  153. }
  154. if ($thisProg =~ /^// && !$pathoption )
  155. {
  156.   print STDERR "Illegal full pathname call performed...n",
  157.       "The call to "$thisProg"nwould be inserted in some Makefile.in.n",
  158.       "Please use option --path.n";
  159.   exit 1;
  160. }
  161. # Only scan for files when the user hasn't entered data
  162. if (!@makefiles)
  163. {
  164.     print STDOUT "Scanning for Makefile.inn"       if ($verbose);
  165.     find (&add_makefile, cwd());
  166.     #chdir('$topdir');
  167. } else {
  168.     print STDOUT "Using input files specified by usern"   if ($verbose);
  169. }
  170. foreach $makefile (sort(@makefiles))
  171. {
  172.     processMakefile ($makefile);
  173.     last            if ($errorflag);
  174. }
  175. # Just some debug statistics - comment out for release as it uses printf.
  176. printf STDOUT "Time %.2f CPU secn", (times)[0] - $start     if ($verbose);
  177. exit $errorflag;        # causes make to fail if erroflag is set
  178. #-----------------------------------------------------------------------------
  179. # In conjunction with the "find" call, this builds the list of input files
  180. sub add_makefile ()
  181. {
  182.   push (@makefiles, $File::Find::name) if (/Makefile.in$/);
  183. }
  184. #-----------------------------------------------------------------------------
  185. # Processes a single make file
  186. # The parameter contains the full path name of the Makefile.in to use
  187. sub processMakefile ($)
  188. {
  189.     # some useful globals for the subroutines called here
  190.     local ($makefile)       = @_;
  191.     local @headerdirs       = ('.');
  192.     local $haveAutomocTag   = 0;
  193.     local $MakefileData     = "";
  194.     local $cxxsuffix  = "KKK";
  195.     local @programs = ();  # lists the names of programs and libraries
  196.     local $program = "";
  197.     local @kdeinits = (); # lists the kdeinit targets
  198.     local %realObjs = ();  # lists the objects compiled into $program
  199.     local %sources = ();   # lists the sources used for $program
  200.     local %finalObjs = (); # lists the objects compiled when final
  201.     local %realname = ();  # the binary name of program variable
  202.     local %idlfiles = ();  # lists the idl files used for $program
  203.     local %globalmocs = ();# list of all mocfiles (in %mocFiles format)
  204.     local %important = (); # list of files to be generated asap
  205.     local %uiFiles = ();
  206.     local %kcfgFiles = ();
  207.     local $allidls = "";
  208.     local $idl_output = "";# lists all idl generated files for cleantarget
  209.     local $ui_output = "";# lists all uic generated files for cleantarget
  210.     local $kcfg_output = "";# lists all kcfg generated files for cleantarget
  211.     local %dependmocs = ();
  212.     
  213.     local $metasourceTags = 0;
  214.     local $dep_files      = "";
  215.     local $dep_finals     = "";
  216.     local %target_adds    = (); # the targets to add
  217.     local %rule_adds      = ();
  218.     local $kdelang        = "";
  219.     local @cleanfiles     = ();
  220.     local $cleanMoc       = "";
  221.     local $closure_output = "";
  222.     local %varcontent     = ();
  223.     $makefileDir = dirname($makefile);
  224.     chdir ($makefileDir);
  225.     $printname = $makefile;
  226.     $printname =~ s/^Q$topdirE///;
  227.     $makefile = basename($makefile);
  228.     print STDOUT "Processing makefile $printnamen"   if ($verbose);
  229.     # Setup and see if we need to do this.
  230.     return      if (!initialise());
  231.     tag_AUTOMAKE ();            # Allows a "make" to redo the Makefile.in
  232.     tag_META_INCLUDES ();       # Supplies directories for src locations
  233.     foreach $program (@programs) {
  234.         $sources_changed{$program} = 0;
  235.         $dependmocs{$program} = "";
  236.         $important{$program} = "";
  237. tag_IDLFILES();             # Sorts out idl rules
  238. tag_NO_UNDEFINED();
  239. tag_CLOSURE();
  240. tag_NMCHECK();
  241. tag_UIFILES();              # Sorts out ui rules
  242. tag_KCFGFILES();            # Sorts out kcfg rules
  243.         tag_METASOURCES ();         # Sorts out the moc rules
  244.         if ($sources_changed{$program}) {
  245.             my $lookup = $program . '_SOURCESs*=[ t]*(.*)';
  246.             if($program =~ /libkdeinit_(.*)/) {
  247.                 my $prog = $1;
  248.                 substituteLine($prog . '_SOURCESs*=[ t]*(.*)', 
  249.                     "${prog}_SOURCES = ${prog}_dummy.$cxxsuffixn" .
  250.                     "libkdeinit_${prog}_SOURCES = " . $sources{$program});
  251.                 $sources{$prog} = "${prog}_dummy.$cxxsuffix";
  252.             }
  253.             else {
  254.                 substituteLine($lookup, "$program_SOURCES=" . $sources{$program});
  255.             }
  256.         }
  257.         if ($important{$program}) {
  258.             local %source_dict = ();
  259.             for $source (split(/[34s]+/, $sources{$program})) {
  260.                 $source_dict{$source} = 1;
  261.             }
  262.             for $source (@cleanfiles) {
  263.                 $source_dict{$source} = 0;
  264.             }
  265.             for $source (keys %source_dict) {
  266.                 next if (!$source);
  267.                 if ($source_dict{$source}) {
  268.                     # sanity check
  269.                     if (! -f $source) {
  270.                         print STDERR "Error: $source is listed in a _SOURCE line in $printname, but doesn't exist yet. Put it in DISTCLEANFILES!n";
  271.                     } else {
  272.                         $target_adds{"$(srcdir)/$source"} .= $important{$program};
  273.                     }
  274.                 }
  275.             }
  276.         }
  277.     }
  278.     if ($cleanMoc) {
  279.         # Always add dist clean tag
  280.         # Add extra *.moc.cpp files created for USE_AUTOMOC because they
  281.         # aren't included in the normal *.moc clean rules.
  282.         appendLines ("$cleantarget-metasources:nt-rm -f $cleanMocn");
  283.         $target_adds{"$cleantarget-am"} .= "$cleantarget-metasources ";
  284.     }
  285.     
  286.     tag_DIST() unless ($kdeopts{"noautodist"});
  287.     if ($idl_output) {
  288.         appendLines ("$cleantarget-idl:nt-rm -f $idl_outputn");
  289.         $target_adds{"$cleantarget-am"} .= "$cleantarget-idl ";
  290.     }
  291.     if ($ui_output) {
  292.         appendLines ("$cleantarget-ui:nt-rm -f $ui_outputn");
  293.         $target_adds{"$cleantarget-am"} .= "$cleantarget-ui ";
  294.     }
  295.     if ($kcfg_output) {
  296.         appendLines ("$cleantarget-kcfg:nt-rm -f $kcfg_outputn");
  297.         $target_adds{"$cleantarget-am"} .= "$cleantarget-kcfg ";
  298.     }
  299.     if ($closure_output) {
  300.         appendLines ("$cleantarget-closures:nt-rm -f $closure_outputn");
  301.         $target_adds{"$cleantarget-am"} .= "$cleantarget-closures ";
  302.     }
  303.     if ($MakefileData =~ /nKDE_LANGs*=s*(S*)s*n/) {
  304.         $kdelang = '$(KDE_LANG)'
  305.     } else {
  306.         $kdelang = '';
  307.     }
  308.     tag_POFILES ();             # language rules for po directory
  309.     tag_DOCFILES ();            # language rules for doc directories
  310.     tag_LOCALINSTALL();         # add $(DESTDIR) before all kde_ dirs
  311.     tag_ICON();
  312.     tag_SUBDIRS();
  313.     my $tmp = "force-reedit:n";
  314.     $tmp   .= "t$automkCallntcd $(top_srcdir) && perl $thisProg $printnamenn";
  315.     appendLines($tmp);
  316.     make_bcheck_target();
  317.     make_meta_classes();
  318.     tag_COMPILE_FIRST();
  319.     tag_FINAL() if (!$kdeopts{"nofinal"});
  320.     my $final_lines = "final:nt$(MAKE) ";
  321.     my $final_install_lines = "final-install:nt$(MAKE) ";
  322.     my $nofinal_lines = "no-final:nt$(MAKE) ";
  323.     my $nofinal_install_lines = "no-final-install:nt$(MAKE) ";
  324.     foreach $program (@programs) {
  325.         my $lookup = $program . '_OBJECTSs*=[ t]*.*';
  326.         my $new = "";
  327.         my @list = split(/[34s]+/, $realObjs{$program});
  328.         if (!$kdeopts{"nofinal"} && @list > 1 && $finalObjs{$program}) {
  329.             $new .= "$program_final_OBJECTS = " . $finalObjs{$program};
  330.             $new .= "n$program_nofinal_OBJECTS = " . $realObjs{$program};
  331.             $new .= "n@KDE_USE_FINAL_FALSE@$program_OBJECTS = $($program_nofinal_OBJECTS)";
  332.             $new .= "n@KDE_USE_FINAL_TRUE@$program_OBJECTS = $($program_final_OBJECTS)";
  333.             $final_lines .= "$program_OBJECTS="$($program_final_OBJECTS)" ";
  334.             $final_install_lines .= "$program_OBJECTS="$($program_final_OBJECTS)" ";
  335.             $nofinal_lines .= "$program_OBJECTS="$($program_nofinal_OBJECTS)" ";
  336.             $nofinal_install_lines .= "$program_OBJECTS="$($program_nofinal_OBJECTS)" ";
  337.         } else {
  338.             $new = "$program_OBJECTS = " . $realObjs{$program};
  339.         }
  340.         if($MakefileData =~ m/n$lookup/) {
  341.             substituteLine ($lookup, $new);
  342.         }
  343.         else {
  344.             appendLines("$newn");
  345.         }
  346.     }
  347.     appendLines($final_lines . "all-amn");
  348.     appendLines($final_install_lines . "install-amn");
  349.     appendLines($nofinal_lines . "all-amn");
  350.     appendLines($nofinal_install_lines . "install-amn");
  351.     my $lookup = '(@S+@)?DEP_FILESs*=[ t]*(.*)';
  352.     if ($MakefileData =~ /n$lookup/) {
  353.         my $condition = $1;
  354.         my $depfiles = $2;
  355.         my $workfiles;
  356.         if ($dep_finals) {
  357.             # Add the conditions on every line, since
  358.             # there may be line continuations in the list.
  359.             $workfiles = "$dep_files $dep_finals $depfiles";
  360.             $workfiles =~ s/34/34$condition@KDE_USE_FINAL_TRUE@t/g;
  361.             $lines  = "$condition@KDE_USE_FINAL_TRUE@DEP_FILES = $workfilesn";
  362.             $workfiles = "$dep_files $depfiles";
  363.             $workfiles =~ s/34/34$condition@KDE_USE_FINAL_FALSE@t/g;
  364.             $lines .= "$condition@KDE_USE_FINAL_FALSE@DEP_FILES = $workfiles";
  365.         } else {
  366.             $workfiles = "$dep_files $depfiles";
  367.             $workfiles =~ s/34/34$conditiont/g;
  368.             $lines = $condition . "DEP_FILES = $workfiles";
  369.         }
  370.         substituteLine($lookup, $lines);
  371.     }
  372.     # new recursive targets
  373.     $target_adds{ "nmcheck" } .= ""; # always create nmcheck target
  374.     $target_adds{ "nmcheck-am" } .= "nmcheck";
  375.     $lookup = 'RECURSIVE_TARGETSs*=[ t]*(.*)';
  376.     if ($MakefileData =~ /n$lookup/) {
  377.       substituteLine($lookup, "RECURSIVE_TARGETS = $1 nmcheck-recursive bcheck-recursive");
  378.     }
  379.     $cvs_lines  = "kde-rpo-clean:n";
  380.     $cvs_lines .= "t-rm -f *.rpon";
  381.     appendLines($cvs_lines);
  382.     $target_adds{"clean"} .= "kde-rpo-clean ";
  383.     my %target_dels = ("install-data-am" => "");
  384.     # some strange people like to do a install-exec, and expect that also
  385.     # all modules are installed.  automake doesn't know this, so we need to move
  386.     # this here from install-data to install-exec.
  387.     if ($MakefileData =~ m/nkde_module_LTLIBRARIESs*=/) {
  388. #      $target_adds{"install-exec-am"} .= "install-kde_moduleLTLIBRARIES ";
  389. #      don't use $target_adds here because we need to append the dependency, not
  390. #      prepend it. Fixes #44342 , when a module depends on a lib in the same dir
  391. #      and libtool needs it during relinking upon install (Simon)
  392.       my $lookup = "install-exec-am:([^n]*)";
  393.       if($MakefileData =~ /n$lookupn/) {
  394.         substituteLine("$lookup", "install-exec-am: $1 install-kde_moduleLTLIBRARIES");
  395.       }
  396.       $target_dels{"install-data-am"} .= "install-kde_moduleLTLIBRARIES ";
  397.       $target_adds{"install-data-am"} .= " ";
  398.     }
  399.     my $lines = "";
  400.     foreach $add (keys %target_adds) {
  401. my $lookup = quotemeta($add) . ':([^n]*)';
  402.         if ($MakefileData =~ /n$lookupn/) {
  403.   my $newlines = $1;
  404.   my $oldlines = $lookup;
  405.   if (defined $target_dels{$add}) {
  406.     foreach $del (split(' ', $target_dels{$add})) {
  407.       $newlines =~ s/s*$dels*/ /g;
  408.     }
  409.   }
  410.   substituteLine($oldlines, "$add: " . $target_adds{$add} . $newlines);
  411.         } else {
  412.   $lines .= "$add: " . $target_adds{$add} . "n";
  413.         }
  414.     }
  415.     appendLines($lines) if ($lines);
  416.     $lines = join("n", values %rule_adds);
  417.     appendLines($lines) if ($lines);
  418.     my $found = 1;
  419.     while ($found) {
  420.         if ($MakefileData =~ m/n(.*)$(CXXFLAGS)(.*)n/) {
  421.             my $stuff_before = $1;
  422.             my $stuff_after = $2;
  423.             my $lookup = quotemeta("$1$(CXXFLAGS)$2");
  424.             my $replacement = "$1$(KCXXFLAGS)$2";
  425.             $MakefileData =~ s/$lookup/$replacement/;
  426.             $lookup =~ s/\$\(CXXFLAGS\)/\$\(KCXXFLAGS\)/;
  427.             $replacement = "$stuff_before$(KCXXFLAGS) $(KDE_CXXFLAGS)$stuff_after";
  428.             next if ($stuff_before =~ /$(KDE_CXXFLAGS)/ or $stuff_after =~ /$(KDE_CXXFLAGS)/);
  429.             substituteLine($lookup, $replacement);
  430.         } else {
  431.             $found = 0;
  432.         }
  433.     }
  434.     if($foreign_libtool == 0) {
  435.         $lookup = '(n[^#].*$(LIBTOOL) --mode=link) ($(CXXLD).*$(KCXXFLAGS))';
  436.         if ($MakefileData =~ m/$lookup/ ) {
  437.             $MakefileData =~ s/$lookup/$1 --tag=CXX $2/;
  438.         }
  439.         $lookup = '(n[^#].*$(LIBTOOL) --mode=compile)s+($(CXX)s+)';
  440.         if ($MakefileData =~ m/$lookup/ ) {
  441.             $MakefileData =~ s/$lookup/$1 --tag=CXX $2/;
  442.         }
  443.     }
  444.     $MakefileData =~ s/$(KCXXFLAGS)/$(CXXFLAGS)/g;
  445.     $lookup = '(.*)cp -pr $$/$$file $(distdir)/$$file(.*)';
  446.     if ($MakefileData =~ m/n$lookupn/) {
  447.         substituteLine($lookup, "$1cp -pr $$d/$$file $(distdir)/$$file$2");
  448.     }
  449.     # Always update the Makefile.in
  450.     updateMakefile ();
  451.     return;
  452. }
  453. #-----------------------------------------------------------------------------
  454. # Beware: This procedure is not complete.  E.g. it also parses lines
  455. # containing a '=' in rules (for instance setting shell vars).  For our
  456. # usage this us enough, though.
  457. sub read_variables ()
  458. {
  459.     while ($MakefileData =~ /ns*(S+)s*=([^n]*)/g) {
  460.         $varcontent{$1} = $2;
  461.     }
  462. }
  463. # Check to see whether we should process this make file.
  464. # This is where we look for tags that we need to process.
  465. # A small amount of initialising on the tags is also done here.
  466. # And of course we open and/or create the needed make files.
  467. sub initialise ()
  468. {
  469.     if (! -r "Makefile.am") {
  470. print STDOUT "found Makefile.in without Makefile.amn" if ($verbose);
  471. return 0;
  472.     }
  473.     # Checking for files to process...
  474.     open (FILEIN, $makefile) || die "Can't open $makefileDir/$makefile: $!n";
  475.     # perl bug in 5.8.0: in utf8 mode it badly screws up
  476.     binmode(FILEIN, ":bytes") if ($] >= 5.008);
  477.     # Read the file
  478.     # stat(FILEIN)[7] might look more elegant, but is slower as it 
  479.     # requires stat'ing the file
  480.     seek(FILEIN, 0, 2);
  481.     my $fsize = tell(FILEIN);
  482.     seek(FILEIN, 0, 0);
  483.     read FILEIN, $MakefileData, $fsize;
  484.     close FILEIN;
  485.     print "DOS CRLF within $makefileDir/$makefile!n" if($MakefileData =~ y/r//d);
  486.     # Remove the line continuations, but keep them marked
  487.     # Note: we lose the trailing spaces but that's ok.
  488.     # Don't mangle line-leading spaces (usually tabs)
  489.     # since they're important.
  490.     $MakefileData =~ s/\s*n/34/g;
  491.     # If we've processed the file before...
  492.     restoreMakefile ()      if ($MakefileData =~ /$progId/);
  493.     foreach $dir (@foreignfiles) {
  494.       if (substr($makefileDir,0,length($dir)) eq $dir) {
  495. return 0;
  496.       }
  497.     }
  498.     %kdeopts = ();
  499.     $kdeopts{"foreign"} = 0;
  500.     $kdeopts{"qtonly"} = 0;
  501.     $kdeopts{"noautodist"} = 0;
  502.     $kdeopts{"foreign-libtool"} = $foreign_libtool;
  503.     $kdeopts{"nofinal"} = !$use_final; # default
  504.     read_variables();
  505.     if ($MakefileData =~ /nKDE_OPTIONSs*=[ t]*([^n]*)n/) {
  506. my $kde_options_str = $1;
  507.         local @kde_options = split(/[34s]+/, $kde_options_str);
  508.         if (grep(/^foreign$/, @kde_options)) {
  509.             push(@foreignfiles, $makefileDir . "/");
  510.             return 0; # don't touch me
  511.         }
  512.         for $opt (@kde_options) {
  513.             if (!defined $kdeopts{$opt}) {
  514.                 print STDERR "Warning: unknown option $opt in $printnamen";
  515.             } else {
  516.                 $kdeopts{$opt} = 1;
  517.             }
  518.         }
  519.     }
  520.     # Look for the tags that mean we should process this file.
  521.     $metasourceTags = 0;
  522.     $metasourceTags++    while ($MakefileData =~ /n[^=#]*METASOURCESs*=/g);
  523.     my $pofileTag = 0;
  524.     $pofileTag++    while ($MakefileData =~ /nPOFILESs*=/g);
  525.     if ($pofileTag > 1)
  526.       {
  527.           print STDERR "Error: Only one POFILES tag allowedn";
  528.           $errorflag = 1;
  529.       }
  530.     while ($MakefileData =~ /n.SUFFIXES:([^n]+)n/g) {
  531. my $suffixes_str = $1;
  532. my @list=split(' ', $suffixes_str);
  533. foreach $ext (@list) {
  534.     if ($ext =~ /^.$cppExt$/) {
  535. $cxxsuffix = $ext;
  536. $cxxsuffix =~ s/.//g;
  537. print STDOUT "will use suffix $cxxsuffixn" if ($verbose);
  538. last;
  539.     }
  540. }
  541.     }
  542.     tag_KDEINIT();
  543.     while ($MakefileData =~ /n(S*)_OBJECTSs*=[34 t]*([^n]*)n/g) {
  544.         my $program = $1;
  545.         my $objs = $2; # safe them
  546.         my $ocv = 0;
  547.         my @objlist = split(/[34s]+/, $objs);
  548.         foreach $obj (@objlist) {
  549.             if ($obj =~ /(S*)$((S+))/ ) {
  550. my $pre = $1;
  551.                 my $variable = $2;
  552. if ($pre eq '' && exists($varcontent{$variable})) {
  553.     my @addlist = split(/[34s]+/, $varcontent{$variable});
  554.     push(@objlist, @addlist);
  555.                 } elsif ($variable !~ 'OBJEXT' && $variable !~ /am__objects_d+/ ) {
  556.                     $ocv = 1;
  557. }
  558.             }
  559.         }
  560.         next if ($ocv);
  561.         next if ($program =~ /^am_libkdeinit_/);
  562.         $program =~ s/^am_// if ($program =~ /^am_/);
  563.         my $sourceprogram = $program;
  564.         $sourceprogram =~ s/@am_/@/ if($sourceprogram =~ /^.*@am_.+/);
  565.         print STDOUT "found program $programn" if ($verbose);
  566.         push(@programs, $program);
  567.         $realObjs{$program} = $objs;
  568.         if ($MakefileData =~ /n$sourceprogram_SOURCESs*=[ t]*(.*)n/) {
  569.             $sources{$program} = $1;
  570.         } 
  571.         else {
  572.             $sources{$program} = "";
  573.             print STDERR "found program with no _SOURCES: $programn";
  574.         }
  575.         
  576.         my $realprogram = $program;
  577.         $realprogram =~ s/_/./g; # unmask to regexp
  578.         if ($MakefileData =~ /n($realprogram)($(EXEEXT)?)?:.*$($program_OBJECTS)/) {
  579.             $realname{$program} = $1;
  580.         } else {
  581.             # not standard Makefile - nothing to worry about
  582.             $realname{$program} = "";
  583.         }
  584.     }
  585.     my $lookup = 'DEPDIRs*=.*';
  586.     if ($MakefileData !~ /n$lookup/) {
  587.         $lookup = 'bindirs*=[ t]*.*';
  588.         substituteLine($lookup, "DEPDIR = .depsn$1") if ($MakefileData =~ /n($lookup)/);
  589.     }
  590.     my @marks = ('MAINTAINERCLEANFILES', 'CLEANFILES', 'DISTCLEANFILES');
  591.     foreach $mark (@marks) {
  592.         while ($MakefileData =~ /n($mark)s*=[ t]*([^n]*)/g) {
  593.     my $clean_str = $2; 
  594.             foreach $file (split('[34s]+', $clean_str)) {
  595.                 $file =~ s/.///;
  596.                 push(@cleanfiles, $file);
  597.             }
  598.         }
  599.     }
  600.     my $localTag = 0;
  601.     $localTag++ if ($MakefileData =~ /ninstall-S+-local:/);
  602.     
  603.     return (!$errorflag);
  604. }
  605. #-----------------------------------------------------------------------------
  606. # Gets the list of user defined directories - relative to $srcdir - where
  607. # header files could be located.
  608. sub tag_META_INCLUDES ()
  609. {
  610.     my $lookup = '[^=n]*META_INCLUDESs*=[ t]*(.*)';
  611.     return 1    if ($MakefileData !~ /($lookup)n/);
  612.     print STDOUT "META_INCLUDE processing <$1>n"       if ($verbose);
  613.     my $headerStr = $2;
  614.     removeLine ($lookup, $1);
  615.     my @headerlist = split(/[34s]+/, $headerStr);
  616.     foreach $dir (@headerlist)
  617.     {
  618.         $dir =~ s#$(srcdir)#.#;
  619.         if (! -d $dir)
  620.         {
  621.             print STDERR "Warning: $dir can't be found. ",
  622.                             "Must be a relative path to $(srcdir)n";
  623.         }
  624.         else
  625.         {
  626.             push (@headerdirs, $dir);
  627.         }
  628.     }
  629.     return 0;
  630. }
  631. #-----------------------------------------------------------------------------
  632. sub tag_FINAL()
  633. {
  634.     my @final_names = ();
  635.     
  636.     foreach $program (@programs) {
  637.         
  638.         if ($sources{$program} =~ /(/) {
  639.             print STDOUT "found ( in $program_SOURCES. skippingn" if ($verbose);
  640.             next;
  641.         }
  642.         my $mocs = "";       # Moc files (in this program)
  643. my $moc_cpp_added = 0;  # If we added some .moc.cpp files, due to
  644. # no other .cpp file including the .moc one.
  645.         
  646.         my @progsources = split(/[34s]+/, $sources{$program});
  647.         my %shash = ();
  648.         @shash{@progsources} = 1;  # we are only interested in the existence
  649.         my %sourcelist = ();
  650.         my %extradeps = ();
  651.         
  652.         foreach $source (@progsources) {
  653.             my $suffix = $source;
  654.             $suffix =~ s/^.*.([^.]+)$/$1/;
  655.             
  656.             $sourcelist{$suffix} .= "$source ";
  657.         }
  658.         foreach my $mocFile (keys (%globalmocs))
  659.         {
  660.             my ($dir, $hFile, $cppFile) = split ("35", $globalmocs{$mocFile}, 3);
  661.             if (defined ($cppFile)) {
  662.                 $mocs .= " $mocFile.moc" if exists $shash{$cppFile};
  663.             } else {
  664. $sourcelist{$cxxsuffix} .= "$mocFile.moc.$cxxsuffix ";
  665. $moc_cpp_added = 1;
  666.     }
  667.         }
  668.         # scan for extra given dependencies and add them to our target
  669.         while ($MakefileData =~ /ns*(S+).(?:lo|o)s*:([^n]*)/g) {
  670.             $extradeps{$1} = $2;
  671.         }
  672.         foreach $suffix (keys %sourcelist) {
  673.             # See if this file contains c++ code. (i.e., just check the file's suffix against c++ extensions)
  674.             my $suffix_is_cxx = 0;
  675.             if($suffix =~ /($cppExt)$/) {
  676.               $cxxsuffix = $1;
  677.               $suffix_is_cxx = 1;
  678.             }
  679.             
  680.             my $mocfiles_in = ($suffix eq $cxxsuffix) && $moc_cpp_added;
  681.             
  682.             my @sourcelist = split(/[34s]+/, $sourcelist{$suffix});
  683.             
  684.             if ((@sourcelist == 1 && !$mocfiles_in) || $suffix_is_cxx != 1 ) {
  685.                 
  686.                 # we support IDL on our own
  687.                 if ($suffix eq "skel" || $suffix =~ /^stub/
  688.     || $suffix =~ /^signals/ # obsolete, remove in KDE-4
  689.                     || $suffix eq "h" || $suffix eq "ui" 
  690.                     || $suffix eq "kcfgc" ) {
  691.                     next;
  692.                 }
  693.                 
  694.                 foreach $file (@sourcelist) {
  695.                     $file =~ s/Q$suffixE$//;
  696.                     
  697.                     $finalObjs{$program} .= $file;
  698.                     if ($program =~ /_la$/) {
  699.                         $finalObjs{$program} .= "lo ";
  700.                     } else {
  701.                         $finalObjs{$program} .= "o ";
  702.                     }
  703.                 }
  704.                 next; # suffix
  705.             }
  706.             
  707.             my $source_deps = "";
  708.             foreach $source (@sourcelist) {
  709.                 if (-f $source) {
  710.                     $source_deps .= " $(srcdir)/$source";
  711.                 } else {
  712.                     $source_deps .= " $source";
  713.                 }
  714.                 my $plainsource = $source;
  715.                 $plainsource =~ s/.$cppExt$//;
  716.                 $source_deps .= " " . $extradeps{$plainsource} if (exists($extradeps{$plainsource}));
  717.             }
  718.             $handling = "$program.all_$suffix.$suffix: $(srcdir)/Makefile.in" . $source_deps . " " . join(' ', $mocs)  . "n";
  719.             $handling .= "t@echo 'creating $program.all_$suffix.$suffix ...'; \n";
  720.             $handling .= "trm -f $program.all_$suffix.files $program.all_$suffix.final; \n";
  721.             $handling .= "techo "#define KDE_USE_FINAL 1" >> $program.all_$suffix.final; \n";
  722.             $handling .= "tfor file in " . $sourcelist{$suffix} . "; do \n";
  723.             $handling .= "t  echo "#include \"$$file\"" >> $program.all_$suffix.files; \n";
  724.             $handling .= "t  test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> $program.all_$suffix.final; \n";
  725.             $handling .= "tdone; \n";
  726.             $handling .= "tcat $program.all_$suffix.final $program.all_$suffix.files > $program.all_$suffix.$suffix; \n";
  727.             $handling .= "trm -f $program.all_$suffix.final $program.all_$suffix.filesn";
  728.             appendLines($handling);
  729.             push(@final_names, "$program.all_$suffix.$suffix");
  730.             my $finalObj = "$program.all_$suffix.";
  731.             if ($program =~ /_la$/) {
  732.                 $finalObj .= "lo";
  733.             } else {
  734.                 $finalObj .= "o";
  735.             }
  736.     $finalObjs{$program} .= $finalObj . " ";
  737.         }
  738.     }
  739.     
  740.     if (!$kdeopts{"nofinal"} && @final_names >= 1) {
  741.         # add clean-final target
  742.         my $lines = "$cleantarget-final:n";
  743.         $lines .= "t-rm -f " . join(' ', @final_names) . "n" if (@final_names);
  744.         appendLines($lines);
  745.         $target_adds{"$cleantarget-am"} .= "$cleantarget-final ";
  746.         
  747.         foreach $finalfile (@final_names) {
  748.             $finalfile =~ s/.[^.]*$/.P/;
  749.             $dep_finals .= " $(DEPDIR)/$finalfile";
  750.         }
  751.     }
  752. }
  753. sub tag_KDEINIT()
  754. {
  755.     my @progs = ();
  756.     my $ltlibs = "";
  757.     my $lookup = 'kdeinit_LTLIBRARIESs*=[ t]*(.*)';
  758.     if ($MakefileData =~ m/n$lookup/) {
  759. @kdeinits = split(/[34s]+/, $1);
  760. my $lines = "";
  761. foreach my $kdeinit (@kdeinits) {
  762.     if ($kdeinit =~ m/.la$/) {
  763. $kdeinit =~ s/.la$//;
  764.                 push(@progs, $kdeinit);
  765.                 $lines .= "n${kdeinit}.la.$cxxsuffix:n";
  766.                 $lines .= "techo 'extern "C" int kdemain(int argc, char* argv[]);' > ${kdeinit}.la.$cxxsuffix; \n";
  767.                 $lines .= "techo 'int main(int argc, char* argv[]) { return kdemain(argc,argv); }' >> ${kdeinit}.la.$cxxsuffixn";
  768.                 $lines .= "n${kdeinit}_dummy.$cxxsuffix:n";
  769.                 $lines .= "techo '#include <kdemacros.h>' > ${kdeinit}_dummy.$cxxsuffix; \n";
  770.                 $lines .= "techo 'extern "C" int kdemain(int argc, char* argv[]);' >> ${kdeinit}_dummy.$cxxsuffix; \n";
  771.                 $lines .= "techo 'extern "C" KDE_EXPORT int kdeinitmain(int argc, char* argv[]) { return kdemain(argc,argv); }' >> ${kdeinit}_dummy.$cxxsuffixn";
  772.                 push(@cleanfiles, "${kdeinit}.la.$cxxsuffix");
  773.                 push(@cleanfiles, "${kdeinit}_dummy.$cxxsuffix");
  774.                 # add dependency
  775.                 $dep_files .= " $(DEPDIR)/${kdeinit}.la.Po" if($dep_files !~/${kdeinit}.la.Po/ );
  776.                 $dep_files .= " $(DEPDIR)/${kdeinit}_dummy.Plo" if($dep_files !~/${kdeinit}_dummy.Plo/ );
  777.                 # make library
  778.                 $lookup = $kdeinit . '_la_LIBADDs*=[ t]*(.*)';
  779.                 if($MakefileData =~ m/n$lookup/) {
  780.                     my $libadd = $1;
  781.                     substituteLine($lookup, "${kdeinit}_la_LIBADD = libkdeinit_${kdeinit}.la");
  782.                     appendLines("libkdeinit_${kdeinit}_la_LIBADD = $libaddn");
  783.                 }
  784.                 appendLines("libkdeinit_${kdeinit}_la_LDFLAGS = -no-undefined -avoid-version $(all_libraries)n");
  785.                 # add library dependencies
  786.                 $lookup = $kdeinit . '_la_DEPENDENCIESs*=[ t]*(.*)';
  787.                 if($MakefileData =~ m/n$lookup/) {
  788.                     my $libdeps = $1;
  789.                     substituteLine($lookup, "${kdeinit}_la_DEPENDENCIES = libkdeinit_${kdeinit}.la");
  790.                     appendLines("libkdeinit_${kdeinit}_la_DEPENDENCIES = $libdepsn");
  791.                 }
  792.                 # make library objects
  793.                 $lookup = "am_${kdeinit}_la_OBJECTS" . 's*=[ t]*(.*)';
  794.                 if($MakefileData =~ m/n$lookup/) {
  795.                     my $libobjects = $1;
  796.                     substituteLine($lookup, "am_${kdeinit}_la_OBJECTS = ${kdeinit}_dummy.lo");
  797.                     appendLines("am_libkdeinit_${kdeinit}_la_OBJECTS = $libobjectsn");
  798.                     my $prog = "libkdeinit_${kdeinit}_la";
  799.                     push(@programs, $prog);
  800.                     $realObjs{$prog} = $libobjects;
  801.                     $realname{$prog} = "libkdeinit_${kdeinit}.la";
  802.                 }
  803.                 $target_adds{"libkdeinit_${kdeinit}.la"} = "$(libkdeinit_${kdeinit}_la_OBJECTS) $(libkdeinit_${kdeinit}_la_DEPENDENCIES)n" .
  804.                         "t$(CXXLINK) -rpath $(libdir) $(libkdeinit_${kdeinit}_la_LDFLAGS) ".
  805.                            "$(libkdeinit_${kdeinit}_la_OBJECTS) " .
  806.                            "$(libkdeinit_${kdeinit}_la_LIBADD) " .
  807.                            "$(LIBS)n";
  808.                 # make libkdeinit sources
  809.                 $lookup = $kdeinit . '_la_SOURCESs*=[ t]*(.*)';
  810.                 if($MakefileData =~ m/n$lookup/) {
  811.                     my $srces = $1;
  812.                     $sources_changed{"libkdeinit_${kdeinit}_la"} = 1;
  813.                     $sources{"libkdeinit_${kdeinit}_la"} = $srces;
  814.                 }
  815.                 # make libkdeinit metasources
  816.                 $lookup = $kdeinit . '_la_METASOURCESs*=[ t]*(.*)';
  817.                 substituteLine($lookup, "libkdeinit_${kdeinit}_la_METASOURCES = $1")
  818.                     if($MakefileData =~ m/n$lookup/);
  819. =cut
  820.                 # make binary sources
  821.                 $lookup = $kdeinit. '_SOURCESs*=[ t]*(.*)';
  822.                 if($MakefileData =~ m/n$lookup/) {
  823.                     substituteLine($lookup, "${kdeinit}_SOURCES = ${kdeinit}.la.$cxxsuffix");
  824.                     $lookup = 'SOURCESs*=[ t]*(.*)';
  825.                     if($MakefileData =~ m/n$lookup/) {
  826.                         my $srces = $1;
  827.                         $srces =~ s/b$kdeinit.cb/$(${kdeinit}_SOURCES)/;
  828.                         $srces =~ s/$(${kdeinit}_la_SOURCES)/$(libkdeinit_${kdeinit}_la_SOURCES)/;
  829.                         substituteLine($lookup, "SOURCES = $srces");
  830.                     }
  831.                     $lookup = 'DIST_SOURCESs*=[ t](.*)';
  832.                     if($MakefileData =~ m/n$lookup/) {
  833.                         my $srces = $1;
  834.                         $srces =~ s/b$kdeinit.cb/$(${kdeinit}_SOURCES)/;
  835.                         $srces =~ s/$(${kdeinit}_la_SOURCES)/$(libkdeinit_${kdeinit}_la_SOURCES)/;
  836.                         substituteLine($lookup, "DIST_SOURCES = $srces");
  837.                     }
  838.                 }
  839.                 # make binary objects / libs
  840.                 $lookup = $kdeinit . '_OBJECTSs*=[ t]*.*';
  841.                 if($MakefileData =~ m/n$lookup/) {
  842.                     $realObjs{$kdeinit} = "${kdeinit}.la.$(OBJEXT)";
  843.                     substituteLine("${kdeinit}_LDFLAGS\s*=.*", "${kdeinit}_LDFLAGS = $(all_libraries)");
  844.                     substituteLine("${kdeinit}_LDADD\s*=.*", "${kdeinit}_LDADD = libkdeinit_${kdeinit}.la");
  845.                     substituteLine("${kdeinit}_DEPENDENCIES\s*=.*", "${kdeinit}_DEPENDENCIES = libkdeinit_${kdeinit}.la");
  846.                 }
  847. =cut
  848.                 # add binary
  849.                 push(@programs, $kdeinit);
  850.                 $realObjs{$kdeinit} = "${kdeinit}.la.$(OBJEXT)";
  851.                 $realname{$kdeinit} = $kdeinit;
  852.                 $sources{$kdeinit} = "${kdeinit}.la.$cxxsuffix";
  853.                 $lines .= "${kdeinit}_LDFLAGS = $(KDE_RPATH) -no-undefined $(all_libraries)n";
  854.                 $lines .= "${kdeinit}_LDADD = libkdeinit_${kdeinit}.lan";
  855.                 $lines .= "${kdeinit}_DEPENDENCIES = libkdeinit_${kdeinit}.lan";
  856.                 $target_adds{"${kdeinit}$(EXEEXT)"} =
  857.                           "$(${kdeinit}_OBJECTS) $(${kdeinit}_DEPENDENCIES)n" .
  858.                           "t@rm -f ${kdeinit}$(EXEEXT)n" .
  859.                           "t$(CXXLINK) $(${kdeinit}_LDFLAGS) $(${kdeinit}_OBJECTS) $(${kdeinit}_LDADD) $(LIBS)n";
  860.                 $ltlibs .= " libkdeinit_${kdeinit}.la";
  861.     }
  862.         }
  863.         appendLines($lines);
  864.         # add libkdeinit target
  865.         $lookup = 'lib_LTLIBRARIESs*=[ t]*(.*)';
  866.         if($MakefileData =~ m/n$lookup/) {
  867.             substituteLine($lookup, "lib_LTLIBRARIES = $1 $ltlibs");
  868.         }
  869.         else {
  870.             print STDERR
  871.                 "Error: lib_LTLIBRARIES missing in $printname (required for kdeinit_LTLIBRARIES).n";
  872.             $errorflag = 1;
  873.         }
  874.     }
  875.     if($#progs >= 0) {
  876.         if($MakefileData !~ m/nbin_PROGRAMSs*=/) {
  877.             print STDERR "Error: bin_PROGRAMS missing in $printname (required for kdeinit_LTLIBRARIES).n";
  878.             $errorflag = 1;
  879.         }
  880.         else {
  881.             # add our new progs to SOURCES, DIST_SOURCES and bin_PROGRAMS
  882.             my $progsources = "";
  883.             my $progexes = "";
  884.             foreach my $p (@progs) {
  885.                 $progsources .= "$(${p}_SOURCES) ";
  886.                 $progexes .= "${p}$(EXEEXT) ";
  887.             }
  888.             $lookup = 'SOURCESs*=[ t]*(.*)';
  889.             if($MakefileData =~ /n$lookup/) {
  890.                 substituteLine($lookup, "SOURCES = $1 $progsources");
  891.             }
  892.             $lookup = 'DIST_SOURCESs*=[ t]*(.*)';
  893.             if($MakefileData =~ /n$lookup/) {
  894.                 substituteLine($lookup, "DIST_SOURCES = $1 $progsources");
  895.             }
  896.             # bin_PROGRAMS is complicated, as it exists twice, so we do a little
  897.             # magic trick here
  898.             $lookup = 'PROGRAMSs*=[ t]*(.*)';
  899.             if ($MakefileData =~ /n$lookup/) {
  900.                 substituteLine($lookup, "bin_PROGRAMS += $progexesnPROGRAMS = $1");
  901.             }
  902.         }
  903.     }
  904. }
  905. #-----------------------------------------------------------------------------
  906. sub tag_COMPILE_FIRST()
  907. {
  908.   foreach $program (@programs) {
  909.     my $lookup = "$program" . '_COMPILE_FIRSTs*=[ t]*(.*)';
  910.     if ($MakefileData =~ m/n$lookupn/) {
  911.       my $compilefirst_str = $1;
  912.       my @compilefirst = split(/[34s]+/, $compilefirst_str);
  913.       my @progsources = split(/[34s]+/, $sources{$program});
  914.       my %donesources = ();
  915.       foreach $source (@progsources) {
  916.         my @deps  = ();
  917.         my $sdeps = "";
  918.         if (-f $source) {
  919.           $sdeps = "$(srcdir)/$source";
  920.         } else {
  921.           $sdeps = "$source";
  922.         }
  923.         foreach $depend (@compilefirst) {
  924.           next if ($source eq $depend);
  925.           # avoid cyclic dependencies
  926.           next if defined($donesources{$depend});
  927.           push @deps, $depend;
  928.         }
  929.         $target_adds{$sdeps} .= join(' ', @deps) . ' ' if (@deps);
  930.         $donesources{$source} = 1;
  931.       }
  932.     }
  933.   }
  934. }
  935. #-----------------------------------------------------------------------------
  936. # Organises the list of headers that we'll use to produce moc files
  937. # from.
  938. sub tag_METASOURCES ()
  939. {
  940.     local @newObs           = ();  # here we add to create object files
  941.     local @depend           = ();  # here we add to create moc files
  942.     local $mocExt           = ".moc";
  943.     local %mocFiles         = ();
  944.     my $line = "";
  945.     my $postEqual = "";
  946.     my $lookup;
  947.     my $found = "";
  948.     if ($metasourceTags > 1) {
  949. $lookup = $program . '_METASOURCESs*=s*(.*)';
  950. return 1    if ($MakefileData !~ /n($lookup)n/);
  951. $found = $1;
  952.     } else {
  953. $lookup = $program . '_METASOURCESs*=s*(.*)';
  954. if ($MakefileData !~ /n($lookup)n/) {
  955.     $lookup = 'METASOURCESs*=s*(.*)';
  956.     return 1    if ($MakefileData !~ /n($lookup)n/);
  957.     $found = $1;
  958.     $metasourceTags = 0; # we can use the general target only once
  959. } else {
  960.             $found = $1;
  961.         }
  962.     }
  963.     print STDOUT "METASOURCE processing <$found>)n"      if ($verbose);
  964.     
  965.     $postEqual = $found;
  966.     $postEqual =~ s/[^=]*=//;
  967.     
  968.     removeLine ($lookup, $found);
  969.     
  970.     # Always find the header files that could be used to "moc"
  971.     return 1    if (findMocCandidates ());
  972.     
  973.     if ($postEqual =~ /AUTOs*(S*)|USE_AUTOMOCs*(S*)/)
  974.     {
  975. print STDERR "$printname: the argument for AUTO|USE_AUTOMOC is obsolete" if ($+);
  976. $mocExt = ".moc.$cxxsuffix";
  977. $haveAutomocTag = 1;
  978.     }
  979.     else
  980.     {
  981.         # Not automoc so read the list of files supplied which
  982.         # should be .moc files.
  983.         $postEqual =~ tr/34/ /;
  984.         # prune out extra headers - This also checks to make sure that
  985.         # the list is valid.
  986.         pruneMocCandidates ($postEqual);
  987.     }
  988.     checkMocCandidates ();
  989.     
  990.     if (@newObs) {
  991.         my $ext =  ($program =~ /_la$/) ? ".moc.lo " : ".moc.o ";
  992.         $realObjs{$program} .= "34" . join ($ext, @newObs) . $ext;
  993.         $dependmocs{$program} = join (".moc.$cxxsuffix " , @newObs) . ".moc.$cxxsuffix";
  994.         foreach $file (@newObs) {
  995.             $dep_files .= " $(DEPDIR)/$file.moc.P" if($dep_files !~/$file.moc.P/);
  996.         }
  997.     }
  998.     if (@depend) {
  999.         $dependmocs{$program} .= " ";
  1000.         $dependmocs{$program} .= join('.moc ', @depend) . ".moc";
  1001.         $dependmocs{$program} .= " ";
  1002.     }
  1003.     addMocRules ();
  1004.     @globalmocs{keys %mocFiles}=values %mocFiles;
  1005. }
  1006. #-----------------------------------------------------------------------------
  1007. # Returns 0 if the line was processed - 1 otherwise.
  1008. # Errors are logged in the global $errorflags
  1009. sub tag_AUTOMAKE ()
  1010. {
  1011.     my $lookup = '.*cd $(top_srcdir)s+&&[34s]+$(AUTOMAKE)(.*)';
  1012.     return 1    if ($MakefileData !~ /n($lookup)n/);
  1013.     print STDOUT "AUTOMAKE processing <$1>n"        if ($verbose);
  1014.     my $newLine = $1."ntcd $(top_srcdir) && perl $thisProg $printname";
  1015.     # automake 1.8.x adds another automake call. *sigh*
  1016.     $newLine =~ s/;([34s]+cds+$(srcdir)s+&&[34s]+$(AUTOMAKE).*)[34s]+&&[34s]+exit[34s]+0;([34s]+exits+1)/; 34 ( $1 ) || exit 1; echo ' cd $(top_srcdir) && perl $thisProg '; cd $(top_srcdir) && perl $thisProg && exit 0; $2/;
  1017.     substituteLine ($lookup, $newLine);
  1018.     $automkCall = $1;
  1019.     $lookup = '.*cd $(srcdir)s+&&[34s]+$(AUTOCONF)(.*)';
  1020.     if ($MakefileData =~ /n($lookup)n/) {
  1021.       $newLine  = "tcd $(srcdir) && rm -f configuren";
  1022.       $newLine .= "tcd $(top_srcdir) && $(MAKE) -f admin/Makefile.common configure";
  1023.       substituteLine ($lookup, $newLine);
  1024.     }
  1025.     return 0;
  1026. }
  1027. #-----------------------------------------------------------------------------
  1028. sub handle_TOPLEVEL()
  1029. {
  1030.     my $pofiles = "";
  1031.     my @restfiles = ();
  1032.     opendir (THISDIR, ".");
  1033.     foreach $entry (readdir(THISDIR)) {
  1034.         next if (-d $entry);
  1035.         
  1036.         next if ($entry eq "CVS" || $entry =~ /^./  || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^#.*#$/ || $entry =~ /.gmo$/);
  1037.                  
  1038.         if ($entry =~ /.po$/) {
  1039.              next;
  1040.         }
  1041.         push(@restfiles, $entry);
  1042.     }
  1043.     closedir (THISDIR);
  1044.             
  1045.     if (@restfiles) {
  1046.         $target_adds{"install-data-am"} .= "install-nls-files ";
  1047.         $lines = "install-nls-files:n";
  1048.         $lines .= "t$(mkinstalldirs) $(DESTDIR)$(kde_locale)/$kdelangn";
  1049.         for $file (@restfiles) {
  1050.             $lines .= "t$(INSTALL_DATA) $(srcdir)/$file $(DESTDIR)$(kde_locale)/$kdelang/$filen";
  1051.         }
  1052. $target_adds{"uninstall"} .= "uninstall-nls-files ";
  1053.         $lines .= "uninstall-nls-files:n";
  1054.         for $file (@restfiles) {
  1055.             $lines .= "t-rm -f $(DESTDIR)$(kde_locale)/$kdelang/$filen";
  1056.         }
  1057.         appendLines($lines);
  1058.     }
  1059.     
  1060.     return 0;
  1061. }
  1062. #-----------------------------------------------------------------------------
  1063. sub tag_SUBDIRS ()
  1064. {
  1065.   if ($MakefileData !~ /nSUBDIRSs*=s*$(AUTODIRS)s*n/) {
  1066.     return 1;
  1067.   }
  1068.   my $subdirs = ".";
  1069.   opendir (THISDIR, ".");
  1070.   foreach $entry (readdir(THISDIR)) {
  1071.     next if ($entry eq "CVS" || $entry =~ /^./);
  1072.     if (-d $entry && -f $entry . "/Makefile.am") {
  1073.       $subdirs .= " $entry";
  1074.       next;
  1075.     }
  1076.   }
  1077.   closedir (THISDIR);
  1078.   substituteLine('SUBDIRSs*=.*', "SUBDIRS =$subdirs");
  1079.   return 0;
  1080. }
  1081. sub tag_IDLFILES ()
  1082. {
  1083.     my @psources = split(/[34s]+/, $sources{$program});
  1084.     my $dep_lines = "";
  1085.     my @cppFiles = ();
  1086.     
  1087.     foreach $source (@psources) {
  1088.         my $skel = ($source =~ m/.skel$/);
  1089.         my $stub = ($source =~ m/.stub$/);
  1090.         my $signals = ($source =~ m/.signals$/); # obsolete, remove in KDE-4
  1091.         
  1092.         if ($stub || $skel || $signals) {
  1093.             my $qs = quotemeta($source);
  1094.             $sources{$program} =~ s/$qs//;
  1095.             $sources_changed{$program} = 1;
  1096.             $source =~ s/.(stub|skel|signals)$//;
  1097.             my $sourcename;
  1098.             if ($skel) {
  1099.                 $sourcename = "$source_skel";
  1100.             } elsif ($stub) {
  1101.                 $sourcename = "$source_stub";
  1102.             } else {
  1103.                 $sourcename = "$source_signals";
  1104.             }
  1105.             
  1106.             my $sourcedir = '';
  1107.             if (-f "$makefileDir/$source.h") {
  1108.                 $sourcedir = '$(srcdir)/';
  1109.             } else {
  1110.                 if ($MakefileData =~ /n$source_DIRs*=s*(S+)n/) {
  1111.                     $sourcedir = $1;
  1112.                     $sourcedir .= "/" if ($sourcedir !~ //$/);
  1113.                 }
  1114.             }
  1115.             
  1116.             if ($allidls !~ /$source_kidl/) {
  1117.                 
  1118.                 $use_ng = ($MakefileData =~ /n$source_DCOPIDLNGs*=s*(S+)n/);
  1119.                 $dcopidl =  $use_ng ? "KDECONFIG="$(KDECONFIG)" $(DCOPIDLNG)" : "$(DCOPIDL)";
  1120.                 $dep_lines .= "$source.kidl: $sourcedir$source.h $(DCOP_DEPENDENCIES)n";
  1121.                 $dep_lines .= "t$dcopidl $sourcedir$source.h > $source.kidl || ( rm -f $source.kidl ; false )n";
  1122.                 
  1123.                 $allidls .= $source . "_kidl ";
  1124.             }
  1125.             
  1126.             if ($allidls !~ /$sourcename/) {
  1127.                 
  1128.                 $dep_lines_tmp = "";
  1129.                 if ($skel) {
  1130.                     $dep_lines .= "$sourcename.$cxxsuffix: $source.kidln";
  1131.                     $dep_lines .= "t$(DCOPIDL2CPP) --c++-suffix $cxxsuffix --no-signals --no-stub $source.kidln";
  1132.                 } elsif ($stub) {
  1133.                     $dep_lines_tmp = "t$(DCOPIDL2CPP) --c++-suffix $cxxsuffix --no-signals --no-skel $source.kidln";
  1134.                 } else { # signals - obsolete, remove in KDE 4
  1135.                     $dep_lines_tmp = "t$(DCOPIDL2CPP) --c++-suffix $cxxsuffix --no-stub --no-skel $source.kidln";
  1136.                 }
  1137.                 if ($stub || $signals) {
  1138.                     $target_adds{"$sourcename.$cxxsuffix"} .= "$sourcename.h ";
  1139.                     $dep_lines .= "$sourcename.h: $source.kidln";
  1140.                     $dep_lines .= $dep_lines_tmp;
  1141.                 }
  1142.                 
  1143.                 $allidls .= $sourcename . " ";
  1144.             }
  1145.             
  1146.             $idlfiles{$program} .= $sourcename . " ";
  1147.             
  1148.             if ($program =~ /_la$/) {
  1149.                 $realObjs{$program} .= " $sourcename.lo";
  1150.             } else {
  1151.                 $realObjs{$program} .= " $sourcename.$(OBJEXT)";
  1152.             }
  1153.             $sources{$program} .= " $sourcename.$cxxsuffix";
  1154.             $sources_changed{$program} = 1;
  1155.             $important{$program} .= "$sourcename.h " if (!$skel);
  1156.             $idl_output .= "\nt$sourcename.$cxxsuffix $sourcename.h $source.kidl ";
  1157.             push(@cleanfiles, "$sourcename.$cxxsuffix");
  1158.             push(@cleanfiles, "$sourcename.h");
  1159.             push(@cleanfiles, "$sourcename.kidl");
  1160.             $dep_files .= " $(DEPDIR)/$sourcename.P" if ($dep_files !~/$sourcename.P/);
  1161.         }
  1162.     }
  1163.     if ($dep_lines) {
  1164.         appendLines($dep_lines);
  1165.     }
  1166.     
  1167.     if (0) {
  1168.         my $lookup = "($program)";
  1169.         $lookup .= '(|$(EXEEXT))';
  1170.         $lookup =~ s/_/./g;
  1171.         $lookup .= ":(.*..$program_OBJECTS..*)";
  1172.         #    $lookup = quotemeta($lookup);
  1173.         if ($MakefileData =~ /n$lookupn/) {
  1174.             
  1175.             my $line = "$1$2: ";
  1176.             foreach $file (split(' ', $idlfiles{$program})) {
  1177.                 $line .= "$file.$cxxsuffix ";
  1178.             }
  1179.             $line .= $3;
  1180.             substituteLine($lookup, $line);
  1181.         } else {
  1182.             print STDERR "no built dependency found $lookupn";
  1183.         }
  1184.     }
  1185. }
  1186. sub tag_UIFILES ()
  1187. {
  1188.     my @psources = split(/[34s]+/, $sources{$program});
  1189.     my @depFiles = ();
  1190.     
  1191.     foreach $source (@psources) {
  1192.         if ($source =~ m/.ui$/) {
  1193.             print STDERR "adding UI file $sourcen" if ($verbose);
  1194.             my $qs = quotemeta($source);
  1195.             $sources{$program} =~ s/$qs//;
  1196.             $sources_changed{$program} = 1;
  1197.       
  1198.             $source =~ s/.ui$//;
  1199.             my $sourcedir = '';
  1200.             if (-f "$makefileDir/$source.ui") {
  1201.                 $sourcedir = '$(srcdir)/';
  1202.             }
  1203.             if (!$uiFiles{$source}) {
  1204.                 my $dep_lines = "$source.$cxxsuffix: $sourcedir$source.ui $source.h $source.mocn";
  1205.                 $dep_lines .= "trm -f $source.$cxxsuffixn";
  1206.                 if (!$kdeopts{"qtonly"}) {
  1207.                     $dep_lines .= "techo '#include <kdialog.h>' > $source.$cxxsuffixn";
  1208.                     $dep_lines .= "techo '#include <klocale.h>' >> $source.$cxxsuffixn";
  1209.                     my ($mangled_source) = $source;
  1210.                     $mangled_source =~ s/[^A-Za-z0-9]/_/g;  # get rid of garbage
  1211.                     $dep_lines .= "t$(UIC) -tr ${UIC_TR} -i $source.h $sourcedir$source.ui > $source.$cxxsuffix.temp ; ret=$$?; \n";
  1212.                     $dep_lines .= "t$(PERL) -pe "s,${UIC_TR}( \"\" ),QString::null,g" $source.$cxxsuffix.temp | $(PERL) -pe "s,${UIC_TR}( \"\"\, \"\" ),QString::null,g" | $(PERL) -pe "s,image([0-9][0-9]*)_data,img\$$1_" . $mangled_source . ",g" | $(PERL) -pe "s,: QWizard\(,: KWizard(,g" >> $source.$cxxsuffix ;\n";
  1213.     $dep_lines .= "trm -f $source.$cxxsuffix.temp ;\n";
  1214.                 } else {
  1215.                     $dep_lines .= "t$(UIC) -i $source.h $sourcedir$source.ui > $source.$cxxsuffix; ret=$$?; \n";
  1216.                 }
  1217. $dep_lines .= "tif test "$$ret" = 0; then echo '#include "$source.moc"' >> $source.$cxxsuffix; else rm -f $source.$cxxsuffix ; exit $$ret ; finn";
  1218.                 $dep_lines .= "$source.h: $sourcedir$source.uin";
  1219.                 $dep_lines .= "trm -rf $source.h;n";
  1220.                 if (!$kdeopts{"qtonly"}) {
  1221.                     $dep_lines .= "t$(UIC) $sourcedir$source.ui | $(PERL) -pi -e "s,public QWizard,public KWizard,g; s,#include <qwizard.h>,#include <kwizard.h>,g" >> $source.h ;n";
  1222.                 } else {
  1223.                     $dep_lines .= "t$(UIC) -o $source.h $sourcedir$source.uin";
  1224.                 }
  1225.                 $dep_lines .= "$source.moc: $source.hn";
  1226.                 $dep_lines .= "t$(MOC) $source.h -o $source.mocn";
  1227.                 $rule_adds{"$source.$cxxsuffix"} = $dep_lines;
  1228. $uiFiles{$source} = 1;
  1229.                 $dependmocs{$program} .= " $source.moc";
  1230.                 $globalmocs{$source} = "35$source.h35$source.cpp";
  1231.             }
  1232.             
  1233.             if ($program =~ /_la$/) {
  1234.                 $realObjs{$program} .= " $source.lo";
  1235.             } else {
  1236.                 $realObjs{$program} .= " $source.$(OBJEXT)";
  1237.             }
  1238.             $sources{$program} .= " $source.$cxxsuffix";
  1239.             $sources_changed{$program} = 1;
  1240.             $important{$program} .= "$source.h ";
  1241.             $ui_output .= "\nt$source.$cxxsuffix $source.h $source.moc ";
  1242.             push(@cleanfiles, "$source.$cxxsuffix");
  1243.             push(@cleanfiles, "$source.h");
  1244.             push(@cleanfiles, "$source.moc");
  1245.             $dep_files .= " $(DEPDIR)/$source.P" if($dep_files !~/$source.P/ );
  1246.         }
  1247.     }
  1248. }
  1249. sub tag_KCFGFILES ()
  1250. {
  1251.     my @psources = split(/[34s]+/, $sources{$program});
  1252.     my @depFiles = ();
  1253.     
  1254.     foreach $source (@psources) {
  1255.         if ($source =~ m/.kcfgc$/) {
  1256.             print STDERR "adding KCFG file $sourcen" if ($verbose);
  1257.             my $qs = quotemeta($source);
  1258.             $sources{$program} =~ s/$qs//;
  1259.             $sources_changed{$program} = 1;
  1260.       
  1261.             $source =~ s/.kcfgc$//;
  1262.             my $sourcedir = '';
  1263.             if (-f "$makefileDir/$source.kcfgc") {
  1264.                 $sourcedir = '$(srcdir)/';
  1265.             }
  1266.             if (!$kcfgFiles{$source}) {
  1267.                 $kcfg = "$program.kcfg";
  1268.                 findKcfgFile("$source.kcfgc");
  1269.                 my $fixsuffix = "";
  1270.                 $fixsuffix = "else mv $source.cpp $source.$cxxsuffix ; " 
  1271.                     unless "cpp" eq $cxxsuffix;
  1272.                 my $dep_lines = "$source.$cxxsuffix: $source.hn";
  1273.                 $dep_lines .= "$source.h: $sourcedir$kcfg $sourcedir$source.kcfgc $(KCFG_DEPENDENCIES)n";
  1274.                 $dep_lines .= "t$(KCONFIG_COMPILER) $sourcedir$kcfg $sourcedir$source.kcfgc; ret=$$?; \n";
  1275. $dep_lines .= "tif test "$$ret" != 0; then rm -f $source.h ; exit $$ret ; $fixsuffix finn";
  1276.                 $rule_adds{"$source.$cxxsuffix"} = $dep_lines;
  1277. $kcfgFiles{$source} = 1;
  1278.             }
  1279.             
  1280.             if ($program =~ /_la$/) {
  1281.                 $realObjs{$program} .= " $source.lo";
  1282.             } else {
  1283.                 $realObjs{$program} .= " $source.$(OBJEXT)";
  1284.             }
  1285.             $sources{$program} .= " $source.$cxxsuffix";
  1286.             $sources_changed{$program} = 1;
  1287.             $important{$program} .= "$source.h ";
  1288.             $kcfg_output .= "\nt$source.$cxxsuffix $source.h ";
  1289.             push(@cleanfiles, "$source.$cxxsuffix");
  1290.             push(@cleanfiles, "$source.h");
  1291.             $dep_files .= " $(DEPDIR)/$source.P" if($dep_files !~/$source.P/ );
  1292.         }
  1293.     }
  1294. }
  1295. sub tag_ICON()
  1296. {
  1297.     my $lookup = '([^s]*)_ICONs*=[ t]*(.*)';
  1298.     my $install = "";
  1299.     my $uninstall = "";
  1300.     while ($MakefileData =~ /n$lookup/g) {
  1301.         my $destdir;
  1302.         if ($1 eq "KDE") {
  1303.             $destdir = "kde_icondir";
  1304.         } else {
  1305.             $destdir = $1 . "dir";
  1306.         }
  1307.         my $iconauto = ($2 =~ /AUTOs*$/);
  1308.         my @appnames = ();
  1309.         if ( ! $iconauto ) {
  1310.     my $appicon_str = $2;
  1311.             my @_appnames = split(" ", $appicon_str);
  1312.             print STDOUT "KDE_ICON processing <@_appnames>n"   if ($verbose);
  1313.             foreach $appname (@_appnames) {
  1314.                 push(@appnames, quotemeta($appname));
  1315.             }
  1316.         } else {
  1317.             print STDOUT "KDE_ICON processing <AUTO>n"   if ($verbose);
  1318.         }
  1319.         my @files = ();
  1320.         opendir (THISDIR, ".");
  1321.         foreach $entry (readdir(THISDIR)) {
  1322.             next if ($entry eq "CVS" || $entry =~ /^./  || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^#.*#$/);
  1323.             next if (! -f $entry);
  1324.             if ( $iconauto )
  1325.               {
  1326.                   push(@files, $entry)
  1327.                     if ($entry =~ /.xpm/ || $entry =~ /.png/ || $entry =~ /.mng/ || $entry =~ /.svg/);
  1328.               } else {
  1329.                   foreach $appname (@appnames) {
  1330.                       push(@files, $entry)
  1331.                         if ($entry =~ /-$appname.xpm/ || $entry =~ /-$appname.png/ || $entry =~ /-$appname.mng/ || $entry =~ /-$appname.svg/);
  1332.                   }
  1333.               }
  1334.         }
  1335.         closedir (THISDIR);
  1336.         
  1337.         my %directories = ();
  1338.         
  1339.         foreach $file (@files) {
  1340.             my $newfile = $file;
  1341.             my $prefix = $file;
  1342.             $prefix =~ s/.(png|xpm|mng|svg|svgz)$//;
  1343.             my $appname = $prefix;
  1344.             $appname =~ s/^[^-]+-// if ($appname =~ /-/) ;
  1345.             $appname =~ s/^[^-]+-// if ($appname =~ /-/) ;
  1346.             $appname = quotemeta($appname);
  1347.             $prefix =~ s/$appname$//;
  1348.             $prefix =~ s/-$//;
  1349.             
  1350.             $prefix = 'lo16-app' if ($prefix eq 'mini');
  1351.             $prefix = 'lo32-app' if ($prefix eq 'lo');
  1352.             $prefix = 'hi48-app' if ($prefix eq 'large');
  1353.             $prefix .= '-app' if ($prefix =~ m/^...$/);
  1354.             
  1355.             my $type = $prefix;
  1356.             $type =~ s/^.*-([^-]+)$/$1/;
  1357.             $prefix =~ s/^(.*)-[^-]+$/$1/;
  1358.             
  1359.             my %type_hash =
  1360.               (
  1361.                'action' => 'actions',
  1362.                'app' => 'apps',
  1363.                'device' => 'devices',
  1364.                'filesys' => 'filesystems',
  1365.                'mime' => 'mimetypes'
  1366.               );
  1367.             if (! defined $type_hash{$type} ) {
  1368.                 print STDERR "unknown icon type $type in $printname ($file)n";
  1369.                 next;
  1370.             }
  1371.             my %dir_hash =
  1372.               (
  1373.                'los' => 'locolor/16x16',
  1374.                'lom' => 'locolor/32x32',
  1375.                'him' => 'hicolor/32x32',
  1376.                'hil' => 'hicolor/48x48',
  1377.                'lo16' => 'locolor/16x16',
  1378.                'lo22' => 'locolor/22x22',
  1379.                'lo32' => 'locolor/32x32',
  1380.                'hi16' => 'hicolor/16x16',
  1381.                'hi22' => 'hicolor/22x22',
  1382.                'hi32' => 'hicolor/32x32',
  1383.                'hi48' => 'hicolor/48x48',
  1384.                'hi64' => 'hicolor/64x64',
  1385.                'hi128' => 'hicolor/128x128',
  1386.                'hisc' => 'hicolor/scalable',
  1387.          'cr16' => 'crystalsvg/16x16',
  1388.                'cr22' => 'crystalsvg/22x22',
  1389.                'cr32' => 'crystalsvg/32x32',
  1390.                'cr48' => 'crystalsvg/48x48',
  1391.                'cr64' => 'crystalsvg/64x64',
  1392.                'cr128' => 'crystalsvg/128x128',
  1393.                'crsc' => 'crystalsvg/scalable'
  1394.               );
  1395.             
  1396.             $newfile =~ s@.*-($appname.(png|xpm|mng|svgz|svg?))@$1@;
  1397.             
  1398.             if (! defined $dir_hash{$prefix}) {
  1399.                 print STDERR "unknown icon prefix $prefix in $printnamen";
  1400.                 next;
  1401.             }
  1402.             
  1403.             my $dir = $dir_hash{$prefix} . "/" . $type_hash{$type};
  1404.             if ($newfile =~ /-[^.]/) {
  1405.                 my $tmp = $newfile;
  1406.                 $tmp =~ s/^([^-]+)-.*$/$1/;
  1407.                 $dir = $dir . "/" . $tmp;
  1408.                 $newfile =~ s/^[^-]+-//;
  1409.             }
  1410.             
  1411.             if (!defined $directories{$dir}) {
  1412.                 $install .= "t$(mkinstalldirs) $(DESTDIR)$($destdir)/$dirn";
  1413.                 $directories{$dir} = 1;
  1414.             }
  1415.             
  1416.             $install .= "t$(INSTALL_DATA) $(srcdir)/$file $(DESTDIR)$($destdir)/$dir/$newfilen";
  1417.             $uninstall .= "t-rm -f $(DESTDIR)$($destdir)/$dir/$newfilen";
  1418.             
  1419.         }
  1420.     }
  1421.     if (length($install)) {
  1422.         $target_adds{"install-data-am"} .= "install-kde-icons ";
  1423.         $target_adds{"uninstall-am"} .= "uninstall-kde-icons ";
  1424.         appendLines("install-kde-icons:n" . $install . "nuninstall-kde-icons:n" . $uninstall);
  1425.     }
  1426. }
  1427. sub handle_POFILES($$)
  1428. {
  1429.   my @pofiles = split(" ", $_[0]);
  1430.   my $lang = $_[1];
  1431.   # Build rules for creating the gmo files
  1432.   my $tmp = "";
  1433.   my $allgmofiles     = "";
  1434.   my $pofileLine   = "POFILES =";
  1435.   foreach $pofile (@pofiles)
  1436.     {
  1437.         $pofile =~ /(.*).[^.]*$/;          # Find name minus extension
  1438.         $tmp .= "$1.gmo: $pofilen";
  1439.         $tmp .= "trm -f $1.gmo; $(GMSGFMT) -o $1.gmo $(srcdir)/$pofilen";
  1440.         $tmp .= "ttest ! -f $1.gmo || touch $1.gmon";
  1441.         $allgmofiles .= " $1.gmo";
  1442.         $pofileLine  .= " $1.po";
  1443.     }
  1444.   appendLines ($tmp);
  1445.   my $lookup = 'POFILESs*=([^n]*)';
  1446.   if ($MakefileData !~ /n$lookup/) {
  1447.     appendLines("$pofileLinenGMOFILES =$allgmofiles");
  1448.   } else {
  1449.     substituteLine ($lookup, "$pofileLinenGMOFILES =$allgmofiles");
  1450.   }
  1451.     if ($allgmofiles) {
  1452.         # Add the "clean" rule so that the maintainer-clean does something
  1453.         appendLines ("clean-nls:nt-rm -f $allgmofilesn");
  1454. $target_adds{"maintainer-clean"} .= "clean-nls ";
  1455. $lookup = 'DISTFILESs*=[ t]*(.*)';
  1456. if ($MakefileData =~ /n$lookup/) {
  1457.   $tmp = "DISTFILES = $(GMOFILES) $(POFILES) $1";
  1458.   substituteLine ($lookup, $tmp);
  1459. }
  1460.     }
  1461.   $target_adds{"install-data-am"} .= "install-nls ";
  1462.   $tmp = "install-nls:n";
  1463.   if ($lang) {
  1464.     $tmp  .= "t$(mkinstalldirs) $(DESTDIR)$(kde_locale)/$lang/LC_MESSAGESn";
  1465.   }
  1466.   $tmp .= "t@for base in ";
  1467.   foreach $pofile (@pofiles)
  1468.     {
  1469.       $pofile =~ /(.*).[^.]*$/;          # Find name minus extension
  1470.       $tmp .= "$1 ";
  1471.     }
  1472.   $tmp .= "; do \n";
  1473.   if ($lang) {
  1474.     $tmp .= "t  echo $(INSTALL_DATA) $$base.gmo $(DESTDIR)$(kde_locale)/$lang/LC_MESSAGES/$$base.mo ;\n";
  1475.     $tmp .= "t  if test -f $$base.gmo; then $(INSTALL_DATA) $$base.gmo $(DESTDIR)$(kde_locale)/$lang/LC_MESSAGES/$$base.mo ;\n";
  1476.     $tmp .= "t  elif test -f $(srcdir)/$$base.gmo; then $(INSTALL_DATA) $(srcdir)/$$base.gmo $(DESTDIR)$(kde_locale)/$lang/LC_MESSAGES/$$base.mo ;\n";
  1477.     $tmp .= "t  fi ;\n";
  1478.   } else {
  1479.     $tmp .= "t  echo $(INSTALL_DATA) $$base.gmo $(DESTDIR)$(kde_locale)/$$base/LC_MESSAGES/$(PACKAGE).mo ;\n";
  1480.     $tmp .= "t  $(mkinstalldirs) $(DESTDIR)$(kde_locale)/$$base/LC_MESSAGES ; \n";
  1481.     $tmp .= "t  if test -f $$base.gmo; then $(INSTALL_DATA) $$base.gmo $(DESTDIR)$(kde_locale)/$$base/LC_MESSAGES/$(PACKAGE).mo ;\n";
  1482.     $tmp .= "t  elif test -f $(srcdir)/$$base.gmo; then $(INSTALL_DATA) $(srcdir)/$$base.gmo $(DESTDIR)$(kde_locale)/$$base/LC_MESSAGES/$(PACKAGE).mo ;\n";
  1483.     $tmp .= "t  fi ;\n";
  1484.   }
  1485.   $tmp .= "tdonenn";
  1486.   appendLines ($tmp);
  1487.   $target_adds{"uninstall"} .= "uninstall-nls ";
  1488.   $tmp = "uninstall-nls:n";
  1489.   foreach $pofile (@pofiles)
  1490.     {
  1491.       $pofile =~ /(.*).[^.]*$/;          # Find name minus extension
  1492.       if ($lang) {
  1493. $tmp .= "trm -f $(DESTDIR)$(kde_locale)/$lang/LC_MESSAGES/$1.mon";
  1494.       } else {
  1495. $tmp .= "trm -f $(DESTDIR)$(kde_locale)/$1/LC_MESSAGES/$(PACKAGE).mon";
  1496.       }
  1497.     }
  1498.   appendLines($tmp);
  1499.   $target_adds{"all"} .= "all-nls ";
  1500.   $tmp = "all-nls: $(GMOFILES)n";
  1501.   appendLines($tmp);
  1502.   $target_adds{"distdir"} .= "distdir-nls ";
  1503.   $tmp = "distdir-nls:$(GMOFILES)n";
  1504.   $tmp .= "tfor file in $(POFILES); do \n";
  1505.   $tmp .= "t  cp $(srcdir)/$$file $(distdir); \n";
  1506.   $tmp .= "tdonen";
  1507.   $tmp .= "tfor file in $(GMOFILES); do \n";
  1508.   $tmp .= "t  cp $(srcdir)/$$file $(distdir); \n";
  1509.   $tmp .= "tdonen";
  1510.   appendLines ($tmp);
  1511.   if (!$lang) {
  1512.     appendLines("merge:nt$(MAKE) -f $(top_srcdir)/admin/Makefile.common package-merge POFILES="${POFILES}" PACKAGE=${PACKAGE}nn");
  1513.   }
  1514.  
  1515. }
  1516. #-----------------------------------------------------------------------------
  1517. # Returns 0 if the line was processed - 1 otherwise.
  1518. # Errors are logged in the global $errorflags
  1519. sub tag_POFILES ()
  1520. {
  1521.     my $lookup = 'POFILESs*=([^n]*)';
  1522.     return 1    if ($MakefileData !~ /n$lookup/);
  1523.     print STDOUT "POFILES processing <$1>n"   if ($verbose);
  1524.     my $tmp = $1;
  1525.     # make sure these are all gone.
  1526.     if ($MakefileData =~ /n.po.gmo:n/)
  1527.     {
  1528.         print STDERR "Warning: Found old .po.gmo rules in $printname. New po rules not addedn";
  1529.         return 1;
  1530.     }
  1531.     # Either find the pofiles in the directory (AUTO) or use
  1532.     # only the specified po files.
  1533.     my $pofiles = "";
  1534.     if ($tmp =~ /^s*AUTOs*$/)
  1535.     {
  1536.         opendir (THISDIR, ".");
  1537. $pofiles =  join(" ", grep(/.po$/, readdir(THISDIR)));
  1538.         closedir (THISDIR);
  1539.         print STDOUT "pofiles found = $pofilesn"   if ($verbose);
  1540. if (-f "charset" && -f "kdelibs/kdelibs.po") {
  1541.     handle_TOPLEVEL();
  1542. }
  1543.     }
  1544.     else
  1545.     {
  1546.         $tmp =~ s/34/ /g;
  1547.         $pofiles = $tmp;
  1548.     }
  1549.     return 1    if (!$pofiles);        # Nothing to do
  1550.     handle_POFILES($pofiles, $kdelang);
  1551.     return 0;
  1552. }
  1553. sub helper_LOCALINSTALL($)
  1554. {
  1555.   my $lookup = "35" . $_[0] . " *:[^35]*35t";
  1556.   my $copy = $MakefileData;
  1557.   $copy =~ s/n/35/g;
  1558.   if ($copy =~ /($lookup.*)$/) {
  1559.     $install = $1;
  1560.     $install =~ s/35$_[0] *:[^35]*35//;
  1561.     my $emptyline = 0;
  1562.     while (! $emptyline ) {
  1563.       if ($install =~ /([^35]*)35(.*)/) {
  1564. local $line = $1;
  1565. $install = $2;
  1566. if ($line !~ /^s*$/ && $line !~ /^(@.*@)*t/) {
  1567.   $emptyline = 1;
  1568. } else {
  1569.   replaceDestDir($line);
  1570. }
  1571.       } else {
  1572. $emptyline = 1;
  1573.       }
  1574.     }
  1575.   }
  1576. }
  1577. sub tag_LOCALINSTALL ()
  1578. {
  1579.   helper_LOCALINSTALL('install-exec-local');
  1580.   helper_LOCALINSTALL('install-data-local');
  1581.   helper_LOCALINSTALL('uninstall-local');
  1582.   return 0;
  1583. }
  1584. sub replaceDestDir($) {
  1585.   local $line = $_[0];
  1586.   if (   $line =~ /^s*(@.*@)*s*$(mkinstalldirs)/
  1587.       || $line =~ /^s*(@.*@)*s*$(INSTALLS*)/
  1588.       || $line =~ /^s*(@.*@)*s*(-?rm.*) S*$/)
  1589.   {
  1590.     $line =~ s/^(.*) ([^s]+)s*$/$1 $(DESTDIR)$2/ if ($line !~ /$(DESTDIR)/);
  1591.   }
  1592.   if ($line ne $_[0]) {
  1593.     $_[0] = quotemeta $_[0];
  1594.     substituteLine($_[0], $line);
  1595.   }
  1596. }
  1597. #---------------------------------------------------------------------------
  1598. # libtool is very hard to persuade it could use -Wl,--no-undefined for making
  1599. # -no-undefined actually work
  1600. # append $(KDE_NO_UNFINED) after every -no-undefined in LDFLAGS
  1601. # this may go away if libtool ever does this on its own
  1602. sub tag_NO_UNDEFINED () {
  1603.     return if ($program !~ /_la$/);
  1604.     my $lookup = quotemeta($realname{$program}) . ":.*?nt.*?\((.*?)\) .*n";
  1605.     $MakefileData =~ m/$lookup/;
  1606.     return if (!defined($1));
  1607.     return if ($1 !~ /CXXLINK/);
  1608.     if ($MakefileData !~ /n$program_LDFLAGSs*=.*-no-undefined/ ) {
  1609.         return;
  1610.     }
  1611.     $lookup = $program . '_LDFLAGS(s*)=(.*)-no-undefined(.*)';
  1612.     if ($MakefileData =~ /n$lookupn/) {
  1613. my $replace = $program . "_LDFLAGS$1=$2-no-undefined $(KDE_NO_UNDEFINED)$3";
  1614.         substituteLine($lookup, $replace);
  1615.     }
  1616. }
  1617. sub tag_CLOSURE () {
  1618.     return if ($program !~ /_la$/);
  1619.     my $lookup = quotemeta($realname{$program}) . ":.*?nt.*?\((.*?)\) .*n";
  1620.     $MakefileData =~ m/$lookup/;
  1621.     return if (!defined($1));
  1622.     return if ($1 !~ /CXXLINK/);
  1623.     if ($MakefileData !~ /n$program_LDFLAGSs*=.*-no-undefined/ &&
  1624.         $MakefileData !~ /n$program_LDFLAGSs*=.*KDE_PLUGIN/ ) {
  1625.         print STDERR "Report: $program contains undefined in $printnamen" if ($program =~ /^lib/ && $dryrun);
  1626.         return;
  1627.     }
  1628.     my $closure = $realname{$program} . ".closure";
  1629.     my $lines = "$closure: $($program_OBJECTS) $($program_DEPENDENCIES)n";
  1630.     $lines .= "t@echo "int main() {return 0;}" > $program_closure.$cxxsuffixn";
  1631.     $lines .= "t@$(LTCXXCOMPILE) -c $program_closure.$cxxsuffixn";
  1632.     $lines .= "t$(CXXLINK) $program_closure.lo $($program_LDFLAGS) $($program_OBJECTS) $($program_LIBADD) $(LIBS)n";
  1633.     $lines .= "t@rm -f $program_closure.* $closuren";
  1634.     $lines .= "t@echo "timestamp" > $closuren";
  1635.     $lines .= "n";
  1636.     appendLines($lines);
  1637.     $lookup = $realname{$program} . ": (.*)";
  1638.     if ($MakefileData =~ /n$lookupn/) {
  1639.         $lines  = "@KDE_USE_CLOSURE_TRUE@". $realname{$program} . ": $closure $1";
  1640.         $lines .= "n@KDE_USE_CLOSURE_FALSE@" . $realname{$program} . ": $1";
  1641.         substituteLine($lookup, $lines);
  1642.     }
  1643.     $closure_output .= " $closure";
  1644. }
  1645. sub tag_NMCHECK () {
  1646.     return if ($program !~ /_la$/);
  1647.     my $lookup = quotemeta($realname{$program}) . ":.*?nt.*?\((.*?)\) .*n";
  1648.     $MakefileData =~ m/$lookup/;
  1649.     my $linkcmd = $1;
  1650.     return if (!defined($1));
  1651.     return if ($linkcmd !~ /CXXLINK/ && $linkcmd !~ /LINK/);
  1652.     $lookup = $program . '_NMCHECKs*=([^n]*)';
  1653.     if( $MakefileData !~ m/n$lookupn/ ) {
  1654. return;
  1655.     }
  1656.     my $allowed = $1;
  1657.     $allowed =~ s/^ *//;
  1658.     $lookup = $program . '_NMCHECKWEAKs*=([^n]*)';
  1659.     my $weak = "";
  1660.     my $is_weak = 0;
  1661.     if( $MakefileData =~ m/n$lookupn/ ) {
  1662. $weak = $1;
  1663. $is_weak = 1;
  1664.     }
  1665.     $weak =~ s/^ *//;
  1666.     if( $is_weak )
  1667.     {
  1668. $weak = '--allowweak='' . $weak . '' ';
  1669.     }
  1670.     my $nmline = "@KDE_USE_NMCHECK_TRUE@t@$(MAKE) $(AM_MAKEFLAGS) nmcheck_$realname{$program} || ( rm -f $realname{$program}; exit 1 )";
  1671.     $lookup = '(t$(CXXLINK)[^n]*' . $program . '_OBJECTS[^n]*)';
  1672.     if( $MakefileData =~ /n$lookupn/ ) {
  1673. my $oldstuff = $1;
  1674. substituteLine( $lookup, $oldstuff . "n" . $nmline );
  1675.     }
  1676.     $lookup = '(t$(LINK)[^n]*' . $program . '_OBJECTS[^n]*)';
  1677.     if( $MakefileData =~ /n$lookupn/ ) {
  1678. my $oldstuff = $1;
  1679. substituteLine( $lookup, $oldstuff . "n" . $nmline );
  1680.     }
  1681.     $nmline = "@$(top_srcdir)/admin/nmcheck $realname{$program} '$allowed' $weak";
  1682.     appendLines( "nnmcheck_$realname{$program}: $realname{$program} nt$nmlinen" );
  1683.     $target_adds{ "nmcheck" } .= "nmcheck_$realname{$program} ";
  1684. }
  1685. sub tag_DIST () {
  1686.     my %foundfiles = ();
  1687.     opendir (THISDIR, ".");
  1688.     foreach $entry (readdir(THISDIR)) {
  1689.         next if ($entry eq "CVS" || $entry =~ /^./  || $entry eq "Makefile" || $entry =~ /~$/ || $entry =~ /^#.*#$/);
  1690.         next if (! -f $entry);
  1691.         next if ($entry =~ /.moc/ || $entry =~ /.moc.$cppExt$/ || $entry =~ /.lo$/ || $entry =~ /.la$/ || $entry =~ /.o/);
  1692.         next if ($entry =~ /.all_$cppExt.$cppExt$/);
  1693.         $foundfiles{$entry} = 1;
  1694.     }
  1695.     closedir (THISDIR);
  1696.     # doing this for MAINTAINERCLEANFILES would be wrong
  1697.     my @marks = ("EXTRA_DIST", "DIST_COMMON", 'S*_SOURCES', 'S*_HEADERS', 'CLEANFILES', 'DISTCLEANFILES', 'S*_OBJECTS');
  1698.     foreach $mark (@marks) {
  1699.         while ($MakefileData =~ /n($mark)s*=[ t]*([^n]*)/g) {
  1700.     my $cleanfiles_str = $2;
  1701.             foreach $file (split('[34s]+', $cleanfiles_str)) {
  1702.                 $file =~ s/.///;
  1703.                 $foundfiles{$file} = 0 if (defined $foundfiles{$file});
  1704.             }
  1705.         }
  1706.     }
  1707.     my @files = ("Makefile", "config.cache", "config.log", "stamp-h",
  1708.                  "stamp-h1", "stamp-h1", "config.h", "Makefile", 
  1709.                  "config.status", "config.h", "libtool", "core" );
  1710.     foreach $file (@files) {
  1711.         $foundfiles{$file} = 0 if (defined $foundfiles{$file});
  1712.     }
  1713.     my $KDE_DIST = "";
  1714.     foreach $file (keys %foundfiles) {
  1715.         if ($foundfiles{$file} == 1) {
  1716.             $KDE_DIST .= "$file ";
  1717.         }
  1718.     }
  1719.     if ($KDE_DIST) {
  1720.         print "KDE_DIST $printname $KDE_DISTn" if ($verbose);
  1721.         my $lookup = 'DISTFILESs*=[ t]*(.*)';
  1722.         if ($MakefileData =~ /n$lookup/) {
  1723.             substituteLine($lookup, "DISTFILES = $1 $(KDE_DIST)");
  1724.             appendLines("KDE_DIST=$KDE_DISTn");
  1725.         }
  1726.     }
  1727. }
  1728. #-----------------------------------------------------------------------------
  1729. # Returns 0 if the line was processed - 1 otherwise.
  1730. # Errors are logged in the global $errorflags
  1731. sub tag_DOCFILES ()
  1732. {
  1733.     $target_adds{"all"} .= "docs-am ";
  1734.     my $lookup = 'KDE_DOCSs*=[ t]*([^n]*)';
  1735.     goto nodocs    if ($MakefileData !~ /n$lookup/);
  1736.     print STDOUT "KDE_DOCS processing <$1>n"   if ($verbose);
  1737.     my $tmp = $1;
  1738.     # Either find the files in the directory (AUTO) or use
  1739.     # only the specified po files.
  1740.     my $files = "";
  1741.     my $appname = $tmp;
  1742.     $appname =~ s/^(S*)s*.*$/$1/;
  1743.     if ($appname =~ /AUTO/) {
  1744.       $appname = basename($makefileDir);
  1745.       if ("$appname" eq "en") {
  1746.          print STDERR "Error: KDE_DOCS = AUTO relies on the directory name. Yours is 'en' - you most likely want something else, e.g. KDE_DOCS = myappn";
  1747.           exit(1);
  1748.       }
  1749.     }
  1750.     if ($tmp !~ / - /)
  1751.     {
  1752.         opendir (THISDIR, ".");
  1753. foreach $entry (readdir(THISDIR)) {
  1754.   next if ($entry eq "CVS" || $entry =~ /^./  || $entry =~ /^Makefile/ || $entry =~ /~$/ || $entry =~ /^#.*#$/ || $entry eq "core" || $entry eq "index.cache.bz2");
  1755.   next if (! -f $entry);
  1756.   $files .= "$entry ";
  1757. }
  1758.         closedir (THISDIR);
  1759.         print STDOUT "docfiles found = $filesn"   if ($verbose);
  1760.     }
  1761.     else
  1762.     {
  1763.         $tmp =~ s/34/ /g;
  1764. $tmp =~ s/^S*s*-s*//;
  1765.         $files = $tmp;
  1766.     }
  1767.     goto nodocs if (!$files);        # Nothing to do
  1768.     if ($files =~ /(^| )index.docbook($| )/) {
  1769.       my $lines = "";
  1770.       my $lookup = 'MEINPROCs*=';
  1771.       if ($MakefileData !~ /n($lookup)/) {
  1772. $lines = "MEINPROC=/$(kde_bindir)/meinprocn";
  1773.       }
  1774.       $lookup = 'KDE_XSL_STYLESHEETs*=';
  1775.       if ($MakefileData !~ /n($lookup)/) {
  1776.         $lines .= "KDE_XSL_STYLESHEET=/$(kde_datadir)/ksgmltools2/customization/kde-chunk.xsln";
  1777.       }
  1778.       $lookup = 'nindex.cache.bz2:';
  1779.       if ($MakefileData !~ /n($lookup)/) {
  1780.          $lines .= "index.cache.bz2: $(srcdir)/index.docbook $(KDE_XSL_STYLESHEET) $filesn";
  1781.          $lines .= "t@if test -n "$(MEINPROC)"; then echo $(MEINPROC) --check --cache index.cache.bz2 $(srcdir)/index.docbook; $(MEINPROC) --check --cache index.cache.bz2 $(srcdir)/index.docbook; fin";
  1782.          $lines .= "n";
  1783.       }
  1784.       $lines .= "docs-am: index.cache.bz2n";
  1785.       $lines .= "n";
  1786.       $lines .= "install-docs: docs-am install-nlsn";
  1787.       $lines .= "t$(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/$kdelang/$appnamen";
  1788.       $lines .= "t@if test -f index.cache.bz2; then \n";
  1789.       $lines .= "techo $(INSTALL_DATA) index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$kdelang/$appname/; \n";
  1790.       $lines .= "t$(INSTALL_DATA) index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$kdelang/$appname/; \n";
  1791.       $lines .= "telif test -f  $(srcdir)/index.cache.bz2; then \n";
  1792.       $lines .= "techo $(INSTALL_DATA) $(srcdir)/index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$kdelang/$appname/; \n";
  1793.       $lines .= "t$(INSTALL_DATA) $(srcdir)/index.cache.bz2 $(DESTDIR)$(kde_htmldir)/$kdelang/$appname/; \n";
  1794.       $lines .= "tfin";
  1795.       $lines .= "t-rm -f $(DESTDIR)$(kde_htmldir)/$kdelang/$appname/commonn";
  1796.       $lines .= "t$(LN_S) $(kde_libs_htmldir)/$kdelang/common $(DESTDIR)$(kde_htmldir)/$kdelang/$appname/commonn";
  1797.       $lines .= "n";
  1798.       $lines .= "uninstall-docs:n";
  1799.       $lines .= "t-rm -rf $(DESTDIR)$(kde_htmldir)/$kdelang/$appnamen";
  1800.       $lines .= "n";
  1801.       $lines .= "clean-docs:n";
  1802.       $lines .= "t-rm -f index.cache.bz2n";
  1803.       $lines .= "n";
  1804.       $target_adds{"install-data-am"} .= "install-docs ";
  1805.       $target_adds{"uninstall"} .= "uninstall-docs ";
  1806.       $target_adds{"clean-am"} .= "clean-docs ";
  1807.       appendLines ($lines);
  1808.     } else {
  1809.       appendLines("docs-am: $filesn");
  1810.     }
  1811.     $target_adds{"install-data-am"} .= "install-nls ";
  1812.     $target_adds{"uninstall"} .= "uninstall-nls ";
  1813.     $tmp = "install-nls:n";
  1814.     $tmp .= "t$(mkinstalldirs) $(DESTDIR)$(kde_htmldir)/$kdelang/$appnamen";
  1815.     $tmp .= "t@for base in $files; do \n";
  1816.     $tmp .= "t  echo $(INSTALL_DATA) $$base $(DESTDIR)$(kde_htmldir)/$kdelang/$appname/$$base ;\n";
  1817.     $tmp .= "t  $(INSTALL_DATA) $(srcdir)/$$base $(DESTDIR)$(kde_htmldir)/$kdelang/$appname/$$base ;\n";
  1818.     $tmp .= "tdonen";
  1819.     if ($appname eq 'common') {
  1820.       $tmp .= "t@echo "merging common and language specific dir" ;\n";
  1821.       $tmp .= "tif test ! -f $(kde_htmldir)/en/common/kde-common.css; then echo 'no english docs found in $(kde_htmldir)/en/common/'; exit 1; fi n";
  1822.       $tmp .= "t@com_files=`cd $(kde_htmldir)/en/common && echo *` ;\n";
  1823.       $tmp .= "tcd $(DESTDIR)$(kde_htmldir)/$kdelang/common ;\n";
  1824.       $tmp .= "tif test -n "$$com_files"; then for p in $$com_files ; do \n";
  1825.       $tmp .= "t  case " $files " in \n";
  1826.       $tmp .= "t    *" $$p "*) ;; \n";
  1827.       $tmp .= "t    *) test ! -f $$p && echo $(LN_S) ../../en/common/$$p $(DESTDIR)$(kde_htmldir)/$kdelang/common/$$p && $(LN_S) ../../en/common/$$p $$p ;; \n";
  1828.       $tmp .= "t  esac ; \n";
  1829.       $tmp .= "tdone ; fi ; truen";
  1830.     }
  1831.     $tmp .= "n";
  1832.     $tmp .= "uninstall-nls:n";
  1833.     $tmp .= "tfor base in $files; do \n";
  1834.     $tmp .= "t  rm -f $(DESTDIR)$(kde_htmldir)/$kdelang/$appname/$$base ;\n";
  1835.     $tmp .= "tdonenn";
  1836.     appendLines ($tmp);
  1837.     $target_adds{"distdir"} .= "distdir-nls ";
  1838.     $tmp = "distdir-nls:n";
  1839.     $tmp .= "tfor file in $files; do \n";
  1840.     $tmp .= "t  cp $(srcdir)/$$file $(distdir); \n";
  1841.     $tmp .= "tdonen";
  1842.     appendLines ($tmp);
  1843.     return 0;
  1844.   nodocs:
  1845.     appendLines("docs-am:n");
  1846.     return 1;
  1847. }
  1848. #-----------------------------------------------------------------------------
  1849. # Find headers in any of the source directories specified previously, that
  1850. # are candidates for "moc-ing".
  1851. sub findMocCandidates ()
  1852. {
  1853.     foreach $dir (@headerdirs)
  1854.     {
  1855.         my @list = ();
  1856.         opendir (SRCDIR, "$dir");
  1857.         @hFiles = grep { /.+.$hExt$/o && !/^./ } readdir(SRCDIR);
  1858.         closedir SRCDIR;
  1859.         foreach $hf (@hFiles)
  1860.         {
  1861.             next if ($hf =~ /^.#/);
  1862.     $hf =~ /(.*).[^.]*$/;          # Find name minus extension
  1863.     next if ($uiFiles{$1});
  1864.             open (HFIN, "$dir/$hf") || die "Could not open $dir/$hf: $!n";
  1865.             my $hfsize = 0;
  1866.             seek(HFIN, 0, 2);
  1867.             $hfsize = tell(HFIN);
  1868.             seek(HFIN, 0, 0);
  1869.             read HFIN, $hfData, $hfsize;
  1870.             close HFIN;
  1871.             # push (@list, $hf) if(index($hfData, "Q_OBJECT") >= 0); ### fast but doesn't handle //Q_OBJECT
  1872.     # handle " { friend class blah; Q_OBJECT ", but don't match antlarr_Q_OBJECT (b).
  1873.             if ( $hfData =~ /{([^}]*)bQ_OBJECT/s ) {
  1874.                 push (@list, $hf) unless $1 =~ m://[^n]*Q_OBJECT[^n]*$:s;  ## reject "// Q_OBJECT"
  1875.             }
  1876.         }
  1877.         # The assoc array of root of headerfile and header filename
  1878.         foreach $hFile (@list)
  1879.         {
  1880.             $hFile =~ /(.*).[^.]*$/;          # Find name minus extension
  1881.             if ($mocFiles{$1})
  1882.             {
  1883.               print STDERR "Warning: Multiple header files found for $1n";
  1884.               next;                           # Use the first one
  1885.             }
  1886.             $mocFiles{$1} = "$dir35$hFile";   # Add relative dir
  1887.         }
  1888.     }
  1889.     return 0;
  1890. }
  1891. #-----------------------------------------------------------------------------
  1892. # The programmer has specified a moc list. Prune out the moc candidates
  1893. # list that we found based on looking at the header files. This generates
  1894. # a warning if the programmer gets the list wrong, but this doesn't have
  1895. # to be fatal here.
  1896. sub pruneMocCandidates ($)
  1897. {
  1898.     my %prunedMoc = ();
  1899.     local @mocList = split(' ', $_[0]);
  1900.     foreach $mocname (@mocList)
  1901.     {
  1902.         $mocname =~ s/.moc$//;
  1903.         if ($mocFiles{$mocname})
  1904.         {
  1905.             $prunedMoc{$mocname} = $mocFiles{$mocname};
  1906.         }
  1907.         else
  1908.         {
  1909.             my $print = $makefileDir;
  1910.             $print =~ s/^Q$topdirE\//;
  1911.             # They specified a moc file but we can't find a header that
  1912.             # will generate this moc file. That's possible fatal!
  1913.             print STDERR "Warning: No moc-able header file for $print/$mocnamen";
  1914.         }
  1915.     }
  1916.     undef %mocFiles;
  1917.     %mocFiles = %prunedMoc;
  1918. }
  1919. #-----------------------------------------------------------------------------
  1920. # Finds the cpp files (If they exist).
  1921. # The cpp files get appended to the header file separated by 35
  1922. sub checkMocCandidates ()
  1923. {
  1924.     my @cppFiles;
  1925.     my $cpp2moc;  # which c++ file includes which .moc files
  1926.     my $moc2cpp;  # which moc file is included by which c++ files
  1927.     return unless (keys %mocFiles);
  1928.     opendir(THISDIR, ".") || return;
  1929.     @cppFiles = grep { /.+.$cppExt$/o  && !/.+.moc.$cppExt$/o
  1930.                          && !/.+.all_$cppExt.$cppExt$/o
  1931.  && !/^./  } readdir(THISDIR);
  1932.     closedir THISDIR;
  1933.     return unless (@cppFiles);
  1934.     my $files = join (" ", @cppFiles);
  1935.     $cpp2moc = {};
  1936.     $moc2cpp = {};
  1937.     foreach $cxxf (@cppFiles)
  1938.     {
  1939.       open (CXXFIN, $cxxf) || die "Could not open $cxxf: $!n";
  1940.       seek(CXXFIN, 0, 2);
  1941.       my $cxxfsize = tell(CXXFIN);
  1942.       seek(CXXFIN, 0, 0);
  1943.       read CXXFIN, $cxxfData, $cxxfsize;
  1944.       close CXXFIN;
  1945.       while(($cxxfData =~ m/^[ t]*#includes*[<"](.*.moc)[>"]/gm)) {
  1946. $cpp2moc->{$cxxf}->{$1} = 1;
  1947. $moc2cpp->{$1}->{$cxxf} = 1;
  1948.       }
  1949.     }
  1950.     foreach my $mocFile (keys (%mocFiles))
  1951.     {
  1952. @cppFiles = keys %{$moc2cpp->{"$mocFile.moc"}};
  1953.         if (@cppFiles == 1) {
  1954.             $mocFiles{$mocFile} .= "35" . $cppFiles[0];
  1955.     push(@depend, $mocFile);
  1956.         } elsif (@cppFiles == 0) {
  1957.             push (@newObs, $mocFile);           # Produce new object file
  1958.             next    if ($haveAutomocTag);       # This is expected...
  1959.             # But this is an error we can deal with - let them know
  1960.             print STDERR
  1961.                 "Warning: No c++ file that includes $mocFile.mocn";
  1962.         } else {
  1963.             # We can't decide which file to use, so it's fatal. Although as a
  1964.             # guess we could use the mocFile.cpp file if it's in the list???
  1965.             print STDERR
  1966.                 "Error: Multiple c++ files that include $mocFile.mocn";
  1967.             print STDERR "t",join ("t", @cppFiles),"n";
  1968.             $errorflag = 1;
  1969.             delete $mocFiles{$mocFile};
  1970.             # Let's continue and see what happens - They have been told!
  1971.         }
  1972.     }
  1973. }
  1974. #-----------------------------------------------------------------------------
  1975. # Add the rules for generating moc source from header files
  1976. # For Automoc output *.moc.cpp but normally we'll output *.moc
  1977. # (We must compile *.moc.cpp separately. *.moc files are included
  1978. # in the appropriate *.cpp file by the programmer)
  1979. sub addMocRules ()
  1980. {
  1981.     my $cppFile;
  1982.     my $hFile;
  1983.     foreach $mocFile (keys (%mocFiles))
  1984.     {
  1985.         undef $cppFile;
  1986.         ($dir, $hFile, $cppFile) =  split ("35", $mocFiles{$mocFile}, 3);
  1987.         $dir =~ s#^.#$(srcdir)#;
  1988.         if (defined ($cppFile))
  1989.         {
  1990.   $cppFile =~ s,.[^.]*$,,;
  1991.   $target_adds{"$cppFile.o"} .= "$mocFile.moc ";
  1992.   $target_adds{"$cppFile.lo"} .= "$mocFile.moc ";
  1993.   appendLines ("$mocFile.moc: $dir/$hFilent$(MOC) $dir/$hFile -o $mocFile.mocn");
  1994.   $cleanMoc .= " $mocFile.moc";
  1995.   appendLines ("mocs: $mocFile.mocn");
  1996.         }
  1997.         else
  1998.         {
  1999.             appendLines ("$mocFile$mocExt: $dir/$hFilent$(MOC) $dir/$hFile -o $mocFile$mocExtn");
  2000.             $cleanMoc .= " $mocFile$mocExt";
  2001.     appendLines ("mocs: $mocFile$mocExtn");
  2002.         }
  2003.     }
  2004. }
  2005. sub make_bcheck_target()
  2006. {
  2007.     my $lookup = 'RECURSIVE_TARGETSs*=[ t]*(.*)';
  2008.     my $bcheckdep = "bcheck-am";
  2009.     $bcheckdep = "bcheck-recursive" if ($MakefileData =~ /n$lookup/);
  2010.     my $headers= "";
  2011.     $headers = $1 if($MakefileData =~ /nHEADERSs*=[ t]*(.+)/);
  2012.     $headers =~ s/$((?:noinst|EXTRA)_HEADERS)//g;
  2013.     $target_adds{"clean-am"} .= "clean-bcheck ";
  2014.     my $t = "clean-bcheck: n" .
  2015.             "trm -f *.bchecktest.cc *.bchecktest.cc.class a.outnn" .
  2016.             "bcheck: $bcheckdepnn" .
  2017.             "bcheck-am:n" .
  2018.            "t@for i in $headers; do \n" .
  2019.            "t    if test $(srcdir)/$$i -nt $$i.bchecktest.cc; then \n" . 
  2020.            "t        echo "int main() {return 0;}" > $$i.bchecktest.cc ; \n" .
  2021.            "t        echo "#include \"$$i\"" >> $$i.bchecktest.cc ; \n" .
  2022.            "t        echo "$$i"; \n" . 
  2023.            "t        if ! ";
  2024.     $t .=  $cxxsuffix eq "KKK" ?
  2025.            "$(CXX) $(DEFS) -I. -I$(srcdir) -I$(top_builddir) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(KDE_CXXFLAGS) " :
  2026.            "$(CXXCOMPILE) ";
  2027.     $t .=  " --dump-class-hierarchy -c $$i.bchecktest.cc; then \n" .
  2028.            "t            rm -f $$i.bchecktest.cc; exit 1; \n" .
  2029.            "t        fi ; \n" .
  2030.            "t        echo "" >> $$i.bchecktest.cc.class; \n" .
  2031.            "t        perl $(top_srcdir)/admin/bcheck.pl $$i.bchecktest.cc.class || { rm -f $$i.bchecktest.cc; exit 1; }; \n" .
  2032.            "t        rm -f a.out; \n" .
  2033.            "t    fi ; \n" .
  2034.            "tdonen";
  2035.     appendLines("$tn");
  2036. }
  2037. sub make_meta_classes ()
  2038. {
  2039.     return if ($kdeopts{"qtonly"});
  2040.     my $cppFile;
  2041.     my $hFile;
  2042.     my $moc_class_headers = "";
  2043.     foreach $program (@programs) {
  2044. my $mocs = "";
  2045. my @progsources = split(/[34s]+/, $sources{$program});
  2046. my @depmocs = split(' ', $dependmocs{$program});
  2047. my %shash = (), %mhash = ();
  2048. @shash{@progsources} = 1;  # we are only interested in the existence
  2049. @mhash{@depmocs} = 1;
  2050. print STDOUT "program=$programn" if ($verbose);
  2051. print STDOUT "psources=[".join(' ', keys %shash)."]n" if ($verbose);
  2052. print STDOUT "depmocs=[".join(' ', keys %mhash)."]n" if ($verbose);
  2053. print STDOUT "globalmocs=[".join(' ', keys(%globalmocs))."]n" if ($verbose);
  2054. foreach my $mocFile (keys (%globalmocs))
  2055. {
  2056.     my ($dir, $hFile, $cppFile) = split ("35", $globalmocs{$mocFile}, 3);
  2057.     if (defined ($cppFile))
  2058.     {
  2059. $mocs .= " $mocFile.moc" if exists $shash{$cppFile};
  2060.     }
  2061.     else
  2062.     {
  2063. # Bah. This is the case, if no C++ file includes the .moc
  2064. # file. We make a .moc.cpp file for that. Unfortunately this
  2065. # is not included in the %sources hash, but rather is mentioned
  2066. # in %dependmocs. If the user wants to use AUTO he can't just
  2067. # use an unspecific METAINCLUDES. Instead he must use
  2068. # program_METAINCLUDES. Anyway, it's not working real nicely.
  2069. # E.g. Its not clear what happens if user specifies two
  2070. # METAINCLUDES=AUTO in the same Makefile.am.
  2071. $mocs .= " $mocFile.moc.$cxxsuffix"
  2072.     if exists $mhash{$mocFile.".moc.$cxxsuffix"};
  2073.     }
  2074. }
  2075. if ($mocs) {
  2076.     print STDOUT "==> mocs=[".$mocs."]n" if ($verbose);
  2077. }
  2078. print STDOUT "n" if $verbose;
  2079.     }
  2080.     if ($moc_class_headers) {
  2081.         appendLines ("$cleantarget-moc-classes:nt-rm -f $moc_class_headersn");
  2082.         $target_adds{"$cleantarget-am"} .= "$cleantarget-moc-classes ";
  2083.     }
  2084. }
  2085. #-----------------------------------------------------------------------------
  2086. sub updateMakefile ()
  2087. {
  2088.     return if ($dryrun);
  2089.     open (FILEOUT, "> $makefile")
  2090.                         || die "Could not create $makefile: $!n";
  2091.     $MakefileData =~ s/34/\n/g;    # Restore continuation lines
  2092.     # Append our $progId line, _below_ the "generated by automake" line
  2093.     # because automake-1.6 relies on the first line to be his own.
  2094.     my $progIdLine = "# $progId - " . '$Revision: 483858 $ '."n";
  2095.     if ( !( $MakefileData =~ s/^(.*generated .*by automake.*n)/$1$progIdLine/ ) ) {
  2096.         warn "automake line not found in $makefilen";
  2097. # Fallback: first line
  2098.         print FILEOUT $progIdLine;
  2099.     };
  2100.     print FILEOUT $MakefileData;
  2101.     close FILEOUT;
  2102. }
  2103. #-----------------------------------------------------------------------------
  2104. # The given line needs to be removed from the makefile
  2105. # Do this by adding the special "removed line" comment at the line start.
  2106. sub removeLine ($$)
  2107. {
  2108.     my ($lookup, $old) = @_;
  2109.     $old =~ s/34/\n#>- /g;          # Fix continuation lines
  2110.     $MakefileData =~ s/n$lookup/n#>- $old/;
  2111. }
  2112. #-----------------------------------------------------------------------------
  2113. # Replaces the old line with the new line
  2114. # old line(s) are retained but tagged as removed. The new line(s) have the
  2115. # "added" tag placed before it.
  2116. sub substituteLine ($$)
  2117. {
  2118.     my ($lookup, $new) = @_;
  2119.     if ($MakefileData =~ /n($lookup)/) {
  2120.       $old = $1;
  2121.       $old =~ s/34/\n#>- /g;         # Fix continuation lines
  2122.       my $newCount = ($new =~ tr/34//) + ($new =~ tr/n//) + 1;
  2123.       $new =~ s/\n/34/g;
  2124.       $MakefileData =~ s/n$lookup/n#>- $oldn#>+ $newCountn$new/;
  2125.     } else {
  2126.         warn "Warning: substitution of "$lookup" in $printname failedn";
  2127.     }
  2128. }
  2129. #-----------------------------------------------------------------------------
  2130. # Slap new lines on the back of the file.
  2131. sub appendLines ($)
  2132. {
  2133.   my ($new) = @_;
  2134.   my $copynew = $new;
  2135.   my $newCount = ($new =~ tr/34//) + ($new =~ tr/n//) + 1;
  2136.   $new =~ s/\n/34/g;        # Fix continuation lines
  2137.   $MakefileData .= "n#>+ $newCountn$new";
  2138. }
  2139. #-----------------------------------------------------------------------------
  2140. # Restore the Makefile.in to the state it was before we fiddled with it
  2141. sub restoreMakefile ()
  2142. {
  2143.     $MakefileData =~ s/# $progId[^n34]*[n34]*//g;
  2144.     # Restore removed lines
  2145.     $MakefileData =~ s/([n34])#>- /$1/g;
  2146.     # Remove added lines
  2147.     while ($MakefileData =~ /[n34]#>+ ([^n34]*)/)
  2148.     {
  2149.         my $newCount = $1;
  2150.         my $removeLines = "";
  2151.         while ($newCount--) {
  2152.             $removeLines .= "[^n34]*([n34]|)";
  2153.         }
  2154.         $MakefileData =~ s/[n34]#>+.*[n34]$removeLines/n/;
  2155.     }
  2156. }
  2157. #-----------------------------------------------------------------------------
  2158. # find the .kcfg file listed in the .kcfgc file
  2159. sub findKcfgFile($)
  2160. {
  2161.   my ($kcfgf) = @_;
  2162.   open (KCFGFIN, $kcfgf) || die "Could not open $kcfgf: $!n";
  2163.   seek(KCFGFIN, 0, 2);
  2164.   my $kcfgfsize = tell(KCFGFIN);
  2165.   seek(KCFGFIN, 0, 0);
  2166.   read KCFGFIN, $kcfgfData, $kcfgfsize;
  2167.   close KCFGFIN;
  2168.   if(($kcfgfData =~ m/^File=(.*.kcfg)/gm)) {
  2169.     $kcfg = $1;
  2170.   }
  2171. }