|
|
|
#!/usr/bin/perl -w
|
|
|
|
|
|
|
|
## Run this first, to generate the x_*.cpp files from the Qt headers
|
|
|
|
## using kalyptus
|
|
|
|
|
|
|
|
my $kalyptusdir = "@srcdir@/../../kalyptus";
|
|
|
|
|
|
|
|
use File::Basename;
|
|
|
|
use File::Copy qw|cp|;
|
|
|
|
use File::Compare;
|
|
|
|
use File::Find;
|
|
|
|
use Cwd;
|
|
|
|
|
|
|
|
my $here = getcwd;
|
|
|
|
my $outdir = $here . "/generate.pl.tmpdir";
|
|
|
|
my $finaloutdir = $here;
|
|
|
|
my $defines = "qtdefines";
|
|
|
|
my $headerlist = "@srcdir@/header_list";
|
|
|
|
my $kdeheaderlist = "@srcdir@/kde_header_list";
|
|
|
|
my $definespath = "$here/$defines";
|
|
|
|
my $headerlistpath = "$here/$headerlist";
|
|
|
|
my $kdeheaderlistpath = "$here/$kdeheaderlist";
|
|
|
|
|
|
|
|
# If srcdir != builddir, then srcdir is probvably an absolute
|
|
|
|
# path, and it makes no sense to prepend $here.
|
|
|
|
$definespath = $defines if $defines =~ /^\//;
|
|
|
|
$headerlistpath = $headerlist if $headerlist =~ /^\//;
|
|
|
|
$kdeheaderlistpath = $kdeheaderlist if $kdeheaderlist =~ /^\//;
|
|
|
|
|
|
|
|
## Note: outdir and finaloutdir should NOT be the same dir!
|
|
|
|
|
|
|
|
# Delete all x_*.cpp files under outdir (or create outdir if nonexistent)
|
|
|
|
if (-d $outdir) { system "rm -f $outdir/x_*.cpp"; } else { mkdir $outdir; }
|
|
|
|
|
|
|
|
mkdir $finaloutdir unless (-d $finaloutdir);
|
|
|
|
|
|
|
|
# Load the QT_NO_* macros found in "qtdefines". They'll be passed to kalyptus
|
|
|
|
my $macros="";
|
|
|
|
if ( -e $definespath ){
|
|
|
|
print "Found '$defines'. Reading preprocessor symbols from there...\n";
|
|
|
|
$macros = " --defines=$definespath ";
|
|
|
|
}
|
|
|
|
|
|
|
|
# Need to cd to kalyptus's directory so that perl finds Ast.pm etc.
|
|
|
|
chdir "$kalyptusdir" or die "Couldn't go to $kalyptusdir (edit script to change dir)\n";
|
|
|
|
|
|
|
|
# Find out which header files we need to parse
|
|
|
|
# We don't want all of them - e.g. not template-based stuff
|
|
|
|
my %excludes = (
|
|
|
|
'ntqaccessible.h' => 1, # Accessibility support is not compiled by defaut
|
|
|
|
'ntqassistantclient.h' => 1, # Not part of Qt (introduced in Qt-3.1)
|
|
|
|
'ntqmotif.h' => 1, #
|
|
|
|
'ntqmotifwidget.h' => 1, # Motif extension (introduced in Qt-3.1)
|
|
|
|
'ntqmotifdialog.h' => 1, #
|
|
|
|
'ntqxt.h' => 1, # Xt
|
|
|
|
'ntqxtwidget.h' => 1, # Xt
|
|
|
|
'ntqdns.h' => 1, # internal
|
|
|
|
'ntqgl.h' => 1, # OpenGL
|
|
|
|
'ntqglcolormap.h' => 1, # OpenGL
|
|
|
|
'ntqnp.h' => 1, # NSPlugin
|
|
|
|
'ntqttableview.h' => 1, # Not in Qt anymore...
|
|
|
|
'ntqtmultilineedit.h' => 1, # Not in Qt anymore...
|
|
|
|
'ntqwidgetfactory.h' => 1, # Just an interface
|
|
|
|
'ntqsharedmemory.h' => 1, # "not part of the Qt API" they say
|
|
|
|
'ntqwindowsstyle.h' => 1, # Qt windowsstyle, plugin
|
|
|
|
'ntqmotifstyle.h' => 1,
|
|
|
|
'ntqcompactstyle.h' => 1,
|
|
|
|
'ntqinterlacestyle.h' => 1,
|
|
|
|
'ntqmotifplusstyle.h' => 1,
|
|
|
|
'ntqsgistyle.h' => 1,
|
|
|
|
'ntqplatinumstyle.h' => 1,
|
|
|
|
'ntqcdestyle.h' => 1,
|
|
|
|
'ntqwindowsxpstyle.h' => 1 # play on the safe side
|
|
|
|
);
|
|
|
|
|
|
|
|
# Some systems have a QTDIR = TDEDIR = PREFIX
|
|
|
|
# We need a complete list
|
|
|
|
|
|
|
|
my %includes;
|
|
|
|
open(HEADERS, $headerlistpath) or die "Couldn't open $headerlistpath: $!\n";
|
|
|
|
map { chomp ; $includes{$_} = 1 unless /^\s*#/ } <HEADERS>;
|
|
|
|
close HEADERS;
|
|
|
|
|
|
|
|
# Find out which header files we need to parse
|
|
|
|
# We don't want all of them - e.g. not template-based stuff
|
|
|
|
my %kdeexcludes = (
|
|
|
|
# These headers don't look suitable for inclusion:
|
|
|
|
'kallocator.h' => 1,
|
|
|
|
'kbookmarkimporter_crash.h' => 1,
|
|
|
|
'kbookmarkimporter_ie.h' => 1,
|
|
|
|
'kbookmarkimporter_opera.h' => 1,
|
|
|
|
'kbookmarkimporter_ns.h' => 1,
|
|
|
|
'kcrash.h' => 1,
|
|
|
|
'kdebug.h' => 1,
|
|
|
|
'kdebugclasses.h' => 1,
|
|
|
|
'kde_terminal_interface.h' => 1,
|
|
|
|
'kdirnotify_stub.h' => 1,
|
|
|
|
|
|
|
|
# These headers currently give problems
|
|
|
|
'tdescreensaver.h' => 1,
|
|
|
|
'kdirnotify_stub.h' => 1,
|
|
|
|
'tdeio/uiserver_stub.h' => 1,
|
|
|
|
'tdeio/uiserver.h' => 1,
|
|
|
|
'tdeio/tdesasl.h' => 1,
|
|
|
|
'tdeio/kpac.h' => 1,
|
|
|
|
'tdeio/thumbcreator.h' => 1,
|
|
|
|
'tdeio/file.h' => 1,
|
|
|
|
'tdeio/chmodjob.h' => 1,
|
|
|
|
'tdeparts/genericfactory.h' => 1,
|
|
|
|
'tdeparts/pluginselectormodule.h' => 1,
|
|
|
|
'kopenssl.h' => 1,
|
|
|
|
'kautomount.h' => 1,
|
|
|
|
'kimagefilepreview.h' => 1,
|
|
|
|
'kpropertiesdialog.h' => 1,
|
|
|
|
'knotifydialog.h' => 1,
|
|
|
|
'ksockaddr.h' => 1,
|
|
|
|
'knotifywidgetbase.h' => 1,
|
|
|
|
);
|
|
|
|
|
|
|
|
# Some systems have a QTDIR = TDEDIR = PREFIX
|
|
|
|
# We need a complete list
|
|
|
|
|
|
|
|
my %kdeincludes;
|
|
|
|
open(HEADERS, $kdeheaderlistpath) or die "Couldn't open $kdeheaderlistpath: $!\n";
|
|
|
|
map { chomp ; $kdeincludes{$_} = 1 unless /^\s*#/ } <HEADERS>;
|
|
|
|
close HEADERS;
|
|
|
|
|
|
|
|
# Can we compile the OpenGl module ?
|
|
|
|
if("@KDE_HAVE_GL@" eq "yes")
|
|
|
|
{
|
|
|
|
open(DEFS, $definespath);
|
|
|
|
my @defs = <DEFS>;
|
|
|
|
close DEFS;
|
|
|
|
if(!grep(/QT_NO_OPENGL/, @defs))
|
|
|
|
{
|
|
|
|
$excludes{'qgl.h'} = undef;
|
|
|
|
$excludes{'qglcolormap.h'} = undef;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
print STDERR "Qt was not compiled with OpenGL support...\n Skipping TQGL Classes.\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# List Qt headers, and exclude the ones listed above
|
|
|
|
my @headers = ();
|
|
|
|
|
|
|
|
$qtinc= '@qt_includes@';
|
|
|
|
opendir (QT, $qtinc) or die "Couldn't find $qtinc";
|
|
|
|
foreach $filename (readdir(QT)) {
|
|
|
|
$entry = $qtinc."/".$filename;
|
|
|
|
if ( ( -e $entry or -l $entry ) # A real file or a symlink
|
|
|
|
&& ( ! -d _ ) ) # Not a symlink to a dir though
|
|
|
|
{
|
|
|
|
push(@headers, $entry)
|
|
|
|
if ( !defined $excludes{$filename} # Not excluded
|
|
|
|
&& $includes{$filename} # Known header
|
|
|
|
&& $filename =~ /\.h$/ ); # Not a backup file etc. Only headers.
|
|
|
|
undef $includes{$filename}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
closedir QT;
|
|
|
|
|
|
|
|
my @kdeheaders = ();
|
|
|
|
$kdeprefix = "@KDE_PREFIX@";
|
|
|
|
$kdeinc= '@kde_includes@';
|
|
|
|
$kdeinc =~ s/\${prefix}/$kdeprefix/; # Remove ${prefix} in src != build
|
|
|
|
-d $kdeinc or die "Couldn't process $kdeinc: $!\n";
|
|
|
|
|
|
|
|
find(
|
|
|
|
{ wanted => sub {
|
|
|
|
(-e || -l and !-d) and do {
|
|
|
|
$f = substr($_, 1 + length $kdeinc);
|
|
|
|
push ( @kdeheaders, $_ )
|
|
|
|
if( !defined $kdeexcludes{$f} # Not excluded
|
|
|
|
&& $kdeincludes{$f} # Known header
|
|
|
|
&& /\.h$/); # Not a backup file etc. Only headers.
|
|
|
|
undef $kdeincludes{$f}
|
|
|
|
};
|
|
|
|
},
|
|
|
|
follow_fast => 1,
|
|
|
|
follow_skip => 2,
|
|
|
|
no_chdir => 1
|
|
|
|
}, $kdeinc
|
|
|
|
);
|
|
|
|
|
|
|
|
# Launch kalyptus
|
|
|
|
system "perl kalyptus @ARGV --globspace -fsmoke --name=qt $macros --no-cache --allow_k_dcop_accessors --outputdir=$outdir @headers @kdeheaders";
|
|
|
|
my $exit = $? >> 8;
|
|
|
|
exit $exit if ($exit);
|
|
|
|
|
|
|
|
# Generate diff for smokedata.cpp
|
|
|
|
unless ( -e "$finaloutdir/smokedata.cpp" ) {
|
|
|
|
open( TOUCH, ">$finaloutdir/smokedata.cpp");
|
|
|
|
close TOUCH;
|
|
|
|
}
|
|
|
|
system "diff -u $finaloutdir/smokedata.cpp $outdir/smokedata.cpp > $outdir/smokedata.cpp.diff";
|
|
|
|
|
|
|
|
# Copy changed or new files to finaloutdir
|
|
|
|
opendir (OUT, $outdir) or die "Couldn't opendir $outdir";
|
|
|
|
foreach $filename (readdir(OUT)) {
|
|
|
|
next if ( -d "$outdir/$filename" ); # only files, not dirs
|
|
|
|
my $docopy = 1;
|
|
|
|
if ( -f "$finaloutdir/$filename" ) {
|
|
|
|
$docopy = compare("$outdir/$filename", "$finaloutdir/$filename"); # 1 if files are differents
|
|
|
|
}
|
|
|
|
if ($docopy) {
|
|
|
|
#print STDERR "Updating $filename...\n";
|
|
|
|
cp("$outdir/$filename", "$finaloutdir/$filename");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
closedir OUT;
|
|
|
|
|
|
|
|
# Check for deleted files and warn
|
|
|
|
my $deleted = 0;
|
|
|
|
opendir(FINALOUT, $finaloutdir) or die "Couldn't opendir $finaloutdir";
|
|
|
|
foreach $filename (readdir(FINALOUT)) {
|
|
|
|
next if ( -d "$finaloutdir/$filename" ); # only files, not dirs
|
|
|
|
if ( $filename =~ /.cpp$/ && ! ($filename =~ /_la_closure.cpp/) && ! -f "$outdir/$filename" ) {
|
|
|
|
print STDERR "Removing obsolete file $filename\n";
|
|
|
|
unlink "$finaloutdir/$filename";
|
|
|
|
$deleted = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
closedir FINALOUT;
|
|
|
|
|
|
|
|
# Delete outdir
|
|
|
|
system "rm -rf $outdir";
|
|
|
|
|