~ubuntu-branches/ubuntu/vivid/kvpnc/vivid-proposed

« back to all changes in this revision

Viewing changes to admin/am_edit

  • Committer: Bazaar Package Importer
  • Author(s): Mark Purcell
  • Date: 2009-04-23 09:18:50 UTC
  • mfrom: (1.1.10 upstream) (8.1.2 sid)
  • Revision ID: james.westby@ubuntu.com-20090423091850-hweeg0jo64t0jx52
Tags: 0.9.1-1
* New upstream release (KDE4 is here)
* Add Build-Depends cmake and pkg-kde-tools
* Remove obsolete debian/patches
* Refresh debian/patches:
  - 10_su-to-root_usage.diff
  - 13_add_kuser_issuperuser.diff
* Cleanup debian/rules - simple under KDE4
* Update debian/watch for KDE4 version
* Update debian/copyright - use versionned licenses
* Update Section field - move to utils
* Remove obsolete dependencies: kdebase-bin, gksu, sux and modutils
* Update debian/kvpnc.{manpages,1}

Show diffs side-by-side

added added

removed removed

Lines of Context:
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: 1.3 $ '."\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
 
}