Make syncqt use sync.profile files from each module

The sync.profile replaces the hardcoded paths inside syncqt, and
enables it to work for other modules than just qtbase.
This commit is contained in:
Marius Storm-Olsen 2010-11-15 13:55:17 -06:00 committed by axis
parent 703842d450
commit 07bed9a211
4 changed files with 130 additions and 84 deletions

View File

@ -12,40 +12,22 @@
use File::Basename; use File::Basename;
use File::Path; use File::Path;
use Cwd; use Cwd;
use Cwd 'abs_path';
use Config; use Config;
use strict; use strict;
for (my $i = 0; $i < $#ARGV; $i++) { # set output basedir to be where ever syncqt is run from
if ($ARGV[$i] eq "-base-dir" && $i < $#ARGV - 1) { our $out_basedir = getcwd();
$ENV{"QTDIR"} = $ARGV[$i + 1]; $out_basedir =~ s=\\=/=g;
last; our $basedir;
} our $quoted_basedir;
}
die "syncqt: QTDIR not defined" if ! $ENV{"QTDIR"}; # sanity check
# global variables # will be defined based on the modules sync.profile
my $isunix = 0; our (%modules, %moduleheaders, %classnames, %mastercontent);
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"};
# global variables (modified by options) # global variables (modified by options)
my $isunix = 0;
my $module = 0; my $module = 0;
my $showonly = 0; my $showonly = 0;
my $quiet = 0; my $quiet = 0;
@ -58,9 +40,7 @@ my $create_uic_class_map = 1;
my $create_private_headers = 1; my $create_private_headers = 1;
my @modules_to_sync ; my @modules_to_sync ;
$force_relative = 1 if ( -d "/System/Library/Frameworks" ); $force_relative = 1 if ( -d "/System/Library/Frameworks" );
my $out_basedir = $basedir;
$out_basedir =~ s=\\=/=g;
my $quoted_basedir = "\Q$basedir";
# functions ---------------------------------------------------------- # functions ----------------------------------------------------------
@ -74,6 +54,8 @@ my $quoted_basedir = "\Q$basedir";
sub showUsage sub showUsage
{ {
print "$0 usage:\n"; 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 " -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 " -remove-stale Removes stale headers (default: " . ($remove_stale ? "yes" : "no") . ")\n";
print " -relative Force relative symlinks (default: " . ($force_relative ? "yes" : "no") . ")\n"; print " -relative Force relative symlinks (default: " . ($force_relative ? "yes" : "no") . ")\n";
@ -155,37 +137,9 @@ sub shouldMasterInclude {
sub classNames { sub classNames {
my @ret; my @ret;
my ($iheader) = @_; my ($iheader) = @_;
if(basename($iheader) eq "qglobal.h") {
push @ret, "QtGlobal"; my $classname = $classnames{basename($iheader)};
} elsif(basename($iheader) eq "qendian.h") { push @ret, $classname if ($classname);
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 $parsable = ""; my $parsable = "";
if(open(F, "<$iheader")) { if(open(F, "<$iheader")) {
@ -548,6 +502,52 @@ sub findFiles {
return @files; 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 # "main" function
# -------------------------------------------------------------------- # --------------------------------------------------------------------
@ -597,6 +597,15 @@ while ( @ARGV ) {
# skip, it's been dealt with at the top of the file # skip, it's been dealt with at the top of the file
shift @ARGV; shift @ARGV;
next; 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 #do something
@ -668,6 +677,13 @@ while ( @ARGV ) {
$out_basedir =~ s=\\=/=g; $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); @modules_to_sync = keys(%modules) if($#modules_to_sync == -1);
$isunix = checkUnix; #cache checkUnix $isunix = checkUnix; #cache checkUnix
@ -678,11 +694,11 @@ mkpath "$out_basedir/include/Qt", !$quiet;
my @ignore_headers = (); my @ignore_headers = ();
my $class_lib_map_contents = ""; my $class_lib_map_contents = "";
my @ignore_for_master_contents = ( "qt.h", "qpaintdevicedefs.h" ); our @ignore_for_master_contents = ();
my @ignore_for_include_check = ( "qatomic.h" ); our @ignore_for_include_check = ();
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" ); our @ignore_for_qt_begin_header_check = ();
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" ); our @ignore_for_qt_begin_namespace_check = ();
my @ignore_for_qt_module_check = ( "$modules{QtCore}/arch", "$modules{QtCore}/global", "$modules{QtSql}/drivers", "$modules{QtTest}", "$modules{QtDBus}" ); our @ignore_for_qt_module_check = ();
my %colliding_headers = (); my %colliding_headers = ();
my %inject_headers = ( "$basedir/src/corelib/global" => ( "qconfig.h" ) ); # all from build dir 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; chomp $line;
if($line =~ /^ *QT *\+?= *([^\r\n]*)/) { if($line =~ /^ *QT *\+?= *([^\r\n]*)/) {
foreach(split(/ /, $1)) { foreach(split(/ /, $1)) {
$master_contents .= "#include <QtCore/QtCore>\n" if($_ eq "core"); my $content = $mastercontent{$_};
$master_contents .= "#include <QtGui/QtGui>\n" if($_ eq "gui"); $master_contents .= $content if ($content);
$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");
} }
} }
} }

3
configure vendored
View File

@ -2550,8 +2550,7 @@ if [ "$OPT_SHADOW" = "yes" ]; then
if [ -x "$relpath/bin/syncqt" ]; then if [ -x "$relpath/bin/syncqt" ]; then
mkdir -p "$outpath/bin" mkdir -p "$outpath/bin"
echo "#!/bin/sh" >"$outpath/bin/syncqt" echo "#!/bin/sh" >"$outpath/bin/syncqt"
echo "QTDIR=\"$relpath\"; export QTDIR" >>"$outpath/bin/syncqt" echo "perl \"$relpath/bin/syncqt\" -outdir \"$outpath\" \"$relpath\" \"\$@\"" >>"$outpath/bin/syncqt"
echo "perl \"$relpath/bin/syncqt\" -outdir \"$outpath\" \"\$@\"" >>"$outpath/bin/syncqt"
chmod 755 "$outpath/bin/syncqt" chmod 755 "$outpath/bin/syncqt"
fi fi

44
sync.profile Normal file
View File

@ -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}" );

View File

@ -188,9 +188,7 @@ Configure::Configure(int& argc, char** argv)
if (syncqt_bat.open(QFile::WriteOnly)) { if (syncqt_bat.open(QFile::WriteOnly)) {
QTextStream stream(&syncqt_bat); QTextStream stream(&syncqt_bat);
stream << "@echo off" << endl stream << "@echo off" << endl
<< "set QTDIR=" << QDir::toNativeSeparators(sourcePath) << endl << "call " << fixSeparators(sourcePath) << fixSeparators("/bin/syncqt.bat -outdir \"") << fixSeparators(buildPath) << "\" \"" << fixSeparators(sourcePath) << "\"" << endl
<< "call " << fixSeparators(sourcePath) << fixSeparators("/bin/syncqt.bat -outdir \"") << fixSeparators(buildPath) << "\"" << endl
<< "set QTDIR=" << QDir::toNativeSeparators(buildPath) << endl;
syncqt_bat.close(); syncqt_bat.close();
} }
} }