diff options
Diffstat (limited to 'smoke/tde/generate.pl.in')
-rw-r--r-- | smoke/tde/generate.pl.in | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/smoke/tde/generate.pl.in b/smoke/tde/generate.pl.in new file mode 100644 index 00000000..1dfd3fd5 --- /dev/null +++ b/smoke/tde/generate.pl.in @@ -0,0 +1,229 @@ +#!/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"; + |