#!/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@/tde_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 TQT_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 = ( 'tqaccessible.h' => 1, # Accessibility support is not compiled by defaut 'tqassistantclient.h' => 1, # Not part of Qt (introduced in Qt-3.1) 'tqdns.h' => 1, # internal 'tqgl.h' => 1, # OpenGL 'tqglcolormap.h' => 1, # OpenGL 'tqwidgetfactory.h' => 1, # Just an interface 'tqsharedmemory.h' => 1, # "not part of the Qt API" they say 'tqwindowsstyle.h' => 1, # Qt windowsstyle, plugin 'tqmotifstyle.h' => 1, 'tqcompactstyle.h' => 1, 'tqinterlacestyle.h' => 1, 'tqmotifplusstyle.h' => 1, 'tqsgistyle.h' => 1, 'tqplatinumstyle.h' => 1, 'tqcdestyle.h' => 1, 'tqwindowsxpstyle.h' => 1 # play on the safe side ); # Some systems have a TQTDIR = 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*#/ } ; 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 TQTDIR = 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*#/ } ; close HEADERS; # Can we compile the OpenGl module ? if("@KDE_HAVE_GL@" eq "yes") { open(DEFS, $definespath); my @defs = ; close DEFS; if(!grep(/TQT_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= '@tqt_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 $ENV{KDE_PREFIX} = "@KDE_PREFIX@"; 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";