use File::Basename;
use File::Path;
use Cwd;
+use Cwd 'abs_path';
use Config;
use strict;
-for (my $i = 0; $i < $#ARGV; $i++) {
- if ($ARGV[$i] eq "-base-dir" && $i < $#ARGV - 1) {
- $ENV{"QTDIR"} = $ARGV[$i + 1];
- last;
- }
-}
+# set output basedir to be where ever syncqt is run from
+our $out_basedir = getcwd();
+$out_basedir =~ s=\\=/=g;
+our $basedir;
+our $quoted_basedir;
-die "syncqt: QTDIR not defined" if ! $ENV{"QTDIR"}; # sanity check
-# global variables
-my $isunix = 0;
-my $basedir = $ENV{"QTDIR"};
-$basedir =~ s=\\=/=g;
-my %modules = ( # path to module name map
- "QtGui" => "$basedir/src/gui",
- "QtOpenGL" => "$basedir/src/opengl",
- "QtOpenVG" => "$basedir/src/openvg",
- "QtCore" => "$basedir/src/corelib",
- "QtXml" => "$basedir/src/xml",
- "QtSql" => "$basedir/src/sql",
- "QtNetwork" => "$basedir/src/network",
- "QtSvg" => "$basedir/src/svg",
- "QtTest" => "$basedir/src/testlib",
- "QtDBus" => "$basedir/src/dbus",
-);
-my %moduleheaders = ( # restrict the module headers to those found in relative path
-);
-
-#$modules{"QtCore"} .= ";$basedir/mkspecs/" . $ENV{"MKSPEC"} if defined $ENV{"MKSPEC"};
+# will be defined based on the modules sync.profile
+our (%modules, %moduleheaders, %classnames, %mastercontent);
# global variables (modified by options)
+my $isunix = 0;
my $module = 0;
my $showonly = 0;
my $quiet = 0;
my $create_private_headers = 1;
my @modules_to_sync ;
$force_relative = 1 if ( -d "/System/Library/Frameworks" );
-my $out_basedir = $basedir;
-$out_basedir =~ s=\\=/=g;
-my $quoted_basedir = "\Q$basedir";
+
# functions ----------------------------------------------------------
sub showUsage
{
print "$0 usage:\n";
+ print " <module directory> Specifies which module to sync header files for (required for shadow builds!)\n\n";
+
print " -copy Copy headers instead of include-fwd(default: " . ($copy_headers ? "yes" : "no") . ")\n";
print " -remove-stale Removes stale headers (default: " . ($remove_stale ? "yes" : "no") . ")\n";
print " -relative Force relative symlinks (default: " . ($force_relative ? "yes" : "no") . ")\n";
sub classNames {
my @ret;
my ($iheader) = @_;
- if(basename($iheader) eq "qglobal.h") {
- push @ret, "QtGlobal";
- } elsif(basename($iheader) eq "qendian.h") {
- push @ret, "QtEndian";
- } elsif(basename($iheader) eq "qconfig.h") {
- push @ret, "QtConfig";
- } elsif(basename($iheader) eq "qplugin.h") {
- push @ret, "QtPlugin";
- } elsif(basename($iheader) eq "qalgorithms.h") {
- push @ret, "QtAlgorithms";
- } elsif(basename($iheader) eq "qcontainerfwd.h") {
- push @ret, "QtContainerFwd";
- } elsif(basename($iheader) eq "qdebug.h") {
- push @ret, "QtDebug";
- } elsif(basename($iheader) eq "qevent.h") {
- push @ret, "QtEvents";
- } elsif(basename($iheader) eq "qnamespace.h") {
- push @ret, "Qt"
- } elsif(basename($iheader) eq "qssl.h") {
- push @ret, "QSsl";
- } elsif(basename($iheader) eq "qtest.h") {
- push @ret, "QTest"
- } elsif(basename($iheader) eq "qtconcurrentmap.h") {
- push @ret, "QtConcurrentMap"
- } elsif(basename($iheader) eq "qtconcurrentfilter.h") {
- push @ret, "QtConcurrentFilter"
- } elsif(basename($iheader) eq "qtconcurrentrun.h") {
- push @ret, "QtConcurrentRun"
- } elsif(basename($iheader) eq "qaudio.h") {
- push @ret, "QAudio"
- }
+
+ my $classname = $classnames{basename($iheader)};
+ push @ret, $classname if ($classname);
my $parsable = "";
if(open(F, "<$iheader")) {
return @files;
}
+######################################################################
+# Syntax: loadSyncProfile()
+#
+# Purpose: Locates the sync.profile.
+# Returns: Hashmap of module name -> directory.
+######################################################################
+sub loadSyncProfile {
+ my ($srcbase, $outbase) = @_;
+ print("srcbase = $$srcbase \n");
+ print("outbase = $$outbase \n");
+
+ my $syncprofile = "$$srcbase/sync.profile";
+ my $result;
+ unless ($result = do "$syncprofile") {
+ die "syncqt couldn't parse $syncprofile: $@" if $@;
+ die "syncqt couldn't execute $syncprofile: $!" unless defined $result;
+ }
+ return $result;
+}
+
+sub locateSyncProfile
+{
+ my ($directory) = @_;
+ my $syncprofile;
+ $directory = abs_path($directory);
+ while(!defined $syncprofile) {
+ local(*D);
+ if (opendir(D, $directory)) {
+ foreach my $file (sort readdir(D)) {
+ next if ($file =~ /^\.\.?$/);
+ $syncprofile = "$directory/$file" if ($file =~ /^sync\.profile$/);
+ last if (defined $syncprofile);
+ }
+ closedir(D);
+ }
+ last if (defined $syncprofile || $directory eq "/" || $directory =~ /^?:[\/\\]$/);
+ $directory = dirname($directory);
+ }
+ return $syncprofile;
+}
+
+# check if this is an in-source build, and if so use that as the basedir too
+$basedir = locateSyncProfile($out_basedir);
+$basedir = dirname($basedir) if ($basedir);
+$quoted_basedir = "\Q$basedir";
+
# --------------------------------------------------------------------
# "main" function
# --------------------------------------------------------------------
# skip, it's been dealt with at the top of the file
shift @ARGV;
next;
+ } elsif($arg =~/^-/) {
+ print "Unknown option: $arg\n\n" if(!$var);
+ showUsage();
+ } else {
+ $basedir = locateSyncProfile($arg);
+ die "Could not find a sync.profile for '$arg'\n" if (!$basedir);
+ $basedir = dirname($basedir);
+ $basedir =~ s=\\=/=g;
+ $var = "ignore";
}
#do something
$out_basedir =~ s=\\=/=g;
}
}
+
+# if we have no $basedir we cannot be sure which sources you want, so die
+die "Could not find any sync.profile for your module!\nPass <module directory> to syncqt to sync your header files.\nsyncqt failed" if (!$basedir);
+
+# load the module's sync.profile here, before we can
+loadSyncProfile(\$basedir, \$out_basedir);
+
@modules_to_sync = keys(%modules) if($#modules_to_sync == -1);
$isunix = checkUnix; #cache checkUnix
my @ignore_headers = ();
my $class_lib_map_contents = "";
-my @ignore_for_master_contents = ( "qt.h", "qpaintdevicedefs.h" );
-my @ignore_for_include_check = ( "qatomic.h" );
-my @ignore_for_qt_begin_header_check = ( "qiconset.h", "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qt_windows.h" );
-my @ignore_for_qt_begin_namespace_check = ( "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qatomic_arch.h", "qatomic_windowsce.h", "qt_windows.h", "qatomic_macosx.h", "qatomic_arm.h", "qatomic_armv7.h" );
-my @ignore_for_qt_module_check = ( "$modules{QtCore}/arch", "$modules{QtCore}/global", "$modules{QtSql}/drivers", "$modules{QtTest}", "$modules{QtDBus}" );
+our @ignore_for_master_contents = ();
+our @ignore_for_include_check = ();
+our @ignore_for_qt_begin_header_check = ();
+our @ignore_for_qt_begin_namespace_check = ();
+our @ignore_for_qt_module_check = ();
my %colliding_headers = ();
my %inject_headers = ( "$basedir/src/corelib/global" => ( "qconfig.h" ) ); # all from build dir
chomp $line;
if($line =~ /^ *QT *\+?= *([^\r\n]*)/) {
foreach(split(/ /, $1)) {
- $master_contents .= "#include <QtCore/QtCore>\n" if($_ eq "core");
- $master_contents .= "#include <QtGui/QtGui>\n" if($_ eq "gui");
- $master_contents .= "#include <QtNetwork/QtNetwork>\n" if($_ eq "network");
- $master_contents .= "#include <QtSvg/QtSvg>\n" if($_ eq "svg");
- $master_contents .= "#include <QtDeclarative/QtDeclarative>\n" if($_ eq "declarative");
- $master_contents .= "#include <QtScript/QtScript>\n" if($_ eq "script");
- $master_contents .= "#include <QtScriptTools/QtScriptTools>\n" if($_ eq "scripttools");
- $master_contents .= "#include <Qt3Support/Qt3Support>\n" if($_ eq "qt3support");
- $master_contents .= "#include <QtSql/QtSql>\n" if($_ eq "sql");
- $master_contents .= "#include <QtXml/QtXml>\n" if($_ eq "xml");
- $master_contents .= "#include <QtXmlPatterns/QtXmlPatterns>\n" if($_ eq "xmlpatterns");
- $master_contents .= "#include <QtOpenGL/QtOpenGL>\n" if($_ eq "opengl");
- $master_contents .= "#include <QtOpenVG/QtOpenVG>\n" if($_ eq "openvg");
+ my $content = $mastercontent{$_};
+ $master_contents .= $content if ($content);
}
}
}
--- /dev/null
+%modules = ( # path to module name map
+ "QtGui" => "$basedir/src/gui",
+ "QtOpenGL" => "$basedir/src/opengl",
+ "QtOpenVG" => "$basedir/src/openvg",
+ "QtCore" => "$basedir/src/corelib",
+ "QtXml" => "$basedir/src/xml",
+ "QtSql" => "$basedir/src/sql",
+ "QtNetwork" => "$basedir/src/network",
+ "QtSvg" => "$basedir/src/svg",
+ "QtTest" => "$basedir/src/testlib",
+ "QtDBus" => "$basedir/src/dbus",
+);
+%moduleheaders = ( # restrict the module headers to those found in relative path
+);
+%classnames = (
+ "qglobal.h" => "QtGlobal",
+ "qendian.h" => "QtEndian",
+ "qconfig.h" => "QtConfig",
+ "qplugin.h" => "QtPlugin",
+ "qalgorithms.h" => "QtAlgorithms",
+ "qcontainerfwd.h" => "QtContainerFwd",
+ "qdebug.h" => "QtDebug",
+ "qevent.h" => "QtEvents",
+ "qnamespace.h" => "Qt",
+ "qssl.h" => "QSsl",
+ "qtest.h" => "QTest",
+ "qtconcurrentmap.h" => "QtConcurrentMap",
+ "qtconcurrentfilter.h" => "QtConcurrentFilter",
+ "qtconcurrentrun.h" => "QtConcurrentRun",
+);
+%mastercontent = (
+ "core" => "#include <QtCore/QtCore>\n",
+ "gui" => "#include <QtGui/QtGui>\n",
+ "network" => "#include <QtNetwork/QtNetwork>\n",
+ "svg" => "#include <QtSvg/QtSvg>\n",
+ "opengl" => "#include <QtOpenGL/QtOpenGL>\n",
+ "openvg" => "#include <QtOpenVG/QtOpenVG>\n",
+ "xml" => "#include <QtXml/QtXml>\n",
+);
+@ignore_for_master_contents = ( "qt.h", "qpaintdevicedefs.h" );
+@ignore_for_include_check = ( "qatomic.h" );
+@ignore_for_qt_begin_header_check = ( "qiconset.h", "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qt_windows.h" );
+@ignore_for_qt_begin_namespace_check = ( "qconfig.h", "qconfig-dist.h", "qconfig-large.h", "qconfig-medium.h", "qconfig-minimal.h", "qconfig-small.h", "qfeatures.h", "qatomic_arch.h", "qatomic_windowsce.h", "qt_windows.h", "qatomic_macosx.h" );
+@ignore_for_qt_module_check = ( "$modules{QtCore}/arch", "$modules{QtCore}/global", "$modules{QtTest}", "$modules{QtDBus}" );