Subversion Repositories public

Rev

Details | Last modification | View Log | RSS feed

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