Make syncqt use sync.profile files from each module
authorMarius Storm-Olsen <marius.storm-olsen@nokia.com>
Mon, 15 Nov 2010 19:55:17 +0000 (13:55 -0600)
committeraxis <qt-info@nokia.com>
Wed, 27 Apr 2011 10:05:45 +0000 (12:05 +0200)
The sync.profile replaces the hardcoded paths inside syncqt, and
enables it to work for other modules than just qtbase.

bin/syncqt
configure
sync.profile [new file with mode: 0644]
tools/configure/configureapp.cpp

index b867106..e3d941b 100755 (executable)
 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;
@@ -58,9 +40,7 @@ my $create_uic_class_map = 1;
 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 ----------------------------------------------------------
 
@@ -74,6 +54,8 @@ my $quoted_basedir = "\Q$basedir";
 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";
@@ -155,37 +137,9 @@ sub shouldMasterInclude {
 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")) {
@@ -548,6 +502,52 @@ sub findFiles {
     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
 # --------------------------------------------------------------------
@@ -597,6 +597,15 @@ while ( @ARGV ) {
         # 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
@@ -668,6 +677,13 @@ while ( @ARGV ) {
         $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
@@ -678,11 +694,11 @@ mkpath "$out_basedir/include/Qt", !$quiet;
 
 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
 
@@ -708,19 +724,8 @@ foreach my $lib (@modules_to_sync) {
                 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);
                     }
                 }
             }
index f2ee5f4..9a04380 100755 (executable)
--- a/configure
+++ b/configure
@@ -2550,8 +2550,7 @@ if [ "$OPT_SHADOW" = "yes" ]; then
     if [ -x "$relpath/bin/syncqt" ]; then
         mkdir -p "$outpath/bin"
         echo "#!/bin/sh" >"$outpath/bin/syncqt"
-        echo "QTDIR=\"$relpath\"; export QTDIR" >>"$outpath/bin/syncqt"
-        echo "perl \"$relpath/bin/syncqt\" -outdir \"$outpath\" \"\$@\"" >>"$outpath/bin/syncqt"
+        echo "perl \"$relpath/bin/syncqt\" -outdir \"$outpath\" \"$relpath\" \"\$@\"" >>"$outpath/bin/syncqt"
         chmod 755 "$outpath/bin/syncqt"
     fi
 
diff --git a/sync.profile b/sync.profile
new file mode 100644 (file)
index 0000000..7d2e4b1
--- /dev/null
@@ -0,0 +1,44 @@
+%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}" );
index 46f1a87..2d84ad5 100644 (file)
@@ -188,9 +188,7 @@ Configure::Configure(int& argc, char** argv)
             if (syncqt_bat.open(QFile::WriteOnly)) {
                 QTextStream stream(&syncqt_bat);
                 stream << "@echo off" << endl
-                       << "set QTDIR=" << QDir::toNativeSeparators(sourcePath) << endl
-                       << "call " << fixSeparators(sourcePath) << fixSeparators("/bin/syncqt.bat -outdir \"") << fixSeparators(buildPath) << "\"" << endl
-                       << "set QTDIR=" << QDir::toNativeSeparators(buildPath) << endl;
+                       << "call " << fixSeparators(sourcePath) << fixSeparators("/bin/syncqt.bat -outdir \"") << fixSeparators(buildPath) << "\" \"" << fixSeparators(sourcePath) << "\"" << endl
                 syncqt_bat.close();
             }
         }