summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--qmake/Makefile10
-rw-r--r--qmake/generators/makefile.cpp476
-rw-r--r--qmake/generators/makefile.h10
-rw-r--r--qmake/generators/projectgenerator.cpp64
-rw-r--r--qmake/generators/unix/unixmake.cpp168
-rw-r--r--qmake/generators/unix/unixmake.h1
-rw-r--r--qmake/generators/unix/unixmake2.cpp185
-rw-r--r--qmake/generators/win32/borland_bmake.cpp56
-rw-r--r--qmake/generators/win32/borland_bmake.h9
-rw-r--r--qmake/generators/win32/mingw_make.cpp524
-rw-r--r--qmake/generators/win32/mingw_make.h58
-rw-r--r--qmake/generators/win32/msvc_dsp.cpp171
-rw-r--r--qmake/generators/win32/msvc_dsp.h14
-rw-r--r--qmake/generators/win32/msvc_nmake.cpp98
-rw-r--r--qmake/generators/win32/msvc_nmake.h8
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp243
-rw-r--r--qmake/generators/win32/msvc_objectmodel.h100
-rw-r--r--qmake/generators/win32/msvc_vcproj.cpp412
-rw-r--r--qmake/generators/win32/msvc_vcproj.h30
-rw-r--r--qmake/generators/win32/winmakefile.cpp148
-rw-r--r--qmake/include/private/qapplication_p.h5
-rw-r--r--qmake/include/private/qcom_p.h6
-rw-r--r--qmake/include/private/qcomlibrary_p.h6
-rw-r--r--qmake/include/private/qcomplextext_p.h8
-rw-r--r--qmake/include/private/qcomponentfactory_p.h6
-rw-r--r--qmake/include/private/qcriticalsection_p.h4
-rw-r--r--qmake/include/private/qdir_p.h9
-rw-r--r--qmake/include/private/qeffects_p.h2
-rw-r--r--qmake/include/private/qeventloop_p.h70
-rw-r--r--qmake/include/private/qfontcodecs_p.h4
-rw-r--r--qmake/include/private/qfontdata_p.h3
-rw-r--r--qmake/include/private/qgfxdriverinterface_p.h18
-rw-r--r--qmake/include/private/qgpluginmanager_p.h8
-rw-r--r--qmake/include/private/qimageformatinterface_p.h8
-rw-r--r--qmake/include/private/qinputcontext_p.h5
-rw-r--r--qmake/include/private/qkbddriverinterface_p.h18
-rw-r--r--qmake/include/private/qlibrary_p.h5
-rw-r--r--qmake/include/private/qlock_p.h93
-rw-r--r--qmake/include/private/qmousedriverinterface_p.h18
-rw-r--r--qmake/include/private/qmutexpool_p.h44
-rw-r--r--qmake/include/private/qpluginmanager_p.h16
-rw-r--r--qmake/include/private/qpsprinter_p.h4
-rw-r--r--qmake/include/private/qrichtext_p.h59
-rw-r--r--qmake/include/private/qsettings_p.h2
-rw-r--r--qmake/include/private/qsharedmemory_p.h11
-rw-r--r--qmake/include/private/qsqldriverinterface_p.h17
-rw-r--r--qmake/include/private/qsqlextension_p.h41
-rw-r--r--qmake/include/private/qstyleinterface_p.h18
-rw-r--r--qmake/include/private/qsvgdevice_p.h8
-rw-r--r--qmake/include/private/qtextcodecinterface_p.h2
-rw-r--r--qmake/include/private/qtitlebar_p.h2
-rw-r--r--qmake/include/private/qucom_p.h76
-rw-r--r--qmake/include/private/qucomextra_p.h18
-rw-r--r--qmake/include/private/qwidgetinterface_p.h65
-rw-r--r--qmake/include/private/qwidgetresizehandler_p.h18
-rw-r--r--qmake/include/qasciidict.h4
-rw-r--r--qmake/include/qcstring.h7
-rw-r--r--qmake/include/qdict.h4
-rw-r--r--qmake/include/qdir.h3
-rw-r--r--qmake/include/qfeatures.h2
-rw-r--r--qmake/include/qgarray.h13
-rw-r--r--qmake/include/qglobal.h87
-rw-r--r--qmake/include/qintdict.h4
-rw-r--r--qmake/include/qmap.h4
-rw-r--r--qmake/include/qmemarray.h9
-rw-r--r--qmake/include/qptrlist.h6
-rw-r--r--qmake/include/qptrvector.h4
-rw-r--r--qmake/include/qregexp.h2
-rw-r--r--qmake/include/qstring.h91
-rw-r--r--qmake/include/qstrlist.h2
-rw-r--r--qmake/include/qtextcodec.h16
-rw-r--r--qmake/include/qtl.h1
-rw-r--r--qmake/include/quuid.h6
-rw-r--r--qmake/include/qvaluelist.h4
-rw-r--r--qmake/include/qvaluestack.h4
-rw-r--r--qmake/main.cpp9
-rw-r--r--qmake/option.cpp153
-rw-r--r--qmake/option.h5
-rw-r--r--qmake/project.cpp407
-rw-r--r--qmake/project.h20
-rw-r--r--qmake/tools/qbitarray.cpp3
-rw-r--r--qmake/tools/qbuffer.cpp4
-rw-r--r--qmake/tools/qcomlibrary.cpp43
-rw-r--r--qmake/tools/qconfig.cpp14
-rw-r--r--qmake/tools/qcriticalsection_p.cpp2
-rw-r--r--qmake/tools/qcstring.cpp107
-rw-r--r--qmake/tools/qdatastream.cpp24
-rw-r--r--qmake/tools/qdatetime.cpp70
-rw-r--r--qmake/tools/qdir.cpp94
-rw-r--r--qmake/tools/qdir_unix.cpp54
-rw-r--r--qmake/tools/qfile.cpp3
-rw-r--r--qmake/tools/qfile_unix.cpp13
-rw-r--r--qmake/tools/qfileinfo.cpp4
-rw-r--r--qmake/tools/qfileinfo_unix.cpp4
-rw-r--r--qmake/tools/qgarray.cpp97
-rw-r--r--qmake/tools/qgdict.cpp5
-rw-r--r--qmake/tools/qglist.cpp6
-rw-r--r--qmake/tools/qglobal.cpp45
-rw-r--r--qmake/tools/qgpluginmanager.cpp4
-rw-r--r--qmake/tools/qgvector.cpp9
-rw-r--r--qmake/tools/qlibrary.cpp13
-rw-r--r--qmake/tools/qlibrary_unix.cpp21
-rw-r--r--qmake/tools/qmutex_unix.cpp8
-rw-r--r--qmake/tools/qmutexpool.cpp78
-rw-r--r--qmake/tools/qregexp.cpp70
-rw-r--r--qmake/tools/qsemaphore_unix.cpp26
-rw-r--r--qmake/tools/qsettings.cpp387
-rw-r--r--qmake/tools/qstring.cpp434
-rw-r--r--qmake/tools/qtextstream.cpp2
-rw-r--r--qmake/tools/qucom.cpp136
-rw-r--r--qmake/tools/qwaitcondition_unix.cpp13
111 files changed, 4259 insertions, 1883 deletions
diff --git a/qmake/Makefile b/qmake/Makefile
index 90b0f07..01bb1a1 100644
--- a/qmake/Makefile
+++ b/qmake/Makefile
@@ -1,41 +1,41 @@
QMAKESPECSDIR=$(OPIEDIR)/mkspecs
########################################################################
## This file was autogenerated by configure, all changes will be lost ##
########################################################################
CC = gcc
CXX = g++
#qmake code
OBJS=project.o main.o makefile.o unixmake2.o unixmake.o borland_bmake.o \
- msvc_nmake.o msvc_dsp.o msvc_vcproj.o option.o winmakefile.o \
+ mingw_make.o msvc_nmake.o msvc_dsp.o msvc_vcproj.o option.o winmakefile.o \
projectgenerator.o metrowerks_xml.o pbuilder_pbx.o msvc_objectmodel.o
#qt code
QOBJS=qstring.o qtextstream.o qiodevice.o qglobal.o qgdict.o qcstring.o \
qdatastream.o qgarray.o qbuffer.o qglist.o qptrcollection.o qfile.o \
- qfile_unix.o qregexp.o qgvector.o qgcache.o qbitarray.o qdir.o \
+ qfile_unix.o qregexp.o qgvector.o qgcache.o qbitarray.o qdir.o quuid.o \
qfileinfo_unix.o qdir_unix.o qfileinfo.o qdatetime.o qstringlist.o qmap.o \
qconfig.o
CFLAGS= \
-I. -Igenerators -Igenerators/unix -Igenerators/win32 -Igenerators/mac \
-I$(OPIEDIR)/qmake/include -I$(OPIEDIR)/qmake/include/qmake -I$(QMAKESPECSDIR)/default \
-I$(OPIEDIR)/qmake/include/private \
-DQT_NO_TEXTCODEC -DQT_LITE_COMPONENT -DQT_NO_STL -DQT_NO_COMPRESS
CXXFLAGS= $(CFLAGS)
LFLAGS=
qmake: $(OBJS) $(QOBJS)
$(CXX) -o $@ $(OBJS) $(QOBJS) $(LFLAGS)
$(if $(OPIEDIR),rm -f $(OPIEDIR)/bin/$@)
$(if $(OPIEDIR),ln -s ../qmake/$@ $(OPIEDIR)/bin/$@)
install: qmake
[ -d $(INSTALL_ROOT)$(QTDIR)/bin ] || mkdir -p $(INSTALL_ROOT)$(QTDIR)/bin
-cp -f $(QTDIR)/bin/qmake $(INSTALL_ROOT)$(QTDIR)/bin
[ -d $(INSTALL_ROOT)$(QTDIR) ] || mkdir -p $(INSTALL_ROOT)$(QTDIR)
-cp -r -f $(QMAKESPECSDIR) $(INSTALL_ROOT)$(QTDIR)
clean::
rm -f $(OBJS) $(QOBJS)
@@ -77,93 +77,99 @@ qglist.o: $(OPIEDIR)/qmake/tools/qglist.cpp
qptrcollection.o: $(OPIEDIR)/qmake/tools/qptrcollection.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qptrcollection.cpp
qfile.o: $(OPIEDIR)/qmake/tools/qfile.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qfile.cpp
qfile_unix.o: $(OPIEDIR)/qmake/tools/qfile_unix.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qfile_unix.cpp
qregexp.o: $(OPIEDIR)/qmake/tools/qregexp.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qregexp.cpp
qgvector.o: $(OPIEDIR)/qmake/tools/qgvector.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qgvector.cpp
qgcache.o: $(OPIEDIR)/qmake/tools/qgcache.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qgcache.cpp
qbitarray.o: $(OPIEDIR)/qmake/tools/qbitarray.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qbitarray.cpp
qdir.o: $(OPIEDIR)/qmake/tools/qdir.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qdir.cpp
+quuid.o: $(OPIEDIR)/qmake/tools/quuid.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/quuid.cpp
+
qfileinfo_unix.o: $(OPIEDIR)/qmake/tools/qfileinfo_unix.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qfileinfo_unix.cpp
qdir_unix.o: $(OPIEDIR)/qmake/tools/qdir_unix.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qdir_unix.cpp
qfileinfo.o: $(OPIEDIR)/qmake/tools/qfileinfo.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qfileinfo.cpp
qdatetime.o: $(OPIEDIR)/qmake/tools/qdatetime.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qdatetime.cpp
qstringlist.o: $(OPIEDIR)/qmake/tools/qstringlist.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qstringlist.cpp
qmap.o: $(OPIEDIR)/qmake/tools/qmap.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qmap.cpp
qconfig.o: $(OPIEDIR)/qmake/tools/qconfig.cpp
$(CXX) -c -o $@ $(CXXFLAGS) $(OPIEDIR)/qmake/tools/qconfig.cpp
winmakefile.o: generators/win32/winmakefile.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/win32/winmakefile.cpp
project.o: project.cpp project.h option.h
$(CXX) -c -o $@ $(CXXFLAGS) project.cpp
main.o: main.cpp project.h
$(CXX) -c -o $@ $(CXXFLAGS) main.cpp
option.o: option.cpp option.h
$(CXX) -c -o $@ $(CXXFLAGS) option.cpp
makefile.o: generators/makefile.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/makefile.cpp
unixmake.o: generators/unix/unixmake.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/unix/unixmake.cpp
unixmake2.o: generators/unix/unixmake2.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/unix/unixmake2.cpp
borland_bmake.o: generators/win32/borland_bmake.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/win32/borland_bmake.cpp
+mingw_make.o: generators/win32/mingw_make.cpp
+ $(CXX) -c -o $@ $(CXXFLAGS) generators/win32/mingw_make.cpp
+
msvc_objectmodel.o: generators/win32/msvc_objectmodel.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/win32/msvc_objectmodel.cpp
msvc_vcproj.o: generators/win32/msvc_vcproj.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/win32/msvc_vcproj.cpp
msvc_nmake.o: generators/win32/msvc_nmake.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/win32/msvc_nmake.cpp
metrowerks_xml.o: generators/mac/metrowerks_xml.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/mac/metrowerks_xml.cpp
pbuilder_pbx.o: generators/mac/pbuilder_pbx.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/mac/pbuilder_pbx.cpp
msvc_dsp.o: generators/win32/msvc_dsp.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/win32/msvc_dsp.cpp
projectgenerator.o: generators/projectgenerator.cpp
$(CXX) -c -o $@ $(CXXFLAGS) generators/projectgenerator.cpp
#default rules
.c.o:
$(CC) -c -o $@ $(CFLAGS) $<
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index f490313..c12375d 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -1,32 +1,32 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
@@ -38,83 +38,97 @@
#include "makefile.h"
#include "option.h"
#include <qdir.h>
#include <qfile.h>
#include <qtextstream.h>
#include <qregexp.h>
#include <qdict.h>
#if defined(Q_OS_UNIX)
#include <unistd.h>
#else
#include <io.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
// Well, Windows doesn't have this, so here's the macro
#ifndef S_ISDIR
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif
+static QString mkdir_p_asstring(const QString &dir)
+{
+ QString ret = "@$(CHK_DIR_EXISTS) \"" + dir + "\" ";
+ if(Option::target_mode == Option::TARG_WIN_MODE)
+ ret += "$(MKDIR)";
+ else
+ ret += "|| $(MKDIR)";
+ ret += " \"" + dir + "\"";
+ return ret;
+}
+
static bool createDir(const QString& fullPath)
{
+ if(QFile::exists(fullPath))
+ return FALSE;
+
QDir dirTmp;
bool ret = TRUE;
QString pathComponent, tmpPath;
QStringList hierarchy = QStringList::split(QString(Option::dir_sep), fullPath, TRUE);
for(QStringList::Iterator it = hierarchy.begin(); it != hierarchy.end(); ++it) {
pathComponent = *it + QDir::separator();
tmpPath += pathComponent;
if(!dirTmp.mkdir(tmpPath)) {
ret = FALSE;
// break;
}
}
return ret;
}
-MakefileGenerator::MakefileGenerator(QMakeProject *p) : init_opath_already(FALSE),
- init_already(FALSE), moc_aware(FALSE),
+MakefileGenerator::MakefileGenerator(QMakeProject *p) : init_opath_already(FALSE),
+ init_already(FALSE), moc_aware(FALSE),
no_io(FALSE), project(p)
{
}
static char *gimme_buffer(off_t s)
{
static char *big_buffer = NULL;
static int big_buffer_size = 0;
if(!big_buffer || big_buffer_size < s)
- big_buffer = (char *)realloc(big_buffer, s);
+ big_buffer = (char *)realloc(big_buffer, s);
return big_buffer;
}
bool
-MakefileGenerator::generateMocList(QString fn_target)
+MakefileGenerator::generateMocList(const QString &fn_target)
{
if(!findMocDestination(fn_target).isEmpty())
return TRUE;
QString fn_local = Option::fixPathToLocalOS(fileFixify(fn_target, QDir::currentDirPath(), Option::output_dir));
int file = open(fn_local.latin1(), O_RDONLY);
if(file == -1)
return FALSE;
struct stat fst;
if(fstat(file, &fst) || S_ISDIR(fst.st_mode))
return FALSE; //shouldn't happen
char *big_buffer = gimme_buffer(fst.st_size);
int total_size_read;
for(int have_read = total_size_read = 0;
(have_read = read(file, big_buffer + total_size_read,
fst.st_size - total_size_read));
total_size_read += have_read);
close(file);
bool ignore_qobject = FALSE;
int line_count = 1;
@@ -152,107 +166,108 @@ MakefileGenerator::generateMocList(QString fn_target)
}
}
}
}
#define SYMBOL_CHAR(x) ((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z') || \
(x <= '0' && x >= '9') || x == '_')
bool interesting = *(big_buffer+x) == 'Q' && (!strncmp(big_buffer+x, "Q_OBJECT", OBJ_LEN) ||
!strncmp(big_buffer+x, "Q_DISPATCH", DIS_LEN));
if(interesting) {
int len = 0;
if(!strncmp(big_buffer+x, "Q_OBJECT", OBJ_LEN)) {
if(ignore_qobject) {
debug_msg(2, "Mocgen: %s:%d Ignoring Q_OBJECT", fn_target.latin1(), line_count);
interesting = FALSE;
}
len=OBJ_LEN;
} else if(!strncmp(big_buffer+x, "Q_DISPATCH", DIS_LEN)) {
len=DIS_LEN;
}
if(SYMBOL_CHAR(*(big_buffer+x+len)))
interesting = FALSE;
if(interesting) {
*(big_buffer+x+len) = '\0';
- debug_msg(2, "Mocgen: %s:%d Found MOC symbol %s", fn_target.latin1(), line_count, big_buffer+x);
+ debug_msg(2, "Mocgen: %s:%d Found MOC symbol %s", fn_target.latin1(),
+ line_count, big_buffer+x);
int ext_pos = fn_target.findRev('.');
int ext_len = fn_target.length() - ext_pos;
int dir_pos = fn_target.findRev(Option::dir_sep, ext_pos);
QString mocFile;
if(!project->isEmpty("MOC_DIR"))
mocFile = project->first("MOC_DIR");
else if(dir_pos != -1)
mocFile = fn_target.left(dir_pos+1);
bool cpp_ext = FALSE;
- for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {
+ for(QStringList::Iterator cppit = Option::cpp_ext.begin();
+ cppit != Option::cpp_ext.end(); ++cppit) {
if((cpp_ext = (fn_target.right(ext_len) == (*cppit))))
break;
}
if(cpp_ext) {
mocFile += fn_target.mid(dir_pos+1, ext_pos - dir_pos-1) + Option::moc_ext;
- findDependencies(fn_target).append(mocFile);
project->variables()["_SRCMOC"].append(mocFile);
} else if(project->variables()["HEADERS"].findIndex(fn_target) != -1) {
- for(QStringList::Iterator hit = Option::h_ext.begin(); hit != Option::h_ext.end(); ++hit) {
+ for(QStringList::Iterator hit = Option::h_ext.begin();
+ hit != Option::h_ext.end(); ++hit) {
if((fn_target.right(ext_len) == (*hit))) {
mocFile += Option::moc_mod + fn_target.mid(dir_pos+1, ext_pos - dir_pos-1) +
Option::cpp_ext.first();
logicWarn(mocFile, "SOURCES");
project->variables()["_HDRMOC"].append(mocFile);
break;
}
}
}
if(!mocFile.isEmpty()) {
mocFile = Option::fixPathToTargetOS(mocFile);
mocablesToMOC[cleanFilePath(fn_target)] = mocFile;
mocablesFromMOC[cleanFilePath(mocFile)] = fn_target;
}
break;
}
}
while(x < total_size_read && SYMBOL_CHAR(*(big_buffer+x)))
x++;
if(*(big_buffer+x) == '\n')
line_count++;
}
#undef OBJ_LEN
#undef DIS_LEN
return TRUE;
}
bool
-MakefileGenerator::generateDependencies(QPtrList<MakefileDependDir> &dirs, QString fn, bool recurse)
+MakefileGenerator::generateDependencies(QPtrList<MakefileDependDir> &dirs, const QString &f, bool recurse)
{
- fn = fileFixify(fn);
- QStringList &fndeps = findDependencies(fn);
+ QStringList &fndeps = findDependencies(f);
if(!fndeps.isEmpty())
return TRUE;
-
+ QString fn = fileFixify(f, QDir::currentDirPath(), Option::output_dir);
fn = Option::fixPathToLocalOS(fn, FALSE);
QString fix_env_fn = Option::fixPathToLocalOS(fn);
int file = open(fix_env_fn.latin1(), O_RDONLY);
if(file == -1)
return FALSE;
struct stat fst;
if(fstat(file, &fst) || S_ISDIR(fst.st_mode))
return FALSE; //shouldn't happen
QString fndir, fix_env_fndir;
int dl = fn.findRev(Option::dir_sep);
if(dl != -1)
fndir = fn.left(dl+1);
dl = fix_env_fn.findRev(Option::dir_sep);
if(dl != -1)
fix_env_fndir = fix_env_fn.left(dl + 1);
int line_count = 1;
char *big_buffer = gimme_buffer(fst.st_size);
int total_size_read;
for(int have_read = total_size_read = 0;
(have_read = read(file, big_buffer + total_size_read,
fst.st_size - total_size_read));
@@ -267,258 +282,314 @@ MakefileGenerator::generateDependencies(QPtrList<MakefileDependDir> &dirs, QStri
if(*(big_buffer + x) == '/') {
x++;
if(total_size_read >= x) {
if(*(big_buffer + x) == '/') { //c++ style comment
for( ; x < total_size_read && *(big_buffer + x) != '\n'; x++);
} else if(*(big_buffer + x) == '*') { //c style comment
for( ; x < total_size_read; x++) {
if(*(big_buffer + x) == '*') {
if(total_size_read >= (x+1) && *(big_buffer + (x+1)) == '/') {
x += 2;
break;
}
} else if(*(big_buffer + x) == '\n') {
line_count++;
}
}
}
}
}
if(*(big_buffer + x) == '#') {
x++;
while(x < total_size_read && //Skip spaces after hash
(*(big_buffer+x) == ' ' || *(big_buffer+x) == '\t'))
x++;
- if(total_size_read >= x + 8 && !strncmp(big_buffer + x, "include ", 8)) {
- for(x+=8; //skip spaces after keyword
+ if(total_size_read >= x + 8 && !strncmp(big_buffer + x, "include", 7) &&
+ (*(big_buffer + x + 7) == ' ' || *(big_buffer + x + 7) == '\t' ||
+ *(big_buffer + x + 7) == '<' || *(big_buffer + x + 7) == '"')) {
+ for(x+=7; //skip spaces after keyword
x < total_size_read && (*(big_buffer+x) == ' ' || *(big_buffer+x) == '\t');
x++);
char term = *(big_buffer + x);
if(term == '"');
else if(term == '<')
term = '>';
else
continue; //wtf?
x++;
int inc_len;
for(inc_len = 0; *(big_buffer + x + inc_len) != term; inc_len++);
*(big_buffer + x + inc_len) = '\0';
inc = big_buffer + x;
} else if(total_size_read >= x + 14 && !strncmp(big_buffer + x, "qmake_warning ", 14)) {
for(x+=14; //skip spaces after keyword
x < total_size_read && (*(big_buffer+x) == ' ' || *(big_buffer+x) == '\t');
x++);
char term = '\n';
if(*(big_buffer + x) == '"')
term = '"';
if(*(big_buffer + x) == '\'')
term = '\'';
if(term != '\n')
x++;
int msg_len;
for(msg_len = 0; *(big_buffer + x + msg_len) != term; msg_len++);
*(big_buffer + x + msg_len) = '\0';
QString msg = big_buffer + x;
debug_msg(0, "%s:%d qmake_warning -- %s", fix_env_fn.latin1(),
line_count, msg.latin1());
*(big_buffer + x + msg_len) = term; //put it back
}
}
} else if(ui_file) {
// skip whitespaces
while(x < total_size_read &&
- (*(big_buffer+x) == ' ' || *(big_buffer+x) == '\t'))
+ (*(big_buffer+x) == ' ' || *(big_buffer+x) == '\t'))
x++;
if(*(big_buffer + x) == '<') {
x++;
if(total_size_read >= x + 12 && !strncmp(big_buffer + x, "includehint", 11) &&
(*(big_buffer + x + 11) == ' ' || *(big_buffer + x + 11) == '>')) {
for(x += 12; *(big_buffer + x) != '>'; x++);
int inc_len = 0;
for(x += 1 ; *(big_buffer + x + inc_len) != '<'; inc_len++);
*(big_buffer + x + inc_len) = '\0';
inc = big_buffer + x;
} else if(total_size_read >= x + 8 && !strncmp(big_buffer + x, "include", 7) &&
(*(big_buffer + x + 7) == ' ' || *(big_buffer + x + 7) == '>')) {
for(x += 8; *(big_buffer + x) != '>'; x++) {
- if(total_size_read >= x + 9 && *(big_buffer + x) == 'i' &&
+ if(total_size_read >= x + 9 && *(big_buffer + x) == 'i' &&
!strncmp(big_buffer + x, "impldecl", 8)) {
for(x += 8; *(big_buffer + x) != '='; x++);
if(*(big_buffer + x) != '=')
continue;
for(x++; *(big_buffer+x) == '\t' || *(big_buffer+x) == ' '; x++);
char quote = 0;
if(*(big_buffer+x) == '\'' || *(big_buffer+x) == '"') {
quote = *(big_buffer + x);
x++;
}
int val_len;
for(val_len = 0; TRUE; val_len++) {
if(quote) {
if(*(big_buffer+x+val_len) == quote)
break;
} else if(*(big_buffer + x + val_len) == '>' ||
*(big_buffer + x + val_len) == ' ') {
break;
}
}
char saved = *(big_buffer + x + val_len);
*(big_buffer + x + val_len) = '\0';
QString where = big_buffer + x;
*(big_buffer + x + val_len) = saved;
if(where == "in implementation") {
QString cpp = fn.left(fn.length() - Option::ui_ext.length()) +
- Option::cpp_ext.first();
+ Option::cpp_ext.first();
outdeps = &findDependencies(cpp);
}
}
}
int inc_len = 0;
for(x += 1 ; *(big_buffer + x + inc_len) != '<'; inc_len++);
*(big_buffer + x + inc_len) = '\0';
inc = big_buffer + x;
}
}
}
if(!inc.isEmpty()) {
+ bool from_source_dir = TRUE;
debug_msg(5, "%s:%d Found dependency to %s", fix_env_fn.latin1(),
line_count, inc.latin1());
if(!project->isEmpty("SKIP_DEPENDS")) {
bool found = FALSE;
QStringList &nodeplist = project->values("SKIP_DEPENDS");
for(QStringList::Iterator it = nodeplist.begin();
it != nodeplist.end(); ++it) {
QRegExp regx((*it));
if(regx.search(inc) != -1) {
found = TRUE;
break;
}
}
if(found)
continue;
}
QString fqn;
if(project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH") &&
!stat(fix_env_fndir + inc, &fst) && !S_ISDIR(fst.st_mode)) {
fqn = fndir + inc;
+ goto handle_fqn;
} else {
if((Option::target_mode == Option::TARG_MAC9_MODE && inc.find(':')) ||
(Option::target_mode == Option::TARG_WIN_MODE && inc[1] != ':') ||
((Option::target_mode == Option::TARG_UNIX_MODE ||
Option::target_mode == Option::TARG_QNX6_MODE ||
Option::target_mode == Option::TARG_MACX_MODE) &&
inc[0] != '/')) {
for(MakefileDependDir *mdd = dirs.first(); mdd; mdd = dirs.next() ) {
if(!stat(mdd->local_dir + QDir::separator() + inc, &fst) &&
!S_ISDIR(fst.st_mode)) {
fqn = mdd->real_dir + QDir::separator() + inc;
- break;
+ goto handle_fqn;
}
}
}
}
- if(fqn.isEmpty()) {
+ if(fqn.isEmpty() && Option::mkfile::do_dep_heuristics) {
//these are some hacky heuristics it will try to do on an include
//however these can be turned off at runtime, I'm not sure how
//reliable these will be, most likely when problems arise turn it off
//and see if they go away..
- if(Option::mkfile::do_dep_heuristics && depHeuristics.contains(inc)) {
+ if(depHeuristics.contains(inc)) {
fqn = depHeuristics[inc];
} else if(Option::mkfile::do_dep_heuristics) { //some heuristics..
//is it a file from a .ui?
QString inc_file = inc.section(Option::dir_sep, -1);
int extn = inc_file.findRev('.');
if(extn != -1 &&
(inc_file.right(inc_file.length()-extn) == Option::cpp_ext.first() ||
inc_file.right(inc_file.length()-extn) == Option::h_ext.first())) {
QString uip = inc_file.left(extn) + Option::ui_ext;
QStringList uil = project->variables()["FORMS"];
for(QStringList::Iterator it = uil.begin(); it != uil.end(); ++it) {
if((*it).section(Option::dir_sep, -1) == uip) {
if(!project->isEmpty("UI_DIR"))
fqn = project->first("UI_DIR");
else if(!project->isEmpty("UI_HEADERS_DIR"))
fqn = project->first("UI_HEADERS_DIR");
else
fqn = (*it).section(Option::dir_sep, 0, -2);
if(!fqn.isEmpty() && !fqn.endsWith(Option::dir_sep))
fqn += Option::dir_sep;
fqn += inc_file;
- break;
+ from_source_dir = FALSE; //uics go in the output_dir (so don't fix them)
+ fqn = fileFixify(fqn, QDir::currentDirPath(), Option::output_dir);
+ goto handle_fqn;
+ }
+ }
+ }
+ if(project->isActiveConfig("lex_included")) { //is this the lex file?
+ QString rhs = Option::lex_mod + Option::cpp_ext.first();
+ if(inc.endsWith(rhs)) {
+ QString lhs = inc.left(inc.length() - rhs.length()) + Option::lex_ext;
+ QStringList ll = project->variables()["LEXSOURCES"];
+ for(QStringList::Iterator it = ll.begin(); it != ll.end(); ++it) {
+ QString s = (*it), d;
+ int slsh = s.findRev(Option::dir_sep);
+ if(slsh != -1) {
+ d = s.left(slsh + 1);
+ s = s.right(s.length() - slsh - 1);
+ }
+ if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH"))
+ d = project->first("QMAKE_ABSOLUTE_SOURCE_PATH");
+ if(s == lhs) {
+ fqn = d + inc;
+ goto handle_fqn;
+ }
}
}
}
- if(fqn.isEmpty()) { //is it from a .y?
+ { //is it from a .y?
QString rhs = Option::yacc_mod + Option::h_ext.first();
if(inc.endsWith(rhs)) {
QString lhs = inc.left(inc.length() - rhs.length()) + Option::yacc_ext;
QStringList yl = project->variables()["YACCSOURCES"];
for(QStringList::Iterator it = yl.begin(); it != yl.end(); ++it) {
QString s = (*it), d;
int slsh = s.findRev(Option::dir_sep);
if(slsh != -1) {
d = s.left(slsh + 1);
s = s.right(s.length() - slsh - 1);
}
if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH"))
d = project->first("QMAKE_ABSOLUTE_SOURCE_PATH");
if(s == lhs) {
fqn = d + inc;
- break;
+ goto handle_fqn;
+ }
+ }
+ }
+ }
+ if(mocAware() && //is it a moc file?
+ (inc.endsWith(Option::cpp_ext.first()) || inc.endsWith(Option::moc_ext))) {
+ QString mocs[] = { QString("_HDRMOC"), QString("_SRCMOC"), QString::null };
+ for(int moc = 0; !mocs[moc].isNull(); moc++) {
+ QStringList &l = project->variables()[mocs[moc]];
+ for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QString file = Option::fixPathToTargetOS((*it));
+ if(file.section(Option::dir_sep, -(inc.contains('/')+1)) == inc) {
+ fqn = (*it);
+ if(mocs[moc] == "_HDRMOC") {
+ //Since it is include, no need to link it in as well
+ project->variables()["_SRCMOC"].append((*it));
+ l.remove(it);
+ } else if(!findMocSource(fqn).endsWith(fn)) {
+ /* Not really a very good test, but this will at least avoid
+ confusion if it really does happen (since tmake/qmake
+ previously didn't even allow this the test is mostly accurate) */
+ warn_msg(WarnLogic,
+ "Found potential multiple MOC include %s (%s) in '%s'",
+ inc.latin1(), fqn.latin1(), fix_env_fn.latin1());
+ }
+ from_source_dir = FALSE; //mocs go in the output_dir (so don't fix them)
+ goto handle_fqn;
}
}
}
}
depHeuristics.insert(inc, fqn);
}
- if(!Option::mkfile::do_dep_heuristics || fqn.isEmpty()) //I give up
- continue;
}
-
- fqn = fileFixify(Option::fixPathToTargetOS(fqn, FALSE));
- debug_msg(4, "Resolved dependancy of %s to %s", inc.latin1(), fqn.latin1());
+ handle_fqn:
+ if(fqn.isEmpty()) //I give up
+ continue;
+ fqn = Option::fixPathToTargetOS(fqn, FALSE);
+ if(from_source_dir)
+ fqn = fileFixify(fqn);
+ debug_msg(4, "Resolved dependency of %s to %s", inc.latin1(), fqn.latin1());
if(outdeps && outdeps->findIndex(fqn) == -1)
outdeps->append(fqn);
}
//read past new line now..
for( ; x < total_size_read && (*(big_buffer + x) != '\n'); x++);
line_count++;
}
if(recurse) {
for(QStringList::Iterator fnit = fndeps.begin(); fnit != fndeps.end(); ++fnit) {
generateDependencies(dirs, (*fnit), recurse);
QStringList &deplist = findDependencies((*fnit));
for(QStringList::Iterator it = deplist.begin(); it != deplist.end(); ++it)
if(fndeps.findIndex((*it)) == -1)
fndeps.append((*it));
}
}
- debug_msg(2, "Dependancies: %s -> %s", fn.latin1(), fndeps.join(" :: ").latin1());
+ debug_msg(2, "Dependencies: %s -> %s", fn.latin1(), fndeps.join(" :: ").latin1());
return TRUE;
}
void
MakefileGenerator::initOutPaths()
{
if(init_opath_already)
return;
init_opath_already = TRUE;
QMap<QString, QStringList> &v = project->variables();
if(!v.contains("QMAKE_ABSOLUTE_SOURCE_PATH")) {
if(Option::mkfile::do_cache && !Option::mkfile::cachefile.isEmpty() &&
v.contains("QMAKE_ABSOLUTE_SOURCE_ROOT")) {
QString root = v["QMAKE_ABSOLUTE_SOURCE_ROOT"].first();
root = Option::fixPathToTargetOS( root );
if(!root.isEmpty()) {
QFileInfo fi(Option::mkfile::cachefile);
if(!fi.convertToAbs()) {
QString cache_r = fi.dirPath(), pwd = Option::output_dir;
if ( pwd.startsWith(cache_r) && !pwd.startsWith(root) ) {
pwd = Option::fixPathToTargetOS(root + pwd.mid(cache_r.length()));
if(QFile::exists(pwd))
v.insert("QMAKE_ABSOLUTE_SOURCE_PATH", pwd);
}
@@ -592,64 +663,68 @@ MakefileGenerator::initOutPaths()
}
QDir::current().cd( currentDir );
}
void
MakefileGenerator::init()
{
initOutPaths();
if(init_already)
return;
init_already = TRUE;
QMap<QString, QStringList> &v = project->variables();
QString paths[] = { QString("SOURCES"), QString("FORMS"), QString("YACCSOURCES"), QString("INCLUDEPATH"),
QString("HEADERS"), QString("HEADERS_ORIG"),
QString("LEXSOURCES"), QString("QMAKE_INTERNAL_INCLUDED_FILES"), QString::null };
for(int y = 0; paths[y] != QString::null; y++) {
QStringList &l = v[paths[y]];
if(!l.isEmpty())
l = fileFixify(l);
}
/* get deps and mocables */
QDict<void> cache_found_files;
- QString cache_file(Option::output_dir + QDir::separator() + ".qmake.internal.cache");
+ QString cache_file(".qmake.internal.cache");
+ if(!project->isEmpty("QMAKE_INTERNAL_CACHE_FILE"))
+ cache_file = Option::fixPathToLocalOS(project->first("QMAKE_INTERNAL_CACHE_FILE"));
+ if(cache_file.find(QDir::separator()) == -1) //guess they know what they are doing..
+ cache_file.prepend(Option::output_dir + QDir::separator());
if((Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT ||
Option::mkfile::do_deps || Option::mkfile::do_mocs) && !noIO()) {
QPtrList<MakefileDependDir> deplist;
deplist.setAutoDelete(TRUE);
if((Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT || Option::mkfile::do_deps) &&
doDepends()) {
QStringList incDirs = v["DEPENDPATH"] + v["QMAKE_ABSOLUTE_SOURCE_PATH"];
if(project->isActiveConfig("depend_includepath"))
incDirs += v["INCLUDEPATH"];
for(QStringList::Iterator it = incDirs.begin(); it != incDirs.end(); ++it) {
QString r = (*it), l = Option::fixPathToLocalOS((*it));
deplist.append(new MakefileDependDir(r.replace("\"",""),
l.replace("\"","")));
}
- debug_msg(1, "Dependancy Directories: %s", incDirs.join(" :: ").latin1());
+ debug_msg(1, "Dependency Directories: %s", incDirs.join(" :: ").latin1());
if(Option::output.name() != "-" && project->isActiveConfig("qmake_cache")) {
QFile cachef(cache_file);
if(cachef.open(IO_ReadOnly | IO_Translate)) {
QFileInfo cachefi(cache_file);
debug_msg(2, "Trying internal cache information: %s", cache_file.latin1());
QTextStream cachet(&cachef);
QString line, file;
enum { CacheInfo, CacheDepend, CacheMoc } state = CacheInfo;
while (!cachet.eof()) {
line = cachet.readLine().stripWhiteSpace();
int sep = line.find('=');
if(line == "[depend]") {
state = CacheDepend;
} else if(line == "[mocable]") {
state = CacheMoc;
} else if(line == "[check]") {
state = CacheInfo;
} else if(!line.isEmpty() && sep != -1) {
file = line.left(sep).stripWhiteSpace();
line = line.right(line.length() - sep - 1).stripWhiteSpace();
if(state == CacheInfo) {
if(file == "QMAKE_CACHE_VERSION") {
if(line != qmake_version())
break;
@@ -662,49 +737,49 @@ MakefileGenerator::init()
bool found = (bool)cache_found_files[file];
QStringList files = QStringList::split(" ", line);
if(!found) {
QFileInfo fi(fileFixify(file, QDir::currentDirPath(), Option::output_dir));
if(fi.exists() && fi.lastModified() < cachefi.lastModified()) {
cache_found_files.insert(file, (void *)1);
found = TRUE;
}
}
if(found) {
for(QStringList::Iterator dep_it = files.begin();
dep_it != files.end(); ++dep_it) {
if(!cache_found_files[(*dep_it)]) {
QFileInfo fi(fileFixify((*dep_it), QDir::currentDirPath(), Option::output_dir));
if(fi.exists() &&
fi.lastModified() < cachefi.lastModified()) {
cache_found_files.insert((*dep_it), (void *)1);
} else {
found = FALSE;
break;
}
}
}
if(found) {
- debug_msg(2, "Dependancies (cached): %s -> %s", file.latin1(),
+ debug_msg(2, "Dependencies (cached): %s -> %s", file.latin1(),
files.join(" :: ").latin1());
findDependencies(file) = files;
}
}
} else {
void *found = cache_found_files[file];
if(found != (void *)2) {
if(found) {
cache_found_files.replace(file, (void *)2);
} else {
QFileInfo fi(fileFixify(file, QDir::currentDirPath(), Option::output_dir));
if(fi.exists() && fi.lastModified() < cachefi.lastModified()) {
cache_found_files.insert(file, (void *)2);
found = (void*)1;
}
}
}
if(found && line != "*qmake_ignore*") {
int ext_len = file.length() - file.findRev('.');
bool cpp_ext = FALSE;
for(QStringList::Iterator cppit = Option::cpp_ext.begin();
cppit != Option::cpp_ext.end(); ++cppit) {
if((cpp_ext = (file.right(ext_len) == (*cppit))))
break;
@@ -722,163 +797,174 @@ MakefileGenerator::init()
}
debug_msg(2, "Mocgen (cached): %s -> %s", file.latin1(),
line.latin1());
mocablesToMOC[file] = line;
mocablesFromMOC[line] = file;
}
}
}
}
cachef.close();
}
}
}
if(!noIO()) {
QString sources[] = { QString("OBJECTS"), QString("LEXSOURCES"), QString("YACCSOURCES"),
QString("HEADERS"), QString("SOURCES"), QString("FORMS"),
QString::null };
depHeuristics.clear();
bool write_cache = FALSE, read_cache = QFile::exists(cache_file);
for(int x = 0; sources[x] != QString::null; x++) {
QStringList vpath, &l = v[sources[x]];
for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) {
if(!(*val_it).isEmpty()) {
QString file = Option::fixPathToLocalOS((*val_it));
+ QStringList file_list(file);
if(!QFile::exists(file)) {
bool found = FALSE;
if(QDir::isRelativePath(file)) {
if(vpath.isEmpty())
vpath = v["VPATH_" + sources[x]] + v["VPATH"] +
v["QMAKE_ABSOLUTE_SOURCE_PATH"] + v["DEPENDPATH"];
for(QStringList::Iterator vpath_it = vpath.begin();
vpath_it != vpath.end(); ++vpath_it) {
QString real_dir = Option::fixPathToLocalOS((*vpath_it));
if(QFile::exists(real_dir + QDir::separator() + (*val_it))) {
QString dir = (*vpath_it);
if(dir.right(Option::dir_sep.length()) != Option::dir_sep)
dir += Option::dir_sep;
(*val_it) = fileFixify(dir + (*val_it));
found = TRUE;
debug_msg(1, "Found file through vpath %s -> %s",
file.latin1(), (*val_it).latin1());
break;
}
}
}
if(!found) {
QString dir, regex = (*val_it), real_dir;
if(regex.findRev(Option::dir_sep) != -1) {
dir = regex.left(regex.findRev(Option::dir_sep) + 1);
- real_dir = fileFixify(Option::fixPathToLocalOS(dir),
+ real_dir = fileFixify(Option::fixPathToLocalOS(dir),
QDir::currentDirPath(), Option::output_dir);
regex = regex.right(regex.length() - dir.length());
}
if(real_dir.isEmpty() || QFile::exists(real_dir)) {
QDir d(real_dir, regex);
if(!d.count()) {
debug_msg(1, "%s:%d Failure to find %s in vpath (%s)",
__FILE__, __LINE__,
(*val_it).latin1(), vpath.join("::").latin1());
warn_msg(WarnLogic, "Failure to find: %s", (*val_it).latin1());
continue;
} else {
- (*val_it) = dir + d[0];
- for(int i = 1; i < (int)d.count(); i++)
- l.insert(val_it, dir + d[i]);
+ file_list.clear();
+ for(int i = 0; i < (int)d.count(); i++) {
+ file_list.append(dir + d[i]);
+ if(i == (int)d.count() - 1)
+ (*val_it) = dir + d[i];
+ else
+ l.insert(val_it, dir + d[i]);
+ }
}
} else {
debug_msg(1, "%s:%d Cannot match %s%c%s, as %s does not exist.",
__FILE__, __LINE__,
real_dir.latin1(), QDir::separator(), regex.latin1(),
real_dir.latin1());
warn_msg(WarnLogic, "Failure to find: %s", (*val_it).latin1());
}
}
}
-
- QString val_file = fileFixify((*val_it));
- bool found_cache_moc = FALSE, found_cache_dep = FALSE;
- if(read_cache && Option::output.name() != "-" &&
- project->isActiveConfig("qmake_cache")) {
- if(!findDependencies(val_file).isEmpty())
- found_cache_dep = TRUE;
- if(cache_found_files[(*val_it)] == (void *)2)
- found_cache_moc = TRUE;
- if(!found_cache_moc || !found_cache_dep)
- write_cache = TRUE;
- }
- if(!found_cache_dep && sources[x] != "OBJECTS") {
- debug_msg(5, "Looking for dependancies for %s", (*val_it).latin1());
- generateDependencies(deplist, (*val_it), doDepends());
- }
- if(found_cache_moc) {
- QString moc = findMocDestination(val_file);
- if(!moc.isEmpty()) {
- for(QStringList::Iterator cppit = Option::cpp_ext.begin();
- cppit != Option::cpp_ext.end(); ++cppit) {
- if(val_file.endsWith((*cppit))) {
- QStringList &deps = findDependencies(val_file);
- if(!deps.contains(moc))
- deps.append(moc);
- break;
+ for(QStringList::Iterator file_it = file_list.begin();
+ file_it != file_list.end(); ++file_it) {
+ QString file_list_file = fileFixify((*file_it));
+ bool found_cache_moc = FALSE, found_cache_dep = FALSE;
+ if(read_cache && Option::output.name() != "-" &&
+ project->isActiveConfig("qmake_cache")) {
+ if(!findDependencies(file_list_file).isEmpty())
+ found_cache_dep = TRUE;
+ if(cache_found_files[(*file_it)] == (void *)2)
+ found_cache_moc = TRUE;
+ if(!found_cache_moc || !found_cache_dep)
+ write_cache = TRUE;
+ }
+ /* Do moc before dependency checking since some includes can come from
+ moc_*.cpp files */
+ if(found_cache_moc) {
+ QString moc = findMocDestination(file_list_file);
+ if(!moc.isEmpty()) {
+ for(QStringList::Iterator cppit = Option::cpp_ext.begin();
+ cppit != Option::cpp_ext.end(); ++cppit) {
+ if(file_list_file.endsWith((*cppit))) {
+ QStringList &deps = findDependencies(file_list_file);
+ if(!deps.contains(moc))
+ deps.append(moc);
+ break;
+ }
}
}
+ } else if(mocAware() && (sources[x] == "SOURCES" || sources[x] == "HEADERS") &&
+ (Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT ||
+ Option::mkfile::do_mocs)) {
+ generateMocList((*file_it));
+ }
+ if(!found_cache_dep && sources[x] != "OBJECTS") {
+ debug_msg(5, "Looking for dependencies for %s", (*file_it).latin1());
+ generateDependencies(deplist, (*file_it), doDepends());
}
- } else if(mocAware() && (sources[x] == "SOURCES" || sources[x] == "HEADERS") &&
- (Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT ||
- Option::mkfile::do_mocs)) {
- generateMocList((*val_it));
}
}
}
}
if(project->isActiveConfig("qmake_cache") && (write_cache || !read_cache)) {
QFile cachef(cache_file);
if(cachef.open(IO_WriteOnly | IO_Translate)) {
debug_msg(2, "Writing internal cache information: %s", cache_file.latin1());
QTextStream cachet(&cachef);
cachet << "[check]" << "\n"
<< "QMAKE_CACHE_VERSION = " << qmake_version() << "\n"
<< "QMAKE_ABSOLUTE_SOURCE_PATH = " << var("QMAKE_ABSOLUTE_SOURCE_PATH") << "\n"
<< "MOC_DIR = " << var("MOC_DIR") << "\n"
<< "UI_DIR = " << var("UI_DIR") << "\n"
<< "UI_HEADERS_DIR = " << var("UI_HEADERS_DIR") << "\n"
<< "UI_SOURCES_DIR = " << var("UI_SOURCES_DIR") << "\n";
cachet << "[depend]" << endl;
for(QMap<QString, QStringList>::Iterator it = depends.begin();
it != depends.end(); ++it)
cachet << depKeyMap[it.key()] << " = " << it.data().join(" ") << endl;
cachet << "[mocable]" << endl;
QString mc, moc_sources[] = { QString("HEADERS"), QString("SOURCES"), QString::null };
for(int x = 0; moc_sources[x] != QString::null; x++) {
QStringList &l = v[moc_sources[x]];
for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) {
- if(!(*val_it).isEmpty()) {
- mc = mocablesToMOC[(*val_it)];
+ QString f = fileFixify((*val_it));
+ if(!f.isEmpty()) {
+ mc = mocablesToMOC[f];
if(mc.isEmpty())
mc = "*qmake_ignore*";
- cachet << (*val_it) << " = " << mc << endl;
+ cachet << f << " = " << mc << endl;
}
}
}
cachef.close();
}
}
}
}
v["OBJECTS"] = createObjectList("SOURCES") + v["OBJECTS"]; // init variables
//lex files
{
QStringList &impls = v["LEXIMPLS"];
QStringList &l = v["LEXSOURCES"];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString dir;
QFileInfo fi((*it));
if(fi.dirPath() != ".")
dir = fi.dirPath() + Option::dir_sep;
dir = fileFixify(dir, QDir::currentDirPath(), Option::output_dir);
if(!dir.isEmpty() && dir.right(Option::dir_sep.length()) != Option::dir_sep)
dir += Option::dir_sep;
QString impl = dir + fi.baseName(TRUE) + Option::lex_mod + Option::cpp_ext.first();
logicWarn(impl, "SOURCES");
@@ -925,207 +1011,223 @@ MakefileGenerator::init()
QStringList &yaccdeps = findDependencies((*it));
for(QStringList::ConstIterator d = yaccdeps.begin(); d != yaccdeps.end(); ++d) {
if(!impldeps.contains(*d))
impldeps.append(*d);
}
if( project->isActiveConfig("lex_included")) {
// is there a matching lex file ? Transfer its dependencies.
QString lexsrc = fi.baseName(TRUE) + Option::lex_ext;
if(fi.dirPath() != ".")
lexsrc.prepend(fi.dirPath() + Option::dir_sep);
if(v["LEXSOURCES"].findIndex(lexsrc) != -1) {
QString trg = dir + fi.baseName(TRUE) + Option::lex_mod + Option::cpp_ext.first();
impldeps.append(trg);
impldeps += findDependencies(lexsrc);
depends[lexsrc].clear();
}
}
yaccdeps.clear();
}
v["OBJECTS"] += (v["YACCOBJECTS"] = createObjectList("YACCIMPLS"));
}
//UI files
{
+ QStringList &includepath = project->variables()["INCLUDEPATH"];
if(!project->isEmpty("UI_DIR"))
- project->variables()["INCLUDEPATH"].append(project->first("UI_DIR"));
+ includepath.append(project->first("UI_DIR"));
else if(!project->isEmpty("UI_HEADERS_DIR"))
- project->variables()["INCLUDEPATH"].append(project->first("UI_HEADERS_DIR"));
+ includepath.append(project->first("UI_HEADERS_DIR"));
QStringList &decls = v["UICDECLS"], &impls = v["UICIMPLS"];
QStringList &l = v["FORMS"];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString impl, decl;
QFileInfo fi(Option::fixPathToLocalOS((*it)));
if ( !project->isEmpty("UI_DIR") ) {
impl = decl = project->first("UI_DIR");
QString d = fi.dirPath();
if( d == ".")
d = QDir::currentDirPath();
- d = fileFixify(d);
- if( !project->variables()["INCLUDEPATH"].contains(d))
- project->variables()["INCLUDEPATH"].append(d);
+ d = fileFixify(d, QDir::currentDirPath(), Option::output_dir);
+ if(!includepath.contains(d))
+ includepath.append(d);
} else {
if(decl.isEmpty() && !project->isEmpty("UI_HEADERS_DIR"))
decl = project->first("UI_HEADERS_DIR");
- if ( !decl.isEmpty() || (project->isEmpty("UI_HEADERS_DIR") && !project->isEmpty("UI_SOURCES_DIR")) ) {
+ if(!decl.isEmpty() || (project->isEmpty("UI_HEADERS_DIR") &&
+ !project->isEmpty("UI_SOURCES_DIR")) ) {
QString d = fi.dirPath();
if( d == ".")
d = QDir::currentDirPath();
- d = fileFixify(d);
- if( !project->variables()["INCLUDEPATH"].contains(d))
- project->variables()["INCLUDEPATH"].append(d);
+ d = fileFixify(d, QDir::currentDirPath(), Option::output_dir);
+ if(includepath.contains(d))
+ includepath.append(d);
}
if(impl.isEmpty() && !project->isEmpty("UI_SOURCES_DIR"))
impl = project->first("UI_SOURCES_DIR");
if(fi.dirPath() != ".") {
if(impl.isEmpty())
impl = fi.dirPath() + Option::dir_sep;
if(decl.isEmpty())
decl = fi.dirPath() + Option::dir_sep;
}
}
- impl += fi.baseName(TRUE) + Option::cpp_ext.first(),
+ impl = fileFixify(impl, QDir::currentDirPath(), Option::output_dir);
+ if(!impl.isEmpty())
+ impl += Option::dir_sep;
+ impl += fi.baseName(TRUE) + Option::cpp_ext.first();
+ if(Option::output_dir != QDir::currentDirPath() &&
+ project->isEmpty("UI_DIR") && project->isEmpty("UI_HEADERS_DIR")) {
+ QString decl_fixed = fileFixify(decl, QDir::currentDirPath(), Option::output_dir);
+ if(!includepath.contains(decl_fixed))
+ includepath.append(decl_fixed);
+ if(!includepath.contains(decl))
+ project->variables()["INCLUDEPATH"].append(decl);
+ }
+ decl = fileFixify(decl, QDir::currentDirPath(), Option::output_dir);
+ if(!decl.isEmpty())
+ decl += Option::dir_sep;
decl += fi.baseName(TRUE) + Option::h_ext.first();
logicWarn(impl, "SOURCES");
logicWarn(decl, "HEADERS");
decls.append(decl);
impls.append(impl);
findDependencies(impl).append(decl);
QString mocable = Option::moc_mod + fi.baseName(TRUE) + Option::cpp_ext.first();
if(!v["MOC_DIR"].isEmpty())
mocable.prepend(v["MOC_DIR"].first());
else if(fi.dirPath() != ".")
mocable.prepend(fi.dirPath() + Option::dir_sep);
logicWarn(mocable, "SOURCES");
mocablesToMOC[cleanFilePath(decl)] = mocable;
mocablesFromMOC[cleanFilePath(mocable)] = decl;
v["_UIMOC"].append(mocable);
}
v["OBJECTS"] += (v["UICOBJECTS"] = createObjectList("UICDECLS"));
}
//Image files
if(!project->isEmpty("IMAGES")) {
if(project->isEmpty("QMAKE_IMAGE_COLLECTION"))
v["QMAKE_IMAGE_COLLECTION"].append("qmake_image_collection" + Option::cpp_ext.first());
QString imgfile = project->first("QMAKE_IMAGE_COLLECTION");
Option::fixPathToTargetOS(imgfile);
if(!project->isEmpty("UI_DIR") || !project->isEmpty("UI_SOURCES_DIR")) {
if(imgfile.find(Option::dir_sep) != -1)
imgfile = imgfile.right(imgfile.findRev(Option::dir_sep) + 1);
imgfile.prepend( (project->isEmpty("UI_DIR") ? project->first("UI_SOURCES_DIR") :
project->first("UI_DIR")) );
v["QMAKE_IMAGE_COLLECTION"] = QStringList(imgfile);
}
logicWarn(imgfile, "SOURCES");
if(!noIO()) {
QStringList &l = v["IMAGES"];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
if(!QFile::exists((*it))) {
warn_msg(WarnLogic, "Failure to open: %s", (*it).latin1());
continue;
}
findDependencies(imgfile).append(fileFixify((*it)));
}
}
v["OBJECTS"] += (v["IMAGEOBJECTS"] = createObjectList("QMAKE_IMAGE_COLLECTION"));
}
-
- if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH"))
- project->variables()["INCLUDEPATH"].append(Option::output_dir);
+ if(Option::output_dir != QDir::currentDirPath())
+ project->variables()["INCLUDEPATH"].append(fileFixify(Option::output_dir, Option::output_dir,
+ Option::output_dir));
//moc files
if ( mocAware() ) {
if(!project->isEmpty("MOC_DIR"))
project->variables()["INCLUDEPATH"].append(project->first("MOC_DIR"));
v["OBJMOC"] = createObjectList("_HDRMOC") + createObjectList("_UIMOC");
QStringList &l = v["SRCMOC"];
l = v["_HDRMOC"] + v["_UIMOC"] + v["_SRCMOC"];
for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) {
if(!(*val_it).isEmpty())
(*val_it) = Option::fixPathToTargetOS((*val_it), FALSE);
}
}
}
bool
MakefileGenerator::processPrlFile(QString &file)
{
bool ret = FALSE, try_replace_file=FALSE;
QString prl_file;
if(file.endsWith(Option::prl_ext)) {
try_replace_file = TRUE;
prl_file = file;
file = "";
} else {
QString tmp = file;
int ext = tmp.findRev('.');
if(ext != -1)
tmp = tmp.left(ext);
prl_file = tmp + Option::prl_ext;
}
prl_file = fileFixify(prl_file);
- if(!QFile::exists(fileFixify(prl_file, QDir::currentDirPath(), Option::output_dir)) &&
+ if(!QFile::exists(fileFixify(prl_file, QDir::currentDirPath(), Option::output_dir)) &&
project->isActiveConfig("qt")) {
QString stem = prl_file, dir, extn;
int slsh = stem.findRev('/'), hadlib = 0;
if(slsh != -1) {
dir = stem.left(slsh + 1);
stem = stem.right(stem.length() - slsh - 1);
}
if(stem.startsWith("lib")) {
hadlib = 1;
stem = stem.right(stem.length() - 3);
}
int dot = stem.find('.');
if(dot != -1) {
extn = stem.right(stem.length() - dot);
stem = stem.left(dot);
}
if(stem == "qt" || stem == "qte" || stem == "qte-mt" || stem == "qt-mt") {
if(stem.endsWith("-mt"))
stem = stem.left(stem.length() - 3); //lose the -mt
else
stem += "-mt"; //try the thread case
prl_file = dir;
if(hadlib)
prl_file += "lib";
prl_file += stem + extn;
try_replace_file = TRUE;
}
}
QString real_prl_file = Option::fixPathToLocalOS(prl_file);
if(project->variables()["QMAKE_PRL_INTERNAL_FILES"].findIndex(prl_file) != -1) {
ret = TRUE;
} else if(!real_prl_file.isEmpty() &&
QFile::exists(fileFixify(real_prl_file, QDir::currentDirPath(), Option::output_dir))) {
project->variables()["QMAKE_PRL_INTERNAL_FILES"].append(prl_file);
QMakeProject proj;
debug_msg(1, "Processing PRL file: %s", real_prl_file.latin1());
if(!proj.read(fileFixify(real_prl_file, QDir::currentDirPath(), Option::output_dir),
- QDir::currentDirPath())) {
+ QDir::currentDirPath(), TRUE)) {
fprintf(stderr, "Error processing prl file: %s\n", real_prl_file.latin1());
} else {
ret = TRUE;
QMap<QString, QStringList> &vars = proj.variables();
for( QMap<QString, QStringList>::Iterator it = vars.begin(); it != vars.end(); ++it)
processPrlVariable(it.key(), it.data());
if(try_replace_file && !proj.isEmpty("QMAKE_PRL_TARGET")) {
QString dir;
int slsh = real_prl_file.findRev(Option::dir_sep);
if(slsh != -1)
dir = real_prl_file.left(slsh+1);
file = dir + proj.first("QMAKE_PRL_TARGET");
}
}
if(ret)
project->variables()["QMAKE_INTERNAL_INCLUDED_FILES"].append(prl_file);
}
return ret;
}
void
MakefileGenerator::processPrlVariable(const QString &var, const QStringList &l)
{
if(var == "QMAKE_PRL_LIBS") {
@@ -1175,93 +1277,94 @@ MakefileGenerator::processPrlFiles()
}
void
MakefileGenerator::writePrlFile(QTextStream &t)
{
QString target = project->first("TARGET");
int slsh = target.findRev(Option::dir_sep);
if(slsh != -1)
target = target.right(target.length() - slsh - 1);
QString bdir = Option::output_dir;
if(bdir.isEmpty())
bdir = QDir::currentDirPath();
t << "QMAKE_PRL_BUILD_DIR = " << bdir << endl;
if(!project->projectFile().isEmpty() && project->projectFile() != "-")
t << "QMAKE_PRO_INPUT = " << project->projectFile().section('/', -1) << endl;
if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH"))
t << "QMAKE_PRL_SOURCE_DIR = " << project->first("QMAKE_ABSOLUTE_SOURCE_PATH") << endl;
t << "QMAKE_PRL_TARGET = " << target << endl;
if(!project->isEmpty("PRL_EXPORT_DEFINES"))
t << "QMAKE_PRL_DEFINES = " << project->variables()["PRL_EXPORT_DEFINES"].join(" ") << endl;
if(!project->isEmpty("CONFIG"))
t << "QMAKE_PRL_CONFIG = " << project->variables()["CONFIG"].join(" ") << endl;
+ if(!project->isEmpty("VERSION"))
+ t << "QMAKE_PRL_VERSION = " << project->first("VERSION") << endl;
if(project->isActiveConfig("staticlib") || project->isActiveConfig("explicitlib")) {
QStringList libs;
if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS"))
libs = project->variables()["QMAKE_INTERNAL_PRL_LIBS"];
else
libs << "QMAKE_LIBS"; //obvious one
t << "QMAKE_PRL_LIBS = ";
for(QStringList::Iterator it = libs.begin(); it != libs.end(); ++it)
t << project->variables()[(*it)].join(" ") << " ";
t << endl;
}
}
bool
MakefileGenerator::write()
{
init();
findLibraries();
if((Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || //write prl
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) &&
project->isActiveConfig("create_prl") && project->first("TEMPLATE") == "lib" &&
!project->isActiveConfig("plugin")) {
QString prl = var("TARGET");
int slsh = prl.findRev(Option::dir_sep);
if(slsh != -1)
prl = prl.right(prl.length() - slsh);
int dot = prl.find('.');
if(dot != -1)
prl = prl.left(dot);
prl += Option::prl_ext;
if(!project->isEmpty("DESTDIR"))
prl.prepend(var("DESTDIR"));
- QString local_prl = fileFixify(prl, QDir::currentDirPath(), Option::output_dir);
- fixEnvVariables(local_prl);
+ QString local_prl = Option::fixPathToLocalOS(fileFixify(prl, QDir::currentDirPath(), Option::output_dir));
QFile ft(local_prl);
if(ft.open(IO_WriteOnly)) {
project->variables()["ALL_DEPS"].append(prl);
project->variables()["QMAKE_INTERNAL_PRL_FILE"].append(prl);
QTextStream t(&ft);
writePrlFile(t);
ft.close();
}
}
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE &&
- project->isActiveConfig("link_prl")) //load up prl's
+ project->isActiveConfig("link_prl")) //load up prl's'
processPrlFiles();
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) {
QTextStream t(&Option::output);
writeMakefile(t);
}
return TRUE;
}
void
MakefileGenerator::writeObj(QTextStream &t, const QString &obj, const QString &src)
{
QStringList &objl = project->variables()[obj];
QStringList &srcl = project->variables()[src];
QStringList::Iterator oit = objl.begin();
QStringList::Iterator sit = srcl.begin();
QString stringSrc("$src");
QString stringObj("$obj");
for( ;sit != srcl.end() && oit != objl.end(); oit++, sit++) {
if((*sit).isEmpty())
continue;
@@ -1281,357 +1384,409 @@ MakefileGenerator::writeObj(QTextStream &t, const QString &obj, const QString &s
}
QString comp, cimp;
for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) {
if((*sit).endsWith((*cppit))) {
comp = "QMAKE_RUN_CXX";
cimp = "QMAKE_RUN_CXX_IMP";
break;
}
}
if(comp.isEmpty()) {
comp = "QMAKE_RUN_CC";
cimp = "QMAKE_RUN_CC_IMP";
}
bool use_implicit_rule = !project->isEmpty(cimp);
if(use_implicit_rule) {
if(!project->isEmpty("OBJECTS_DIR")) {
use_implicit_rule = FALSE;
} else {
int dot = (*sit).findRev('.');
if(dot == -1 || ((*sit).left(dot) + Option::obj_ext != (*oit)))
use_implicit_rule = FALSE;
}
}
- if (!use_implicit_rule) {
+ if (!use_implicit_rule && !project->isEmpty(comp)) {
QString p = var(comp);
p.replace(stringSrc, (*sit));
p.replace(stringObj, (*oit));
t << "\n\t" << p;
}
t << endl << endl;
}
}
void
MakefileGenerator::writeUicSrc(QTextStream &t, const QString &ui)
{
QStringList &uil = project->variables()[ui];
for(QStringList::Iterator it = uil.begin(); it != uil.end(); it++) {
QString deps = findDependencies((*it)).join(" \\\n\t\t"), decl, impl;
{
- QString tmp = (*it);
+ QString tmp = (*it), impl_dir, decl_dir;
decl = tmp.replace(QRegExp("\\" + Option::ui_ext + "$"), Option::h_ext.first());
+ decl = fileFixify(decl, QDir::currentDirPath(), Option::output_dir);
+ int dlen = decl.findRev(Option::dir_sep) + 1;
tmp = (*it);
impl = tmp.replace(QRegExp("\\" + Option::ui_ext + "$"), Option::cpp_ext.first());
- int dlen = (*it).findRev(Option::dir_sep) + 1;
+ impl = fileFixify(impl, QDir::currentDirPath(), Option::output_dir);
+ int ilen = decl.findRev(Option::dir_sep) + 1;
if(!project->isEmpty("UI_DIR")) {
+ impl_dir = project->first("UI_DIR");
decl = project->first("UI_DIR") + decl.right(decl.length() - dlen);
- impl = project->first("UI_DIR") + impl.right(impl.length() - dlen);
+ impl = project->first("UI_DIR") + impl.right(impl.length() - ilen);
} else {
- if(!project->isEmpty("UI_HEADERS_DIR"))
+ if(!project->isEmpty("UI_HEADERS_DIR")) {
+ decl_dir = project->first("UI_HEADERS_DIR");
decl = project->first("UI_HEADERS_DIR") + decl.right(decl.length() - dlen);
- if(!project->isEmpty("UI_SOURCES_DIR"))
- impl = project->first("UI_SOURCES_DIR") + impl.right(impl.length() - dlen);
- }
+ }
+ if(!project->isEmpty("UI_SOURCES_DIR")) {
+ impl_dir = project->first("UI_SOURCES_DIR");
+ impl = project->first("UI_SOURCES_DIR") + impl.right(impl.length() - ilen);
+ }
+ }
+ if(decl_dir.isEmpty())
+ decl_dir = decl.left(dlen);
+ if(impl_dir.isEmpty())
+ impl_dir = impl.left(ilen);
+ if(!impl_dir.isEmpty())
+ createDir(Option::output_dir + Option::dir_sep + impl_dir);
+ if(!decl_dir.isEmpty() && decl_dir != impl_dir)
+ createDir(Option::output_dir + Option::dir_sep + decl_dir);
}
t << decl << ": " << (*it) << " " << deps << "\n\t"
<< "$(UIC) " << (*it) << " -o " << decl << endl << endl;
QString mildDecl = decl;
int k = mildDecl.findRev( Option::dir_sep );
if ( k != -1 )
mildDecl = mildDecl.mid( k + 1 );
t << impl << ": " << decl << " " << (*it) << " " << deps << "\n\t"
<< "$(UIC) " << (*it) << " -i " << mildDecl << " -o " << impl << endl << endl;
}
}
void
MakefileGenerator::writeMocObj(QTextStream &t, const QString &obj, const QString &src)
{
QStringList &objl = project->variables()[obj],
&srcl = project->variables()[src];
QStringList::Iterator oit = objl.begin(), sit = srcl.begin();
QString stringSrc("$src"), stringObj("$obj");
for( ;sit != srcl.end() && oit != objl.end(); oit++, sit++) {
QString hdr = findMocSource((*sit));
t << (*oit) << ": " << (*sit) << " "
<< hdr << " " << findDependencies(hdr).join(" \\\n\t\t");
bool use_implicit_rule = !project->isEmpty("QMAKE_RUN_CXX_IMP");
if(use_implicit_rule) {
if(!project->isEmpty("OBJECTS_DIR") || !project->isEmpty("MOC_DIR")) {
use_implicit_rule = FALSE;
} else {
int dot = (*sit).findRev('.');
if(dot == -1 || ((*sit).left(dot) + Option::obj_ext != (*oit)))
use_implicit_rule = FALSE;
}
}
- if (!use_implicit_rule) {
+ if (!use_implicit_rule && !project->isEmpty("QMAKE_RUN_CXX")) {
QString p = var("QMAKE_RUN_CXX");
p.replace(stringSrc, (*sit));
p.replace(stringObj, (*oit));
t << "\n\t" << p;
}
t << endl << endl;
}
}
void
MakefileGenerator::writeMocSrc(QTextStream &t, const QString &src)
{
QStringList &l = project->variables()[src];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString m = Option::fixPathToTargetOS(findMocDestination(*it));
if ( !m.isEmpty()) {
QString deps;
if(!project->isActiveConfig("no_mocdepend"))
deps += "$(MOC) ";
deps += (*it);
t << m << ": " << deps << "\n\t"
<< "$(MOC) " << (*it) << " -o " << m << endl << endl;
}
}
}
void
MakefileGenerator::writeYaccSrc(QTextStream &t, const QString &src)
{
QStringList &l = project->variables()[src];
if(project->isActiveConfig("yacc_no_name_mangle") && l.count() > 1)
warn_msg(WarnLogic, "yacc_no_name_mangle specified, but multiple parsers expected."
"This can lead to link problems.\n");
QString default_out_h = "y.tab.h", default_out_c = "y.tab.c";
if(!project->isEmpty("QMAKE_YACC_HEADER"))
default_out_h = project->first("QMAKE_YACC_HEADER");
if(!project->isEmpty("QMAKE_YACC_SOURCE"))
default_out_c = project->first("QMAKE_YACC_SOURCE");
QString stringBase("$base");
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QFileInfo fi((*it));
- QString dir = fileFixify(Option::output_dir);
+ QString dir;
+ if(fi.dirPath() != ".")
+ dir = fi.dirPath() + Option::dir_sep;
+ dir = fileFixify(dir, QDir::currentDirPath(), Option::output_dir);
if(!dir.isEmpty() && dir.right(Option::dir_sep.length()) != Option::dir_sep)
dir += Option::dir_sep;
+
QString impl = dir + fi.baseName(TRUE) + Option::yacc_mod + Option::cpp_ext.first();
QString decl = dir + fi.baseName(TRUE) + Option::yacc_mod + Option::h_ext.first();
QString yaccflags = "$(YACCFLAGS)", mangle = "y";
if(!project->isActiveConfig("yacc_no_name_mangle")) {
mangle = fi.baseName(TRUE);
yaccflags += " -p " + mangle;
- }
+ }
QString out_h = default_out_h, out_c = default_out_c;
if(!mangle.isEmpty()) {
out_h.replace(stringBase, mangle);
out_c.replace(stringBase, mangle);
}
t << impl << ": " << (*it) << "\n\t"
<< "$(YACC) " << yaccflags << " " << (*it) << "\n\t"
<< "-$(DEL_FILE) " << impl << " " << decl << "\n\t"
<< "-$(MOVE) " << out_h << " " << decl << "\n\t"
<< "-$(MOVE) " << out_c << " " << impl << endl << endl;
t << decl << ": " << impl << endl << endl;
}
}
void
MakefileGenerator::writeLexSrc(QTextStream &t, const QString &src)
{
QStringList &l = project->variables()[src];
if(project->isActiveConfig("yacc_no_name_mangle") && l.count() > 1)
warn_msg(WarnLogic, "yacc_no_name_mangle specified, but multiple parsers expected.\n"
"This can lead to link problems.\n");
QString default_out_c = "lex.$base.c";
if(!project->isEmpty("QMAKE_LEX_SOURCE"))
default_out_c = project->first("QMAKE_LEX_SOURCE");
QString stringBase("$base");
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QFileInfo fi((*it));
- QString dir = fileFixify(Option::output_dir);
+ QString dir;
+ if(fi.dirPath() != ".")
+ dir = fi.dirPath() + Option::dir_sep;
+ dir = fileFixify(dir, QDir::currentDirPath(), Option::output_dir);
if(!dir.isEmpty() && dir.right(Option::dir_sep.length()) != Option::dir_sep)
dir += Option::dir_sep;
QString impl = dir + fi.baseName(TRUE) + Option::lex_mod + Option::cpp_ext.first();
QString lexflags = "$(LEXFLAGS)", stub="yy";
if(!project->isActiveConfig("yacc_no_name_mangle")) {
stub = fi.baseName(TRUE);
lexflags += " -P" + stub;
}
QString out_c = default_out_c;
- if(!stub.isEmpty())
+ if(!stub.isEmpty())
out_c.replace(stringBase, stub);
t << impl << ": " << (*it) << " " << findDependencies((*it)).join(" \\\n\t\t") << "\n\t"
<< ( "$(LEX) " + lexflags + " " ) << (*it) << "\n\t"
<< "-$(DEL_FILE) " << impl << " " << "\n\t"
<< "-$(MOVE) " << out_c << " " << impl << endl << endl;
}
}
void
MakefileGenerator::writeImageObj(QTextStream &t, const QString &obj)
{
QStringList &objl = project->variables()[obj];
QString stringSrc("$src");
QString stringObj("$obj");
QString uidir;
for(QStringList::Iterator oit = objl.begin(); oit != objl.end(); oit++) {
QString src(project->first("QMAKE_IMAGE_COLLECTION"));
t << (*oit) << ": " << src;
bool use_implicit_rule = !project->isEmpty("QMAKE_RUN_CXX_IMP");
if(use_implicit_rule) {
if(!project->isEmpty("OBJECTS_DIR") || !project->isEmpty("UI_DIR") || !project->isEmpty("UI_SOURCES_DIR")) {
use_implicit_rule = FALSE;
} else {
int dot = src.findRev('.');
if(dot == -1 || (src.left(dot) + Option::obj_ext != (*oit)))
use_implicit_rule = FALSE;
}
}
- if(!use_implicit_rule) {
+ if(!use_implicit_rule && !project->isEmpty("QMAKE_RUN_CXX")) {
QString p = var("QMAKE_RUN_CXX");
p.replace( stringSrc, src);
p.replace( stringObj, (*oit));
t << "\n\t" << p;
}
t << endl << endl;
}
}
void
MakefileGenerator::writeImageSrc(QTextStream &t, const QString &src)
{
QStringList &l = project->variables()[src];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString gen = project->first("MAKEFILE_GENERATOR");
if ( gen == "MSVC" ) {
t << (*it) << ": " << findDependencies((*it)).join(" \\\n\t\t") << "\n\t"
<< "$(UIC) -o " << (*it) << " -embed " << project->first("QMAKE_ORIG_TARGET")
<< " -f <<\n" << findDependencies((*it)).join(" ") << "\n<<" << endl << endl;
} else if ( gen == "BMAKE" ) {
t << (*it) << ": " << findDependencies((*it)).join(" \\\n\t\t") << "\n\t"
<< "$(UIC) " << " -embed " << project->first("QMAKE_ORIG_TARGET")
<< " -f &&|\n" << findDependencies((*it)).join(" ") << "\n| -o " << (*it) << endl << endl;
} else {
t << (*it) << ": " << findDependencies((*it)).join(" \\\n\t\t") << "\n\t"
<< "$(UIC) " << " -embed " << project->first("QMAKE_ORIG_TARGET")
<< " " << findDependencies((*it)).join(" ") << " -o " << (*it) << endl << endl;
}
}
}
void
MakefileGenerator::writeInstalls(QTextStream &t, const QString &installs)
{
QString all_installs, all_uninstalls;
QStringList &l = project->variables()[installs];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString pvar = (*it) + ".path";
if(project->variables()[pvar].isEmpty()) {
warn_msg(WarnLogic, "%s is not defined: install target not created\n", pvar.latin1());
continue;
}
bool do_default = TRUE;
- QString target, dst="$(INSTALL_ROOT)" + Option::fixPathToTargetOS(project->variables()[pvar].first(), FALSE);
+ const QString root = "$(INSTALL_ROOT)";
+ QString target, dst= fileFixify(project->variables()[pvar].first());
+#ifndef Q_WS_WIN
if(dst.right(1) != Option::dir_sep)
dst += Option::dir_sep;
- QStringList tmp, &uninst = project->variables()[(*it) + ".uninstall"];
- //other
- tmp = project->variables()[(*it) + ".extra"];
- if(!tmp.isEmpty()) {
+#endif
+ QStringList tmp, &uninst = project->variables()[(*it) + ".uninstall"];
+ //other
+ tmp = project->variables()[(*it) + ".extra"];
+ if(!tmp.isEmpty()) {
do_default = FALSE;
if(!target.isEmpty())
- target += "\n\t";
- target += tmp.join(" ");
- }
- //masks
- tmp = project->variables()[(*it) + ".files"];
- if(!tmp.isEmpty()) {
+ target += "\n\t";
+ target += tmp.join(" ");
+ }
+ //masks
+ tmp = project->variables()[(*it) + ".files"];
+ if(!tmp.isEmpty()) {
if(!target.isEmpty())
- target += "\n";
+ target += "\n";
do_default = FALSE;
for(QStringList::Iterator wild_it = tmp.begin(); wild_it != tmp.end(); ++wild_it) {
QString wild = Option::fixPathToLocalOS((*wild_it), FALSE), wild_var = fileFixify(wild);
+ QString dirstr = QDir::currentDirPath(), filestr = wild;
+ int slsh = filestr.findRev(Option::dir_sep);
+ if(slsh != -1) {
+ dirstr = filestr.left(slsh+1);
+ filestr = filestr.right(filestr.length() - slsh - 1);
+ }
+ if(dirstr.right(Option::dir_sep.length()) != Option::dir_sep)
+ dirstr += Option::dir_sep;
if(QFile::exists(wild)) { //real file
+ QString file = wild;
QFileInfo fi(wild);
- target += QString("\t-") + (fi.isDir() ? "$(COPY_DIR)" : "$(COPY_FILE)") +
- " \"" + Option::fixPathToTargetOS(fileFixify(wild), FALSE) + "\" \"" + fileFixify(dst) + "\"\n";
+ if(!target.isEmpty())
+ target += "\t";
+ target += QString(fi.isDir() ? "-$(COPY_DIR)" : "-$(COPY_FILE)") + " \"" +
+ Option::fixPathToTargetOS(fileFixify(wild), FALSE) + "\" \"" + root + dst + "\"\n";
if(!project->isActiveConfig("debug") &&
!fi.isDir() && fi.isExecutable() && !project->isEmpty("QMAKE_STRIP"))
- target += QString("\t") + var("QMAKE_STRIP") + " \"" + fileFixify(dst + wild) + "\"\n";
- uninst.append(QString("-$(DEL_FILE) -r") + " \"" + fileFixify(dst + wild) + "\"");
+ target += QString("\t-") + var("QMAKE_STRIP") + " \"" + root + fileFixify(dst + filestr) + "\"\n";
+ if(!uninst.isEmpty())
+ uninst.append("\n\t");
+ uninst.append(
+#ifdef Q_WS_WIN
+ QString("-$(DEL_FILE)")
+#else
+ QString("-$(DEL_FILE) -r")
+#endif
+ + " \"" + root + fileFixify(dst + filestr) + "\"");
continue;
}
- QString dirstr = QDir::currentDirPath(), f = wild; //wild
- int slsh = f.findRev(Option::dir_sep);
- if(slsh != -1) {
- dirstr = f.left(slsh+1);
- f = f.right(f.length() - slsh - 1);
- }
- if(dirstr.right(Option::dir_sep.length()) != Option::dir_sep)
- dirstr += Option::dir_sep;
- if(!uninst.isEmpty())
- uninst.append("\n\t");
- uninst.append(QString("-$(DEL_FILE) -r") + " " + fileFixify(dst + f) + "");
-
- QDir dir(dirstr, f);
+ QDir dir(dirstr, filestr); //wild
for(uint x = 0; x < dir.count(); x++) {
QString file = dir[x];
if(file == "." || file == "..") //blah
continue;
+ if(!uninst.isEmpty())
+ uninst.append("\n\t");
+ uninst.append(
+#ifdef Q_WS_WIN
+ QString("-$(DEL_FILE)")
+#else
+ QString("-$(DEL_FILE) -r")
+#endif
+ + " \"" + root + fileFixify(dst + file) + "\"");
QFileInfo fi(file);
- target += QString("\t-") + (fi.isDir() ? "$(COPY_DIR)" : "$(COPY_FILE)") +
- " \"" + Option::fixPathToTargetOS(fileFixify(dirstr + file), FALSE) +
- "\" \"" + fileFixify(dst) + "\"\n";
+ if(!target.isEmpty())
+ target += "\t";
+ target += QString(fi.isDir() ? "-$(COPY_DIR)" : "-$(COPY_FILE)") + " \"" +
+ Option::fixPathToTargetOS(fileFixify(dirstr + file), FALSE) +
+ "\" \"" + root + fileFixify(dst) + "\"\n";
if(!project->isActiveConfig("debug") &&
!fi.isDir() && fi.isExecutable() && !project->isEmpty("QMAKE_STRIP"))
- target += QString("\t") + var("QMAKE_STRIP") + " \"" + fileFixify(dst + file) + "\"\n";
+ target += QString("\t-") + var("QMAKE_STRIP") + " \"" + root + fileFixify(dst + file) + "\"\n";
}
}
- }
- //default?
+ }
+ //default?
if(do_default)
target = defaultInstall((*it));
if(!target.isEmpty()) {
- t << "install_" << (*it) << ": " << "\n\t"
- << "@test -d " << dst << " || mkdir -p " << dst << "\n\t"
- << target << endl << endl;
+ t << "install_" << (*it) << ": " << "\n\t";
+ const QStringList &dirs = project->variables()[pvar];
+ for(QStringList::ConstIterator pit = dirs.begin(); pit != dirs.end(); ++pit) {
+ QString tmp_dst = fileFixify((*pit));
+#ifndef Q_WS_WIN
+ if(tmp_dst.right(1) != Option::dir_sep)
+ tmp_dst += Option::dir_sep;
+#endif
+ t << mkdir_p_asstring(root+tmp_dst) << "\n\t";
+ }
+ t << target << endl << endl;
all_installs += QString("install_") + (*it) + " ";
if(!uninst.isEmpty()) {
t << "uninstall_" << (*it) << ": " << "\n\t"
- << uninst.join(" ") << "\n\t"
- << "-$(DEL_DIR) \"" << dst << "\"" << endl << endl;
+ << uninst.join("") << "\n\t"
+ << "-$(DEL_DIR) \"" << ( root + dst ) << "\"" << endl << endl;
all_uninstalls += "uninstall_" + (*it) + " ";
}
t << endl;
} else {
debug_msg(1, "no definition for install %s: install target not created",(*it).latin1());
}
}
t << "install: all " << all_installs << "\n\n";
t << "uninstall: " << all_uninstalls << "\n\n";
}
QString
MakefileGenerator::var(const QString &var)
{
return val(project->variables()[var]);
}
QString
MakefileGenerator::val(const QStringList &varList)
{
return valGlue(varList, "", " ", "");
}
QString
@@ -1766,193 +1921,213 @@ QString MakefileGenerator::build_args()
if(ret.isEmpty()) {
ret = "$(QMAKE)";
// general options and arguments
ret += buildArgs();
//output
QString ofile = Option::fixPathToTargetOS(fileFixify(Option::output.name()));
if (!ofile.isEmpty() && ofile != project->first("QMAKE_MAKEFILE"))
ret += " -o " + ofile;
//inputs
QStringList files = fileFixify(Option::mkfile::project_files);
ret += " " + files.join(" ");
}
return ret;
}
bool
MakefileGenerator::writeHeader(QTextStream &t)
{
time_t foo = time(NULL);
t << "#############################################################################" << endl;
t << "# Makefile for building: " << var("TARGET") << endl;
- t << "# Generated by qmake (" << qmake_version() << ") on: " << ctime(&foo);
+ t << "# Generated by qmake (" << qmake_version() << ") (Qt " << QT_VERSION_STR << ") on: " << ctime(&foo);
t << "# Project: " << fileFixify(project->projectFile()) << endl;
t << "# Template: " << var("TEMPLATE") << endl;
t << "# Command: " << build_args() << endl;
t << "#############################################################################" << endl;
t << endl;
return TRUE;
}
//makes my life easier..
bool
MakefileGenerator::writeMakeQmake(QTextStream &t)
{
QString ofile = Option::fixPathToTargetOS(fileFixify(Option::output.name()));
- if(project->isEmpty("QMAKE_FAILED_REQUIREMENTS") &&
+ if(project->isEmpty("QMAKE_FAILED_REQUIREMENTS") && !project->isActiveConfig("no_autoqmake") &&
!project->isEmpty("QMAKE_INTERNAL_PRL_FILE")) {
QStringList files = fileFixify(Option::mkfile::project_files);
t << project->first("QMAKE_INTERNAL_PRL_FILE") << ": " << "\n\t"
<< "@$(QMAKE) -prl " << buildArgs() << " " << files.join(" ") << endl;
}
QString pfile = project->projectFile();
if(pfile != "(stdin)") {
QString qmake = build_args();
if(!ofile.isEmpty() && !project->isActiveConfig("no_autoqmake")) {
t << ofile << ": " << fileFixify(pfile) << " ";
if(Option::mkfile::do_cache)
t << fileFixify(Option::mkfile::cachefile) << " ";
if(!specdir().isEmpty())
t << specdir() << Option::dir_sep << "qmake.conf" << " ";
t << project->variables()["QMAKE_INTERNAL_INCLUDED_FILES"].join(" \\\n\t\t") << "\n\t"
<< qmake <<endl;
}
if(project->first("QMAKE_ORIG_TARGET") != "qmake") {
t << "qmake: " <<
project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].join(" \\\n\t\t") << "\n\t"
<< "@" << qmake << endl << endl;
}
}
return TRUE;
}
QStringList
MakefileGenerator::fileFixify(const QStringList& files, const QString &out_dir, const QString &in_dir, bool force_fix) const
{
if(files.isEmpty())
return files;
QStringList ret;
for(QStringList::ConstIterator it = files.begin(); it != files.end(); ++it) {
if(!(*it).isEmpty())
ret << fileFixify((*it), out_dir, in_dir, force_fix);
}
return ret;
}
QString
MakefileGenerator::fileFixify(const QString& file0, const QString &out_d, const QString &in_d, bool force_fix) const
{
+ if(file0.isEmpty())
+ return file0;
+ QString key = file0;
+ if(!in_d.isEmpty() || !out_d.isEmpty() || force_fix)
+ key.prepend(in_d + "--" + out_d + "--" + QString::number((int)force_fix) + "-");
+ if(fileFixed.contains(key))
+ return fileFixed[key];
+
QString file = file0;
- if(file.isEmpty())
- return file;
int depth = 4;
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
if(project && !project->isEmpty("QMAKE_PROJECT_DEPTH"))
depth = project->first("QMAKE_PROJECT_DEPTH").toInt();
else if(Option::mkfile::cachefile_depth != -1)
depth = Option::mkfile::cachefile_depth;
}
QChar quote;
if((file.startsWith("'") || file.startsWith("\"")) && file.startsWith(file.right(1))) {
quote = file.at(0);
file = file.mid(1, file.length() - 2);
}
QString orig_file = file;
if(!force_fix && project->isActiveConfig("no_fixpath")) {
if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH")) { //absoluteify it
QString qfile = Option::fixPathToLocalOS(file);
if(QDir::isRelativePath(file)) { //already absolute
QFileInfo fi(qfile);
if(!fi.convertToAbs()) //strange
file = fi.filePath();
}
}
} else { //fix it..
QString qfile(Option::fixPathToLocalOS(file, TRUE)), in_dir(in_d), out_dir(out_d);
{
if(out_dir.isNull())
out_dir = Option::output_dir;
if(out_dir == ".")
out_dir = QDir::currentDirPath();
if(in_dir.isEmpty() || in_dir == ".")
in_dir = QDir::currentDirPath();
if(!QDir::isRelativePath(in_dir) || !QDir::isRelativePath(out_dir)) {
QFileInfo in_fi(in_dir);
if(!in_fi.convertToAbs())
in_dir = in_fi.filePath();
QFileInfo out_fi(out_dir);
if(!out_fi.convertToAbs())
out_dir = out_fi.filePath();
}
+ QString in_canonical_dir = QDir(in_dir).canonicalPath(),
+ out_canonical_dir = QDir(out_dir).canonicalPath();
+ if(!in_canonical_dir.isEmpty())
+ in_dir = in_canonical_dir;
+ if(!out_canonical_dir.isEmpty())
+ out_dir = out_canonical_dir;
}
if(out_dir != in_dir || !QDir::isRelativePath(qfile)) {
if(QDir::isRelativePath(qfile)) {
if(file.left(Option::dir_sep.length()) != Option::dir_sep &&
in_dir.right(Option::dir_sep.length()) != Option::dir_sep)
file.prepend(Option::dir_sep);
file.prepend(in_dir);
}
file = Option::fixPathToTargetOS(file, FALSE);
+ if(QFile::exists(file) && file == Option::fixPathToTargetOS(file, TRUE)) {
+ QString real_file = QDir(file).canonicalPath();
+ if(!real_file.isEmpty())
+ file = real_file;
+ }
QString match_dir = Option::fixPathToTargetOS(out_dir, FALSE);
if(file == match_dir) {
file = "";
} else if(file.startsWith(match_dir) &&
file.mid(match_dir.length(), Option::dir_sep.length()) == Option::dir_sep) {
file = file.right(file.length() - (match_dir.length() + 1));
} else {
for(int i = 1; i <= depth; i++) {
int sl = match_dir.findRev(Option::dir_sep);
if(sl == -1)
break;
match_dir = match_dir.left(sl);
if(match_dir.isEmpty())
break;
if(file.startsWith(match_dir) &&
file.mid(match_dir.length(), Option::dir_sep.length()) == Option::dir_sep) {
//concat
int remlen = file.length() - (match_dir.length() + 1);
if (remlen < 0)
remlen = 0;
file = file.right(remlen);
//prepend
for(int o = 0; o < i; o++)
file.prepend(".." + Option::dir_sep);
}
}
}
}
}
file = Option::fixPathToTargetOS(file, FALSE);
+ if(file.isEmpty())
+ file = ".";
if(!quote.isNull())
file = quote + file + quote;
debug_msg(3, "Fixed %s :: to :: %s (%d)", orig_file.latin1(), file.latin1(), depth);
+ ((MakefileGenerator*)this)->fileFixed.insert(key, file);
return file;
}
QString
MakefileGenerator::cleanFilePath(const QString &file) const
{
return fileFixify(Option::fixPathToTargetOS(file));
}
void MakefileGenerator::logicWarn(const QString &f, const QString &w)
{
if(!(Option::warn_level & WarnLogic))
return;
QString file = f;
int slsh = f.findRev(Option::dir_sep);
if(slsh != -1)
file = file.right(file.length() - slsh - 1);
QStringList &l = project->variables()[w];
for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) {
QString file2((*val_it));
slsh = file2.findRev(Option::dir_sep);
if(slsh != -1)
file2 = file2.right(file2.length() - slsh - 1);
if(file2 == file) {
@@ -2018,68 +2193,71 @@ MakefileGenerator::openOutput(QFile &file) const
}
}
if(QDir::isRelativePath(file.name()))
file.setName(Option::output_dir + file.name()); //pwd when qmake was run
if(project->isEmpty("QMAKE_MAKEFILE"))
project->variables()["QMAKE_MAKEFILE"].append(file.name());
int slsh = file.name().findRev(Option::dir_sep);
if(slsh != -1)
createDir(file.name().left(slsh));
if(file.open(IO_WriteOnly | IO_Translate)) {
QFileInfo fi(Option::output);
QString od = Option::fixPathToTargetOS((fi.isSymLink() ? fi.readLink() : fi.dirPath()) );
if(QDir::isRelativePath(od))
od.prepend(Option::output_dir);
Option::output_dir = od;
return TRUE;
}
return FALSE;
}
//Factory thing
#include "unixmake.h"
-#include "borland_bmake.h"
#include "msvc_nmake.h"
+#include "borland_bmake.h"
+#include "mingw_make.h"
#include "msvc_dsp.h"
#include "msvc_vcproj.h"
#include "metrowerks_xml.h"
#include "pbuilder_pbx.h"
#include "projectgenerator.h"
MakefileGenerator *
MakefileGenerator::create(QMakeProject *proj)
{
if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT)
return new ProjectGenerator(proj);
MakefileGenerator *mkfile = NULL;
QString gen = proj->first("MAKEFILE_GENERATOR");
if(gen.isEmpty()) {
fprintf(stderr, "No generator specified in config file: %s\n",
proj->projectFile().latin1());
} else if(gen == "UNIX") {
mkfile = new UnixMakefileGenerator(proj);
} else if(gen == "MSVC") {
- // Visual Studio =< v6.0
+ // Visual Studio =< v6.0
if(proj->first("TEMPLATE").find(QRegExp("^vc.*")) != -1)
mkfile = new DspMakefileGenerator(proj);
else
mkfile = new NmakeMakefileGenerator(proj);
} else if(gen == "MSVC.NET") {
- // Visual Studio >= v7.0
+ // Visual Studio >= v7.0
if(proj->first("TEMPLATE").find(QRegExp("^vc.*")) != -1)
mkfile = new VcprojGenerator(proj);
else
mkfile = new NmakeMakefileGenerator(proj);
} else if(gen == "BMAKE") {
mkfile = new BorlandMakefileGenerator(proj);
+ } else if(gen == "MINGW") {
+ mkfile = new MingwMakefileGenerator(proj);
} else if(gen == "METROWERKS") {
mkfile = new MetrowerksMakefileGenerator(proj);
} else if(gen == "PROJECTBUILDER") {
mkfile = new ProjectBuilderMakefileGenerator(proj);
} else {
fprintf(stderr, "Unknown generator specified: %s\n", gen.latin1());
}
return mkfile;
}
diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h
index 1d19d98..4fdabe8 100644
--- a/qmake/generators/makefile.h
+++ b/qmake/generators/makefile.h
@@ -1,104 +1,104 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef __MAKEFILE_H__
#define __MAKEFILE_H__
#include "option.h"
#include "project.h"
#include <qtextstream.h>
class MakefileGenerator
{
QString spec;
bool init_opath_already, init_already, moc_aware, no_io;
QStringList createObjectList(const QString &var);
QString build_args();
- QMap<QString, QString> depHeuristics, depKeyMap;
+ QMap<QString, QString> depHeuristics, depKeyMap, fileFixed;
QMap<QString, QString> mocablesToMOC, mocablesFromMOC;
QMap<QString, QStringList> depends;
protected:
void writeObj(QTextStream &, const QString &obj, const QString &src);
void writeUicSrc(QTextStream &, const QString &ui);
void writeMocObj(QTextStream &, const QString &obj, const QString &src);
void writeMocSrc(QTextStream &, const QString &src);
void writeLexSrc(QTextStream &, const QString &lex);
void writeYaccSrc(QTextStream &, const QString &yac);
void writeInstalls(QTextStream &t, const QString &installs);
void writeImageObj(QTextStream &t, const QString &obj);
void writeImageSrc(QTextStream &t, const QString &images);
protected:
QMakeProject *project;
class MakefileDependDir {
public:
- MakefileDependDir(QString r, QString l) : real_dir(r), local_dir(l) { }
+ MakefileDependDir(const QString &r, const QString &l) : real_dir(r), local_dir(l) { }
QString real_dir, local_dir;
};
- bool generateDependencies(QPtrList<MakefileDependDir> &dirs, QString x, bool recurse);
+ bool generateDependencies(QPtrList<MakefileDependDir> &dirs, const QString &x, bool recurse);
QString buildArgs();
QString specdir();
QString cleanFilePath(const QString &file) const;
- bool generateMocList(QString fn);
+ bool generateMocList(const QString &fn);
QString findMocSource(const QString &moc_file) const;
QString findMocDestination(const QString &src_file) const;
QStringList &findDependencies(const QString &file);
void setNoIO(bool o);
bool noIO() const;
void setMocAware(bool o);
bool mocAware() const;
void logicWarn(const QString &, const QString &);
virtual bool doDepends() const { return Option::mkfile::do_deps; }
bool writeHeader(QTextStream &);
virtual bool writeMakefile(QTextStream &);
virtual bool writeMakeQmake(QTextStream &);
void initOutPaths();
virtual void init();
//for installs
virtual QString defaultInstall(const QString &);
//for prl
bool processPrlFile(QString &);
diff --git a/qmake/generators/projectgenerator.cpp b/qmake/generators/projectgenerator.cpp
index 5ff6250..1515216 100644
--- a/qmake/generators/projectgenerator.cpp
+++ b/qmake/generators/projectgenerator.cpp
@@ -21,88 +21,96 @@
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "projectgenerator.h"
#include "option.h"
#include <qdir.h>
#include <qfile.h>
#include <qfileinfo.h>
#include <qregexp.h>
+QString project_builtin_regx() //calculate the builtin regular expression..
+{
+ QString ret;
+ QStringList builtin_exts(".c");
+ builtin_exts << Option::ui_ext << Option::yacc_ext << Option::lex_ext << ".ts";
+ builtin_exts += Option::h_ext + Option::cpp_ext;
+ for(QStringList::Iterator ext_it = builtin_exts.begin();
+ ext_it != builtin_exts.end(); ++ext_it) {
+ if(!ret.isEmpty())
+ ret += "; ";
+ ret += QString("*") + (*ext_it);
+ }
+ return ret;
+}
+
+
ProjectGenerator::ProjectGenerator(QMakeProject *p) : MakefileGenerator(p), init_flag(FALSE)
{
}
void
ProjectGenerator::init()
{
if(init_flag)
return;
int file_count = 0;
init_flag = TRUE;
QMap<QString, QStringList> &v = project->variables();
QString templ = Option::user_template.isEmpty() ? QString("app") : Option::user_template;
if(!Option::user_template_prefix.isEmpty())
templ.prepend(Option::user_template_prefix);
v["TEMPLATE_ASSIGN"] += templ;
//figure out target
if(Option::output.name() == "-" || Option::output.name().isEmpty())
v["TARGET"] = QStringList("unknown");
//the scary stuff
if(project->first("TEMPLATE_ASSIGN") != "subdirs") {
- QString builtin_regex;
- { //calculate the builtin regular expression..
- QStringList builtin_exts(".c");
- builtin_exts << Option::ui_ext << Option::yacc_ext << Option::lex_ext;
- builtin_exts += Option::h_ext + Option::cpp_ext;
- for(QStringList::Iterator ext_it = builtin_exts.begin();
- ext_it != builtin_exts.end(); ++ext_it) {
- if(!builtin_regex.isEmpty())
- builtin_regex += "; ";
- builtin_regex += QString("*") + (*ext_it);
- }
- }
+ QString builtin_regex = project_builtin_regx();
QStringList dirs = Option::projfile::project_dirs;
- if(Option::projfile::do_pwd)
+ if(Option::projfile::do_pwd) {
+ if(!v["INCLUDEPATH"].contains("."))
+ v["INCLUDEPATH"] += ".";
dirs.prepend(QDir::currentDirPath());
+ }
for(QStringList::Iterator pd = dirs.begin(); pd != dirs.end(); pd++) {
QString dir, regex;
bool add_depend = FALSE;
if(QFile::exists((*pd))) {
QFileInfo fi((*pd));
if(fi.isDir()) {
dir = (*pd);
add_depend = TRUE;
if(dir.right(1) != Option::dir_sep)
dir += Option::dir_sep;
if(Option::projfile::do_recursive) {
QDir d(dir);
d.setFilter(QDir::Dirs);
for(int i = 0; i < (int)d.count(); i++) {
if(d[i] != "." && d[i] != "..")
dirs.append(dir + d[i] + QDir::separator() + builtin_regex);
}
}
regex = builtin_regex;
} else {
QString file = (*pd);
int s = file.findRev(Option::dir_sep);
if(s != -1)
@@ -119,51 +127,50 @@ ProjectGenerator::init()
int s = regex.findRev(Option::dir_sep);
if(s != -1) {
dir = regex.left(s+1);
regex = regex.right(regex.length() - (s+1));
}
if(Option::projfile::do_recursive) {
QDir d(dir);
d.setFilter(QDir::Dirs);
for(int i = 0; i < (int)d.count(); i++) {
if(d[i] != "." && d[i] != "..")
dirs.append(dir + d[i] + QDir::separator() + regex);
}
}
QDir d(dir, regex);
for(int i = 0; i < (int)d.count(); i++) {
QString file = dir + d[i];
if (addFile(file)) {
add_depend = TRUE;
file_count++;
}
}
}
if(add_depend && !dir.isEmpty() && !v["DEPENDPATH"].contains(dir)) {
QFileInfo fi(dir);
- if(fi.absFilePath() != QDir::currentDirPath()) {
+ if(fi.absFilePath() != QDir::currentDirPath())
v["DEPENDPATH"] += fileFixify(dir);
- }
}
}
}
if(!file_count) { //shall we try a subdir?
QStringList dirs = Option::projfile::project_dirs;
if(Option::projfile::do_pwd)
dirs.prepend(".");
for(QStringList::Iterator pd = dirs.begin(); pd != dirs.end(); pd++) {
if(QFile::exists((*pd))) {
QString newdir = (*pd);
QFileInfo fi(newdir);
if(fi.isDir()) {
newdir = fileFixify(newdir);
QStringList &subdirs = v["SUBDIRS"];
if(QFile::exists(fi.filePath() + QDir::separator() + fi.fileName() + ".pro") &&
!subdirs.contains(newdir)) {
subdirs.append(newdir);
} else {
QDir d(newdir, "*.pro");
d.setFilter(QDir::Files);
for(int i = 0; i < (int)d.count(); i++) {
QString nd = newdir + QDir::separator() + d[i];
fileFixify(nd);
if(d[i] != "." && d[i] != ".." && !subdirs.contains(nd)) {
@@ -220,72 +227,81 @@ ProjectGenerator::init()
}
v["TEMPLATE_ASSIGN"] = "subdirs";
return;
}
QPtrList<MakefileDependDir> deplist;
deplist.setAutoDelete(TRUE);
{
QStringList &d = v["DEPENDPATH"];
for(QStringList::Iterator it = d.begin(); it != d.end(); ++it) {
QString r = (*it), l = Option::fixPathToLocalOS((*it));
deplist.append(new MakefileDependDir(r, l));
}
}
QStringList &h = v["HEADERS"];
bool no_qt_files = TRUE;
QString srcs[] = { "SOURCES", "YACCSOURCES", "LEXSOURCES", "INTERFACES", QString::null };
for(int i = 0; !srcs[i].isNull(); i++) {
QStringList &l = v[srcs[i]];
for(QStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) {
if(generateDependencies(deplist, (*val_it), TRUE)) {
QStringList &tmp = findDependencies((*val_it));
if(!tmp.isEmpty()) {
for(QStringList::Iterator dep_it = tmp.begin(); dep_it != tmp.end(); ++dep_it) {
- QString file_no_path = (*dep_it).right(
- (*dep_it).length() - ((*dep_it).findRev(Option::dir_sep)+1));
+ QString file_dir = (*dep_it).section(Option::dir_sep, 0, -2),
+ file_no_path = (*dep_it).section(Option::dir_sep, -1);
+ if(!file_dir.isEmpty()) {
+ for(MakefileDependDir *mdd = deplist.first(); mdd; mdd = deplist.next()) {
+ if(mdd->local_dir == file_dir && !v["INCLUDEPATH"].contains(mdd->real_dir))
+ v["INCLUDEPATH"] += mdd->real_dir;
+ }
+ }
if(no_qt_files && file_no_path.find(QRegExp("^q[a-z_0-9].h$")) != -1)
no_qt_files = FALSE;
QString h_ext;
- for(QStringList::Iterator hit = Option::h_ext.begin(); hit != Option::h_ext.end(); ++hit) {
+ for(QStringList::Iterator hit = Option::h_ext.begin();
+ hit != Option::h_ext.end(); ++hit) {
if((*dep_it).endsWith((*hit))) {
h_ext = (*hit);
break;
}
}
if(!h_ext.isEmpty()) {
if((*dep_it).left(1).lower() == "q") {
QString qhdr = (*dep_it).lower();
if(file_no_path == "qthread.h")
addConfig("thread");
}
for(QStringList::Iterator cppit = Option::cpp_ext.begin();
cppit != Option::cpp_ext.end(); ++cppit) {
- QString src((*dep_it).left((*dep_it).length() - h_ext.length()) + (*cppit));
+ QString src((*dep_it).left((*dep_it).length() - h_ext.length()) +
+ (*cppit));
if(QFile::exists(src)) {
bool exists = FALSE;
QStringList &srcl = v["SOURCES"];
- for(QStringList::Iterator src_it = srcl.begin(); src_it != srcl.end(); ++src_it) {
+ for(QStringList::Iterator src_it = srcl.begin();
+ src_it != srcl.end(); ++src_it) {
if((*src_it).lower() == src.lower()) {
exists = TRUE;
break;
}
}
if(!exists)
srcl.append(src);
}
}
} else if((*dep_it).endsWith(Option::lex_ext) &&
file_no_path.startsWith(Option::lex_mod)) {
addConfig("lex_included");
}
if(!h.contains((*dep_it))) {
if(generateMocList((*dep_it)) && !findMocDestination((*dep_it)).isEmpty())
h += (*dep_it);
}
}
}
}
}
}
if(h.isEmpty())
addConfig("moc", FALSE);
@@ -316,56 +332,58 @@ ProjectGenerator::init()
++val_it;
}
}
}
}
bool
ProjectGenerator::writeMakefile(QTextStream &t)
{
t << "######################################################################" << endl;
t << "# Automatically generated by qmake (" << qmake_version() << ") " << QDateTime::currentDateTime().toString() << endl;
t << "######################################################################" << endl << endl;
QStringList::Iterator it;
for(it = Option::before_user_vars.begin(); it != Option::before_user_vars.end(); ++it)
t << (*it) << endl;
t << getWritableVar("TEMPLATE_ASSIGN", FALSE);
if(project->first("TEMPLATE_ASSIGN") == "subdirs") {
t << endl << "# Directories" << "\n"
<< getWritableVar("SUBDIRS");
} else {
t << getWritableVar("TARGET")
<< getWritableVar("CONFIG", FALSE)
<< getWritableVar("CONFIG_REMOVE", FALSE)
- << getWritableVar("DEPENDPATH") << endl;
+ << getWritableVar("DEPENDPATH")
+ << getWritableVar("INCLUDEPATH") << endl;
t << "# Input" << "\n";
t << getWritableVar("HEADERS")
<< getWritableVar("INTERFACES")
<< getWritableVar("LEXSOURCES")
<< getWritableVar("YACCSOURCES")
- << getWritableVar("SOURCES");
+ << getWritableVar("SOURCES")
+ << getWritableVar("TRANSLATIONS");
}
for(it = Option::after_user_vars.begin(); it != Option::after_user_vars.end(); ++it)
t << (*it) << endl;
return TRUE;
}
bool
ProjectGenerator::addConfig(const QString &cfg, bool add)
{
QString where = "CONFIG";
if(!add)
where = "CONFIG_REMOVE";
if(!project->variables()[where].contains(cfg)) {
project->variables()[where] += cfg;
return TRUE;
}
return FALSE;
}
bool
ProjectGenerator::addFile(QString file)
{
file = fileFixify(file, QDir::currentDirPath());
@@ -382,48 +400,50 @@ ProjectGenerator::addFile(QString file)
if(QFile::exists(file.left(file.length() - (*cppit).length()) + Option::ui_ext))
return FALSE;
else
where = "SOURCES";
break;
}
}
if(where.isEmpty()) {
for(QStringList::Iterator hit = Option::h_ext.begin(); hit != Option::h_ext.end(); ++hit) {
if(file.endsWith((*hit))) {
where = "HEADERS";
break;
}
}
}
if(where.isEmpty()) {
if(file.endsWith(Option::ui_ext))
where = "INTERFACES";
else if(file.endsWith(".c"))
where = "SOURCES";
else if(file.endsWith(Option::lex_ext))
where = "LEXSOURCES";
else if(file.endsWith(Option::yacc_ext))
where = "YACCSOURCES";
+ else if(file.endsWith(".ts"))
+ where = "TRANSLATIONS";
}
QString newfile = fileFixify(file);
if(!where.isEmpty() && !project->variables()[where].contains(file)) {
project->variables()[where] += newfile;
return TRUE;
}
return FALSE;
}
QString
ProjectGenerator::getWritableVar(const QString &v, bool /*fixPath*/)
{
QStringList &vals = project->variables()[v];
if(vals.isEmpty())
return "";
QString ret;
if(v.endsWith("_REMOVE"))
ret = v.left(v.length() - 7) + " -= ";
else if(v.endsWith("_ASSIGN"))
ret = v.left(v.length() - 7) + " = ";
else
diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp
index 7df95b2..e274481 100644
--- a/qmake/generators/unix/unixmake.cpp
+++ b/qmake/generators/unix/unixmake.cpp
@@ -1,32 +1,32 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
-** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2003 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
@@ -51,60 +51,59 @@ UnixMakefileGenerator::init()
return;
init_flag = TRUE;
if(!project->isEmpty("QMAKE_FAILED_REQUIREMENTS")) /* no point */
return;
QStringList &configs = project->variables()["CONFIG"];
/* this should probably not be here, but I'm using it to wrap the .t files */
if(project->first("TEMPLATE") == "app")
project->variables()["QMAKE_APP_FLAG"].append("1");
else if(project->first("TEMPLATE") == "lib")
project->variables()["QMAKE_LIB_FLAG"].append("1");
else if(project->first("TEMPLATE") == "subdirs") {
MakefileGenerator::init();
if(project->isEmpty("MAKEFILE"))
project->variables()["MAKEFILE"].append("Makefile");
if(project->isEmpty("QMAKE"))
project->variables()["QMAKE"].append("qmake");
if(project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].findIndex("qmake_all") == -1)
project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].append("qmake_all");
return; /* subdirs is done */
}
if( project->isEmpty("QMAKE_EXTENSION_SHLIB") ) {
- QString os = project->variables()["QMAKESPEC"].first().section( '-', 0, 0 );
- if ( os == "cygwin" ) {
- project->variables()["QMAKE_EXTENSION_SHLIB"].append( "dll" );
- } else {
+ if ( project->isEmpty("QMAKE_CYGWIN_SHLIB") ) {
project->variables()["QMAKE_EXTENSION_SHLIB"].append( "so" );
+ } else {
+ project->variables()["QMAKE_EXTENSION_SHLIB"].append( "dll" );
}
}
if( project->isEmpty("QMAKE_COPY_FILE") )
project->variables()["QMAKE_COPY_FILE"].append( "$(COPY) -p" );
if( project->isEmpty("QMAKE_COPY_DIR") )
project->variables()["QMAKE_COPY_DIR"].append( "$(COPY) -pR" );
- //If the TARGET looks like a path split it into DESTDIR and the resulting TARGET
+ //If the TARGET looks like a path split it into DESTDIR and the resulting TARGET
if(!project->isEmpty("TARGET")) {
QString targ = project->first("TARGET");
int slsh = QMAX(targ.findRev('/'), targ.findRev(Option::dir_sep));
if(slsh != -1) {
if(project->isEmpty("DESTDIR"))
project->values("DESTDIR").append("");
else if(project->first("DESTDIR").right(1) != Option::dir_sep)
project->variables()["DESTDIR"] = project->first("DESTDIR") + Option::dir_sep;
project->variables()["DESTDIR"] = project->first("DESTDIR") + targ.left(slsh+1);
project->variables()["TARGET"] = targ.mid(slsh+1);
}
}
project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"];
bool is_qt = (project->first("TARGET") == "qt" || project->first("TARGET") == "qte" ||
project->first("TARGET") == "qt-mt" || project->first("TARGET") == "qte-mt");
bool extern_libs = !project->isEmpty("QMAKE_APP_FLAG") ||
(!project->isEmpty("QMAKE_LIB_FLAG") &&
project->isActiveConfig("dll")) || is_qt;
if(!project->isActiveConfig("global_init_link_order"))
project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"];
if ( (!project->isEmpty("QMAKE_LIB_FLAG") && !project->isActiveConfig("staticlib") ) ||
(project->isActiveConfig("qt") && project->isActiveConfig( "plugin" ) )) {
@@ -117,120 +116,120 @@ UnixMakefileGenerator::init()
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_OFF"];
} else if ( project->isActiveConfig("warn_on") ) {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_ON"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_ON"];
}
if ( project->isActiveConfig("debug") ) {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_DEBUG"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_DEBUG"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_DEBUG"];
} else {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RELEASE"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RELEASE"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_RELEASE"];
}
if(!project->isEmpty("QMAKE_INCREMENTAL"))
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_INCREMENTAL"];
else if(!project->isEmpty("QMAKE_LFLAGS_PREBIND") &&
!project->variables()["QMAKE_LIB_FLAG"].isEmpty() &&
project->isActiveConfig("dll"))
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_PREBIND"];
if(!project->isEmpty("QMAKE_INCDIR"))
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"];
if(!project->isEmpty("QMAKE_LIBDIR")) {
if ( !project->isEmpty("QMAKE_RPATH") )
- project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR", " " + var("QMAKE_RPATH"),
+ project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR", " " + var("QMAKE_RPATH"),
" " + var("QMAKE_RPATH"), "");
project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue( "QMAKE_LIBDIR", "-L", " -L", "" );
}
if ( extern_libs && (project->isActiveConfig("qt") || project->isActiveConfig("opengl")) ) {
if(configs.findIndex("x11lib") == -1)
configs.append("x11lib");
if ( project->isActiveConfig("opengl") && configs.findIndex("x11inc") == -1 )
configs.append("x11inc");
}
if ( project->isActiveConfig("x11") ) {
if(configs.findIndex("x11lib") == -1)
configs.append("x11lib");
if(configs.findIndex("x11inc") == -1)
configs.append("x11inc");
}
if ( project->isActiveConfig("qt") ) {
if ( project->isActiveConfig("accessibility" ) )
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT");
if ( project->isActiveConfig("tablet") )
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT");
if(configs.findIndex("moc")) configs.append("moc");
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_QT"];
if ( !project->isActiveConfig("debug") )
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG");
if ( !is_qt ) {
if ( !project->isEmpty("QMAKE_LIBDIR_QT") ) {
if ( !project->isEmpty("QMAKE_RPATH") )
- project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_QT", " " + var("QMAKE_RPATH"),
+ project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_QT", " " + var("QMAKE_RPATH"),
" " + var("QMAKE_RPATH"), "");
project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_QT", "-L", " -L", "");
}
if (project->isActiveConfig("thread") && !project->isEmpty("QMAKE_LIBS_QT_THREAD"))
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_THREAD"];
else
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT"];
}
}
- if ( project->isActiveConfig("thread") ) {
- if(project->isActiveConfig("qt"))
- project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT");
- if ( !project->isEmpty("QMAKE_CFLAGS_THREAD"))
- project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_THREAD"];
- if( !project->isEmpty("QMAKE_CXXFLAGS_THREAD"))
- project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_THREAD"];
- project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_THREAD"];
- project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_THREAD"];
- if(!project->isEmpty("QMAKE_LFLAGS_THREAD"))
- project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_THREAD"];
- }
if ( project->isActiveConfig("opengl") ) {
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_OPENGL"];
- if(!project->isEmpty("QMAKE_LIBDIR_OPENGL"))
+ if(!project->isEmpty("QMAKE_LIBDIR_OPENGL"))
project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_OPENGL", "-L", " -L", "");
if ( is_qt )
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL_QT"];
else
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL"];
}
if(project->isActiveConfig("global_init_link_order"))
project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"];
- if ( project->isActiveConfig("x11sm") )
- project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_X11SM"];
- if ( project->isActiveConfig("dylib") )
- project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_DYNLOAD"];
if ( project->isActiveConfig("x11inc") )
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_X11"];
if ( project->isActiveConfig("x11lib") ) {
if(!project->isEmpty("QMAKE_LIBDIR_X11"))
project->variables()["QMAKE_LIBDIR_FLAGS"] += varGlue("QMAKE_LIBDIR_X11", "-L", " -L", "");
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_X11"];
}
+ if ( project->isActiveConfig("x11sm") )
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_X11SM"];
+ if ( project->isActiveConfig("dylib") )
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_DYNLOAD"];
+ if ( project->isActiveConfig("thread") ) {
+ if(project->isActiveConfig("qt"))
+ project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT");
+ if ( !project->isEmpty("QMAKE_CFLAGS_THREAD"))
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_THREAD"];
+ if( !project->isEmpty("QMAKE_CXXFLAGS_THREAD"))
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_THREAD"];
+ project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_THREAD"];
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_THREAD"];
+ if(!project->isEmpty("QMAKE_LFLAGS_THREAD"))
+ project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_THREAD"];
+ }
if ( project->isActiveConfig("moc") )
setMocAware(TRUE);
if ( project->isEmpty("QMAKE_RUN_CC") )
project->variables()["QMAKE_RUN_CC"].append("$(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src");
if ( project->isEmpty("QMAKE_RUN_CC_IMP") )
project->variables()["QMAKE_RUN_CC_IMP"].append("$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<");
if ( project->isEmpty("QMAKE_RUN_CXX") )
project->variables()["QMAKE_RUN_CXX"].append("$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src");
if ( project->isEmpty("QMAKE_RUN_CXX_IMP") )
project->variables()["QMAKE_RUN_CXX_IMP"].append("$(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<");
project->variables()["QMAKE_FILETAGS"] += QStringList::split("HEADERS SOURCES TARGET DESTDIR", " ");
if ( !project->isEmpty("PRECOMPH") ) {
initOutPaths(); // Need to fix MOC_DIR since we do this before init()
QString allmoc = fileFixify(project->first("MOC_DIR") + "/allmoc.cpp", QDir::currentDirPath(), Option::output_dir);
project->variables()["SOURCES"].prepend(allmoc);
project->variables()["HEADERS_ORIG"] = project->variables()["HEADERS"];
project->variables()["HEADERS"].clear();
}
if( project->isActiveConfig("GNUmake") && !project->isEmpty("QMAKE_CFLAGS_DEPS"))
include_deps = TRUE; //do not generate deps
MakefileGenerator::init();
if ( project->isActiveConfig("resource_fork") && !project->isActiveConfig("console")) {
if(!project->isEmpty("QMAKE_APP_FLAG")) {
@@ -319,202 +318,287 @@ UnixMakefileGenerator::uniqueSetLFlags(const QStringList &list1, QStringList &li
framework_out = (*outit);
}
}
if(framework_out == framework_in) {
unique = FALSE;
break;
}
}
}
if(unique) {
unique = FALSE; //because I'm about to just insert it myself
if(as_one) {
ret.append("-framework " + framework_in);
} else {
ret.append("-framework");
ret.append(framework_in);
}
}
}
} else {
unique = (list2.findIndex((*it)) == -1);
}
} else if(QFile::exists((*it))) {
unique = (list2.findIndex((*it)) == -1);
- }
+ }
if(unique)
ret.append((*it));
}
return ret;
}
void
UnixMakefileGenerator::processPrlVariable(const QString &var, const QStringList &l)
{
- if(var == "QMAKE_PRL_LIBS")
+ if(var == "QMAKE_PRL_LIBS")
project->variables()["QMAKE_CURRENT_PRL_LIBS"] += uniqueSetLFlags(l, project->variables()["QMAKE_LIBS"]);
else
MakefileGenerator::processPrlVariable(var, l);
}
+bool
+UnixMakefileGenerator::findLibraries()
+{
+ QPtrList<MakefileDependDir> libdirs;
+ libdirs.setAutoDelete(TRUE);
+ const QString lflags[] = { "QMAKE_LIBDIR_FLAGS", "QMAKE_LIBS", QString::null };
+ for(int i = 0; !lflags[i].isNull(); i++) {
+ QStringList &l = project->variables()[lflags[i]];
+ for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QString stub, dir, extn, opt = (*it).stripWhiteSpace();
+ if(opt.startsWith("-")) {
+ if(opt.startsWith("-L")) {
+ QString r = opt.right(opt.length() - 2), l = r;
+ fixEnvVariables(l);
+ libdirs.append(new MakefileDependDir(r.replace("\"",""),
+ l.replace("\"","")));
+ } else if(opt.startsWith("-l")) {
+ stub = opt.mid(2);
+ } else if(project->isActiveConfig("macx") && opt.startsWith("-framework")) {
+ if(opt.length() > 11) {
+ opt = opt.mid(11);
+ } else {
+ ++it;
+ opt = (*it);
+ }
+ extn = "";
+ dir = "/System/Library/Frameworks/" + opt + ".framework/";
+ stub = opt;
+ }
+ } else {
+ extn = dir = "";
+ stub = opt;
+ int slsh = opt.findRev(Option::dir_sep);
+ if(slsh != -1) {
+ dir = opt.left(slsh);
+ stub = opt.mid(slsh+1);
+ }
+ QRegExp stub_reg("^.*lib(" + stub + "[^./=]*)\\.(.*)$");
+ if(stub_reg.exactMatch(stub)) {
+ stub = stub_reg.cap(1);
+ extn = stub_reg.cap(2);
+ }
+ }
+ if(!stub.isEmpty()) {
+ const QString modifs[] = { "-mt", QString::null };
+ for(int modif = 0; !modifs[modif].isNull(); modif++) {
+ bool found = FALSE;
+ QStringList extens;
+ if(!extn.isNull())
+ extens << extn;
+ else
+ extens << project->variables()["QMAKE_EXTENSION_SHLIB"].first() << "a";
+ for(QStringList::Iterator extit = extens.begin(); extit != extens.end(); ++extit) {
+ if(dir.isNull()) {
+ QString lib_stub;
+ for(MakefileDependDir *mdd = libdirs.first(); mdd; mdd = libdirs.next() ) {
+ if(QFile::exists(mdd->local_dir + Option::dir_sep + "lib" + stub +
+ modifs[modif] + "." + (*extit))) {
+ lib_stub = stub + modifs[modif];
+ break;
+ }
+ }
+ if(!lib_stub.isNull()) {
+ (*it) = "-l" + lib_stub;
+ found = TRUE;
+ break;
+ }
+ } else {
+ if(QFile::exists("lib" + stub + modifs[modif] + "." + (*extit))) {
+ (*it) = "lib" + stub + modifs[modif] + "." + (*extit);
+ found = TRUE;
+ break;
+ }
+ }
+ }
+ if(found)
+ break;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
void
UnixMakefileGenerator::processPrlFiles()
{
QDict<void> processed;
QPtrList<MakefileDependDir> libdirs;
libdirs.setAutoDelete(TRUE);
const QString lflags[] = { "QMAKE_LIBDIR_FLAGS", "QMAKE_LIBS", QString::null };
for(int i = 0; !lflags[i].isNull(); i++) {
for(bool ret = FALSE; TRUE; ret = FALSE) {
QStringList l_out;
QStringList &l = project->variables()[lflags[i]];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
project->variables()["QMAKE_CURRENT_PRL_LIBS"].clear();
QString opt = (*it).stripWhiteSpace();;
if(opt.startsWith("-")) {
if(opt.startsWith("-L")) {
QString r = opt.right(opt.length() - 2), l = r;
fixEnvVariables(l);
libdirs.append(new MakefileDependDir(r.replace("\"",""),
l.replace("\"","")));
} else if(opt.startsWith("-l") && !processed[opt]) {
QString lib = opt.right(opt.length() - 2), prl;
for(MakefileDependDir *mdd = libdirs.first(); mdd; mdd = libdirs.next() ) {
prl = mdd->local_dir + Option::dir_sep + "lib" + lib + Option::prl_ext;
if(processPrlFile(prl)) {
if(prl.startsWith(mdd->local_dir))
prl.replace(0, mdd->local_dir.length(), mdd->real_dir);
QRegExp reg("^.*lib(" + lib + "[^./=]*)\\..*$");
if(reg.exactMatch(prl))
prl = "-l" + reg.cap(1);
opt = prl;
processed.insert(opt, (void*)1);
ret = TRUE;
break;
}
}
} else if(project->isActiveConfig("macx") && opt.startsWith("-framework")) {
if(opt.length() > 11) {
opt = opt.mid(11);
} else {
++it;
opt = (*it);
}
QString prl = "/System/Library/Frameworks/" + opt +
".framework/" + opt + Option::prl_ext;
- if(processPrlFile(prl))
+ if(processPrlFile(prl))
ret = TRUE;
l_out.append("-framework");
}
if(!opt.isEmpty())
l_out.append(opt);
l_out += uniqueSetLFlags(project->variables()["QMAKE_CURRENT_PRL_LIBS"], l_out);
} else {
if(!processed[opt] && processPrlFile(opt)) {
processed.insert(opt, (void*)1);
ret = TRUE;
}
if(!opt.isEmpty())
l_out.append(opt);
l_out += uniqueSetLFlags(project->variables()["QMAKE_CURRENT_PRL_LIBS"], l_out);
}
}
if(ret && l != l_out)
l = l_out;
else
break;
}
}
}
QString
UnixMakefileGenerator::defaultInstall(const QString &t)
{
if(t != "target" || project->first("TEMPLATE") == "subdirs")
return QString();
bool resource = FALSE;
+ const QString root = "$(INSTALL_ROOT)";
QStringList &uninst = project->variables()[t + ".uninstall"];
- QString ret, destdir=fileFixify(project->first("DESTDIR"));
+ QString ret, destdir=project->first("DESTDIR");
QString targetdir = Option::fixPathToTargetOS(project->first("target.path"), FALSE);
if(!destdir.isEmpty() && destdir.right(1) != Option::dir_sep)
destdir += Option::dir_sep;
- targetdir = "$(INSTALL_ROOT)" + Option::fixPathToTargetOS(targetdir, FALSE);
+ targetdir = fileFixify(targetdir);
if(targetdir.right(1) != Option::dir_sep)
targetdir += Option::dir_sep;
QStringList links;
QString target="$(TARGET)";
if(project->first("TEMPLATE") == "app") {
target = "$(QMAKE_TARGET)";
if(project->isActiveConfig("resource_fork") && !project->isActiveConfig("console")) {
destdir += "../../../";
target += ".app";
resource = TRUE;
}
} else if(project->first("TEMPLATE") == "lib") {
if(project->isActiveConfig("create_prl") && !project->isEmpty("QMAKE_INTERNAL_PRL_FILE")) {
QString dst_prl = project->first("QMAKE_INTERNAL_PRL_FILE");
int slsh = dst_prl.findRev('/');
if(slsh != -1)
dst_prl = dst_prl.right(dst_prl.length() - slsh - 1);
- dst_prl = targetdir + dst_prl;
- ret += "-$(COPY) " + project->first("QMAKE_INTERNAL_PRL_FILE") + " " + dst_prl;
+ dst_prl = root + targetdir + dst_prl;
+ ret += "-$(COPY) \"" + project->first("QMAKE_INTERNAL_PRL_FILE") + "\" \"" + dst_prl + "\"";
if(!uninst.isEmpty())
uninst.append("\n\t");
uninst.append("-$(DEL_FILE) \"" + dst_prl + "\"");
}
- QString os = project->variables()["QMAKESPEC"].first().section( '-', 0, 0 );
- if ( os != "cygwin" ) {
+ if ( project->isEmpty("QMAKE_CYGWIN_SHLIB") ) {
if ( !project->isActiveConfig("staticlib") && !project->isActiveConfig("plugin") ) {
- if ( os == "hpux" ) {
- links << "$(TARGET0)";
- } else {
+ if ( project->isEmpty("QMAKE_HPUX_SHLIB") ) {
links << "$(TARGET0)" << "$(TARGET1)" << "$(TARGET2)";
+ } else {
+ links << "$(TARGET0)";
}
}
}
}
QString src_targ = target;
if(!destdir.isEmpty())
src_targ = Option::fixPathToTargetOS(destdir + target, FALSE);
- QString dst_targ = fileFixify(targetdir + target);
+ QString dst_targ = root + fileFixify(targetdir + target);
if(!ret.isEmpty())
ret += "\n\t";
ret += QString(resource ? "-$(COPY_DIR)" : "-$(COPY)") + " \"" +
src_targ + "\" \"" + dst_targ + "\"";
- if(!project->isEmpty("QMAKE_STRIP")) {
+ if(!project->isActiveConfig("debug") && !project->isEmpty("QMAKE_STRIP")) {
ret += "\n\t-" + var("QMAKE_STRIP");
+ if(!project->isEmpty("QMAKE_STRIPFLAGS_LIB") && project->first("TEMPLATE") == "lib")
+ ret += " " + var("QMAKE_STRIPFLAGS_LIB");
if(resource)
- ret = " \"" + dst_targ + "/Contents/MacOS/$(QMAKE_TARGET)";
+ ret = " \"" + dst_targ + "/Contents/MacOS/$(QMAKE_TARGET)\"";
else
ret += " \"" + dst_targ + "\"";
}
if(!uninst.isEmpty())
uninst.append("\n\t");
if(resource)
uninst.append("-$(DEL_FILE) -r \"" + dst_targ + "\"");
else
uninst.append("-$(DEL_FILE) \"" + dst_targ + "\"");
if(!links.isEmpty()) {
for(QStringList::Iterator it = links.begin(); it != links.end(); it++) {
if(Option::target_mode == Option::TARG_WIN_MODE ||
Option::target_mode == Option::TARG_MAC9_MODE) {
} else if(Option::target_mode == Option::TARG_UNIX_MODE ||
Option::target_mode == Option::TARG_MACX_MODE) {
QString link = Option::fixPathToTargetOS(destdir + (*it), FALSE);
int lslash = link.findRev(Option::dir_sep);
if(lslash != -1)
link = link.right(link.length() - (lslash + 1));
- QString dst_link = fileFixify(targetdir + link);
+ QString dst_link = root + fileFixify(targetdir + link);
ret += "\n\t-$(SYMLINK) \"$(TARGET)\" \"" + dst_link + "\"";
if(!uninst.isEmpty())
uninst.append("\n\t");
uninst.append("-$(DEL_FILE) \"" + dst_link + "\"");
}
}
}
return ret;
}
-
diff --git a/qmake/generators/unix/unixmake.h b/qmake/generators/unix/unixmake.h
index e889dcc..3d00214 100644
--- a/qmake/generators/unix/unixmake.h
+++ b/qmake/generators/unix/unixmake.h
@@ -34,38 +34,39 @@
** not clear to you.
**
**********************************************************************/
#ifndef __UNIXMAKE_H__
#define __UNIXMAKE_H__
#include "makefile.h"
class UnixMakefileGenerator : public MakefileGenerator
{
bool init_flag, include_deps;
bool writeMakefile(QTextStream &);
QStringList uniqueSetLFlags(const QStringList &list1, QStringList &list2);
public:
UnixMakefileGenerator(QMakeProject *p);
~UnixMakefileGenerator();
protected:
virtual bool doDepends() const { return !include_deps && MakefileGenerator::doDepends(); }
virtual QString defaultInstall(const QString &);
virtual void processPrlVariable(const QString &, const QStringList &);
virtual void processPrlFiles();
+ virtual bool findLibraries();
virtual void init();
void writeMakeParts(QTextStream &);
void writeSubdirs(QTextStream &, bool=TRUE);
private:
void init2();
};
inline UnixMakefileGenerator::~UnixMakefileGenerator()
{ }
#endif /* __UNIXMAKE_H__ */
diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp
index 9bb6f6b..7fbb9f4 100644
--- a/qmake/generators/unix/unixmake2.cpp
+++ b/qmake/generators/unix/unixmake2.cpp
@@ -58,106 +58,113 @@ UnixMakefileGenerator::writeMakefile(QTextStream &t)
<< var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"" << "\n\t"
<< "@echo \"Skipped.\"" << endl << endl;
writeMakeQmake(t);
return TRUE;
}
if (project->variables()["TEMPLATE"].first() == "app" ||
project->variables()["TEMPLATE"].first() == "lib") {
writeMakeParts(t);
return MakefileGenerator::writeMakefile(t);
} else if(project->variables()["TEMPLATE"].first() == "subdirs") {
writeSubdirs(t);
return TRUE;
}
return FALSE;
}
void
UnixMakefileGenerator::writeMakeParts(QTextStream &t)
{
QString deps = fileFixify(Option::output.name()), prl;
bool do_incremental = (project->isActiveConfig("incremental") &&
!project->variables()["QMAKE_INCREMENTAL"].isEmpty() &&
(!project->variables()["QMAKE_APP_FLAG"].isEmpty() ||
- !project->isActiveConfig("staticlib"))),
+ !project->isActiveConfig("staticlib"))),
src_incremental=FALSE, moc_incremental=FALSE;
- QString os = project->variables()["QMAKESPEC"].first().section( '-', 0, 0 );
t << "####### Compiler, tools and options" << endl << endl;
t << "CC = ";
if (project->isActiveConfig("thread") &&
! project->variables()["QMAKE_CC_THREAD"].isEmpty())
t << var("QMAKE_CC_THREAD") << endl;
else
t << var("QMAKE_CC") << endl;
t << "CXX = ";
if (project->isActiveConfig("thread") &&
! project->variables()["QMAKE_CXX_THREAD"].isEmpty())
t << var("QMAKE_CXX_THREAD") << endl;
else
t << var("QMAKE_CXX") << endl;
t << "LEX = " << var("QMAKE_LEX") << endl;
t << "YACC = " << var("QMAKE_YACC") << endl;
t << "CFLAGS = " << var("QMAKE_CFLAGS") << " "
<< varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " "
<< varGlue("DEFINES","-D"," -D","") << endl;
t << "CXXFLAGS = " << var("QMAKE_CXXFLAGS") << " "
<< varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " "
<< varGlue("DEFINES","-D"," -D","") << endl;
t << "LEXFLAGS = " << var("QMAKE_LEXFLAGS") << endl;
t << "YACCFLAGS= " << var("QMAKE_YACCFLAGS") << endl;
- t << "INCPATH = " << varGlue("INCLUDEPATH","-I", " -I", "") << " -I" << specdir() << endl;
+ t << "INCPATH = " << "-I" << specdir();
+ if(!project->isActiveConfig("no_include_pwd")) {
+ QString pwd = fileFixify(QDir::currentDirPath());
+ if(pwd.isEmpty())
+ pwd = ".";
+ t << " -I" << pwd;
+ }
+ t << varGlue("INCLUDEPATH"," -I", " -I", "") << endl;
if(!project->isActiveConfig("staticlib")) {
t << "LINK = ";
if (project->isActiveConfig("thread") &&
! project->variables()["QMAKE_LINK_THREAD"].isEmpty())
t << var("QMAKE_LINK_THREAD") << endl;
else
t << var("QMAKE_LINK") << endl;
t << "LFLAGS = " << var("QMAKE_LFLAGS") << endl;
t << "LIBS = " << "$(SUBLIBS) " << var("QMAKE_LIBDIR_FLAGS") << " " << var("QMAKE_LIBS") << endl;
}
t << "AR = " << var("QMAKE_AR") << endl;
t << "RANLIB = " << var("QMAKE_RANLIB") << endl;
t << "MOC = " << var("QMAKE_MOC") << endl;
t << "UIC = " << var("QMAKE_UIC") << endl;
t << "QMAKE = " << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : var("QMAKE_QMAKE")) << endl;
t << "TAR = " << var("QMAKE_TAR") << endl;
t << "GZIP = " << var("QMAKE_GZIP") << endl;
t << "COPY = " << var("QMAKE_COPY") << endl;
t << "COPY_FILE= " << var("QMAKE_COPY_FILE") << endl;
t << "COPY_DIR = " << var("QMAKE_COPY_DIR") << endl;
t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl;
t << "SYMLINK = " << var("QMAKE_SYMBOLIC_LINK") << endl;
t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl;
t << "MOVE = " << var("QMAKE_MOVE") << endl;
- t << "PRO = " << fileFixify(project->projectFile() )<< endl;
+ t << "CHK_DIR_EXISTS= " << var("QMAKE_CHK_DIR_EXISTS") << endl;
+ t << "MKDIR = " << var("QMAKE_MKDIR") << endl;
t << endl;
t << "####### Output directory" << endl << endl;
if (! project->variables()["OBJECTS_DIR"].isEmpty())
t << "OBJECTS_DIR = " << var("OBJECTS_DIR") << endl;
else
t << "OBJECTS_DIR = ./" << endl;
t << endl;
/* files */
t << "####### Files" << endl << endl;
t << "HEADERS = " << varList("HEADERS") << endl;
t << "SOURCES = " << varList("SOURCES") << endl;
if(do_incremental) {
QStringList &objs = project->variables()["OBJECTS"], &incrs = project->variables()["QMAKE_INCREMENTAL"], incrs_out;
t << "OBJECTS = ";
for(QStringList::Iterator objit = objs.begin(); objit != objs.end(); ++objit) {
bool increment = FALSE;
for(QStringList::Iterator incrit = incrs.begin(); incrit != incrs.end(); ++incrit) {
if((*objit).find(QRegExp((*incrit), TRUE, TRUE)) != -1) {
increment = TRUE;
incrs_out.append((*objit));
break;
}
@@ -191,98 +198,96 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
for(QStringList::Iterator incrit = incrs.begin(); incrit != incrs.end(); ++incrit) {
if((*objit).find(QRegExp((*incrit), TRUE, TRUE)) != -1) {
increment = TRUE;
incrs_out.append((*objit));
break;
}
}
if(!increment)
t << "\\\n\t\t" << (*objit);
}
if(incrs_out.count() == objs.count()) { //we just switched places, no real incrementals to be done!
t << incrs_out.join(" \\\n\t\t") << endl;
} else if(!incrs_out.count()) {
t << endl;
} else {
moc_incremental = TRUE;
t << endl;
t << "INCREMENTAL_OBJMOC = " << incrs_out.join(" \\\n\t\t") << endl;
}
} else {
t << "OBJMOC = " << objMoc << endl;
}
if(do_incremental && !moc_incremental && !src_incremental)
do_incremental = FALSE;
- t << "DIST = " << varList("DISTFILES") << endl;
- t << "PRO = " << fileFixify(project->projectFile()) << endl;
+ t << "DIST = " << valList(fileFixify(project->variables()["DISTFILES"])) << endl;
t << "QMAKE_TARGET = " << var("QMAKE_ORIG_TARGET") << endl;
t << "DESTDIR = " << var("DESTDIR") << endl;
t << "TARGET = " << var("TARGET") << endl;
if(project->isActiveConfig("plugin") ) {
t << "TARGETD = " << var("TARGET") << endl;
} else if (!project->isActiveConfig("staticlib") && project->variables()["QMAKE_APP_FLAG"].isEmpty()) {
t << "TARGETA = " << var("TARGETA") << endl;
- if (os == "hpux") {
- t << "TARGETD = " << var("TARGET_x") << endl;
- t << "TARGET0 = " << var("TARGET_") << endl;
- }
- else {
+ if (project->isEmpty("QMAKE_HPUX_SHLIB")) {
t << "TARGETD = " << var("TARGET_x.y.z") << endl;
t << "TARGET0 = " << var("TARGET_") << endl;
t << "TARGET1 = " << var("TARGET_x") << endl;
t << "TARGET2 = " << var("TARGET_x.y") << endl;
+ } else {
+ t << "TARGETD = " << var("TARGET_x") << endl;
+ t << "TARGET0 = " << var("TARGET_") << endl;
}
}
t << endl;
// blasted incldues
QStringList &qeui = project->variables()["QMAKE_EXTRA_UNIX_INCLUDES"];
QStringList::Iterator it;
for( it = qeui.begin(); it != qeui.end(); ++it)
t << "include " << (*it) << endl;
/* rules */
t << "first: all" << endl;
t << "####### Implicit rules" << endl << endl;
t << ".SUFFIXES: .c";
QStringList::Iterator cppit;
for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)
t << " " << (*cppit);
t << endl << endl;
for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)
t << (*cppit) << ".o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
t << ".c.o:\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl;
if(include_deps) {
QString cmd=var("QMAKE_CFLAGS_DEPS") + " ";
cmd += varGlue("DEFINES","-D"," -D","") + varGlue("PRL_EXPORT_DEFINES"," -D"," -D","");
if(!project->isEmpty("QMAKE_ABSOLUTE_SOURCE_PATH"))
cmd += " -I" + project->first("QMAKE_ABSOLUTE_SOURCE_PATH") + " ";
cmd += " $(INCPATH) " + varGlue("DEPENDPATH", "-I", " -I", "");
QString odir;
if(!project->variables()["OBJECTS_DIR"].isEmpty())
odir = project->first("OBJECTS_DIR");
- t << "###### Dependancies" << endl << endl;
+ t << "###### Dependencies" << endl << endl;
t << odir << ".deps/%.d: %.cpp\n\t"
<< "@echo Creating depend for $<" << "\n\t"
<< "@test -d $(@D) || mkdir -p $(@D)" << "\n\t"
<< "@$(CXX) " << cmd << " $< | sed \"s,^\\($(*F).o\\):," << odir << "\\1:,g\" >$@" << endl << endl;
t << odir << ".deps/%.d: %.c\n\t"
<< "@echo Creating depend for $<" << "\n\t"
<< "@test -d $(@D) || mkdir -p $(@D)" << "\n\t"
<< "@$(CC) " << cmd << " $< | sed \"s,^\\($(*F).o\\):," << odir << "\\1:,g\" >$@" << endl << endl;
QString src[] = { "SOURCES", "UICIMPLS", "SRCMOC", QString::null };
for(int x = 0; !src[x].isNull(); x++) {
QStringList &l = project->variables()[src[x]];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
if(!(*it).isEmpty()) {
QString d_file;
if((*it).endsWith(".c")) {
d_file = (*it).left((*it).length() - 2);
} else {
for(QStringList::Iterator cppit = Option::cpp_ext.begin();
cppit != Option::cpp_ext.end(); ++cppit) {
if((*it).endsWith((*cppit))) {
d_file = (*it).left((*it).length() - (*cppit).length());
@@ -365,62 +370,64 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
if(!destdir.isEmpty())
t << "\n\t" << "test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
t << "$(LINK) " << incr_lflags << " -o "<< incr_target_dir <<
" $(INCREMENTAL_OBJECTS) $(INCREMENTAL_OBJMOC)" << endl;
//communicated below
if(!destdir.isEmpty()) {
if(!incr_objs.isEmpty())
incr_objs += " ";
incr_objs += "-L" + destdir;
} else {
if(!incr_objs.isEmpty())
incr_objs += " ";
incr_objs += "-L" + QDir::currentDirPath();
}
if(!incr_objs.isEmpty())
incr_objs += " ";
incr_objs += " -l" + incr_target;
deps.prepend(incr_target_dir + " ");
incr_deps = "$(UICDECLS) $(OBJECTS) $(OBJMOC)";
}
t << "all: " << deps << " " << varGlue("ALL_DEPS",""," "," ") << "$(TARGET)"
<< endl << endl;
//real target
- t << var("TARGET") << ": " << " " << incr_deps << " " << var("TARGETDEPS") << "\n\t";
+ t << var("TARGET") << ": " << var("PRE_TARGETDEPS") << " " << incr_deps
+ << " " << var("POST_TARGETDEPS") << "\n\t";
if(!destdir.isEmpty())
t << "\n\t" << "test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
if(!project->isEmpty("QMAKE_PRE_LINK"))
t << var("QMAKE_PRE_LINK") << "\n\t";
t << "$(LINK) $(LFLAGS) -o $(TARGET) " << incr_deps << " " << incr_objs << " $(LIBS)";
if(!project->isEmpty("QMAKE_POST_LINK"))
t << "\n\t" << var("QMAKE_POST_LINK");
t << endl << endl;
} else {
t << "all: " << deps << " " << varGlue("ALL_DEPS",""," "," ") << "$(TARGET)"
<< endl << endl;
- t << "$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) " << var("TARGETDEPS") << "\n\t";
+ t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) "
+ << var("POST_TARGETDEPS") << "\n\t";
if(!destdir.isEmpty())
t << "test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
if(!project->isEmpty("QMAKE_PRE_LINK"))
t << var("QMAKE_PRE_LINK") << "\n\t";
t << "$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)";
if(!project->isEmpty("QMAKE_POST_LINK"))
t << "\n\t" << var("QMAKE_POST_LINK");
t << endl << endl;
}
} else if(!project->isActiveConfig("staticlib")) {
QString destdir = project->first("DESTDIR"), incr_deps;
if(do_incremental) {
QString s_ext = project->variables()["QMAKE_EXTENSION_SHLIB"].first();
QString incr_target = var("QMAKE_ORIG_TARGET").replace(
QRegExp("\\." + s_ext), "").replace(QRegExp("^lib"), "") + "_incremental";
if(incr_target.find(Option::dir_sep) != -1)
incr_target = incr_target.right(incr_target.length() -
(incr_target.findRev(Option::dir_sep) + 1));
if(project->first("QMAKE_INCREMENTAL_STYLE") == "ld") {
QString incr_target_dir = var("OBJECTS_DIR") + incr_target + Option::obj_ext;
//actual target
const QString link_deps = "$(UICDECLS) $(OBJECTS) $(OBJMOC)";
t << incr_target_dir << ": " << link_deps << "\n\t"
@@ -439,300 +446,344 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t)
if(!project->isEmpty("QMAKE_LFLAGS_INCREMENTAL"))
incr_lflags += var("QMAKE_LFLAGS_INCREMENTAL") + " ";
if(project->isActiveConfig("debug"))
incr_lflags += var("QMAKE_LFLAGS_DEBUG");
else
incr_lflags += var("QMAKE_LFLAGS_RELEASE");
t << incr_target_dir << ": $(INCREMENTAL_OBJECTS) $(INCREMENTAL_OBJMOC)" << "\n\t";
if(!destdir.isEmpty())
t << "test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
t << "$(LINK) " << incr_lflags << " -o "<< incr_target_dir <<
" $(INCREMENTAL_OBJECTS) $(INCREMENTAL_OBJMOC)" << endl;
//communicated below
QStringList &cmd = project->variables()["QMAKE_LINK_SHLIB_CMD"];
if(!destdir.isEmpty())
cmd.append(" -L" + destdir);
cmd.append(" -l" + incr_target);
deps.prepend(incr_target_dir + " ");
incr_deps = "$(UICDECLS) $(OBJECTS) $(OBJMOC)";
}
t << "all: " << " " << deps << " " << varGlue("ALL_DEPS",""," ","")
<< " " << var("DESTDIR_TARGET") << endl << endl;
//real target
- t << var("DESTDIR_TARGET") << ": " << incr_deps << " $(SUBLIBS) " <<
- var("TARGETDEPS");
+ t << var("DESTDIR_TARGET") << ": " << var("PRE_TARGETDEPS") << " "
+ << incr_deps << " $(SUBLIBS) " << var("POST_TARGETDEPS");
} else {
t << "all: " << deps << " " << varGlue("ALL_DEPS",""," ","") << " " <<
var("DESTDIR_TARGET") << endl << endl;
- t << var("DESTDIR_TARGET") << ": $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS) " <<
- var("TARGETDEPS");
+ t << var("DESTDIR_TARGET") << ": " << var("PRE_TARGETDEPS")
+ << " $(UICDECLS) $(OBJECTS) $(OBJMOC) $(SUBLIBS) " << var("POST_TARGETDEPS");
}
if(!destdir.isEmpty())
t << "\n\t" << "test -d " << destdir << " || mkdir -p " << destdir;
if(!project->isEmpty("QMAKE_PRE_LINK"))
t << "\n\t" << var("QMAKE_PRE_LINK");
if(project->isActiveConfig("plugin")) {
t << "\n\t"
<< "-$(DEL_FILE) $(TARGET)" << "\n\t"
<< var("QMAKE_LINK_SHLIB_CMD");
if(!destdir.isEmpty())
t << "\n\t"
<< "-$(MOVE) $(TARGET) " << var("DESTDIR");
if(!project->isEmpty("QMAKE_POST_LINK"))
t << "\n\t" << var("QMAKE_POST_LINK") << "\n\t";
t << endl << endl;
- } else if ( os == "hpux" ) {
- t << "\n\t"
- << "-$(DEL_FILE) $(TARGET) $(TARGET0)" << "\n\t"
- << var("QMAKE_LINK_SHLIB_CMD") << "\n\t";
- t << varGlue("QMAKE_LN_SHLIB",""," "," $(TARGET) $(TARGET0)");
- if(!destdir.isEmpty())
- t << "\n\t"
- << "-$(DEL_FILE) " << var("DESTDIR") << "$(TARGET)\n\t"
- << "-$(DEL_FILE) " << var("DESTDIR") << "$(TARGET0)\n\t"
- << "-$(MOVE) $(TARGET) $(TARGET0) " << var("DESTDIR");
- if(!project->isEmpty("QMAKE_POST_LINK"))
- t << "\n\t" << var("QMAKE_POST_LINK");
- t << endl << endl;
- } else {
+ } else if(project->isEmpty("QMAKE_HPUX_SHLIB")) {
t << "\n\t"
<< "-$(DEL_FILE) $(TARGET) $(TARGET0) $(TARGET1) $(TARGET2)" << "\n\t"
<< var("QMAKE_LINK_SHLIB_CMD") << "\n\t";
t << varGlue("QMAKE_LN_SHLIB","-"," "," $(TARGET) $(TARGET0)") << "\n\t"
<< varGlue("QMAKE_LN_SHLIB","-"," "," $(TARGET) $(TARGET1)") << "\n\t"
<< varGlue("QMAKE_LN_SHLIB","-"," "," $(TARGET) $(TARGET2)");
if(!destdir.isEmpty())
t << "\n\t"
<< "-$(DEL_FILE) " << var("DESTDIR") << "$(TARGET)\n\t"
<< "-$(DEL_FILE) " << var("DESTDIR") << "$(TARGET0)\n\t"
<< "-$(DEL_FILE) " << var("DESTDIR") << "$(TARGET1)\n\t"
<< "-$(DEL_FILE) " << var("DESTDIR") << "$(TARGET2)\n\t"
<< "-$(MOVE) $(TARGET) $(TARGET0) $(TARGET1) $(TARGET2) " << var("DESTDIR");
if(!project->isEmpty("QMAKE_POST_LINK"))
t << "\n\t" << var("QMAKE_POST_LINK");
t << endl << endl;
+ } else {
+ t << "\n\t"
+ << "-$(DEL_FILE) $(TARGET) $(TARGET0)" << "\n\t"
+ << var("QMAKE_LINK_SHLIB_CMD") << "\n\t";
+ t << varGlue("QMAKE_LN_SHLIB",""," "," $(TARGET) $(TARGET0)");
+ if(!destdir.isEmpty())
+ t << "\n\t"
+ << "-$(DEL_FILE) " << var("DESTDIR") << "$(TARGET)\n\t"
+ << "-$(DEL_FILE) " << var("DESTDIR") << "$(TARGET0)\n\t"
+ << "-$(MOVE) $(TARGET) $(TARGET0) " << var("DESTDIR");
+ if(!project->isEmpty("QMAKE_POST_LINK"))
+ t << "\n\t" << var("QMAKE_POST_LINK");
+ t << endl << endl;
}
t << endl << endl;
if (! project->isActiveConfig("plugin")) {
t << "staticlib: $(TARGETA)" << endl << endl;
- t << "$(TARGETA): $(UICDECLS) $(OBJECTS) $(OBJMOC)";
+ t << "$(TARGETA): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC)";
if(do_incremental)
t << " $(INCREMENTAL_OBJECTS) $(INCREMENTAL_OBJMOC)";
- t << var("TARGETDEPS") << "\n\t"
+ t << var("POST_TARGETDEPS") << "\n\t"
<< "-$(DEL_FILE) $(TARGETA) " << "\n\t"
<< var("QMAKE_AR_CMD");
if(do_incremental)
t << " $(INCREMENTAL_OBJECTS) $(INCREMENTAL_OBJMOC)";
if(!project->isEmpty("QMAKE_RANLIB"))
t << "\n\t" << "$(RANLIB) $(TARGETA)";
t << endl << endl;
}
} else {
- t << "all: " << deps << " " << varGlue("ALL_DEPS",""," "," ") << var("DESTDIR") << "$(TARGET) "
+ t << "all: " << deps << " " << varGlue("ALL_DEPS",""," "," ") << var("DESTDIR") << "$(TARGET) "
<< varGlue("QMAKE_AR_SUBLIBS", var("DESTDIR"), " " + var("DESTDIR"), "") << "\n\n"
<< "staticlib: " << var("DESTDIR") << "$(TARGET)" << "\n\n";
if(project->isEmpty("QMAKE_AR_SUBLIBS")) {
- t << var("DESTDIR") << "$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) $(TARGETDEPS) " << "\n\t";
+ t << var("DESTDIR") << "$(TARGET): " << var("PRE_TARGETDEPS")
+ << " $(UICDECLS) $(OBJECTS) $(OBJMOC) " << var("POST_TARGETDEPS") << "\n\t";
if(!project->isEmpty("DESTDIR")) {
QString destdir = project->first("DESTDIR");
t << "test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
}
t << "-$(DEL_FILE) $(TARGET)" << "\n\t"
<< var("QMAKE_AR_CMD") << "\n";
if(!project->isEmpty("QMAKE_POST_LINK"))
t << "\t" << var("QMAKE_POST_LINK") << "\n";
if(!project->isEmpty("QMAKE_RANLIB"))
t << "\t" << "$(RANLIB) $(TARGET)" << "\n";
- if(!project->isEmpty("DESTDIR"))
+ if(!project->isEmpty("DESTDIR"))
t << "\t" << "-$(DEL_FILE) " << var("DESTDIR") << "$(TARGET)" << "\n"
<< "\t" << "-$(MOVE) $(TARGET) " << var("DESTDIR") << "\n";
} else {
- int cnt = 0, max_files = project->first("QMAKE_MAX_FILES_PER_AR").toInt();
+ int max_files = project->first("QMAKE_MAX_FILES_PER_AR").toInt();
QStringList objs = project->variables()["OBJECTS"] + project->variables()["OBJMOC"],
libs = project->variables()["QMAKE_AR_SUBLIBS"];
libs.prepend("$(TARGET)");
- for(QStringList::Iterator libit = libs.begin(), objit = objs.begin();
+ for(QStringList::Iterator libit = libs.begin(), objit = objs.begin();
libit != libs.end(); ++libit) {
QStringList build;
- for(cnt = 0; cnt < max_files && objit != objs.end(); ++objit, cnt++)
+ for(int cnt = 0; cnt < max_files && objit != objs.end(); ++objit, cnt++)
build << (*objit);
QString ar;
if((*libit) == "$(TARGET)") {
- t << var("DESTDIR") << "$(TARGET): $(UICDECLS) " << " $(TARGETDEPS) "
- << valList(build) << "\n\t";
+ t << var("DESTDIR") << "$(TARGET): " << var("PRE_TARGETDEPS")
+ << " $(UICDECLS) " << var("POST_TARGETDEPS") << valList(build) << "\n\t";
ar = project->variables()["QMAKE_AR_CMD"].first();
- ar = ar.replace("$(OBJMOC)", "").replace("$(OBJECTS)",
+ ar = ar.replace("$(OBJMOC)", "").replace("$(OBJECTS)",
build.join(" "));
} else {
t << (*libit) << ": " << valList(build) << "\n\t";
ar = "$(AR) " + (*libit) + " " + build.join(" ");
}
if(!project->isEmpty("DESTDIR")) {
QString destdir = project->first("DESTDIR");
t << "test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
}
t << "-$(DEL_FILE) " << (*libit) << "\n\t"
<< ar << "\n";
if(!project->isEmpty("QMAKE_POST_LINK"))
t << "\t" << var("QMAKE_POST_LINK") << "\n";
if(!project->isEmpty("QMAKE_RANLIB"))
t << "\t" << "$(RANLIB) " << (*libit) << "\n";
- if(!project->isEmpty("DESTDIR"))
+ if(!project->isEmpty("DESTDIR"))
t << "\t" << "-$(DEL_FILE) " << var("DESTDIR") << (*libit) << "\n"
<< "\t" << "-$(MOVE) " << (*libit) << " " << var("DESTDIR") << "\n";
}
}
t << endl << endl;
}
t << "mocables: $(SRCMOC)" << endl << endl;
if(!project->isActiveConfig("no_mocdepend")) {
//this is an implicity depend on moc, so it will be built if necesary, however
- //moc itself shouldn't have this dependancy - this is a little kludgy but it is
+ //moc itself shouldn't have this dependency - this is a little kludgy but it is
//better than the alternative for now.
QString moc = project->first("QMAKE_MOC"), target = project->first("TARGET");
fixEnvVariables(target);
fixEnvVariables(moc);
- if(target != moc)
+ if(target != moc)
t << "$(MOC): \n\t"
<< "( cd $(QTDIR)/src/moc ; $(MAKE) )" << endl << endl;
}
writeMakeQmake(t);
if(!project->first("QMAKE_PKGINFO").isEmpty()) {
QString pkginfo = project->first("QMAKE_PKGINFO");
QString destdir = project->first("DESTDIR");
t << pkginfo << ": " << "\n\t";
if(!destdir.isEmpty())
t << "@test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
t << "@$(DEL_FILE) " << pkginfo << "\n\t"
<< "@echo \"APPL????\" >" << pkginfo << endl;
}
if(!project->first("QMAKE_INFO_PLIST").isEmpty()) {
QString info_plist = project->first("QMAKE_INFO_PLIST"),
info_plist_out = project->first("QMAKE_INFO_PLIST_OUT");
QString destdir = project->first("DESTDIR");
t << info_plist_out << ": " << "\n\t";
if(!destdir.isEmpty())
t << "@test -d " << destdir << " || mkdir -p " << destdir << "\n\t";
t << "@$(DEL_FILE) " << info_plist_out << "\n\t"
<< "@cp \"" << info_plist << "\" \"" << info_plist_out << "\"" << endl;
if(!project->first("RC_FILE").isEmpty()) {
QString dir = destdir + "../Resources/";
t << dir << "application.icns:" << "\n\t"
<< "@test -d " << dir << " || mkdir -p " << dir << "\n\t"
<< "@cp " << var("RC_FILE") << " " << dir << "application.icns" << endl;
}
}
QString ddir = project->isEmpty("QMAKE_DISTDIR") ? project->first("QMAKE_ORIG_TARGET") :
project->first("QMAKE_DISTDIR");
QString ddir_c = fileFixify((project->isEmpty("OBJECTS_DIR") ? QString(".tmp/") :
project->first("OBJECTS_DIR")) + ddir);
t << "dist: " << "\n\t"
<< "@mkdir -p " << ddir_c << " && "
<< "$(COPY_FILE) --parents $(SOURCES) $(HEADERS) $(FORMS) $(DIST) " << ddir_c << Option::dir_sep << " && ";
if(!project->isEmpty("TRANSLATIONS"))
t << "$(COPY_FILE) --parents " << var("TRANSLATIONS") << " " << ddir_c << Option::dir_sep << " && ";
if(!project->isEmpty("FORMS")) {
QStringList &forms = project->variables()["FORMS"], ui_headers;
for(QStringList::Iterator formit = forms.begin(); formit != forms.end(); ++formit) {
QString ui_h = fileFixify((*formit) + Option::h_ext.first());
- if(QFile::exists(ui_h) )
+ if(QFile::exists(ui_h) )
ui_headers << ui_h;
}
if(!ui_headers.isEmpty())
t << "$(COPY_FILE) --parents " << val(ui_headers) << " " << ddir_c << Option::dir_sep << " && ";
}
t << "( cd `dirname " << ddir_c << "` && "
<< "$(TAR) " << var("QMAKE_ORIG_TARGET") << ".tar " << ddir << " && "
<< "$(GZIP) " << var("QMAKE_ORIG_TARGET") << ".tar ) && "
<< "$(MOVE) `dirname " << ddir_c << "`" << Option::dir_sep << var("QMAKE_ORIG_TARGET") << ".tar.gz . && "
- << "$(DEL_DIR) " << ddir_c
+ << "$(DEL_FILE) -r " << ddir_c
<< endl << endl;
QString clean_targets;
if(mocAware()) {
t << "mocclean:" << "\n";
if(!objMoc.isEmpty() || !srcMoc.isEmpty() || moc_incremental) {
if(!objMoc.isEmpty())
t << "\t-$(DEL_FILE) $(OBJMOC)" << '\n';
if(!srcMoc.isEmpty())
t << "\t-$(DEL_FILE) $(SRCMOC)" << '\n';
if(moc_incremental)
t << "\t-$(DEL_FILE) $(INCREMENTAL_OBJMOC)" << '\n';
clean_targets += " mocclean";
}
t << endl;
}
t << "uiclean:" << "\n";
if (!var("UICIMPLS").isEmpty() || !var("UICDECLS").isEmpty()) {
t << "\t-$(DEL_FILE) $(UICIMPLS) $(UICDECLS)" << "\n";
clean_targets += " uiclean";
}
t << endl;
+ t << "yaccclean:" << "\n";
+ if(!var("YACCSOURCES").isEmpty()) {
+ QStringList clean, &l = project->variables()["YACCSOURCES"];
+ for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QFileInfo fi((*it));
+ QString dir;
+ if(fi.dirPath() != ".")
+ dir = fi.dirPath() + Option::dir_sep;
+ dir = fileFixify(dir, QDir::currentDirPath(), Option::output_dir);
+ if(!dir.isEmpty() && dir.right(Option::dir_sep.length()) != Option::dir_sep)
+ dir += Option::dir_sep;
+ clean << dir + fi.baseName(TRUE) + Option::yacc_mod + Option::cpp_ext.first();
+ clean << dir + fi.baseName(TRUE) + Option::yacc_mod + Option::h_ext.first();
+ }
+ if(!clean.isEmpty()) {
+ t << "\t-$(DEL_FILE) " << clean.join(" ") << "\n";
+ clean_targets += " yaccclean";
+ }
+ }
+
+ t << "lexclean:" << "\n";
+ if(!var("LEXSOURCES").isEmpty()) {
+ QStringList clean, &l = project->variables()["LEXSOURCES"];
+ for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QFileInfo fi((*it));
+ QString dir;
+ if(fi.dirPath() != ".")
+ dir = fi.dirPath() + Option::dir_sep;
+ dir = fileFixify(dir, QDir::currentDirPath(), Option::output_dir);
+ if(!dir.isEmpty() && dir.right(Option::dir_sep.length()) != Option::dir_sep)
+ dir += Option::dir_sep;
+ clean << dir + fi.baseName(TRUE) + Option::lex_mod + Option::cpp_ext.first();
+ }
+ if(!clean.isEmpty()) {
+ t << "\t-$(DEL_FILE) " << clean.join(" ") << "\n";
+ clean_targets += " lexclean";
+ }
+ }
+
if(do_incremental) {
t << "incrclean:" << "\n";
if(src_incremental)
t << "\t-$(DEL_FILE) $(INCREMENTAL_OBJECTS)" << "\n";
if(moc_incremental)
t << "\t-$(DEL_FILE) $(INCREMENTAL_OBJMOC)" << '\n';
t << endl;
}
t << "clean:" << clean_targets << "\n\t";
if(!project->isEmpty("OBJECTS"))
t << "-$(DEL_FILE) $(OBJECTS) " << "\n\t";
if(!project->isEmpty("IMAGES"))
t << varGlue("QMAKE_IMAGE_COLLECTION", "\t-$(DEL_FILE) ", " ", "") << "\n\t";
if(src_incremental)
t << "-$(DEL_FILE) $(INCREMENTAL_OBJECTS)" << "\n\t";
t << varGlue("QMAKE_CLEAN","-$(DEL_FILE) "," ","\n\t")
<< "-$(DEL_FILE) *~ core *.core" << "\n"
<< varGlue("CLEAN_FILES","\t-$(DEL_FILE) "," ","") << endl << endl;
t << "####### Sub-libraries" << endl << endl;
if ( !project->variables()["SUBLIBS"].isEmpty() ) {
QString libdir = "tmp/";
if(!project->isEmpty("SUBLIBS_DIR"))
libdir = project->first("SUBLIBS_DIR");
QStringList &l = project->variables()["SUBLIBS"];
for(it = l.begin(); it != l.end(); ++it)
t << libdir << "lib" << (*it) << ".a" << ":\n\t"
<< var(QString("MAKELIB") + (*it)) << endl << endl;
}
QString destdir = project->first("DESTDIR");
if(!destdir.isEmpty() && destdir.right(1) != Option::dir_sep)
destdir += Option::dir_sep;
- t << "distclean: " << "clean\n\t"
- << "-$(DEL_FILE) " << destdir << "$(TARGET)" << " " << "$(TARGET)" << "\n";
+ t << "distclean: " << "clean\n";
+ if(project->first("TEMPLATE") == "app" &&
+ project->isActiveConfig("resource_fork") && !project->isActiveConfig("console"))
+ t << "\t-$(DEL_FILE) -r " << destdir.section(Option::dir_sep, 0, -4) << "\n";
+ else
+ t << "\t-$(DEL_FILE) " << destdir << "$(TARGET)" << " " << "$(TARGET)" << "\n";
if(!project->isActiveConfig("staticlib") && project->variables()["QMAKE_APP_FLAG"].isEmpty() &&
!project->isActiveConfig("plugin"))
t << "\t-$(DEL_FILE) " << destdir << "$(TARGET0) " << destdir << "$(TARGET1) "
<< destdir << "$(TARGET2) $(TARGETA)" << "\n";
t << endl << endl;
if ( !project->isEmpty("PRECOMPH") ) {
QString outdir = project->first("MOC_DIR");
QString qt_dot_h = Option::fixPathToLocalOS(project->first("PRECOMPH"));
t << "###### Combined headers" << endl << endl;
//XXX
t << outdir << "allmoc.cpp: " << qt_dot_h << " "
<< varList("HEADERS_ORIG") << "\n\t"
<< "echo '#include \"" << qt_dot_h << "\"' >" << outdir << "allmoc.cpp" << "\n\t"
<< "$(CXX) -E -DQT_MOC_CPP -DQT_NO_STL $(CXXFLAGS) $(INCPATH) >" << outdir << "allmoc.h "
<< outdir << "allmoc.cpp" << "\n\t"
<< "$(MOC) -o " << outdir << "allmoc.cpp " << outdir << "allmoc.h" << "\n\t"
<< "perl -pi -e 's{#include \"allmoc.h\"}{#define QT_H_CPP\\n#include \""
<< qt_dot_h << "\"}' " << outdir << "allmoc.cpp" << "\n\t"
<< "$(DEL_FILE) " << outdir << "allmoc.h" << endl << endl;
}
// blasted user defined targets
QStringList &qut = project->variables()["QMAKE_EXTRA_UNIX_TARGETS"];
@@ -785,185 +836,186 @@ UnixMakefileGenerator::writeSubdirs(QTextStream &t, bool direct)
while(sd->directory.right(1) == Option::dir_sep)
sd->directory = sd->directory.left(sd->directory.length() - 1);
if(!sd->profile.isEmpty()) {
QString basename = sd->directory;
int new_slsh = basename.findRev(Option::dir_sep);
if(new_slsh != -1)
basename = basename.mid(new_slsh+1);
if(sd->profile != basename + ".pro")
sd->makefile += "." + sd->profile.left(sd->profile.length() - 4); //no need for the .pro
}
sd->target = "sub-" + (*it);
sd->target.replace('/', '-');
sd->target.replace('.', '_');
}
}
QPtrListIterator<SubDir> it(subdirs);
QString ofile = Option::output.name();
if(ofile.findRev(Option::dir_sep) != -1)
ofile = ofile.right(ofile.length() - ofile.findRev(Option::dir_sep) -1);
t << "MAKEFILE = " << var("MAKEFILE") << endl;
t << "QMAKE = " << var("QMAKE") << endl;
t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl;
t << "SUBTARGETS = "; // subdirectory targets are sub-directory
- for( it.toFirst(); it.current(); ++it)
+ for( it.toFirst(); it.current(); ++it)
t << " \\\n\t\t" << it.current()->target;
t << endl << endl;
t << "first: all\n\nall: " << ofile << " $(SUBTARGETS)" << endl << endl;
// generate target rules
for( it.toFirst(); it.current(); ++it) {
bool have_dir = !(*it)->directory.isEmpty();
QString mkfile = (*it)->makefile, out;
if(have_dir)
mkfile.prepend((*it)->directory + Option::dir_sep);
if(direct || (*it)->makefile != "$(MAKEFILE)")
out = " -o " + (*it)->makefile;
//qmake it
t << mkfile << ": " << "\n\t";
if(have_dir)
t << "cd " << (*it)->directory << " && ";
t << "$(QMAKE) " << (*it)->profile << buildArgs() << out << endl;
//actually compile
t << (*it)->target << ": " << mkfile << " FORCE" << "\n\t";
if(have_dir)
t << "cd " << (*it)->directory << " && ";
t << "$(MAKE) -f " << (*it)->makefile << endl << endl;
}
if (project->isActiveConfig("ordered")) { // generate dependencies
for( it.toFirst(); it.current(); ) {
QString tar = it.current()->target;
++it;
- if (it.current())
+ if (it.current())
t << it.current()->target << ": " << tar << endl;
}
t << endl;
}
writeMakeQmake(t);
if(project->isEmpty("SUBDIRS")) {
- t << "all qmake_all distclean install uiclean mocclean clean: FORCE" << endl;
+ t << "all qmake_all distclean install uiclean mocclean lexclean yaccclean clean: FORCE" << endl;
} else {
t << "all: $(SUBTARGETS)" << endl;
t << "qmake_all:";
for( it.toFirst(); it.current(); ++it) {
t << " ";
if(!(*it)->directory.isEmpty())
t << (*it)->directory << Option::dir_sep;
t << (*it)->makefile;
}
for( it.toFirst(); it.current(); ++it) {
t << "\n\t ( ";
if(!(*it)->directory.isEmpty())
t << "[ -d " << (*it)->directory << " ] && cd " << (*it)->directory << " ; ";
- t << "grep \"^qmake_all:\" " << (*it)->makefile
+ t << "grep \"^qmake_all:\" " << (*it)->makefile
<< " && $(MAKE) -f " << (*it)->makefile << " qmake_all" << "; ) || true";
}
t << endl;
- t << "clean uninstall install uiclean mocclean: qmake_all FORCE";
+ t << "clean uninstall install uiclean mocclean lexclean yaccclean: qmake_all FORCE";
for( it.toFirst(); it.current(); ++it) {
t << "\n\t ( ";
if(!(*it)->directory.isEmpty())
t << "[ -d " << (*it)->directory << " ] && cd " << (*it)->directory << " ; ";
t << "$(MAKE) -f " << (*it)->makefile << " $@" << "; ) || true";
}
t << endl;
t << "distclean: qmake_all FORCE";
for( it.toFirst(); it.current(); ++it) {
t << "\n\t ( ";
if(!(*it)->directory.isEmpty())
t << "[ -d " << (*it)->directory << " ] && cd " << (*it)->directory << " ; ";
t << "$(MAKE) -f " << (*it)->makefile << " $@; $(DEL_FILE) " << (*it)->makefile << "; ) || true";
}
t << endl << endl;
}
t <<"FORCE:" << endl << endl;
}
void UnixMakefileGenerator::init2()
{
//version handling
if(project->variables()["VERSION"].isEmpty())
project->variables()["VERSION"].append("1.0." +
(project->isEmpty("VER_PAT") ? QString("0") :
project->first("VER_PAT")) );
QStringList l = QStringList::split('.', project->first("VERSION"));
l << "0" << "0"; //make sure there are three
project->variables()["VER_MAJ"].append(l[0]);
project->variables()["VER_MIN"].append(l[1]);
project->variables()["VER_PAT"].append(l[2]);
if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) {
#if 0
if ( project->isActiveConfig("dll") ) {
project->variables()["TARGET"] += project->variables()["TARGET.so"];
if(project->variables()["QMAKE_LFLAGS_SHAPP"].isEmpty())
project->variables()["QMAKE_LFLAGS_SHAPP"] += project->variables()["QMAKE_LFLAGS_SHLIB"];
if(!project->variables()["QMAKE_LFLAGS_SONAME"].isEmpty())
project->variables()["QMAKE_LFLAGS_SONAME"].first() += project->first("TARGET");
}
#endif
project->variables()["TARGET"].first().prepend(project->first("DESTDIR"));
+ if ( !project->variables()["QMAKE_CYGWIN_EXE"].isEmpty() )
+ project->variables()["TARGET_EXT"].append(".exe");
} else if ( project->isActiveConfig("staticlib") ) {
project->variables()["TARGET"].first().prepend("lib");
project->variables()["TARGET"].first() += ".a";
if(project->variables()["QMAKE_AR_CMD"].isEmpty())
project->variables()["QMAKE_AR_CMD"].append("$(AR) $(TARGET) $(OBJECTS) $(OBJMOC)");
} else {
project->variables()["TARGETA"].append(project->first("DESTDIR") + "lib" + project->first("TARGET") + ".a");
if ( !project->variables()["QMAKE_AR_CMD"].isEmpty() )
project->variables()["QMAKE_AR_CMD"].first().replace("(TARGET)","(TARGETA)");
else
project->variables()["QMAKE_AR_CMD"].append("$(AR) $(TARGETA) $(OBJECTS) $(OBJMOC)");
- QString os = project->variables()["QMAKESPEC"].first().section( '-', 0, 0 );
if( project->isActiveConfig("plugin") ) {
project->variables()["TARGET_x.y.z"].append("lib" +
project->first("TARGET") + "." + project->first("QMAKE_EXTENSION_SHLIB"));
if(project->isActiveConfig("lib_version_first"))
project->variables()["TARGET_x"].append("lib" + project->first("TARGET") + "." +
- project->first("VER_MAJ") + "." +
+ project->first("VER_MAJ") + "." +
project->first("QMAKE_EXTENSION_SHLIB"));
else
project->variables()["TARGET_x"].append("lib" + project->first("TARGET") + "." +
project->first("QMAKE_EXTENSION_SHLIB") +
"." + project->first("VER_MAJ"));
project->variables()["TARGET"] = project->variables()["TARGET_x.y.z"];
if(project->isActiveConfig("qt"))
project->variables()["DEFINES"].append("QT_PLUGIN");
- } else if ( os == "hpux" ) {
+ } else if ( !project->isEmpty("QMAKE_HPUX_SHLIB") ) {
project->variables()["TARGET_"].append("lib" + project->first("TARGET") + ".sl");
if(project->isActiveConfig("lib_version_first"))
- project->variables()["TARGET_x"].append("lib" + project->first("VER_MAJ") + "." +
+ project->variables()["TARGET_x"].append("lib" + project->first("VER_MAJ") + "." +
project->first("TARGET"));
else
- project->variables()["TARGET_x"].append("lib" + project->first("TARGET") + "." +
+ project->variables()["TARGET_x"].append("lib" + project->first("TARGET") + "." +
project->first("VER_MAJ"));
project->variables()["TARGET"] = project->variables()["TARGET_x"];
- } else if ( os == "aix" ) {
+ } else if ( !project->isEmpty("QMAKE_AIX_SHLIB") ) {
project->variables()["TARGET_"].append("lib" + project->first("TARGET") + ".a");
if(project->isActiveConfig("lib_version_first")) {
project->variables()["TARGET_x"].append("lib" + project->first("TARGET") + "." +
project->first("VER_MAJ") + "." +
project->first("QMAKE_EXTENSION_SHLIB"));
project->variables()["TARGET_x.y"].append("lib" + project->first("TARGET") + "." +
project->first("VER_MAJ") +
"." + project->first("VER_MIN") + "." +
project->first("QMAKE_EXTENSION_SHLIB"));
project->variables()["TARGET_x.y.z"].append("lib" + project->first("TARGET") + "." +
project->first("VER_MAJ") + "." +
project->first("VER_MIN") + "." +
project->first("VER_PAT") + "." +
project->first("QMAKE_EXTENSION_SHLIB"));
} else {
project->variables()["TARGET_x"].append("lib" + project->first("TARGET") + "." +
project->first("QMAKE_EXTENSION_SHLIB") +
"." + project->first("VER_MAJ"));
project->variables()["TARGET_x.y"].append("lib" + project->first("TARGET") + "." +
project->first("QMAKE_EXTENSION_SHLIB") +
"." + project->first("VER_MAJ") +
"." + project->first("VER_MIN"));
project->variables()["TARGET_x.y.z"].append("lib" + project->first("TARGET") + "." +
project->first("QMAKE_EXTENSION_SHLIB") + "." +
@@ -990,50 +1042,57 @@ void UnixMakefileGenerator::init2()
project->variables()["QMAKE_EXTENSION_SHLIB"].first());
} else {
project->variables()["TARGET_x"].append("lib" + project->first("TARGET") + "." +
project->first("QMAKE_EXTENSION_SHLIB") +
"." + project->first("VER_MAJ"));
project->variables()["TARGET_x.y"].append("lib" + project->first("TARGET") + "." +
project->first("QMAKE_EXTENSION_SHLIB")
+ "." + project->first("VER_MAJ") +
"." + project->first("VER_MIN"));
project->variables()["TARGET_x.y.z"].append("lib" + project->first("TARGET") +
"." +
project->variables()[
"QMAKE_EXTENSION_SHLIB"].first() + "." +
project->first("VER_MAJ") + "." +
project->first("VER_MIN") + "." +
project->first("VER_PAT"));
}
project->variables()["TARGET"] = project->variables()["TARGET_x.y.z"];
}
if(project->isEmpty("QMAKE_LN_SHLIB"))
project->variables()["QMAKE_LN_SHLIB"].append("ln -s");
project->variables()["DESTDIR_TARGET"].append("$(TARGET)");
if ( !project->variables()["DESTDIR"].isEmpty() )
project->variables()["DESTDIR_TARGET"].first().prepend(project->first("DESTDIR"));
- if ( !project->variables()["QMAKE_LFLAGS_SONAME"].isEmpty() && !project->variables()["TARGET_x"].isEmpty() )
- project->variables()["QMAKE_LFLAGS_SONAME"].first() += project->first("TARGET_x");
+ if ( !project->variables()["QMAKE_LFLAGS_SONAME"].isEmpty()) {
+ if(project->isActiveConfig("plugin")) {
+ if(!project->variables()["TARGET"].isEmpty() )
+ project->variables()["QMAKE_LFLAGS_SONAME"].first() += project->first("TARGET");
+ } else {
+ if(!project->variables()["TARGET_x"].isEmpty() )
+ project->variables()["QMAKE_LFLAGS_SONAME"].first() += project->first("TARGET_x");
+ }
+ }
if ( project->variables()["QMAKE_LINK_SHLIB_CMD"].isEmpty() )
project->variables()["QMAKE_LINK_SHLIB_CMD"].append(
"$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)");
}
if(project->isEmpty("QMAKE_SYMBOLIC_LINK"))
project->variables()["QMAKE_SYMBOLIC_LINK"].append("ln -sf");
if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) {
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_SHAPP"];
} else if ( project->isActiveConfig("dll") ) {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_SHLIB"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_SHLIB"];
if ( project->isActiveConfig("plugin") ) {
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_PLUGIN"];
if( !project->isActiveConfig("plugin_no_soname") )
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_SONAME"];
} else {
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_SHLIB"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_SONAME"];
}
QString destdir = project->first("DESTDIR");
if ( !destdir.isEmpty() && !project->variables()["QMAKE_RPATH"].isEmpty() ) {
QString rpath_destdir = destdir;
if(QDir::isRelativePath(rpath_destdir)) {
QFileInfo fi(Option::fixPathToLocalOS(rpath_destdir));
diff --git a/qmake/generators/win32/borland_bmake.cpp b/qmake/generators/win32/borland_bmake.cpp
index ae7b47b..26eea88 100644
--- a/qmake/generators/win32/borland_bmake.cpp
+++ b/qmake/generators/win32/borland_bmake.cpp
@@ -111,160 +111,171 @@ BorlandMakefileGenerator::writeBorlandParts(QTextStream &t)
t << var("QMAKE_LFLAGS") << endl;
t << "LIBS = " << var("QMAKE_LIBS") << endl;
}
else {
t << "LIB = " << var("QMAKE_LIB") << endl;
}
t << "MOC = " << (project->isEmpty("QMAKE_MOC") ? QString("moc") :
Option::fixPathToTargetOS(var("QMAKE_MOC"), FALSE)) << endl;
t << "UIC = " << (project->isEmpty("QMAKE_UIC") ? QString("uic") :
Option::fixPathToTargetOS(var("QMAKE_UIC"), FALSE)) << endl;
t << "QMAKE = " << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") :
Option::fixPathToTargetOS(var("QMAKE_QMAKE"), FALSE)) << endl;
t << "IDC = " << (project->isEmpty("QMAKE_IDC") ? QString("idc") :
Option::fixPathToTargetOS(var("QMAKE_IDC"), FALSE)) << endl;
t << "IDL = " << (project->isEmpty("QMAKE_IDL") ? QString("midl") :
Option::fixPathToTargetOS(var("QMAKE_IDL"), FALSE)) << endl;
t << "ZIP = " << var("QMAKE_ZIP") << endl;
t << "DEF_FILE = " << varList("DEF_FILE") << endl;
t << "RES_FILE = " << varList("RES_FILE") << endl;
t << "COPY_FILE = " << var("QMAKE_COPY") << endl;
t << "COPY_DIR = " << var("QMAKE_COPY") << endl;
t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl;
t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl;
t << "MOVE = " << var("QMAKE_MOVE") << endl;
+ t << "CHK_DIR_EXISTS = " << var("QMAKE_CHK_DIR_EXISTS") << endl;
+ t << "MKDIR = " << var("QMAKE_MKDIR") << endl;
t << endl;
t << "####### Files" << endl << endl;
t << "HEADERS = " << varList("HEADERS") << endl;
t << "SOURCES = " << varList("SOURCES") << endl;
t << "OBJECTS = " << varList("OBJECTS") << endl;
t << "FORMS = " << varList("FORMS") << endl;
t << "UICDECLS = " << varList("UICDECLS") << endl;
t << "UICIMPLS = " << varList("UICIMPLS") << endl;
t << "SRCMOC = " << varList("SRCMOC") << endl;
t << "OBJMOC = " << varList("OBJMOC") << endl;
t << "DIST = " << varList("DISTFILES") << endl;
t << "TARGET = "
<< varGlue("TARGET",project->first("DESTDIR"),"",project->first("TARGET_EXT"))
<< endl;
t << endl;
t << "####### Implicit rules" << endl << endl;
- t << ".SUFFIXES: .cpp .cxx .cc .c" << endl << endl;
- t << ".cpp.obj:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
- t << ".cxx.obj:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
- t << ".cc.obj:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
- t << ".c.obj:\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl;
+ t << ".SUFFIXES: .c";
+ QStringList::Iterator cppit;
+ for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)
+ t << " " << (*cppit);
+ t << endl << endl;
+ for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)
+ t << (*cppit) << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
+ t << ".c" << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl;
t << "####### Build rules" << endl << endl;
t << "all: " << varGlue("ALL_DEPS",""," "," ") << " $(TARGET)" << endl << endl;
- t << "$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) " << var("TARGETDEPS");
+ t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) "
+ << var("POST_TARGETDEPS");
if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) {
t << "\n\t" << "$(LINK) @&&|" << "\n\t"
<< "$(LFLAGS) $(OBJECTS) $(OBJMOC),$(TARGET),,$(LIBS),$(DEF_FILE),$(RES_FILE)";
} else {
t << "\n\t-del $(TARGET)"
<< "\n\t" << "$(LIB) $(TARGET) @&&|" << " \n+"
<< project->variables()["OBJECTS"].join(" \\\n+") << " \\\n+"
<< project->variables()["OBJMOC"].join(" \\\n+");
}
t << endl << "|" << endl;
+
+ if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() )
+ t << "\t" <<var("QMAKE_POST_LINK") << endl;
+
if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) {
QStringList dlldirs = project->variables()["DLLDESTDIR"];
for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) {
t << "\n\t" << "-copy $(TARGET) " << *dlldir;
}
}
QString targetfilename = project->variables()["TARGET"].first();
if(project->isActiveConfig("activeqt")) {
QString version = project->variables()["VERSION"].first();
if ( version.isEmpty() )
version = "1.0";
if ( project->isActiveConfig("dll")) {
t << "\n\t" << ("-$(IDC) $(TARGET) /idl tmp\\" + targetfilename + ".idl -version " + version);
t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl");
t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb");
t << "\n\t" << ("-$(IDC) $(TARGET) /regserver" );
} else {
t << "\n\t" << ("-$(TARGET) -dumpidl tmp\\" + targetfilename + ".idl -version " + version);
t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl");
t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb");
t << "\n\t" << ("-$(TARGET) -regserver");
}
}
t << endl << endl;
if(!project->variables()["RC_FILE"].isEmpty()) {
t << var("RES_FILE") << ": " << var("RC_FILE") << "\n\t"
<< var("QMAKE_RC") << " " << var("RC_FILE") << endl << endl;
}
t << "mocables: $(SRCMOC)" << endl << endl;
writeMakeQmake(t);
t << "dist:" << "\n\t"
<< "$(ZIP) " << var("PROJECT") << ".zip " << var("PROJECT") << ".pro $(SOURCES) $(HEADERS) $(DIST) $(FORMS)"
<< endl << endl;
t << "clean:\n"
<< varGlue("OBJECTS","\t-del ","\n\t-del ","")
<< varGlue("SRCMOC" ,"\n\t-del ","\n\t-del ","")
<< varGlue("OBJMOC" ,"\n\t-del ","\n\t-del ","")
<< varGlue("UICDECLS" ,"\n\t-del ","\n\t-del ","")
<< varGlue("UICIMPLS" ,"\n\t-del ","\n\t-del ","")
- << "\n\t-del $(TARGET)"
<< varGlue("QMAKE_CLEAN","\n\t-del ","\n\t-del ","")
<< varGlue("CLEAN_FILES","\n\t-del ","\n\t-del ","");
if ( project->isActiveConfig("activeqt")) {
t << ("\n\t-del tmp\\" + targetfilename + ".*");
t << "\n\t-del tmp\\dump.*";
}
- if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty())
- t << "\n\t-del " << var("DLLDESTDIR") << "\\" << project->variables()[ "TARGET" ].first() << project->variables()[ "TARGET_EXT" ].first();
if(!project->isEmpty("IMAGES"))
t << varGlue("QMAKE_IMAGE_COLLECTION", "\n\t-del ", "\n\t-del ", "");
// blasted user defined targets
QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"];
for(QStringList::Iterator it = qut.begin(); it != qut.end(); ++it) {
QString targ = var((*it) + ".target"),
cmd = var((*it) + ".commands"), deps;
if(targ.isEmpty())
targ = (*it);
QStringList &deplist = project->variables()[(*it) + ".depends"];
for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) {
QString dep = var((*dep_it) + ".target");
if(dep.isEmpty())
dep = (*dep_it);
deps += " " + dep;
}
t << "\n\n" << targ << ":" << deps << "\n\t"
<< cmd;
}
t << endl << endl;
+
+ t << "distclean: clean"
+ << "\n\t-del $(TARGET)"
+ << endl << endl;
}
void
BorlandMakefileGenerator::init()
{
if(init_flag)
return;
init_flag = TRUE;
project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"];
/* this should probably not be here, but I'm using it to wrap the .t files */
if(project->first("TEMPLATE") == "app")
project->variables()["QMAKE_APP_FLAG"].append("1");
else if(project->first("TEMPLATE") == "lib")
project->variables()["QMAKE_LIB_FLAG"].append("1");
else if(project->first("TEMPLATE") == "subdirs") {
MakefileGenerator::init();
if(project->variables()["MAKEFILE"].isEmpty())
project->variables()["MAKEFILE"].append("Makefile");
if(project->variables()["QMAKE"].isEmpty())
project->variables()["QMAKE"].append("qmake");
return;
}
@@ -343,49 +354,49 @@ BorlandMakefileGenerator::init()
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"];
}
if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") ) {
project->variables()["CONFIG"].append("windows");
}
if ( project->isActiveConfig("qt") ) {
project->variables()["CONFIG"].append("moc");
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_QT"];
project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"];
if ( !project->isActiveConfig("debug") )
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG");
if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) {
if ( !project->variables()["QMAKE_QT_DLL"].isEmpty()) {
project->variables()["DEFINES"].append("QT_MAKEDLL");
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_QT_DLL"];
}
} else {
if(project->isActiveConfig("thread"))
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_THREAD"];
else
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT"];
if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) {
int hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt");
if ( hver == -1 )
- hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt-mt");
+ hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qtmt");
if(hver != -1) {
QString ver;
ver.sprintf("qt%s" QTDLL_POSTFIX "%d.lib", (project->isActiveConfig("thread") ? "mt" : ""), hver);
QStringList &libs = project->variables()["QMAKE_LIBS"];
for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit)
(*libit).replace(QRegExp("qt(mt)?\\.lib"), ver);
}
}
if ( project->isActiveConfig( "activeqt" ) ) {
project->variables().remove("QMAKE_LIBS_QT_ENTRY");
project->variables()["QMAKE_LIBS_QT_ENTRY"] = "qaxserver.lib";
if ( project->isActiveConfig( "dll" ) )
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_ENTRY"];
}
if ( !project->isActiveConfig("dll") && !project->isActiveConfig("plugin") ) {
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_ENTRY"];
}
}
}
if ( project->isActiveConfig("opengl") ) {
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_OPENGL"];
}
if ( project->isActiveConfig("dll") ) {
@@ -405,73 +416,94 @@ BorlandMakefileGenerator::init()
project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE"];
project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS"];
if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty()) {
project->variables()["TARGET_EXT"].append(".exe");
} else {
project->variables()["TARGET_EXT"].append(".lib");
}
}
if ( project->isActiveConfig("windows") ) {
if ( project->isActiveConfig("console") ) {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"];
} else {
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"];
}
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"];
} else {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"];
}
+ if ( project->isActiveConfig("stl") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_OFF"];
+ }
+ if ( project->isActiveConfig("exceptions") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_OFF"];
+ }
+ if ( project->isActiveConfig("rtti") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"];
+ }
+
if ( project->isActiveConfig("thread") ) {
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_RTMT"];
} else {
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_RT"];
}
if ( project->isActiveConfig("moc") ) {
setMocAware(TRUE);
}
project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"];
project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ',
"HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH");
QStringList &l = project->variables()["QMAKE_FILETAGS"];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QStringList &gdmf = project->variables()[(*it)];
for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner)
(*inner) = Option::fixPathToTargetOS((*inner), FALSE);
}
if ( !project->variables()["RC_FILE"].isEmpty()) {
if ( !project->variables()["RES_FILE"].isEmpty()) {
fprintf(stderr, "Both .rc and .res file specified.\n");
fprintf(stderr, "Please specify one of them, not both.");
exit(666);
}
project->variables()["RES_FILE"] = project->variables()["RC_FILE"];
project->variables()["RES_FILE"].first().replace(".rc",".res");
- project->variables()["TARGETDEPS"] += project->variables()["RES_FILE"];
+ project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"];
}
MakefileGenerator::init();
if ( !project->variables()["VERSION"].isEmpty()) {
QStringList l = QStringList::split('.', project->first("VERSION"));
project->variables()["VER_MAJ"].append(l[0]);
project->variables()["VER_MIN"].append(l[1]);
}
if ( project->isActiveConfig("dll") || !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) {
// bcc does not generate a .tds file for static libs
QString tdsPostfix;
if ( !project->variables()["VERSION"].isEmpty() ) {
tdsPostfix = QStringList::split( '.', project->first("VERSION") ).join("")
+ ".tds";
} else {
tdsPostfix = ".tds";
}
project->variables()["QMAKE_CLEAN"].append(
project->first("DESTDIR") + project->first("TARGET") + tdsPostfix );
}
}
-
diff --git a/qmake/generators/win32/borland_bmake.h b/qmake/generators/win32/borland_bmake.h
index 90f8229..5ffed58 100644
--- a/qmake/generators/win32/borland_bmake.h
+++ b/qmake/generators/win32/borland_bmake.h
@@ -1,59 +1,58 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef __BORLANDMAKE_H__
-#define __BORLANDMAKE_H__
+#ifndef __BORLAND_BMAKE_H__
+#define __BORLAND_BMAKE_H__
#include "winmakefile.h"
class BorlandMakefileGenerator : public Win32MakefileGenerator
{
bool init_flag;
void writeBorlandParts(QTextStream &);
bool writeMakefile(QTextStream &);
void init();
public:
BorlandMakefileGenerator(QMakeProject *p);
~BorlandMakefileGenerator();
};
inline BorlandMakefileGenerator::~BorlandMakefileGenerator()
{ }
-
-#endif /* __BORLANDMAKE_H__ */
+#endif /* __BORLAND_BMAKE_H__ */
diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp
new file mode 100644
index 0000000..7f58a55
--- a/dev/null
+++ b/qmake/generators/win32/mingw_make.cpp
@@ -0,0 +1,524 @@
+/****************************************************************************
+** $Id$
+**
+** Definition of ________ class.
+**
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
+**
+** This file is part of the network module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition licenses may use this
+** file in accordance with the Qt Commercial License Agreement provided
+** with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#include "mingw_make.h"
+#include "option.h"
+#include <qregexp.h>
+#include <qdir.h>
+#include <stdlib.h>
+#include <time.h>
+
+
+MingwMakefileGenerator::MingwMakefileGenerator(QMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE)
+{
+ Option::obj_ext = ".o";
+}
+
+bool
+MingwMakefileGenerator::writeMakefile(QTextStream &t)
+{
+ writeHeader(t);
+ if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {
+ t << "all clean:" << "\n\t"
+ << "@echo \"Some of the required modules ("
+ << var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"" << "\n\t"
+ << "@echo \"Skipped.\"" << endl << endl;
+ writeMakeQmake(t);
+ return TRUE;
+ }
+
+ if(project->first("TEMPLATE") == "app" ||
+ project->first("TEMPLATE") == "lib") {
+ writeMingwParts(t);
+ return MakefileGenerator::writeMakefile(t);
+ }
+ else if(project->first("TEMPLATE") == "subdirs") {
+ writeSubDirs(t);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void
+MingwMakefileGenerator::writeMingwParts(QTextStream &t)
+{
+ t << "####### Compiler, tools and options" << endl << endl;
+ t << "CC = " << var("QMAKE_CC") << endl;
+ t << "CXX = " << var("QMAKE_CXX") << endl;
+ t << "LEX = " << var("QMAKE_LEX") << endl;
+ t << "YACC = " << var("QMAKE_YACC") << endl;
+ t << "CFLAGS = " << var("QMAKE_CFLAGS") << " "
+ << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " "
+ << varGlue("DEFINES","-D"," -D","") << endl;
+ t << "CXXFLAGS = " << var("QMAKE_CXXFLAGS") << " "
+ << varGlue("PRL_EXPORT_DEFINES","-D"," -D","") << " "
+ << varGlue("DEFINES","-D"," -D","") << endl;
+ t << "LEXFLAGS =" << var("QMAKE_LEXFLAGS") << endl;
+ t << "YACCFLAGS =" << var("QMAKE_YACCFLAGS") << endl;
+
+ t << "INCPATH = ";
+ QStringList &incs = project->variables()["INCLUDEPATH"];
+ for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) {
+ QString inc = (*incit);
+ inc.replace(QRegExp("\\\\$"), "\\\\");
+ inc.replace(QRegExp("\""), "");
+ t << " -I" << inc ;
+ }
+ t << " -I" << specdir()
+ << endl;
+ if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) {
+ t << "LINK = " << var("QMAKE_LINK") << endl;
+ t << "LFLAGS = ";
+ if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() )
+ t << varGlue("QMAKE_LIBDIR","-L",";","") << " ";
+ t << var("QMAKE_LFLAGS") << endl;
+ t << "LIBS = " << var("QMAKE_LIBS").replace(QRegExp("(\\slib|^lib)")," -l") << endl;
+ }
+ else {
+ t << "LIB = " << var("QMAKE_LIB") << endl;
+ }
+ t << "MOC = " << (project->isEmpty("QMAKE_MOC") ? QString("moc") :
+ Option::fixPathToTargetOS(var("QMAKE_MOC"), FALSE)) << endl;
+ t << "UIC = " << (project->isEmpty("QMAKE_UIC") ? QString("uic") :
+ Option::fixPathToTargetOS(var("QMAKE_UIC"), FALSE)) << endl;
+ t << "QMAKE = " << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") :
+ Option::fixPathToTargetOS(var("QMAKE_QMAKE"), FALSE)) << endl;
+ t << "IDC = " << (project->isEmpty("QMAKE_IDC") ? QString("idc") :
+ Option::fixPathToTargetOS(var("QMAKE_IDC"), FALSE)) << endl;
+ t << "IDL = " << (project->isEmpty("QMAKE_IDL") ? QString("midl") :
+ Option::fixPathToTargetOS(var("QMAKE_IDL"), FALSE)) << endl;
+ t << "ZIP = " << var("QMAKE_ZIP") << endl;
+ t << "DEF_FILE = " << varList("DEF_FILE") << endl;
+ t << "COPY_FILE = " << var("QMAKE_COPY") << endl;
+ t << "COPY_DIR = " << var("QMAKE_COPY") << endl;
+ t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl;
+ t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl;
+ t << "MOVE = " << var("QMAKE_MOVE") << endl;
+ t << "CHK_DIR_EXISTS = " << var("QMAKE_CHK_DIR_EXISTS") << endl;
+ t << "MKDIR = " << var("QMAKE_MKDIR") << endl;
+ t << endl;
+
+ t << "####### Output directory" << endl << endl;
+ if (! project->variables()["OBJECTS_DIR"].isEmpty())
+ t << "OBJECTS_DIR = " << var("OBJECTS_DIR").replace(QRegExp("\\\\$"),"") << endl;
+ else
+ t << "OBJECTS_DIR = . " << endl;
+ if (! project->variables()["MOC_DIR"].isEmpty())
+ t << "MOC_DIR = " << var("MOC_DIR").replace(QRegExp("\\\\$"),"") << endl;
+ else
+ t << "MOC_DIR = . " << endl;
+ t << endl;
+
+ t << "####### Files" << endl << endl;
+ t << "HEADERS = " << varList("HEADERS") << endl;
+ t << "SOURCES = " << varList("SOURCES") << endl;
+// t << "OBJECTS = " << varList("OBJECTS").replace(QRegExp("\\.obj"),".o") << endl;
+ t << "OBJECTS = " << varList("OBJECTS") << endl;
+ t << "FORMS = " << varList("FORMS") << endl;
+ t << "UICDECLS = " << varList("UICDECLS") << endl;
+ t << "UICIMPLS = " << varList("UICIMPLS") << endl;
+ t << "SRCMOC = " << varList("SRCMOC") << endl;
+ t << "OBJMOC = " << varList("OBJMOC") << endl;
+// t << "OBJMOC = " << varList("OBJMOC").replace(QRegExp("\\.obj"),".o") << endl;
+ t << "DIST = " << varList("DISTFILES") << endl;
+ t << "TARGET = ";
+ if( !project->variables()[ "DESTDIR" ].isEmpty() )
+ t << varGlue("TARGET",project->first("DESTDIR"),"",project->first("TARGET_EXT"));
+ else
+ t << project->variables()[ "TARGET" ].first() << project->variables()[ "TARGET_EXT" ].first();
+ t << endl;
+ t << endl;
+
+ t << "####### Implicit rules" << endl << endl;
+ t << ".SUFFIXES: .cpp .cxx .cc .C .c" << endl << endl;
+ t << ".cpp.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
+ t << ".cxx.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
+ t << ".cc.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
+ t << ".C.o:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
+ t << ".c.o:\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl;
+
+ t << "####### Build rules" << endl << endl;
+ t << "all: " << "$(OBJECTS_DIR) " << "$(MOC_DIR) " << varGlue("ALL_DEPS",""," "," ") << "$(TARGET)" << endl << endl;
+ t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) "
+ << var("POST_TARGETDEPS");
+ if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) {
+ t << "\n\t" << "$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)";
+ } else {
+ t << "\n\t" << "$(LIB) $(TARGET) $(OBJECTS) $(OBJMOC)";
+ }
+
+ if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) {
+ QStringList dlldirs = project->variables()["DLLDESTDIR"];
+ for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) {
+ t << "\n\t" << "copy $(TARGET) " << *dlldir;
+ }
+ }
+ QString targetfilename = project->variables()["TARGET"].first();
+ if(project->isActiveConfig("activeqt")) {
+ QString version = project->variables()["VERSION"].first();
+ if ( version.isEmpty() )
+ version = "1.0";
+
+ if ( project->isActiveConfig("dll")) {
+ t << "\n\t" << ("-$(IDC) $(TARGET) /idl tmp\\" + targetfilename + ".idl -version " + version);
+ t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl");
+ t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb");
+ t << "\n\t" << ("-$(IDC) $(TARGET) /regserver" );
+ } else {
+ t << "\n\t" << ("-$(TARGET) -dumpidl tmp\\" + targetfilename + ".idl -version " + version);
+ t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl");
+ t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb");
+ t << "\n\t" << "-$(TARGET) -regserver";
+ }
+ }
+ t << endl << endl;
+
+ if(!project->variables()["RC_FILE"].isEmpty()) {
+ t << var("RES_FILE") << ": " << var("RC_FILE") << "\n\t"
+ << var("QMAKE_RC") << " -i " << var("RC_FILE") << " -o " << var("RC_FILE").replace(QRegExp("\\.rc"),".o") << endl << endl;
+ }
+ project->variables()["RES_FILE"].first().replace(QRegExp("\\.rc"),".o");
+
+ t << "mocables: $(SRCMOC)" << endl << endl;
+
+ t << "$(OBJECTS_DIR):" << "\n\t"
+ << "@if not exist $(OBJECTS_DIR) mkdir $(OBJECTS_DIR)" << endl << endl;
+
+ t << "$(MOC_DIR):" << "\n\t"
+ << "@if not exist $(MOC_DIR) mkdir $(MOC_DIR)" << endl << endl;
+
+ writeMakeQmake(t);
+
+ t << "dist:" << "\n\t"
+ << "$(ZIP) " << var("PROJECT") << ".zip "
+ << var("PROJECT") << ".pro $(SOURCES) $(HEADERS) $(DIST) $(FORMS)" << endl << endl;
+
+ t << "clean:"
+ << varGlue("OBJECTS","\n\t-del ","\n\t-del ","").replace(QRegExp("\\.obj"),".o")
+ << varGlue("SRCMOC" ,"\n\t-del ","\n\t-del ","")
+ << varGlue("OBJMOC" ,"\n\t-del ","\n\t-del ","").replace(QRegExp("\\.obj"),".o")
+ << varGlue("UICDECLS" ,"\n\t-del ","\n\t-del ","")
+ << varGlue("UICIMPLS" ,"\n\t-del ","\n\t-del ","")
+ << "\n\t-del $(TARGET)"
+ << varGlue("QMAKE_CLEAN","\n\t-del ","\n\t-del ","")
+ << varGlue("CLEAN_FILES","\n\t-del ","\n\t-del ","");
+ if ( project->isActiveConfig("activeqt")) {
+ t << ("\n\t-del tmp\\" + targetfilename + ".*");
+ t << "\n\t-del tmp\\dump.*";
+ }
+ if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty())
+ t << "\n\t-del " << var("DLLDESTDIR") << "\\" << project->variables()[ "TARGET" ].first() << project->variables()[ "TARGET_EXT" ].first();
+ if(!project->isEmpty("IMAGES"))
+ t << varGlue("QMAKE_IMAGE_COLLECTION", "\n\t-del ", "\n\t-del ", "");
+
+ // blasted user defined targets
+ QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"];
+ for(QStringList::Iterator it = qut.begin(); it != qut.end(); ++it) {
+ QString targ = var((*it) + ".target"),
+ cmd = var((*it) + ".commands"), deps;
+ if(targ.isEmpty())
+ targ = (*it);
+ QStringList &deplist = project->variables()[(*it) + ".depends"];
+ for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) {
+ QString dep = var((*dep_it) + ".target");
+ if(dep.isEmpty())
+ dep = (*dep_it);
+ deps += " " + dep;
+ }
+ t << "\n\n" << targ << ":" << deps << "\n\t"
+ << cmd;
+ }
+
+ t << endl << endl;
+}
+
+
+void
+MingwMakefileGenerator::init()
+{
+ if(init_flag)
+ return;
+ init_flag = TRUE;
+
+ /* this should probably not be here, but I'm using it to wrap the .t files */
+ if(project->first("TEMPLATE") == "app")
+ project->variables()["QMAKE_APP_FLAG"].append("1");
+ else if(project->first("TEMPLATE") == "lib")
+ project->variables()["QMAKE_LIB_FLAG"].append("1");
+ else if(project->first("TEMPLATE") == "subdirs") {
+ MakefileGenerator::init();
+ if(project->variables()["MAKEFILE"].isEmpty())
+ project->variables()["MAKEFILE"].append("Makefile");
+ if(project->variables()["QMAKE"].isEmpty())
+ project->variables()["QMAKE"].append("qmake");
+ return;
+ }
+
+ bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qt-mt"QTDLL_POSTFIX);
+ project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"];
+
+ // LIBS defined in Profile comes first for gcc
+ project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"];
+
+ QString targetfilename = project->variables()["TARGET"].first();
+ QStringList &configs = project->variables()["CONFIG"];
+ if (project->isActiveConfig("qt") && project->isActiveConfig("shared"))
+ project->variables()["DEFINES"].append("QT_DLL");
+ if (project->isActiveConfig("qt_dll"))
+ if(configs.findIndex("qt") == -1) configs.append("qt");
+ if ( project->isActiveConfig("qt") ) {
+ if ( project->isActiveConfig( "plugin" ) ) {
+ project->variables()["CONFIG"].append("dll");
+ if(project->isActiveConfig("qt"))
+ project->variables()["DEFINES"].append("QT_PLUGIN");
+ }
+ if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) &&
+ ((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 ||
+ project->variables()["DEFINES"].findIndex("QT_DLL") != -1) ||
+ (getenv("QT_DLL") && !getenv("QT_NODLL"))) ) {
+ project->variables()["QMAKE_QT_DLL"].append("1");
+ if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() )
+ project->variables()["CONFIG"].append("dll");
+ }
+ if ( project->isActiveConfig("thread") )
+ project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT");
+ if ( project->isActiveConfig("accessibility" ) )
+ project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT");
+ if ( project->isActiveConfig("tablet") )
+ project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT");
+ }
+ if ( project->isActiveConfig("dll") || !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) {
+ project->variables()["CONFIG"].remove("staticlib");
+ project->variables()["QMAKE_APP_OR_DLL"].append("1");
+ } else {
+ project->variables()["CONFIG"].append("staticlib");
+ }
+ if ( project->isActiveConfig("warn_off") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_OFF"];
+ } else if ( project->isActiveConfig("warn_on") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_WARN_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_WARN_ON"];
+ }
+ if ( project->isActiveConfig("debug") ) {
+ if ( project->isActiveConfig("thread") ) {
+ // use the DLL RT even here
+ if ( project->variables()["DEFINES"].contains("QT_DLL") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DLLDBG"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DBG"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DBG"];
+ }
+ }
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_DEBUG"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_DEBUG"];
+ project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_DEBUG"];
+ } else {
+ if ( project->isActiveConfig("thread") ) {
+ if ( project->variables()["DEFINES"].contains("QT_DLL") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT_DLL"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT_DLL"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_MT"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_MT"];
+ }
+ }
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RELEASE"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RELEASE"];
+ project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_RELEASE"];
+ }
+
+ if ( !project->variables()["QMAKE_INCDIR"].isEmpty())
+ project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"];
+ if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") )
+ project->variables()["CONFIG"].append("windows");
+ if ( project->isActiveConfig("qt") ) {
+ project->variables()["CONFIG"].append("moc");
+ project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_QT"];
+ project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"];
+ if ( !project->isActiveConfig("debug") )
+ project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_NO_DEBUG");
+ if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) {
+ if ( !project->variables()["QMAKE_QT_DLL"].isEmpty()) {
+ project->variables()["DEFINES"].append("QT_MAKEDLL");
+ project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_QT_DLL"];
+ }
+ } else {
+ if(project->isActiveConfig("thread"))
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_THREAD"];
+ else
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT"];
+ if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) {
+ int hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt");
+ if ( hver == -1 )
+ hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt-mt");
+ if(hver != -1) {
+ QString ver;
+ ver.sprintf("libqt-%s" QTDLL_POSTFIX "%d.a", (project->isActiveConfig("thread") ? "-mt" : ""), hver);
+ QStringList &libs = project->variables()["QMAKE_LIBS"];
+// @@@HGTODO maybe we must change the replace regexp if we understand what's going on
+ for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit)
+ (*libit).replace(QRegExp("qt(-mt)?\\.lib"), ver);
+ }
+ }
+ if ( project->isActiveConfig( "activeqt" ) ) {
+ project->variables().remove("QMAKE_LIBS_QT_ENTRY");
+ project->variables()["QMAKE_LIBS_QT_ENTRY"] = "qaxserver.lib";
+ if ( project->isActiveConfig( "dll" ) )
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_ENTRY"];
+ }
+ if ( !project->isActiveConfig("dll") && !project->isActiveConfig("plugin") ) {
+ project->variables()["QMAKE_LIBS"] +=project->variables()["QMAKE_LIBS_QT_ENTRY"];
+ }
+ }
+ }
+ if ( project->isActiveConfig("opengl") ) {
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL"];
+ project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_OPENGL"];
+ }
+ if ( project->isActiveConfig("dll") ) {
+ project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE_DLL"];
+ project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE_DLL"];
+ project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE_DLL"];
+ project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS_DLL"];
+ if ( !project->variables()["QMAKE_LIB_FLAG"].isEmpty()) {
+ project->variables()["TARGET_EXT"].append(
+ QStringList::split('.',project->first("VERSION")).join("") + ".dll");
+ } else {
+ project->variables()["TARGET_EXT"].append(".dll");
+ }
+ } else {
+ project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CFLAGS_CONSOLE"];
+ project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_CXXFLAGS_CONSOLE"];
+ project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE"];
+ project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS"];
+ if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty()) {
+ project->variables()["TARGET_EXT"].append(".exe");
+ } else {
+ project->variables()["TARGET_EXT"].append(".a");
+ project->variables()["QMAKE_LFLAGS"].append("-static");
+ if(project->variables()["TARGET"].first().left(3) != "lib")
+ project->variables()["TARGET"].first().prepend("lib");
+ }
+ }
+ if ( project->isActiveConfig("windows") ) {
+ if ( project->isActiveConfig("console") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"];
+ project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"];
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"];
+ } else {
+ project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"];
+ }
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"];
+ project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"];
+ project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"];
+ }
+
+ if ( project->isActiveConfig("moc") )
+ setMocAware(TRUE);
+ project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ',
+ "HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH");
+ QStringList &l = project->variables()["QMAKE_FILETAGS"];
+ for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QStringList &gdmf = project->variables()[(*it)];
+ for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner)
+ (*inner) = Option::fixPathToTargetOS((*inner), FALSE);
+ }
+
+ if ( project->isActiveConfig("dll") )
+ project->variables()["QMAKE_LFLAGS"].append(QString("-Wl,--out-implib,") + project->first("DESTDIR") + "\\lib"+ project->first("TARGET") + ".a");
+
+ if ( !project->variables()["DEF_FILE"].isEmpty() )
+ project->variables()["QMAKE_LFLAGS"].append(QString("-Wl,--output-def,") + project->first("DEF_FILE"));
+// if(!project->isActiveConfig("incremental"))
+// project->variables()["QMAKE_LFLAGS"].append(QString("/incremental:no"));
+
+#if 0
+ if ( !project->variables()["VERSION"].isEmpty() ) {
+ QString version = project->variables()["VERSION"][0];
+ int firstDot = version.find( "." );
+ QString major = version.left( firstDot );
+ QString minor = version.right( version.length() - firstDot - 1 );
+ minor.replace( ".", "" );
+ project->variables()["QMAKE_LFLAGS"].append( "/VERSION:" + major + "." + minor );
+ }
+#endif
+ if ( !project->variables()["RC_FILE"].isEmpty()) {
+ if ( !project->variables()["RES_FILE"].isEmpty()) {
+ fprintf(stderr, "Both .rc and .res file specified.\n");
+ fprintf(stderr, "Please specify one of them, not both.");
+ exit(666);
+ }
+ project->variables()["RES_FILE"] = project->variables()["RC_FILE"];
+ project->variables()["RES_FILE"].first().replace(".rc",".o");
+ project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"];
+ }
+ if ( !project->variables()["RES_FILE"].isEmpty())
+ project->variables()["QMAKE_LIBS"] += project->variables()["RES_FILE"];
+
+ MakefileGenerator::init();
+ if ( !project->variables()["VERSION"].isEmpty()) {
+ QStringList l = QStringList::split('.', project->first("VERSION"));
+ project->variables()["VER_MAJ"].append(l[0]);
+ project->variables()["VER_MIN"].append(l[1]);
+ }
+ if(project->isActiveConfig("dll")) {
+ project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") +"lib" + project->first("TARGET") + ".a");
+ }
+}
+
+void
+MingwMakefileGenerator::writeSubDirs(QTextStream &t)
+{
+ QString qs ;
+ QTextStream ts (&qs, IO_WriteOnly) ;
+ Win32MakefileGenerator::writeSubDirs( ts ) ;
+ QRegExp rx("(\\n\\tcd [^\\n\\t]+)(\\n\\t.+)\\n\\t@cd ..") ;
+ rx.setMinimal(true);
+ int pos = 0 ;
+ while ( -1 != (pos = rx.search( qs, pos)))
+ {
+ QString qsMatch = rx.cap(2);
+ qsMatch.replace("\n\t"," && \\\n\t");
+ qs.replace(pos+rx.cap(1).length(), rx.cap(2).length(), qsMatch );
+ pos += (rx.cap(1).length()+qsMatch.length());
+ }
+ t << qs ;
+}
diff --git a/qmake/generators/win32/mingw_make.h b/qmake/generators/win32/mingw_make.h
new file mode 100644
index 0000000..c00bf1b
--- a/dev/null
+++ b/qmake/generators/win32/mingw_make.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+** $Id$
+**
+** Definition of ________ class.
+**
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
+**
+** This file is part of the network module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition licenses may use this
+** file in accordance with the Qt Commercial License Agreement provided
+** with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+#ifndef __MINGW_MAKE_H__
+#define __MINGW_MAKE_H__
+
+#include "winmakefile.h"
+
+class MingwMakefileGenerator : public Win32MakefileGenerator
+{
+ bool init_flag;
+ void writeMingwParts(QTextStream &);
+ void writeSubDirs(QTextStream &t) ;
+
+ bool writeMakefile(QTextStream &);
+ void init();
+
+public:
+ MingwMakefileGenerator(QMakeProject *p);
+ ~MingwMakefileGenerator();
+
+};
+
+inline MingwMakefileGenerator::~MingwMakefileGenerator()
+{ }
+
+#endif /* __MINGW_MAKE_H__ */
diff --git a/qmake/generators/win32/msvc_dsp.cpp b/qmake/generators/win32/msvc_dsp.cpp
index 8b08c78..3fa0496 100644
--- a/qmake/generators/win32/msvc_dsp.cpp
+++ b/qmake/generators/win32/msvc_dsp.cpp
@@ -487,48 +487,72 @@ DspMakefileGenerator::writeDspParts(QTextStream &t)
t << "# PROP Exclude_From_Build 1" << endl;
t << "# End Source File" << endl << endl;
}
}
else
t << var(variable);
}
t << line << endl;
}
t << endl;
file.close();
return TRUE;
}
void
DspMakefileGenerator::init()
{
if(init_flag)
return;
QStringList::Iterator it;
init_flag = TRUE;
+ const bool thread = project->isActiveConfig("thread");
+
+ if ( project->isActiveConfig("stl") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_OFF"];
+ }
+ if ( project->isActiveConfig("exceptions") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_OFF"];
+ }
+ if ( project->isActiveConfig("rtti") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"];
+ }
+
/* this should probably not be here, but I'm using it to wrap the .t files */
if(project->first("TEMPLATE") == "vcapp" )
project->variables()["QMAKE_APP_FLAG"].append("1");
else if(project->first("TEMPLATE") == "vclib")
project->variables()["QMAKE_LIB_FLAG"].append("1");
if ( project->variables()["QMAKESPEC"].isEmpty() )
project->variables()["QMAKESPEC"].append( getenv("QMAKESPEC") );
bool is_qt = (project->first("TARGET") == "qt"QTDLL_POSTFIX || project->first("TARGET") == "qt-mt"QTDLL_POSTFIX);
project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"];
QStringList &configs = project->variables()["CONFIG"];
if (project->isActiveConfig("shared"))
project->variables()["DEFINES"].append("QT_DLL");
if (project->isActiveConfig("qt_dll"))
if(configs.findIndex("qt") == -1) configs.append("qt");
if ( project->isActiveConfig("qt") ) {
if ( project->isActiveConfig( "plugin" ) ) {
project->variables()["CONFIG"].append("dll");
project->variables()["DEFINES"].append("QT_PLUGIN");
}
if ( (project->variables()["DEFINES"].findIndex("QT_NODLL") == -1) &&
((project->variables()["DEFINES"].findIndex("QT_MAKEDLL") != -1 ||
project->variables()["DEFINES"].findIndex("QT_DLL") != -1) ||
@@ -547,103 +571,103 @@ DspMakefileGenerator::init()
if ( project->isActiveConfig("qt") || project->isActiveConfig("opengl") ) {
project->variables()["CONFIG"].append("windows");
}
if ( !project->variables()["VERSION"].isEmpty() ) {
QString version = project->variables()["VERSION"][0];
int firstDot = version.find( "." );
QString major = version.left( firstDot );
QString minor = version.right( version.length() - firstDot - 1 );
minor.replace( ".", "" );
project->variables()["MSVCDSP_VERSION"].append( "/VERSION:" + major + "." + minor );
}
if ( project->isActiveConfig("qt") ) {
project->variables()["CONFIG"].append("moc");
project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_QT"];
project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"];
if ( is_qt && !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) {
if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) {
project->variables()["DEFINES"].append("QT_MAKEDLL");
project->variables()["QMAKE_LFLAGS"].append("/base:\"0x39D00000\"");
}
} else {
- if(project->isActiveConfig("thread"))
+ if( thread )
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_THREAD"];
else
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT"];
if ( !project->variables()["QMAKE_QT_DLL"].isEmpty() ) {
int hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt");
if ( hver == -1 )
hver = findHighestVersion(project->first("QMAKE_LIBDIR_QT"), "qt-mt");
if(hver != -1) {
QString ver;
- ver.sprintf("qt%s" QTDLL_POSTFIX "%d.lib", (project->isActiveConfig("thread") ? "-mt" : ""), hver);
+ ver.sprintf("qt%s" QTDLL_POSTFIX "%d.lib", (thread ? "-mt" : ""), hver);
QStringList &libs = project->variables()["QMAKE_LIBS"];
for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit)
(*libit).replace(QRegExp("qt(-mt)?\\.lib"), ver);
}
}
if ( project->isActiveConfig( "activeqt" ) ) {
project->variables().remove("QMAKE_LIBS_QT_ENTRY");
project->variables()["QMAKE_LIBS_QT_ENTRY"] = "qaxserver.lib";
if ( project->isActiveConfig( "dll" ) )
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_ENTRY"];
}
if ( !project->isActiveConfig("dll") && !project->isActiveConfig("plugin") ) {
project->variables()["QMAKE_LIBS"] +=project->variables()["QMAKE_LIBS_QT_ENTRY"];
}
}
}
if ( project->isActiveConfig("debug") ) {
if ( !project->first("OBJECTS_DIR").isEmpty() )
project->variables()["MSVCDSP_OBJECTSDIRDEB"] = project->first("OBJECTS_DIR");
else
project->variables()["MSVCDSP_OBJECTSDIRDEB"] = "Debug";
project->variables()["MSVCDSP_OBJECTSDIRREL"] = "Release";
if ( !project->first("DESTDIR").isEmpty() )
project->variables()["MSVCDSP_TARGETDIRDEB"] = project->first("DESTDIR");
else
project->variables()["MSVCDSP_TARGETDIRDEB"] = "Debug";
project->variables()["MSVCDSP_TARGETDIRREL"] = "Release";
} else {
if ( !project->first("OBJECTS_DIR").isEmpty() )
project->variables()["MSVCDSP_OBJECTSDIRREL"] = project->first("OBJECTS_DIR");
project->variables()["MSVCDSP_OBJECTSDIRDEB"] = "Debug";
if ( !project->first("DESTDIR").isEmpty() )
project->variables()["MSVCDSP_TARGETDIRREL"] = project->first("DESTDIR");
else
project->variables()["MSVCDSP_TARGETDIRREL"] = "Release";
project->variables()["MSVCDSP_TARGETDIRDEB"] = "Debug";
}
if ( project->isActiveConfig("opengl") ) {
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_OPENGL"];
}
- if ( project->isActiveConfig("thread") ) {
+ if ( thread ) {
if(project->isActiveConfig("qt"))
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_THREAD_SUPPORT" );
if ( project->isActiveConfig("dll") || project->first("TARGET") == "qtmain"
|| !project->variables()["QMAKE_QT_DLL"].isEmpty() ) {
project->variables()["MSVCDSP_MTDEFD"] += project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"];
project->variables()["MSVCDSP_MTDEF"] += project->variables()["QMAKE_CXXFLAGS_MT_DLL"];
} else {
// YES we want to use the DLL even in a static build
project->variables()["MSVCDSP_MTDEFD"] += project->variables()["QMAKE_CXXFLAGS_MT_DBG"];
project->variables()["MSVCDSP_MTDEF"] += project->variables()["QMAKE_CXXFLAGS_MT"];
}
if ( !project->variables()["DEFINES"].contains("QT_DLL") && is_qt
&& project->first("TARGET") != "qtmain" )
project->variables()["QMAKE_LFLAGS"].append("/NODEFAULTLIB:\"libc\"");
}
if(project->isActiveConfig("qt")) {
if ( project->isActiveConfig("accessibility" ) )
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_ACCESSIBILITY_SUPPORT");
if ( project->isActiveConfig("tablet") )
project->variables()[is_qt ? "PRL_EXPORT_DEFINES" : "DEFINES"].append("QT_TABLET_SUPPORT");
}
if ( project->isActiveConfig("dll") ) {
if ( !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) {
@@ -711,239 +735,258 @@ DspMakefileGenerator::init()
project->variables()["MSVCDSP_SUBSYSTEM"].append("console");
} else {
project->variables()["MSVCDSP_CONSOLE"].clear();
project->variables()["MSVCDSP_WINCONDEF"].append("_WINDOWS");
project->variables()["MSVCDSP_DSPTYPE"].append("0x0101");
project->variables()["MSVCDSP_SUBSYSTEM"].append("windows");
}
} else {
if ( project->isActiveConfig("dll") ) {
project->variables()["MSVCDSP_TEMPLATE"].append("win32dll" + project->first( "DSP_EXTENSION" ) );
} else {
project->variables()["MSVCDSP_TEMPLATE"].append("win32lib" + project->first( "DSP_EXTENSION" ) );
}
}
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"];
project->variables()["MSVCDSP_LFLAGS" ] += project->variables()["QMAKE_LFLAGS"];
if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() )
project->variables()["MSVCDSP_LFLAGS" ].append(varGlue("QMAKE_LIBDIR","/LIBPATH:\"","\" /LIBPATH:\"","\""));
project->variables()["MSVCDSP_CXXFLAGS" ] += project->variables()["QMAKE_CXXFLAGS"];
project->variables()["MSVCDSP_DEFINES"].append(varGlue("DEFINES","/D ","" " /D ",""));
project->variables()["MSVCDSP_DEFINES"].append(varGlue("PRL_EXPORT_DEFINES","/D ","" " /D ",""));
+ processPrlFiles();
QStringList &libs = project->variables()["QMAKE_LIBS"];
for(QStringList::Iterator libit = libs.begin(); libit != libs.end(); ++libit) {
QString lib = (*libit);
lib.replace(QRegExp("\""), "");
project->variables()["MSVCDSP_LIBS"].append(" \"" + lib + "\"");
}
QStringList &incs = project->variables()["INCLUDEPATH"];
for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) {
QString inc = (*incit);
inc.replace("\"", "");
project->variables()["MSVCDSP_INCPATH"].append("/I \"" + inc + "\"");
}
project->variables()["MSVCDSP_INCPATH"].append("/I \"" + specdir() + "\"");
if ( project->isActiveConfig("qt") ) {
project->variables()["MSVCDSP_RELDEFS"].append("/D \"QT_NO_DEBUG\"");
} else {
project->variables()["MSVCDSP_RELDEFS"].clear();
}
QString dest;
+ QString postLinkStep;
+ QString copyDllStep;
+ QString activeQtStepPreCopyDll;
+ QString activeQtStepPostCopyDll;
+ QString activeQtStepPreCopyDllDebug;
+ QString activeQtStepPostCopyDllDebug;
+ QString activeQtStepPreCopyDllRelease;
+ QString activeQtStepPostCopyDllRelease;
+
+ if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() )
+ postLinkStep += var("QMAKE_POST_LINK");
+
if ( !project->variables()["DESTDIR"].isEmpty() ) {
project->variables()["TARGET"].first().prepend(project->first("DESTDIR"));
Option::fixPathToTargetOS(project->first("TARGET"));
dest = project->first("TARGET");
if ( project->first("TARGET").startsWith("$(QTDIR)") )
dest.replace( "$(QTDIR)", getenv("QTDIR") );
project->variables()["MSVCDSP_TARGET"].append(
QString("/out:\"") + dest + "\"");
if ( project->isActiveConfig("dll") ) {
QString imp = dest;
imp.replace(".dll", ".lib");
project->variables()["MSVCDSP_TARGET"].append(QString(" /implib:\"") + imp + "\"");
}
}
if ( project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty() ) {
QStringList dlldirs = project->variables()["DLLDESTDIR"];
- QString copydll = "# Begin Special Build Tool\n"
- "TargetPath=" + dest + "\n"
- "SOURCE=$(InputPath)\n"
- "PostBuild_Desc=Copy DLL to " + project->first("DLLDESTDIR") + "\n"
- "PostBuild_Cmds=";
-
+ if ( dlldirs.count() )
+ copyDllStep += "\t";
for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) {
- copydll += "copy \"" + dest + "\" \"" + *dlldir + "\"\t";
+ copyDllStep += "copy \"$(TargetPath)\" \"" + *dlldir + "\"\t";
}
-
- copydll += "\n# End Special Build Tool";
- project->variables()["MSVCDSP_COPY_DLL_REL"].append( copydll );
- project->variables()["MSVCDSP_COPY_DLL_DBG"].append( copydll );
}
+
if ( project->isActiveConfig("activeqt") ) {
QString idl = project->variables()["QMAKE_IDL"].first();
QString idc = project->variables()["QMAKE_IDC"].first();
QString version = project->variables()["VERSION"].first();
if ( version.isEmpty() )
version = "1.0";
project->variables()["MSVCDSP_IDLSOURCES"].append( "tmp\\" + targetfilename + ".idl" );
project->variables()["MSVCDSP_IDLSOURCES"].append( "tmp\\" + targetfilename + ".tlb" );
project->variables()["MSVCDSP_IDLSOURCES"].append( "tmp\\" + targetfilename + ".midl" );
if ( project->isActiveConfig( "dll" ) ) {
- QString regcmd = "# Begin Special Build Tool\n"
- "TargetPath=" + targetfilename + "\n"
- "SOURCE=$(InputPath)\n"
- "PostBuild_Desc=Finalizing ActiveQt server...\n"
- "PostBuild_Cmds=" +
- idc + " %1 -idl tmp\\" + targetfilename + ".idl -version " + version +
+ activeQtStepPreCopyDll +=
+ "\t" + idc + " %1 -idl tmp\\" + targetfilename + ".idl -version " + version +
"\t" + idl + " tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl"
- "\t" + idc + " %1 /tlb tmp\\" + targetfilename + ".tlb"
- "\t" + idc + " %1 /regserver\n"
- "# End Special Build Tool";
+ "\t" + idc + " %1 /tlb tmp\\" + targetfilename + ".tlb";
+ activeQtStepPostCopyDll +=
+ "\t" + idc + " %1 /regserver\n";
- QString executable = project->variables()["MSVCDSP_TARGETDIRREL"].first() + "\\" + project->variables()["TARGET"].first();
- project->variables()["MSVCDSP_COPY_DLL_REL"].append( regcmd.arg(executable).arg(executable).arg(executable) );
+ QString executable = project->variables()["MSVCDSP_TARGETDIRREL"].first() + "\\" + targetfilename + ".dll";
+ activeQtStepPreCopyDllRelease = activeQtStepPreCopyDll.arg(executable).arg(executable);
+ activeQtStepPostCopyDllRelease = activeQtStepPostCopyDll.arg(executable);
- executable = project->variables()["MSVCDSP_TARGETDIRDEB"].first() + "\\" + project->variables()["TARGET"].first();
- project->variables()["MSVCDSP_COPY_DLL_DBG"].append( regcmd.arg(executable).arg(executable).arg(executable) );
+ executable = project->variables()["MSVCDSP_TARGETDIRDEB"].first() + "\\" + targetfilename + ".dll";
+ activeQtStepPreCopyDllDebug = activeQtStepPreCopyDll.arg(executable).arg(executable);
+ activeQtStepPostCopyDllDebug = activeQtStepPostCopyDll.arg(executable);
} else {
- QString regcmd = "# Begin Special Build Tool\n"
- "TargetPath=" + targetfilename + "\n"
- "SOURCE=$(InputPath)\n"
- "PostBuild_Desc=Finalizing ActiveQt server...\n"
- "PostBuild_Cmds="
- "%1 -dumpidl tmp\\" + targetfilename + ".idl -version " + version +
+ activeQtStepPreCopyDll +=
+ "\t%1 -dumpidl tmp\\" + targetfilename + ".idl -version " + version +
"\t" + idl + " tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl"
- "\t" + idc + " %1 /tlb tmp\\" + targetfilename + ".tlb"
- "\t%1 -regserver\n"
- "# End Special Build Tool";
-
- QString executable = project->variables()["MSVCDSP_TARGETDIRREL"].first() + "\\" + project->variables()["TARGET"].first();
- project->variables()["MSVCDSP_REGSVR_REL"].append( regcmd.arg(executable).arg(executable).arg(executable) );
-
- executable = project->variables()["MSVCDSP_TARGETDIRDEB"].first() + "\\" + project->variables()["TARGET"].first();
- project->variables()["MSVCDSP_REGSVR_DBG"].append( regcmd.arg(executable).arg(executable).arg(executable) );
+ "\t" + idc + " %1 /tlb tmp\\" + targetfilename + ".tlb";
+ activeQtStepPostCopyDll +=
+ "\t%1 -regserver\n";
+ QString executable = project->variables()["MSVCDSP_TARGETDIRREL"].first() + "\\" + targetfilename + ".exe";
+ activeQtStepPreCopyDllRelease = activeQtStepPreCopyDll.arg(executable).arg(executable);
+ activeQtStepPostCopyDllRelease = activeQtStepPostCopyDll.arg(executable);
+
+ executable = project->variables()["MSVCDSP_TARGETDIRDEB"].first() + "\\" + targetfilename + ".exe";
+ activeQtStepPreCopyDllDebug = activeQtStepPreCopyDll.arg(executable).arg(executable);
+ activeQtStepPostCopyDllDebug = activeQtStepPostCopyDll.arg(executable);
}
}
+
+
+ if ( !postLinkStep.isEmpty() || !copyDllStep.isEmpty() || !activeQtStepPreCopyDllDebug.isEmpty() || !activeQtStepPreCopyDllRelease.isEmpty() ) {
+ project->variables()["MSVCDSP_POST_LINK_DBG"].append(
+ "# Begin Special Build Tool\n"
+ "SOURCE=$(InputPath)\n"
+ "PostBuild_Desc=Post Build Step\n"
+ "PostBuild_Cmds=" + postLinkStep + activeQtStepPreCopyDllDebug + copyDllStep + activeQtStepPostCopyDllDebug + "\n"
+ "# End Special Build Tool\n" );
+ project->variables()["MSVCDSP_POST_LINK_REL"].append(
+ "# Begin Special Build Tool\n"
+ "SOURCE=$(InputPath)\n"
+ "PostBuild_Desc=Post Build Step\n"
+ "PostBuild_Cmds=" + postLinkStep + activeQtStepPreCopyDllRelease + copyDllStep + activeQtStepPostCopyDllRelease + "\n"
+ "# End Special Build Tool\n" );
+ }
+
if ( !project->variables()["SOURCES"].isEmpty() || !project->variables()["RC_FILE"].isEmpty() ) {
project->variables()["SOURCES"] += project->variables()["RC_FILE"];
}
QStringList &list = project->variables()["FORMS"];
for( it = list.begin(); it != list.end(); ++it ) {
if ( QFile::exists( *it + ".h" ) )
project->variables()["SOURCES"].append( *it + ".h" );
}
project->variables()["QMAKE_INTERNAL_PRL_LIBS"] << "MSVCDSP_LIBS";
}
QString
-DspMakefileGenerator::findTemplate(QString file)
+DspMakefileGenerator::findTemplate(const QString &file)
{
QString ret;
if(!QFile::exists((ret = file)) &&
!QFile::exists((ret = QString(Option::mkfile::qmakespec + "/" + file))) &&
!QFile::exists((ret = QString(getenv("QTDIR")) + "/mkspecs/win32-msvc/" + file)) &&
!QFile::exists((ret = (QString(getenv("HOME")) + "/.tmake/" + file))))
return "";
return ret;
}
void
DspMakefileGenerator::processPrlVariable(const QString &var, const QStringList &l)
{
if(var == "QMAKE_PRL_DEFINES") {
QStringList &out = project->variables()["MSVCDSP_DEFINES"];
for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
if(out.findIndex((*it)) == -1)
out.append((" /D \"" + *it + "\""));
}
} else {
MakefileGenerator::processPrlVariable(var, l);
}
}
-int
+void
DspMakefileGenerator::beginGroupForFile(QString file, QTextStream &t,
- QString filter)
+ const QString& filter)
{
if(project->isActiveConfig("flat"))
- return 0;
+ return;
fileFixify(file, QDir::currentDirPath(), QDir::currentDirPath(), TRUE);
file = file.section(Option::dir_sep, 0, -2);
if(file.right(Option::dir_sep.length()) != Option::dir_sep)
file += Option::dir_sep;
if(file == currentGroup)
- return 0;
+ return;
if(file.isEmpty() || !QDir::isRelativePath(file)) {
endGroups(t);
- return 0;
+ return;
}
if(file.startsWith(currentGroup))
file = file.mid(currentGroup.length());
- else
- endGroups(t);
- int lvl = file.contains(Option::dir_sep), old_lvl = currentGroup.contains(Option::dir_sep);
- if(lvl > old_lvl) {
- QStringList dirs = QStringList::split(Option::dir_sep, file);
- for(QStringList::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) {
- t << "# Begin Group \"" << (*dir_it) << "\"\n"
- << "# Prop Default_Filter \"" << filter << "\"\n";
- }
- } else {
- for(int x = old_lvl - lvl; x; x--)
+ int dirSep = currentGroup.findRev( Option::dir_sep );
+ while( !file.startsWith( currentGroup ) && dirSep != -1 ) {
+ currentGroup.truncate( dirSep );
+ dirSep = currentGroup.findRev( Option::dir_sep );
+ if ( !file.startsWith( currentGroup ) && dirSep != -1 )
t << "\n# End Group\n";
}
+ if ( !file.startsWith( currentGroup ) ) {
+ t << "\n# End Group\n";
+ currentGroup = "";
+ }
+ QStringList dirs = QStringList::split(Option::dir_sep, file.right( file.length() - currentGroup.length() ) );
+ for(QStringList::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) {
+ t << "# Begin Group \"" << (*dir_it) << "\"\n"
+ << "# Prop Default_Filter \"" << filter << "\"\n";
+ }
currentGroup = file;
- return lvl - old_lvl;
}
-int
+void
DspMakefileGenerator::endGroups(QTextStream &t)
{
if(project->isActiveConfig("flat"))
- return 0;
+ return;
else if(currentGroup.isEmpty())
- return 0;
+ return;
QStringList dirs = QStringList::split(Option::dir_sep, currentGroup);
for(QStringList::Iterator dir_it = dirs.end(); dir_it != dirs.begin(); --dir_it) {
t << "\n# End Group\n";
}
currentGroup = "";
- return dirs.count();
}
bool
DspMakefileGenerator::openOutput(QFile &file) const
{
QString outdir;
if(!file.name().isEmpty()) {
QFileInfo fi(file);
if(fi.isDir())
outdir = file.name() + QDir::separator();
}
if(!outdir.isEmpty() || file.name().isEmpty())
file.setName(outdir + project->first("TARGET") + project->first("DSP_EXTENSION"));
if(QDir::isRelativePath(file.name())) {
QString ofile;
ofile = file.name();
int slashfind = ofile.findRev('\\');
if (slashfind == -1) {
ofile = ofile.replace(QRegExp("-"), "_");
} else {
int hypenfind = ofile.find('-', slashfind);
while (hypenfind != -1 && slashfind < hypenfind) {
ofile = ofile.replace(hypenfind, 1, "_");
hypenfind = ofile.find('-', hypenfind + 1);
diff --git a/qmake/generators/win32/msvc_dsp.h b/qmake/generators/win32/msvc_dsp.h
index a7fc3e7..3a7d18e 100644
--- a/qmake/generators/win32/msvc_dsp.h
+++ b/qmake/generators/win32/msvc_dsp.h
@@ -1,73 +1,73 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef __DSPMAKE_H__
-#define __DSPMAKE_H__
+#ifndef __MSVC_DSP_H__
+#define __MSVC_DSP_H__
#include "winmakefile.h"
#include <qvaluestack.h>
class DspMakefileGenerator : public Win32MakefileGenerator
{
QString currentGroup;
- int beginGroupForFile(QString file, QTextStream &, const QString filter="");
- int endGroups(QTextStream &);
+ void beginGroupForFile(QString file, QTextStream &, const QString& filter="");
+ void endGroups(QTextStream &);
bool init_flag;
bool writeDspParts(QTextStream &);
bool writeMakefile(QTextStream &);
- QString findTemplate(QString file);
+ QString findTemplate(const QString &file);
void init();
public:
DspMakefileGenerator(QMakeProject *p);
~DspMakefileGenerator();
bool openOutput(QFile &file) const;
protected:
virtual void processPrlVariable(const QString &, const QStringList &);
virtual bool findLibraries();
};
inline DspMakefileGenerator::~DspMakefileGenerator()
{ }
inline bool DspMakefileGenerator::findLibraries()
{ return Win32MakefileGenerator::findLibraries("MSVCDSP_LIBS"); }
-#endif /* __DSPMAKE_H__ */
+#endif /* __MSVC_DSP_H__ */
diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp
index 9cc9a69..ecef34d 100644
--- a/qmake/generators/win32/msvc_nmake.cpp
+++ b/qmake/generators/win32/msvc_nmake.cpp
@@ -1,64 +1,65 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "msvc_nmake.h"
#include "option.h"
#include <qregexp.h>
+#include <qdict.h>
#include <qdir.h>
#include <stdlib.h>
#include <time.h>
NmakeMakefileGenerator::NmakeMakefileGenerator(QMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE)
{
}
bool
NmakeMakefileGenerator::writeMakefile(QTextStream &t)
{
writeHeader(t);
if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {
t << "all clean:" << "\n\t"
<< "@echo \"Some of the required modules ("
<< var("QMAKE_FAILED_REQUIREMENTS") << ") are not available.\"" << "\n\t"
<< "@echo \"Skipped.\"" << endl << endl;
writeMakeQmake(t);
return TRUE;
}
if(project->first("TEMPLATE") == "app" ||
@@ -114,159 +115,209 @@ NmakeMakefileGenerator::writeNmakeParts(QTextStream &t)
lib.replace(QRegExp("\""), "");
t << " \"" << lib << "\"";
}
t << endl;
}
else {
t << "LIB = " << var("QMAKE_LIB") << endl;
}
t << "MOC = " << (project->isEmpty("QMAKE_MOC") ? QString("moc") :
Option::fixPathToTargetOS(var("QMAKE_MOC"), FALSE)) << endl;
t << "UIC = " << (project->isEmpty("QMAKE_UIC") ? QString("uic") :
Option::fixPathToTargetOS(var("QMAKE_UIC"), FALSE)) << endl;
t << "QMAKE = " << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") :
Option::fixPathToTargetOS(var("QMAKE_QMAKE"), FALSE)) << endl;
t << "IDC = " << (project->isEmpty("QMAKE_IDC") ? QString("idc") :
Option::fixPathToTargetOS(var("QMAKE_IDC"), FALSE)) << endl;
t << "IDL = " << (project->isEmpty("QMAKE_IDL") ? QString("midl") :
Option::fixPathToTargetOS(var("QMAKE_IDL"), FALSE)) << endl;
t << "ZIP = " << var("QMAKE_ZIP") << endl;
t << "COPY_FILE = " << var("QMAKE_COPY") << endl;
t << "COPY_DIR = " << var("QMAKE_COPY") << endl;
t << "DEL_FILE = " << var("QMAKE_DEL_FILE") << endl;
t << "DEL_DIR = " << var("QMAKE_DEL_DIR") << endl;
t << "MOVE = " << var("QMAKE_MOVE") << endl;
+ t << "CHK_DIR_EXISTS = " << var("QMAKE_CHK_DIR_EXISTS") << endl;
+ t << "MKDIR = " << var("QMAKE_MKDIR") << endl;
t << endl;
t << "####### Files" << endl << endl;
t << "HEADERS = " << varList("HEADERS") << endl;
t << "SOURCES = " << varList("SOURCES") << endl;
t << "OBJECTS = " << varList("OBJECTS") << endl;
t << "FORMS = " << varList("FORMS") << endl;
t << "UICDECLS = " << varList("UICDECLS") << endl;
t << "UICIMPLS = " << varList("UICIMPLS") << endl;
t << "SRCMOC = " << varList("SRCMOC") << endl;
t << "OBJMOC = " << varList("OBJMOC") << endl;
t << "DIST = " << varList("DISTFILES") << endl;
t << "TARGET = ";
if( !project->variables()[ "DESTDIR" ].isEmpty() )
t << varGlue("TARGET",project->first("DESTDIR"),"",project->first("TARGET_EXT"));
else
t << project->variables()[ "TARGET" ].first() << project->variables()[ "TARGET_EXT" ].first();
t << endl;
t << endl;
t << "####### Implicit rules" << endl << endl;
- t << ".SUFFIXES: .cpp .cxx .cc .c" << endl << endl;
- t << ".cpp.obj:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
- t << ".cxx.obj:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
- t << ".cc.obj:\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
- t << ".c.obj:\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl;
+ t << ".SUFFIXES: .c";
+ QStringList::Iterator cppit;
+ for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)
+ t << " " << (*cppit);
+ t << endl << endl;
+ if(!project->isActiveConfig("no_batch")) {
+ // Batchmode doesn't use the non implicit rules QMAKE_RUN_CXX & QMAKE_RUN_CC
+ project->variables().remove("QMAKE_RUN_CXX");
+ project->variables().remove("QMAKE_RUN_CC");
+
+ QDict<void> source_directories;
+ source_directories.insert(".", (void*)1);
+ if(!project->isEmpty("MOC_DIR"))
+ source_directories.insert(project->first("MOC_DIR"), (void*)1);
+ if(!project->isEmpty("UI_SOURCES_DIR"))
+ source_directories.insert(project->first("UI_SOURCES_DIR"), (void*)1);
+ else if(!project->isEmpty("UI_DIR"))
+ source_directories.insert(project->first("UI_DIR"), (void*)1);
+ QString srcs[] = { QString("SOURCES"), QString("UICIMPLS"), QString("SRCMOC"), QString::null };
+ for(int x = 0; !srcs[x].isNull(); x++) {
+ QStringList &l = project->variables()[srcs[x]];
+ for(QStringList::Iterator sit = l.begin(); sit != l.end(); ++sit) {
+ QString sep = "\\";
+ if((*sit).find(sep) == -1)
+ sep = "/";
+ QString dir = (*sit).section(sep, 0, -2);
+ if(!dir.isEmpty() && !source_directories[dir])
+ source_directories.insert(dir, (void*)1);
+ }
+ }
+
+ for(QDictIterator<void> it(source_directories); it.current(); ++it) {
+ if(it.currentKey().isEmpty())
+ continue;
+ for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)
+ t << "{" << it.currentKey() << "}" << (*cppit) << "{" << var("OBJECTS_DIR") << "}" << Option::obj_ext << "::\n\t"
+ << var("QMAKE_RUN_CXX_IMP_BATCH").replace( QRegExp( "\\$@" ), var("OBJECTS_DIR") ) << endl << "\t$<" << endl << "<<" << endl << endl;
+ t << "{" << it.currentKey() << "}" << ".c{" << var("OBJECTS_DIR") << "}" << Option::obj_ext << "::\n\t"
+ << var("QMAKE_RUN_CC_IMP_BATCH").replace( QRegExp( "\\$@" ), var("OBJECTS_DIR") ) << endl << "\t$<" << endl << "<<" << endl << endl;
+ }
+ } else {
+ for(cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit)
+ t << (*cppit) << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CXX_IMP") << endl << endl;
+ t << ".c" << Option::obj_ext << ":\n\t" << var("QMAKE_RUN_CC_IMP") << endl << endl;
+ }
t << "####### Build rules" << endl << endl;
t << "all: " << varGlue("ALL_DEPS",""," "," ") << "$(TARGET)" << endl << endl;
- t << "$(TARGET): $(UICDECLS) $(OBJECTS) $(OBJMOC) " << var("TARGETDEPS");
+ t << "$(TARGET): " << var("PRE_TARGETDEPS") << " $(UICDECLS) $(OBJECTS) $(OBJMOC) "
+ << var("POST_TARGETDEPS");
if(!project->variables()["QMAKE_APP_OR_DLL"].isEmpty()) {
t << "\n\t" << "$(LINK) $(LFLAGS) /OUT:$(TARGET) @<< " << "\n\t "
<< "$(OBJECTS) $(OBJMOC) $(LIBS)";
} else {
t << "\n\t" << "$(LIB) /OUT:$(TARGET) @<<" << "\n\t "
<< "$(OBJECTS) $(OBJMOC)";
}
t << endl << "<<" << endl;
+ if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() )
+ t << "\t" << var( "QMAKE_POST_LINK" ) << endl;
if(project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty()) {
QStringList dlldirs = project->variables()["DLLDESTDIR"];
for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) {
t << "\n\t" << "-copy $(TARGET) " << *dlldir;
}
}
QString targetfilename = project->variables()["TARGET"].first();
if(project->isActiveConfig("activeqt")) {
QString version = project->variables()["VERSION"].first();
if ( version.isEmpty() )
version = "1.0";
if ( project->isActiveConfig("dll")) {
t << "\n\t" << ("-$(IDC) $(TARGET) /idl tmp\\" + targetfilename + ".idl -version " + version);
t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl");
t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb");
t << "\n\t" << ("-$(IDC) $(TARGET) /regserver" );
} else {
t << "\n\t" << ("-$(TARGET) -dumpidl tmp\\" + targetfilename + ".idl -version " + version);
t << "\n\t" << ("-$(IDL) tmp\\" + targetfilename + ".idl /nologo /o tmp\\" + targetfilename + ".midl /tlb tmp\\" + targetfilename + ".tlb /iid tmp\\dump.midl /dlldata tmp\\dump.midl /cstub tmp\\dump.midl /header tmp\\dump.midl /proxy tmp\\dump.midl /sstub tmp\\dump.midl");
t << "\n\t" << ("-$(IDC) $(TARGET) /tlb tmp\\" + targetfilename + ".tlb");
t << "\n\t" << "-$(TARGET) -regserver";
}
}
t << endl << endl;
if(!project->variables()["RC_FILE"].isEmpty()) {
t << var("RES_FILE") << ": " << var("RC_FILE") << "\n\t"
<< var("QMAKE_RC") << " " << var("RC_FILE") << endl << endl;
}
t << "mocables: $(SRCMOC)" << endl << endl;
writeMakeQmake(t);
t << "dist:" << "\n\t"
<< "$(ZIP) " << var("PROJECT") << ".zip "
<< var("PROJECT") << ".pro $(SOURCES) $(HEADERS) $(DIST) $(FORMS)" << endl << endl;
t << "clean:"
<< varGlue("OBJECTS","\n\t-del ","\n\t-del ","")
<< varGlue("SRCMOC" ,"\n\t-del ","\n\t-del ","")
<< varGlue("OBJMOC" ,"\n\t-del ","\n\t-del ","")
<< varGlue("UICDECLS" ,"\n\t-del ","\n\t-del ","")
<< varGlue("UICIMPLS" ,"\n\t-del ","\n\t-del ","")
<< varGlue("QMAKE_CLEAN","\n\t-del ","\n\t-del ","")
<< varGlue("CLEAN_FILES","\n\t-del ","\n\t-del ","");
+
if ( project->isActiveConfig("activeqt")) {
t << ("\n\t-del tmp\\" + targetfilename + ".*");
t << "\n\t-del tmp\\dump.*";
}
if(!project->isEmpty("IMAGES"))
t << varGlue("QMAKE_IMAGE_COLLECTION", "\n\t-del ", "\n\t-del ", "");
// blasted user defined targets
QStringList &qut = project->variables()["QMAKE_EXTRA_WIN_TARGETS"];
for(QStringList::Iterator it = qut.begin(); it != qut.end(); ++it) {
QString targ = var((*it) + ".target"),
cmd = var((*it) + ".commands"), deps;
if(targ.isEmpty())
targ = (*it);
QStringList &deplist = project->variables()[(*it) + ".depends"];
for(QStringList::Iterator dep_it = deplist.begin(); dep_it != deplist.end(); ++dep_it) {
QString dep = var((*dep_it) + ".target");
if(dep.isEmpty())
dep = (*dep_it);
deps += " " + dep;
}
t << "\n\n" << targ << ":" << deps << "\n\t"
<< cmd;
}
t << endl << endl;
+
+ t << "distclean: clean"
+ << "\n\t-del $(TARGET)"
+ << endl << endl;
}
void
NmakeMakefileGenerator::init()
{
if(init_flag)
return;
init_flag = TRUE;
/* this should probably not be here, but I'm using it to wrap the .t files */
if(project->first("TEMPLATE") == "app")
project->variables()["QMAKE_APP_FLAG"].append("1");
else if(project->first("TEMPLATE") == "lib")
project->variables()["QMAKE_LIB_FLAG"].append("1");
else if(project->first("TEMPLATE") == "subdirs") {
MakefileGenerator::init();
if(project->variables()["MAKEFILE"].isEmpty())
project->variables()["MAKEFILE"].append("Makefile");
if(project->variables()["QMAKE"].isEmpty())
project->variables()["QMAKE"].append("qmake");
return;
}
@@ -410,79 +461,102 @@ NmakeMakefileGenerator::init()
project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"] = project->variables()["QMAKE_LFLAGS_CONSOLE"];
project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"] = project->variables()["QMAKE_LFLAGS_WINDOWS"];
if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty()) {
project->variables()["TARGET_EXT"].append(".exe");
} else {
project->variables()["TARGET_EXT"].append(".lib");
}
}
if ( project->isActiveConfig("windows") ) {
if ( project->isActiveConfig("console") ) {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"];
} else {
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_WINDOWS_ANY"];
}
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"];
} else {
project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_CONSOLE_ANY"];
project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_CONSOLE"];
}
+ if ( project->isActiveConfig("stl") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_OFF"];
+ }
+ if ( project->isActiveConfig("exceptions") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_OFF"];
+ }
+ if ( project->isActiveConfig("rtti") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"];
+ }
+
if ( project->isActiveConfig("moc") )
setMocAware(TRUE);
project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"];
project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ',
"HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH");
QStringList &l = project->variables()["QMAKE_FILETAGS"];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QStringList &gdmf = project->variables()[(*it)];
for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner)
(*inner) = Option::fixPathToTargetOS((*inner), FALSE);
}
if ( !project->variables()["DEF_FILE"].isEmpty() )
project->variables()["QMAKE_LFLAGS"].append(QString("/DEF:") + project->first("DEF_FILE"));
if(!project->isActiveConfig("incremental"))
project->variables()["QMAKE_LFLAGS"].append(QString("/incremental:no"));
if ( !project->variables()["VERSION"].isEmpty() ) {
QString version = project->variables()["VERSION"][0];
int firstDot = version.find( "." );
QString major = version.left( firstDot );
QString minor = version.right( version.length() - firstDot - 1 );
minor.replace( ".", "" );
project->variables()["QMAKE_LFLAGS"].append( "/VERSION:" + major + "." + minor );
}
if ( !project->variables()["RC_FILE"].isEmpty()) {
if ( !project->variables()["RES_FILE"].isEmpty()) {
fprintf(stderr, "Both .rc and .res file specified.\n");
fprintf(stderr, "Please specify one of them, not both.");
exit(666);
}
project->variables()["RES_FILE"] = project->variables()["RC_FILE"];
project->variables()["RES_FILE"].first().replace(".rc",".res");
- project->variables()["TARGETDEPS"] += project->variables()["RES_FILE"];
+ project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"];
}
if ( !project->variables()["RES_FILE"].isEmpty())
project->variables()["QMAKE_LIBS"] += project->variables()["RES_FILE"];
MakefileGenerator::init();
if ( !project->variables()["VERSION"].isEmpty()) {
QStringList l = QStringList::split('.', project->first("VERSION"));
project->variables()["VER_MAJ"].append(l[0]);
project->variables()["VER_MIN"].append(l[1]);
}
+
+ QString version = QStringList::split('.', project->first("VERSION")).join("");
if(project->isActiveConfig("dll")) {
- project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + ".lib");
- project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + ".exp");
+ project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + version + ".exp");
}
if(project->isActiveConfig("debug")) {
- project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + ".pdb");
- project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + ".ilk");
+ project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + version + ".pdb");
+ project->variables()["QMAKE_CLEAN"].append(project->first("DESTDIR") + project->first("TARGET") + version + ".ilk");
project->variables()["QMAKE_CLEAN"].append("vc*.pdb");
}
}
diff --git a/qmake/generators/win32/msvc_nmake.h b/qmake/generators/win32/msvc_nmake.h
index d3e170f..579fc35 100644
--- a/qmake/generators/win32/msvc_nmake.h
+++ b/qmake/generators/win32/msvc_nmake.h
@@ -1,59 +1,59 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef __NMAKEMAKE_H__
-#define __NMAKEMAKE_H__
+#ifndef __MSVC_NMAKE_H__
+#define __MSVC_NMAKE_H__
#include "winmakefile.h"
class NmakeMakefileGenerator : public Win32MakefileGenerator
{
bool init_flag;
void writeNmakeParts(QTextStream &);
bool writeMakefile(QTextStream &);
void init();
public:
NmakeMakefileGenerator(QMakeProject *p);
~NmakeMakefileGenerator();
};
inline NmakeMakefileGenerator::~NmakeMakefileGenerator()
{ }
-#endif /* __NMAKEMAKE_H__ */
+#endif /* __MSVC_NMAKE_H__ */
diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp
index c2b9e30..7ffe4f7 100644
--- a/qmake/generators/win32/msvc_objectmodel.cpp
+++ b/qmake/generators/win32/msvc_objectmodel.cpp
@@ -233,69 +233,69 @@ const char* _TurnOffAssemblyGeneration = "\n\t\t\t\tTurnOffAssemblyGeneration=
const char* _TypeLibraryFile = "\n\t\t\t\tTypeLibraryFile=\"";
const char* _TypeLibraryName = "\n\t\t\t\tTypeLibraryName=\"";
const char* _TypeLibraryResourceID = "\n\t\t\t\tTypeLibraryResourceID=\"";
const char* _UndefineAllPreprocessorDefinitions = "\n\t\t\t\tUndefineAllPreprocessorDefinitions=\"";
const char* _UndefinePreprocessorDefinitions = "\n\t\t\t\tUndefinePreprocessorDefinitions=\"";
const char* _UseOfATL = "\n\t\t\tUseOfATL=\"";
const char* _UseOfMfc = "\n\t\t\tUseOfMfc=\"";
const char* _UsePrecompiledHeader = "\n\t\t\t\tUsePrecompiledHeader=\"";
const char* _ValidateParameters = "\n\t\t\t\tValidateParameters=\"";
const char* _VCCLCompilerToolName = "\n\t\t\t\tName=\"VCCLCompilerTool\"";
const char* _VCCustomBuildTool = "\n\t\t\t\t\t\tName=\"VCCustomBuildTool\"";
const char* _VCLinkerToolName = "\n\t\t\t\tName=\"VCLinkerTool\"";
const char* _VCResourceCompilerToolName = "\n\t\t\t\tName=\"VCResourceCompilerTool\"";
const char* _VCMIDLToolName = "\n\t\t\t\tName=\"VCMIDLTool\"";
const char* _Version1 = "\n\tVersion=\"";
const char* _Version4 = "\n\t\t\t\tVersion=\"";
const char* _WarnAsError = "\n\t\t\t\tWarnAsError=\"";
const char* _WarnLevel = "\n\t\t\t\tWarnLevel=\"";
const char* _WarningLevel = "\n\t\t\t\tWarningLevel=\"";
const char* _WholeProgramOptimization = "\n\t\t\t\tWholeProgramOptimization=\"";
// Property name and value as Pairs ---------------------------------
struct TPair {
TPair( const char* n, const triState v ) : name(n), value(v) {};
- const char* name;
- const triState value;
+ const char* name;
+ const triState value;
};
-struct EPair {
+struct EPair {
EPair( const char* n, const int v ) : name(n), value(v) {};
- const char* name;
+ const char* name;
const int value;
};
-struct LPair {
+struct LPair {
LPair( const char* n, const long v ) : name(n), value(v) {};
- const char* name;
- const long value;
+ const char* name;
+ const long value;
};
-struct SPair {
+struct SPair {
SPair( const char* n, const QString& v ) : name(n), value(v) {};
- const char* name;
- const QString& value;
+ const char* name;
+ const QString& value;
};
-struct XPair {
+struct XPair {
XPair( const char* n, const QStringList& v, const char* s = "," ) : name(n), value(v), sep(s) {};
- const char* name;
+ const char* name;
const QStringList& value;
const char* sep;
};
// void streamSPair( QTextStream &strm, const char *n, const QString &s )
// Streaming operators for property Pairs ---------------------------
QTextStream &operator<<( QTextStream &strm, const TPair &prop )
{
switch( prop.value ) {
case _False:
strm << prop.name << "FALSE\"";
break;
case _True:
strm << prop.name << "TRUE\"";
break;
case unset:
default:
break;
}
return strm;
}
@@ -362,49 +362,49 @@ VCCLCompilerTool::VCCLCompilerTool()
OptimizeForProcessor( procOptimizeBlended ),
OptimizeForWindowsApplication( unset ),
RuntimeLibrary( rtMultiThreaded ),
RuntimeTypeInfo( unset ),
ShowIncludes( unset ),
SmallerTypeCheck( unset ),
StringPooling( unset ),
StructMemberAlignment( alignNotSet ),
SuppressStartupBanner( unset ),
TreatWChar_tAsBuiltInType( unset ),
TurnOffAssemblyGeneration( unset ),
UndefineAllPreprocessorDefinitions( unset ),
UsePrecompiledHeader( pchGenerateAuto ),
WarnAsError( unset ),
WarningLevel( warningLevel_0 ),
WholeProgramOptimization( unset )
{
}
QTextStream &operator<<( QTextStream &strm, const VCCLCompilerTool &tool )
{
strm << _begTool3;
strm << _VCCLCompilerToolName;
strm << XPair( _AdditionalIncludeDirectories, tool.AdditionalIncludeDirectories );
- strm << XPair( _AdditionalOptions, tool.AdditionalOptions );
+ strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
strm << XPair( _AdditionalUsingDirectories, tool.AdditionalUsingDirectories );
strm << SPair( _AssemblerListingLocation, tool.AssemblerListingLocation );
if ( tool.AssemblerOutput != asmListingNone ) strm << EPair( _AssemblerOutput, tool.AssemblerOutput );
if ( tool.BasicRuntimeChecks != runtimeBasicCheckNone ) strm << EPair( _BasicRuntimeChecks, tool.BasicRuntimeChecks );
if ( tool.BrowseInformation != brInfoNone ) strm << EPair( _BrowseInformation, tool.BrowseInformation );
strm << SPair( _BrowseInformationFile, tool.BrowseInformationFile );
strm << TPair( _BufferSecurityCheck, tool.BufferSecurityCheck );
if ( tool.CallingConvention != callConventionDefault ) strm << EPair( _CallingConvention, tool.CallingConvention );
if ( tool.CompileAs != compileAsDefault ) strm << EPair( _CompileAs, tool.CompileAs );
if ( tool.CompileAsManaged != managedDefault ) strm << EPair( _CompileAsManaged, tool.CompileAsManaged );
strm << TPair( _CompileOnly, tool.CompileOnly );
strm << EPair( _DebugInformationFormat, tool.DebugInformationFormat );
strm << TPair( _DefaultCharIsUnsigned, tool.DefaultCharIsUnsigned );
strm << TPair( _Detect64BitPortabilityProblems, tool.Detect64BitPortabilityProblems );
strm << TPair( _DisableLanguageExtensions, tool.DisableLanguageExtensions );
strm << XPair( _DisableSpecificWarnings, tool.DisableSpecificWarnings );
strm << TPair( _EnableFiberSafeOptimizations, tool.EnableFiberSafeOptimizations );
strm << TPair( _EnableFunctionLevelLinking, tool.EnableFunctionLevelLinking );
strm << TPair( _EnableIntrinsicFunctions, tool.EnableIntrinsicFunctions );
strm << TPair( _ExceptionHandling, tool.ExceptionHandling );
strm << TPair( _ExpandAttributedSource, tool.ExpandAttributedSource );
if ( tool.FavorSizeOrSpeed != favorNone ) strm << EPair( _FavorSizeOrSpeed, tool.FavorSizeOrSpeed );
strm << TPair( _ForceConformanceInForLoopScope, tool.ForceConformanceInForLoopScope );
strm << XPair( _ForcedIncludeFiles, tool.ForcedIncludeFiles );
@@ -421,94 +421,98 @@ QTextStream &operator<<( QTextStream &strm, const VCCLCompilerTool &tool )
strm << EPair( _Optimization, tool.Optimization );
if ( tool.OptimizeForProcessor != procOptimizeBlended ) strm << EPair( _OptimizeForProcessor, tool.OptimizeForProcessor );
strm << TPair( _OptimizeForWindowsApplication, tool.OptimizeForWindowsApplication );
strm << SPair( _OutputFile, tool.OutputFile );
strm << SPair( _PrecompiledHeaderFile, tool.PrecompiledHeaderFile );
strm << SPair( _PrecompiledHeaderThrough, tool.PrecompiledHeaderThrough );
strm << XPair( _PreprocessorDefinitions, tool.PreprocessorDefinitions );
strm << SPair( _ProgramDataBaseFileName, tool.ProgramDataBaseFileName );
strm << EPair( _RuntimeLibrary, tool.RuntimeLibrary );
strm << TPair( _RuntimeTypeInfo, tool.RuntimeTypeInfo );
strm << TPair( _ShowIncludes, tool.ShowIncludes );
strm << TPair( _SmallerTypeCheck, tool.SmallerTypeCheck );
strm << TPair( _StringPooling, tool.StringPooling );
if ( tool.StructMemberAlignment != alignNotSet ) strm << EPair( _StructMemberAlignment, tool.StructMemberAlignment );
strm << TPair( _SuppressStartupBanner, tool.SuppressStartupBanner );
strm << TPair( _TreatWChar_tAsBuiltInType, tool.TreatWChar_tAsBuiltInType );
strm << TPair( _TurnOffAssemblyGeneration, tool.TurnOffAssemblyGeneration );
strm << TPair( _UndefineAllPreprocessorDefinitions, tool.UndefineAllPreprocessorDefinitions );
strm << XPair( _UndefinePreprocessorDefinitions, tool.UndefinePreprocessorDefinitions );
if ( !tool.PrecompiledHeaderFile.isEmpty() ||
!tool.PrecompiledHeaderThrough.isEmpty() )
strm << EPair( _UsePrecompiledHeader, tool.UsePrecompiledHeader );
strm << TPair( _WarnAsError, tool.WarnAsError );
strm << EPair( _WarningLevel, tool.WarningLevel );
- strm << TPair( _WholeProgramOptimization, tool.WholeProgramOptimization );
+ strm << TPair( _WholeProgramOptimization, tool.WholeProgramOptimization );
strm << "/>";
return strm;
}
bool VCCLCompilerTool::parseOption( const char* option )
{
// skip index 0 ('/' or '-')
- char first = option[1];
+ char first = option[1];
char second = option[2];
char third = option[3];
char fourth = option[4];
+ bool found = TRUE;
switch ( first ) {
case '?':
case 'h':
qWarning( "Generator: Option '/?', '/help': MSVC.NET projects do not support outputting help info" );
- return FALSE;
+ found = FALSE;
+ break;
case '@':
qWarning( "Generator: Option '/@': MSVC.NET projects do not support the use of a response file" );
- return FALSE;
+ found = FALSE;
+ break;
case 'l':
qWarning( "Generator: Option '/link': qmake generator does not support passing link options through the compiler tool" );
- return FALSE;
-
+ found = FALSE;
+ break;
case 'A':
- if ( second != 'I' )
- return FALSE;
+ if ( second != 'I' ) {
+ found = FALSE; break;
+ }
AdditionalUsingDirectories += option+2;
break;
case 'C':
KeepComments = _True;
break;
case 'D':
PreprocessorDefinitions += option+1;
break;
case 'E':
if ( second == 'H' ) {
if ( third == 'a' || third == 'c' || third == 's' ) {
// ExceptionHandling must be false, or it will override
// with an /EHsc option
ExceptionHandling = _False;
AdditionalOptions += option;
break;
}
- return FALSE;
+ found = FALSE; break;
}
GeneratePreprocessedFile = preprocessYes;
break;
case 'F':
if ( second <= '9' && second >= '0' ) {
AdditionalOptions += option;
break;
} else {
switch ( second ) {
case 'A':
if ( third == 'c' ) {
AssemblerOutput = asmListingAsmMachine;
if ( fourth == 's' )
AssemblerOutput = asmListingAsmMachineSrc;
} else if ( third == 's' ) {
AssemblerOutput = asmListingAsmSrc;
} else {
AssemblerOutput = asmListingAssemblyOnly;
}
break;
case 'a':
AssemblerListingLocation = option+3;
break;
case 'I':
@@ -523,58 +527,58 @@ bool VCCLCompilerTool::parseOption( const char* option )
BrowseInformationFile = option+3;
break;
case 'U':
ForcedUsingFiles += option+3;
break;
case 'd':
ProgramDataBaseFileName = option+3;
break;
case 'e':
OutputFile = option+3;
break;
case 'm':
AdditionalOptions += option;
break;
case 'o':
ObjectFile = option+3;
break;
case 'p':
PrecompiledHeaderFile = option+3;
break;
case 'x':
ExpandAttributedSource = _True;
break;
default:
- return FALSE;
+ found = FALSE; break;
}
}
break;
case 'G':
switch ( second ) {
case '3':
case '4':
qWarning( "Option '/G3' and '/G4' were phased out in Visual C++ 5.0" );
- return FALSE;
+ found = FALSE; break;
case '5':
OptimizeForProcessor = procOptimizePentium;
break;
case '6':
case 'B':
OptimizeForProcessor = procOptimizePentiumProAndAbove;
break;
case 'A':
OptimizeForWindowsApplication = _True;
break;
case 'F':
StringPooling = _True;
break;
case 'H':
AdditionalOptions += option;
break;
case 'L':
WholeProgramOptimization = _True;
if ( third == '-' )
WholeProgramOptimization = _False;
break;
case 'R':
RuntimeTypeInfo = _True;
if ( third == '-' )
@@ -598,410 +602,413 @@ bool VCCLCompilerTool::parseOption( const char* option )
case 'f':
StringPooling = _True;
AdditionalOptions += option;
break;
case 'm':
MinimalRebuild = _True;
if ( third == '-' )
MinimalRebuild = _False;
break;
case 'r':
CallingConvention = callConventionFastCall;
break;
case 's':
// Warning: following [num] is not used,
// were should we put it?
BufferSecurityCheck = _True;
break;
case 'y':
EnableFunctionLevelLinking = _True;
break;
case 'z':
CallingConvention = callConventionStdCall;
break;
default:
- return FALSE;
+ found = FALSE; break;
}
break;
case 'H':
AdditionalOptions += option;
break;
case 'I':
AdditionalIncludeDirectories += option+2;
break;
case 'L':
if ( second == 'D' ) {
AdditionalOptions += option;
break;
}
- return FALSE;
+ found = FALSE; break;
case 'M':
if ( second == 'D' ) {
RuntimeLibrary = rtMultiThreadedDLL;
if ( third == 'd' )
RuntimeLibrary = rtMultiThreadedDebugDLL;
break;
} else if ( second == 'L' ) {
RuntimeLibrary = rtSingleThreaded;
if ( third == 'd' )
RuntimeLibrary = rtSingleThreadedDebug;
break;
} else if ( second == 'T' ) {
RuntimeLibrary = rtMultiThreaded;
if ( third == 'd' )
RuntimeLibrary = rtMultiThreadedDebug;
break;
}
- return FALSE;
+ found = FALSE; break;
case 'O':
switch ( second ) {
case '1':
Optimization = optimizeMinSpace;
break;
case '2':
Optimization = optimizeMaxSpeed;
break;
case 'a':
AdditionalOptions += option;
break;
case 'b':
if ( third == '0' )
InlineFunctionExpansion = expandDisable;
else if ( third == '1' )
InlineFunctionExpansion = expandOnlyInline;
else if ( third == '2' )
InlineFunctionExpansion = expandAnySuitable;
else
- return FALSE;
+ found = FALSE;
break;
case 'd':
Optimization = optimizeDisabled;
break;
case 'g':
GlobalOptimizations = _True;
break;
case 'i':
EnableIntrinsicFunctions = _True;
break;
case 'p':
ImproveFloatingPointConsistency = _True;
if ( third == '-' )
ImproveFloatingPointConsistency = _False;
break;
case 's':
FavorSizeOrSpeed = favorSize;
break;
case 't':
FavorSizeOrSpeed = favorSpeed;
break;
case 'w':
AdditionalOptions += option;
break;
case 'x':
Optimization = optimizeFull;
break;
case 'y':
OmitFramePointers = _True;
if ( third == '-' )
OmitFramePointers = _False;
break;
default:
- return FALSE;
+ found = FALSE; break;
}
break;
case 'P':
GeneratePreprocessedFile = preprocessYes;
break;
case 'Q':
if ( second == 'I' ) {
AdditionalOptions += option;
break;
}
- return FALSE;
+ found = FALSE; break;
case 'R':
if ( second == 'T' && third == 'C' ) {
if ( fourth == '1' )
BasicRuntimeChecks = runtimeBasicCheckAll;
else if ( fourth == 'c' )
SmallerTypeCheck = _True;
else if ( fourth == 's' )
BasicRuntimeChecks = runtimeCheckStackFrame;
else if ( fourth == 'u' )
BasicRuntimeChecks = runtimeCheckUninitVariables;
else
- return FALSE;
+ found = FALSE; break;
}
break;
case 'T':
if ( second == 'C' ) {
CompileAs = compileAsC;
} else if ( second == 'P' ) {
CompileAs = compileAsCPlusPlus;
} else {
qWarning( "Generator: Options '/Tp<filename>' and '/Tc<filename>' are not supported by qmake" );
- return FALSE;
+ found = FALSE; break;
}
break;
case 'U':
UndefinePreprocessorDefinitions += option+2;
break;
case 'V':
AdditionalOptions += option;
break;
case 'W':
switch ( second ) {
case 'a':
case '4':
WarningLevel = warningLevel_4;
break;
case '3':
WarningLevel = warningLevel_3;
break;
case '2':
WarningLevel = warningLevel_2;
break;
case '1':
WarningLevel = warningLevel_1;
break;
case '0':
WarningLevel = warningLevel_0;
break;
case 'L':
AdditionalOptions += option;
break;
case 'X':
WarnAsError = _True;
break;
case 'p':
if ( third == '6' && fourth == '4' ) {
Detect64BitPortabilityProblems = _True;
break;
}
// Fallthrough
default:
- return FALSE;
+ found = FALSE; break;
}
break;
case 'X':
IgnoreStandardIncludePath = _True;
break;
case 'Y':
switch ( second ) {
case '\0':
case '-':
AdditionalOptions += option;
break;
case 'X':
UsePrecompiledHeader = pchGenerateAuto;
PrecompiledHeaderFile = option+3;
break;
case 'c':
UsePrecompiledHeader = pchCreateUsingSpecific;
PrecompiledHeaderFile = option+3;
break;
case 'd':
case 'l':
AdditionalOptions =+ option;
break;
case 'u':
UsePrecompiledHeader = pchUseUsingSpecific;
PrecompiledHeaderFile = option+3;
break;
default:
- return FALSE;
+ found = FALSE; break;
}
break;
case 'Z':
switch ( second ) {
case '7':
DebugInformationFormat = debugOldStyleInfo;
break;
case 'I':
DebugInformationFormat = debugEditAndContinue;
break;
case 'd':
DebugInformationFormat = debugLineInfoOnly;
break;
case 'i':
DebugInformationFormat = debugEnabled;
break;
case 'l':
DebugInformationFormat = debugEditAndContinue;
break;
case 'a':
DisableLanguageExtensions = _True;
break;
case 'e':
DisableLanguageExtensions = _False;
break;
case 'c':
if ( third == ':' ) {
if ( fourth == 'f' )
ForceConformanceInForLoopScope = _True;
else if ( fourth == 'w' )
TreatWChar_tAsBuiltInType = _True;
else
- return FALSE;
+ found = FALSE;
} else {
- return FALSE;
+ found = FALSE; break;
}
break;
case 'g':
case 'm':
case 's':
AdditionalOptions += option;
break;
case 'p':
switch ( third )
{
case '\0':
case '1':
StructMemberAlignment = alignSingleByte;
if ( fourth == '6' )
StructMemberAlignment = alignSixteenBytes;
break;
case '2':
StructMemberAlignment = alignTwoBytes;
break;
case '4':
StructMemberAlignment = alignFourBytes;
break;
case '8':
StructMemberAlignment = alignEightBytes;
break;
default:
- return FALSE;
+ found = FALSE; break;
}
break;
default:
- return FALSE;
+ found = FALSE; break;
}
break;
case 'c':
if ( second == '\0' ) {
CompileOnly = _True;
} else if ( second == 'l' ) {
if ( *(option+5) == 'n' ) {
CompileAsManaged = managedAssembly;
TurnOffAssemblyGeneration = _True;
} else {
CompileAsManaged = managedAssembly;
}
} else {
- return FALSE;
+ found = FALSE; break;
}
break;
case 'd':
- if ( second != 'r' )
- return FALSE;
+ if ( second != 'r' ) {
+ found = FALSE; break;
+ }
CompileAsManaged = managedAssembly;
break;
case 'n':
if ( second == 'o' && third == 'B' && fourth == 'o' ) {
AdditionalOptions += "/noBool";
break;
}
if ( second == 'o' && third == 'l' && fourth == 'o' ) {
SuppressStartupBanner = _True;
break;
}
- return FALSE;
+ found = FALSE; break;
case 's':
if ( second == 'h' && third == 'o' && fourth == 'w' ) {
ShowIncludes = _True;
break;
}
- return FALSE;
+ found = FALSE; break;
case 'u':
UndefineAllPreprocessorDefinitions = _True;
break;
case 'v':
if ( second == 'd' || second == 'm' ) {
AdditionalOptions += option;
break;
}
- return FALSE;
+ found = FALSE; break;
case 'w':
switch ( second ) {
case '\0':
WarningLevel = warningLevel_0;
break;
case 'd':
DisableSpecificWarnings += option+3;
break;
default:
AdditionalOptions += option;
}
break;
default:
- return FALSE;
+ found = FALSE; break;
}
+ if( !found )
+ warn_msg( WarnLogic, "Could not parse Compiler option: %s", option );
return TRUE;
}
// VCLinkerTool -----------------------------------------------------
VCLinkerTool::VCLinkerTool()
: EnableCOMDATFolding( optFoldingDefault ),
GenerateDebugInformation( unset ),
GenerateMapFile( unset ),
HeapCommitSize( -1 ),
HeapReserveSize( -1 ),
IgnoreAllDefaultLibraries( unset ),
IgnoreEmbeddedIDL( unset ),
IgnoreImportLibrary( unset ),
LargeAddressAware( addrAwareDefault ),
LinkDLL( unset ),
LinkIncremental( linkIncrementalYes ),
LinkTimeCodeGeneration( unset ),
MapExports( unset ),
MapLines( unset ),
OptimizeForWindows98( optWin98Default ),
OptimizeReferences( optReferencesDefault ),
RegisterOutput( unset ),
ResourceOnlyDLL( unset ),
SetChecksum( unset ),
ShowProgress( linkProgressNotSet ),
StackCommitSize( -1 ),
StackReserveSize( -1 ),
SubSystem( subSystemNotSet ),
SupportUnloadOfDelayLoadedDLL( unset ),
SuppressStartupBanner( unset ),
SwapRunFromCD( unset ),
SwapRunFromNet( unset ),
TargetMachine( machineNotSet ),
TerminalServerAware( termSvrAwareDefault ),
TurnOffAssemblyGeneration( unset ),
TypeLibraryResourceID( 0 )
{
}
QTextStream &operator<<( QTextStream &strm, const VCLinkerTool &tool )
{
strm << _begTool3;
strm << _VCLinkerToolName;
strm << XPair( _AdditionalDependencies4, tool.AdditionalDependencies, " " );
strm << XPair( _AdditionalLibraryDirectories, tool.AdditionalLibraryDirectories );
- strm << XPair( _AdditionalOptions, tool.AdditionalOptions );
+ strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
strm << XPair( _AddModuleNamesToAssembly, tool.AddModuleNamesToAssembly );
strm << SPair( _BaseAddress, tool.BaseAddress );
strm << XPair( _DelayLoadDLLs, tool.DelayLoadDLLs );
if ( tool.EnableCOMDATFolding != optFoldingDefault ) strm << EPair( _EnableCOMDATFolding, tool.EnableCOMDATFolding );
strm << SPair( _EntryPointSymbol, tool.EntryPointSymbol );
strm << XPair( _ForceSymbolReferences, tool.ForceSymbolReferences );
strm << SPair( _FunctionOrder, tool.FunctionOrder );
strm << TPair( _GenerateDebugInformation, tool.GenerateDebugInformation );
strm << TPair( _GenerateMapFile, tool.GenerateMapFile );
if ( tool.HeapCommitSize != -1 ) strm << LPair( _HeapCommitSize, tool.HeapCommitSize );
if ( tool.HeapReserveSize != -1 ) strm << LPair( _HeapReserveSize, tool.HeapReserveSize );
strm << TPair( _IgnoreAllDefaultLibraries, tool.IgnoreAllDefaultLibraries );
strm << XPair( _IgnoreDefaultLibraryNames, tool.IgnoreDefaultLibraryNames );
strm << TPair( _IgnoreEmbeddedIDL, tool.IgnoreEmbeddedIDL );
strm << TPair( _IgnoreImportLibrary, tool.IgnoreImportLibrary );
strm << SPair( _ImportLibrary, tool.ImportLibrary );
if ( tool.LargeAddressAware != addrAwareDefault ) strm << EPair( _LargeAddressAware, tool.LargeAddressAware );
strm << TPair( _LinkDLL, tool.LinkDLL );
if ( tool.LinkIncremental != linkIncrementalDefault ) strm << EPair( _LinkIncremental, tool.LinkIncremental );
strm << TPair( _LinkTimeCodeGeneration, tool.LinkTimeCodeGeneration );
strm << SPair( _LinkToManagedResourceFile, tool.LinkToManagedResourceFile );
strm << TPair( _MapExports, tool.MapExports );
strm << SPair( _MapFileName, tool.MapFileName );
strm << TPair( _MapLines, tool.MapLines );
@@ -1025,144 +1032,148 @@ QTextStream &operator<<( QTextStream &strm, const VCLinkerTool &tool )
strm << TPair( _SuppressStartupBanner, tool.SuppressStartupBanner );
strm << TPair( _SwapRunFromCD, tool.SwapRunFromCD );
strm << TPair( _SwapRunFromNet, tool.SwapRunFromNet );
if ( tool.TargetMachine != machineNotSet ) strm << EPair( _TargetMachine, tool.TargetMachine );
if ( tool.TerminalServerAware != termSvrAwareDefault ) strm << EPair( _TerminalServerAware, tool.TerminalServerAware );
strm << TPair( _TurnOffAssemblyGeneration, tool.TurnOffAssemblyGeneration );
strm << SPair( _TypeLibraryFile, tool.TypeLibraryFile );
if ( tool.TypeLibraryResourceID != rcUseDefault ) strm << LPair( _TypeLibraryResourceID, tool.TypeLibraryResourceID );
strm << SPair( _Version4, tool.Version );
strm << "/>";
return strm;
}
// Hashing routine to do fast option lookups ----
// Slightly rewritten to stop on ':' ',' and '\0'
// Original routine in qtranslator.cpp ----------
static uint elfHash( const char* name )
{
const uchar *k;
uint h = 0;
uint g;
if ( name ) {
k = (const uchar *) name;
- while ( (*k) &&
- (*k)!= ':' &&
+ while ( (*k) &&
+ (*k)!= ':' &&
(*k)!=',' &&
(*k)!=' ' ) {
h = ( h << 4 ) + *k++;
if ( (g = (h & 0xf0000000)) != 0 )
h ^= g >> 24;
h &= ~g;
}
}
if ( !h )
h = 1;
return h;
}
+
+//#define USE_DISPLAY_HASH
+#ifdef USE_DISPLAY_HASH
static void displayHash( const char* str )
{
printf( "case 0x%07x: // %s\n break;\n", elfHash(str), str );
}
+#endif
bool VCLinkerTool::parseOption( const char* option )
{
-#if 0
+#ifdef USE_DISPLAY_HASH
// Main options
- displayHash( "/ALIGN" ); displayHash( "/ALLOWBIND" ); displayHash( "/ASSEMBLYMODULE" );
- displayHash( "/ASSEMBLYRESOURCE" ); displayHash( "/BASE" ); displayHash( "/DEBUG" );
- displayHash( "/DEF" ); displayHash( "/DEFAULTLIB" ); displayHash( "/DELAY" );
- displayHash( "/DELAYLOAD" ); displayHash( "/DLL" ); displayHash( "/DRIVER" );
- displayHash( "/ENTRY" ); displayHash( "/EXETYPE" ); displayHash( "/EXPORT" );
- displayHash( "/FIXED" ); displayHash( "/FORCE" ); displayHash( "/HEAP" );
- displayHash( "/IDLOUT" ); displayHash( "/IGNOREIDL" ); displayHash( "/IMPLIB" );
- displayHash( "/INCLUDE" ); displayHash( "/INCREMENTAL" ); displayHash( "/LARGEADDRESSAWARE" );
- displayHash( "/LIBPATH" ); displayHash( "/LTCG" ); displayHash( "/MACHINE" );
- displayHash( "/MAP" ); displayHash( "/MAPINFO" ); displayHash( "/MERGE" );
- displayHash( "/MIDL" ); displayHash( "/NOASSEMBLY" ); displayHash( "/NODEFAULTLIB" );
- displayHash( "/NOENTRY" ); displayHash( "/NOLOGO" ); displayHash( "/OPT" );
- displayHash( "/ORDER" ); displayHash( "/OUT" ); displayHash( "/PDB" );
- displayHash( "/PDBSTRIPPED" ); displayHash( "/RELEASE" ); displayHash( "/SECTION" );
- displayHash( "/STACK" ); displayHash( "/STUB" ); displayHash( "/SUBSYSTEM" );
- displayHash( "/SWAPRUN" ); displayHash( "/TLBID" ); displayHash( "/TLBOUT" );
- displayHash( "/TSAWARE" ); displayHash( "/VERBOSE" ); displayHash( "/VERSION" );
+ displayHash( "/ALIGN" ); displayHash( "/ALLOWBIND" ); displayHash( "/ASSEMBLYMODULE" );
+ displayHash( "/ASSEMBLYRESOURCE" ); displayHash( "/BASE" ); displayHash( "/DEBUG" );
+ displayHash( "/DEF" ); displayHash( "/DEFAULTLIB" ); displayHash( "/DELAY" );
+ displayHash( "/DELAYLOAD" ); displayHash( "/DLL" ); displayHash( "/DRIVER" );
+ displayHash( "/ENTRY" ); displayHash( "/EXETYPE" ); displayHash( "/EXPORT" );
+ displayHash( "/FIXED" ); displayHash( "/FORCE" ); displayHash( "/HEAP" );
+ displayHash( "/IDLOUT" ); displayHash( "/IGNOREIDL" ); displayHash( "/IMPLIB" );
+ displayHash( "/INCLUDE" ); displayHash( "/INCREMENTAL" ); displayHash( "/LARGEADDRESSAWARE" );
+ displayHash( "/LIBPATH" ); displayHash( "/LTCG" ); displayHash( "/MACHINE" );
+ displayHash( "/MAP" ); displayHash( "/MAPINFO" ); displayHash( "/MERGE" );
+ displayHash( "/MIDL" ); displayHash( "/NOASSEMBLY" ); displayHash( "/NODEFAULTLIB" );
+ displayHash( "/NOENTRY" ); displayHash( "/NOLOGO" ); displayHash( "/OPT" );
+ displayHash( "/ORDER" ); displayHash( "/OUT" ); displayHash( "/PDB" );
+ displayHash( "/PDBSTRIPPED" ); displayHash( "/RELEASE" ); displayHash( "/SECTION" );
+ displayHash( "/STACK" ); displayHash( "/STUB" ); displayHash( "/SUBSYSTEM" );
+ displayHash( "/SWAPRUN" ); displayHash( "/TLBID" ); displayHash( "/TLBOUT" );
+ displayHash( "/TSAWARE" ); displayHash( "/VERBOSE" ); displayHash( "/VERSION" );
displayHash( "/VXD" ); displayHash( "/WS " );
#endif
-#if 0
+#ifdef USE_DISPLAY_HASH
// Sub options
displayHash( "UNLOAD" ); displayHash( "NOBIND" ); displayHash( "no" ); displayHash( "NOSTATUS" ); displayHash( "STATUS" );
- displayHash( "AM33" ); displayHash( "ARM" ); displayHash( "CEE" ); displayHash( "IA64" ); displayHash( "X86" ); displayHash( "M32R" );
- displayHash( "MIPS" ); displayHash( "MIPS16" ); displayHash( "MIPSFPU" ); displayHash( "MIPSFPU16" ); displayHash( "MIPSR41XX" ); displayHash( "PPC" );
- displayHash( "SH3" ); displayHash( "SH4" ); displayHash( "SH5" ); displayHash( "THUMB" ); displayHash( "TRICORE" ); displayHash( "EXPORTS" );
- displayHash( "LINES" ); displayHash( "REF" ); displayHash( "NOREF" ); displayHash( "ICF" ); displayHash( "WIN98" ); displayHash( "NOWIN98" );
- displayHash( "CONSOLE" ); displayHash( "EFI_APPLICATION" ); displayHash( "EFI_BOOT_SERVICE_DRIVER" ); displayHash( "EFI_ROM" ); displayHash( "EFI_RUNTIME_DRIVER" ); displayHash( "NATIVE" );
- displayHash( "POSIX" ); displayHash( "WINDOWS" ); displayHash( "WINDOWSCE" ); displayHash( "NET" ); displayHash( "CD" ); displayHash( "NO" );
+ displayHash( "AM33" ); displayHash( "ARM" ); displayHash( "CEE" ); displayHash( "IA64" ); displayHash( "X86" ); displayHash( "M32R" );
+ displayHash( "MIPS" ); displayHash( "MIPS16" ); displayHash( "MIPSFPU" ); displayHash( "MIPSFPU16" ); displayHash( "MIPSR41XX" ); displayHash( "PPC" );
+ displayHash( "SH3" ); displayHash( "SH4" ); displayHash( "SH5" ); displayHash( "THUMB" ); displayHash( "TRICORE" ); displayHash( "EXPORTS" );
+ displayHash( "LINES" ); displayHash( "REF" ); displayHash( "NOREF" ); displayHash( "ICF" ); displayHash( "WIN98" ); displayHash( "NOWIN98" );
+ displayHash( "CONSOLE" ); displayHash( "EFI_APPLICATION" ); displayHash( "EFI_BOOT_SERVICE_DRIVER" ); displayHash( "EFI_ROM" ); displayHash( "EFI_RUNTIME_DRIVER" ); displayHash( "NATIVE" );
+ displayHash( "POSIX" ); displayHash( "WINDOWS" ); displayHash( "WINDOWSCE" ); displayHash( "NET" ); displayHash( "CD" ); displayHash( "NO" );
#endif
-
+ bool found = TRUE;
switch ( elfHash(option) ) {
case 0x3360dbe: // /ALIGN[:number]
case 0x1485c34: // /ALLOWBIND[:NO]
case 0x6b21972: // /DEFAULTLIB:library
case 0x396ea92: // /DRIVER[:UPONLY | :WDM]
case 0xaca9d75: // /EXETYPE[:DYNAMIC | :DEV386]
case 0x3ad5444: // /EXPORT:entryname[,@ordinal[,NONAME]][,DATA]
case 0x33aec94: // /FIXED[:NO]
case 0x33b4675: // /FORCE:[MULTIPLE|UNRESOLVED]
case 0x7988f7e: // /SECTION:name,[E][R][W][S][D][K][L][P][X][,ALIGN=#]
case 0x0348992: // /STUB:filename
case 0x0034bc4: // /VXD
case 0x0034c50: // /WS
AdditionalOptions += option;
break;
case 0x679c075: // /ASSEMBLYMODULE:filename
AddModuleNamesToAssembly += option+15;
break;
case 0x062d065: // /ASSEMBLYRESOURCE:filename
LinkToManagedResourceFile = option+18;
break;
case 0x0336675: // /BASE:{address | @filename,key}
// Do we need to do a manual lookup when '@filename,key'?
// Seems BaseAddress only can contain the location...
// We don't use it in Qt, so keep it simple for now
BaseAddress = option+6;
break;
case 0x3389797: // /DEBUG
GenerateDebugInformation = _True;
break;
case 0x0033896: // /DEF:filename
ModuleDefinitionFile = option+5;
break;
case 0x338a069: // /DELAY:{UNLOAD | NOBIND}
// MS documentation does not specify what to do with
// this option, so we'll put it in AdditionalOptions
AdditionalOptions += option;
break;
case 0x06f4bf4: // /DELAYLOAD:dllname
DelayLoadDLLs += option+11;
break;
// case 0x003390c: // /DLL
- // This option is not used for vcproj files
+ // This option is not used for vcproj files
// break;
case 0x33a3979: // /ENTRY:function
EntryPointSymbol = option+7;
break;
case 0x033c960: // /HEAP:reserve[,commit]
{
QStringList both = QStringList::split( ",", option+6 );
HeapReserveSize = both[0].toLong();
if ( both.count() == 2 )
HeapCommitSize = both[1].toLong();
}
break;
case 0x3d91494: // /IDLOUT:[path\]filename
MergedIDLBaseFileName = option+8;
break;
case 0x345a04c: // /IGNOREIDL
IgnoreEmbeddedIDL = _True;
break;
case 0x3e250e2: // /IMPLIB:filename
ImportLibrary = option+8;
break;
case 0xe281ab5: // /INCLUDE:symbol
ForceSymbolReferences += option+9;
break;
@@ -1171,73 +1182,73 @@ bool VCLinkerTool::parseOption( const char* option )
*(option+13) == 'n' )
LinkIncremental = linkIncrementalNo;
else
LinkIncremental = linkIncrementalYes;
break;
case 0x26e4675: // /LARGEADDRESSAWARE[:no]
if ( *(option+18) == ':' &&
*(option+19) == 'n' )
LargeAddressAware = addrAwareNoLarge;
else
LargeAddressAware = addrAwareLarge;
break;
case 0x0d745c8: // /LIBPATH:dir
AdditionalLibraryDirectories += option+9;
break;
case 0x0341877: // /LTCG[:NOSTATUS|:STATUS]
config->WholeProgramOptimization = _True;
LinkTimeCodeGeneration = _True;
if ( *(option+5) == ':' &&
*(option+6) == 'S' )
ShowProgress = linkProgressAll;
break;
case 0x157cf65: // /MACHINE:{AM33|ARM|CEE|IA64|X86|M32R|MIPS|MIPS16|MIPSFPU|MIPSFPU16|MIPSR41XX|PPC|SH3|SH4|SH5|THUMB|TRICORE}
switch ( elfHash(option+9) ) {
- // Very limited documentation on all options but X86,
+ // Very limited documentation on all options but X86,
// so we put the others in AdditionalOptions...
case 0x0046063: // AM33
case 0x000466d: // ARM
case 0x0004795: // CEE
case 0x004d494: // IA64
case 0x0050672: // M32R
case 0x0051e53: // MIPS
case 0x51e5646: // MIPS16
case 0x1e57b05: // MIPSFPU
case 0x57b09a6: // MIPSFPU16
case 0x5852738: // MIPSR41XX
case 0x0005543: // PPC
case 0x00057b3: // SH3
case 0x00057b4: // SH4
case 0x00057b5: // SH5
case 0x058da12: // THUMB
case 0x96d8435: // TRICORE
AdditionalOptions += option;
break;
case 0x0005bb6: // X86
TargetMachine = machineX86;
break;
default:
- return FALSE;
+ found = FALSE;
}
break;
case 0x0034160: // /MAP[:filename]
GenerateMapFile = _True;
MapFileName = option+5;
break;
case 0x164e1ef: // /MAPINFO:{EXPORTS|LINES}
if ( *(option+9) == 'E' )
MapExports = _True;
else if ( *(option+9) == 'L' )
MapLines = _True;
break;
case 0x341a6b5: // /MERGE:from=to
MergeSections = option+7;
break;
case 0x0341d8c: // /MIDL:@file
MidlCommandFile = option+7;
break;
case 0x84e2679: // /NOASSEMBLY
TurnOffAssemblyGeneration = _True;
break;
case 0x2b21942: // /NODEFAULTLIB[:library]
if ( *(option+13) == '\0' )
IgnoreAllDefaultLibraries = _True;
@@ -1254,316 +1265,319 @@ bool VCLinkerTool::parseOption( const char* option )
{
char third = *(option+7);
switch ( third ) {
case 'F': // REF
if ( *(option+5) == 'R' ) {
OptimizeReferences = optReferences;
} else { // ICF[=iterations]
EnableCOMDATFolding = optFolding;
// [=iterations] case is not documented
}
break;
case 'R': // NOREF
OptimizeReferences = optNoReferences;
break;
case 'I': // NOICF
EnableCOMDATFolding = optNoFolding;
break;
case 'N': // WIN98
OptimizeForWindows98 = optWin98Yes;
break;
case 'W': // NOWIN98
OptimizeForWindows98 = optWin98No;
break;
default:
- return FALSE;
+ found = FALSE;
}
}
break;
case 0x34468a2: // /ORDER:@filename
FunctionOrder = option+8;
break;
case 0x00344a4: // /OUT:filename
OutputFile = option+5;
break;
case 0x0034482: // /PDB:filename
ProgramDatabaseFile = option+5;
break;
case 0xa2ad314: // /PDBSTRIPPED:pdb_file_name
StripPrivateSymbols = option+13;
break;
case 0x6a09535: // /RELEASE
SetChecksum = _True;
break;
case 0x348857b: // /STACK:reserve[,commit]
{
QStringList both = QStringList::split( ",", option+7 );
StackReserveSize = both[0].toLong();
if ( both.count() == 2 )
StackCommitSize = both[1].toLong();
}
break;
case 0x78dc00d: // /SUBSYSTEM:{CONSOLE|EFI_APPLICATION|EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|POSIX|WINDOWS|WINDOWSCE}[,major[.minor]]
{
// Split up in subsystem, and version number
QStringList both = QStringList::split( ",", option+11 );
switch ( elfHash(both[0].latin1()) ) {
case 0x8438445: // CONSOLE
SubSystem = subSystemConsole;
break;
case 0xbe29493: // WINDOWS
SubSystem = subSystemWindows;
break;
// The following are undocumented, so add them to AdditionalOptions
case 0x240949e: // EFI_APPLICATION
case 0xe617652: // EFI_BOOT_SERVICE_DRIVER
case 0x9af477d: // EFI_ROM
case 0xd34df42: // EFI_RUNTIME_DRIVER
case 0x5268ea5: // NATIVE
case 0x05547e8: // POSIX
case 0x2949c95: // WINDOWSCE
AdditionalOptions += option;
break;
default:
- return FALSE;
+ found = FALSE;
}
}
break;
case 0x8b654de: // /SWAPRUN:{NET | CD}
if ( *(option+9) == 'N' )
SwapRunFromNet = _True;
else if ( *(option+9) == 'C' )
SwapRunFromCD = _True;
else
- return FALSE;
+ found = FALSE;
break;
case 0x34906d4: // /TLBID:id
TypeLibraryResourceID = QString( option+7 ).toLong();
break;
case 0x4907494: // /TLBOUT:[path\]filename
TypeLibraryFile = option+8;
break;
case 0x976b525: // /TSAWARE[:NO]
if ( *(option+8) == ':' )
TerminalServerAware = termSvrAwareNo;
else
TerminalServerAware = termSvrAwareYes;
break;
case 0xaa67735: // /VERBOSE[:lib]
if ( *(option+9) == ':' ) {
ShowProgress = linkProgressLibs;
AdditionalOptions += option;
} else {
ShowProgress = linkProgressAll;
}
break;
case 0xaa77f7e: // /VERSION:major[.minor]
Version = option+9;
break;
default:
- return FALSE;
+ found = FALSE;
}
- return TRUE;
+ if( !found )
+ warn_msg( WarnLogic, "Could not parse Linker options: %s", option );
+ return found;
}
// VCMIDLTool -------------------------------------------------------
VCMIDLTool::VCMIDLTool()
: DefaultCharType( midlCharUnsigned ),
EnableErrorChecks( midlDisableAll ),
ErrorCheckAllocations( unset ),
ErrorCheckBounds( unset ),
ErrorCheckEnumRange( unset ),
ErrorCheckRefPointers( unset ),
ErrorCheckStubData( unset ),
GenerateStublessProxies( unset ),
GenerateTypeLibrary( unset ),
IgnoreStandardIncludePath( unset ),
MkTypLibCompatible( unset ),
StructMemberAlignment( midlAlignNotSet ),
SuppressStartupBanner( unset ),
TargetEnvironment( midlTargetNotSet ),
ValidateParameters( unset ),
WarnAsError( unset ),
WarningLevel( midlWarningLevel_0 )
{
}
QTextStream &operator<<( QTextStream &strm, const VCMIDLTool &tool )
{
strm << _begTool3;
strm << _VCMIDLToolName;
strm << XPair( _AdditionalIncludeDirectories, tool.AdditionalIncludeDirectories );
- strm << XPair( _AdditionalOptions, tool.AdditionalOptions );
+ strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
strm << XPair( _CPreprocessOptions, tool.CPreprocessOptions );
strm << EPair( _DefaultCharType, tool.DefaultCharType );
strm << SPair( _DLLDataFileName, tool.DLLDataFileName );
strm << EPair( _EnableErrorChecks, tool.EnableErrorChecks );
strm << TPair( _ErrorCheckAllocations, tool.ErrorCheckAllocations );
strm << TPair( _ErrorCheckBounds, tool.ErrorCheckBounds );
strm << TPair( _ErrorCheckEnumRange, tool.ErrorCheckEnumRange );
strm << TPair( _ErrorCheckRefPointers, tool.ErrorCheckRefPointers );
strm << TPair( _ErrorCheckStubData, tool.ErrorCheckStubData );
strm << XPair( _FullIncludePath, tool.FullIncludePath );
strm << TPair( _GenerateStublessProxies, tool.GenerateStublessProxies );
strm << TPair( _GenerateTypeLibrary, tool.GenerateTypeLibrary );
strm << SPair( _HeaderFileName, tool.HeaderFileName );
strm << TPair( _IgnoreStandardIncludePath, tool.IgnoreStandardIncludePath );
strm << SPair( _InterfaceIdentifierFileName, tool.InterfaceIdentifierFileName );
strm << TPair( _MkTypLibCompatible, tool.MkTypLibCompatible );
strm << SPair( _OutputDirectory4, tool.OutputDirectory );
strm << XPair( _PreprocessorDefinitions, tool.PreprocessorDefinitions );
strm << SPair( _ProxyFileName, tool.ProxyFileName );
strm << SPair( _RedirectOutputAndErrors, tool.RedirectOutputAndErrors );
if ( tool.StructMemberAlignment != midlAlignNotSet) strm << EPair( _StructMemberAlignment, tool.StructMemberAlignment );
strm << TPair( _SuppressStartupBanner, tool.SuppressStartupBanner );
if ( tool.TargetEnvironment != midlTargetNotSet ) strm << EPair( _TargetEnvironment, tool.TargetEnvironment );
strm << SPair( _TypeLibraryName, tool.TypeLibraryName );
strm << XPair( _UndefinePreprocessorDefinitions, tool.UndefinePreprocessorDefinitions );
strm << TPair( _ValidateParameters, tool.ValidateParameters );
strm << TPair( _WarnAsError, tool.WarnAsError );
strm << EPair( _WarningLevel, tool.WarningLevel );
strm << "/>";
return strm;
}
bool VCMIDLTool::parseOption( const char* option )
{
-#if 0
+#ifdef USE_DISPLAY_HASH
displayHash( "/D name[=def]" ); displayHash( "/I directory-list" ); displayHash( "/Oi" );
displayHash( "/Oic" ); displayHash( "/Oicf" ); displayHash( "/Oif" ); displayHash( "/Os" );
displayHash( "/U name" ); displayHash( "/WX" ); displayHash( "/W{0|1|2|3|4}" );
displayHash( "/Zp {N}" ); displayHash( "/Zs" ); displayHash( "/acf filename" );
displayHash( "/align {N}" ); displayHash( "/app_config" ); displayHash( "/c_ext" );
displayHash( "/char ascii7" ); displayHash( "/char signed" ); displayHash( "/char unsigned" );
displayHash( "/client none" ); displayHash( "/client stub" ); displayHash( "/confirm" );
- displayHash( "/cpp_cmd cmd_line" ); displayHash( "/cpp_opt options" );
+ displayHash( "/cpp_cmd cmd_line" ); displayHash( "/cpp_opt options" );
displayHash( "/cstub filename" ); displayHash( "/dlldata filename" ); displayHash( "/env win32" );
displayHash( "/env win64" ); displayHash( "/error all" ); displayHash( "/error allocation" );
displayHash( "/error bounds_check" ); displayHash( "/error enum" ); displayHash( "/error none" );
displayHash( "/error ref" ); displayHash( "/error stub_data" ); displayHash( "/h filename" );
displayHash( "/header filename" ); displayHash( "/iid filename" ); displayHash( "/lcid" );
displayHash( "/mktyplib203" ); displayHash( "/ms_ext" ); displayHash( "/ms_union" );
displayHash( "/msc_ver <nnnn>" ); displayHash( "/newtlb" ); displayHash( "/no_cpp" );
displayHash( "/no_def_idir" ); displayHash( "/no_default_epv" ); displayHash( "/no_format_opt" );
displayHash( "/no_warn" ); displayHash( "/nocpp" ); displayHash( "/nologo" ); displayHash( "/notlb" );
- displayHash( "/o filename" ); displayHash( "/oldnames" ); displayHash( "/oldtlb" );
+ displayHash( "/o filename" ); displayHash( "/oldnames" ); displayHash( "/oldtlb" );
displayHash( "/osf" ); displayHash( "/out directory" ); displayHash( "/pack {N}" );
displayHash( "/prefix all" ); displayHash( "/prefix client" ); displayHash( "/prefix server" );
displayHash( "/prefix switch" ); displayHash( "/protocol all" ); displayHash( "/protocol dce" );
displayHash( "/protocol ndr64" ); displayHash( "/proxy filename" ); displayHash( "/robust" );
displayHash( "/rpcss" ); displayHash( "/savePP" ); displayHash( "/server none" );
displayHash( "/server stub" ); displayHash( "/sstub filename" ); displayHash( "/syntax_check" );
displayHash( "/target {system}" ); displayHash( "/tlb filename" ); displayHash( "/use_epv" );
displayHash( "/win32" ); displayHash( "/win64" );
#endif
+ bool found = TRUE;
int offset = 0;
switch( elfHash(option) ) {
case 0x0000334: // /D name[=def]
PreprocessorDefinitions += option+3;
break;
case 0x0000339: // /I directory-list
AdditionalIncludeDirectories += option+3;
break;
case 0x0345f96: // /Oicf
case 0x00345f6: // /Oif
GenerateStublessProxies = _True;
break;
case 0x0000345: // /U name
UndefinePreprocessorDefinitions += option+3;
break;
case 0x00034c8: // /WX
WarnAsError = _True;
break;
case 0x3582fde: // /align {N}
offset = 3; // Fallthrough
case 0x0003510: // /Zp {N}
switch ( *(option+offset+4) ) {
case '1':
StructMemberAlignment = ( *(option+offset+5) == '\0' ) ? midlAlignSingleByte : midlAlignSixteenBytes;
break;
case '2':
StructMemberAlignment = midlAlignTwoBytes;
break;
case '4':
StructMemberAlignment = midlAlignFourBytes;
break;
case '8':
StructMemberAlignment = midlAlignEightBytes;
break;
default:
- return FALSE;
+ found = FALSE;
}
break;
case 0x0359e82: // /char {ascii7|signed|unsigned}
switch( *(option+6) ) {
case 'a':
DefaultCharType = midlCharAscii7;
break;
case 's':
DefaultCharType = midlCharSigned;
break;
case 'u':
DefaultCharType = midlCharUnsigned;
break;
default:
- return FALSE;
+ found = FALSE;
}
break;
case 0xa766524: // /cpp_opt options
CPreprocessOptions += option+9;
break;
case 0xb32abf1: // /dlldata filename
DLLDataFileName = option + 9;
break;
case 0x0035c56: // /env {win32|win64}
TargetEnvironment = ( *(option+8) == '6' ) ? midlTargetWin64 : midlTargetWin32;
break;
case 0x35c9962: // /error {all|allocation|bounds_check|enum|none|ref|stub_data}
EnableErrorChecks = midlEnableCustom;
switch ( *(option+7) ) {
case 'a':
if ( *(option+10) == '\0' )
EnableErrorChecks = midlEnableAll;
else
ErrorCheckAllocations = _True;
break;
case 'b':
ErrorCheckBounds = _True;
break;
case 'e':
ErrorCheckEnumRange = _True;
break;
case 'n':
EnableErrorChecks = midlDisableAll;
break;
case 'r':
- break;
ErrorCheckRefPointers = _True;
- case 's':
break;
+ case 's':
ErrorCheckStubData = _True;
+ break;
default:
- return FALSE;
+ found = FALSE;
}
break;
case 0x5eb7af2: // /header filename
offset = 5;
case 0x0000358: // /h filename
HeaderFileName = option + offset + 3;
break;
case 0x0035ff4: // /iid filename
InterfaceIdentifierFileName = option+5;
break;
case 0x64b7933: // /mktyplib203
MkTypLibCompatible = _True;
break;
case 0x8e0b0a2: // /no_def_idir
IgnoreStandardIncludePath = _True;
break;
case 0x65635ef: // /nologo
SuppressStartupBanner = _True;
break;
case 0x3656b22: // /notlb
GenerateTypeLibrary = _True;
break;
case 0x000035f: // /o filename
RedirectOutputAndErrors = option+3;
@@ -1626,116 +1640,118 @@ bool VCMIDLTool::parseOption( const char* option )
case 0xce9b12b: // /syntax_check
case 0xc9b5f16: // /use_epv
AdditionalOptions += option;
break;
default:
// /W{0|1|2|3|4} case
if ( *(option+1) == 'W' ) {
switch ( *(option+2) ) {
case '0':
WarningLevel = midlWarningLevel_0;
break;
case '1':
WarningLevel = midlWarningLevel_1;
break;
case '2':
WarningLevel = midlWarningLevel_2;
break;
case '3':
WarningLevel = midlWarningLevel_3;
break;
case '4':
WarningLevel = midlWarningLevel_4;
break;
default:
- return FALSE;
+ found = FALSE;
}
}
break;
}
+ if( !found )
+ warn_msg( WarnLogic, "Could not parse MIDL option: %s", option );
return TRUE;
}
// VCLibrarianTool --------------------------------------------------
VCLibrarianTool::VCLibrarianTool()
: IgnoreAllDefaultLibraries( unset ),
SuppressStartupBanner( _True )
{
}
QTextStream &operator<<( QTextStream &strm, const VCLibrarianTool &tool )
{
strm << _begTool3;
strm << SPair( _ToolName, QString( "VCLibrarianTool" ) );
strm << XPair( _AdditionalDependencies4, tool.AdditionalDependencies );
strm << XPair( _AdditionalLibraryDirectories, tool.AdditionalLibraryDirectories );
- strm << XPair( _AdditionalOptions, tool.AdditionalOptions );
+ strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
strm << XPair( _ExportNamedFunctions, tool.ExportNamedFunctions );
strm << XPair( _ForceSymbolReferences, tool.ForceSymbolReferences );
strm << TPair( _IgnoreAllDefaultLibraries, tool.IgnoreAllDefaultLibraries );
strm << XPair( _IgnoreDefaultLibraryNames, tool.IgnoreDefaultLibraryNames );
strm << SPair( _ModuleDefinitionFile, tool.ModuleDefinitionFile );
strm << SPair( _OutputFile, tool.OutputFile );
strm << TPair( _SuppressStartupBanner, tool.SuppressStartupBanner );
strm << "/>";
return strm;
}
// VCCustomBuildTool ------------------------------------------------
VCCustomBuildTool::VCCustomBuildTool()
{
ToolName = "VCCustomBuildTool";
}
QTextStream &operator<<( QTextStream &strm, const VCCustomBuildTool &tool )
{
strm << _begTool3;
strm << SPair( _ToolName, tool.ToolName );
strm << XPair( _AdditionalDependencies4, tool.AdditionalDependencies, ";" );
strm << SPair( _CommandLine4, tool.CommandLine );
strm << SPair( _Description4, tool.Description );
strm << SPair( _Outputs4, tool.Outputs );
strm << SPair( _ToolPath, tool.ToolPath );
strm << "/>";
return strm;
}
// VCResourceCompilerTool -------------------------------------------
VCResourceCompilerTool::VCResourceCompilerTool()
: Culture( rcUseDefault ),
IgnoreStandardIncludePath( unset ),
ShowProgress( linkProgressNotSet )
{
PreprocessorDefinitions = "NDEBUG";
}
QTextStream &operator<<( QTextStream &strm, const VCResourceCompilerTool &tool )
{
strm << _begTool3;
strm << _VCResourceCompilerToolName;
strm << SPair( _ToolPath, tool.ToolPath );
strm << XPair( _AdditionalIncludeDirectories, tool.AdditionalIncludeDirectories );
- strm << XPair( _AdditionalOptions, tool.AdditionalOptions );
+ strm << XPair( _AdditionalOptions, tool.AdditionalOptions, " " );
if ( tool.Culture != rcUseDefault ) strm << EPair( _Culture, tool.Culture );
strm << XPair( _FullIncludePath, tool.FullIncludePath );
strm << TPair( _IgnoreStandardIncludePath, tool.IgnoreStandardIncludePath );
strm << XPair( _PreprocessorDefinitions, tool.PreprocessorDefinitions );
strm << SPair( _ResourceOutputFileName, tool.ResourceOutputFileName );
if ( tool.ShowProgress != linkProgressNotSet ) strm << EPair( _ShowProgress, tool.ShowProgress );
strm << "/>";
return strm;
}
// VCEventTool -------------------------------------------------
QTextStream &operator<<( QTextStream &strm, const VCEventTool &tool )
{
strm << _begTool3;
strm << SPair( _ToolName, tool.ToolName );
strm << SPair( _ToolPath, tool.ToolPath );
strm << SPair( _CommandLine4, tool.CommandLine );
strm << SPair( _Description4, tool.Description );
strm << TPair( _ExcludedFromBuild, tool.ExcludedFromBuild );
strm << "/>";
return strm;
}
// VCPostBuildEventTool ---------------------------------------------
@@ -1830,106 +1846,127 @@ void VCFilter::generateMOC( QTextStream &strm, QString str ) const
strm << _Name5;
strm << Config->Name;
strm << "\">";
strm << _begTool5;
strm << _VCCustomBuildTool;
strm << _Description6;
strm << "Moc'ing " << str << "...\"";
strm << _CommandLine6;
strm << mocApp;
strm << " " << str << " -o " << mocOutput << "\"";
strm << _AdditionalDependencies6;
strm << mocApp << "\"";
strm << _Outputs6;
strm << mocOutput << "\"";
strm << "/>";
strm << _endFileConfiguration;
}
void VCFilter::generateUIC( QTextStream &strm, const QString& str ) const
{
QString uicApp = Project->var("QMAKE_UIC");
QString mocApp = Project->var( "QMAKE_MOC" );
QString fname = str.section( '\\', -1 );
QString mocDir = Project->var( "MOC_DIR" );
+ QString uiDir = Project->var( "UI_DIR" );
+ QString uiHeaders;
+ QString uiSources;
+
+ // Determining the paths for the output files.
+ int slash = str.findRev( '\\' );
+ QString pname = ( slash != -1 ) ? str.left( slash+1 ) : QString( ".\\" );
+ if( !uiDir.isEmpty() ) {
+ uiHeaders = uiDir;
+ uiSources = uiDir;
+ } else {
+ uiHeaders = Project->var( "UI_HEADERS_DIR" );
+ uiSources = Project->var( "UI_SOURCES_DIR" );
+ if( uiHeaders.isEmpty() )
+ uiHeaders = pname;
+ if( uiSources.isEmpty() )
+ uiSources = pname;
+ }
+ if( !uiHeaders.endsWith( "\\" ) )
+ uiHeaders += "\\";
+ if( !uiSources.endsWith( "\\" ) )
+ uiSources += "\\";
+
+ // Determine the file name.
int dot = fname.findRev( '.' );
- if( dot != -1 )
+ if( dot != -1 )
fname.truncate( dot );
- int slash = str.findRev( '\\' );
- QString pname = ( slash != -1 ) ? str.left( slash+1 ) : QString(".\\");
-
strm << _begFileConfiguration;
strm << _Name5;
strm << Config->Name;
strm << "\">";
strm << _begTool5;
strm << _VCCustomBuildTool;
strm << _Description6;
strm << "Uic'ing " << str << "...\"";
strm << _CommandLine6;
- strm << uicApp << " " << str << " -o " << pname << fname << ".h &amp;&amp; "; // Create .h from .ui file
- strm << uicApp << " " << str << " -i " << fname << ".h -o " << pname << fname << ".cpp &amp;&amp; "; // Create .cpp from .ui file
- strm << mocApp << " " << pname << fname << ".h -o " << mocDir << "moc_" << fname << ".cpp\"";
+ strm << uicApp << " " << str << " -o " << uiHeaders << fname << ".h &amp;&amp; "; // Create .h from .ui file
+ strm << uicApp << " " << str << " -i " << fname << ".h -o " << uiSources << fname << ".cpp &amp;&amp; "; // Create .cpp from .ui file
+ strm << mocApp << " " << uiHeaders << fname << ".h -o " << mocDir << "moc_" << fname << ".cpp\"";
strm << _AdditionalDependencies6;
strm << mocApp << ";" << uicApp << "\"";
strm << _Outputs6;
- strm << pname << fname << ".h;" << pname << fname << ".cpp;" << mocDir << "moc_" << fname << ".cpp\"";
+ strm << uiHeaders << fname << ".h;" << uiSources << fname << ".cpp;" << mocDir << "moc_" << fname << ".cpp\"";
strm << "/>";
strm << _endFileConfiguration;
}
QTextStream &operator<<( QTextStream &strm, const VCFilter &tool )
{
if ( tool.Files.count() == 0 )
return strm;
strm << _begFilter;
strm << SPair( _Name3, tool.Name );
strm << TPair( _ParseFiles, tool.ParseFiles );
strm << SPair( _Filter, tool.Filter );
strm << ">";
for ( QStringList::ConstIterator it = tool.Files.begin(); it != tool.Files.end(); ++it ) {
strm << _begFile;
strm << SPair( _RelativePath, *it );
strm << ">";
if ( tool.CustomBuild == moc )
tool.generateMOC( strm, *it );
else if ( tool.CustomBuild == uic )
tool.generateUIC( strm, *it );
strm << _endFile;
}
strm << _endFilter;
return strm;
}
// VCProject --------------------------------------------------------
VCProject::VCProject()
{
- QUuid uniqueId;
#if defined(Q_WS_WIN32)
GUID guid;
+ QUuid uniqueId;
HRESULT h = CoCreateGuid( &guid );
if ( h == S_OK )
uniqueId = QUuid( guid );
ProjectGUID = uniqueId.toString();
#else
// Qt doesn't support GUID on other platforms yet
ProjectGUID = "";
#endif
}
QTextStream &operator<<( QTextStream &strm, const VCProject &tool )
{
strm << _xmlInit;
strm << _begVisualStudioProject;
strm << _ProjectType;
strm << SPair( _Version1, tool.Version );
strm << SPair( _Name1, tool.Name );
strm << SPair( _ProjectGUID, tool.ProjectGUID );
strm << SPair( _SccProjectName, tool.SccProjectName );
strm << SPair( _SccLocalPath, tool.SccLocalPath );
strm << ">";
strm << _begPlatforms;
strm << _begPlatform;
strm << SPair( _Name3, tool.PlatformName );
diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h
index 2d09280..1dca68d 100644
--- a/qmake/generators/win32/msvc_objectmodel.h
+++ b/qmake/generators/win32/msvc_objectmodel.h
@@ -19,133 +19,133 @@
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef __MSVC_OBJECTMODEL_H__
#define __MSVC_OBJECTMODEL_H__
#include "project.h"
#include <qstring.h>
#include <qstringlist.h>
/*
- This Object model is of course VERY simplyfied,
+ This Object model is of course VERY simplyfied,
and does not actually follow the original MSVC
object model. However, it fulfilles the basic
needs for qmake
*/
/*
- If a triState value is 'unset' then the
+ If a triState value is 'unset' then the
corresponding property is not in the output,
- forcing the tool to utilize default values.
+ forcing the tool to utilize default values.
False/True values will be in the output...
*/
enum customBuildCheck {
none,
moc,
uic,
lexyacc
};
enum triState {
unset = -1,
_False = 0,
_True = 1
};
enum addressAwarenessType {
addrAwareDefault,
addrAwareNoLarge,
addrAwareLarge
};
enum asmListingOption {
asmListingNone,
asmListingAssemblyOnly,
asmListingAsmMachineSrc,
asmListingAsmMachine,
asmListingAsmSrc
};
enum basicRuntimeCheckOption {
runtimeBasicCheckNone,
runtimeCheckStackFrame,
runtimeCheckUninitVariables,
runtimeBasicCheckAll
};
enum browseInfoOption {
brInfoNone,
- brAllInfo,
+ brAllInfo,
brNoLocalSymbols
};
enum callingConventionOption {
callConventionDefault = -1,
callConventionCDecl,
callConventionFastCall,
callConventionStdCall
};
enum charSet {
charSetNotSet,
charSetUnicode,
charSetMBCS
};
enum compileAsManagedOptions {
managedDefault = -1,
managedAssembly = 2
};
enum CompileAsOptions{
compileAsDefault,
compileAsC,
compileAsCPlusPlus
};
enum ConfigurationTypes {
typeUnknown = 0,
typeApplication = 1,
typeDynamicLibrary = 2,
typeStaticLibrary = 4,
typeGeneric = 10
};
enum debugOption {
debugDisabled,
debugOldStyleInfo,
debugLineInfoOnly,
debugEnabled,
- debugEditAndContinue
+ debugEditAndContinue
};
enum eAppProtectionOption {
eAppProtectUnchanged,
eAppProtectLow,
eAppProtectMedium,
- eAppProtectHigh
+ eAppProtectHigh
};
enum enumResourceLangID {
rcUseDefault = 0,
rcAfrikaans = 1078,
rcAlbanian = 1052,
rcArabicAlgeria = 5121,
rcArabicBahrain = 15361,
rcArabicEgypt = 3073,
rcArabicIraq = 2049,
rcArabicJordan = 11265,
rcArabicKuwait = 13313,
rcArabicLebanon = 12289,
rcArabicLibya = 4097,
rcArabicMorocco = 6145,
rcArabicOman = 8193,
rcArabicQatar = 16385,
rcArabicSaudi = 1025,
rcArabicSyria = 10241,
rcArabicTunisia = 7169,
rcArabicUnitedArabEmirates = 14337,
rcArabicYemen = 9217,
rcBasque = 1069,
rcBulgarian = 1026,
rcByelorussian = 1059,
@@ -210,229 +210,227 @@ enum enumResourceLangID {
rcSpanishDominicanRepublic = 7178,
rcSpanishEcuador = 12298,
rcSpanishGuatemala = 4106,
rcSpanishMexico = 2058,
rcSpanishModern = 3082,
rcSpanishPanama = 6154,
rcSpanishParaguay = 15370,
rcSpanishPeru = 10250,
rcSpanishTraditional = 1034,
rcSpanishUruguay = 14346,
rcSpanishVenezuela = 8202,
rcSwedish = 1053,
rcThai = 1054,
rcTurkish = 1055,
rcUkrainian = 1058,
rcUrdu = 1056
};
enum enumSccEvent {
eProjectInScc,
ePreDirtyNotification
};
enum favorSizeOrSpeedOption {
favorNone,
favorSpeed,
- favorSize
+ favorSize
};
enum genProxyLanguage {
genProxyNative,
genProxyManaged
};
enum inlineExpansionOption {
expandDisable,
expandOnlyInline,
expandAnySuitable
};
enum linkIncrementalType {
linkIncrementalDefault,
linkIncrementalNo,
- linkIncrementalYes
+ linkIncrementalYes
};
enum linkProgressOption {
linkProgressNotSet,
linkProgressAll,
- linkProgressLibs
+ linkProgressLibs
};
enum machineTypeOption {
machineNotSet,
machineX86
};
enum midlCharOption {
midlCharUnsigned,
midlCharSigned,
midlCharAscii7
};
enum midlErrorCheckOption {
midlEnableCustom,
midlDisableAll,
- midlEnableAll
+ midlEnableAll
};
enum midlStructMemberAlignOption {
midlAlignNotSet,
midlAlignSingleByte,
midlAlignTwoBytes,
midlAlignFourBytes,
midlAlignEightBytes,
midlAlignSixteenBytes
};
enum midlTargetEnvironment {
midlTargetNotSet,
midlTargetWin32,
midlTargetWin64
};
enum midlWarningLevelOption {
midlWarningLevel_0,
midlWarningLevel_1,
midlWarningLevel_2,
midlWarningLevel_3,
- midlWarningLevel_4
+ midlWarningLevel_4
};
enum optFoldingType {
optFoldingDefault,
optNoFolding,
optFolding
};
enum optimizeOption {
optimizeDisabled,
optimizeMinSpace,
optimizeMaxSpeed,
optimizeFull,
- optimizeCustom
+ optimizeCustom
};
enum optRefType {
optReferencesDefault,
optNoReferences,
optReferences
};
enum optWin98Type {
optWin98Default,
optWin98No,
optWin98Yes
};
enum pchOption {
pchNone,
pchCreateUsingSpecific,
pchGenerateAuto,
- pchUseUsingSpecific
+ pchUseUsingSpecific
};
enum preprocessOption {
preprocessNo,
preprocessYes,
- preprocessNoLineNumbers
+ preprocessNoLineNumbers
};
enum ProcessorOptimizeOption {
procOptimizeBlended,
procOptimizePentium,
- procOptimizePentiumProAndAbove
+ procOptimizePentiumProAndAbove
};
enum RemoteDebuggerType {
DbgLocal,
DbgRemote,
- DbgRemoteTCPIP
+ DbgRemoteTCPIP
};
enum runtimeLibraryOption {
rtMultiThreaded,
rtMultiThreadedDebug,
rtMultiThreadedDLL,
rtMultiThreadedDebugDLL,
rtSingleThreaded,
- rtSingleThreadedDebug
+ rtSingleThreadedDebug
};
enum structMemberAlignOption {
alignNotSet,
alignSingleByte,
alignTwoBytes,
alignFourBytes,
alignEightBytes,
- alignSixteenBytes
+ alignSixteenBytes
};
enum subSystemOption {
subSystemNotSet,
subSystemConsole,
subSystemWindows
};
enum termSvrAwarenessType {
termSvrAwareDefault,
termSvrAwareNo,
termSvrAwareYes
};
enum toolSetType {
toolSetUtility,
toolSetMakefile,
toolSetLinker,
toolSetLibrarian,
toolSetAll
};
enum TypeOfDebugger {
DbgNativeOnly,
DbgManagedOnly,
DbgMixed,
- DbgAuto
+ DbgAuto
};
enum useOfATL {
useATLNotSet,
useATLStatic,
- useATLDynamic
+ useATLDynamic
};
enum useOfMfc {
useMfcStdWin,
useMfcStatic,
- useMfcDynamic
+ useMfcDynamic
};
enum warningLevelOption {
warningLevel_0,
warningLevel_1,
warningLevel_2,
warningLevel_3,
warningLevel_4
};
class VCToolBase {
protected:
// Functions
VCToolBase(){};
- ~VCToolBase(){};
+ virtual ~VCToolBase(){}
virtual bool parseOption( const char* option ) = 0;
public:
- bool parseOptions( QStringList& options ) {
- bool result = TRUE;
- for ( QStringList::ConstIterator it=options.begin(); (it!=options.end()) && result; it++ )
- result = parseOption( (*it).latin1() );
- return result;
+ void parseOptions( QStringList& options ) {
+ for ( QStringList::ConstIterator it=options.begin(); (it!=options.end()); it++ )
+ parseOption( (*it).latin1() );
}
};
class VCConfiguration;
class VCProject;
class VCCLCompilerTool : public VCToolBase
{
public:
// Functions
VCCLCompilerTool();
- ~VCCLCompilerTool(){};
- virtual bool parseOption( const char* option );
-
+ virtual ~VCCLCompilerTool(){}
+ bool parseOption( const char* option );
+
// Variables
QStringList AdditionalIncludeDirectories;
QStringList AdditionalOptions;
QStringList AdditionalUsingDirectories;
QString AssemblerListingLocation;
asmListingOption AssemblerOutput;
basicRuntimeCheckOption BasicRuntimeChecks;
browseInfoOption BrowseInformation;
QString BrowseInformationFile;
triState BufferSecurityCheck;
callingConventionOption CallingConvention;
CompileAsOptions CompileAs;
compileAsManagedOptions CompileAsManaged;
triState CompileOnly;
debugOption DebugInformationFormat;
triState DefaultCharIsUnsigned;
triState Detect64BitPortabilityProblems;
triState DisableLanguageExtensions;
QStringList DisableSpecificWarnings;
triState EnableFiberSafeOptimizations;
triState EnableFunctionLevelLinking;
triState EnableIntrinsicFunctions;
triState ExceptionHandling;
triState ExpandAttributedSource;
@@ -459,50 +457,50 @@ public:
QString ProgramDataBaseFileName;
runtimeLibraryOption RuntimeLibrary;
triState RuntimeTypeInfo;
triState ShowIncludes;
triState SmallerTypeCheck;
triState StringPooling;
structMemberAlignOption StructMemberAlignment;
triState SuppressStartupBanner;
triState TreatWChar_tAsBuiltInType;
triState TurnOffAssemblyGeneration;
triState UndefineAllPreprocessorDefinitions;
QStringList UndefinePreprocessorDefinitions;
pchOption UsePrecompiledHeader;
triState WarnAsError;
warningLevelOption WarningLevel;
triState WholeProgramOptimization;
VCConfiguration* config;
};
class VCLinkerTool : public VCToolBase
{
public:
// Functions
VCLinkerTool();
- ~VCLinkerTool(){};
- virtual bool parseOption( const char* option );
+ virtual ~VCLinkerTool(){}
+ bool parseOption( const char* option );
// Variables
QStringList AdditionalDependencies;
QStringList AdditionalLibraryDirectories;
QStringList AdditionalOptions;
QStringList AddModuleNamesToAssembly;
QString BaseAddress;
QStringList DelayLoadDLLs;
optFoldingType EnableCOMDATFolding;
QString EntryPointSymbol;
QStringList ForceSymbolReferences;
QString FunctionOrder;
triState GenerateDebugInformation;
triState GenerateMapFile;
long HeapCommitSize;
long HeapReserveSize;
triState IgnoreAllDefaultLibraries;
QStringList IgnoreDefaultLibraryNames;
triState IgnoreEmbeddedIDL;
triState IgnoreImportLibrary;
QString ImportLibrary;
addressAwarenessType LargeAddressAware;
triState LinkDLL;
linkIncrementalType LinkIncremental;
@@ -524,243 +522,243 @@ public:
triState SetChecksum;
linkProgressOption ShowProgress;
long StackCommitSize;
long StackReserveSize;
QString StripPrivateSymbols; // Should be list?
subSystemOption SubSystem;
triState SupportUnloadOfDelayLoadedDLL;
triState SuppressStartupBanner;
triState SwapRunFromCD;
triState SwapRunFromNet;
machineTypeOption TargetMachine;
termSvrAwarenessType TerminalServerAware;
triState TurnOffAssemblyGeneration;
QString TypeLibraryFile;
long TypeLibraryResourceID;
QString Version;
VCConfiguration* config;
};
class VCMIDLTool : public VCToolBase
{
public:
// Functions
VCMIDLTool();
- ~VCMIDLTool(){};
- virtual bool parseOption( const char* option );
+ virtual ~VCMIDLTool(){}
+ bool parseOption( const char* option );
// Variables
QStringList AdditionalIncludeDirectories;
QStringList AdditionalOptions;
QStringList CPreprocessOptions;
midlCharOption DefaultCharType;
QString DLLDataFileName; // Should be list?
midlErrorCheckOption EnableErrorChecks;
triState ErrorCheckAllocations;
triState ErrorCheckBounds;
triState ErrorCheckEnumRange;
triState ErrorCheckRefPointers;
triState ErrorCheckStubData;
QStringList FullIncludePath;
triState GenerateStublessProxies;
triState GenerateTypeLibrary;
QString HeaderFileName;
triState IgnoreStandardIncludePath;
QString InterfaceIdentifierFileName;
triState MkTypLibCompatible;
QString OutputDirectory;
QStringList PreprocessorDefinitions;
QString ProxyFileName;
QString RedirectOutputAndErrors;
midlStructMemberAlignOption StructMemberAlignment;
triState SuppressStartupBanner;
midlTargetEnvironment TargetEnvironment;
QString TypeLibraryName;
QStringList UndefinePreprocessorDefinitions;
triState ValidateParameters;
triState WarnAsError;
midlWarningLevelOption WarningLevel;
VCConfiguration* config;
};
class VCLibrarianTool : public VCToolBase
{
public:
// Functions
VCLibrarianTool();
- ~VCLibrarianTool(){};
- virtual bool parseOption( const char* option ){ return FALSE; };
+ virtual ~VCLibrarianTool(){}
+ bool parseOption( const char* ){ return FALSE; };
// Variables
QStringList AdditionalDependencies;
QStringList AdditionalLibraryDirectories;
QStringList AdditionalOptions;
QStringList ExportNamedFunctions;
QStringList ForceSymbolReferences;
triState IgnoreAllDefaultLibraries;
QStringList IgnoreDefaultLibraryNames;
QString ModuleDefinitionFile;
QString OutputFile;
triState SuppressStartupBanner;
};
class VCCustomBuildTool : public VCToolBase
{
public:
// Functions
VCCustomBuildTool();
- ~VCCustomBuildTool(){};
- virtual bool parseOption( const char* option ){ return FALSE; };
+ virtual ~VCCustomBuildTool(){}
+ bool parseOption( const char* ){ return FALSE; };
// Variables
QStringList AdditionalDependencies;
QString CommandLine;
QString Description;
QString Outputs;
QString ToolName;
QString ToolPath;
};
class VCResourceCompilerTool : public VCToolBase
{
public:
// Functions
VCResourceCompilerTool();
- ~VCResourceCompilerTool(){};
- virtual bool parseOption( const char* option ){ return FALSE; };
+ virtual ~VCResourceCompilerTool(){}
+ bool parseOption( const char* ){ return FALSE; };
// Variables
QStringList AdditionalIncludeDirectories;
QStringList AdditionalOptions;
enumResourceLangID Culture;
QStringList FullIncludePath;
triState IgnoreStandardIncludePath;
QStringList PreprocessorDefinitions;
QString ResourceOutputFileName;
linkProgressOption ShowProgress;
QString ToolPath;
};
class VCEventTool : public VCToolBase
{
protected:
// Functions
VCEventTool() : ExcludedFromBuild( unset ){};
- ~VCEventTool(){};
- virtual bool parseOption( const char* option ){ return FALSE; };
+ virtual ~VCEventTool(){}
+ bool parseOption( const char* ){ return FALSE; };
public:
// Variables
QString CommandLine;
QString Description;
triState ExcludedFromBuild;
QString ToolName;
QString ToolPath;
};
-class VCPostBuildEventTool : public VCEventTool
+class VCPostBuildEventTool : public VCEventTool
{
public:
VCPostBuildEventTool();
- ~VCPostBuildEventTool(){};
+ ~VCPostBuildEventTool(){}
};
-class VCPreBuildEventTool : public VCEventTool
+class VCPreBuildEventTool : public VCEventTool
{
public:
VCPreBuildEventTool();
- ~VCPreBuildEventTool(){};
+ ~VCPreBuildEventTool(){}
};
-class VCPreLinkEventTool : public VCEventTool
+class VCPreLinkEventTool : public VCEventTool
{
public:
VCPreLinkEventTool();
- ~VCPreLinkEventTool(){};
+ ~VCPreLinkEventTool(){}
};
class VCConfiguration
{
public:
// Functions
VCConfiguration();
- ~VCConfiguration(){};
+ ~VCConfiguration(){}
// Variables
triState ATLMinimizesCRunTimeLibraryUsage;
triState BuildBrowserInformation;
charSet CharacterSet;
ConfigurationTypes ConfigurationType;
QString DeleteExtensionsOnClean;
QString ImportLibrary;
QString IntermediateDirectory;
QString Name;
QString OutputDirectory;
QString PrimaryOutput;
QString ProgramDatabase;
triState RegisterOutput;
useOfATL UseOfATL;
useOfMfc UseOfMfc;
triState WholeProgramOptimization;
// XML sub-parts
VCCLCompilerTool compiler;
VCLinkerTool linker;
VCLibrarianTool librarian;
VCCustomBuildTool custom;
VCMIDLTool idl;
VCPostBuildEventTool postBuild;
VCPreBuildEventTool preBuild;
VCPreLinkEventTool preLink;
VCResourceCompilerTool resource;
};
class VcprojGenerator;
class VCFilter
{
public:
// Functions
VCFilter();
- ~VCFilter(){};
+ ~VCFilter(){}
void generateMOC( QTextStream &strm, QString str ) const;
void generateUIC( QTextStream &strm, const QString& str ) const;
// Variables
QString Name;
QString Filter;
triState ParseFiles;
QStringList Files;
VcprojGenerator* Project;
VCConfiguration* Config;
customBuildCheck CustomBuild;
};
class VCProject
{
public:
// Functions
VCProject();
- ~VCProject(){};
+ ~VCProject(){}
// Variables
QString Name;
QString Version;
QString ProjectGUID;
QString SccProjectName;
QString SccLocalPath;
QString PlatformName;
// XML sub-parts
VCConfiguration Configuration;
VCFilter SourceFiles;
VCFilter HeaderFiles;
VCFilter MOCFiles;
VCFilter UICFiles;
VCFilter FormFiles;
VCFilter TranslationFiles;
VCFilter LexYaccFiles;
VCFilter ResourceFiles;
};
QTextStream &operator<<( QTextStream &, const VCCLCompilerTool & );
QTextStream &operator<<( QTextStream &, const VCLinkerTool & );
QTextStream &operator<<( QTextStream &, const VCMIDLTool & );
diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp
index a2bb6e9..d2cbc31 100644
--- a/qmake/generators/win32/msvc_vcproj.cpp
+++ b/qmake/generators/win32/msvc_vcproj.cpp
@@ -1,208 +1,324 @@
/****************************************************************************
** $Id$
**
** Definition of VcprojGenerator class.
**
** Created : 970521
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "msvc_vcproj.h"
#include "option.h"
#include <qdir.h>
-#include <stdlib.h>
#include <qregexp.h>
+#include <qdict.h>
+#include <quuid.h>
+#include <stdlib.h>
#if defined(Q_OS_WIN32)
#include <objbase.h>
+#ifndef GUID_DEFINED
+#define GUID_DEFINED
+typedef struct _GUID
+{
+ ulong Data1;
+ ushort Data2;
+ ushort Data3;
+ uchar Data4[8];
+} GUID;
+#endif
#endif
+// Flatfile Tags ----------------------------------------------------
+const char* _snlHeader = "Microsoft Visual Studio Solution File, Format Version 7.00";
+ // The following UUID _may_ change for later servicepacks...
+ // If so we need to search through the registry at
+ // HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0\Projects
+ // to find the subkey that contains a "PossibleProjectExtension"
+ // containing "vcproj"...
+ // Use the hardcoded value for now so projects generated on other
+ // platforms are actually usable.
+const char* _snlMSVCvcprojGUID = "{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}";
+const char* _snlProjectBeg = "\nProject(\"";
+const char* _snlProjectMid = "\") = ";
+const char* _snlProjectEnd = "\nEndProject";
+const char* _snlGlobalBeg = "\nGlobal";
+const char* _snlGlobalEnd = "\nEndGlobal";
+const char* _snlSolutionConf = "\n\tGlobalSection(SolutionConfiguration) = preSolution"
+ "\n\t\tConfigName.0 = Release"
+ "\n\tEndGlobalSection";
+const char* _snlProjDepBeg = "\n\tGlobalSection(ProjectDependencies) = postSolution";
+const char* _snlProjDepEnd = "\n\tEndGlobalSection";
+const char* _snlProjConfBeg = "\n\tGlobalSection(ProjectConfiguration) = postSolution";
+const char* _snlProjConfTag1 = ".Release.ActiveCfg = Release|Win32";
+const char* _snlProjConfTag2 = ".Release.Build.0 = Release|Win32";
+const char* _snlProjConfEnd = "\n\tEndGlobalSection";
+const char* _snlExtSections = "\n\tGlobalSection(ExtensibilityGlobals) = postSolution"
+ "\n\tEndGlobalSection"
+ "\n\tGlobalSection(ExtensibilityAddIns) = postSolution"
+ "\n\tEndGlobalSection";
+// ------------------------------------------------------------------
+
VcprojGenerator::VcprojGenerator(QMakeProject *p) : Win32MakefileGenerator(p), init_flag(FALSE)
{
}
/* \internal
Generates a project file for the given profile.
Options are either a Visual Studio projectfiles, or
- recursive projectfiles.. Maybe we can make .sln files
- someday?
+ solutionfiles by parsing recursive projectdirectories.
*/
bool VcprojGenerator::writeMakefile(QTextStream &t)
{
// Check if all requirements are fullfilled
if(!project->variables()["QMAKE_FAILED_REQUIREMENTS"].isEmpty()) {
fprintf(stderr, "Project file not generated because all requirements not met:\n\t%s\n",
var("QMAKE_FAILED_REQUIREMENTS").latin1());
return TRUE;
}
- // Generate full project file
+ // Generate project file
if(project->first("TEMPLATE") == "vcapp" ||
project->first("TEMPLATE") == "vclib") {
debug_msg(1, "Generator: MSVC.NET: Writing project file" );
t << vcProject;
return TRUE;
- } else if(project->first("TEMPLATE") == "vcsubdirs") { // Generate recursive project
+ }
+ // Generate solution file
+ else if(project->first("TEMPLATE") == "vcsubdirs") {
debug_msg(1, "Generator: MSVC.NET: Writing solution file" );
writeSubDirs(t);
return TRUE;
}
return FALSE;
}
struct VcsolutionDepend {
+ QString uuid;
QString vcprojFile, orig_target, target;
+ ::target targetType;
QStringList dependencies;
};
+QUuid VcprojGenerator::increaseUUID( const QUuid &id )
+{
+ QUuid result( id );
+ Q_LONG dataFirst = (result.data4[0] << 24) +
+ (result.data4[1] << 16) +
+ (result.data4[2] << 8) +
+ result.data4[3];
+ Q_LONG dataLast = (result.data4[4] << 24) +
+ (result.data4[5] << 16) +
+ (result.data4[6] << 8) +
+ result.data4[7];
+
+ if ( !(dataLast++) )
+ dataFirst++;
+
+ result.data4[0] = uchar((dataFirst >> 24) & 0xff);
+ result.data4[1] = uchar((dataFirst >> 16) & 0xff);
+ result.data4[2] = uchar((dataFirst >> 8) & 0xff);
+ result.data4[3] = uchar( dataFirst & 0xff);
+ result.data4[4] = uchar((dataLast >> 24) & 0xff);
+ result.data4[5] = uchar((dataLast >> 16) & 0xff);
+ result.data4[6] = uchar((dataLast >> 8) & 0xff);
+ result.data4[7] = uchar( dataLast & 0xff);
+ return result;
+}
+
void VcprojGenerator::writeSubDirs(QTextStream &t)
{
if(project->first("TEMPLATE") == "subdirs") {
writeHeader(t);
Win32MakefileGenerator::writeSubDirs(t);
return;
}
- QPtrList<VcsolutionDepend> solution_depends;
- solution_depends.setAutoDelete(TRUE);
+ t << _snlHeader;
+ QUuid solutionGUID;
+#if defined(Q_WS_WIN32)
+ GUID guid;
+ HRESULT h = CoCreateGuid( &guid );
+ if ( h == S_OK )
+ solutionGUID = QUuid( guid );
+#else
+ // Qt doesn't support GUID on other platforms yet,
+ // so we use the all-zero uuid, and increase that.
+#endif
+
+
+ QDict<VcsolutionDepend> solution_depends;
+ QPtrList<VcsolutionDepend> solution_cleanup;
+ solution_cleanup.setAutoDelete(TRUE);
QStringList subdirs = project->variables()["SUBDIRS"];
QString oldpwd = QDir::currentDirPath();
for(QStringList::Iterator it = subdirs.begin(); it != subdirs.end(); ++it) {
QFileInfo fi(Option::fixPathToLocalOS((*it), TRUE));
if(fi.exists()) {
if(fi.isDir()) {
QString profile = (*it);
if(!profile.endsWith(Option::dir_sep))
profile += Option::dir_sep;
profile += fi.baseName() + ".pro";
subdirs.append(profile);
} else {
QMakeProject tmp_proj;
QString dir = fi.dirPath(), fn = fi.fileName();
if(!dir.isEmpty()) {
if(!QDir::setCurrent(dir))
fprintf(stderr, "Cannot find directory: %s\n", dir.latin1());
}
if(tmp_proj.read(fn, oldpwd)) {
if(tmp_proj.first("TEMPLATE") == "vcsubdirs") {
QStringList tmp_subdirs = fileFixify(tmp_proj.variables()["SUBDIRS"]);
subdirs += tmp_subdirs;
- } else if(tmp_proj.first("TEMPLATE") == "vcapp" ||
- tmp_proj.first("TEMPLATE") == "vclib") {
- QString vcproj = fi.baseName() + project->first("VCPROJ_EXTENSION");
- if(QFile::exists(vcproj) || 1) {
- VcprojGenerator tmp_dsp(&tmp_proj);
- tmp_dsp.setNoIO(TRUE);
- tmp_dsp.init();
- if(Option::debug_level) {
- QMap<QString, QStringList> &vars = tmp_proj.variables();
- for(QMap<QString, QStringList>::Iterator it = vars.begin();
- it != vars.end(); ++it) {
- if(it.key().left(1) != "." && !it.data().isEmpty())
- debug_msg(1, "%s: %s === %s", fn.latin1(), it.key().latin1(),
- it.data().join(" :: ").latin1());
- }
+ } else if(tmp_proj.first("TEMPLATE") == "vcapp" || tmp_proj.first("TEMPLATE") == "vclib") {
+ // Initialize a 'fake' project to get the correct variables
+ // and to be able to extract all the dependencies
+ VcprojGenerator tmp_vcproj(&tmp_proj);
+ tmp_vcproj.setNoIO(TRUE);
+ tmp_vcproj.init();
+ if(Option::debug_level) {
+ QMap<QString, QStringList> &vars = tmp_proj.variables();
+ for(QMap<QString, QStringList>::Iterator it = vars.begin();
+ it != vars.end(); ++it) {
+ if(it.key().left(1) != "." && !it.data().isEmpty())
+ debug_msg(1, "%s: %s === %s", fn.latin1(), it.key().latin1(),
+ it.data().join(" :: ").latin1());
}
- VcsolutionDepend *newDep = new VcsolutionDepend;
- newDep->vcprojFile = fileFixify(vcproj);
- newDep->orig_target = tmp_proj.first("QMAKE_ORIG_TARGET");
- newDep->target = tmp_proj.first("TARGET").section(Option::dir_sep, -1);
- if(newDep->target.endsWith(".dll"))
- newDep->target = newDep->target.left(newDep->target.length()-3) + "lib";
- if(!tmp_proj.isEmpty("FORMS"))
- newDep->dependencies << "uic.exe";
- {
- QStringList where("QMAKE_LIBS");
- if(!tmp_proj.isEmpty("QMAKE_INTERNAL_PRL_LIBS"))
- where = tmp_proj.variables()["QMAKE_INTERNAL_PRL_LIBS"];
- for(QStringList::iterator wit = where.begin();
- wit != where.end(); ++wit) {
- QStringList &l = tmp_proj.variables()[(*wit)];
- for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
- QString opt = (*it);
- if(!opt.startsWith("/")) //Not a switch
- newDep->dependencies << opt.section(Option::dir_sep, -1);
- }
+ }
+
+ // We assume project filename is [QMAKE_ORIG_TARGET].vcproj
+ QString vcproj = fixFilename(tmp_vcproj.project->first("QMAKE_ORIG_TARGET")) + project->first("VCPROJ_EXTENSION");
+
+ // If file doesn't exsist, then maybe the users configuration
+ // doesn't allow it to be created. Skip to next...
+ if(!QFile::exists(QDir::currentDirPath() + Option::dir_sep + vcproj)) {
+ qDebug( "Ignored (not found) '%s'", QString(QDir::currentDirPath() + Option::dir_sep + vcproj).latin1() );
+ goto nextfile; // # Dirty!
+ }
+
+ VcsolutionDepend *newDep = new VcsolutionDepend;
+ newDep->vcprojFile = fileFixify(vcproj);
+ newDep->orig_target = tmp_proj.first("QMAKE_ORIG_TARGET");
+ newDep->target = tmp_proj.first("TARGET").section(Option::dir_sep, -1);
+ newDep->targetType = tmp_vcproj.projectTarget;
+ {
+ static QUuid uuid = solutionGUID;
+ uuid = increaseUUID( uuid );
+ newDep->uuid = uuid.toString().upper();
+ }
+ if(newDep->target.endsWith(".dll"))
+ newDep->target = newDep->target.left(newDep->target.length()-3) + "lib";
+ if(!tmp_proj.isEmpty("FORMS"))
+ newDep->dependencies << "uic.exe";
+ {
+ QStringList where("QMAKE_LIBS");
+ if(!tmp_proj.isEmpty("QMAKE_INTERNAL_PRL_LIBS"))
+ where = tmp_proj.variables()["QMAKE_INTERNAL_PRL_LIBS"];
+ for(QStringList::iterator wit = where.begin();
+ wit != where.end(); ++wit) {
+ QStringList &l = tmp_proj.variables()[(*wit)];
+ for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
+ QString opt = (*it);
+ if(!opt.startsWith("/")) //Not a switch
+ newDep->dependencies << opt.section(Option::dir_sep, -1);
}
}
- solution_depends.append(newDep);
}
+ solution_cleanup.append(newDep);
+ solution_depends.insert(newDep->target, newDep);
+ {
+ QRegExp libVersion("[0-9]{3,3}\\.lib$");
+ if(libVersion.search(newDep->target) != -1)
+ solution_depends.insert(newDep->target.left(newDep->target.length() -
+ libVersion.matchedLength()) + ".lib", newDep);
+ }
+ t << _snlProjectBeg << _snlMSVCvcprojGUID << _snlProjectMid
+ << "\"" << newDep->orig_target << "\", \"" << newDep->vcprojFile
+ << "\", \"" << newDep->uuid << "\"";
+ t << _snlProjectEnd;
}
}
+nextfile:
QDir::setCurrent(oldpwd);
}
}
}
-
- VcsolutionDepend *vc;
- QMap<QString, int> uuids;
- QRegExp libVersion("[0-9]{3,3}\\.lib$");
- for(vc = solution_depends.first(); vc; vc = solution_depends.next()) {
- static int uuid = 666;
- uuids.insert(vc->target, uuid);
- if(libVersion.match(vc->target) != -1)
- uuids.insert(vc->target.left(vc->target.length() - libVersion.matchedLength()) + ".lib",
- uuid);
- t << "\"" << vc->orig_target << "\" \"" << vc->vcprojFile << "\" { " << uuid << " }" << endl;
- uuid++;
- }
- for(vc = solution_depends.first(); vc; vc = solution_depends.next()) {
- int uuid = uuids[vc->target], cnt = 0;
- for(QStringList::iterator dit = vc->dependencies.begin(); dit != vc->dependencies.end(); ++dit) {
- if(uuids.contains((*dit)))
- t << uuid << "." << cnt++ << " = " << uuids[(*dit)] << endl;
+ t << _snlGlobalBeg;
+ t << _snlSolutionConf;
+ t << _snlProjDepBeg;
+ for(solution_cleanup.first(); solution_cleanup.current(); solution_cleanup.next()) {
+ int cnt = 0;
+ for(QStringList::iterator dit = solution_cleanup.current()->dependencies.begin();
+ dit != solution_cleanup.current()->dependencies.end();
+ ++dit) {
+ VcsolutionDepend *vc;
+ if((vc=solution_depends[*dit])) {
+ if(solution_cleanup.current()->targetType != StaticLib || vc->targetType == Application)
+ t << "\n\t\t" << solution_cleanup.current()->uuid << "." << cnt++ << " = " << vc->uuid;
+ }
}
}
+ t << _snlProjDepEnd;
+ t << _snlProjConfBeg;
+ for(solution_cleanup.first(); solution_cleanup.current(); solution_cleanup.next()) {
+ t << "\n\t\t" << solution_cleanup.current()->uuid << _snlProjConfTag1;
+ t << "\n\t\t" << solution_cleanup.current()->uuid << _snlProjConfTag2;
+ }
+ t << _snlProjConfEnd;
+ t << _snlExtSections;
+ t << _snlGlobalEnd;
}
// ------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------
void VcprojGenerator::init()
{
if( init_flag )
return;
if(project->first("TEMPLATE") == "vcsubdirs") { //too much work for subdirs
init_flag = TRUE;
return;
}
debug_msg(1, "Generator: MSVC.NET: Initializing variables" );
/*
// Once to be nice and clean code...
// Wouldn't life be great?
// Are we building Qt?
bool is_qt =
( project->first("TARGET") == "qt"QTDLL_POSTFIX ||
project->first("TARGET") == "qt-mt"QTDLL_POSTFIX );
@@ -285,219 +401,238 @@ void VcprojGenerator::initConfiguration()
// Initialize XML sub elements
// - Do this first since main configuration elements may need
// - to know of certain compiler/linker options
initCompilerTool();
if ( projectTarget == StaticLib )
initLibrarianTool();
else
initLinkerTool();
initIDLTool();
// Own elements -----------------------------
QString temp = project->first("BuildBrowserInformation");
switch ( projectTarget ) {
case SharedLib:
vcProject.Configuration.ConfigurationType = typeDynamicLibrary;
break;
case StaticLib:
vcProject.Configuration.ConfigurationType = typeStaticLibrary;
break;
case Application:
default:
vcProject.Configuration.ConfigurationType = typeApplication;
break;
}
- vcProject.Configuration.Name = ( project->isActiveConfig( "release" ) ? "Release|" : "Debug|" );
+ vcProject.Configuration.Name = ( project->isActiveConfig( "debug" ) ? "Debug|" : "Release|" );
vcProject.Configuration.Name += ( vcProject.Configuration.idl.TargetEnvironment == midlTargetWin64 ? "Win64" : "Win32" );
vcProject.Configuration.ATLMinimizesCRunTimeLibraryUsage = ( project->first("ATLMinimizesCRunTimeLibraryUsage").isEmpty() ? _False : _True );
- vcProject.Configuration.BuildBrowserInformation = triState( temp.isEmpty() ? unset : temp.toShort() );
+ vcProject.Configuration.BuildBrowserInformation = triState( temp.isEmpty() ? (short)unset : temp.toShort() );
temp = project->first("CharacterSet");
- vcProject.Configuration.CharacterSet = charSet( temp.isEmpty() ? charSetNotSet : temp.toShort() );
+ vcProject.Configuration.CharacterSet = charSet( temp.isEmpty() ? (short)charSetNotSet : temp.toShort() );
vcProject.Configuration.DeleteExtensionsOnClean = project->first("DeleteExtensionsOnClean");
vcProject.Configuration.ImportLibrary = vcProject.Configuration.linker.ImportLibrary;
vcProject.Configuration.IntermediateDirectory = project->first("OBJECTS_DIR");
// temp = (projectTarget == StaticLib) ? project->first("DESTDIR"):project->first("DLLDESTDIR");
vcProject.Configuration.OutputDirectory = "."; //( temp.isEmpty() ? QString(".") : temp );
vcProject.Configuration.PrimaryOutput = project->first("PrimaryOutput");
vcProject.Configuration.WholeProgramOptimization = vcProject.Configuration.compiler.WholeProgramOptimization;
temp = project->first("UseOfATL");
if ( !temp.isEmpty() )
vcProject.Configuration.UseOfATL = useOfATL( temp.toShort() );
temp = project->first("UseOfMfc");
if ( !temp.isEmpty() )
vcProject.Configuration.UseOfMfc = useOfMfc( temp.toShort() );
// Configuration does not need parameters from
// these sub XML items;
initCustomBuildTool();
initPreBuildEventTools();
initPostBuildEventTools();
initPreLinkEventTools();
}
void VcprojGenerator::initCompilerTool()
{
QString placement = project->first("OBJECTS_DIR");
if ( placement.isEmpty() )
- placement = project->isActiveConfig( "release" )? ".\\Release\\":".\\Debug\\";
+ placement = ".\\";
vcProject.Configuration.compiler.AssemblerListingLocation = placement ;
vcProject.Configuration.compiler.ProgramDataBaseFileName = placement ;
vcProject.Configuration.compiler.ObjectFile = placement ;
vcProject.Configuration.compiler.PrecompiledHeaderFile = placement + project->first("QMAKE_ORIG_TARGET") + ".pch";
if ( project->isActiveConfig("debug") ){
// Debug version
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS"] );
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_DEBUG"] );
if ( project->isActiveConfig("thread") ) {
if ( (projectTarget == Application) || (projectTarget == StaticLib) )
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DBG"] );
else
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"] );
} else {
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_ST_DBG"] );
}
} else {
// Release version
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS"] );
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_RELEASE"] );
vcProject.Configuration.compiler.PreprocessorDefinitions += "QT_NO_DEBUG";
+ vcProject.Configuration.compiler.PreprocessorDefinitions += "NDEBUG";
if ( project->isActiveConfig("thread") ) {
if ( (projectTarget == Application) || (projectTarget == StaticLib) )
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT"] );
else
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DLL"] );
} else {
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_ST"] );
}
}
// Common for both release and debug
if ( project->isActiveConfig("warn_off") )
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_WARN_OFF"] );
- else
+ else if ( project->isActiveConfig("warn_on") )
vcProject.Configuration.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_WARN_ON"] );
if ( project->isActiveConfig("windows") )
vcProject.Configuration.compiler.PreprocessorDefinitions += project->variables()["MSVCPROJ_WINCONDEF"];
// Can this be set for ALL configs?
// If so, use qmake.conf!
if ( projectTarget == SharedLib )
vcProject.Configuration.compiler.PreprocessorDefinitions += "_WINDOWS";
vcProject.Configuration.compiler.PreprocessorDefinitions += project->variables()["DEFINES"];
vcProject.Configuration.compiler.PreprocessorDefinitions += project->variables()["PRL_EXPORT_DEFINES"];
vcProject.Configuration.compiler.parseOptions( project->variables()["MSVCPROJ_INCPATH"] );
}
void VcprojGenerator::initLibrarianTool()
{
vcProject.Configuration.librarian.OutputFile = project->first( "DESTDIR" );
if( vcProject.Configuration.librarian.OutputFile.isEmpty() )
vcProject.Configuration.librarian.OutputFile = ".\\";
if( !vcProject.Configuration.librarian.OutputFile.endsWith("\\") )
vcProject.Configuration.librarian.OutputFile += '\\';
vcProject.Configuration.librarian.OutputFile += project->first("MSVCPROJ_TARGET");
}
void VcprojGenerator::initLinkerTool()
{
vcProject.Configuration.linker.parseOptions( project->variables()["MSVCPROJ_LFLAGS"] );
vcProject.Configuration.linker.AdditionalDependencies += project->variables()["MSVCPROJ_LIBS"];
switch ( projectTarget ) {
- case Application:
- vcProject.Configuration.linker.OutputFile = project->first( "DESTDIR" );
- break;
- case SharedLib:
- vcProject.Configuration.linker.parseOptions( project->variables()["MSVCPROJ_LIBOPTIONS"] );
- vcProject.Configuration.linker.OutputFile = project->first( "DLLDESTDIR" );
- break;
+ case Application:
+ vcProject.Configuration.linker.OutputFile = project->first( "DESTDIR" );
+ break;
+ case SharedLib:
+ vcProject.Configuration.linker.parseOptions( project->variables()["MSVCPROJ_LIBOPTIONS"] );
+ vcProject.Configuration.linker.OutputFile = project->first( "DLLDESTDIR" );
+ break;
+ case StaticLib: //unhandled - added to remove warnings..
+ break;
}
if( vcProject.Configuration.linker.OutputFile.isEmpty() )
vcProject.Configuration.linker.OutputFile = ".\\";
if( !vcProject.Configuration.linker.OutputFile.endsWith("\\") )
vcProject.Configuration.linker.OutputFile += '\\';
vcProject.Configuration.linker.OutputFile += project->first("MSVCPROJ_TARGET");
vcProject.Configuration.linker.ProgramDatabaseFile = project->first("OBJECTS_DIR") + project->first("QMAKE_ORIG_TARGET") + ".pdb";
if ( project->isActiveConfig("debug") ){
vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_DEBUG"] );
} else {
vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_RELEASE"] );
}
if ( project->isActiveConfig("dll") ){
vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_QT_DLL"] );
}
if ( project->isActiveConfig("console") ){
vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_CONSOLE"] );
} else {
vcProject.Configuration.linker.parseOptions( project->variables()["QMAKE_LFLAGS_WINDOWS"] );
}
}
void VcprojGenerator::initIDLTool()
{
}
void VcprojGenerator::initCustomBuildTool()
{
}
void VcprojGenerator::initPreBuildEventTools()
{
QString collectionName = project->first("QMAKE_IMAGE_COLLECTION");
if( !collectionName.isEmpty() ) {
QStringList& list = project->variables()["IMAGES"];
vcProject.Configuration.preBuild.Description = "Generate imagecollection";
//vcProject.Configuration.preBuild.AdditionalDependencies += list;
- vcProject.Configuration.preBuild.CommandLine = project->first("QMAKE_UIC") + " -embed " + project->first("QMAKE_ORIG_TARGET") + " " + list.join(" ") + " -o " + collectionName;
+
+ QFile imgs( ".imgcol" );
+ imgs.open( IO_WriteOnly );
+ QTextStream s( &imgs );
+ QStringList::ConstIterator it = list.begin();
+ while( it!=list.end() ) {
+ s << *it << " ";
+ it++;
+ }
+
+ vcProject.Configuration.preBuild.CommandLine = project->first("QMAKE_UIC") + " -embed " + project->first("QMAKE_ORIG_TARGET") + " -f .imgcol -o " + collectionName;
//vcProject.Configuration.preBuild.Outputs = collectionName;
}
}
void VcprojGenerator::initPostBuildEventTools()
{
+ if ( !project->variables()["QMAKE_POST_LINK"].isEmpty() ) {
+ vcProject.Configuration.postBuild.Description = var("QMAKE_POST_LINK");
+ vcProject.Configuration.postBuild.CommandLine = var("QMAKE_POST_LINK");
+ }
if( project->isActiveConfig( "activeqt" ) ) {
QString name = project->first( "QMAKE_ORIG_TARGET" );
QString nameext = project->first( "TARGET" );
QString objdir = project->first( "OBJECTS_DIR" );
QString idc = project->first( "QMAKE_IDC" );
vcProject.Configuration.postBuild.Description = "Finalizing ActiveQt server...";
+ if ( !vcProject.Configuration.postBuild.CommandLine.isEmpty() )
+ vcProject.Configuration.postBuild.CommandLine += " &amp;&amp; ";
if( project->isActiveConfig( "dll" ) ) { // In process
- vcProject.Configuration.postBuild.CommandLine =
+ vcProject.Configuration.postBuild.CommandLine +=
// call idc to generate .idl file from .dll
idc + " " + vcProject.Configuration.OutputDirectory + "\\" + nameext + " -idl " + objdir + name + ".idl -version 1.0 &amp;&amp; " +
// call midl to create implementations of the .idl file
project->first( "QMAKE_IDL" ) + " " + objdir + name + ".idl /nologo /o " + objdir + name + ".midl /tlb " + objdir + name + ".tlb /iid " + objdir +
"dump.midl /dlldata " + objdir + "dump.midl /cstub " + objdir + "dump.midl /header " + objdir + "dump.midl /proxy " + objdir + "dump.midl /sstub " +
objdir + "dump.midl &amp;&amp; " +
// call idc to replace tlb...
idc + " " + vcProject.Configuration.OutputDirectory + "\\" + nameext + " /tlb " + objdir + name + ".tlb &amp;&amp; " +
// register server
idc + " " + vcProject.Configuration.OutputDirectory + "\\" + nameext + " /regserver";
} else { // out of process
vcProject.Configuration.postBuild.CommandLine =
// call application to dump idl
vcProject.Configuration.OutputDirectory + "\\" + nameext + " -dumpidl " + objdir + name + ".idl -version 1.0 &amp;&amp; " +
// call midl to create implementations of the .idl file
project->first( "QMAKE_IDL" ) + " " + objdir + name + ".idl /nologo /o " + objdir + name + ".midl /tlb " + objdir + name + ".tlb /iid " + objdir +
"dump.midl /dlldata " + objdir + "dump.midl /cstub " + objdir + "dump.midl /header " + objdir + "dump.midl /proxy " + objdir + "dump.midl /sstub " +
objdir + "dump.midl &amp;&amp; " +
// call idc to replace tlb...
idc + " " + vcProject.Configuration.OutputDirectory + "\\" + nameext + " /tlb " + objdir + name + ".tlb &amp;&amp; " +
// call app to register
vcProject.Configuration.OutputDirectory + "\\" + nameext + " -regserver";
}
}
@@ -581,75 +716,82 @@ void VcprojGenerator::initLexYaccFiles()
vcProject.LexYaccFiles.Name = "Lex / Yacc Files";
vcProject.LexYaccFiles.ParseFiles = _False;
vcProject.LexYaccFiles.Filter = "l;y";
vcProject.LexYaccFiles.Files += project->variables()["LEXSOURCES"];
vcProject.LexYaccFiles.Files += project->variables()["YACCSOURCES"];
vcProject.LexYaccFiles.Files.sort();
vcProject.LexYaccFiles.Project = this;
vcProject.LexYaccFiles.CustomBuild = lexyacc;
}
void VcprojGenerator::initResourceFiles()
{
vcProject.ResourceFiles.Name = "Resources";
vcProject.ResourceFiles.ParseFiles = _False;
vcProject.ResourceFiles.Filter = "cpp;ico;png;jpg;jpeg;gif;xpm;bmp;rc;ts";
vcProject.ResourceFiles.Files += project->variables()["RC_FILE"];
vcProject.ResourceFiles.Files += project->variables()["QMAKE_IMAGE_COLLECTION"];
vcProject.ResourceFiles.Files += project->variables()["IMAGES"];
vcProject.ResourceFiles.Files += project->variables()["IDLSOURCES"];
vcProject.ResourceFiles.Files.sort();
vcProject.ResourceFiles.Project = this;
vcProject.ResourceFiles.CustomBuild = none;
}
-/*
-// $$MSVCPROJ_IDLSOURCES ---------------------------------------------
-void VcprojGenerator::writeIDLs( QTextStream &t )
-{
- QStringList &l = project->variables()["MSVCPROJ_IDLSOURCES"];
- for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
- t << "# Begin Source File" << endl << endl;
- t << "SOURCE=" << (*it) << endl;
- t << "# PROP Exclude_From_Build 1" << endl;
- t << "# End Source File" << endl << endl;
- }
- debug_msg(3, "Generator: MSVC.NET: Added IDLs" );
-}
-*/
-
/* \internal
Sets up all needed variables from the environment and all the different caches and .conf files
*/
void VcprojGenerator::initOld()
{
if( init_flag )
return;
init_flag = TRUE;
QStringList::Iterator it;
+ if ( project->isActiveConfig("stl") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_STL_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_STL_OFF"];
+ }
+ if ( project->isActiveConfig("exceptions") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_EXCEPTIONS_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_EXCEPTIONS_OFF"];
+ }
+ if ( project->isActiveConfig("rtti") ) {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_ON"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_ON"];
+ } else {
+ project->variables()["QMAKE_CFLAGS"] += project->variables()["QMAKE_CFLAGS_RTTI_OFF"];
+ project->variables()["QMAKE_CXXFLAGS"] += project->variables()["QMAKE_CXXFLAGS_RTTI_OFF"];
+ }
+
// this should probably not be here, but I'm using it to wrap the .t files
if(project->first("TEMPLATE") == "vcapp" )
project->variables()["QMAKE_APP_FLAG"].append("1");
else if(project->first("TEMPLATE") == "vclib")
project->variables()["QMAKE_LIB_FLAG"].append("1");
if ( project->variables()["QMAKESPEC"].isEmpty() )
project->variables()["QMAKESPEC"].append( getenv("QMAKESPEC") );
bool is_qt =
( project->first("TARGET") == "qt"QTDLL_POSTFIX ||
project->first("TARGET") == "qt-mt"QTDLL_POSTFIX );
QStringList &configs = project->variables()["CONFIG"];
if ( project->isActiveConfig( "shared" ) )
project->variables()["DEFINES"].append( "QT_DLL" );
if ( project->isActiveConfig( "qt_dll" ) &&
configs.findIndex("qt") == -1 )
configs.append("qt");
if ( project->isActiveConfig( "qt" ) ) {
if ( project->isActiveConfig( "plugin" ) ) {
project->variables()["CONFIG"].append( "dll" );
@@ -767,156 +909,175 @@ void VcprojGenerator::initOld()
// DLL -----------------------------------------------------------
if ( project->isActiveConfig("dll") ) {
if ( !project->variables()["QMAKE_LIB_FLAG"].isEmpty() ) {
QString ver_xyz(project->first("VERSION"));
ver_xyz.replace(QRegExp("\\."), "");
project->variables()["TARGET_EXT"].append(ver_xyz + ".dll");
} else {
project->variables()["TARGET_EXT"].append(".dll");
}
}
// EXE / LIB -----------------------------------------------------
else {
if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() )
project->variables()["TARGET_EXT"].append(".exe");
else
project->variables()["TARGET_EXT"].append(".lib");
}
project->variables()["MSVCPROJ_VER"] = "7.00";
project->variables()["MSVCPROJ_DEBUG_OPT"] = "/GZ /ZI";
// INCREMENTAL:NO ------------------------------------------------
if(!project->isActiveConfig("incremental")) {
- project->variables()["QMAKE_LFLAGS"].append(QString("/incremental:no"));
+ project->variables()["QMAKE_LFLAGS"].append(QString("/INCREMENTAL:no"));
if ( is_qt )
project->variables()["MSVCPROJ_DEBUG_OPT"] = "/GZ /Zi";
}
// MOC -----------------------------------------------------------
if ( project->isActiveConfig("moc") )
setMocAware(TRUE);
project->variables()["QMAKE_LIBS"] += project->variables()["LIBS"];
+ // Update -lname to name.lib, and -Ldir to
+ QStringList &libList = project->variables()["QMAKE_LIBS"];
+ for( it = libList.begin(); it != libList.end(); ) {
+ QString s = *it;
+ if( s.startsWith( "-l" ) ) {
+ it = libList.remove( it );
+ it = libList.insert( it, s.mid( 2 ) + ".lib" );
+ } else if( s.startsWith( "-L" ) ) {
+ it = libList.remove( it );
+ } else {
+ it++;
+ }
+ }
// Run through all variables containing filepaths, and -----------
// slash-slosh them correctly depending on current OS -----------
project->variables()["QMAKE_FILETAGS"] += QStringList::split(' ', "HEADERS SOURCES DEF_FILE RC_FILE TARGET QMAKE_LIBS DESTDIR DLLDESTDIR INCLUDEPATH");
QStringList &l = project->variables()["QMAKE_FILETAGS"];
for(it = l.begin(); it != l.end(); ++it) {
QStringList &gdmf = project->variables()[(*it)];
for(QStringList::Iterator inner = gdmf.begin(); inner != gdmf.end(); ++inner)
(*inner) = Option::fixPathToTargetOS((*inner), FALSE);
}
// Get filename w/o extention -----------------------------------
QString msvcproj_project = "";
QString targetfilename = "";
if ( project->variables()["TARGET"].count() ) {
msvcproj_project = project->variables()["TARGET"].first();
targetfilename = msvcproj_project;
}
// Save filename w/o extention in $$QMAKE_ORIG_TARGET ------------
project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"];
- // TARGET (add extention to $$TARGET) ----------------------------
- project->variables()["TARGET"].first() += project->first("TARGET_EXT");
+ // TARGET (add extention to $$TARGET)
+ //project->variables()["MSVCPROJ_DEFINES"].append(varGlue(".first() += project->first("TARGET_EXT");
// Init base class too -------------------------------------------
MakefileGenerator::init();
if ( msvcproj_project.isEmpty() )
msvcproj_project = Option::output.name();
msvcproj_project = msvcproj_project.right( msvcproj_project.length() - msvcproj_project.findRev( "\\" ) - 1 );
msvcproj_project = msvcproj_project.left( msvcproj_project.findRev( "." ) );
msvcproj_project.replace(QRegExp("-"), "");
project->variables()["MSVCPROJ_PROJECT"].append(msvcproj_project);
QStringList &proj = project->variables()["MSVCPROJ_PROJECT"];
for(it = proj.begin(); it != proj.end(); ++it)
(*it).replace(QRegExp("\\.[a-zA-Z0-9_]*$"), "");
// SUBSYSTEM -----------------------------------------------------
if ( !project->variables()["QMAKE_APP_FLAG"].isEmpty() ) {
project->variables()["MSVCPROJ_TEMPLATE"].append("win32app" + project->first( "VCPROJ_EXTENSION" ) );
if ( project->isActiveConfig("console") ) {
project->variables()["MSVCPROJ_CONSOLE"].append("CONSOLE");
project->variables()["MSVCPROJ_WINCONDEF"].append("_CONSOLE");
project->variables()["MSVCPROJ_VCPROJTYPE"].append("0x0103");
project->variables()["MSVCPROJ_SUBSYSTEM"].append("CONSOLE");
} else {
project->variables()["MSVCPROJ_CONSOLE"].clear();
project->variables()["MSVCPROJ_WINCONDEF"].append("_WINDOWS");
project->variables()["MSVCPROJ_VCPROJTYPE"].append("0x0101");
project->variables()["MSVCPROJ_SUBSYSTEM"].append("WINDOWS");
}
} else {
if ( project->isActiveConfig("dll") ) {
project->variables()["MSVCPROJ_TEMPLATE"].append("win32dll" + project->first( "VCPROJ_EXTENSION" ) );
} else {
project->variables()["MSVCPROJ_TEMPLATE"].append("win32lib" + project->first( "VCPROJ_EXTENSION" ) );
}
}
// $$QMAKE.. -> $$MSVCPROJ.. -------------------------------------
project->variables()["MSVCPROJ_LIBS"] += project->variables()["QMAKE_LIBS"];
project->variables()["MSVCPROJ_LIBS"] += project->variables()["QMAKE_LIBS_WINDOWS"];
project->variables()["MSVCPROJ_LFLAGS" ] += project->variables()["QMAKE_LFLAGS"];
- if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() )
- project->variables()["MSVCPROJ_LFLAGS" ].append(varGlue("QMAKE_LIBDIR","/LIBPATH:"," /LIBPATH:",""));
+ if ( !project->variables()["QMAKE_LIBDIR"].isEmpty() ) {
+ QStringList strl = project->variables()["QMAKE_LIBDIR"];
+ QStringList::iterator stri;
+ for ( stri = strl.begin(); stri != strl.end(); ++stri ) {
+ if ( !(*stri).startsWith("/LIBPATH:") )
+ (*stri).prepend( "/LIBPATH:" );
+ }
+ project->variables()["MSVCPROJ_LFLAGS"] += strl;
+ }
project->variables()["MSVCPROJ_CXXFLAGS" ] += project->variables()["QMAKE_CXXFLAGS"];
// We don't use this... Direct manipulation of compiler object
//project->variables()["MSVCPROJ_DEFINES"].append(varGlue("DEFINES","/D ","" " /D ",""));
//project->variables()["MSVCPROJ_DEFINES"].append(varGlue("PRL_EXPORT_DEFINES","/D ","" " /D ",""));
QStringList &incs = project->variables()["INCLUDEPATH"];
for(QStringList::Iterator incit = incs.begin(); incit != incs.end(); ++incit) {
QString inc = (*incit);
inc.replace(QRegExp("\""), "");
project->variables()["MSVCPROJ_INCPATH"].append("/I" + inc );
}
project->variables()["MSVCPROJ_INCPATH"].append("/I" + specdir());
QString dest;
project->variables()["MSVCPROJ_TARGET"] = project->first("TARGET");
- if ( !project->variables()["DESTDIR"].isEmpty() ) {
- project->variables()["TARGET"].first().prepend(project->first("DESTDIR"));
- Option::fixPathToTargetOS(project->first("TARGET"));
- dest = project->first("TARGET");
- if ( project->first("TARGET").startsWith("$(QTDIR)") )
- dest.replace( QRegExp("\\$\\(QTDIR\\)"), getenv("QTDIR") );
- project->variables()["MSVCPROJ_TARGET"].append(
- QString("/OUT:") + dest );
- if ( project->isActiveConfig("dll") ) {
- QString imp = dest;
- imp.replace(QRegExp("\\.dll"), ".lib");
- project->variables()["MSVCPROJ_LIBOPTIONS"] += (QString("/IMPLIB:") + imp );
- }
+ Option::fixPathToTargetOS(project->first("TARGET"));
+ dest = project->first("TARGET") + project->first( "TARGET_EXT" );
+ if ( project->first("TARGET").startsWith("$(QTDIR)") )
+ dest.replace( QRegExp("\\$\\(QTDIR\\)"), getenv("QTDIR") );
+ project->variables()["MSVCPROJ_TARGET"] = dest;
+ if ( project->isActiveConfig("dll") ) {
+ QString imp = project->first( "DESTDIR" );
+ if( !imp.isNull() && !imp.endsWith( "\\" ) )
+ imp += "\\";
+ imp += dest;
+ imp.replace(QRegExp("\\.dll"), ".lib");
+ project->variables()["MSVCPROJ_LIBOPTIONS"] += QString("/IMPLIB:") + imp;
}
// DLL COPY ------------------------------------------------------
if ( project->isActiveConfig("dll") && !project->variables()["DLLDESTDIR"].isEmpty() ) {
QStringList dlldirs = project->variables()["DLLDESTDIR"];
QString copydll = "# Begin Special Build Tool\n"
"TargetPath=" + dest + "\n"
"SOURCE=$(InputPath)\n"
"PostBuild_Desc=Copy DLL to " + project->first("DLLDESTDIR") + "\n"
"PostBuild_Cmds=";
for ( QStringList::Iterator dlldir = dlldirs.begin(); dlldir != dlldirs.end(); ++dlldir ) {
copydll += "copy \"" + dest + "\" \"" + *dlldir + "\"\t";
}
copydll += "\n# End Special Build Tool";
project->variables()["MSVCPROJ_COPY_DLL_REL"].append( copydll );
project->variables()["MSVCPROJ_COPY_DLL_DBG"].append( copydll );
}
// ACTIVEQT ------------------------------------------------------
if ( project->isActiveConfig("activeqt") ) {
QString idl = project->variables()["QMAKE_IDL"].first();
QString idc = project->variables()["QMAKE_IDC"].first();
@@ -975,76 +1136,79 @@ void VcprojGenerator::initOld()
project->variables()["QMAKE_INTERNAL_PRL_LIBS"] << "MSVCPROJ_LFLAGS" << "MSVCPROJ_LIBS";
// Verbose output if "-d -d"...
outputVariables();
}
// ------------------------------------------------------------------------------------------------
// ------------------------------------------------------------------------------------------------
bool VcprojGenerator::openOutput(QFile &file) const
{
QString outdir;
if(!file.name().isEmpty()) {
QFileInfo fi(file);
if(fi.isDir())
outdir = file.name() + QDir::separator();
}
if(!outdir.isEmpty() || file.name().isEmpty()) {
QString ext = project->first("VCPROJ_EXTENSION");
if(project->first("TEMPLATE") == "vcsubdirs")
ext = project->first("VCSOLUTION_EXTENSION");
file.setName(outdir + project->first("TARGET") + ext);
}
if(QDir::isRelativePath(file.name())) {
- QString ofile;
- ofile = file.name();
- int slashfind = ofile.findRev('\\');
- if (slashfind == -1) {
- ofile = ofile.replace("-", "_");
- } else {
- int hypenfind = ofile.find('-', slashfind);
- while (hypenfind != -1 && slashfind < hypenfind) {
- ofile = ofile.replace(hypenfind, 1, "_");
- hypenfind = ofile.find('-', hypenfind + 1);
- }
- }
- file.setName(Option::fixPathToLocalOS(QDir::currentDirPath() + Option::dir_sep + ofile));
+ file.setName( Option::fixPathToLocalOS(QDir::currentDirPath() + Option::dir_sep + fixFilename(file.name())) );
}
return Win32MakefileGenerator::openOutput(file);
}
+QString VcprojGenerator::fixFilename(QString ofile) const
+{
+ int slashfind = ofile.findRev('\\');
+ if (slashfind == -1) {
+ ofile = ofile.replace('-', '_');
+ } else {
+ int hypenfind = ofile.find('-', slashfind);
+ while (hypenfind != -1 && slashfind < hypenfind) {
+ ofile = ofile.replace(hypenfind, 1, '_');
+ hypenfind = ofile.find('-', hypenfind + 1);
+ }
+ }
+ return ofile;
+}
+
QString VcprojGenerator::findTemplate(QString file)
{
QString ret;
if(!QFile::exists((ret = file)) &&
!QFile::exists((ret = QString(Option::mkfile::qmakespec + "/" + file))) &&
!QFile::exists((ret = QString(getenv("QTDIR")) + "/mkspecs/win32-msvc.net/" + file)) &&
!QFile::exists((ret = (QString(getenv("HOME")) + "/.tmake/" + file))))
return "";
debug_msg(1, "Generator: MSVC.NET: Found template \'%s\'", ret.latin1() );
return ret;
}
void VcprojGenerator::processPrlVariable(const QString &var, const QStringList &l)
{
if(var == "QMAKE_PRL_DEFINES") {
QStringList &out = project->variables()["MSVCPROJ_DEFINES"];
for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
if(out.findIndex((*it)) == -1)
out.append((" /D " + *it ));
}
} else {
MakefileGenerator::processPrlVariable(var, l);
}
}
void VcprojGenerator::outputVariables()
{
#if 0
- debug_msg(3, "Generator: MSVC.NET: List of current variables:" );
+ qDebug( "Generator: MSVC.NET: List of current variables:" );
for ( QMap<QString, QStringList>::ConstIterator it = project->variables().begin(); it != project->variables().end(); ++it) {
- debug_msg(3, "Generator: MSVC.NET: %s => %s", it.key().latin1(), it.data().join(" | ").latin1() );
+ qDebug( "Generator: MSVC.NET: %s => %s", it.key().latin1(), it.data().join(" | ").latin1() );
}
#endif
}
diff --git a/qmake/generators/win32/msvc_vcproj.h b/qmake/generators/win32/msvc_vcproj.h
index 583b164..69e0c02 100644
--- a/qmake/generators/win32/msvc_vcproj.h
+++ b/qmake/generators/win32/msvc_vcproj.h
@@ -1,129 +1,115 @@
/****************************************************************************
** $Id$
**
** Definition of VcprojGenerator class.
**
** Created : 970521
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef __VCPROJMAKE_H__
-#define __VCPROJMAKE_H__
+#ifndef __MSVC_VCPROJ_H__
+#define __MSVC_VCPROJ_H__
#include "winmakefile.h"
#include "msvc_objectmodel.h"
enum target {
Application,
SharedLib,
StaticLib
};
+struct QUuid;
class VcprojGenerator : public Win32MakefileGenerator
{
bool init_flag;
bool writeVcprojParts(QTextStream &);
bool writeMakefile(QTextStream &);
virtual void writeSubDirs(QTextStream &t);
QString findTemplate(QString file);
void init();
public:
VcprojGenerator(QMakeProject *p);
~VcprojGenerator();
QString defaultMakefile() const;
virtual bool doDepends() const { return FALSE; } //never necesary
protected:
virtual bool openOutput(QFile &file) const;
virtual void processPrlVariable(const QString &, const QStringList &);
virtual bool findLibraries();
virtual void outputVariables();
+ QString fixFilename(QString ofile) const;
void initOld();
void initProject();
void initConfiguration();
void initCompilerTool();
void initLinkerTool();
void initLibrarianTool();
void initIDLTool();
void initCustomBuildTool();
void initPreBuildEventTools();
void initPostBuildEventTools();
void initPreLinkEventTools();
void initSourceFiles();
void initHeaderFiles();
void initMOCFiles();
void initUICFiles();
void initFormsFiles();
void initTranslationFiles();
void initLexYaccFiles();
void initResourceFiles();
- /*
- void writeGuid( QTextStream &t );
- void writeAdditionalOptions( QTextStream &t );
- void writeHeaders( QTextStream &t );
- void writeSources( QTextStream &t );
- void writeMocs( QTextStream &t );
- void writeLexs( QTextStream &t );
- void writeYaccs( QTextStream &t );
- void writePictures( QTextStream &t );
- void writeImages( QTextStream &t );
- void writeIDLs( QTextStream &t );
-
- void writeForms( QTextStream &t );
- void writeFormsSourceHeaders( QString &variable, QTextStream &t );
- void writeTranslations( QTextStream &t );
- void writeStrippedTranslations( QTextStream &t );
- */
-
VCProject vcProject;
target projectTarget;
+private:
+ QUuid increaseUUID(const QUuid &id);
friend class VCFilter;
};
inline VcprojGenerator::~VcprojGenerator()
{ }
inline QString VcprojGenerator::defaultMakefile() const
{
return project->first("TARGET") + project->first("VCPROJ_EXTENSION");
}
inline bool VcprojGenerator::findLibraries()
{
return Win32MakefileGenerator::findLibraries("MSVCVCPROJ_LIBS");
}
-#endif /* __VCPROJMAKE_H__ */
+#endif /* __MSVC_VCPROJ_H__ */
diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp
index a07c921..bc3fed9 100644
--- a/qmake/generators/win32/winmakefile.cpp
+++ b/qmake/generators/win32/winmakefile.cpp
@@ -80,272 +80,312 @@ Win32MakefileGenerator::writeSubDirs(QTextStream &t)
} else {
sd->directory = file;
}
while(sd->directory.right(1) == Option::dir_sep)
sd->directory = sd->directory.left(sd->directory.length() - 1);
if(!sd->profile.isEmpty()) {
QString basename = sd->directory;
int new_slsh = basename.findRev(Option::dir_sep);
if(new_slsh != -1)
basename = basename.mid(new_slsh+1);
if(sd->profile != basename + ".pro")
sd->makefile += "." + sd->profile.left(sd->profile.length() - 4); //no need for the .pro
}
sd->target = "sub-" + (*it);
sd->target.replace('/', '-');
sd->target.replace('.', '_');
}
}
QPtrListIterator<SubDir> it(subdirs);
if(!project->isEmpty("MAKEFILE"))
t << "MAKEFILE= " << var("MAKEFILE") << endl;
t << "QMAKE = " << (project->isEmpty("QMAKE_QMAKE") ? QString("qmake") : var("QMAKE_QMAKE")) << endl;
t << "SUBTARGETS = ";
- for( it.toFirst(); it.current(); ++it)
+ for( it.toFirst(); it.current(); ++it)
t << " \\\n\t\t" << it.current()->target;
t << endl << endl;
t << "all: qmake_all $(SUBTARGETS)" << endl << endl;
for( it.toFirst(); it.current(); ++it) {
bool have_dir = !(*it)->directory.isEmpty();
//make the makefile
QString mkfile = (*it)->makefile;
if(have_dir)
mkfile.prepend((*it)->directory + Option::dir_sep);
t << mkfile << ":";
if(project->variables()["QMAKE_NOFORCE"].isEmpty())
t << " FORCE";
- if(have_dir)
+ if(have_dir)
t << "\n\t" << "cd " << (*it)->directory;
t << "\n\t" << "$(QMAKE) " << (*it)->profile << " " << buildArgs();
- if((*it)->makefile != "$(MAKEFILE)")
- t << " -o " << (*it)->makefile;
+ t << " -o " << (*it)->makefile;
if(have_dir) {
int subLevels = it.current()->directory.contains(Option::dir_sep) + 1;
t << "\n\t" << "@cd ..";
for(int i = 1; i < subLevels; i++ )
t << Option::dir_sep << "..";
}
t << endl;
//now actually build
t << (*it)->target << ": " << mkfile;
if(project->variables()["QMAKE_NOFORCE"].isEmpty())
t << " FORCE";
- if(have_dir)
+ if(have_dir)
t << "\n\t" << "cd " << (*it)->directory;
t << "\n\t" << "$(MAKE)";
- if((*it)->makefile != "$(MAKEFILE)")
- t << " -f " << (*it)->makefile;
+ t << " -f " << (*it)->makefile;
if(have_dir) {
int subLevels = it.current()->directory.contains(Option::dir_sep) + 1;
t << "\n\t" << "@cd ..";
for(int i = 1; i < subLevels; i++ )
t << Option::dir_sep << "..";
}
t << endl << endl;
}
if(project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].findIndex("qmake_all") == -1)
project->variables()["QMAKE_INTERNAL_QMAKE_DEPS"].append("qmake_all");
writeMakeQmake(t);
t << "qmake_all:";
if ( !subdirs.isEmpty() ) {
for( it.toFirst(); it.current(); ++it) {
QString subdir = (*it)->directory;
+ QString profile = (*it)->profile;
int subLevels = subdir.contains(Option::dir_sep) + 1;
t << "\n\t"
<< "cd " << subdir << "\n\t";
int lastSlash = subdir.findRev(Option::dir_sep);
if(lastSlash != -1)
subdir = subdir.mid( lastSlash + 1 );
- t << "$(QMAKE) " << subdir << ".pro"
- << (!project->isEmpty("MAKEFILE") ? QString(" -o ") + var("MAKEFILE") : QString(""))
+ t << "$(QMAKE) "
+ << ( !profile.isEmpty() ? profile : subdir + ".pro" )
+ << " -o " << (*it)->makefile
<< " " << buildArgs() << "\n\t"
<< "@cd ..";
for(int i = 1; i < subLevels; i++ )
t << Option::dir_sep << "..";
}
} else {
// Borland make does not like empty an empty command section, so insert
// a dummy command.
t << "\n\t" << "@cd .";
}
t << endl << endl;
QString targs[] = { QString("clean"), QString("install"), QString("mocclean"), QString::null };
for(int x = 0; targs[x] != QString::null; x++) {
t << targs[x] << ": qmake_all";
if(targs[x] == "clean")
t << varGlue("QMAKE_CLEAN","\n\t-del ","\n\t-del ", "");
if (!subdirs.isEmpty()) {
for( it.toFirst(); it.current(); ++it) {
int subLevels = (*it)->directory.contains(Option::dir_sep) + 1;
bool have_dir = !(*it)->directory.isEmpty();
if(have_dir)
t << "\n\t" << "cd " << (*it)->directory;
- QString in_file;
- if((*it)->makefile != "$(MAKEFILE)")
- in_file = " -f " + (*it)->makefile;
+ QString in_file = " -f " + (*it)->makefile;
t << "\n\t" << "$(MAKE) " << in_file << " " << targs[x];
if(have_dir) {
t << "\n\t" << "@cd ..";
- for(int i = 1; i < subLevels; i++ )
+ for(int i = 1; i < subLevels; i++ )
t << Option::dir_sep << "..";
}
}
} else {
// Borland make does not like empty an empty command section, so
// insert a dummy command.
t << "\n\t" << "@cd .";
}
t << endl << endl;
}
if(project->variables()["QMAKE_NOFORCE"].isEmpty())
t << "FORCE:" << endl << endl;
}
int
-Win32MakefileGenerator::findHighestVersion(const QString &d, const
- QString &stem)
+Win32MakefileGenerator::findHighestVersion(const QString &d, const QString &stem)
{
- if(!QFile::exists(Option::fixPathToLocalOS(d)))
+ QString bd = Option::fixPathToLocalOS(d, TRUE);
+ if(!QFile::exists(bd))
return -1;
- if(!project->variables()["QMAKE_" + stem.upper() +
- "_VERSION_OVERRIDE"].isEmpty())
- return project->variables()["QMAKE_" + stem.upper() +
- "_VERSION_OVERRIDE"].first().toInt();
- QString bd = d;
- fixEnvVariables(bd);
+ if(!project->variables()["QMAKE_" + stem.upper() + "_VERSION_OVERRIDE"].isEmpty())
+ return project->variables()["QMAKE_" + stem.upper() + "_VERSION_OVERRIDE"].first().toInt();
+
QDir dir(bd);
int biggest=-1;
QStringList entries = dir.entryList();
- QRegExp regx( "(" + stem + "([0-9]*)).lib", FALSE );
- for(QStringList::Iterator it = entries.begin(); it != entries.end();
- ++it) {
+ QString dllStem = stem + QTDLL_POSTFIX;
+ QRegExp regx( "(" + dllStem + "([0-9]*)).lib", FALSE );
+ for(QStringList::Iterator it = entries.begin(); it != entries.end(); ++it) {
if(regx.exactMatch((*it)))
- biggest = QMAX(biggest, (regx.cap(1) == stem ||
- regx.cap(2).isEmpty()) ? -1 : regx.cap(2).toInt());
+ biggest = QMAX(biggest, (regx.cap(1) == dllStem ||
+ regx.cap(2).isEmpty()) ? -1 : regx.cap(2).toInt());
+ }
+ if(dir.exists(dllStem + Option::prl_ext)) {
+ QMakeProject proj;
+ if(proj.read(bd + dllStem + Option::prl_ext, QDir::currentDirPath(), TRUE)) {
+ if(!proj.isEmpty("QMAKE_PRL_VERSION"))
+ biggest = QMAX(biggest, proj.first("QMAKE_PRL_VERSION").replace(".", "").toInt());
+ }
}
return biggest;
}
bool
Win32MakefileGenerator::findLibraries(const QString &where)
{
QStringList &l = project->variables()[where];
QPtrList<MakefileDependDir> dirs;
+ {
+ QStringList &libpaths = project->variables()["QMAKE_LIBDIR"];
+ for(QStringList::Iterator libpathit = libpaths.begin(); libpathit != libpaths.end(); ++libpathit) {
+ QString r = (*libpathit), l = r;
+ fixEnvVariables(l);
+ dirs.append(new MakefileDependDir(r.replace("\"",""), l.replace("\"","")));
+ }
+ }
dirs.setAutoDelete(TRUE);
for(QStringList::Iterator it = l.begin(); it != l.end(); ) {
- QString opt = (*it);
- bool remove = FALSE;
- if(opt.startsWith("-L") || opt.startsWith("/L")) {
- QString r = opt.right(opt.length() - 2), l = Option::fixPathToLocalOS(r);
+ QChar quote;
+ bool modified_opt = FALSE, remove = FALSE;
+ QString opt = (*it).stripWhiteSpace();
+ if((opt[0] == '\'' || opt[0] == '"') && opt[(int)opt.length()-1] == opt[0]) {
+ quote = opt[0];
+ opt = opt.mid(1, opt.length()-2);
+ }
+ if(opt.startsWith("/LIBPATH:")) {
+ QString r = opt.mid(9), l = Option::fixPathToLocalOS(r);
+ dirs.append(new MakefileDependDir(r.replace("\"",""),
+ l.replace("\"","")));
+ } else if(opt.startsWith("-L") || opt.startsWith("/L")) {
+ QString r = opt.mid(2), l = Option::fixPathToLocalOS(r);
dirs.append(new MakefileDependDir(r.replace("\"",""),
l.replace("\"","")));
- remove = TRUE;
+ remove = TRUE; //we eat this switch
} else if(opt.startsWith("-l") || opt.startsWith("/l")) {
QString lib = opt.right(opt.length() - 2), out;
if(!lib.isEmpty()) {
for(MakefileDependDir *mdd = dirs.first(); mdd; mdd = dirs.next() ) {
+ QString extension;
int ver = findHighestVersion(mdd->local_dir, lib);
if(ver > 0)
- lib += QString::number(ver);
- lib += ".lib";
- if(QFile::exists(mdd->local_dir + Option::dir_sep + lib)) {
- out = mdd->real_dir + Option::dir_sep + lib;
+ extension += QString::number(ver);
+ extension += ".lib";
+ if(QFile::exists(mdd->local_dir + Option::dir_sep + lib + Option::prl_ext) ||
+ QFile::exists(mdd->local_dir + Option::dir_sep + lib + extension)) {
+ out = mdd->real_dir + Option::dir_sep + lib + extension;
break;
}
}
}
- if(out.isEmpty())
- remove = TRUE;
- else
+ if(out.isEmpty()) {
+ remove = TRUE; //just eat it since we cannot find one..
+ } else {
+ modified_opt = TRUE;
(*it) = out;
+ }
} else if(!QFile::exists(Option::fixPathToLocalOS(opt))) {
- QString dir, file = opt;
+ QPtrList<MakefileDependDir> lib_dirs;
+ QString file = opt;
int slsh = file.findRev(Option::dir_sep);
if(slsh != -1) {
- dir = file.left(slsh+1);
+ QString r = file.left(slsh+1), l = r;
+ fixEnvVariables(l);
+ lib_dirs.append(new MakefileDependDir(r.replace("\"",""), l.replace("\"","")));
file = file.right(file.length() - slsh - 1);
- }
- if ( !(project->variables()["QMAKE_QT_DLL"].isEmpty() && (file == "qt.lib" || file == "qt-mt.lib")) ) {
- if(file.endsWith(".lib")) {
- file = file.left(file.length() - 4);
- if(!file.at(file.length()-1).isNumber()) {
- int ver = findHighestVersion(dir, file);
+ } else {
+ lib_dirs = dirs;
+ }
+ if(file.endsWith(".lib")) {
+ file = file.left(file.length() - 4);
+ if(!file.at(file.length()-1).isNumber()) {
+ for(MakefileDependDir *mdd = lib_dirs.first(); mdd; mdd = lib_dirs.next() ) {
+ QString lib_tmpl(file + "%1" + ".lib");
+ int ver = findHighestVersion(mdd->local_dir, file);
if(ver != -1) {
- file = QString(dir + file + "%1" + ".lib");
if(ver)
- (*it) = file.arg(ver);
+ lib_tmpl = lib_tmpl.arg(ver);
else
- (*it) = file.arg("");
+ lib_tmpl = lib_tmpl.arg("");
+ if(slsh != -1) {
+ QString dir = mdd->real_dir;
+ if(!dir.endsWith(Option::dir_sep))
+ dir += Option::dir_sep;
+ lib_tmpl.prepend(dir);
+ }
+ modified_opt = TRUE;
+ (*it) = lib_tmpl;
+ break;
}
}
}
}
}
- if(remove)
+ if(remove) {
it = l.remove(it);
- else
+ } else {
+ if(!quote.isNull() && modified_opt)
+ (*it) = quote + (*it) + quote;
++it;
+ }
}
return TRUE;
}
void
Win32MakefileGenerator::processPrlFiles()
{
QDict<void> processed;
QPtrList<MakefileDependDir> libdirs;
libdirs.setAutoDelete(TRUE);
{
QStringList &libpaths = project->variables()["QMAKE_LIBDIR"];
for(QStringList::Iterator libpathit = libpaths.begin(); libpathit != libpaths.end(); ++libpathit) {
QString r = (*libpathit), l = r;
fixEnvVariables(l);
libdirs.append(new MakefileDependDir(r.replace("\"",""),
l.replace("\"","")));
}
}
for(bool ret = FALSE; TRUE; ret = FALSE) {
//read in any prl files included..
QStringList l_out;
QString where = "QMAKE_LIBS";
if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS"))
where = project->first("QMAKE_INTERNAL_PRL_LIBS");
QStringList &l = project->variables()[where];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString opt = (*it);
- if(opt.left(1) == "/") {
- if(opt.left(9) == "/LIBPATH:") {
+ if(opt.startsWith("/")) {
+ if(opt.startsWith("/LIBPATH:")) {
QString r = opt.mid(9), l = r;
fixEnvVariables(l);
libdirs.append(new MakefileDependDir(r.replace("\"",""),
l.replace("\"","")));
}
} else {
if(!processed[opt]) {
if(processPrlFile(opt)) {
processed.insert(opt, (void*)1);
ret = TRUE;
} else {
for(MakefileDependDir *mdd = libdirs.first(); mdd; mdd = libdirs.next() ) {
QString prl = mdd->local_dir + Option::dir_sep + opt;
if(processed[prl]) {
break;
} else if(processPrlFile(prl)) {
processed.insert(prl, (void*)1);
ret = TRUE;
break;
}
}
}
}
}
diff --git a/qmake/include/private/qapplication_p.h b/qmake/include/private/qapplication_p.h
index 6fab6b3..280992e 100644
--- a/qmake/include/private/qapplication_p.h
+++ b/qmake/include/private/qapplication_p.h
@@ -52,36 +52,37 @@
//
//
#ifndef QT_H
#endif // QT_H
class QWidget;
class QObject;
class QClipboard;
class QKeyEvent;
class QMouseEvent;
class QWheelEvent;
extern Q_EXPORT bool qt_modal_state();
extern Q_EXPORT void qt_enter_modal( QWidget* );
extern Q_EXPORT void qt_leave_modal( QWidget* );
extern bool qt_is_gui_used;
#ifndef QT_NO_CLIPBOARD
extern QClipboard *qt_clipboard;
#endif
#if defined (Q_OS_WIN32) || defined (Q_OS_CYGWIN)
extern Qt::WindowsVersion qt_winver;
+#elif defined (Q_OS_MAC)
+extern Qt::MacintoshVersion qt_macver;
#endif
#if defined (Q_WS_X11)
extern int qt_ncols_option;
#endif
extern void qt_dispatchEnterLeave( QWidget*, QWidget* );
-
-
+extern bool qt_tryModalHelper( QWidget *, QWidget ** = 0 );
#endif
diff --git a/qmake/include/private/qcom_p.h b/qmake/include/private/qcom_p.h
index 6e7e1c8..5bed8c8c 100644
--- a/qmake/include/private/qcom_p.h
+++ b/qmake/include/private/qcom_p.h
@@ -12,50 +12,50 @@
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QCOM_H
-#define QCOM_H
+#ifndef QCOM_P_H
+#define QCOM_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of a number of Qt sources files. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//
#ifndef QT_H
#include "qstringlist.h"
#include "quuid.h"
#endif // QT_H
#ifndef QT_NO_COMPONENT
class QObject;
struct QUInterfaceDescription;
struct QUObject;
@@ -313,25 +313,25 @@ public: \
{ return qt_ucm_verification_data; } \
Q_EXTERN_C __declspec(dllexport) QUnknownInterface* \
__stdcall ucm_instantiate()
# else
# define Q_EXPORT_COMPONENT() \
Q_UCM_VERIFICATION_DATA \
Q_EXTERN_C __declspec(dllexport) \
const char *qt_ucm_query_verification_data() \
{ return qt_ucm_verification_data; } \
Q_EXTERN_C __declspec(dllexport) QUnknownInterface* ucm_instantiate()
# endif
# else
# define Q_EXPORT_COMPONENT() \
Q_UCM_VERIFICATION_DATA \
Q_EXTERN_C \
const char *qt_ucm_query_verification_data() \
{ return qt_ucm_verification_data; } \
Q_EXTERN_C QUnknownInterface* ucm_instantiate()
# endif
# define Q_EXPORT_INTERFACE() Q_EXPORT_COMPONENT()
#endif
#endif //QT_NO_COMPONENT
-#endif //QCOM_H
+#endif //QCOM_P_H
diff --git a/qmake/include/private/qcomlibrary_p.h b/qmake/include/private/qcomlibrary_p.h
index f52f679..3f440c0 100644
--- a/qmake/include/private/qcomlibrary_p.h
+++ b/qmake/include/private/qcomlibrary_p.h
@@ -12,68 +12,68 @@
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QUCOMLIBRARY_H
-#define QUCOMLIBRARY_H
+#ifndef QCOMLIBRARY_P_H
+#define QCOMLIBRARY_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of a number of Qt sources files. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//
#ifndef QT_H
#include "qcom_p.h"
#include "qlibrary.h"
#endif // QT_H
#ifndef QT_NO_COMPONENT
class Q_EXPORT QComLibrary : public QLibrary
{
public:
QComLibrary( const QString &filename );
~QComLibrary();
bool unload();
QRESULT queryInterface( const QUuid &iid, QUnknownInterface **iface );
uint qtVersion();
private:
void createInstanceInternal();
QUnknownInterface *entry;
QLibraryInterface *libiface;
uint qt_version;
};
#endif //QT_NO_COMPONENT
-#endif // QUCOMLIBRARY_H
+#endif
diff --git a/qmake/include/private/qcomplextext_p.h b/qmake/include/private/qcomplextext_p.h
index 2132522..c3aeeb1 100644
--- a/qmake/include/private/qcomplextext_p.h
+++ b/qmake/include/private/qcomplextext_p.h
@@ -1,63 +1,61 @@
/****************************************************************************
** $Id$
**
** Internal header file.
**
-** Created :
-**
-** Copyright (C) 2001 Trolltech AS. All rights reserved.
+** Copyright (C) 2001-2002 Trolltech AS. All rights reserved.
**
** This file is part of the kernel module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QCOMPLEXTEXT_H
-#define QCOMPLEXTEXT_H
+#ifndef QCOMPLEXTEXT_P_H
+#define QCOMPLEXTEXT_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of Qt Remote Control. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
//
#ifndef QT_H
#include <qstring.h>
#include <qpointarray.h>
#include <qfont.h>
#include <qpainter.h>
#include <qptrlist.h>
#include <qshared.h>
#endif // QT_H
#ifndef QT_NO_COMPLEXTEXT
diff --git a/qmake/include/private/qcomponentfactory_p.h b/qmake/include/private/qcomponentfactory_p.h
index 1ac973f..d5c1743 100644
--- a/qmake/include/private/qcomponentfactory_p.h
+++ b/qmake/include/private/qcomponentfactory_p.h
@@ -14,60 +14,60 @@
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QCOMPONENTFACTORY_H
-#define QCOMPONENTFACTORY_H
+#ifndef QCOMPONENTFACTORY_P_H
+#define QCOMPONENTFACTORY_P_H
#ifndef QT_H
#include "qcom_p.h"
#endif // QT_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of a number of Qt sources files. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//
#ifndef QT_NO_COMPONENT
class Q_EXPORT QComponentFactory
{
public:
static QRESULT createInstance( const QString &cid, const QUuid &iid, QUnknownInterface** instance, QUnknownInterface *outer = 0 );
static QRESULT registerServer( const QString &filename );
static QRESULT unregisterServer( const QString &filename );
static bool registerComponent( const QUuid &cid, const QString &filename, const QString &name = QString::null,
int version = 0, const QString &description = QString::null );
static bool unregisterComponent( const QUuid &cid );
};
#endif // QT_NO_COMPONENT
-#endif // QCOMPONENTFACTORY_H
+#endif // QCOMPONENTFACTORY_P_H
diff --git a/qmake/include/private/qcriticalsection_p.h b/qmake/include/private/qcriticalsection_p.h
index 7d9feca..8dacc62 100644
--- a/qmake/include/private/qcriticalsection_p.h
+++ b/qmake/include/private/qcriticalsection_p.h
@@ -12,50 +12,50 @@
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QCRITICALSECTION_H
-#define QCRITICALSECTION_H
+#ifndef QCRITICALSECTION_P_H
+#define QCRITICALSECTION_P_H
#ifndef QT_H
#endif // QT_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of Qt Remote Control. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
//
#if defined(QT_THREAD_SUPPORT)
#if defined(Q_WS_WIN)
/*
QCriticalSection
*/
diff --git a/qmake/include/private/qdir_p.h b/qmake/include/private/qdir_p.h
index 35dba28..a6c7c91 100644
--- a/qmake/include/private/qdir_p.h
+++ b/qmake/include/private/qdir_p.h
@@ -1,78 +1,79 @@
/****************************************************************************
** $Id$
**
** Definition of some private QDir functions.
**
-** Created : 2000.11.06
+** Created : 001106
**
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QDIR_P_H
#define QDIR_P_H
-
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of qdir.cpp and qdir_*.cpp.
// This header file may change from version to version without notice,
// or even be removed.
//
// We mean it.
//
//
#ifndef QT_H
+#include "qregexp.h"
+#include "qvaluelist.h"
#endif // QT_H
-extern QStringList qt_makeFilterList( const QString & );
-
+extern QValueList<QRegExp> qt_makeFilterList( const QString & );
+extern bool qt_matchFilterList( const QValueList<QRegExp> &, const QString & );
extern int qt_cmp_si_sortSpec;
#if defined(Q_C_CALLBACKS)
extern "C" {
#endif
#ifdef Q_OS_TEMP
extern int __cdecl qt_cmp_si( const void *, const void * );
#else
extern int qt_cmp_si( const void *, const void * );
#endif
#if defined(Q_C_CALLBACKS)
}
#endif
#endif // QDIR_P_H
diff --git a/qmake/include/private/qeffects_p.h b/qmake/include/private/qeffects_p.h
index 4178b6f..3b6c212 100644
--- a/qmake/include/private/qeffects_p.h
+++ b/qmake/include/private/qeffects_p.h
@@ -1,30 +1,30 @@
/****************************************************************************
** $Id$
**
** Definition of QEffects functions
**
-** Created : 2000.06.21
+** Created : 000621
**
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of the widgets module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
diff --git a/qmake/include/private/qeventloop_p.h b/qmake/include/private/qeventloop_p.h
index b64d0df..3a5350e 100644
--- a/qmake/include/private/qeventloop_p.h
+++ b/qmake/include/private/qeventloop_p.h
@@ -1,74 +1,138 @@
+/****************************************************************************
+** $Id$
+**
+** Definition of QEventLoop class
+**
+** Copyright (C) 1992-2003 Trolltech AS. All rights reserved.
+**
+** This file is part of the kernel module of the Qt GUI Toolkit.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses for Qt/Embedded may use this file in accordance with the
+** Qt Embedded Commercial License Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
#ifndef QEVENTLOOP_P_H
#define QEVENTLOOP_P_H
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
+
#include "qplatformdefs.h"
+
+// SCO OpenServer redefines raise -> kill
+#if defined(raise)
+# undef raise
+#endif
+
#include "qwindowdefs.h"
class QSocketNotifier;
-#if defined(Q_OS_UNIX)
+#if defined(Q_OS_UNIX) || defined (Q_WS_WIN)
#include <qptrlist.h>
+#endif // Q_OS_UNIX || Q_WS_WIN
+#if defined(Q_OS_UNIX)
struct QSockNot
{
QSocketNotifier *obj;
int fd;
fd_set *queue;
};
class QSockNotType
{
public:
QSockNotType();
~QSockNotType();
QPtrList<QSockNot> *list;
fd_set select_fds;
fd_set enabled_fds;
fd_set pending_fds;
};
#endif // Q_OS_UNIX
+#if defined(Q_WS_WIN)
+struct QSockNot {
+ QSocketNotifier *obj;
+ int fd;
+};
+#endif // Q_WS_WIN
class QEventLoopPrivate
{
public:
QEventLoopPrivate()
{
reset();
}
void reset() {
looplevel = 0;
quitcode = 0;
quitnow = FALSE;
exitloop = FALSE;
+ shortcut = FALSE;
}
int looplevel;
int quitcode;
- bool quitnow;
- bool exitloop;
+ unsigned int quitnow : 1;
+ unsigned int exitloop : 1;
+ unsigned int shortcut : 1;
#if defined(Q_WS_MAC)
EventLoopTimerRef select_timer;
#endif
#if defined(Q_WS_X11)
int xfd;
#endif // Q_WS_X11
#if defined(Q_OS_UNIX)
int thread_pipe[2];
// pending socket notifiers list
QPtrList<QSockNot> sn_pending_list;
// highest fd for all socket notifiers
int sn_highest;
// 3 socket notifier types - read, write and exception
QSockNotType sn_vec[3];
#endif
+
+#ifdef Q_WS_WIN
+ // pending socket notifiers list
+ QPtrList<QSockNot> sn_pending_list;
+#endif // Q_WS_WIN
+
};
#endif // QEVENTLOOP_P_H
diff --git a/qmake/include/private/qfontcodecs_p.h b/qmake/include/private/qfontcodecs_p.h
index 8222f98..54b0ac1 100644
--- a/qmake/include/private/qfontcodecs_p.h
+++ b/qmake/include/private/qfontcodecs_p.h
@@ -30,50 +30,50 @@
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QFONTCODECS_P_H
#define QFONTCODECS_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of qfontencodings_x11.cpp and qfont_x11.cpp. This header file may
// change from version to version without notice, or even be removed.
//
// We mean it.
//
//
#ifndef QT_H
-#include <qglobal.h>
-#include <qtextcodec.h>
+#include "qglobal.h"
+#include "qtextcodec.h"
#endif // QT_H
#ifndef QT_NO_CODECS
#ifndef QT_NO_BIG_CODECS
class QJpUnicodeConv;
class QFontJis0201Codec : public QTextCodec
{
public:
QFontJis0201Codec();
const char *name() const;
int mibEnum() const;
#if !defined(Q_NO_USING_KEYWORD)
using QTextCodec::fromUnicode;
#endif
QCString fromUnicode(const QString& uc, int& lenInOut ) const;
diff --git a/qmake/include/private/qfontdata_p.h b/qmake/include/private/qfontdata_p.h
index 917d14f..1eaf80c 100644
--- a/qmake/include/private/qfontdata_p.h
+++ b/qmake/include/private/qfontdata_p.h
@@ -141,48 +141,49 @@ public:
#endif // Q_WS_X11
#ifdef Q_WS_WIN
class QFontStruct : public QShared
{
public:
QFontStruct( const QString &key );
~QFontStruct() { reset(); }
bool dirty() const { return hfont == 0; }
HDC dc() const;
HFONT font() const { return hfont; }
const TEXTMETRICA *textMetricA() const { return &tm.a; }
const TEXTMETRICW *textMetricW() const { return &tm.w; }
QString key() const { return k; }
void reset();
QString k;
HDC hdc;
HFONT hfont;
uint stockFont:1;
uint paintDevice:1;
+ uint useTextOutA:1;
union {
TEXTMETRICW w;
TEXTMETRICA a;
} tm;
int lw;
int cache_cost;
// friend void QFont::initFontInfo() const;
};
#endif // Q_WS_WIN
#if defined( Q_WS_MAC )
#if defined( Q_WS_MACX )
# define QMAC_FONT_ATSUI
#endif
#include "qt_mac.h"
class QMacFontInfo;
class QFontStruct : public QShared
{
public:
inline QFontStruct() : QShared(), info(NULL), fnum(-1), cache_cost(0), internal_fi(NULL) { }
#if defined( QMAC_FONT_ATSUI ) && 0
@@ -392,49 +393,49 @@ public:
int x11Screen;
#endif // Q_WS_X11
QPaintDevice *paintdevice;
#ifdef Q_WS_WIN
void load();
void initFontInfo();
HFONT create( bool *stockFont, HDC hdc = 0, bool compatMode = FALSE );
QFontStruct *fin;
void buildCache( HDC hdc, const QString &str, int pos, int len, TextRun *cache );
void drawText( HDC hdc, int x, int y, TextRun *cache );
#endif // Q_WS_WIN
#ifdef Q_WS_QWS
void load();
QFontStruct *fin;
int textWidth( const QString &str, int pos, int len, TextRun *cache );
void drawText( QGfx *gfx, int x, int y, const TextRun *cache );
#endif
#if defined( Q_WS_MAC )
void macSetFont(QPaintDevice *);
- void drawText(int x, int y, QString s, int len, QPaintDevice *dev, const QRegion *rgn);
+ void drawText(int x, int y, const QString &s, int from, int len, QPaintDevice *dev, const QRegion *rgn, int dir);
void computeLineWidth();
void load();
QFontStruct *fin;
#endif
};
inline QFontPrivate::QFontPrivate()
: QShared(), exactMatch(FALSE), lineWidth(1)
{
#if defined(Q_WS_WIN) || defined(Q_WS_QWS) || defined(Q_WS_MAC)
fin = 0;
#endif // Q_WS_WIN || Q_WS_QWS
#if defined(Q_WS_X11)
x11Screen = QPaintDevice::x11AppScreen();
#endif // Q_WS_X11
paintdevice = 0;
}
inline QFontPrivate::QFontPrivate(const QFontPrivate &fp)
: QShared(), request(fp.request), actual(fp.actual),
exactMatch(fp.exactMatch), lineWidth(1)
{
diff --git a/qmake/include/private/qgfxdriverinterface_p.h b/qmake/include/private/qgfxdriverinterface_p.h
index 1782ed4..e8259ac 100644
--- a/qmake/include/private/qgfxdriverinterface_p.h
+++ b/qmake/include/private/qgfxdriverinterface_p.h
@@ -9,48 +9,60 @@
**
** This file is part of the kernel module of the Qt GUI Toolkit.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses for Qt/Embedded may use this file in accordance with the
** Qt Embedded Commercial License Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QGFXDRIVERINTERFACE_H
-#define QGFXDRIVERINTERFACE_H
+#ifndef QGFXDRIVERINTERFACE_P_H
+#define QGFXDRIVERINTERFACE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
#ifndef QT_H
#include <private/qcom_p.h>
#endif // QT_H
#ifndef QT_NO_COMPONENT
// {449EC6C6-DF3E-43E3-9E57-354A3D05AB34}
#ifndef IID_QGfxDriver
#define IID_QGfxDriver QUuid( 0x449ec6c6, 0xdf3e, 0x43e3, 0x9e, 0x57, 0x35, 0x4a, 0x3d, 0x05, 0xab, 0x34)
#endif
class QScreen;
struct Q_EXPORT QGfxDriverInterface : public QFeatureListInterface
{
virtual QScreen* create( const QString& driver, int displayId ) = 0;
};
#endif // QT_NO_COMPONENT
-#endif // QGFXDRIVERINTERFACE_H
+#endif // QGFXDRIVERINTERFACE_P_H
diff --git a/qmake/include/private/qgpluginmanager_p.h b/qmake/include/private/qgpluginmanager_p.h
index e0c0e78..2e4e9c5 100644
--- a/qmake/include/private/qgpluginmanager_p.h
+++ b/qmake/include/private/qgpluginmanager_p.h
@@ -1,61 +1,61 @@
/**********************************************************************
** $Id$
**
** Definition of QGPluginManager class
**
-** Copyright (C) 2000-2001 Trolltech AS. All rights reserved.
+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QGPLUGINMANAGER_H
-#define QGPLUGINMANAGER_H
+#ifndef QGPLUGINMANAGER_P_H
+#define QGPLUGINMANAGER_P_H
#ifndef QT_H
#include "qdict.h"
#include "qlibrary.h"
#include "quuid.h"
#include "qstringlist.h"
#include "qcom_p.h"
#endif // QT_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of a number of Qt sources files. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//
#ifndef QT_NO_COMPONENT
#if defined(Q_TEMPLATEDLL)
@@ -83,25 +83,25 @@ protected:
QRESULT queryUnknownInterface(const QString& feature, QUnknownInterface** iface) const;
QUuid interfaceId;
QDict<QLibrary> plugDict; // Dict to match feature with library
QDict<QLibrary> libDict; // Dict to match library file with library
QStringList libList;
uint casesens : 1;
uint autounload : 1;
};
inline void QGPluginManager::setAutoUnload( bool unload )
{
autounload = unload;
}
inline bool QGPluginManager::autoUnload() const
{
return autounload;
}
#endif
-#endif //QGPLUGINMANAGER_H
+#endif //QGPLUGINMANAGER_P_H
diff --git a/qmake/include/private/qimageformatinterface_p.h b/qmake/include/private/qimageformatinterface_p.h
index 5f7601c..fd4c256 100644
--- a/qmake/include/private/qimageformatinterface_p.h
+++ b/qmake/include/private/qimageformatinterface_p.h
@@ -1,75 +1,75 @@
/****************************************************************************
** $Id$
**
-** Definition of ???
+** ...
**
** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the kernel module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QIMAGEFORMATINTERFACE_H
-#define QIMAGEFORMATINTERFACE_H
+#ifndef QIMAGEFORMATINTERFACE_P_H
+#define QIMAGEFORMATINTERFACE_P_H
#ifndef QT_H
#include <private/qcom_p.h>
#endif // QT_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of internal files. This header file may change from version to version
// without notice, or even be removed.
//
// We mean it.
//
//
#ifndef QT_NO_COMPONENT
// {04903F05-54B1-4726-A849-FB5CB097CA87}
#ifndef IID_QImageFormat
#define IID_QImageFormat QUuid( 0x04903f05, 0x54b1, 0x4726, 0xa8, 0x49, 0xfb, 0x5c, 0xb0, 0x97, 0xca, 0x87 )
#endif
class QImage;
struct Q_EXPORT QImageFormatInterface : public QFeatureListInterface
{
virtual QRESULT loadImage( const QString &format, const QString &filename, QImage * ) = 0;
virtual QRESULT saveImage( const QString &format, const QString &filename, const QImage & ) = 0;
virtual QRESULT installIOHandler( const QString & ) = 0;
};
#endif // QT_NO_COMPONENT
-#endif // QIMAGEFORMATINTERFACE_H
+#endif // QIMAGEFORMATINTERFACE_P_H
diff --git a/qmake/include/private/qinputcontext_p.h b/qmake/include/private/qinputcontext_p.h
index 9ac0d2b..4d94147 100644
--- a/qmake/include/private/qinputcontext_p.h
+++ b/qmake/include/private/qinputcontext_p.h
@@ -66,56 +66,59 @@ class QString;
#ifdef Q_WS_WIN
#include <qt_windows.h>
#endif
#ifdef Q_WS_QWS
class QWSIMEvent;
#endif
class QInputContext
{
public:
#ifdef Q_WS_X11
QInputContext(QWidget *); // should be a toplevel widget
~QInputContext();
void setFocus();
void setComposePosition(int, int);
void setComposeArea(int, int, int, int);
void reset();
int lookupString(XKeyEvent *, QCString &, KeySym *, Status *) const;
void setXFontSet(const QFont &);
void *ic;
- QString text, lastcompose;
+ QString text;
QWidget *focusWidget;
bool composing;
QFont font;
XFontSet fontset;
QMemArray<bool> selectedChars;
#endif // Q_WS_X11
#ifdef Q_WS_QWS
static void translateIMEvent( QWSIMEvent *, QWidget * );
static void reset();
private:
static QWidget* focusWidget;
static QString* composition;
#endif //Q_WS_QWS
#ifdef Q_WS_WIN
static void init();
static void shutdown();
static void TranslateMessage( const MSG *msg);
static LRESULT DefWindowProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
static void setFont( const QWidget *w, const QFont & );
static void setFocusHint( int x, int y, int w, int h, const QWidget *widget );
static bool startComposition();
static bool endComposition( QWidget *fw = 0 );
static bool composition( LPARAM lparam );
+
+ static void accept( QWidget *fw = 0 );
+ static void enable( bool );
#endif
};
#endif // QINPUTCONTEXT_P_H
diff --git a/qmake/include/private/qkbddriverinterface_p.h b/qmake/include/private/qkbddriverinterface_p.h
index efc7ded..fe13487 100644
--- a/qmake/include/private/qkbddriverinterface_p.h
+++ b/qmake/include/private/qkbddriverinterface_p.h
@@ -9,48 +9,60 @@
**
** This file is part of the kernel module of the Qt GUI Toolkit.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses for Qt/Embedded may use this file in accordance with the
** Qt Embedded Commercial License Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QKBDDRIVERINTERFACE_H
-#define QKBDDRIVERINTERFACE_H
+#ifndef QKBDDRIVERINTERFACE_P_H
+#define QKBDDRIVERINTERFACE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
#ifndef QT_H
#include <private/qcom_p.h>
#endif // QT_H
#ifndef QT_NO_COMPONENT
// {C7C838EA-FC3E-4905-92AD-F479E81F1D02}
#ifndef IID_QKbdDriver
#define IID_QKbdDriver QUuid( 0xc7c838ea, 0xfc3e, 0x4905, 0x92, 0xad, 0xf4, 0x79, 0xe8, 0x1f, 0x1d, 0x02)
#endif
class QWSKeyboardHandler;
struct Q_EXPORT QKbdDriverInterface : public QFeatureListInterface
{
virtual QWSKeyboardHandler* create( const QString& driver, const QString& device ) = 0;
};
#endif // QT_NO_COMPONENT
-#endif // QKBDDRIVERINTERFACE_H
+#endif // QKBDDRIVERINTERFACE_P_H
diff --git a/qmake/include/private/qlibrary_p.h b/qmake/include/private/qlibrary_p.h
index c4dd565..1624ca5 100644
--- a/qmake/include/private/qlibrary_p.h
+++ b/qmake/include/private/qlibrary_p.h
@@ -1,30 +1,30 @@
/****************************************************************************
** $Id$
**
** Definition of an internal QLibrary class
**
-** Created : 2000-01-01
+** Created : 000101
**
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
@@ -34,51 +34,48 @@
** not clear to you.
**
**********************************************************************/
#ifndef QLIBRARY_P_H
#define QLIBRARY_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of the QLibrary class. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//
#include "qlibrary.h"
#ifndef QT_NO_LIBRARY
#ifndef QT_H
-#if defined(Q_CC_GNU)
-#warning "avoid including header file \"qwindowdefs.h\" in directory 'tools'"
-#endif
#include "qwindowdefs.h"
#endif // QT_H
class QLibraryPrivate
{
public:
QLibraryPrivate( QLibrary *lib );
#ifdef Q_WS_WIN
HINSTANCE pHnd;
#else
void *pHnd;
#endif
bool loadLibrary();
bool freeLibrary();
void *resolveSymbol( const char * );
private:
QLibrary *library;
};
#endif // QT_NO_LIBRARY
#endif // QLIBRARY_P_H
diff --git a/qmake/include/private/qlock_p.h b/qmake/include/private/qlock_p.h
new file mode 100644
index 0000000..5c261aa
--- a/dev/null
+++ b/qmake/include/private/qlock_p.h
@@ -0,0 +1,93 @@
+/****************************************************************************
+** $Id$
+**
+** Definition of QLock class. This manages interprocess locking
+**
+** Created : 20000406
+**
+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
+**
+** This file is part of the kernel module of the Qt GUI Toolkit.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses for Qt/Embedded may use this file in accordance with the
+** Qt Embedded Commercial License Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QLOCK_P_H
+#define QLOCK_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
+
+#ifndef QT_H
+#include <qstring.h>
+#endif // QT_H
+
+class QLockData;
+
+class QLock
+{
+public:
+ QLock( const QString &filename, char id, bool create = FALSE );
+ ~QLock();
+
+ enum Type { Read, Write };
+
+ bool isValid() const;
+ void lock( Type type );
+ void unlock();
+ bool locked() const;
+
+private:
+ Type type;
+ QLockData *data;
+};
+
+
+// Nice class for ensuring the lock is released.
+// Just create one on the stack and the lock is automatically released
+// when QLockHolder is destructed.
+class QLockHolder
+{
+public:
+ QLockHolder( QLock *l, QLock::Type type ) : qlock(l) {
+ qlock->lock( type );
+ }
+ ~QLockHolder() { if ( locked() ) qlock->unlock(); }
+
+ void lock( QLock::Type type ) { qlock->lock( type ); }
+ void unlock() { qlock->unlock(); }
+ bool locked() const { return qlock->locked(); }
+
+private:
+ QLock *qlock;
+};
+
+#endif
+
diff --git a/qmake/include/private/qmousedriverinterface_p.h b/qmake/include/private/qmousedriverinterface_p.h
index fd76308..42a2e3e 100644
--- a/qmake/include/private/qmousedriverinterface_p.h
+++ b/qmake/include/private/qmousedriverinterface_p.h
@@ -9,48 +9,60 @@
**
** This file is part of the kernel module of the Qt GUI Toolkit.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses for Qt/Embedded may use this file in accordance with the
** Qt Embedded Commercial License Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QMOUSEDRIVERINTERFACE_H
-#define QMOUSEDRIVERINTERFACE_H
+#ifndef QMOUSEDRIVERINTERFACE_P_H
+#define QMOUSEDRIVERINTERFACE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
#ifndef QT_H
#include <private/qcom_p.h>
#endif // QT_H
#ifndef QT_NO_COMPONENT
// {4367CF5A-F7CE-407B-8BB6-DF19AEDA2EBB}
#ifndef IID_QMouseDriver
#define IID_QMouseDriver QUuid( 0x4367cf5a, 0xf7ce, 0x407b, 0x8b, 0xb6, 0xdf, 0x19, 0xae, 0xda, 0x2e, 0xbb)
#endif
class QWSMouseHandler;
struct Q_EXPORT QMouseDriverInterface : public QFeatureListInterface
{
virtual QWSMouseHandler* create( const QString& driver, const QString &device ) = 0;
};
#endif // QT_NO_COMPONENT
-#endif // QMOUSEDRIVERINTERFACE_H
+#endif // QMOUSEDRIVERINTERFACE_P_H
diff --git a/qmake/include/private/qmutexpool_p.h b/qmake/include/private/qmutexpool_p.h
index 3d9fef7..fb84157 100644
--- a/qmake/include/private/qmutexpool_p.h
+++ b/qmake/include/private/qmutexpool_p.h
@@ -1,39 +1,75 @@
-#ifndef QMUTEXPOOL_H
-#define QMUTEXPOOL_H
+/****************************************************************************
+** $Id$
+**
+** ...
+**
+** Copyright (C) 2002 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
+#ifndef QMUTEXPOOL_P_H
+#define QMUTEXPOOL_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of QSettings. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
//
#ifdef QT_THREAD_SUPPORT
#include "qmutex.h"
#include "qmemarray.h"
class QMutexPool
{
public:
QMutexPool( bool recursive = FALSE, int size = 17 );
~QMutexPool();
QMutex *get( void *address );
private:
QMutex mutex;
- QMemArray<QMutex*> mutexes;
+ QMutex **mutexes;
+ int count;
bool recurs;
};
extern QMutexPool *qt_global_mutexpool;
#endif // QT_THREAD_SUPPORT
-#endif // QMUTEXPOOL_H
+#endif // QMUTEXPOOL_P_H
diff --git a/qmake/include/private/qpluginmanager_p.h b/qmake/include/private/qpluginmanager_p.h
index 4b64ba0..a8da10e 100644
--- a/qmake/include/private/qpluginmanager_p.h
+++ b/qmake/include/private/qpluginmanager_p.h
@@ -1,73 +1,73 @@
/****************************************************************************
** $Id$
**
** Definition of QPluginManager class
**
-** Created : 2000-01-01
+** Created : 000101
**
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QPLUGINMANAGER_H
-#define QPLUGINMANAGER_H
-
-#ifndef QT_H
-#include "qgpluginmanager_p.h"
-#endif // QT_H
+#ifndef QPLUGINMANAGER_P_H
+#define QPLUGINMANAGER_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of a number of Qt sources files. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//
+#ifndef QT_H
+#include "qgpluginmanager_p.h"
+#endif // QT_H
+
#ifndef QT_NO_COMPONENT
template<class Type>
class QPluginManager : public QGPluginManager
{
public:
QPluginManager( const QUuid& id, const QStringList& paths = QString::null, const QString &suffix = QString::null, bool cs = TRUE )
: QGPluginManager( id, paths, suffix, cs ) {}
QRESULT queryInterface(const QString& feature, Type** iface) const
{
return queryUnknownInterface( feature, (QUnknownInterface**)iface );
}
};
#endif //QT_NO_COMPONENT
-#endif //QPLUGINMANAGER_H
+#endif //QPLUGINMANAGER_P_H
diff --git a/qmake/include/private/qpsprinter_p.h b/qmake/include/private/qpsprinter_p.h
index 27a4968..692cb44 100644
--- a/qmake/include/private/qpsprinter_p.h
+++ b/qmake/include/private/qpsprinter_p.h
@@ -1,33 +1,33 @@
/**********************************************************************
** $Id$
**
** Definition of internal QPSPrinter class.
** QPSPrinter implements PostScript (tm) output via QPrinter.
**
** Created : 940927
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the kernel module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
@@ -40,49 +40,49 @@
#define QPSPRINTER_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of qpsprinter.cpp and qprinter_x11.cpp.
// This header file may change from version to version without notice,
// or even be removed.
//
// We mean it.
//
//
#ifndef QT_H
#include "qprinter.h"
#include "qtextstream.h"
#endif // QT_H
#ifndef QT_NO_PRINTER
-struct QPSPrinterPrivate;
+class QPSPrinterPrivate;
class Q_EXPORT QPSPrinter : public QPaintDevice
{
private:
// QPrinter uses these
QPSPrinter( QPrinter *, int );
~QPSPrinter();
bool cmd ( int, QPainter *, QPDevCmdParam * );
enum { NewPage = 100, AbortPrinting };
friend class QPrinter;
private:
// not used by QPrinter
QPSPrinterPrivate *d;
// Disabled copy constructor and operator=
QPSPrinter( const QPSPrinter & );
QPSPrinter &operator=( const QPSPrinter & );
};
#endif // QT_NO_PRINTER
diff --git a/qmake/include/private/qrichtext_p.h b/qmake/include/private/qrichtext_p.h
index 8e29804..9ed87cf 100644
--- a/qmake/include/private/qrichtext_p.h
+++ b/qmake/include/private/qrichtext_p.h
@@ -135,68 +135,70 @@ public:
QString anchorName;
QString anchorHref;
};
#ifndef QT_NO_TEXTCUSTOMITEM
void loseCustomItem();
#endif
union {
QTextFormat* format;
CustomData* custom;
} d;
bool isAnchor() const { return ( type & Anchor) != 0; }
bool isLink() const { return isAnchor() && !!d.custom->anchorHref; }
QString anchorName() const;
QString anchorHref() const;
void setAnchor( const QString& name, const QString& href );
private:
QTextStringChar &operator=( const QTextStringChar & ) {
//abort();
return *this;
}
+ QTextStringChar( const QTextStringChar & ) {
+ }
friend class QComplexText;
friend class QTextParagraph;
};
#if defined(Q_TEMPLATEDLL)
// MOC_SKIP_BEGIN
Q_TEMPLATE_EXTERN template class Q_EXPORT QMemArray<QTextStringChar>;
// MOC_SKIP_END
#endif
class Q_EXPORT QTextString
{
public:
QTextString();
QTextString( const QTextString &s );
virtual ~QTextString();
- static QString toString( const QMemArray<QTextStringChar> &data );
- QString toString() const;
+ static QString toString( const QMemArray<QTextStringChar> &data, bool fixspaces = TRUE );
+ QString toString( bool fixspaces = TRUE ) const;
QTextStringChar &at( int i ) const;
#if defined(Q_STRICT_INLINING_RULES)
// This is for the IRIX MIPSpro o32 ABI - it fails, claiming the
// implementation to be a redefinition.
inline int length() const;
#else
int length() const;
#endif
int width( int idx ) const;
void insert( int index, const QString &s, QTextFormat *f );
void insert( int index, const QChar *unicode, int len, QTextFormat *f );
void insert( int index, QTextStringChar *c, bool doAddRefFormat = FALSE );
void truncate( int index );
void remove( int index, int len );
void clear();
void setFormat( int index, QTextFormat *f, bool useCollection );
void setBidi( bool b ) { bidi = b; }
bool isBidi() const;
bool isRightToLeft() const;
@@ -265,89 +267,89 @@ public:
// implementation to be a redefinition.
inline QTextParagraph *paragraph() const;
#else
QTextParagraph *paragraph() const;
#endif
void setParagraph( QTextParagraph*p ) { gotoPosition(p, 0 ); }
QTextDocument *document() const;
int index() const;
void setIndex( int index ) { gotoPosition(paragraph(), index ); }
void gotoPosition( QTextParagraph* p, int index = 0);
void gotoLeft();
void gotoRight();
void gotoNextLetter();
void gotoPreviousLetter();
void gotoUp();
void gotoDown();
void gotoLineEnd();
void gotoLineStart();
void gotoHome();
void gotoEnd();
void gotoPageUp( int visibleHeight );
void gotoPageDown( int visibleHeight );
- void gotoNextWord();
- void gotoPreviousWord();
+ void gotoNextWord( bool onlySpace = FALSE );
+ void gotoPreviousWord( bool onlySpace = FALSE );
void gotoWordLeft();
void gotoWordRight();
void insert( const QString &s, bool checkNewLine, QMemArray<QTextStringChar> *formatting = 0 );
void splitAndInsertEmptyParagraph( bool ind = TRUE, bool updateIds = TRUE );
bool remove();
void indent();
bool atParagStart();
bool atParagEnd();
int x() const; // x in current paragraph
int y() const; // y in current paragraph
int globalX() const;
int globalY() const;
QTextParagraph *topParagraph() const { return paras.isEmpty() ? para : paras.first(); }
int offsetX() const { return ox; } // inner document offset
int offsetY() const { return oy; } // inner document offset
int totalOffsetX() const; // total document offset
int totalOffsetY() const; // total document offset
bool place( const QPoint &pos, QTextParagraph *s ) { return place( pos, s, FALSE ); }
bool place( const QPoint &pos, QTextParagraph *s, bool link );
void restoreState();
int nestedDepth() const { return (int)indices.count(); } //### size_t/int cast
void oneUp() { if ( !indices.isEmpty() ) pop(); }
void setValid( bool b ) { valid = b; }
bool isValid() const { return valid; }
private:
enum Operation { EnterBegin, EnterEnd, Next, Prev, Up, Down };
void push();
void pop();
- void processNesting( Operation op );
+ bool processNesting( Operation op );
void invalidateNested();
void gotoIntoNested( const QPoint &globalPos );
QTextParagraph *para;
int idx, tmpIndex;
int ox, oy;
QValueStack<int> indices;
QValueStack<QTextParagraph*> paras;
QValueStack<int> xOffsets;
QValueStack<int> yOffsets;
uint valid : 1;
};
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
class Q_EXPORT QTextCommand
{
public:
enum Commands { Invalid, Insert, Delete, Format, Style };
QTextCommand( QTextDocument *d ) : doc( d ), cursor( d ) {}
virtual ~QTextCommand();
@@ -682,48 +684,49 @@ private:
int cellspacing;
int border;
int outerborder;
int stretch;
int innerborder;
int us_cp, us_ib, us_b, us_ob, us_cs;
QMap<QString, QString> attributes;
QMap<QTextCursor*, int> currCell;
Placement place;
void adjustCells( int y , int shift );
int pageBreakFor;
};
#endif
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#ifndef QT_NO_TEXTCUSTOMITEM
class QTextTableCell;
class QTextParagraph;
#endif
struct Q_EXPORT QTextDocumentSelection
{
QTextCursor startCursor, endCursor;
bool swapped;
+ Q_DUMMY_COMPARISON_OPERATOR(QTextDocumentSelection)
};
#if defined(Q_TEMPLATEDLL)
// MOC_SKIP_BEGIN
Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QColor>;
Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, bool>;
Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QTextDocumentSelection>;
Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<QTextDocument>;
// MOC_SKIP_END
#endif
class Q_EXPORT QTextDocument : public QObject
{
Q_OBJECT
#ifndef QT_NO_TEXTCUSTOMITEM
friend class QTextTableCell;
#endif
friend class QTextCursor;
friend class QTextEdit;
friend class QTextParagraph;
public:
enum SelectionIds {
@@ -818,48 +821,51 @@ public:
bool inSelection( int selId, const QPoint &pos ) const;
QStyleSheet *styleSheet() const { return sheet_; }
#ifndef QT_NO_MIME
QMimeSourceFactory *mimeSourceFactory() const { return factory_; }
#endif
QString context() const { return contxt; }
void setStyleSheet( QStyleSheet *s );
void setDefaultFormat( const QFont &font, const QColor &color );
#ifndef QT_NO_MIME
void setMimeSourceFactory( QMimeSourceFactory *f ) { if ( f ) factory_ = f; }
#endif
void setContext( const QString &c ) { if ( !c.isEmpty() ) contxt = c; }
void setUnderlineLinks( bool b );
bool underlineLinks() const { return underlLinks; }
void setPaper( QBrush *brush ) { if ( backBrush ) delete backBrush; backBrush = brush; }
QBrush *paper() const { return backBrush; }
void doLayout( QPainter *p, int w );
void draw( QPainter *p, const QRect& rect, const QColorGroup &cg, const QBrush *paper = 0 );
+ void eraseParagraphEmptyArea( QTextParagraph *parag, QPainter *p, const QColorGroup &cg );
+ bool useDoubleBuffer( QTextParagraph *parag, QPainter *p );
+
void drawParagraph( QPainter *p, QTextParagraph *parag, int cx, int cy, int cw, int ch,
QPixmap *&doubleBuffer, const QColorGroup &cg,
bool drawCursor, QTextCursor *cursor, bool resetChanged = TRUE );
QTextParagraph *draw( QPainter *p, int cx, int cy, int cw, int ch, const QColorGroup &cg,
bool onlyChanged = FALSE, bool drawCursor = FALSE, QTextCursor *cursor = 0,
bool resetChanged = TRUE );
#ifndef QT_NO_TEXTCUSTOMITEM
void registerCustomItem( QTextCustomItem *i, QTextParagraph *p );
void unregisterCustomItem( QTextCustomItem *i, QTextParagraph *p );
#endif
void setFlow( QTextFlow *f );
void takeFlow();
QTextFlow *flow() const { return flow_; }
bool isPageBreakEnabled() const { return pages; }
void setPageBreakEnabled( bool b ) { pages = b; }
void setUseFormatCollection( bool b ) { useFC = b; }
bool useFormatCollection() const { return useFC; }
#ifndef QT_NO_TEXTCUSTOMITEM
QTextTableCell *tableCell() const { return tc; }
void setTableCell( QTextTableCell *c ) { tc = c; }
@@ -1046,48 +1052,49 @@ protected:
class Q_EXPORT QTextStyleCommand : public QTextCommand
{
public:
QTextStyleCommand( QTextDocument *d, int fParag, int lParag, const QByteArray& beforeChange );
virtual ~QTextStyleCommand() {}
Commands type() const { return Style; }
QTextCursor *execute( QTextCursor *c );
QTextCursor *unexecute( QTextCursor *c );
static QByteArray readStyleInformation( QTextDocument* d, int fParag, int lParag );
static void writeStyleInformation( QTextDocument* d, int fParag, const QByteArray& style );
private:
int firstParag, lastParag;
QByteArray before;
QByteArray after;
};
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
struct Q_EXPORT QTextParagraphSelection
{
int start, end;
+ Q_DUMMY_COMPARISON_OPERATOR(QTextParagraphSelection)
};
struct Q_EXPORT QTextLineStart
{
QTextLineStart() : y( 0 ), baseLine( 0 ), h( 0 )
#ifndef QT_NO_COMPLEXTEXT
, bidicontext( 0 )
#endif
{ }
QTextLineStart( ushort y_, ushort bl, ushort h_ ) : y( y_ ), baseLine( bl ), h( h_ ),
w( 0 )
#ifndef QT_NO_COMPLEXTEXT
, bidicontext( 0 )
#endif
{ }
#ifndef QT_NO_COMPLEXTEXT
QTextLineStart( QBidiContext *c, QBidiStatus s ) : y(0), baseLine(0), h(0),
status( s ), bidicontext( c ) { if ( bidicontext ) bidicontext->ref(); }
#endif
virtual ~QTextLineStart()
{
#ifndef QT_NO_COMPLEXTEXT
if ( bidicontext && bidicontext->deref() )
@@ -1115,89 +1122,87 @@ public:
#endif
int w;
private:
#ifndef QT_NO_COMPLEXTEXT
QBidiContext *bidicontext;
#endif
};
#if defined(Q_TEMPLATEDLL)
// MOC_SKIP_BEGIN
Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QTextParagraphSelection>;
Q_TEMPLATE_EXTERN template class Q_EXPORT QMap<int, QTextLineStart*>;
// MOC_SKIP_END
#endif
class Q_EXPORT QTextParagraphData
{
public:
QTextParagraphData() {}
virtual ~QTextParagraphData();
virtual void join( QTextParagraphData * );
};
-class Q_EXPORT QTextParagraphPseudoDocument
-{
-public:
- QTextParagraphPseudoDocument();
- ~QTextParagraphPseudoDocument();
- QRect docRect;
- QTextFormatter *pFormatter;
- QTextCommandHistory *commandHistory;
- int minw;
- int wused;
-};
+class QTextParagraphPseudoDocument;
+
+class QSyntaxHighlighter;
-//nase
class Q_EXPORT QTextParagraph
{
friend class QTextDocument;
friend class QTextCursor;
+ friend class QSyntaxHighlighter;
public:
QTextParagraph( QTextDocument *d, QTextParagraph *pr = 0, QTextParagraph *nx = 0, bool updateIds = TRUE );
virtual ~QTextParagraph();
QTextString *string() const;
QTextStringChar *at( int i ) const; // maybe remove later
int leftGap() const;
int length() const; // maybe remove later
void setListStyle( QStyleSheetItem::ListStyle ls ) { lstyle = ls; changed = TRUE; }
QStyleSheetItem::ListStyle listStyle() const { return lstyle; }
void setListItem( bool li );
bool isListItem() const { return litem; }
void setListValue( int v ) { list_val = v; }
int listValue() const { return list_val > 0 ? list_val : -1; }
void setListDepth( int depth );
int listDepth() const { return ldepth; }
// void setFormat( QTextFormat *fm );
// QTextFormat *paragFormat() const;
+#if defined(Q_STRICT_INLINING_RULES)
+ // This is for the IRIX MIPSpro o32 ABI - it fails, claiming the
+ // implementation to be a redefinition.
+ inline QTextDocument *document() const;
+#else
QTextDocument *document() const;
+#endif
QTextParagraphPseudoDocument *pseudoDocument() const;
QRect rect() const;
void setHeight( int h ) { r.setHeight( h ); }
void show();
void hide();
bool isVisible() const { return visible; }
QTextParagraph *prev() const;
QTextParagraph *next() const;
void setPrev( QTextParagraph *s );
void setNext( QTextParagraph *s );
void insert( int index, const QString &s );
void insert( int index, const QChar *unicode, int len );
void append( const QString &s, bool reallyAtEnd = FALSE );
void truncate( int index );
void remove( int index, int len );
void join( QTextParagraph *s );
void invalidate( int chr );
void move( int &dy );
void format( int start = -1, bool doMove = TRUE );
@@ -1575,68 +1580,80 @@ private:
// MOC_SKIP_BEGIN
Q_TEMPLATE_EXTERN template class Q_EXPORT QDict<QTextFormat>;
// MOC_SKIP_END
#endif
class Q_EXPORT QTextFormatCollection
{
friend class QTextDocument;
friend class QTextFormat;
public:
QTextFormatCollection();
virtual ~QTextFormatCollection();
void setDefaultFormat( QTextFormat *f );
QTextFormat *defaultFormat() const;
virtual QTextFormat *format( QTextFormat *f );
virtual QTextFormat *format( QTextFormat *of, QTextFormat *nf, int flags );
virtual QTextFormat *format( const QFont &f, const QColor &c );
virtual void remove( QTextFormat *f );
virtual QTextFormat *createFormat( const QTextFormat &f ) { return new QTextFormat( f ); }
virtual QTextFormat *createFormat( const QFont &f, const QColor &c ) { return new QTextFormat( f, c, this ); }
void updateDefaultFormat( const QFont &font, const QColor &c, QStyleSheet *sheet );
- QDict<QTextFormat> dict() const { return cKey; }
QPaintDevice *paintDevice() const { return paintdevice; }
void setPaintDevice( QPaintDevice * );
private:
void updateKeys();
private:
QTextFormat *defFormat, *lastFormat, *cachedFormat;
QDict<QTextFormat> cKey;
QTextFormat *cres;
QFont cfont;
QColor ccol;
QString kof, knf;
int cflags;
QPaintDevice *paintdevice;
};
+class Q_EXPORT QTextParagraphPseudoDocument
+{
+public:
+ QTextParagraphPseudoDocument();
+ ~QTextParagraphPseudoDocument();
+ QRect docRect;
+ QTextFormatter *pFormatter;
+ QTextCommandHistory *commandHistory;
+ int minw;
+ int wused;
+ QTextFormatCollection collection;
+};
+
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
inline int QTextString::length() const
{
return data.size();
}
inline int QTextParagraph::length() const
{
return str->length();
}
inline QRect QTextParagraph::rect() const
{
return r;
}
inline QTextParagraph *QTextCursor::paragraph() const
{
return para;
}
inline int QTextCursor::index() const
{
@@ -1807,48 +1824,54 @@ inline void QTextDocument::setTabArray( int *a )
inline void QTextDocument::setTabStops( int tw )
{
tStopWidth = tw;
}
inline QString QTextDocument::originalText() const
{
if ( oTextValid )
return oText;
return text();
}
inline void QTextDocument::setFlow( QTextFlow *f )
{
if ( flow_ )
delete flow_;
flow_ = f;
}
inline void QTextDocument::takeFlow()
{
flow_ = 0;
}
+inline bool QTextDocument::useDoubleBuffer( QTextParagraph *parag, QPainter *p )
+{
+ return ( !parag->document()->parent() || parag->document()->nextDoubleBuffered ) &&
+ ( !p || !p->device() || p->device()->devType() != QInternal::Printer );
+}
+
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
inline QColor QTextFormat::color() const
{
return col;
}
inline QFont QTextFormat::font() const
{
return fn;
}
inline bool QTextFormat::isMisspelled() const
{
return missp;
}
inline QTextFormat::VerticalAlignment QTextFormat::vAlign() const
{
return ha;
}
inline bool QTextFormat::operator==( const QTextFormat &f ) const
{
diff --git a/qmake/include/private/qsettings_p.h b/qmake/include/private/qsettings_p.h
index 18d118b..095291c 100644
--- a/qmake/include/private/qsettings_p.h
+++ b/qmake/include/private/qsettings_p.h
@@ -73,49 +73,49 @@ public:
QSettingsPrivate( QSettings::Format format );
~QSettingsPrivate();
QSettingsGroup readGroup();
void removeGroup(const QString &);
void writeGroup(const QString &, const QString &);
QDateTime modificationTime();
QStringList searchPaths;
QMap<QString,QSettingsHeading> headings;
QString group;
QString heading;
/*### static data brings threading trouble
static QString *defProduct;
static QString *defDomain;
*/
QValueStack<QString> groupStack;
QString groupPrefix;
bool groupDirty :1;
bool modified :1;
bool globalScope :1;
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
// system dependent implementations to use the
// system specific setting database (ie. registry on Windows)
QSettingsSysPrivate *sysd;
void sysInit();
void sysClear();
#if !defined(Q_NO_BOOL_TYPE)
bool sysWriteEntry( const QString &, bool );
#endif
bool sysWriteEntry( const QString &, double );
bool sysWriteEntry( const QString &, int );
bool sysWriteEntry( const QString &, const QString & );
bool sysWriteEntry( const QString &, const QStringList & );
bool sysWriteEntry( const QString &, const QStringList &, const QChar& sep );
QStringList sysEntryList(const QString &) const;
QStringList sysSubkeyList(const QString &) const;
QStringList sysReadListEntry( const QString &, bool * = 0 ) const;
QStringList sysReadListEntry( const QString &, const QChar& sep, bool * = 0 ) const;
QString sysReadEntry( const QString &, const QString &def = QString::null, bool * = 0 ) const;
int sysReadNumEntry( const QString &, int def = 0, bool * = 0 ) const;
double sysReadDoubleEntry( const QString &, double def = 0, bool * = 0 ) const;
diff --git a/qmake/include/private/qsharedmemory_p.h b/qmake/include/private/qsharedmemory_p.h
index 4a8339d..927de89 100644
--- a/qmake/include/private/qsharedmemory_p.h
+++ b/qmake/include/private/qsharedmemory_p.h
@@ -1,84 +1,87 @@
/****************************************************************************
** $Id$
**
** Includes system files for shared memory
**
** Created : 020124
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2002 Trolltech AS. All rights reserved.
**
** This file is part of the kernel module of the Qt GUI Toolkit.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses for Qt/Embedded may use this file in accordance with the
** Qt Embedded Commercial License Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
+#ifndef QSHAREDMEMORY_P_H
+#define QSHAREDMEMORY_P_H
+
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of qapplication_qws.cpp and qgfxvnc_qws.cpp. This header file may
// change from version to version without notice, or even be removed.
//
+// We mean it.
+//
//
-
-#if !defined(QT_QSHM_H)
-#define QT_QSHM_H
#include <qstring.h>
#if !defined (QT_QWS_NO_SHM)
#include <sys/types.h>
#include <sys/ipc.h>
class QSharedMemory {
public:
QSharedMemory(){};
QSharedMemory(int, QString, char c = 'Q');
~QSharedMemory(){};
bool create();
void destroy();
bool attach();
void detach();
void setPermissions(mode_t mode);
int size();
void * base() { return shmBase; };
private:
void *shmBase;
int shmSize;
QString shmFile;
char character;
#if defined(QT_POSIX_QSHM)
int shmFD;
#else
int shmId;
key_t key;
int idInitted;
#endif
};
#endif
+
#endif
diff --git a/qmake/include/private/qsqldriverinterface_p.h b/qmake/include/private/qsqldriverinterface_p.h
index 8957b86..8a39ddf 100644
--- a/qmake/include/private/qsqldriverinterface_p.h
+++ b/qmake/include/private/qsqldriverinterface_p.h
@@ -1,69 +1,82 @@
/****************************************************************************
+** $Id$
**
** Definition of QSqlDriverInterface class
**
** Created : 2000-11-03
**
-** Copyright (C) 2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the sql module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QSQLDRIVERINTERFACE_H
#define QSQLDRIVERINTERFACE_H
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
+
#ifndef QT_H
#include <private/qcom_p.h>
#endif // QT_H
#if !defined( QT_MODULE_SQL ) || defined( QT_LICENSE_PROFESSIONAL )
#define QM_EXPORT_SQL
#else
#define QM_EXPORT_SQL Q_EXPORT
#endif
#ifndef QT_NO_SQL
#ifndef QT_NO_COMPONENT
// {EDDD5AD5-DF3C-400c-A711-163B72FE5F61}
#ifndef IID_QSqlDriverFactory
#define IID_QSqlDriverFactory QUuid(0xeddd5ad5, 0xdf3c, 0x400c, 0xa7, 0x11, 0x16, 0x3b, 0x72, 0xfe, 0x5f, 0x61)
#endif
class QSqlDriver;
struct QM_EXPORT_SQL QSqlDriverFactoryInterface : public QFeatureListInterface
{
virtual QSqlDriver* create( const QString& name ) = 0;
};
#endif //QT_NO_COMPONENT
#endif // QT_NO_SQL
-#endif // QSQLDRIVERINTERFACE_H
+#endif // QSQLDRIVERINTERFACE_P_H
diff --git a/qmake/include/private/qsqlextension_p.h b/qmake/include/private/qsqlextension_p.h
index 597b266..3445b47 100644
--- a/qmake/include/private/qsqlextension_p.h
+++ b/qmake/include/private/qsqlextension_p.h
@@ -30,72 +30,99 @@
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QSQLEXTENSION_P_H
#define QSQLEXTENSION_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of other Qt classes. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
//
#ifndef QT_H
#include "qmap.h"
+#include "qvaluevector.h"
#include "qstring.h"
#include "qvariant.h"
+#include "qsql.h"
#endif // QT_H
#ifndef QT_NO_SQL
#if !defined( QT_MODULE_SQL ) || defined( QT_LICENSE_PROFESSIONAL )
#define QM_EXPORT_SQL
+#define QM_TEMPLATE_EXTERN_SQL
#else
#define QM_EXPORT_SQL Q_EXPORT
+#define QM_TEMPLATE_EXTERN_SQL Q_TEMPLATE_EXTERN
#endif
+struct Param {
+ Param( const QVariant& v = QVariant(), QSql::ParameterType t = QSql::In ): value( v ), typ( t ) {}
+ QVariant value;
+ QSql::ParameterType typ;
+ Q_DUMMY_COMPARISON_OPERATOR(Param)
+};
+
+struct Holder {
+ Holder( const QString& hldr = QString::null, int pos = -1 ): holderName( hldr ), holderPos( pos ) {}
+ bool operator==( const Holder& h ) const { return h.holderPos == holderPos && h.holderName == holderName; }
+ bool operator!=( const Holder& h ) const { return h.holderPos != holderPos || h.holderName != holderName; }
+ QString holderName;
+ int holderPos;
+};
+
#if defined(Q_TEMPLATEDLL)
-Q_TEMPLATE_EXTERN template class QM_EXPORT_SQL QMap<QString,QVariant>;
-Q_TEMPLATE_EXTERN template class QM_EXPORT_SQL QMap<int,QString>;
+QM_TEMPLATE_EXTERN_SQL template class QM_EXPORT_SQL QMap<QString,Param>;
+QM_TEMPLATE_EXTERN_SQL template class QM_EXPORT_SQL QMap<int,QString>;
+QM_TEMPLATE_EXTERN_SQL template class QM_EXPORT_SQL QValueVector<Holder>;
#endif
class QM_EXPORT_SQL QSqlExtension {
public:
QSqlExtension();
virtual ~QSqlExtension();
virtual bool prepare( const QString& query );
virtual bool exec();
- virtual void bindValue( const QString& holder, const QVariant& value );
- virtual void bindValue( int pos, const QVariant& value );
- virtual void addBindValue( const QVariant& value );
+ virtual void bindValue( const QString& holder, const QVariant& value, QSql::ParameterType = QSql::In );
+ virtual void bindValue( int pos, const QVariant& value, QSql::ParameterType = QSql::In );
+ virtual void addBindValue( const QVariant& value, QSql::ParameterType = QSql::In );
+ virtual QVariant parameterValue( const QString& holder );
+ virtual QVariant parameterValue( int pos );
void clearValues();
void clearIndex();
enum BindMethod { BindByPosition, BindByName };
BindMethod bindMethod();
BindMethod bindm;
int bindCount;
QMap<int, QString> index;
- QMap<QString, QVariant> values;
+ typedef QMap<QString, Param> ValueMap;
+ ValueMap values;
+
+ // convenience container for QSqlQuery
+ // to map holders <-> positions
+ typedef QValueVector<Holder> HolderVector;
+ HolderVector holders;
};
class QM_EXPORT_SQL QSqlDriverExtension
{
public:
QSqlDriverExtension();
virtual ~QSqlDriverExtension();
virtual bool isOpen() const = 0;
};
-
#endif
#endif
diff --git a/qmake/include/private/qstyleinterface_p.h b/qmake/include/private/qstyleinterface_p.h
index 4aaedc7..24a43ad 100644
--- a/qmake/include/private/qstyleinterface_p.h
+++ b/qmake/include/private/qstyleinterface_p.h
@@ -12,50 +12,62 @@
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QSTYLEINTERFACE_H
-#define QSTYLEINTERFACE_H
+#ifndef QSTYLEINTERFACE_P_H
+#define QSTYLEINTERFACE_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
#ifndef QT_H
#include <private/qcom_p.h>
#endif // QT_H
#ifndef QT_NO_STYLE
#ifndef QT_NO_COMPONENT
class QStyle;
// {FC1B6EBE-053C-49c1-A483-C377739AB9A5}
#ifndef IID_QStyleFactory
#define IID_QStyleFactory QUuid(0xfc1b6ebe, 0x53c, 0x49c1, 0xa4, 0x83, 0xc3, 0x77, 0x73, 0x9a, 0xb9, 0xa5)
#endif
struct Q_EXPORT QStyleFactoryInterface : public QFeatureListInterface
{
virtual QStyle* create( const QString& style ) = 0;
};
#endif //QT_NO_COMPONENT
#endif //QT_NO_STYLE
-#endif //QSTYLEINTERFACE_H
+#endif //QSTYLEINTERFACE_P_H
diff --git a/qmake/include/private/qsvgdevice_p.h b/qmake/include/private/qsvgdevice_p.h
index c1cc389..3407705 100644
--- a/qmake/include/private/qsvgdevice_p.h
+++ b/qmake/include/private/qsvgdevice_p.h
@@ -1,63 +1,63 @@
/****************************************************************************
** $Id$
**
** Definition of the QSvgDevice class
**
-** Created : 20001024
+** Created : 001024
**
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the xml module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
*****************************************************************************/
-#ifndef QSVGDEVICE_H
-#define QSVGDEVICE_H
+#ifndef QSVGDEVICE_P_H
+#define QSVGDEVICE_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of the QPicture class. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//
#ifndef QT_H
#include "qpaintdevice.h"
#include "qrect.h"
#include "qdom.h"
#endif // QT_H
#if !defined(QT_MODULE_XML) || defined( QT_LICENSE_PROFESSIONAL ) || defined( QT_INTERNAL_XML )
#define QM_EXPORT_SVG
#else
#define QM_EXPORT_SVG Q_EXPORT
#endif
@@ -110,25 +110,25 @@ private:
void applyStyle( QDomElement *e, int c ) const;
void applyTransform( QDomElement *e ) const;
// reading
QRect brect; // bounding rectangle
QDomDocument doc; // document tree
QDomNode current;
QPoint curPt;
QSvgDeviceState *curr;
QPainter *pt; // used by play() et al
// writing
bool dirtyTransform, dirtyStyle;
QSvgDevicePrivate *d;
};
inline QRect QSvgDevice::boundingRect() const
{
return brect;
}
#endif // QT_NO_SVG
-#endif // QSVGDEVICE_H
+#endif // QSVGDEVICE_P_H
diff --git a/qmake/include/private/qtextcodecinterface_p.h b/qmake/include/private/qtextcodecinterface_p.h
index d2a2cb9..76e77f7 100644
--- a/qmake/include/private/qtextcodecinterface_p.h
+++ b/qmake/include/private/qtextcodecinterface_p.h
@@ -15,63 +15,61 @@
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QTEXTCODECINTERFACE_P_H
#define QTEXTCODECINTERFACE_P_H
-
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of qpsprinter.cpp and qprinter_x11.cpp.
// This header file may change from version to version without notice,
// or even be removed.
//
// We mean it.
//
//
-
#ifndef QT_H
#include <private/qcom_p.h>
#endif // QT_H
#ifndef QT_NO_TEXTCODEC
#ifndef QT_NO_COMPONENT
class QTextCodec;
// {F55BFA60-F695-11D4-823E-009027DC0F37}
#ifndef IID_QTextCodecFactory
#define IID_QTextCodecFactory QUuid( 0xf55bfa60, 0xf695, 0x11d4, 0x82, 0x3e, 0x00, 0x90, 0x27, 0xdc, 0x0f, 0x37)
#endif
struct Q_EXPORT QTextCodecFactoryInterface : public QFeatureListInterface
{
virtual QTextCodec *createForMib( int mib ) = 0;
virtual QTextCodec *createForName( const QString &name ) = 0;
};
#endif // QT_NO_COMPONENT
#endif // QT_NO_TEXTCODEC
diff --git a/qmake/include/private/qtitlebar_p.h b/qmake/include/private/qtitlebar_p.h
index dabb6bf..091845f 100644
--- a/qmake/include/private/qtitlebar_p.h
+++ b/qmake/include/private/qtitlebar_p.h
@@ -1,30 +1,30 @@
/****************************************************************************
** $Id$
**
** Definition of some Qt private functions.
**
-** Created : 2000-01-01
+** Created : 000101
**
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the widgets module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
diff --git a/qmake/include/private/qucom_p.h b/qmake/include/private/qucom_p.h
index d2ff48e..6b6ad40 100644
--- a/qmake/include/private/qucom_p.h
+++ b/qmake/include/private/qucom_p.h
@@ -14,68 +14,68 @@
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QUCOM_H
-#define QUCOM_H
-
-#ifndef QT_H
-#include <qstring.h>
-#include "quuid.h"
-#endif // QT_H
+#ifndef QUCOM_P_H
+#define QUCOM_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of a number of Qt sources files. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//
+#ifndef QT_H
+#include <qstring.h>
+#include "quuid.h"
+#endif // QT_H
+
#ifdef check
#undef check
#endif
struct QUObject;
struct QUInterfaceDescription;
struct QUnknownInterface;
struct QDispatchInterface;
struct Q_EXPORT QUBuffer
{
virtual long read( char *data, ulong maxlen ) = 0;
virtual long write( const char *data, ulong len ) = 0;
};
// A type for a QUObject
struct Q_EXPORT QUType
{
virtual const QUuid *uuid() const = 0;
virtual const char *desc() const = 0;
@@ -108,94 +108,94 @@ struct Q_EXPORT QUType_Null : public QUType
bool canConvertFrom( QUObject *, QUType * );
bool canConvertTo( QUObject *, QUType * );
bool convertFrom( QUObject *, QUType * );
bool convertTo( QUObject *, QUType * );
void clear( QUObject * );
int serializeTo( QUObject *, QUBuffer * );
int serializeFrom( QUObject *, QUBuffer * );
};
extern Q_EXPORT QUType_Null static_QUType_Null;
// The magic QUObject
struct Q_EXPORT QUObject
{
public: // scary MSVC bug makes this necessary
QUObject() : type( &static_QUType_Null ) {}
~QUObject() { type->clear( this ); }
QUType *type;
// the unavoidable union
union
{
bool b;
-
+
char c;
short s;
int i;
long l;
-
+
unsigned char uc;
unsigned short us;
unsigned int ui;
unsigned long ul;
-
+
float f;
double d;
-
+
char byte[16];
-
+
struct {
char* data;
unsigned long size;
} bytearray;
-
+
void* ptr;
-
+
struct {
void *ptr;
bool owner;
} voidstar;
-
+
struct {
char *ptr;
bool owner;
} charstar;
struct {
char *ptr;
bool owner;
} utf8;
-
+
struct {
char *ptr;
bool owner;
} local8bit;
-
+
QUnknownInterface* iface;
QDispatchInterface* idisp;
-
+
} payload;
};
// A parameter description describes one method parameters. A
// parameter has a name, a type and a flag describing whether it's an
// in parameter, an out parameter, or both ways
struct Q_EXPORT QUParameter
{
const char* name;
QUType *type;
const void* typeExtra; //Usually 0, UEnum* for QUType_enum, const char* for QUType_ptr, int* for QUType_varptr
enum { In = 1, Out = 2, InOut = In | Out };
int inOut;
};
// A method description describes one method. A method has a name and
// an array of parameters.
struct Q_EXPORT QUMethod
{
const char* name;
int count;
const QUParameter* parameters;
@@ -242,49 +242,49 @@ struct Q_EXPORT QUComponentDescription
// A component server description describe one component server, that
// is its name, vendor, release, info and the descriptions of all
// components it can instantiate.
struct Q_EXPORT QUComponentServerDescription
{
const char* name;
const char* vendor;
const char* release;
const char* info;
int count;
const QUComponentDescription* components;
};
struct Q_EXPORT QUEnumItem // - a name/value pair
{
const char *key;
int value;
};
struct Q_EXPORT QUEnum
-{
+{
const char *name; // - enumerator name
unsigned int count; // - number of values
const QUEnumItem *items; // - the name/value pairs
bool set; // whether enum has to be treated as a set
};
inline bool QUType::isEqual( const QUType *t1, const QUType *t2 ) {
return t1 == t2 || t1->uuid() == t2->uuid() ||
*(t1->uuid()) == *(t2->uuid());
}
inline bool QUType::check( QUObject* o, QUType* t ) {
return isEqual( o->type, t ) || t->convertFrom( o, o->type );
}
// {7EE17B08-5419-47e2-9776-8EEA112DCAEC}
extern Q_EXPORT const QUuid TID_QUType_enum;
struct Q_EXPORT QUType_enum : public QUType
{
const QUuid *uuid() const;
const char *desc() const;
@@ -375,125 +375,89 @@ struct Q_EXPORT QUType_bool : public QUType
int serializeTo( QUObject *, QUBuffer * );
int serializeFrom( QUObject *, QUBuffer * );
};
extern Q_EXPORT QUType_bool static_QUType_bool;
// {53C1F3BE-73C3-4c7d-9E05-CCF09EB676B5}
extern Q_EXPORT const QUuid TID_QUType_int;
struct Q_EXPORT QUType_int : public QUType
{
const QUuid *uuid() const;
const char *desc() const;
void set( QUObject *, int );
int &get( QUObject *o ) { return o->payload.i; }
bool canConvertFrom( QUObject *, QUType * );
bool canConvertTo( QUObject *, QUType * );
bool convertFrom( QUObject *, QUType * );
bool convertTo( QUObject *, QUType * );
void clear( QUObject * ) {}
int serializeTo( QUObject *, QUBuffer * );
int serializeFrom( QUObject *, QUBuffer * );
};
extern Q_EXPORT QUType_int static_QUType_int;
-// {5938712A-C496-11D5-8CB2-00C0F03BC0F3}
-extern Q_EXPORT const QUuid TID_QUType_uint;
-struct Q_EXPORT QUType_uint : public QUType
-{
- const QUuid *uuid() const;
- const char *desc() const;
-
- void set( QUObject *, uint );
- uint &get( QUObject *o ) { return o->payload.ui; }
- bool canConvertFrom( QUObject *, QUType * );
- bool canConvertTo( QUObject *, QUType * );
- bool convertFrom( QUObject *, QUType * );
- bool convertTo( QUObject *, QUType * );
- void clear( QUObject * ) {}
- int serializeTo( QUObject *, QUBuffer * );
- int serializeFrom( QUObject *, QUBuffer * );
-};
-extern Q_EXPORT QUType_uint static_QUType_uint;
// {2D0974E5-0BA6-4ec2-8837-C198972CB48C}
extern Q_EXPORT const QUuid TID_QUType_double;
struct Q_EXPORT QUType_double : public QUType
{
const QUuid *uuid() const;
const char *desc() const;
void set( QUObject *, double );
double &get( QUObject *o ) { return o->payload.d; }
bool canConvertFrom( QUObject *, QUType * );
bool canConvertTo( QUObject *, QUType * );
bool convertFrom( QUObject *, QUType * );
bool convertTo( QUObject *, QUType * );
void clear( QUObject * ) {}
int serializeTo( QUObject *, QUBuffer * );
int serializeFrom( QUObject *, QUBuffer * );
};
extern Q_EXPORT QUType_double static_QUType_double;
-// {544C5175-6993-4486-B04D-CEC4D21BF4B9 }
-extern Q_EXPORT const QUuid TID_QUType_float;
-struct Q_EXPORT QUType_float : public QUType
-{
- const QUuid *uuid() const;
- const char *desc() const;
-
- void set( QUObject *, float );
- float &get( QUObject *o ) { return o->payload.f; }
- bool canConvertFrom( QUObject *, QUType * );
- bool canConvertTo( QUObject *, QUType * );
- bool convertFrom( QUObject *, QUType * );
- bool convertTo( QUObject *, QUType * );
- void clear( QUObject * ) {}
- int serializeTo( QUObject *, QUBuffer * );
- int serializeFrom( QUObject *, QUBuffer * );
-};
-extern Q_EXPORT QUType_float static_QUType_float;
// {EFCDD1D4-77A3-4b8e-8D46-DC14B8D393E9}
extern Q_EXPORT const QUuid TID_QUType_charstar;
struct Q_EXPORT QUType_charstar : public QUType
{
const QUuid *uuid() const;
const char *desc() const;
void set( QUObject *, const char*, bool take = FALSE );
char* get( QUObject *o ){ return o->payload.charstar.ptr; }
bool canConvertFrom( QUObject *, QUType * );
bool canConvertTo( QUObject *, QUType * );
bool convertFrom( QUObject *, QUType * );
bool convertTo( QUObject *, QUType * );
void clear( QUObject * );
int serializeTo( QUObject *, QUBuffer * );
int serializeFrom( QUObject *, QUBuffer * );
};
extern Q_EXPORT QUType_charstar static_QUType_charstar;
// {44C2A547-01E7-4e56-8559-35AF9D2F42B7}
extern const QUuid TID_QUType_QString;
struct Q_EXPORT QUType_QString : public QUType
{
const QUuid *uuid() const;
const char *desc() const;
void set( QUObject *, const QString & );
QString &get( QUObject * o ) { return *(QString*)o->payload.ptr; }
bool canConvertFrom( QUObject *, QUType * );
bool canConvertTo( QUObject *, QUType * );
bool convertFrom( QUObject *, QUType * );
bool convertTo( QUObject *, QUType * );
void clear( QUObject * );
int serializeTo( QUObject *, QUBuffer * );
int serializeFrom( QUObject *, QUBuffer * );
};
extern Q_EXPORT QUType_QString static_QUType_QString;
-#endif // QUCOM_H
+#endif // QUCOM_P_H
diff --git a/qmake/include/private/qucomextra_p.h b/qmake/include/private/qucomextra_p.h
index 3de6104..fe39692 100644
--- a/qmake/include/private/qucomextra_p.h
+++ b/qmake/include/private/qucomextra_p.h
@@ -14,50 +14,62 @@
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QUCOMEXTRA_H
-#define QUCOMEXTRA_H
+#ifndef QUCOMEXTRA_P_H
+#define QUCOMEXTRA_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
#ifndef QT_H
#include <private/qucom_p.h>
#endif // QT_H
class QVariant;
#ifndef QT_NO_VARIANT
// 6dc75d58-a1d9-4417-b591-d45c63a3a4ea
extern const QUuid TID_QUType_QVariant;
struct Q_EXPORT QUType_QVariant : public QUType
{
const QUuid *uuid() const;
const char *desc() const;
void set( QUObject *, const QVariant & );
QVariant &get( QUObject * o );
bool canConvertFrom( QUObject *, QUType * );
bool canConvertTo( QUObject *, QUType * );
bool convertFrom( QUObject *, QUType * );
bool convertTo( QUObject *, QUType * );
@@ -68,26 +80,26 @@ struct Q_EXPORT QUType_QVariant : public QUType
extern Q_EXPORT QUType_QVariant static_QUType_QVariant;
#endif //QT_NO_VARIANT
// {0x8d48b3a8, 0xbd7f, 0x11d5, 0x8d, 0x74, 0x00, 0xc0, 0xf0, 0x3b, 0xc0, 0xf3 }
extern Q_EXPORT const QUuid TID_QUType_varptr;
struct Q_EXPORT QUType_varptr : public QUType
{
const QUuid *uuid() const;
const char *desc() const;
void set( QUObject *, const void* );
void* &get( QUObject * o ) { return o->payload.ptr; }
bool canConvertFrom( QUObject *, QUType * );
bool canConvertTo( QUObject *, QUType * );
bool convertFrom( QUObject *, QUType * );
bool convertTo( QUObject *, QUType * );
void clear( QUObject * ) {}
int serializeTo( QUObject *, QUBuffer * );
int serializeFrom( QUObject *, QUBuffer * );
};
extern Q_EXPORT QUType_varptr static_QUType_varptr;
-#endif // QUCOMEXTRA_H
+#endif // QUCOMEXTRA_P_H
diff --git a/qmake/include/private/qwidgetinterface_p.h b/qmake/include/private/qwidgetinterface_p.h
index 5b5776b..78e9aad 100644
--- a/qmake/include/private/qwidgetinterface_p.h
+++ b/qmake/include/private/qwidgetinterface_p.h
@@ -1,67 +1,81 @@
- /**********************************************************************
-** Copyright (C) 2000-2001 Trolltech AS. All rights reserved.
+/****************************************************************************
+** $Id$
**
-** This file is part of Qt Designer.
+** ...
+**
+** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
+**
+** This file is part of the widgets module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QWIDGETINTERFACE_H
-#define QWIDGETINTERFACE_H
-
-
-#ifndef QT_H
-#include <private/qcom_p.h>
-#include <qiconset.h>
-#endif // QT_H
-
-#ifndef QT_NO_WIDGETPLUGIN
+#ifndef QWIDGETINTERFACE_P_H
+#define QWIDGETINTERFACE_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists for the convenience
// of a number of Qt sources files. This header file may change from
// version to version without notice, or even be removed.
//
// We mean it.
//
//
+#ifndef QT_H
+#include <private/qcom_p.h>
+#include <qiconset.h>
+#endif // QT_H
+
+#ifndef QT_NO_WIDGETPLUGIN
+
class QWidget;
// {55184143-f18f-42c0-a8eb-71c01516019a}
#ifndef IID_QWidgetFactory
#define IID_QWidgetFactory QUuid( 0x55184143, 0xf18f, 0x42c0, 0xa8, 0xeb, 0x71, 0xc0, 0x15, 0x16, 0x1, 0x9a )
#endif
/*! To add custom widgets to the Qt Designer, implement that interface
in your custom widget plugin.
You also have to implement the function featureList() (\sa
QFeatureListInterface) and return there all widgets (names of it)
which this interface provides.
*/
struct QWidgetFactoryInterface : public QFeatureListInterface
{
public:
/*! In the implementation create and return the widget \a widget
here, use \a parent and \a name when creating the widget */
virtual QWidget* create( const QString &widget, QWidget* parent = 0, const char* name = 0 ) = 0;
/*! In the implementation return the name of the group of the
@@ -71,41 +85,56 @@ public:
/*! In the implementation return the iconset, which should be used
in the Qt Designer menubar and toolbar to represent the widget
\a widget */
virtual QIconSet iconSet( const QString &widget ) const = 0;
/*! In the implementation return the include file which is needed
for the widget \a widget in the generated code which uic
generates. */
virtual QString includeFile( const QString &widget ) const = 0;
/*! In the implementation return the text which should be
displayed as tooltip for the widget \a widget */
virtual QString toolTip( const QString &widget ) const = 0;
/*! In the implementation return the text which should be used for
what's this help for the widget \a widget. */
virtual QString whatsThis( const QString &widget ) const = 0;
/*! In the implementation return TRUE here, of the \a widget
should be able to contain other widget in the Qt Designer, else
FALSE. */
virtual bool isContainer( const QString &widget ) const = 0;
};
-#if CONTAINER_CUSTOM_WIDGETS
+#ifdef QT_CONTAINER_CUSTOM_WIDGETS
// {15976628-e3c3-47f4-b525-d124a3caf30e}
#ifndef IID_QWidgetContainer
#define IID_QWidgetContainer QUuid( 0x15976628, 0xe3c3, 0x47f4, 0xb5, 0x25, 0xd1, 0x24, 0xa3, 0xca, 0xf3, 0x0e )
#endif
struct QWidgetContainerInterfacePrivate : public QUnknownInterface
{
public:
- virtual QWidget *containerOfWidget( QWidget *widget ) const = 0;
- virtual QWidgetList containersOf( QWidget *widget ) const = 0;
- virtual bool isPassiveInteractor( QWidget *widget ) const = 0;
+ virtual QWidget *containerOfWidget( const QString &f, QWidget *container ) const = 0;
+ virtual bool isPassiveInteractor( const QString &f, QWidget *container ) const = 0;
+
+ virtual bool supportsPages( const QString &f ) const = 0;
+
+ virtual QWidget *addPage( const QString &f, QWidget *container,
+ const QString &name, int index ) const = 0;
+ virtual void insertPage( const QString &f, QWidget *container,
+ const QString &name, int index, QWidget *page ) const = 0;
+ virtual void removePage( const QString &f, QWidget *container, int index ) const = 0;
+ virtual void movePage( const QString &f, QWidget *container, int fromIndex, int toIndex ) const = 0;
+ virtual int count( const QString &key, QWidget *container ) const = 0;
+ virtual int currentIndex( const QString &key, QWidget *container ) const = 0;
+ virtual QString pageLabel( const QString &key, QWidget *container, int index ) const = 0;
+ virtual QWidget *page( const QString &key, QWidget *container, int index ) const = 0;
+ virtual void renamePage( const QString &key, QWidget *container,
+ int index, const QString &newName ) const = 0;
+ virtual QWidgetList pages( const QString &f, QWidget *container ) const = 0;
};
#endif
#endif // QT_NO_WIDGETPLUGIN
-#endif // QWIDGETINTERFACE_H
+#endif // QWIDGETINTERFACE_P_H
diff --git a/qmake/include/private/qwidgetresizehandler_p.h b/qmake/include/private/qwidgetresizehandler_p.h
index ca229db..9297832 100644
--- a/qmake/include/private/qwidgetresizehandler_p.h
+++ b/qmake/include/private/qwidgetresizehandler_p.h
@@ -1,63 +1,75 @@
/****************************************************************************
** $Id$
**
** Definition of the QWidgetResizeHandler class
**
** Created : 001010
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the workspace module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef QWIDGETRESIZEHANDLER_H
-#define QWIDGETRESIZEHANDLER_H
+#ifndef QWIDGETRESIZEHANDLER_P_H
+#define QWIDGETRESIZEHANDLER_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. This header file may
+// change from version to version without notice, or even be
+// removed.
+//
+// We mean it.
+//
+//
#ifndef QT_H
#include "qobject.h"
#endif // QT_H
#ifndef QT_NO_RESIZEHANDLER
class QMouseEvent;
class QKeyEvent;
class Q_EXPORT QWidgetResizeHandler : public QObject
{
Q_OBJECT
public:
QWidgetResizeHandler( QWidget *parent, QWidget *cw = 0, const char *name = 0 );
void setActive( bool b ) { active = b; if ( !active ) setMouseCursor( Nowhere ); }
bool isActive() const { return active; }
void setMovingEnabled( bool b ) { moving = b; }
bool isMovingEnabled() const { return moving; }
bool isButtonDown() const { return buttonDown; }
void setExtraHeight( int h ) { extrahei = h; }
void setSizeProtection( bool b ) { sizeprotect = b; }
diff --git a/qmake/include/qasciidict.h b/qmake/include/qasciidict.h
index 8f344cd..ecd9c9f 100644
--- a/qmake/include/qasciidict.h
+++ b/qmake/include/qasciidict.h
@@ -94,25 +94,29 @@ template<> inline void QAsciiDict<void>::deleteItem( QPtrCollection::Item )
template<class type> inline void QAsciiDict<type>::deleteItem( QPtrCollection::Item d )
{
if ( del_item ) delete (type *)d;
}
template<class type>
class QAsciiDictIterator : public QGDictIterator
{
public:
QAsciiDictIterator(const QAsciiDict<type> &d)
: QGDictIterator((QGDict &)d) {}
~QAsciiDictIterator() {}
uint count() const { return dict->count(); }
bool isEmpty() const { return dict->count() == 0; }
type *toFirst() { return (type *)QGDictIterator::toFirst(); }
operator type *() const { return (type *)QGDictIterator::get(); }
type *current() const { return (type *)QGDictIterator::get(); }
const char *currentKey() const { return QGDictIterator::getKeyAscii(); }
type *operator()() { return (type *)QGDictIterator::operator()(); }
type *operator++() { return (type *)QGDictIterator::operator++(); }
type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
};
+#ifdef QT_QWINEXPORT
+#define Q_DEFINED_QASCIIDICT
+#include "qwinexport.h"
+#endif /* QT_QWINEXPORT */
#endif // QASCIIDICT_H
diff --git a/qmake/include/qcstring.h b/qmake/include/qcstring.h
index 004bb3b..6b7352a 100644
--- a/qmake/include/qcstring.h
+++ b/qmake/include/qcstring.h
@@ -80,51 +80,53 @@ Q_EXPORT int qstrnicmp( const char *, const char *, uint len );
#ifndef QT_CLEAN_NAMESPACE
Q_EXPORT inline uint cstrlen( const char *str )
{ return (uint)strlen(str); }
Q_EXPORT inline char *cstrcpy( char *dst, const char *src )
{ return strcpy(dst,src); }
Q_EXPORT inline int cstrcmp( const char *str1, const char *str2 )
{ return strcmp(str1,str2); }
Q_EXPORT inline int cstrncmp( const char *str1, const char *str2, uint len )
{ return strncmp(str1,str2,len); }
#endif
// qChecksum: Internet checksum
Q_EXPORT Q_UINT16 qChecksum( const char *s, uint len );
/*****************************************************************************
QByteArray class
*****************************************************************************/
+#ifndef QT_QWINEXPORT
#if defined(Q_TEMPLATEDLL)
Q_TEMPLATE_EXTERN template class Q_EXPORT QMemArray<char>;
#endif
+#endif /* QT_QWINEXPORT */
#if defined(Q_QDOC)
/*
We want qdoc to document QByteArray as a real class that inherits
QMemArray<char> and that is inherited by QBitArray.
*/
class QByteArray : public QMemArray<char>
{
public:
QByteArray();
QByteArray( int size );
};
#else
typedef QMemArray<char> QByteArray;
#endif
#ifndef QT_NO_COMPRESS
Q_EXPORT QByteArray qCompress( const uchar* data, int nbytes );
Q_EXPORT QByteArray qUncompress( const uchar* data, int nbytes );
Q_EXPORT inline QByteArray qCompress( const QByteArray& data)
{ return qCompress( (const uchar*)data.data(), data.size() ); }
Q_EXPORT inline QByteArray qUncompress( const QByteArray& data )
{ return qUncompress( (const uchar*)data.data(), data.size() ); }
#endif
@@ -211,48 +213,50 @@ public:
short toShort( bool *ok=0 ) const;
ushort toUShort( bool *ok=0 ) const;
int toInt( bool *ok=0 ) const;
uint toUInt( bool *ok=0 ) const;
long toLong( bool *ok=0 ) const;
ulong toULong( bool *ok=0 ) const;
float toFloat( bool *ok=0 ) const;
double toDouble( bool *ok=0 ) const;
QCString &setStr( const char *s );
QCString &setNum( short );
QCString &setNum( ushort );
QCString &setNum( int );
QCString &setNum( uint );
QCString &setNum( long );
QCString &setNum( ulong );
QCString &setNum( float, char f='g', int prec=6 );
QCString &setNum( double, char f='g', int prec=6 );
bool setExpand( uint index, char c );
operator const char *() const;
QCString &operator+=( const char *str );
QCString &operator+=( char c );
+private:
+ int find( const char *str, int index, bool cs, uint l ) const;
};
/*****************************************************************************
QCString stream functions
*****************************************************************************/
#ifndef QT_NO_DATASTREAM
Q_EXPORT QDataStream &operator<<( QDataStream &, const QCString & );
Q_EXPORT QDataStream &operator>>( QDataStream &, QCString & );
#endif
/*****************************************************************************
QCString inline functions
*****************************************************************************/
inline QCString &QCString::operator=( const QCString &s )
{ return (QCString&)assign( s ); }
inline QCString &QCString::operator=( const char *str )
{ return (QCString&)duplicate( str, qstrlen(str)+1 ); }
inline bool QCString::isNull() const
{ return data() == 0; }
@@ -367,25 +371,28 @@ Q_EXPORT inline const QCString operator+( const QCString &s1, const char *s2 )
}
Q_EXPORT inline const QCString operator+( const char *s1, const QCString &s2 )
{
QCString tmp( s1 );
tmp += s2;
return tmp;
}
Q_EXPORT inline const QCString operator+( const QCString &s1, char c2 )
{
QCString tmp( s1.data() );
tmp += c2;
return tmp;
}
Q_EXPORT inline const QCString operator+( char c1, const QCString &s2 )
{
QCString tmp;
tmp += c1;
tmp += s2;
return tmp;
}
+#ifdef QT_QWINEXPORT
+#include <qwinexport.h>
+#endif /* QT_QWINEXPORT */
#endif // QCSTRING_H
diff --git a/qmake/include/qdict.h b/qmake/include/qdict.h
index 04ae7bf..d8943ad 100644
--- a/qmake/include/qdict.h
+++ b/qmake/include/qdict.h
@@ -94,25 +94,29 @@ template<> inline void QDict<void>::deleteItem( Item )
template<class type> inline void QDict<type>::deleteItem( QPtrCollection::Item d )
{
if ( del_item ) delete (type *)d;
}
template<class type>
class QDictIterator : public QGDictIterator
{
public:
QDictIterator(const QDict<type> &d) : QGDictIterator((QGDict &)d) { }
~QDictIterator() {}
uint count() const { return dict->count(); }
bool isEmpty() const { return dict->count() == 0; }
type *toFirst() { return (type *)QGDictIterator::toFirst(); }
operator type *() const { return (type *)QGDictIterator::get(); }
type *operator*() { return (type *)QGDictIterator::get(); }
type *current() const { return (type *)QGDictIterator::get(); }
QString currentKey() const{ return QGDictIterator::getKeyString(); }
type *operator()() { return (type *)QGDictIterator::operator()(); }
type *operator++() { return (type *)QGDictIterator::operator++(); }
type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j); }
};
+#ifdef QT_QWINEXPORT
+#define Q_DEFINED_QDICT
+#include "qwinexport.h"
+#endif /* QT_QWINEXPORT */
#endif // QDICT_H
diff --git a/qmake/include/qdir.h b/qmake/include/qdir.h
index 6e9f1ab..4b08b79 100644
--- a/qmake/include/qdir.h
+++ b/qmake/include/qdir.h
@@ -157,59 +157,60 @@ public:
virtual bool operator==( const QDir & ) const;
virtual bool operator!=( const QDir & ) const;
virtual bool remove( const QString &fileName,
bool acceptAbsPath = TRUE );
virtual bool rename( const QString &name, const QString &newName,
bool acceptAbsPaths = TRUE );
virtual bool exists( const QString &name,
bool acceptAbsPath = TRUE );
static char separator();
static bool setCurrent( const QString &path );
static QDir current();
static QDir home();
static QDir root();
static QString currentDirPath();
static QString homeDirPath();
static QString rootDirPath();
static bool match( const QStringList &filters, const QString &fileName );
static bool match( const QString &filter, const QString &fileName );
static QString cleanDirPath( const QString &dirPath );
static bool isRelativePath( const QString &path );
+ void refresh() const;
private:
#ifdef Q_OS_MAC
typedef struct FSSpec FSSpec;
static FSSpec *make_spec(const QString &);
#endif
void init();
virtual bool readDirEntries( const QString &nameFilter,
int FilterSpec, int SortSpec );
- static void slashify ( QString &);
+ static void slashify( QString & );
QString dPath;
QStringList *fList;
QFileInfoList *fiList;
QString nameFilt;
FilterSpec filtS;
SortSpec sortS;
uint dirty : 1;
uint allDirs : 1;
};
inline QString QDir::path() const
{
return dPath;
}
inline QString QDir::nameFilter() const
{
return nameFilt;
}
inline QDir::FilterSpec QDir::filter() const
{
diff --git a/qmake/include/qfeatures.h b/qmake/include/qfeatures.h
index 57502f9..270a6de 100644
--- a/qmake/include/qfeatures.h
+++ b/qmake/include/qfeatures.h
@@ -53,49 +53,49 @@
// Automatic widget layout
//#define QT_NO_LAYOUT
// Networking
//#define QT_NO_NETWORK
// Palettes
//#define QT_NO_PALETTE
// Alpha-blended cursor
//#define QT_NO_QWS_ALPHA_CURSOR
// 1-bit monochrome
//#define QT_NO_QWS_DEPTH_1
// 15 or 16-bit color
//#define QT_NO_QWS_DEPTH_16
// 24-bit color
//#define QT_NO_QWS_DEPTH_24
// 32-bit color
//#define QT_NO_QWS_DEPTH_32
-// 4-bit greyscale
+// 4-bit grayscale
//#define QT_NO_QWS_DEPTH_4
// 8-bit color
//#define QT_NO_QWS_DEPTH_8
// 8-bit grayscale
//#define QT_NO_QWS_DEPTH_8GRAYSCALE
// Favour code size over graphics speed
//#define QT_NO_QWS_GFX_SPEED
// Console keyboard
//#define QT_NO_QWS_KEYBOARD
// Linux framebuffer
//#define QT_NO_QWS_LINUXFB
// Mach64 acceleration
//#define QT_NO_QWS_MACH64
// Window Manager
//#define QT_NO_QWS_MANAGER
// Matrox MGA acceleration
diff --git a/qmake/include/qgarray.h b/qmake/include/qgarray.h
index 12edea6..40720a6 100644
--- a/qmake/include/qgarray.h
+++ b/qmake/include/qgarray.h
@@ -28,88 +28,97 @@
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QGARRAY_H
#define QGARRAY_H
#ifndef QT_H
#include "qshared.h"
#endif // QT_H
class Q_EXPORT QGArray // generic array
{
friend class QBuffer;
public:
//### DO NOT USE THIS. IT IS PUBLIC BUT DO NOT USE IT IN NEW CODE.
struct array_data : public QShared { // shared array
- array_data() { data=0; len=0; }
+ array_data():data(0),len(0)
+#ifdef QT_QGARRAY_SPEED_OPTIM
+ ,maxl(0)
+#endif
+ {}
char *data; // actual array data
uint len;
+#ifdef QT_QGARRAY_SPEED_OPTIM
+ uint maxl;
+#endif
};
QGArray();
+ enum Optimization { MemOptim, SpeedOptim };
protected:
QGArray( int, int ); // dummy; does not alloc
QGArray( int size ); // allocate 'size' bytes
QGArray( const QGArray &a ); // shallow copy
virtual ~QGArray();
QGArray &operator=( const QGArray &a ) { return assign( a ); }
virtual void detach() { duplicate(*this); }
// ### Qt 4.0: maybe provide two versions of data(), at(), etc.
char *data() const { return shd->data; }
uint nrefs() const { return shd->count; }
uint size() const { return shd->len; }
bool isEqual( const QGArray &a ) const;
+ bool resize( uint newsize, Optimization optim );
bool resize( uint newsize );
bool fill( const char *d, int len, uint sz );
QGArray &assign( const QGArray &a );
QGArray &assign( const char *d, uint len );
QGArray &duplicate( const QGArray &a );
QGArray &duplicate( const char *d, uint len );
void store( const char *d, uint len );
array_data *sharedBlock() const { return shd; }
void setSharedBlock( array_data *p ) { shd=(array_data*)p; }
QGArray &setRawData( const char *d, uint len );
void resetRawData( const char *d, uint len );
int find( const char *d, uint index, uint sz ) const;
int contains( const char *d, uint sz ) const;
-
+
void sort( uint sz );
int bsearch( const char *d, uint sz ) const;
char *at( uint index ) const;
bool setExpand( uint index, const char *d, uint sz );
protected:
virtual array_data *newData();
virtual void deleteData( array_data *p );
private:
static void msg_index( uint );
array_data *shd;
};
inline char *QGArray::at( uint index ) const
{
#if defined(QT_CHECK_RANGE)
if ( index >= size() ) {
msg_index( index );
index = 0;
}
diff --git a/qmake/include/qglobal.h b/qmake/include/qglobal.h
index 13cff64..d212bff 100644
--- a/qmake/include/qglobal.h
+++ b/qmake/include/qglobal.h
@@ -17,53 +17,53 @@
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QGLOBAL_H
#define QGLOBAL_H
-#define QT_VERSION_STR "3.1.0-b2"
+#define QT_VERSION_STR "3.1.2"
/*
QT_VERSION is (major << 16) + (minor << 8) + patch.
*/
-#define QT_VERSION 0x030100
+#define QT_VERSION 0x030102
/*
The operating system, must be one of: (Q_OS_x)
MACX - Mac OS X
MAC9 - Mac OS 9
MSDOS - MS-DOS and Windows
OS2 - OS/2
OS2EMX - XFree86 on OS/2 (not PM)
WIN32 - Win32 (Windows 95/98/ME and Windows NT/2000/XP)
CYGWIN - Cygwin
SOLARIS - Sun Solaris
HPUX - HP-UX
ULTRIX - DEC Ultrix
LINUX - Linux
FREEBSD - FreeBSD
NETBSD - NetBSD
OPENBSD - OpenBSD
BSDI - BSD/OS
IRIX - SGI Irix
OSF - HP Tru64 UNIX
SCO - SCO OpenServer 5
UNIXWARE - UnixWare 7, Open UNIX 8
AIX - AIX
@@ -120,54 +120,54 @@
#elif defined(__OpenBSD__)
# define Q_OS_OPENBSD
# define Q_OS_BSD4
#elif defined(__bsdi__)
# define Q_OS_BSDI
# define Q_OS_BSD4
#elif defined(__sgi)
# define Q_OS_IRIX
#elif defined(__osf__)
# define Q_OS_OSF
#elif defined(_AIX)
# define Q_OS_AIX
#elif defined(__Lynx__)
# define Q_OS_LYNX
#elif defined(__GNU_HURD__)
# define Q_OS_HURD
#elif defined(__DGUX__)
# define Q_OS_DGUX
#elif defined(__QNXNTO__)
# define Q_OS_QNX6
#elif defined(__QNX__)
# define Q_OS_QNX
#elif defined(_SEQUENT_)
# define Q_OS_DYNIX
-#elif defined(_SCO_DS) /* SCO OpenServer 5 */
+#elif defined(_SCO_DS) /* SCO OpenServer 5 + GCC */
# define Q_OS_SCO
-#elif defined(__UNIXWARE__) /* UnixWare 7 + GCC, Open UNIX 8 + GCC */
+#elif defined(__USLC__) /* all SCO platforms + UDK or OUDK */
# define Q_OS_UNIXWARE
# define Q_OS_UNIXWARE7
-#elif defined(__USLC__) /* UnixWare 7 + UDK, Open UNIX 8 + OUDK */
+#elif defined(__svr4__) && defined(i386) /* Open UNIX 8 + GCC */
# define Q_OS_UNIXWARE
# define Q_OS_UNIXWARE7
#else
# error "Qt has not been ported to this OS - talk to qt-bugs@trolltech.com"
#endif
#if defined(Q_OS_MAC9) || defined(Q_OS_MACX)
# define Q_OS_MAC
#endif
#if defined(Q_OS_MAC9) || defined(Q_OS_MSDOS) || defined(Q_OS_OS2) || defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
# undef Q_OS_UNIX
#elif !defined(Q_OS_UNIX)
# define Q_OS_UNIX
#endif
/*
The compiler, must be one of: (Q_CC_x)
SYM - Symantec C++ for both PC and Macintosh
MPW - MPW C++
MWERKS - Metrowerks CodeWarrior
MSVC - Microsoft Visual C/C++
@@ -204,94 +204,100 @@
# if !defined(_CPPUNWIND)
# define Q_NO_EXCEPTIONS
# endif
#elif defined(applec)
# define Q_CC_MPW
# define Q_NO_BOOL_TYPE
# define Q_NO_EXPLICIT_KEYWORD
# define Q_NO_USING_KEYWORD
#elif defined(__MWERKS__)
# define Q_CC_MWERKS
/* "explicit" recognized since 4.0d1 */
# define QMAC_PASCAL pascal
# define Q_NO_USING_KEYWORD /* ### check "using" status */
#elif defined(_MSC_VER)
# define Q_CC_MSVC
/* proper support of bool for _MSC_VER >= 1100 */
# define Q_CANNOT_DELETE_CONSTANT
# define Q_INLINE_TEMPLATES inline
/* Visual C++.Net issues for _MSC_VER >= 1300 */
# if _MSC_VER >= 1300
# define Q_CC_MSVC_NET
-# define Q_TYPENAME
+# if _MSC_VER < 1310
+# define Q_TYPENAME
+# endif
# endif
# define Q_NO_USING_KEYWORD /* ### check "using" status */
#elif defined(__BORLANDC__) || defined(__TURBOC__)
# define Q_CC_BOR
# if __BORLANDC__ < 0x502
# define Q_NO_BOOL_TYPE
# define Q_NO_EXPLICIT_KEYWORD
# endif
# define Q_NO_USING_KEYWORD /* ### check "using" status */
#elif defined(__WATCOMC__)
# define Q_CC_WAT
# if defined(Q_OS_QNX4)
/* compiler flags */
# define Q_TYPENAME
# define Q_NO_BOOL_TYPE
# define Q_CANNOT_DELETE_CONSTANT
# define mutable
/* ??? */
# define Q_BROKEN_TEMPLATE_SPECIALIZATION
/* no template classes in QVariant */
# define QT_NO_TEMPLATE_VARIANT
/* Wcc does not fill in functions needed by valuelists, maps, and
valuestacks implicitly */
# define Q_FULL_TEMPLATE_INSTANTIATION
/* can we just compare the structures? */
# define Q_FULL_TEMPLATE_INSTANTIATION_MEMCMP
/* these are not useful to our customers */
# define QT_QWS_NO_SHM
# define QT_NO_QWS_MULTIPROCESS
# define QT_NO_SQL
# define QT_NO_QWS_CURSOR
# endif
#elif defined(__GNUC__)
# define Q_CC_GNU
# define Q_C_CALLBACKS
# if __GNUC__ == 2 && __GNUC_MINOR__ <= 7
# define Q_FULL_TEMPLATE_INSTANTIATION
# endif
/* GCC 2.95 knows "using" but does not support it correctly */
# if __GNUC__ == 2 && __GNUC_MINOR__ <= 95
# define Q_NO_USING_KEYWORD
# endif
+/* GCC 3.1 and GCC 3.2 wrongly define _SB_CTYPE_MACROS on HP-UX */
+# if defined(Q_OS_HPUX) && __GNUC__ == 3 && __GNUC_MINOR__ >= 1
+# define Q_WRONG_SB_CTYPE_MACROS
+# endif
# if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
# define Q_PACKED __attribute__ ((packed))
# endif
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif
/* IBM compiler versions are a bit messy. There are actually two products:
the C product, and the C++ product. The C++ compiler is always packaged
with the latest version of the C compiler. Version numbers do not always
match. This little table (I'm not sure it's accurate) should be helpful:
C++ product C product
C Set 3.1 C Compiler 3.0
... ...
C++ Compiler 3.6.6 C Compiler 4.3
... ...
Visual Age C++ 4.0 ...
... ...
Visual Age C++ 5.0 C Compiler 5.0
Now:
__xlC__ is the version of the C compiler in hexadecimal notation
@@ -369,112 +375,129 @@
# define Q_NO_EXCEPTIONS
# endif
/* Using the `using' keyword avoids Intel C++ warnings */
# elif defined(__INTEL_COMPILER)
# define Q_CC_INTEL
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif
/* The Portland Group compiler is based on EDG and does define __EDG__ */
# elif defined(__PGI)
# define Q_CC_PGI
# if !defined(__EXCEPTIONS)
# define Q_NO_EXCEPTIONS
# endif
/* Never tested! */
# elif defined(__ghs)
# define Q_CC_GHS
/* The UnixWare 7 UDK compiler is based on EDG and does define __EDG__ */
# elif defined(__USLC__) && defined(__SCO_VERSION__)
# define Q_CC_USLC
+/* The latest UDK 7.1.1b does not need this, but previous versions do */
+# if !defined(__SCO_VERSION__) || (__SCO_VERSION__ < 302200010)
+# define Q_INLINE_TEMPLATES inline
+# endif
# define Q_NO_USING_KEYWORD /* ### check "using" status */
/* Never tested! */
# elif defined(CENTERLINE_CLPP) || defined(OBJECTCENTER)
# define Q_CC_OC
# define Q_NO_USING_KEYWORD
-/* CDS++ is not documented to define __EDG__ or __EDG in the Reliant
- documentation but we suppose it does, in any case it does follow
- conventions like _BOOL */
+/* CDS++ defines __EDG__ although this is not documented in the Reliant
+ documentation. It also follows conventions like _BOOL and this documented */
# elif defined(sinix)
# define Q_CC_CDS
# define Q_NO_USING_KEYWORD
# if defined(__cplusplus) && (__cplusplus < 2) /* Cfront C++ mode */
# define Q_NO_EXCEPTIONS
# endif
/* The MIPSpro compiler in o32 mode is based on EDG but disables features
such as template specialization nevertheless */
# elif defined(__sgi)
# define Q_CC_MIPS
# if defined(_MIPS_SIM) && (_MIPS_SIM == _ABIO32) /* o32 ABI */
# define Q_TYPENAME
# define Q_BROKEN_TEMPLATE_SPECIALIZATION
# define Q_STRICT_INLINING_RULES
+# define Q_NO_EXPLICIT_KEYWORD
+# define Q_INLINE_TEMPLATES inline
# elif defined(_COMPILER_VERSION) && (_COMPILER_VERSION < 730) /* 7.2 */
# define Q_TYPENAME
# define Q_BROKEN_TEMPLATE_SPECIALIZATION
# endif
# define Q_NO_USING_KEYWORD /* ### check "using" status */
# endif
/* The older UnixWare 2.X compiler? */
-#elif defined(__USLC__) && !defined(__SCO_VERSION__)
+#elif defined(__USLC__)
# define Q_CC_USLC
+# define Q_TYPENAME
# define Q_NO_BOOL_TYPE
# define Q_NO_EXPLICIT_KEYWORD
# define Q_NO_USING_KEYWORD
+# define Q_INLINE_TEMPLATES inline
/* Never tested! */
#elif defined(__HIGHC__)
# define Q_CC_HIGHC
#elif defined(__SUNPRO_CC)
# define Q_CC_SUN
/* 5.0 compiler or better
'bool' is enabled by default but can be disabled using -features=nobool
in which case _BOOL is not defined
this is the default in 4.2 compatibility mode triggered by -compat=4 */
# if __SUNPRO_CC >= 0x500
# if !defined(_BOOL)
# define Q_NO_BOOL_TYPE
# endif
# if defined(__SUNPRO_CC_COMPAT) && (__SUNPRO_CC_COMPAT <= 4)
# define Q_NO_USING_KEYWORD
# endif
# define Q_C_CALLBACKS
/* 4.2 compiler or older */
# else
# define Q_NO_BOOL_TYPE
# define Q_NO_EXPLICIT_KEYWORD
# define Q_NO_USING_KEYWORD
# endif
+/* CDS++ does not seem to define __EDG__ or __EDG according to Reliant
+ documentation but nevertheless uses EDG conventions like _BOOL */
+#elif defined(sinix)
+# define Q_CC_EDG
+# define Q_CC_CDS
+# if !defined(_BOOL)
+# define Q_NO_BOOL_TYPE
+# endif
+# define Q_BROKEN_TEMPLATE_SPECIALIZATION
+
#elif defined(Q_OS_HPUX)
/* __HP_aCC was not defined in first aCC releases */
# if defined(__HP_aCC) || __cplusplus >= 199707L
# define Q_CC_HPACC
# else
# define Q_CC_HP
# define Q_NO_BOOL_TYPE
# define Q_FULL_TEMPLATE_INSTANTIATION
# define Q_BROKEN_TEMPLATE_SPECIALIZATION
# define Q_NO_EXPLICIT_KEYWORD
# endif
# define Q_NO_USING_KEYWORD /* ### check "using" status */
#else
# error "Qt has not been tested with this compiler - talk to qt-bugs@trolltech.com"
#endif
#ifndef Q_PACKED
# define Q_PACKED
#endif
/*
The window system, must be one of: (Q_WS_x)
@@ -485,48 +508,49 @@
WIN32 - Windows
X11 - X Window System
PM - unsupported
WIN16 - unsupported
*/
#if defined(Q_OS_MAC9)
# define Q_WS_MAC9
#elif defined(Q_OS_MSDOS)
# define Q_WS_WIN16
# error "Qt requires Win32 and does not work with Windows 3.x"
#elif defined(_WIN32_X11_)
# define Q_WS_X11
#elif defined(Q_OS_WIN32)
# define Q_WS_WIN32
# if defined(Q_OS_WIN64)
# define Q_WS_WIN64
# endif
#elif defined(Q_OS_OS2)
# define Q_WS_PM
# error "Qt does not work with OS/2 Presentation Manager or Workplace Shell"
#elif defined(Q_OS_UNIX)
# if defined(QWS)
# define Q_WS_QWS
+# define QT_NO_QWS_IM
# elif defined(Q_OS_MACX)
# define Q_WS_MACX
# else
# define Q_WS_X11
# endif
#endif
#if defined(Q_OS_MAC) && !defined(QMAC_PASCAL)
# define QMAC_PASCAL
#endif
#if defined(Q_WS_WIN16) || defined(Q_WS_WIN32)
# define Q_WS_WIN
#endif
#if (defined(Q_WS_MAC9) || defined(Q_WS_MACX)) && !defined(Q_WS_QWS) && !defined(Q_WS_X11)
# define Q_WS_MAC
#endif
/*
Some classes do not permit copies to be made of an object.
These classes contains a private copy constructor and operator=
to disable copying (the compiler gives an error message).
Undefine Q_DISABLE_COPY to turn off this checking.
@@ -724,107 +748,125 @@ class QDataStream;
#endif
#if defined(Q_WS_MAC9)
//No need for menu merging
# ifndef QMAC_QMENUBAR_NO_MERGE
# define QMAC_QMENUBAR_NO_MERGE
# endif
//Mac9 does not use quartz
# ifndef QMAC_NO_QUARTZ
# define QMAC_NO_QUARTZ
# endif
# ifndef QMAC_QMENUBAR_NO_EVENT
# define QMAC_QMENUBAR_NO_EVENT
# endif
#endif
#if defined(Q_WS_MACX) //for no nobody uses quartz, just putting in first level hooks
# ifndef QMAC_NO_QUARTZ
# define QMAC_NO_QUARTZ
# endif
# ifndef QMAC_QMENUBAR_NO_EVENT
# define QMAC_QMENUBAR_NO_EVENT
# endif
#endif
+#if !defined(Q_WS_QWS) && !defined(QT_NO_COP)
+# define QT_NO_COP
+#endif
+
#ifndef QT_H
#include <qfeatures.h>
#endif // QT_H
//
// Create Qt DLL if QT_DLL is defined (Windows only)
+// or QT_SHARED is defined (Kylix only)
//
#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
# if defined(QT_NODLL)
# undef QT_MAKEDLL
# undef QT_DLL
# elif defined(QT_MAKEDLL) /* create a Qt DLL library */
# if defined(QT_DLL)
# undef QT_DLL
# endif
# define Q_EXPORT __declspec(dllexport)
# define Q_TEMPLATEDLL
# define Q_TEMPLATE_EXTERN
# undef Q_DISABLE_COPY /* avoid unresolved externals */
# elif defined(QT_DLL) /* use a Qt DLL library */
# define Q_EXPORT __declspec(dllimport)
# define Q_TEMPLATEDLL
# ifndef Q_TEMPLATE_EXTERN
-# if defined(Q_CC_MSVC)
-# define Q_TEMPLATE_EXTERN /*extern*/ //### too many warnings, even though disabled
+# if defined(Q_CC_MSVC_NET)
+# define Q_TEMPLATE_EXTERN extern
# else
# define Q_TEMPLATE_EXTERN
# endif
# endif
-# undef Q_DISABLE_COPY /* avoid unresolved externals */
+# undef Q_DISABLE_COPY /* avoid unresolved externals */
+# endif
+#elif defined(Q_OS_LINUX) && defined(Q_CC_BOR)
+# if defined(QT_SHARED) /* create a Qt shared library */
+# define Q_EXPORT __declspec(dllexport)
+# define Q_TEMPLATEDLL
+# define Q_TEMPLATE_EXTERN
+# undef Q_DISABLE_COPY /* avoid unresolved externals */
+# else
+# define Q_TEMPLATEDLL
+# define Q_TEMPLATE_EXTERN
+# undef Q_DISABLE_COPY /* avoid unresolved externals */
# endif
#else
# undef QT_MAKEDLL /* ignore these for other platforms */
# undef QT_DLL
#endif
#ifndef Q_EXPORT
# define Q_EXPORT
#endif
//
// Some platform specific stuff
//
#if defined(Q_WS_WIN)
extern Q_EXPORT bool qt_winunicode;
#endif
//
// System information
//
Q_EXPORT const char *qVersion();
Q_EXPORT bool qSysInfo( int *wordSize, bool *bigEndian );
-#if defined(Q_WS_WIN)
+#if defined(Q_OS_MAC)
+int qMacVersion();
+#elif defined(Q_WS_WIN)
Q_EXPORT int qWinVersion();
#if defined(UNICODE)
#define QT_WA( uni, ansi ) if ( qt_winunicode ) { uni } else { ansi }
#define QT_WA_INLINE( uni, ansi ) ( qt_winunicode ? uni : ansi )
#else
#define QT_WA( uni, ansi ) ansi
#define QT_WA_INLINE( uni, ansi ) ansi
#endif
#endif
#ifdef Q_OS_TEMP
#ifdef QT_WA
#undef QT_WA
#undef QT_WA_INLINE
#endif
#define QT_WA( uni, ansi ) uni
#define QT_WA_INLINE( uni, ansi ) ( uni )
#endif
#ifndef Q_INLINE_TEMPLATES
# define Q_INLINE_TEMPLATES
#endif
#ifndef Q_TYPENAME
@@ -948,59 +990,76 @@ typedef QtMsgHandler msg_handler;
#endif // QT_NO_COMPAT
Q_EXPORT void qSuppressObsoleteWarnings( bool = TRUE );
Q_EXPORT void qObsolete( const char *obj, const char *oldfunc,
const char *newfunc );
Q_EXPORT void qObsolete( const char *obj, const char *oldfunc );
Q_EXPORT void qObsolete( const char *message );
//
// Install paths from configure
//
Q_EXPORT const char *qInstallPath();
Q_EXPORT const char *qInstallPathDocs();
Q_EXPORT const char *qInstallPathHeaders();
Q_EXPORT const char *qInstallPathLibs();
Q_EXPORT const char *qInstallPathBins();
Q_EXPORT const char *qInstallPathPlugins();
Q_EXPORT const char *qInstallPathData();
#endif // __cplusplus
+// compilers which follow outdated template instantiation rules
+// require a class to have a comparison operator to exist when
+// a QValueList of this type is instantiated. It's not actually
+// used in the list, though. Hence the dummy implementation.
+// Just in case other code relies on it we better trigger a warning
+// mandating a real implementation.
+#ifdef Q_FULL_TEMPLATE_INSTANTIATION
+# define Q_DUMMY_COMPARISON_OPERATOR(C) \
+ bool operator==( const C& ) const { \
+ qWarning( #C"::operator==( const "#C"& ) got called." ); \
+ return FALSE; \
+ }
+#else
+# define Q_DUMMY_COMPARISON_OPERATOR(C)
+#endif
+
#endif // QGLOBAL_H
//
// Avoid some particularly useless warnings from some stupid compilers.
// To get ALL C++ compiler warnings, define QT_CC_WARNINGS or comment out
// the line "#define QT_NO_WARNINGS"
//
#if !defined(QT_CC_WARNINGS)
# define QT_NO_WARNINGS
#endif
#if defined(QT_NO_WARNINGS)
# if defined(Q_CC_MSVC)
# pragma warning(disable: 4244) // 'conversion' conversion from 'type1' to 'type2', possible loss of data
# pragma warning(disable: 4275) // non - DLL-interface classkey 'identifier' used as base for DLL-interface classkey 'identifier'
# pragma warning(disable: 4514) // unreferenced inline/local function has been removed
# pragma warning(disable: 4800) // 'type' : forcing value to bool 'true' or 'false' (performance warning)
# pragma warning(disable: 4097) // typedef-name 'identifier1' used as synonym for class-name 'identifier2'
# pragma warning(disable: 4706) // assignment within conditional expression
# pragma warning(disable: 4786) // truncating debug info after 255 characters
# pragma warning(disable: 4660) // template-class specialization 'identifier' is already instantiated
# pragma warning(disable: 4355) // 'this' : used in base member initializer list
# pragma warning(disable: 4231) // nonstandard extension used : 'extern' before template explicit instantiation
+# pragma warning(disable: 4710) // function not inlined
# elif defined(Q_CC_BOR)
# pragma option -w-inl
# pragma option -w-aus
# pragma warn -inl
# pragma warn -pia
# pragma warn -ccc
# pragma warn -rch
# pragma warn -sig
# elif defined(Q_CC_MWERKS)
# pragma warn_possunwant off
# endif
#endif
diff --git a/qmake/include/qintdict.h b/qmake/include/qintdict.h
index b4cb223..0299879 100644
--- a/qmake/include/qintdict.h
+++ b/qmake/include/qintdict.h
@@ -90,25 +90,29 @@ template<> inline void QIntDict<void>::deleteItem( QPtrCollection::Item )
#endif
template<class type> inline void QIntDict<type>::deleteItem( QPtrCollection::Item d )
{
if ( del_item ) delete (type*)d;
}
template<class type>
class QIntDictIterator : public QGDictIterator
{
public:
QIntDictIterator(const QIntDict<type> &d) :QGDictIterator((QGDict &)d) {}
~QIntDictIterator() {}
uint count() const { return dict->count(); }
bool isEmpty() const { return dict->count() == 0; }
type *toFirst() { return (type *)QGDictIterator::toFirst(); }
operator type *() const { return (type *)QGDictIterator::get(); }
type *current() const { return (type *)QGDictIterator::get(); }
long currentKey() const { return QGDictIterator::getKeyInt(); }
type *operator()() { return (type *)QGDictIterator::operator()(); }
type *operator++() { return (type *)QGDictIterator::operator++(); }
type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
};
+#ifdef QT_QWINEXPORT
+#define Q_DEFINED_QINTDICT
+#include "qwinexport.h"
+#endif /* QT_QWINEXPORT */
#endif // QINTDICT_H
diff --git a/qmake/include/qmap.h b/qmake/include/qmap.h
index 269bd6b..4bc0a2f 100644
--- a/qmake/include/qmap.h
+++ b/qmake/include/qmap.h
@@ -859,25 +859,29 @@ Q_INLINE_TEMPLATES QDataStream& operator>>( QDataStream& s, QMap<Key,T>& m ) {
m.clear();
Q_UINT32 c;
s >> c;
for( Q_UINT32 i = 0; i < c; ++i ) {
Key k; T t;
s >> k >> t;
m.insert( k, t );
if ( s.atEnd() )
break;
}
return s;
}
template<class Key, class T>
Q_INLINE_TEMPLATES QDataStream& operator<<( QDataStream& s, const QMap<Key,T>& m ) {
s << (Q_UINT32)m.size();
QMapConstIterator<Key,T> it = m.begin();
for( ; it != m.end(); ++it )
s << it.key() << it.data();
return s;
}
#endif
+#ifdef QT_QWINEXPORT
+#define Q_DEFINED_QMAP
+#include "qwinexport.h"
+#endif /* QT_QWINEXPORT */
#endif // QMAP_H
diff --git a/qmake/include/qmemarray.h b/qmake/include/qmemarray.h
index a5baf99..267670d 100644
--- a/qmake/include/qmemarray.h
+++ b/qmake/include/qmemarray.h
@@ -22,101 +22,108 @@
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QMEMARRAY_H
#define QMEMARRAY_H
#ifndef QT_H
#include "qgarray.h"
#endif // QT_H
-template<class type>
+template<class type>
class QMemArray : public QGArray
{
public:
typedef type* Iterator;
typedef const type* ConstIterator;
typedef type ValueType;
protected:
QMemArray( int, int ) : QGArray( 0, 0 ) {}
public:
QMemArray() {}
QMemArray( int size ) : QGArray(size*sizeof(type)) {}
QMemArray( const QMemArray<type> &a ) : QGArray(a) {}
~QMemArray() {}
QMemArray<type> &operator=(const QMemArray<type> &a)
{ return (QMemArray<type>&)QGArray::assign(a); }
type *data() const { return (type *)QGArray::data(); }
uint nrefs() const { return QGArray::nrefs(); }
uint size() const { return QGArray::size()/sizeof(type); }
uint count() const { return size(); }
bool isEmpty() const { return QGArray::size() == 0; }
bool isNull() const { return QGArray::data() == 0; }
bool resize( uint size ) { return QGArray::resize(size*sizeof(type)); }
+ bool resize( uint size, Optimization optim ) { return QGArray::resize(size*sizeof(type), optim); }
bool truncate( uint pos ) { return QGArray::resize(pos*sizeof(type)); }
bool fill( const type &d, int size = -1 )
{ return QGArray::fill((char*)&d,size,sizeof(type) ); }
void detach() { QGArray::detach(); }
QMemArray<type> copy() const
{ QMemArray<type> tmp; return tmp.duplicate(*this); }
QMemArray<type>& assign( const QMemArray<type>& a )
{ return (QMemArray<type>&)QGArray::assign(a); }
QMemArray<type>& assign( const type *a, uint n )
{ return (QMemArray<type>&)QGArray::assign((char*)a,n*sizeof(type)); }
QMemArray<type>& duplicate( const QMemArray<type>& a )
{ return (QMemArray<type>&)QGArray::duplicate(a); }
QMemArray<type>& duplicate( const type *a, uint n )
{ return (QMemArray<type>&)QGArray::duplicate((char*)a,n*sizeof(type)); }
QMemArray<type>& setRawData( const type *a, uint n )
{ return (QMemArray<type>&)QGArray::setRawData((char*)a,
n*sizeof(type)); }
void resetRawData( const type *a, uint n )
{ QGArray::resetRawData((char*)a,n*sizeof(type)); }
int find( const type &d, uint i=0 ) const
{ return QGArray::find((char*)&d,i,sizeof(type)); }
int contains( const type &d ) const
{ return QGArray::contains((char*)&d,sizeof(type)); }
void sort() { QGArray::sort(sizeof(type)); }
int bsearch( const type &d ) const
{ return QGArray::bsearch((const char*)&d,sizeof(type)); }
// ### Qt 4.0: maybe provide uint overload as work-around for MSVC bug
type& operator[]( int i ) const
{ return (type &)(*(type *)QGArray::at(i*sizeof(type))); }
type& at( uint i ) const
{ return (type &)(*(type *)QGArray::at(i*sizeof(type))); }
operator const type*() const { return (const type *)QGArray::data(); }
bool operator==( const QMemArray<type> &a ) const { return isEqual(a); }
bool operator!=( const QMemArray<type> &a ) const { return !isEqual(a); }
Iterator begin() { return data(); }
Iterator end() { return data() + size(); }
ConstIterator begin() const { return data(); }
ConstIterator end() const { return data() + size(); }
};
+#ifndef QT_QWINEXPORT
#if defined(Q_TEMPLATEDLL)
// MOC_SKIP_BEGIN
Q_TEMPLATE_EXTERN template class Q_EXPORT QMemArray<int>;
Q_TEMPLATE_EXTERN template class Q_EXPORT QMemArray<bool>;
// MOC_SKIP_END
#endif
+#endif /* QT_QWINEXPORT */
#ifndef QT_NO_COMPAT
#define QArray QMemArray
#endif
+#ifdef QT_QWINEXPORT
+#define Q_DEFINED_QMEMARRAY
+#include <qwinexport.h>
+#endif /* QT_QWINEXPORT */
#endif // QARRAY_H
diff --git a/qmake/include/qptrlist.h b/qmake/include/qptrlist.h
index 53fb605..17b5ee9 100644
--- a/qmake/include/qptrlist.h
+++ b/qmake/include/qptrlist.h
@@ -1,31 +1,29 @@
/****************************************************************************
** $Id$
**
** Definition of QPtrList template/macro class
**
-** Created :
-**
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
@@ -136,25 +134,29 @@ public:
operator type *() const { return (type *)QGListIterator::get(); }
type *operator*() { return (type *)QGListIterator::get(); }
// No good, since QPtrList<char> (ie. QStrList fails...
//
// MSVC++ gives warning
// Sunpro C++ 4.1 gives error
// type *operator->() { return (type *)QGListIterator::get(); }
type *current() const { return (type *)QGListIterator::get(); }
type *operator()() { return (type *)QGListIterator::operator()();}
type *operator++() { return (type *)QGListIterator::operator++(); }
type *operator+=(uint j) { return (type *)QGListIterator::operator+=(j);}
type *operator--() { return (type *)QGListIterator::operator--(); }
type *operator-=(uint j) { return (type *)QGListIterator::operator-=(j);}
QPtrListIterator<type>& operator=(const QPtrListIterator<type>&it)
{ QGListIterator::operator=(it); return *this; }
};
#ifndef QT_NO_COMPAT
#define QList QPtrList
#define QListIterator QPtrListIterator
#endif
+#ifdef QT_QWINEXPORT
+#define Q_DEFINED_QPTRLIST
+#include "qwinexport.h"
+#endif /* QT_QWINEXPORT */
#endif // QPTRLIST_H
diff --git a/qmake/include/qptrvector.h b/qmake/include/qptrvector.h
index f6d9623..49b40b7 100644
--- a/qmake/include/qptrvector.h
+++ b/qmake/include/qptrvector.h
@@ -89,25 +89,29 @@ protected:
virtual int compareItems( QPtrCollection::Item d1, QPtrCollection::Item d2 );
virtual QDataStream& read( QDataStream &s, QPtrCollection::Item &d );
virtual QDataStream& write( QDataStream &s, QPtrCollection::Item d ) const;
#endif
private:
void deleteItem( Item d );
};
#if !defined(Q_BROKEN_TEMPLATE_SPECIALIZATION)
template<> inline void QPtrVector<void>::deleteItem( QPtrCollection::Item )
{
}
#endif
template<class type> inline void QPtrVector<type>::deleteItem( QPtrCollection::Item d )
{
if ( del_item ) delete (type *)d;
}
#ifndef QT_NO_COMPAT
#define QVector QPtrVector
#endif
+#ifdef QT_QWINEXPORT
+#define Q_DEFINED_QPTRVECTOR
+#include "qwinexport.h"
+#endif /* QT_QWINEXPORT */
#endif // QVECTOR_H
diff --git a/qmake/include/qregexp.h b/qmake/include/qregexp.h
index 7bb777a..90f54bd 100644
--- a/qmake/include/qregexp.h
+++ b/qmake/include/qregexp.h
@@ -59,49 +59,49 @@ public:
QRegExp& operator=( const QRegExp& rx );
bool operator==( const QRegExp& rx ) const;
bool operator!=( const QRegExp& rx ) const { return !operator==( rx ); }
bool isEmpty() const;
bool isValid() const;
QString pattern() const;
void setPattern( const QString& pattern );
bool caseSensitive() const;
void setCaseSensitive( bool sensitive );
#ifndef QT_NO_REGEXP_WILDCARD
bool wildcard() const;
void setWildcard( bool wildcard );
#endif
bool minimal() const;
void setMinimal( bool minimal );
bool exactMatch( const QString& str ) const;
#ifndef QT_NO_COMPAT
int match( const QString& str, int index = 0, int *len = 0,
bool indexIsStart = TRUE ) const;
#endif
-#if defined(qdoc)
+#if defined(Q_QDOC)
int search( const QString& str, int offset = 0,
CaretMode caretMode = CaretAtZero ) const;
int searchRev( const QString& str, int offset = -1,
CaretMode caretMode = CaretAtZero ) const;
#else
// ### Qt 4.0: reduce these four to two functions
int search( const QString& str, int offset = 0 ) const;
int search( const QString& str, int offset, CaretMode caretMode ) const;
int searchRev( const QString& str, int offset = -1 ) const;
int searchRev( const QString& str, int offset, CaretMode caretMode ) const;
#endif
int matchedLength() const;
#ifndef QT_NO_REGEXP_CAPTURE
int numCaptures() const;
QStringList capturedTexts();
QString cap( int nth = 0 );
int pos( int nth = 0 );
QString errorString();
#endif
static QString escape( const QString& str );
private:
void compile( bool caseSensitive );
diff --git a/qmake/include/qstring.h b/qmake/include/qstring.h
index 2a87a5a..c1d6740 100644
--- a/qmake/include/qstring.h
+++ b/qmake/include/qstring.h
@@ -1,69 +1,75 @@
/****************************************************************************
** $Id$
**
-** Definition of the QString class, and related Unicode
-** functions.
+** Definition of the QString class, and related Unicode functions.
**
** Created : 920609
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QSTRING_H
#define QSTRING_H
#ifndef QT_H
#include "qcstring.h"
#endif // QT_H
+#ifndef QT_NO_STL
+#include <string>
+#if defined(Q_WRONG_SB_CTYPE_MACROS) && defined(_SB_CTYPE_MACROS)
+#undef _SB_CTYPE_MACROS
+#endif
+#endif
+
/*****************************************************************************
QString class
*****************************************************************************/
class QRegExp;
class QString;
class QCharRef;
template <class T> class QDeepCopy;
class Q_EXPORT QChar {
public:
QChar();
QChar( char c );
QChar( uchar c );
QChar( uchar c, uchar r );
QChar( const QChar& c );
QChar( ushort rc );
QChar( short rc );
QChar( uint rc );
QChar( int rc );
QT_STATIC_CONST QChar null; // 0000
QT_STATIC_CONST QChar replacement; // FFFD
@@ -315,101 +321,105 @@ inline bool operator<=( QChar c, char ch )
inline bool operator<=( char ch, QChar c )
{
return ((uchar) ch) <= c.ucs;
}
inline bool operator<=( QChar c1, QChar c2 )
{
return c1.ucs <= c2.ucs;
}
inline bool operator>=( QChar c, char ch ) { return ch <= c; }
inline bool operator>=( char ch, QChar c ) { return c <= ch; }
inline bool operator>=( QChar c1, QChar c2 ) { return c2 <= c1; }
inline bool operator<( QChar c, char ch ) { return !(ch<=c); }
inline bool operator<( char ch, QChar c ) { return !(c<=ch); }
inline bool operator<( QChar c1, QChar c2 ) { return !(c2<=c1); }
inline bool operator>( QChar c, char ch ) { return !(ch>=c); }
inline bool operator>( char ch, QChar c ) { return !(c>=ch); }
inline bool operator>( QChar c1, QChar c2 ) { return !(c2>=c1); }
// internal
struct Q_EXPORT QStringData : public QShared {
QStringData() :
- QShared(), unicode(0), ascii(0), len(0), simpletext(1), maxl(0), dirty(0) { ref(); }
+ QShared(), unicode(0), ascii(0), len(0), issimpletext(TRUE), maxl(0), islatin1(FALSE) { ref(); }
QStringData(QChar *u, uint l, uint m) :
- QShared(), unicode(u), ascii(0), len(l), simpletext(1), maxl(m), dirty(1) { }
+ QShared(), unicode(u), ascii(0), len(l), issimpletext(FALSE), maxl(m), islatin1(FALSE) { }
~QStringData() { if ( unicode ) delete[] ((char*)unicode);
if ( ascii ) delete[] ascii; }
void deleteSelf();
QChar *unicode;
char *ascii;
void setDirty() {
if ( ascii ) {
delete [] ascii;
ascii = 0;
}
- dirty = 1;
+ issimpletext = FALSE;
}
#ifdef Q_OS_MAC9
uint len;
#else
uint len : 30;
#endif
- uint simpletext : 1;
+ uint issimpletext : 1;
#ifdef Q_OS_MAC9
uint maxl;
#else
uint maxl : 30;
#endif
- uint dirty : 1;
+ uint islatin1 : 1;
private:
#if defined(Q_DISABLE_COPY)
QStringData( const QStringData& );
QStringData& operator=( const QStringData& );
#endif
};
class Q_EXPORT QString
{
public:
QString(); // make null string
QString( QChar ); // one-char string
QString( const QString & ); // impl-shared copy
QString( const QByteArray& ); // deep copy
QString( const QChar* unicode, uint length ); // deep copy
#ifndef QT_NO_CAST_ASCII
QString( const char *str ); // deep copy
#endif
+#ifndef QT_NO_STL
+ QString( const std::string& ); // deep copy
+#endif
~QString();
QString &operator=( const QString & ); // impl-shared copy
-#ifndef QT_NO_CAST_ASCII
QString &operator=( const char * ); // deep copy
+#ifndef QT_NO_STL
+ QString &operator=( const std::string& ); // deep copy
#endif
QString &operator=( const QCString& ); // deep copy
QString &operator=( QChar c );
QString &operator=( char c );
QT_STATIC_CONST QString null;
bool isNull() const;
bool isEmpty() const;
uint length() const;
void truncate( uint pos );
QString & fill( QChar c, int len = -1 );
QString copy() const;
QString arg( long a, int fieldwidth=0, int base=10 ) const;
QString arg( ulong a, int fieldwidth=0, int base=10 ) const;
QString arg( int a, int fieldwidth=0, int base=10 ) const;
QString arg( uint a, int fieldwidth=0, int base=10 ) const;
QString arg( short a, int fieldwidth=0, int base=10 ) const;
QString arg( ushort a, int fieldwidth=0, int base=10 ) const;
QString arg( char a, int fieldwidth=0 ) const;
QString arg( QChar a, int fieldwidth=0 ) const;
@@ -473,55 +483,61 @@ public:
QString left( uint len ) const;
QString right( uint len ) const;
QString mid( uint index, uint len=0xffffffff) const;
QString leftJustify( uint width, QChar fill=' ', bool trunc=FALSE)const;
QString rightJustify( uint width, QChar fill=' ',bool trunc=FALSE)const;
QString lower() const;
QString upper() const;
QString stripWhiteSpace() const;
QString simplifyWhiteSpace() const;
QString &insert( uint index, const QString & );
QString &insert( uint index, const QChar*, uint len );
QString &insert( uint index, QChar );
QString &insert( uint index, char c ) { return insert(index,QChar(c)); }
QString &append( char );
QString &append( QChar );
QString &append( const QString & );
#ifndef QT_NO_CAST_ASCII
QString &append( const QByteArray & );
QString &append( const char * );
#endif
+#ifndef QT_NO_STL
+ QString &append( const std::string& );
+#endif
QString &prepend( char );
QString &prepend( QChar );
QString &prepend( const QString & );
#ifndef QT_NO_CAST_ASCII
QString &prepend( const QByteArray & );
QString &prepend( const char * );
#endif
+#ifndef QT_NO_STL
+ QString &prepend( const std::string& );
+#endif
QString &remove( uint index, uint len );
QString &remove( QChar c );
QString &remove( char c ) { return remove( QChar(c) ); }
QString &remove( const QString & );
#ifndef QT_NO_REGEXP
QString &remove( const QRegExp & );
#endif
#ifndef QT_NO_CAST_ASCII
QString &remove( const char * );
#endif
QString &replace( uint index, uint len, const QString & );
QString &replace( uint index, uint len, const QChar*, uint clen );
QString &replace( uint index, uint len, QChar );
QString &replace( uint index, uint len, char c )
{ return replace( index, len, QChar(c) ); }
QString &replace( QChar c, const QString & );
QString &replace( char c, const QString & after )
{ return replace( QChar(c), after ); }
QString &replace( const QString &, const QString & );
#ifndef QT_NO_REGEXP_CAPTURE
QString &replace( const QRegExp &, const QString & );
#endif
QString &replace( QChar, QChar );
@@ -535,126 +551,135 @@ public:
double toDouble( bool *ok=0 ) const;
QString &setNum( short, int base=10 );
QString &setNum( ushort, int base=10 );
QString &setNum( int, int base=10 );
QString &setNum( uint, int base=10 );
QString &setNum( long, int base=10 );
QString &setNum( ulong, int base=10 );
QString &setNum( float, char f='g', int prec=6 );
QString &setNum( double, char f='g', int prec=6 );
static QString number( long, int base=10 );
static QString number( ulong, int base=10);
static QString number( int, int base=10 );
static QString number( uint, int base=10);
static QString number( double, char f='g', int prec=6 );
void setExpand( uint index, QChar c );
QString &operator+=( const QString &str );
#ifndef QT_NO_CAST_ASCII
QString &operator+=( const QByteArray &str );
QString &operator+=( const char *str );
#endif
+#ifndef QT_NO_STL
+ QString &operator+=( const std::string& );
+#endif
QString &operator+=( QChar c );
QString &operator+=( char c );
QChar at( uint i ) const
{ return i < d->len ? d->unicode[i] : QChar::null; }
QChar operator[]( int i ) const { return at((uint)i); }
QCharRef at( uint i );
QCharRef operator[]( int i );
QChar constref(uint i) const
{ return at(i); }
QChar& ref(uint i)
{ // Optimized for easy-inlining by simple compilers.
if ( d->count != 1 || i >= d->len )
subat( i );
d->setDirty();
return d->unicode[i];
}
const QChar* unicode() const { return d->unicode; }
- const char* ascii() const { return latin1(); }
+ const char* ascii() const;
+ static QString fromAscii(const char*, int len=-1);
const char* latin1() const;
static QString fromLatin1(const char*, int len=-1);
QCString utf8() const;
static QString fromUtf8(const char*, int len=-1);
QCString local8Bit() const;
static QString fromLocal8Bit(const char*, int len=-1);
bool operator!() const;
#ifndef QT_NO_ASCII_CAST
- operator const char *() const { return latin1(); }
+ operator const char *() const { return ascii(); }
#endif
+#ifndef QT_NO_STL
+ operator std::string() const { return ascii() ? ascii() : ""; }
+#endif
+
static QString fromUcs2( const unsigned short *ucs2 );
const unsigned short *ucs2() const;
QString &setUnicode( const QChar* unicode, uint len );
QString &setUnicodeCodes( const ushort* unicode_as_ushorts, uint len );
+ QString &setAscii( const char*, int len=-1 );
QString &setLatin1( const char*, int len=-1 );
int compare( const QString& s ) const;
static int compare( const QString& s1, const QString& s2 )
{ return s1.compare( s2 ); }
int localeAwareCompare( const QString& s ) const;
static int localeAwareCompare( const QString& s1, const QString& s2 )
{ return s1.localeAwareCompare( s2 ); }
#ifndef QT_NO_DATASTREAM
friend Q_EXPORT QDataStream &operator>>( QDataStream &, QString & );
#endif
void compose();
#ifndef QT_NO_COMPAT
- const char* data() const { return latin1(); }
+ const char* data() const { return ascii(); }
#endif
bool startsWith( const QString& ) const;
bool endsWith( const QString& ) const;
void setLength( uint newLength );
- bool simpleText() const { if ( d->dirty ) checkSimpleText(); return (bool)d->simpletext; }
+ bool simpleText() const { if ( !d->issimpletext ) checkSimpleText(); return (bool)d->issimpletext; }
bool isRightToLeft() const;
private:
QString( int size, bool /* dummy */ ); // allocate size incl. \0
void deref();
void real_detach();
void subat( uint );
bool findArg(int& pos, int& len) const;
void checkSimpleText() const;
- static QChar* asciiToUnicode( const char*, uint * len, uint maxlen=(uint)-1 );
- static QChar* asciiToUnicode( const QByteArray&, uint * len );
- static char* unicodeToAscii( const QChar*, uint len );
+ static QChar* latin1ToUnicode( const char*, uint * len, uint maxlen=(uint)-1 );
+ static QChar* latin1ToUnicode( const QByteArray&, uint * len );
+ static char* unicodeToLatin1( const QChar*, uint len );
QStringData *d;
static QStringData* shared_null;
static QStringData* makeSharedNull();
friend class QConstString;
friend class QTextStream;
QString( QStringData* dd, bool /* dummy */ ) : d(dd) { }
// needed for QDeepCopy
void detach();
friend class QDeepCopy<QString>;
};
class Q_EXPORT QCharRef {
friend class QString;
QString& s;
uint p;
QCharRef(QString* str, uint pos) : s(*str), p(pos) { }
public:
// most QChar operations repeated here...
// all this is not documented: We just say "like QChar" and let it be.
@@ -773,178 +798,194 @@ inline bool QString::isNull() const
inline bool QString::operator!() const
{ return isNull(); }
inline uint QString::length() const
{ return d->len; }
inline bool QString::isEmpty() const
{ return length() == 0; }
inline QString QString::copy() const
{ return QString( *this ); }
inline QString &QString::prepend( const QString & s )
{ return insert(0,s); }
inline QString &QString::prepend( QChar c )
{ return insert(0,c); }
inline QString &QString::prepend( char c )
{ return insert(0,c); }
#ifndef QT_NO_CAST_ASCII
inline QString &QString::prepend( const QByteArray & s )
-{ return insert(0,s.data()); }
+{ return insert(0,QString(s)); }
+#endif
+
+#ifndef QT_NO_STL
+inline QString &QString::prepend( const std::string& s )
+{ return insert(0, s); }
+#endif
+
+#ifndef QT_NO_CAST_ASCII
+inline QString &QString::operator+=( const QByteArray &s )
+{ return operator+=(QString(s)); }
#endif
inline QString &QString::append( const QString & s )
{ return operator+=(s); }
#ifndef QT_NO_CAST_ASCII
inline QString &QString::append( const QByteArray &s )
-{ return operator+=(s.data()); }
+{ return operator+=(s); }
inline QString &QString::append( const char * s )
{ return operator+=(s); }
#endif
inline QString &QString::append( QChar c )
{ return operator+=(c); }
inline QString &QString::append( char c )
{ return operator+=(c); }
-#ifndef QT_NO_CAST_ASCII
-inline QString &QString::operator+=( const QByteArray &s )
-{ return operator+=(s.data()); }
+#ifndef QT_NO_STL
+inline QString &QString::operator+=( const std::string& s )
+{ return operator+=(s.c_str()); }
+inline QString &QString::append( const std::string& s )
+{ return operator+=(s); }
#endif
inline QString &QString::setNum( short n, int base )
{ return setNum((long)n, base); }
inline QString &QString::setNum( ushort n, int base )
{ return setNum((ulong)n, base); }
inline QString &QString::setNum( int n, int base )
{ return setNum((long)n, base); }
inline QString &QString::setNum( uint n, int base )
{ return setNum((ulong)n, base); }
inline QString &QString::setNum( float n, char f, int prec )
{ return setNum((double)n,f,prec); }
inline QString QString::arg(int a, int fieldwidth, int base) const
{ return arg((long)a, fieldwidth, base); }
inline QString QString::arg(uint a, int fieldwidth, int base) const
{ return arg((ulong)a, fieldwidth, base); }
inline QString QString::arg(short a, int fieldwidth, int base) const
{ return arg((long)a, fieldwidth, base); }
inline QString QString::arg(ushort a, int fieldwidth, int base) const
{ return arg((ulong)a, fieldwidth, base); }
inline int QString::find( char c, int index, bool cs ) const
{ return find(QChar(c), index, cs); }
inline int QString::findRev( char c, int index, bool cs) const
{ return findRev( QChar(c), index, cs ); }
#ifndef QT_NO_CAST_ASCII
inline int QString::find( const char* str, int index ) const
-{ return find(QString::fromLatin1(str), index); }
+{ return find(QString::fromAscii(str), index); }
inline int QString::findRev( const char* str, int index ) const
-{ return findRev(QString::fromLatin1(str), index); }
+{ return findRev(QString::fromAscii(str), index); }
#endif
/*****************************************************************************
QString non-member operators
*****************************************************************************/
Q_EXPORT bool operator!=( const QString &s1, const QString &s2 );
Q_EXPORT bool operator<( const QString &s1, const QString &s2 );
Q_EXPORT bool operator<=( const QString &s1, const QString &s2 );
Q_EXPORT bool operator==( const QString &s1, const QString &s2 );
Q_EXPORT bool operator>( const QString &s1, const QString &s2 );
Q_EXPORT bool operator>=( const QString &s1, const QString &s2 );
#ifndef QT_NO_CAST_ASCII
Q_EXPORT bool operator!=( const QString &s1, const char *s2 );
Q_EXPORT bool operator<( const QString &s1, const char *s2 );
Q_EXPORT bool operator<=( const QString &s1, const char *s2 );
Q_EXPORT bool operator==( const QString &s1, const char *s2 );
Q_EXPORT bool operator>( const QString &s1, const char *s2 );
Q_EXPORT bool operator>=( const QString &s1, const char *s2 );
Q_EXPORT bool operator!=( const char *s1, const QString &s2 );
Q_EXPORT bool operator<( const char *s1, const QString &s2 );
Q_EXPORT bool operator<=( const char *s1, const QString &s2 );
Q_EXPORT bool operator==( const char *s1, const QString &s2 );
//Q_EXPORT bool operator>( const char *s1, const QString &s2 ); // MSVC++
Q_EXPORT bool operator>=( const char *s1, const QString &s2 );
#endif
Q_EXPORT inline const QString operator+( const QString &s1, const QString &s2 )
{
QString tmp( s1 );
tmp += s2;
return tmp;
}
#ifndef QT_NO_CAST_ASCII
Q_EXPORT inline const QString operator+( const QString &s1, const char *s2 )
{
QString tmp( s1 );
- tmp += QString::fromLatin1(s2);
+ tmp += QString::fromAscii(s2);
return tmp;
}
Q_EXPORT inline const QString operator+( const char *s1, const QString &s2 )
{
- QString tmp = QString::fromLatin1( s1 );
+ QString tmp = QString::fromAscii( s1 );
tmp += s2;
return tmp;
}
#endif
Q_EXPORT inline const QString operator+( const QString &s1, QChar c2 )
{
QString tmp( s1 );
tmp += c2;
return tmp;
}
Q_EXPORT inline const QString operator+( const QString &s1, char c2 )
{
QString tmp( s1 );
tmp += c2;
return tmp;
}
Q_EXPORT inline const QString operator+( QChar c1, const QString &s2 )
{
QString tmp;
tmp += c1;
tmp += s2;
return tmp;
}
Q_EXPORT inline const QString operator+( char c1, const QString &s2 )
{
QString tmp;
tmp += c1;
tmp += s2;
return tmp;
}
#if defined(Q_OS_WIN32)
extern Q_EXPORT QString qt_winQString(void*);
extern Q_EXPORT const void* qt_winTchar(const QString& str, bool addnul);
extern Q_EXPORT void* qt_winTchar_new(const QString& str);
extern Q_EXPORT QCString qt_winQString2MB( const QString& s, int len=-1 );
extern Q_EXPORT QString qt_winMB2QString( const char* mb, int len=-1 );
#endif
+#ifdef QT_QWINEXPORT
+#define Q_DEFINED_QSTRING
+#include "qwinexport.h"
+#endif /* QT_QWINEXPORT */
#endif // QSTRING_H
diff --git a/qmake/include/qstrlist.h b/qmake/include/qstrlist.h
index 86de328..b9dd753 100644
--- a/qmake/include/qstrlist.h
+++ b/qmake/include/qstrlist.h
@@ -24,52 +24,54 @@
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QSTRLIST_H
#define QSTRLIST_H
#ifndef QT_H
#include "qstring.h"
#include "qptrlist.h"
#include "qdatastream.h"
#endif // QT_H
+#ifndef QT_QWINEXPORT
#if defined(Q_TEMPLATEDLL)
Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrList<char>;
Q_TEMPLATE_EXTERN template class Q_EXPORT QPtrListIterator<char>;
#endif
+#endif /* QT_QWINEXPORT */
#if defined(Q_QDOC)
class QStrListIterator : public QPtrListIterator<char>
{
};
#else
typedef QPtrListIterator<char> QStrListIterator;
#endif
class Q_EXPORT QStrList : public QPtrList<char>
{
public:
QStrList( bool deepCopies=TRUE ) { dc = deepCopies; del_item = deepCopies; }
QStrList( const QStrList & );
~QStrList() { clear(); }
QStrList& operator=( const QStrList & );
private:
QPtrCollection::Item newItem( QPtrCollection::Item d ) { return dc ? qstrdup( (const char*)d ) : d; }
void deleteItem( QPtrCollection::Item d ) { if ( del_item ) delete[] (char*)d; }
int compareItems( QPtrCollection::Item s1, QPtrCollection::Item s2 ) { return qstrcmp((const char*)s1,
(const char*)s2); }
#ifndef QT_NO_DATASTREAM
QDataStream &read( QDataStream &s, QPtrCollection::Item &d )
diff --git a/qmake/include/qtextcodec.h b/qmake/include/qtextcodec.h
index 149b5cb..995e434 100644
--- a/qmake/include/qtextcodec.h
+++ b/qmake/include/qtextcodec.h
@@ -54,61 +54,75 @@ public:
virtual QCString fromUnicode(const QString& uc, int& lenInOut) = 0;
};
class Q_EXPORT QTextDecoder {
public:
virtual ~QTextDecoder();
virtual QString toUnicode(const char* chars, int len) = 0;
};
class Q_EXPORT QTextCodec {
public:
virtual ~QTextCodec();
#ifndef QT_NO_CODECS
static QTextCodec* loadCharmap(QIODevice*);
static QTextCodec* loadCharmapFile(QString filename);
#endif //QT_NO_CODECS
static QTextCodec* codecForMib(int mib);
static QTextCodec* codecForName(const char* hint, int accuracy=0);
static QTextCodec* codecForContent(const char* chars, int len);
static QTextCodec* codecForIndex(int i);
static QTextCodec* codecForLocale();
static void setCodecForLocale(QTextCodec *c);
+ static QTextCodec* codecForTr();
+ static void setCodecForTr(QTextCodec *c);
+ static QTextCodec* codecForCStrings();
+ static void setCodecForCStrings(QTextCodec *c);
+
static void deleteAllCodecs();
static const char* locale();
virtual const char* name() const = 0;
virtual const char* mimeName() const;
virtual int mibEnum() const = 0;
virtual QTextDecoder* makeDecoder() const;
virtual QTextEncoder* makeEncoder() const;
virtual QString toUnicode(const char* chars, int len) const;
virtual QCString fromUnicode(const QString& uc, int& lenInOut) const;
-
+
QCString fromUnicode(const QString& uc) const;
QString toUnicode(const QByteArray&, int len) const;
QString toUnicode(const QByteArray&) const;
QString toUnicode(const QCString&, int len) const;
QString toUnicode(const QCString&) const;
QString toUnicode(const char* chars) const;
virtual bool canEncode( QChar ) const;
virtual bool canEncode( const QString& ) const;
virtual int heuristicContentMatch(const char* chars, int len) const = 0;
virtual int heuristicNameMatch(const char* hint) const;
virtual QByteArray fromUnicode(const QString& uc, int from, int len) const;
virtual unsigned short characterFromUnicode(const QString &str, int pos) const;
protected:
QTextCodec();
static int simpleHeuristicNameMatch(const char* name, const char* hint);
+private:
+ static QTextCodec *cftr;
+ static QTextCodec *cfcs;
friend class QFont;
};
+
+inline QTextCodec* QTextCodec::codecForTr() { return cftr; }
+inline void QTextCodec::setCodecForTr(QTextCodec *c) { cftr = c; }
+inline QTextCodec* QTextCodec::codecForCStrings() { return cfcs; }
+inline void QTextCodec::setCodecForCStrings(QTextCodec *c) { cfcs = c; }
+
#endif // QT_NO_TEXTCODEC
#endif // QTEXTCODEC_H
diff --git a/qmake/include/qtl.h b/qmake/include/qtl.h
index 346cecc..25631fd 100644
--- a/qmake/include/qtl.h
+++ b/qmake/include/qtl.h
@@ -68,48 +68,49 @@ public:
};
#endif //QT_NO_TEXTSTREAM
template <class InputIterator, class OutputIterator>
inline OutputIterator qCopy( InputIterator _begin, InputIterator _end,
OutputIterator _dest )
{
while( _begin != _end )
*_dest++ = *_begin++;
return _dest;
}
template <class BiIterator, class BiOutputIterator>
inline BiOutputIterator qCopyBackward( BiIterator _begin, BiIterator _end,
BiOutputIterator _dest )
{
while ( _begin != _end )
*--_dest = *--_end;
return _dest;
}
template <class InputIterator1, class InputIterator2>
inline bool qEqual( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 )
{
+ // ### compare using !(*first1 == *first2) in Qt 4.0
for ( ; first1 != last1; ++first1, ++first2 )
if ( *first1 != *first2 )
return FALSE;
return TRUE;
}
template <class ForwardIterator, class T>
inline void qFill( ForwardIterator first, ForwardIterator last, const T& val )
{
for ( ; first != last; ++first )
*first = val;
}
#if 0
template <class BiIterator, class OutputIterator>
inline OutputIterator qReverseCopy( BiIterator _begin, BiIterator _end,
OutputIterator _dest )
{
while ( _begin != _end ) {
--_end;
*_dest = *_end;
++_dest;
}
return _dest;
diff --git a/qmake/include/quuid.h b/qmake/include/quuid.h
index 591d2f1..664c149 100644
--- a/qmake/include/quuid.h
+++ b/qmake/include/quuid.h
@@ -1,80 +1,80 @@
/****************************************************************************
** $Id$
**
** Definition of QUuid class
**
-** Created: 010523
+** Created : 010523
**
-** Copyright (C) 1992-2001 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2003 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QUUID_H
#define QUUID_H
#ifndef QT_H
#include <qstring.h>
#endif // QT_H
#include <string.h>
#if defined(Q_OS_WIN32)
#ifndef GUID_DEFINED
#define GUID_DEFINED
typedef struct _GUID
{
ulong Data1;
ushort Data2;
ushort Data3;
uchar Data4[ 8 ];
-} GUID;
+} GUID, *REFGUID, *LPGUID;
#endif
#endif
struct Q_EXPORT QUuid
{
QUuid()
{
memset( this, 0, sizeof(QUuid) );
}
QUuid( uint l, ushort w1, ushort w2, uchar b1, uchar b2, uchar b3, uchar b4, uchar b5, uchar b6, uchar b7, uchar b8 )
{
data1 = l;
data2 = w1;
data3 = w2;
data4[0] = b1;
data4[1] = b2;
data4[2] = b3;
data4[3] = b4;
data4[4] = b5;
data4[5] = b6;
data4[6] = b7;
data4[7] = b8;
}
QUuid( const QUuid &uuid )
diff --git a/qmake/include/qvaluelist.h b/qmake/include/qvaluelist.h
index 54f7aec..f5cd7bb 100644
--- a/qmake/include/qvaluelist.h
+++ b/qmake/include/qvaluelist.h
@@ -641,25 +641,29 @@ Q_INLINE_TEMPLATES QDataStream& operator>>( QDataStream& s, QValueList<T>& l )
l.clear();
Q_UINT32 c;
s >> c;
for( Q_UINT32 i = 0; i < c; ++i )
{
T t;
s >> t;
l.append( t );
if ( s.atEnd() )
break;
}
return s;
}
template <class T>
Q_INLINE_TEMPLATES QDataStream& operator<<( QDataStream& s, const QValueList<T>& l )
{
s << (Q_UINT32)l.size();
QValueListConstIterator<T> it = l.begin();
for( ; it != l.end(); ++it )
s << *it;
return s;
}
#endif // QT_NO_DATASTREAM
+#ifdef QT_QWINEXPORT
+#define Q_DEFINED_QVALUELIST
+#include "qwinexport.h"
+#endif /* QT_QWINEXPORT */
#endif // QVALUELIST_H
diff --git a/qmake/include/qvaluestack.h b/qmake/include/qvaluestack.h
index 7e9bc48..c3f966e 100644
--- a/qmake/include/qvaluestack.h
+++ b/qmake/include/qvaluestack.h
@@ -1,64 +1,64 @@
/****************************************************************************
** $Id$
**
** Definition of QValueStack class
**
** Created : 990925
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2003 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QVALUESTACK_H
#define QVALUESTACK_H
#ifndef QT_H
#include "qvaluelist.h"
#endif // QT_H
template<class T>
class QValueStack : public QValueList<T>
{
public:
QValueStack() {}
~QValueStack() {}
void push( const T& d ) { append(d); }
T pop()
{
T elem( this->last() );
if ( !this->isEmpty() )
- remove( this->fromLast() );
+ this->remove( this->fromLast() );
return elem;
}
T& top() { return this->last(); }
const T& top() const { return this->last(); }
};
#endif
diff --git a/qmake/main.cpp b/qmake/main.cpp
index eed1697..cc2d08a 100644
--- a/qmake/main.cpp
+++ b/qmake/main.cpp
@@ -39,50 +39,55 @@
#include "option.h"
#include "makefile.h"
#include <qnamespace.h>
#include <qregexp.h>
#include <qdir.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
// for Borland, main is defined to qMain which breaks qmake
#undef main
int main(int argc, char **argv)
{
/* parse command line */
if(!Option::parseCommandLine(argc, argv))
return 666;
QDir sunworkshop42workaround = QDir::current();
QString oldpwd = sunworkshop42workaround.currentDirPath();
Option::output_dir = oldpwd; //for now this is the output dir
- if(Option::output_dir.right(1) != QString(QChar(QDir::separator())))
- Option::output_dir += QDir::separator();
+#ifdef Q_WS_WIN
+ if ( !(Option::output_dir.length() == 3 && Option::output_dir[0].isLetter() && Option::output_dir.endsWith(":/") ) )
+#endif
+ {
+ if(Option::output_dir.right(1) != QString(QChar(QDir::separator())))
+ Option::output_dir += QDir::separator();
+ }
QMakeProject proj;
int exit_val = 0;
QStringList files;
if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT)
files << "(*hack*)"; //we don't even use files, but we do the for() body once
else
files = Option::mkfile::project_files;
for(QStringList::Iterator pfile = files.begin(); pfile != files.end(); pfile++) {
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
QString fn = (*pfile);
//setup pwd properly
debug_msg(1, "Resetting dir to: %s", oldpwd.latin1());
QDir::setCurrent(oldpwd); //reset the old pwd
int di = fn.findRev(Option::dir_sep);
if(di != -1) {
debug_msg(1, "Changing dir to: %s", fn.left(di).latin1());
if(!QDir::setCurrent(fn.left(fn.findRev(Option::dir_sep))))
fprintf(stderr, "Cannot find directory: %s\n", fn.left(di).latin1());
fn = fn.right(fn.length() - di - 1);
}
/* read project.. */
diff --git a/qmake/option.cpp b/qmake/option.cpp
index 34b3ee2..8b7e5e8 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -61,270 +61,325 @@ Option::QMAKE_MODE Option::qmake_mode = Option::QMAKE_GENERATE_NOTHING;
//all modes
int Option::warn_level = WarnLogic;
int Option::debug_level = 0;
QFile Option::output;
QString Option::output_dir;
QStringList Option::before_user_vars;
QStringList Option::after_user_vars;
QString Option::user_template;
QString Option::user_template_prefix;
#if defined(Q_OS_WIN32)
Option::TARG_MODE Option::target_mode = Option::TARG_WIN_MODE;
#elif defined(Q_OS_MAC9)
Option::TARG_MODE Option::target_mode = Option::TARG_MAC9_MODE;
#elif defined(Q_OS_MACX)
Option::TARG_MODE Option::target_mode = Option::TARG_MACX_MODE;
#elif defined(Q_OS_QNX6)
Option::TARG_MODE Option::target_mode = Option::TARG_QNX6_MODE;
#else
Option::TARG_MODE Option::target_mode = Option::TARG_UNIX_MODE;
#endif
//QMAKE_GENERATE_PROJECT stuff
bool Option::projfile::do_pwd = TRUE;
-bool Option::projfile::do_recursive = FALSE;
+bool Option::projfile::do_recursive = TRUE;
QStringList Option::projfile::project_dirs;
//QMAKE_GENERATE_MAKEFILE stuff
QString Option::mkfile::qmakespec;
int Option::mkfile::cachefile_depth = -1;
bool Option::mkfile::do_deps = TRUE;
bool Option::mkfile::do_mocs = TRUE;
bool Option::mkfile::do_dep_heuristics = TRUE;
bool Option::mkfile::do_preprocess = FALSE;
bool Option::mkfile::do_cache = TRUE;
QString Option::mkfile::cachefile;
QStringList Option::mkfile::project_files;
QString Option::mkfile::qmakespec_commandline;
+static Option::QMAKE_MODE default_mode(QString progname)
+{
+ int s = progname.findRev(Option::dir_sep);
+ if(s != -1)
+ progname = progname.right(progname.length() - (s + 1));
+ if(progname == "qmakegen")
+ return Option::QMAKE_GENERATE_PROJECT;
+ return Option::QMAKE_GENERATE_MAKEFILE;
+}
+
+QString project_builtin_regx();
bool usage(const char *a0)
{
fprintf(stdout, "Usage: %s [mode] [options] [files]\n"
"\n"
" QMake has two modes, one mode for generating project files based on\n"
"some heuristics, and the other for generating makefiles. Normally you\n"
"shouldn't need to specify a mode, as makefile generation is the default\n"
"mode for qmake, but you may use this to test qmake on an existing project\n"
"\n"
"Mode:\n"
- "\t-project Put qmake into project file generation mode\n"
+ "\t-project Put qmake into project file generation mode%s\n"
"\t In this mode qmake interprets files as files to\n"
"\t be built,\n"
- "\t defaults to *.cpp; *.l; *.y; *.ui\n"
- "\t-makefile Put qmake into makefile generation mode (default)\n"
+ "\t defaults to %s\n"
+ "\t-makefile Put qmake into makefile generation mode%s\n"
"\t In this mode qmake interprets files as project files to\n"
"\t be processed, if skipped qmake will try to find a project\n"
"\t file in your current working directory\n"
"\n"
"Warnings Options:\n"
"\t-Wnone Turn off all warnings\n"
"\t-Wall Turn on all warnings\n"
"\t-Wparser Turn on parser warnings\n"
"\t-Wlogic Turn on logic warnings\n"
"\n"
"Options:\n"
"\t * You can place any variable assignment in options and it will be *\n"
"\t * processed as if it was in [files]. These assignments will be parsed *\n"
"\t * before [files]. *\n"
"\t-o file Write output to file\n"
"\t-unix Run in unix mode\n"
"\t-win32 Run in win32 mode\n"
"\t-macx Run in Mac OS X mode\n"
"\t-d Increase debug level\n"
"\t-t templ Overrides TEMPLATE as templ\n"
"\t-tp prefix Overrides TEMPLATE so that prefix is prefixed into the value\n"
"\t-help This help\n"
"\t-v Version information\n"
"\t-after All variable assignments after this will be\n"
- "\t parsed after [files] [makefile mode only]\n"
+ "\t parsed after [files]\n"
"\t-cache file Use file as cache [makefile mode only]\n"
"\t-spec spec Use spec as QMAKESPEC [makefile mode only]\n"
"\t-nocache Don't use a cache file [makefile mode only]\n"
"\t-nodepend Don't generate dependencies [makefile mode only]\n"
"\t-nomoc Don't generate moc targets [makefile mode only]\n"
"\t-nopwd Don't look for files in pwd [ project mode only]\n"
- "\t-r Recursive search [ project mode only]\n"
- ,a0);
+ "\t-norecursive Don't do a recursive search [ project mode only]\n"
+ ,a0,
+ default_mode(a0) == Option::QMAKE_GENERATE_PROJECT ? " (default)" : "", project_builtin_regx().latin1(),
+ default_mode(a0) == Option::QMAKE_GENERATE_MAKEFILE ? " (default)" : "");
return FALSE;
}
-static Option::QMAKE_MODE default_mode(QString progname)
-{
- int s = progname.findRev(Option::dir_sep);
- if(s != -1)
- progname = progname.right(progname.length() - (s + 1));
- if(progname == "qmakegen")
- return Option::QMAKE_GENERATE_PROJECT;
- return Option::QMAKE_GENERATE_MAKEFILE;
-}
-
bool
-Option::parseCommandLine(int argc, char **argv)
+Option::internalParseCommandLine(int argc, char **argv, int skip)
{
bool before = TRUE;
- for(int x = 1; x < argc; x++) {
+ for(int x = skip; x < argc; x++) {
if(*argv[x] == '-' && strlen(argv[x]) > 1) { /* options */
QString opt = argv[x] + 1;
//first param is a mode, or we default
if(x == 1) {
bool specified = TRUE;
if(opt == "project") {
Option::qmake_mode = Option::QMAKE_GENERATE_PROJECT;
} else if(opt == "prl") {
Option::mkfile::do_deps = FALSE;
Option::mkfile::do_mocs = FALSE;
Option::qmake_mode = Option::QMAKE_GENERATE_PRL;
} else if(opt == "makefile") {
Option::qmake_mode = Option::QMAKE_GENERATE_MAKEFILE;
} else {
specified = FALSE;
- Option::qmake_mode = default_mode(argv[0]);
}
if(specified)
continue;
}
//all modes
if(opt == "o" || opt == "output") {
Option::output.setName(argv[++x]);
} else if(opt == "after") {
before = FALSE;
} else if(opt == "t" || opt == "template") {
Option::user_template = argv[++x];
} else if(opt == "tp" || opt == "template_prefix") {
Option::user_template_prefix = argv[++x];
} else if(opt == "mac9") {
Option::target_mode = TARG_MAC9_MODE;
} else if(opt == "macx") {
Option::target_mode = TARG_MACX_MODE;
} else if(opt == "unix") {
Option::target_mode = TARG_UNIX_MODE;
} else if(opt == "win32") {
Option::target_mode = TARG_WIN_MODE;
} else if(opt == "d") {
Option::debug_level++;
} else if(opt == "version" || opt == "v" || opt == "-version") {
- fprintf(stderr, "Qmake version: %s\n", qmake_version());
+ fprintf(stderr, "Qmake version: %s (Qt %s)\n", qmake_version(), QT_VERSION_STR);
fprintf(stderr, "Qmake is free software from Trolltech AS.\n");
return FALSE;
} else if(opt == "h" || opt == "help") {
- return usage(argv[0]);
+ return FALSE;
} else if(opt == "Wall") {
Option::warn_level |= WarnAll;
} else if(opt == "Wparser") {
Option::warn_level |= WarnParser;
} else if(opt == "Wlogic") {
Option::warn_level |= WarnLogic;
} else if(opt == "Wnone") {
Option::warn_level = WarnNone;
} else {
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
if(opt == "nodepend") {
Option::mkfile::do_deps = FALSE;
} else if(opt == "nomoc") {
Option::mkfile::do_mocs = FALSE;
} else if(opt == "nocache") {
Option::mkfile::do_cache = FALSE;
} else if(opt == "nodependheuristics") {
Option::mkfile::do_dep_heuristics = FALSE;
} else if(opt == "E") {
Option::mkfile::do_preprocess = TRUE;
} else if(opt == "cache") {
Option::mkfile::cachefile = argv[++x];
} else if(opt == "platform" || opt == "spec") {
Option::mkfile::qmakespec = argv[++x];
Option::mkfile::qmakespec_commandline = argv[x];
} else {
fprintf(stderr, "***Unknown option -%s\n", opt.latin1());
return usage(argv[0]);
}
} else if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) {
if(opt == "nopwd") {
Option::projfile::do_pwd = FALSE;
} else if(opt == "r") {
Option::projfile::do_recursive = TRUE;
+ } else if(opt == "norecursive") {
+ Option::projfile::do_recursive = FALSE;
} else {
fprintf(stderr, "***Unknown option -%s\n", opt.latin1());
- return usage(argv[0]);
+ return FALSE;
}
}
}
} else {
- if(x == 1)
- Option::qmake_mode = default_mode(argv[0]);
-
QString arg = argv[x];
if(arg.find('=') != -1) {
if(before)
Option::before_user_vars.append(arg);
else
Option::after_user_vars.append(arg);
} else {
QFileInfo fi(arg);
if(!fi.convertToAbs()) //strange
arg = fi.filePath();
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL)
Option::mkfile::project_files.append(arg);
else
Option::projfile::project_dirs.append(arg);
}
}
}
+ return TRUE;
+}
+
+
+bool
+Option::parseCommandLine(int argc, char **argv)
+{
+ Option::moc_mod = "moc_";
+ Option::lex_mod = "_lex";
+ Option::yacc_mod = "_yacc";
+ Option::prl_ext = ".prl";
+ Option::prf_ext = ".prf";
+ Option::ui_ext = ".ui";
+ Option::h_ext << ".h" << ".hpp" << ".hh" << ".H" << ".hxx";
+ Option::moc_ext = ".moc";
+ Option::cpp_ext << ".cpp" << ".cc" << ".cxx" << ".C";
+ Option::lex_ext = ".l";
+ Option::yacc_ext = ".y";
+
if(Option::qmake_mode == Option::QMAKE_GENERATE_NOTHING)
Option::qmake_mode = default_mode(argv[0]);
+ if(const char *envflags = getenv("QMAKEFLAGS")) {
+ int env_argc = 0, env_size = 0, currlen=0;
+ char quote = 0, **env_argv = NULL;
+ for(int i = 0; envflags[i]; i++) {
+ if(!quote && (envflags[i] == '\'' || envflags[i] == '"')) {
+ quote = envflags[i];
+ } else if(envflags[i] == quote) {
+ quote = 0;
+ } else if(!quote && envflags[i] == ' ') {
+ if(currlen && env_argv && env_argv[env_argc]) {
+ env_argv[env_argc][currlen] = '\0';
+ currlen = 0;
+ env_argc++;
+ }
+ } else {
+ if(!env_argv || env_argc > env_size) {
+ env_argv = (char **)realloc(env_argv, sizeof(char *)*(env_size+=10));
+ for(int i2 = env_argc; i2 < env_size; i2++)
+ env_argv[i2] = NULL;
+ }
+ if(!env_argv[env_argc]) {
+ currlen = 0;
+ env_argv[env_argc] = (char*)malloc(255);
+ }
+ if(currlen < 255)
+ env_argv[env_argc][currlen++] = envflags[i];
+ }
+ }
+ if(env_argv[env_argc]) {
+ env_argv[env_argc][currlen] = '\0';
+ currlen = 0;
+ env_argc++;
+ }
+ internalParseCommandLine(env_argc, env_argv);
+ for(int i2 = 0; i2 < env_size; i2++) {
+ if(env_argv[i2])
+ free(env_argv[i2]);
+ }
+ free(env_argv);
+ }
+ if(!internalParseCommandLine(argc, argv, 1))
+ return usage(argv[0]);
//last chance for defaults
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
if(Option::mkfile::qmakespec.isNull() || Option::mkfile::qmakespec.isEmpty())
Option::mkfile::qmakespec = getenv("QMAKESPEC");
//try REALLY hard to do it for them, lazy..
if(Option::mkfile::project_files.isEmpty()) {
- QString proj = QDir::currentDirPath();
- proj = proj.right(proj.length() - (proj.findRev('/') + 1)) + ".pro";
- if(QFile::exists(proj))
+ QString pwd = QDir::currentDirPath(),
+ proj = pwd + "/" + pwd.right(pwd.length() - (pwd.findRev('/') + 1)) + ".pro";
+ if(QFile::exists(proj)) {
Option::mkfile::project_files.append(proj);
- else
- return usage(argv[0]);
+ } else { //last try..
+ QDir d(pwd, "*.pro");
+ if(d.count() != 1)
+ return usage(argv[0]);
+ Option::mkfile::project_files.append(pwd + "/" + d[0]);
+ }
}
}
//defaults for globals
- Option::moc_mod = "moc_";
- Option::lex_mod = "_lex";
- Option::yacc_mod = "_yacc";
- Option::prl_ext = ".prl";
- Option::prf_ext = ".prf";
- Option::ui_ext = ".ui";
- Option::h_ext << ".h" << ".hpp" << ".hh" << ".H" << ".hxx";
- Option::moc_ext = ".moc";
- Option::cpp_ext << ".cpp" << ".cc" << ".cxx" << ".C";
- Option::lex_ext = ".l";
- Option::yacc_ext = ".y";
if(Option::target_mode == Option::TARG_WIN_MODE) {
Option::dir_sep = "\\";
Option::obj_ext = ".obj";
} else {
if(Option::target_mode == Option::TARG_MAC9_MODE)
Option::dir_sep = ":";
else
Option::dir_sep = "/";
Option::obj_ext = ".o";
}
return TRUE;
}
bool Option::postProcessProject(QMakeProject *project)
{
Option::cpp_ext = project->variables()["QMAKE_EXT_CPP"];
if(cpp_ext.isEmpty())
cpp_ext << ".cpp"; //something must be there
Option::h_ext = project->variables()["QMAKE_EXT_H"];
if(h_ext.isEmpty())
h_ext << ".h";
if(!project->isEmpty("QMAKE_EXT_PRL"))
Option::prl_ext = project->first("QMAKE_EXT_PRL");
@@ -365,55 +420,55 @@ static QString fixPath(QString x)
QFileInfo fi(x);
if(fi.isDir()) {
QDir dir(x);
x = dir.canonicalPath();
} else {
QString dir = fi.dir().canonicalPath();
if(!dir.isEmpty() && dir.right(1) != Option::dir_sep)
dir += Option::dir_sep;
x = dir + fi.fileName();
}
#endif
return QDir::cleanDirPath(x);
}
QString
Option::fixPathToTargetOS(const QString& in, bool fix_env, bool canonical)
{
QString tmp(in);
if(fix_env)
fixEnvVariables(tmp);
if(canonical)
tmp = fixPath(tmp);
QString rep;
- if(Option::target_mode == TARG_MAC9_MODE)
- rep = "[/\\\\]";
- else if(Option::target_mode == TARG_WIN_MODE)
- rep = "[/]";
- else
- rep = "[\\\\]";
- return tmp.replace(QRegExp(rep), Option::dir_sep);
+ if(Option::target_mode == TARG_MAC9_MODE)
+ tmp = tmp.replace('/', Option::dir_sep).replace('\\', Option::dir_sep);
+ else if(Option::target_mode == TARG_WIN_MODE)
+ tmp = tmp.replace('/', Option::dir_sep);
+ else
+ tmp = tmp.replace('\\', Option::dir_sep);
+ return tmp;
}
QString
Option::fixPathToLocalOS(const QString& in, bool fix_env, bool canonical)
{
QString tmp(in);
if(fix_env)
fixEnvVariables(tmp);
if(canonical)
tmp = fixPath(tmp);
#if defined(Q_OS_WIN32)
return tmp.replace('/', '\\');
#else
return tmp.replace('\\', '/');
#endif
}
const char *qmake_version()
{
static char *ret = NULL;
if(ret)
return ret;
ret = (char *)malloc(15);
sprintf(ret, "%d.%02d%c", QMAKE_VERSION_MAJOR, QMAKE_VERSION_MINOR, 'a' + QMAKE_VERSION_PATCH);
diff --git a/qmake/option.h b/qmake/option.h
index 9a5a85a..8bd348e 100644
--- a/qmake/option.h
+++ b/qmake/option.h
@@ -22,49 +22,49 @@
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef __OPTION_H__
#define __OPTION_H__
#include "project.h"
#include <qstring.h>
#include <qstringlist.h>
#include <qfile.h>
#define QMAKE_VERSION_MAJOR 1
-#define QMAKE_VERSION_MINOR 4
+#define QMAKE_VERSION_MINOR 5
#define QMAKE_VERSION_PATCH 0
const char *qmake_version();
void fixEnvVariables(QString &x);
void debug_msg(int level, const char *fmt, ...);
enum QMakeWarn {
WarnNone = 0x00,
WarnParser = 0x01,
WarnLogic = 0x02,
WarnAll = 0xFF
};
void warn_msg(QMakeWarn t, const char *fmt, ...);
struct Option
{
//simply global convenience
static QString prf_ext;
static QString prl_ext;
static QString ui_ext;
static QStringList h_ext;
static QStringList cpp_ext;
static QString moc_ext;
static QString obj_ext;
static QString lex_ext;
@@ -95,28 +95,31 @@ struct Option
enum TARG_MODE { TARG_UNIX_MODE, TARG_WIN_MODE, TARG_MACX_MODE, TARG_MAC9_MODE, TARG_QNX6_MODE };
static TARG_MODE target_mode;
static QString user_template, user_template_prefix;
//QMAKE_GENERATE_PROJECT options
struct projfile {
static bool do_pwd;
static bool do_recursive;
static QStringList project_dirs;
};
//QMAKE_GENERATE_MAKEFILE options
struct mkfile {
static QString qmakespec;
static bool do_cache;
static bool do_deps;
static bool do_mocs;
static bool do_dep_heuristics;
static bool do_preprocess;
static QString cachefile;
static int cachefile_depth;
static QStringList project_files;
static QString qmakespec_commandline;
};
+
+private:
+ static bool internalParseCommandLine(int, char **, int=0);
};
#endif /* __OPTION_H__ */
diff --git a/qmake/project.cpp b/qmake/project.cpp
index 44eb503..834823d 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -45,147 +45,158 @@
#ifdef Q_OS_UNIX
# include <unistd.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#ifdef Q_OS_WIN32
#define QT_POPEN _popen
#else
#define QT_POPEN popen
#endif
struct parser_info {
QString file;
int line_no;
} parser;
static void qmake_error_msg(const char *msg)
{
fprintf(stderr, "%s:%d: %s\n", parser.file.latin1(), parser.line_no, msg);
}
static QString varMap(const QString &x)
{
QString ret(x);
- ret.replace(QRegExp("^TMAKE"), "QMAKE");
+ if(ret.startsWith("TMAKE")) //tmake no more!
+ ret = "QMAKE" + ret.mid(5);
if(ret == "INTERFACES")
ret = "FORMS";
+ if(ret == "QMAKE_POST_BUILD")
+ ret = "QMAKE_POST_LINK";
+ if(ret == "TARGETDEPS")
+ ret = "POST_TARGETDEPS";
return ret;
}
static QStringList split_arg_list(const QString &params)
{
QStringList args;
int last = 0, parens = 0;
QChar quote = 0;
for(int x = 0; x < (int)params.length(); x++) {
if(params[x] == ')') {
parens--;
} else if(params[x] == '(') {
parens++;
} else if(params[x] == quote) {
quote = 0;
} else if(params[x] == '\'' || params[x] == '"') {
quote = params[x];
} else if(!parens && !quote && params[x] == ',') {
args << params.mid(last, x - last);
last = x+1;
}
}
if(last != (int)params.length())
args << params.mid(last);
return args;
}
static QStringList split_value_list(const QString &vals, bool do_semicolon=FALSE)
{
int last = 0;
QStringList ret;
QValueStack<QChar> quote;
for(int x = 0; x < (int)vals.length(); x++) {
if(!quote.isEmpty() && vals[x] == quote.top()) {
quote.pop();
} else if(vals[x] == '\'' || vals[x] == '"') {
quote.push(vals[x]);
- } else if(quote.isEmpty() &&
+ } else if(quote.isEmpty() &&
((do_semicolon && vals[x] == ';') || vals[x] == ' ')) {
ret << vals.mid(last, x - last);
last = x+1;
}
}
if(last != (int)vals.length())
ret << vals.mid(last);
return ret;
}
QMakeProject::QMakeProject()
{
}
bool
-QMakeProject::parse(QString t, QMap<QString, QStringList> &place)
+QMakeProject::parse(const QString &t, QMap<QString, QStringList> &place)
{
QString s = t.simplifyWhiteSpace();
- s.replace(QRegExp("#.*$"), ""); /* bye comments */
+ int hash_mark = s.find('#');
+ if(hash_mark != -1) //good bye comments
+ s = s.left(hash_mark);
if(s.isEmpty()) /* blank_line */
return TRUE;
if(s.stripWhiteSpace().left(1) == "}") {
debug_msg(1, "Project Parser: %s:%d : Leaving block %d", parser.file.latin1(),
parser.line_no, scope_block);
test_status = ((scope_flag & (0x01 << scope_block)) ? TestFound : TestSeek);
scope_block--;
s = s.mid(1).stripWhiteSpace();
if(s.isEmpty())
return TRUE;
}
if(!(scope_flag & (0x01 << scope_block))) {
/* adjust scope for each block which appears on a single line */
for(int i = (s.contains('{')-s.contains('}')); i; i--)
scope_flag &= ~(0x01 << (++scope_block));
debug_msg(1, "Project Parser: %s:%d : Ignored due to block being false.",
parser.file.latin1(), parser.line_no);
return TRUE;
}
QString scope, var, op;
QStringList val;
#define SKIP_WS(d) while(*d && (*d == ' ' || *d == '\t')) d++
const char *d = s.latin1();
SKIP_WS(d);
bool scope_failed = FALSE, else_line = FALSE, or_op=FALSE;
int parens = 0, scope_count=0;
- while(*d && *d != '=') {
- if((*d == '+' || *d == '-' || *d == '*' || *d == '~')) {
- if(*(d+1) == '=') {
+ while(*d) {
+ if(!parens) {
+ if(*d == '=')
break;
- } else if(*(d+1) == ' ') {
- const char *k = d + 1;
- SKIP_WS(k);
- if(*k == '=') {
- QString msg;
- qmake_error_msg(*d + "must be followed immediatly by =");
- return FALSE;
+ if(*d == '+' || *d == '-' || *d == '*' || *d == '~') {
+ if(*(d+1) == '=') {
+ break;
+ } else if(*(d+1) == ' ') {
+ const char *k = d + 1;
+ SKIP_WS(k);
+ if(*k == '=') {
+ QString msg;
+ qmake_error_msg(*d + "must be followed immediately by =");
+ return FALSE;
+ }
}
}
}
if ( *d == '(' )
++parens;
else if ( *d == ')' )
--parens;
if(!parens && (*d == ':' || *d == '{' || *d == ')' || *d == '|')) {
scope_count++;
scope = var.stripWhiteSpace();
if ( *d == ')' )
scope += *d; /* need this */
var = "";
bool test = scope_failed;
if(scope.lower() == "else") {
if(scope_count != 1 || test_status == TestNone) {
qmake_error_msg("Unexpected " + scope + " ('" + s + "')");
return FALSE;
}
else_line = TRUE;
test = (test_status == TestSeek);
@@ -196,49 +207,49 @@ QMakeProject::parse(QString t, QMap<QString, QStringList> &place)
QString comp_scope = scope;
bool invert_test = (comp_scope.left(1) == "!");
if(invert_test)
comp_scope = comp_scope.right(comp_scope.length()-1);
int lparen = comp_scope.find('(');
if(or_op || !scope_failed) {
if(lparen != -1) { /* if there is an lparen in the scope, it IS a function */
int rparen = comp_scope.findRev(')');
if(rparen == -1) {
QCString error;
error.sprintf("Function missing right paren: %s ('%s')",
comp_scope.latin1(), s.latin1());
qmake_error_msg(error);
return FALSE;
}
QString func = comp_scope.left(lparen);
test = doProjectTest(func, comp_scope.mid(lparen+1, rparen - lparen - 1), place);
if ( *d == ')' && !*(d+1) ) {
if(invert_test)
test = !test;
test_status = (test ? TestFound : TestSeek);
return TRUE; /* assume we are done */
}
} else {
- test = isActiveConfig(comp_scope.stripWhiteSpace());
+ test = isActiveConfig(comp_scope.stripWhiteSpace(), TRUE);
}
if(invert_test)
test = !test;
}
}
if(!test && !scope_failed)
debug_msg(1, "Project Parser: %s:%d : Test (%s) failed.", parser.file.latin1(),
parser.line_no, scope.latin1());
if(test == or_op)
scope_failed = !test;
or_op = (*d == '|');
if(*d == '{') { /* scoping block */
if(!scope_failed)
scope_flag |= (0x01 << (++scope_block));
else
scope_flag &= ~(0x01 << (++scope_block));
debug_msg(1, "Project Parser: %s:%d : Entering block %d (%d).", parser.file.latin1(),
parser.line_no, scope_block, !scope_failed);
}
} else {
var += *d;
}
d++;
}
@@ -266,49 +277,49 @@ QMakeProject::parse(QString t, QMap<QString, QStringList> &place)
parser.line_no, scope_block);
test_status = ((scope_flag & (0x01 << scope_block)) ? TestFound : TestSeek);
scope_block--;
vals.truncate(vals.length()-1);
} else if(rbraces != lbraces) {
warn_msg(WarnParser, "Possible braces mismatch {%s} %s:%d",
vals.latin1(), parser.file.latin1(), parser.line_no);
}
doVariableReplace(vals, place);
var = var.stripWhiteSpace();
#undef SKIP_WS
if(!var.isEmpty() && Option::mkfile::do_preprocess) {
static QString last_file("*none*");
if(parser.file != last_file) {
fprintf(stderr, "#file %s:%d\n", parser.file.latin1(), parser.line_no);
last_file = parser.file;
}
fprintf(stderr, "%s %s %s\n", var.latin1(), op.latin1(), vals.latin1());
}
var = varMap(var); //backwards compatability
/* vallist is the broken up list of values */
- QStringList vallist = split_value_list(vals, (var == "DEPENDPATH" || var == "INCLUDEPATH"));
+ QStringList vallist = split_value_list(vals, (var == "DEPENDPATH" || var == "INCLUDEPATH"));
if(!vallist.grep("=").isEmpty())
warn_msg(WarnParser, "Detected possible line continuation: {%s} %s:%d",
var.latin1(), parser.file.latin1(), parser.line_no);
QStringList &varlist = place[var]; /* varlist is the list in the symbol table */
debug_msg(1, "Project Parser: %s:%d :%s: :%s: (%s)", parser.file.latin1(), parser.line_no,
var.latin1(), op.latin1(), vallist.join(" :: ").latin1());
/* now do the operation */
if(op == "~=") {
if(vallist.count() != 1) {
qmake_error_msg("~= operator only accepts one right hand paramater ('" +
s + "')");
return FALSE;
}
QString val(vallist.first());
if(val.length() < 4 || val.at(0) != 's') {
qmake_error_msg("~= operator only can handle s/// function ('" +
s + "')");
return FALSE;
}
QChar sep = val.at(1);
QStringList func = QStringList::split(sep, val, TRUE);
if(func.count() < 3 || func.count() > 4) {
@@ -334,162 +345,163 @@ QMakeProject::parse(QString t, QMap<QString, QStringList> &place)
if(op == "=") {
if(!varlist.isEmpty())
warn_msg(WarnParser, "Operator=(%s) clears variables previously set: %s:%d",
var.latin1(), parser.file.latin1(), parser.line_no);
varlist.clear();
}
for(QStringList::Iterator valit = vallist.begin();
valit != vallist.end(); ++valit) {
if((*valit).isEmpty())
continue;
if((op == "*=" && !(*varlist.find((*valit)))) ||
op == "=" || op == "+=")
varlist.append((*valit));
else if(op == "-=")
varlist.remove((*valit));
}
}
if(var == "REQUIRES") /* special case to get communicated to backends! */
doProjectCheckReqs(vallist, place);
return TRUE;
}
bool
-QMakeProject::read(QString file, QMap<QString, QStringList> &place)
+QMakeProject::read(const QString &file, QMap<QString, QStringList> &place)
{
parser_info pi = parser;
/* scope blocks start at true */
test_status = TestNone;
scope_flag = 0x01;
scope_block = 0;
- file = Option::fixPathToLocalOS(file);
- doVariableReplace(file, place);
+ QString filename = Option::fixPathToLocalOS(file);
+ doVariableReplace(filename, place);
bool ret = FALSE, using_stdin = FALSE;
QFile qfile;
- if(!strcmp(file, "-")) {
+ if(!strcmp(filename, "-")) {
qfile.setName("");
ret = qfile.open(IO_ReadOnly, stdin);
using_stdin = TRUE;
} else {
- qfile.setName(file);
+ qfile.setName(filename);
ret = qfile.open(IO_ReadOnly);
}
if ( ret ) {
QTextStream t( &qfile );
QString s, line;
- parser.file = file;
+ parser.file = filename;
parser.line_no = 0;
while ( !t.eof() ) {
parser.line_no++;
line = t.readLine().stripWhiteSpace();
int prelen = line.length();
- line.replace(QRegExp("#.*$"), ""); // bye comments
+ {
+ int hash_mark = line.find('#');
+ if(hash_mark != -1) //bye comments
+ line = line.left(hash_mark);
+ }
if(!line.isEmpty() && line.right(1) == "\\") {
line.truncate(line.length() - 1);
s += line + " ";
} else if(!line.isEmpty() || (line.isEmpty() && !prelen)) {
if(s.isEmpty() && line.isEmpty())
continue;
if(!line.isEmpty())
s += line;
if(!s.isEmpty()) {
if(!(ret = parse(s, place)))
break;
s = "";
}
}
}
if(!using_stdin)
qfile.close();
}
parser = pi;
return ret;
}
bool
-QMakeProject::read(QString project, QString)
+QMakeProject::read(const QString &project, const QString &, bool just_project)
{
+ if(just_project) { //nothing more, nothing less
+ pfile = project;
+ if(pfile != "-" && !QFile::exists(pfile) && pfile.right(4) != ".pro")
+ pfile += ".pro";
+ return read(pfile, vars);
+ }
+
if(cfile.isEmpty()) {
// hack to get the Option stuff in there
base_vars["QMAKE_EXT_CPP"] = Option::cpp_ext;
base_vars["QMAKE_EXT_H"] = Option::h_ext;
+ if(!Option::user_template_prefix.isEmpty())
+ base_vars["TEMPLATE_PREFIX"] = Option::user_template_prefix;
/* parse the cache */
if(Option::mkfile::do_cache) {
if(Option::mkfile::cachefile.isEmpty()) { //find it as it has not been specified
QString dir = QDir::convertSeparators(Option::output_dir);
while(!QFile::exists((Option::mkfile::cachefile = dir +
QDir::separator() + ".qmake.cache"))) {
dir = dir.left(dir.findRev(QDir::separator()));
if(dir.isEmpty() || dir.find(QDir::separator()) == -1) {
Option::mkfile::cachefile = "";
break;
}
if(Option::mkfile::cachefile_depth == -1)
Option::mkfile::cachefile_depth = 1;
else
Option::mkfile::cachefile_depth++;
}
}
if(!Option::mkfile::cachefile.isEmpty()) {
read(Option::mkfile::cachefile, cache);
if(Option::mkfile::qmakespec.isEmpty() && !cache["QMAKESPEC"].isEmpty())
Option::mkfile::qmakespec = cache["QMAKESPEC"].first();
}
}
/* parse mkspec */
QStringList mkspec_roots;
/* prefer $QTDIR if it is set */
- /* prefer QMAKESPECSDIR -cl */
-
- if (getenv("QTDIR")) {
+ if (getenv("QTDIR"))
mkspec_roots << getenv("QTDIR");
- }
mkspec_roots << qInstallPathData();
-
- if (Option::mkfile::qmakespec.isEmpty() && getenv("QMAKESPECSDIR")){
- QString mkspec = QString(getenv("QMAKESPECSDIR")) + QDir::separator() +
- QDir::separator() + "default";
- if(QFile::exists(mkspec))
- Option::mkfile::qmakespec = mkspec;
- }
-
if(Option::mkfile::qmakespec.isEmpty()) {
for(QStringList::Iterator it = mkspec_roots.begin(); it != mkspec_roots.end(); ++it) {
QString mkspec = (*it) + QDir::separator() + QString("mkspecs") +
QDir::separator() + "default";
if(QFile::exists(mkspec)) {
Option::mkfile::qmakespec = mkspec;
break;
}
}
- }
-
- if(Option::mkfile::qmakespec.isEmpty()) {
- fprintf(stderr, "QMAKESPEC has not been set, so configuration cannot be deduced.\n");
- return FALSE;
+ if(Option::mkfile::qmakespec.isEmpty()) {
+ fprintf(stderr, "QMAKESPEC has not been set, so configuration cannot be deduced.\n");
+ return FALSE;
+ }
}
if(QDir::isRelativePath(Option::mkfile::qmakespec)) {
bool found_mkspec = FALSE;
for(QStringList::Iterator it = mkspec_roots.begin(); it != mkspec_roots.end(); ++it) {
QString mkspec = (*it) + QDir::separator() + QString("mkspecs") +
QDir::separator() + Option::mkfile::qmakespec;
if(QFile::exists(mkspec)) {
found_mkspec = TRUE;
Option::mkfile::qmakespec = mkspec;
break;
}
}
if(!found_mkspec) {
fprintf(stderr, "Could not find mkspecs for your QMAKESPEC after trying:\n\t%s\n",
mkspec_roots.join("\n\t").latin1());
return FALSE;
}
}
/* parse qmake configuration */
QString spec = Option::mkfile::qmakespec + QDir::separator() + "qmake.conf";
debug_msg(1, "QMAKESPEC conf: reading %s", spec.latin1());
if(!read(spec, base_vars)) {
@@ -523,196 +535,209 @@ QMakeProject::read(QString project, QString)
if(pfile != "-" && !QFile::exists(pfile) && pfile.right(4) != ".pro")
pfile += ".pro";
if(!read(pfile, vars))
return FALSE;
parser.line_no = 1; //really arg count now.. duh
parser.file = "(internal)";
for(QStringList::Iterator it = Option::after_user_vars.begin();
it != Option::after_user_vars.end(); ++it) {
if(!parse((*it), vars)) {
fprintf(stderr, "Argument failed to parse: %s\n", (*it).latin1());
return FALSE;
}
parser.line_no++;
}
/* now let the user override the template from an option.. */
if(!Option::user_template.isEmpty()) {
debug_msg(1, "Overriding TEMPLATE (%s) with: %s", vars["TEMPLATE"].first().latin1(), Option::user_template.latin1());
vars["TEMPLATE"].clear();
vars["TEMPLATE"].append(Option::user_template);
}
- if(vars["TEMPLATE"].isEmpty())
- vars["TEMPLATE"].append(QString("app"));
- else
- vars["TEMPLATE"].first().replace(QRegExp("\\.t$"), "");
- if(!Option::user_template_prefix.isEmpty())
- vars["TEMPLATE"].first().prepend(Option::user_template_prefix);
+ QStringList &templ = vars["TEMPLATE"];
+ if(templ.isEmpty())
+ templ.append(QString("app"));
+ else if(vars["TEMPLATE"].first().endsWith(".t"))
+ templ = QStringList(templ.first().left(templ.first().length() - 2));
+ if ( !Option::user_template_prefix.isEmpty() ) {
+ templ.first().prepend(Option::user_template_prefix);
+ }
if(vars["TARGET"].isEmpty()) {
// ### why not simply use:
// QFileInfo fi(pfile);
// fi.baseName();
QString tmp = pfile;
if(tmp.findRev('/') != -1)
tmp = tmp.right( tmp.length() - tmp.findRev('/') - 1 );
if(tmp.findRev('.') != -1)
tmp = tmp.left(tmp.findRev('.'));
vars["TARGET"].append(tmp);
}
QString test_version = getenv("QTESTVERSION");
if (!test_version.isEmpty()) {
QString s = vars["TARGET"].first();
if (s == "qt" || s == "qt-mt" || s == "qte" || s == "qte-mt") {
QString &ver = vars["VERSION"].first();
// fprintf(stderr,"Current QT version number: " + ver + "\n");
if (ver != "" && ver != test_version) {
ver = test_version;
fprintf(stderr,"Changed QT version number to " + test_version + "!\n");
}
}
}
return TRUE;
}
bool
-QMakeProject::isActiveConfig(const QString &x)
+QMakeProject::isActiveConfig(const QString &x, bool regex)
{
if(x.isEmpty())
return TRUE;
- QRegExp re(x, FALSE, TRUE);
- if((Option::target_mode == Option::TARG_MACX_MODE || Option::target_mode == Option::TARG_QNX6_MODE || Option::target_mode == Option::TARG_UNIX_MODE) &&
- x == "unix")
+ if((Option::target_mode == Option::TARG_MACX_MODE || Option::target_mode == Option::TARG_QNX6_MODE ||
+ Option::target_mode == Option::TARG_UNIX_MODE) && x == "unix")
return TRUE;
else if(Option::target_mode == Option::TARG_MACX_MODE && x == "macx")
return TRUE;
else if(Option::target_mode == Option::TARG_QNX6_MODE && x == "qnx6")
return TRUE;
else if(Option::target_mode == Option::TARG_MAC9_MODE && x == "mac9")
return TRUE;
else if((Option::target_mode == Option::TARG_MAC9_MODE || Option::target_mode == Option::TARG_MACX_MODE) &&
x == "mac")
return TRUE;
else if(Option::target_mode == Option::TARG_WIN_MODE && x == "win32")
return TRUE;
+ QRegExp re(x, FALSE, TRUE);
QString spec = Option::mkfile::qmakespec.right(Option::mkfile::qmakespec.length() -
(Option::mkfile::qmakespec.findRev(QDir::separator())+1));
- if(re.exactMatch(spec))
+ if((regex && re.exactMatch(spec)) || (!regex && spec == x))
return TRUE;
#ifdef Q_OS_UNIX
else if(spec == "default") {
static char *buffer = NULL;
if(!buffer)
buffer = (char *)malloc(1024);
int l = readlink(Option::mkfile::qmakespec, buffer, 1024);
if(l != -1) {
buffer[l] = '\0';
QString r = buffer;
if(r.findRev('/') != -1)
r = r.mid(r.findRev('/') + 1);
- if(re.exactMatch(r))
+ if((regex && re.exactMatch(r)) || (!regex && r == x))
return TRUE;
}
}
#endif
QStringList &configs = vars["CONFIG"];
for(QStringList::Iterator it = configs.begin(); it != configs.end(); ++it) {
+ if((regex && re.exactMatch((*it))) || (!regex && (*it) == x))
if(re.exactMatch((*it)))
return TRUE;
}
return FALSE;
}
bool
-QMakeProject::doProjectTest(QString func, const QString &params, QMap<QString, QStringList> &place)
+QMakeProject::doProjectTest(const QString& func, const QString &params, QMap<QString, QStringList> &place)
{
QStringList args = split_arg_list(params);
for(QStringList::Iterator arit = args.begin(); arit != args.end(); ++arit) {
QString tmp = (*arit).stripWhiteSpace();
if((tmp[0] == '\'' || tmp[0] == '"') && tmp.right(1) == tmp.left(1))
tmp = tmp.mid(1, tmp.length() - 2);
}
return doProjectTest(func.stripWhiteSpace(), args, place);
}
bool
-QMakeProject::doProjectTest(QString func, QStringList args, QMap<QString, QStringList> &place)
+QMakeProject::doProjectTest(const QString& func, QStringList args, QMap<QString, QStringList> &place)
{
for(QStringList::Iterator arit = args.begin(); arit != args.end(); ++arit) {
(*arit) = (*arit).stripWhiteSpace(); // blah, get rid of space
doVariableReplace((*arit), place);
}
debug_msg(1, "Running project test: %s( %s )", func.latin1(), args.join("::").latin1());
if(func == "requires") {
return doProjectCheckReqs(args, place);
+ } else if(func == "equals") {
+ if(args.count() != 2) {
+ fprintf(stderr, "%s:%d: equals(variable, value) requires two arguments.\n", parser.file.latin1(),
+ parser.line_no);
+ return FALSE;
+ }
+ QString value = args[1];
+ if((value.left(1) == "\"" || value.left(1) == "'") && value.right(1) == value.left(1))
+ value = value.mid(1, value.length()-2);
+ return vars[args[0]].join(" ") == value;
} else if(func == "exists") {
if(args.count() != 1) {
fprintf(stderr, "%s:%d: exists(file) requires one argument.\n", parser.file.latin1(),
parser.line_no);
return FALSE;
}
QString file = args.first();
file = Option::fixPathToLocalOS(file);
doVariableReplace(file, place);
if(QFile::exists(file))
return TRUE;
//regular expression I guess
QString dirstr = QDir::currentDirPath();
int slsh = file.findRev(Option::dir_sep);
if(slsh != -1) {
dirstr = file.left(slsh+1);
file = file.right(file.length() - slsh - 1);
}
QDir dir(dirstr, file);
return dir.count() != 0;
} else if(func == "system") {
if(args.count() != 1) {
fprintf(stderr, "%s:%d: system(exec) requires one argument.\n", parser.file.latin1(),
parser.line_no);
return FALSE;
}
return system(args.first().latin1()) == 0;
} else if(func == "contains") {
if(args.count() != 2) {
fprintf(stderr, "%s:%d: contains(var, val) requires two arguments.\n", parser.file.latin1(),
parser.line_no);
return FALSE;
}
QRegExp regx(args[1]);
QStringList &l = place[args[0]];
for(QStringList::ConstIterator it = l.begin(); it != l.end(); ++it) {
- if(regx.exactMatch((*it)))
+ if(regx.exactMatch((*it)))
return TRUE;
}
return FALSE;
} else if(func == "infile") {
if(args.count() < 2 || args.count() > 3) {
fprintf(stderr, "%s:%d: infile(file, var, val) requires at least 2 arguments.\n",
parser.file.latin1(), parser.line_no);
return FALSE;
}
QMakeProject proj;
QString file = args[0];
doVariableReplace(file, place);
fixEnvVariables(file);
int di = file.findRev(Option::dir_sep);
QDir sunworkshop42workaround = QDir::current();
QString oldpwd = sunworkshop42workaround.currentDirPath();
if(di != -1) {
if(!QDir::setCurrent(file.left(file.findRev(Option::dir_sep)))) {
fprintf(stderr, "Cannot find directory: %s\n", file.left(di).latin1());
return FALSE;
}
file = file.right(file.length() - di - 1);
}
parser_info pi = parser;
@@ -784,211 +809,269 @@ QMakeProject::doProjectTest(QString func, QStringList args, QMap<QString, QStrin
#endif
for(QStringList::Iterator it = feature_roots.begin(); it != feature_roots.end(); ++it) {
QString prf = (*it) + QDir::separator() + QString("mkspecs") +
QDir::separator() + QString("features") + QDir::separator() + file;
if(QFile::exists(prf)) {
found = TRUE;
file = prf;
break;
}
}
if(!found) {
printf("Project LOAD(): Feature %s cannot be found.\n", args.first().latin1());
exit(3);
}
}
}
}
debug_msg(1, "Project Parser: %s'ing file %s.", func.latin1(), file.latin1());
parser_info pi = parser;
int sb = scope_block;
int sf = scope_flag;
TestStatus sc = test_status;
bool r = read(file.latin1(), place);
- if(r)
+ if(r)
vars["QMAKE_INTERNAL_INCLUDED_FILES"].append(file);
+ else
+ warn_msg(WarnParser, "%s:%d: Failure to include file %s.",
+ pi.file.latin1(), pi.line_no, file.latin1());
parser = pi;
test_status = sc;
scope_flag = sf;
scope_block = sb;
return r;
} else if(func == "error" || func == "message") {
if(args.count() != 1) {
fprintf(stderr, "%s:%d: %s(message) requires one argument.\n", parser.file.latin1(),
parser.line_no, func.latin1());
return FALSE;
}
QString msg = args.first();
+ if((msg.startsWith("\"") || msg.startsWith("'")) && msg.endsWith(msg.left(1)))
+ msg = msg.mid(1, msg.length()-2);
+ msg.replace(QString("${QMAKE_FILE}"), parser.file.latin1());
+ msg.replace(QString("${QMAKE_LINE_NUMBER}"), QString::number(parser.line_no));
+ msg.replace(QString("${QMAKE_DATE}"), QDateTime::currentDateTime().toString());
doVariableReplace(msg, place);
fixEnvVariables(msg);
printf("Project %s: %s\n", func.upper().latin1(), msg.latin1());
if(func == "message")
return TRUE;
exit(2);
} else {
fprintf(stderr, "%s:%d: Unknown test function: %s\n", parser.file.latin1(), parser.line_no,
func.latin1());
}
return FALSE;
}
bool
QMakeProject::doProjectCheckReqs(const QStringList &deps, QMap<QString, QStringList> &place)
{
bool ret = FALSE;
for(QStringList::ConstIterator it = deps.begin(); it != deps.end(); ++it) {
QString chk = (*it);
if(chk.isEmpty())
continue;
bool invert_test = (chk.left(1) == "!");
if(invert_test)
chk = chk.right(chk.length() - 1);
bool test;
int lparen = chk.find('(');
if(lparen != -1) { /* if there is an lparen in the chk, it IS a function */
int rparen = chk.findRev(')');
if(rparen == -1) {
QCString error;
error.sprintf("Function (in REQUIRES) missing right paren: %s", chk.latin1());
qmake_error_msg(error);
} else {
QString func = chk.left(lparen);
test = doProjectTest(func, chk.mid(lparen+1, rparen - lparen - 1), place);
}
} else {
- test = isActiveConfig(chk);
+ test = isActiveConfig(chk, TRUE);
}
if(invert_test) {
chk.prepend("!");
test = !test;
}
if(!test) {
debug_msg(1, "Project Parser: %s:%d Failed test: REQUIRES = %s",
parser.file.latin1(), parser.line_no, chk.latin1());
place["QMAKE_FAILED_REQUIREMENTS"].append(chk);
ret = FALSE;
}
}
return ret;
}
QString
QMakeProject::doVariableReplace(QString &str, const QMap<QString, QStringList> &place)
{
- for(int x = 0, rep; x < 5; x++) {
- QRegExp reg_var;
- reg_var.setMinimal(TRUE);
- if( x == 0 ) //function blocked out by {}'s
- reg_var = QRegExp("\\$\\$\\{([a-zA-Z0-9_]*)\\((\\(.|(.*)\\)*)\\)\\}");
- else if( x == 1 ) //variables blocked out by {}'s
- reg_var = QRegExp("\\$\\$\\{([a-zA-Z0-9_\\.-]*)\\}");
- else if(x == 2) //environment
- reg_var = QRegExp("\\$\\$\\(([a-zA-Z0-9_\\.-]*)\\)");
- else if(x == 3) //function
- reg_var = QRegExp("\\$\\$([a-zA-Z0-9_]*)\\((\\(.|(.*)\\)*)\\)");
- else if(x == 4) //normal variable
- reg_var = QRegExp("\\$\\$([a-zA-Z0-9_\\.-]*)");
- while((rep = reg_var.search(str)) != -1) {
- QString replacement;
- if(x == 2) {//environment
- replacement = getenv(reg_var.cap(1));
- } else if(x == 0 || x == 3) { //function
- QStringList args = split_arg_list(reg_var.cap(2));
- for(QStringList::Iterator arit = args.begin(); arit != args.end(); ++arit) {
- (*arit) = (*arit).stripWhiteSpace(); // blah, get rid of space
- doVariableReplace((*arit), place);
- }
- debug_msg(1, "Running function: %s( %s )", reg_var.cap(1).latin1(), args.join("::").latin1());
- if(reg_var.cap(1).lower() == "member") {
- if(args.count() < 1 || args.count() > 2) {
- fprintf(stderr, "%s:%d: member(var, place) requires two arguments.\n",
- parser.file.latin1(), parser.line_no);
- } else {
- uint pos = 0;
- if(args.count() == 2)
- pos = args[1].toInt();
- const QStringList &var = place[varMap(args.first())];
- if(var.count() >= pos)
- replacement = var[pos];
- }
- } else if(reg_var.cap(1).lower() == "list") {
- if(args.count() != 1) {
- fprintf(stderr, "%s:%d: list(vals) requires one"
- "argument.\n", parser.file.latin1(), parser.line_no);
- } else {
- static int x = 0;
- replacement.sprintf(".QMAKE_INTERNAL_TMP_VAR_%d", x++);
- (*((QMap<QString, QStringList>*)&place))[replacement] = split_value_list(args.first());
- }
- } else if(reg_var.cap(1).lower() == "join") {
- if(args.count() < 1 || args.count() > 4) {
- fprintf(stderr, "%s:%d: join(var, glue, before, after) requires four"
- "arguments.\n", parser.file.latin1(), parser.line_no);
- } else {
- QString glue, before, after;
- if(args.count() >= 2)
- glue = args[1].replace("\"", "" );
- if(args.count() >= 3)
- before = args[2].replace("\"", "" );
- if(args.count() == 4)
- after = args[3].replace("\"", "" );
- const QStringList &var = place[varMap(args.first())];
- if(!var.isEmpty())
- replacement = before + var.join(glue) + after;
+ for(int var_begin, var_last=0; (var_begin = str.find("$$", var_last)) != -1; var_last = var_begin) {
+ if(var_begin >= int( str.length() + 2 ) ) {
+ break;
+ } else if(var_begin != 0 && str[var_begin-1] == '\\') {
+ str.replace(var_begin-1, 1, "");
+ var_begin += 1;
+ continue;
+ }
+
+ int var_incr = var_begin + 2;
+ bool in_braces = FALSE, as_env = FALSE;
+ if(str[var_incr] == '{') {
+ in_braces = TRUE;
+ var_incr++;
+ while(var_incr < int( str.length() ) &&
+ (str[var_incr] == ' ' || str[var_incr] == '\t' || str[var_incr] == '\n'))
+ var_incr++;
+ }
+ if(str[var_incr] == '(') {
+ as_env = TRUE;
+ var_incr++;
+ }
+ QString val, args;
+ while(var_incr < int( str.length() ) &&
+ (str[var_incr].isLetter() || str[var_incr].isNumber() || str[var_incr] == '.' || str[var_incr] == '_'))
+ val += str[var_incr++];
+ if(as_env) {
+ if(str[var_incr] != ')') {
+ var_incr++;
+ warn_msg(WarnParser, "%s:%d: Unterminated env-variable replacement '%s' (%s)",
+ parser.file.latin1(), parser.line_no,
+ str.mid(var_begin, QMAX(var_incr - var_begin, int(str.length()))).latin1(), str.latin1());
+ var_begin += var_incr;
+ continue;
+ }
+ var_incr++;
+ } else if(str[var_incr] == '(') { //args
+ for(int parens = 0; var_incr < int( str.length() ); var_incr++) {
+ if(str[var_incr] == '(') {
+ parens++;
+ if(parens == 1)
+ continue;
+ } else if(str[var_incr] == ')') {
+ parens--;
+ if(!parens) {
+ var_incr++;
+ break;
}
- } else if(reg_var.cap(1).lower() == "find") {
- if(args.count() != 2) {
- fprintf(stderr, "%s:%d find(var, str) requires two arguments\n",
- parser.file.latin1(), parser.line_no);
- } else {
- QRegExp regx(args[1]);
- const QStringList &var = place[varMap(args.first())];
- for(QStringList::ConstIterator vit = var.begin();
- vit != var.end(); ++vit) {
- if(regx.search(*vit) != -1) {
- if(!replacement.isEmpty())
- replacement += " ";
- replacement += (*vit);
- }
+ }
+ args += str[var_incr];
+ }
+ }
+ if(var_incr > int( str.length() ) || (in_braces && str[var_incr] != '}')) {
+ var_incr++;
+ warn_msg(WarnParser, "%s:%d: Unterminated variable replacement '%s' (%s)",
+ parser.file.latin1(), parser.line_no,
+ str.mid(var_begin, QMAX(var_incr - var_begin, int( str.length() ))).latin1(), str.latin1());
+ var_begin += var_incr;
+ continue;
+ } else if(in_braces) {
+ var_incr++;
+ }
+
+ QString replacement;
+ if(as_env) {
+ replacement = getenv(val);
+ } else if(args.isEmpty()) {
+ if(val.left(1) == ".")
+ replacement = "";
+ else if(val == "LITERAL_WHITESPACE")
+ replacement = "\t";
+ else
+ replacement = place[varMap(val)].join(" ");
+ } else {
+ QStringList arg_list = split_arg_list(args);
+ for(QStringList::Iterator arit = arg_list.begin(); arit != arg_list.end(); ++arit) {
+ (*arit) = (*arit).stripWhiteSpace(); // blah, get rid of space
+ doVariableReplace((*arit), place);
+ }
+ debug_msg(1, "Running function: %s( %s )", val.latin1(), arg_list.join("::").latin1());
+ if(val.lower() == "member") {
+ if(arg_list.count() < 1 || arg_list.count() > 2) {
+ fprintf(stderr, "%s:%d: member(var, place) requires two arguments.\n",
+ parser.file.latin1(), parser.line_no);
+ } else {
+ uint pos = 0;
+ if(arg_list.count() == 2)
+ pos = arg_list[1].toInt();
+ const QStringList &var = place[varMap(arg_list.first())];
+ if(var.count() >= pos)
+ replacement = var[pos];
+ }
+ } else if(val.lower() == "list") {
+ static int x = 0;
+ replacement.sprintf(".QMAKE_INTERNAL_TMP_VAR_%d", x++);
+ QStringList &lst = (*((QMap<QString, QStringList>*)&place))[replacement];
+ lst.clear();
+ for(QStringList::ConstIterator arg_it = arg_list.begin();
+ arg_it != arg_list.end(); ++arg_it)
+ lst += split_value_list((*arg_it));
+ } else if(val.lower() == "join") {
+ if(arg_list.count() < 1 || arg_list.count() > 4) {
+ fprintf(stderr, "%s:%d: join(var, glue, before, after) requires four"
+ "arguments.\n", parser.file.latin1(), parser.line_no);
+ } else {
+ QString glue, before, after;
+ if(arg_list.count() >= 2)
+ glue = arg_list[1].replace("\"", "" );
+ if(arg_list.count() >= 3)
+ before = arg_list[2].replace("\"", "" );
+ if(arg_list.count() == 4)
+ after = arg_list[3].replace("\"", "" );
+ const QStringList &var = place[varMap(arg_list.first())];
+ if(!var.isEmpty())
+ replacement = before + var.join(glue) + after;
+ }
+ } else if(val.lower() == "find") {
+ if(arg_list.count() != 2) {
+ fprintf(stderr, "%s:%d find(var, str) requires two arguments\n",
+ parser.file.latin1(), parser.line_no);
+ } else {
+ QRegExp regx(arg_list[1]);
+ const QStringList &var = place[varMap(arg_list.first())];
+ for(QStringList::ConstIterator vit = var.begin();
+ vit != var.end(); ++vit) {
+ if(regx.search(*vit) != -1) {
+ if(!replacement.isEmpty())
+ replacement += " ";
+ replacement += (*vit);
}
}
- } else if(reg_var.cap(1).lower() == "system") {
- if(args.count() != 1) {
- fprintf(stderr, "%s:%d system(execut) requires one argument\n",
- parser.file.latin1(), parser.line_no);
- } else {
- char buff[256];
- FILE *proc = QT_POPEN(args.join(" ").latin1(), "r");
- while(proc && !feof(proc)) {
- int read_in = fread(buff, 1, 255, proc);
- if(!read_in)
- break;
- for(int i = 0; i < read_in; i++) {
- if(buff[i] == '\n' || buff[i] == '\t')
- buff[i] = ' ';
- }
- buff[read_in] = '\0';
- replacement += buff;
+ }
+ } else if(val.lower() == "system") {
+ if(arg_list.count() != 1) {
+ fprintf(stderr, "%s:%d system(execut) requires one argument\n",
+ parser.file.latin1(), parser.line_no);
+ } else {
+ char buff[256];
+ FILE *proc = QT_POPEN(arg_list.join(" ").latin1(), "r");
+ while(proc && !feof(proc)) {
+ int read_in = fread(buff, 1, 255, proc);
+ if(!read_in)
+ break;
+ for(int i = 0; i < read_in; i++) {
+ if(buff[i] == '\n' || buff[i] == '\t')
+ buff[i] = ' ';
}
+ buff[read_in] = '\0';
+ replacement += buff;
}
- } else {
- fprintf(stderr, "%s:%d: Unknown replace function: %s\n",
- parser.file.latin1(), parser.line_no, reg_var.cap(1).latin1());
}
- } else { //variable
- if(reg_var.cap(1).left(1) == ".")
- replacement = "";
- else if(reg_var.cap(1) == "LITERAL_WHITESPACE")
- replacement = "\t";
- else
- replacement = place[varMap(reg_var.cap(1))].join(" ");
+ } else {
+ fprintf(stderr, "%s:%d: Unknown replace function: %s\n",
+ parser.file.latin1(), parser.line_no, val.latin1());
}
- debug_msg(2, "Project parser: %d (%s) :: %s -> %s", x, str.latin1(),
- reg_var.capturedTexts().join("::").latin1(), replacement.latin1());
- str.replace(rep, reg_var.matchedLength(), replacement);
}
+ //actually do replacement now..
+ int mlen = var_incr - var_begin;
+ debug_msg(2, "Project Parser [var replace]: '%s' :: %s -> %s", str.latin1(),
+ str.mid(var_begin, mlen).latin1(), replacement.latin1());
+ str.replace(var_begin, mlen, replacement);
+ var_begin += replacement.length();
}
return str;
}
diff --git a/qmake/project.h b/qmake/project.h
index 201e63c..ec19f0c 100644
--- a/qmake/project.h
+++ b/qmake/project.h
@@ -1,114 +1,114 @@
/****************************************************************************
** $Id$
**
** Definition of ________ class.
**
** Created : 970521
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the network module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition licenses may use this
** file in accordance with the Qt Commercial License Agreement provided
** with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#ifndef __QMAKE_H__
-#define __QMAKE_H__
+#ifndef __PROJECT_H__
+#define __PROJECT_H__
#include <qstringlist.h>
#include <qstring.h>
#include <qmap.h>
class QMakeProject
{
enum TestStatus { TestNone, TestFound, TestSeek } test_status;
int scope_block, scope_flag;
QString pfile, cfile;
QMap<QString, QStringList> vars, base_vars, cache;
- bool parse(QString text, QMap<QString, QStringList> &place);
- bool doProjectTest(QString func, const QString &params, QMap<QString, QStringList> &place);
- bool doProjectTest(QString func, QStringList args, QMap<QString, QStringList> &place);
+ bool parse(const QString &text, QMap<QString, QStringList> &place);
+ bool doProjectTest(const QString &func, const QString &params, QMap<QString, QStringList> &place);
+ bool doProjectTest(const QString &func, QStringList args, QMap<QString, QStringList> &place);
bool doProjectCheckReqs(const QStringList &deps, QMap<QString, QStringList> &place);
QString doVariableReplace(QString &str, const QMap<QString, QStringList> &place);
public:
QMakeProject();
- bool read(QString project, QString pwd);
+ bool read(const QString &project, const QString &pwd, bool just_project=FALSE);
QString projectFile();
QString configFile();
bool isEmpty(const QString &v);
QStringList &values(const QString &v);
QString first(const QString &v);
QMap<QString, QStringList> &variables();
- bool isActiveConfig(const QString &x);
+ bool isActiveConfig(const QString &x, bool regex=FALSE);
protected:
friend class MakefileGenerator;
- bool read(QString file, QMap<QString, QStringList> &place);
+ bool read(const QString &file, QMap<QString, QStringList> &place);
};
inline QString QMakeProject::projectFile()
{
#if defined(Q_CC_SUN) && (__SUNPRO_CC == 0x500) || defined(Q_CC_HP)
// workaround for Sun WorkShop 5.0 bug fixed in Forte 6
if (pfile == "-")
return QString("(stdin)");
else
return pfile;
#else
return pfile == "-" ? QString("(stdin)") : pfile;
#endif
}
inline QString QMakeProject::configFile()
{ return cfile; }
inline bool QMakeProject::isEmpty(const QString &v)
{ return !vars.contains(v) || vars[v].isEmpty(); }
inline QStringList &QMakeProject::values(const QString &v)
{ return vars[v]; }
inline QString QMakeProject::first(const QString &v)
{
#if defined(Q_CC_SUN) && (__SUNPRO_CC == 0x500) || defined(Q_CC_HP)
// workaround for Sun WorkShop 5.0 bug fixed in Forte 6
if (isEmpty(v))
return QString("");
else
return vars[v].first();
#else
return isEmpty(v) ? QString("") : vars[v].first();
#endif
}
inline QMap<QString, QStringList> &QMakeProject::variables()
{ return vars; }
-#endif /* __QMAKE_H__ */
+#endif /* __PROJECT_H__ */
diff --git a/qmake/tools/qbitarray.cpp b/qmake/tools/qbitarray.cpp
index 4f4e14b..1aaf963 100644
--- a/qmake/tools/qbitarray.cpp
+++ b/qmake/tools/qbitarray.cpp
@@ -176,49 +176,50 @@ QBitArray::QBitArray( uint size ) : QByteArray( 0, 0 )
*/
/*!
Pad last byte with 0-bits.
*/
void QBitArray::pad0()
{
uint sz = size();
if ( sz && sz%8 )
*(data()+sz/8) &= (1 << (sz%8)) - 1;
}
/*!
\fn uint QBitArray::size() const
Returns the bit array's size (number of bits).
\sa resize()
*/
/*!
Resizes the bit array to \a size bits and returns TRUE if the bit
- array could be resized; otherwise returns FALSE.
+ array could be resized; otherwise returns FALSE. The array becomes
+ a null array if \a size == 0.
If the array is expanded, the new bits are set to 0.
\sa size()
*/
bool QBitArray::resize( uint size )
{
uint s = this->size();
if ( !QByteArray::resize( (size+7)/8 ) )
return FALSE; // cannot resize
SHBLOCK->nbits = size;
if ( size != 0 ) { // not null array
int ds = (int)(size+7)/8 - (int)(s+7)/8;// number of bytes difference
if ( ds > 0 ) // expanding array
memset( data() + (s+7)/8, 0, ds ); // reset new data
}
return TRUE;
}
/*!
Fills the bit array with \a v (1's if \a v is TRUE, or 0's if \a v
is FALSE).
diff --git a/qmake/tools/qbuffer.cpp b/qmake/tools/qbuffer.cpp
index b213dd9..0fc90e4 100644
--- a/qmake/tools/qbuffer.cpp
+++ b/qmake/tools/qbuffer.cpp
@@ -175,50 +175,50 @@ bool QBuffer::setBuffer( QByteArray buf )
otherwise returns FALSE. The buffer must be opened before use.
The mode parameter \a m must be a combination of the following flags.
\list
\i \c IO_ReadOnly opens the buffer in read-only mode.
\i \c IO_WriteOnly opens the buffer in write-only mode.
\i \c IO_ReadWrite opens the buffer in read/write mode.
\i \c IO_Append sets the buffer index to the end of the buffer.
\i \c IO_Truncate truncates the buffer.
\endlist
\sa close(), isOpen()
*/
bool QBuffer::open( int m )
{
if ( isOpen() ) { // buffer already open
#if defined(QT_CHECK_STATE)
qWarning( "QBuffer::open: Buffer already open" );
#endif
return FALSE;
}
setMode( m );
if ( m & IO_Truncate ) { // truncate buffer
- a.resize( 0 );
- a_len = 0;
+ a.resize( 1 );
+ a_len = 1;
}
if ( m & IO_Append ) { // append to end of buffer
ioIndex = a.size();
} else {
ioIndex = 0;
}
a_inc = 16;
setState( IO_Open );
setStatus( 0 );
return TRUE;
}
/*!
\reimp
Closes an open buffer.
\sa open()
*/
void QBuffer::close()
{
if ( isOpen() ) {
setFlags( IO_Direct );
diff --git a/qmake/tools/qcomlibrary.cpp b/qmake/tools/qcomlibrary.cpp
index a7162fc..2a1b75a 100644
--- a/qmake/tools/qcomlibrary.cpp
+++ b/qmake/tools/qcomlibrary.cpp
@@ -42,48 +42,52 @@
#include <qdatetime.h>
#include <qcleanuphandler.h>
#include <errno.h>
#ifdef QT_THREAD_SUPPORT
# include "qmutexpool_p.h"
#endif // QT_THREAD_SUPPORT
#ifndef QT_DEBUG_COMPONENT
# if defined(QT_DEBUG)
# define QT_DEBUG_COMPONENT 1
# endif
#endif
QComLibrary::QComLibrary( const QString &filename )
: QLibrary( filename ), entry( 0 ), libiface( 0 ), qt_version( 0 )
{
}
QComLibrary::~QComLibrary()
{
if ( autoUnload() )
unload();
+ if ( libiface )
+ libiface->release();
+ if ( entry )
+ entry->release();
}
bool QComLibrary::unload()
{
if ( libiface ) {
libiface->cleanup();
if ( !libiface->canUnload() )
return FALSE;
libiface->release();
libiface = 0;
}
int refs = entry ? entry->release() : 0;
if ( refs )
return FALSE;
entry = 0;
return QLibrary::unload();
}
static bool qt_verify( const QString& library, uint version, uint flags,
const QCString &key, bool warn )
{
uint our_flags = 1;
@@ -370,123 +374,116 @@ static bool qt_unix_query( const QString &library, uint *version, uint *flags,
#endif // Q_OS_UNIX
static QSettings *cache = 0;
static QSingleCleanupHandler<QSettings> cleanup_cache;
void QComLibrary::createInstanceInternal()
{
if ( library().isEmpty() )
return;
QFileInfo fileinfo( library() );
QString lastModified = fileinfo.lastModified().toString();
QString regkey = QString("/Qt Plugins %1.%2/%3")
.arg( ( QT_VERSION & 0xff0000 ) >> 16 )
.arg( ( QT_VERSION & 0xff00 ) >> 8 )
.arg( library() );
QStringList reg;
uint flags = 0;
QCString key;
bool query_done = FALSE;
bool warn_mismatch = TRUE;
- if ( ! query_done ) {
-
#ifdef QT_THREAD_SUPPORT
- QMutexLocker locker( qt_global_mutexpool->get( &cache ) );
+ QMutexLocker locker( qt_global_mutexpool ?
+ qt_global_mutexpool->get( &cache ) : 0 );
#endif // QT_THREAD_SUPPORT
- if ( ! cache ) {
- cache = new QSettings;
- cache->insertSearchPath( QSettings::Windows, "/Trolltech" );
- cleanup_cache.set( &cache );
- }
+ if ( ! cache ) {
+ cache = new QSettings;
+ cache->insertSearchPath( QSettings::Windows, "/Trolltech" );
+ cleanup_cache.set( &cache );
+ }
- reg = cache->readListEntry( regkey );
- if ( reg.count() == 4 ) {
- // check timestamp
- if ( lastModified == reg[3] ) {
- qt_version = reg[0].toUInt(0, 16);
- flags = reg[1].toUInt(0, 16);
- key = reg[2].latin1();
+ reg = cache->readListEntry( regkey );
+ if ( reg.count() == 4 ) {
+ // check timestamp
+ if ( lastModified == reg[3] ) {
+ qt_version = reg[0].toUInt(0, 16);
+ flags = reg[1].toUInt(0, 16);
+ key = reg[2].latin1();
- query_done = TRUE;
- warn_mismatch = FALSE;
- }
+ query_done = TRUE;
+ warn_mismatch = FALSE;
}
}
#if defined(Q_OS_UNIX)
if ( ! query_done ) {
// get the query information directly from the plugin without loading
if ( qt_unix_query( library(), &qt_version, &flags, &key ) ) {
// info read succesfully from library
query_done = TRUE;
}
}
#else // !Q_OS_UNIX
if ( ! query_done ) {
// get the query information by loading the plugin
if ( !isLoaded() ) {
Q_ASSERT( entry == 0 );
if ( !load() )
return;
}
# ifdef Q_CC_BOR
typedef const char * __stdcall (*UCMQueryVerificationDataProc)();
# else
typedef const char * (*UCMQueryVerificationDataProc)();
# endif
UCMQueryVerificationDataProc ucmQueryVerificationdataProc;
ucmQueryVerificationdataProc =
(UCMQueryVerificationDataProc) resolve( "qt_ucm_query_verification_data" );
if ( !ucmQueryVerificationdataProc ||
!qt_parse_pattern( ucmQueryVerificationdataProc(),
&qt_version, &flags, &key ) ) {
qt_version = flags = 0;
key = "unknown";
} else {
query_done = TRUE;
}
}
#endif // Q_OS_UNIX
QStringList queried;
queried << QString::number( qt_version,16 )
<< QString::number( flags, 16 )
<< key
<< lastModified;
if ( queried != reg ) {
-
-#ifdef QT_THREAD_SUPPORT
- QMutexLocker locker( qt_global_mutexpool->get( &cache ) );
-#endif // QT_THREAD_SUPPORT
-
cache->writeEntry( regkey, queried );
// delete the cache, which forces the settings to be written
delete cache;
cache = 0;
}
if ( ! query_done ) {
if ( warn_mismatch ) {
qWarning( "Conflict in %s:\n Plugin cannot be queried successfully!",
(const char*) QFile::encodeName( library() ) );
}
unload();
return;
}
if ( ! qt_verify( library(), qt_version, flags, key, warn_mismatch ) ) {
unload();
return;
} else if ( !isLoaded() ) {
Q_ASSERT( entry == 0 );
if ( !load() )
return;
}
diff --git a/qmake/tools/qconfig.cpp b/qmake/tools/qconfig.cpp
index 433827c..5297a4e 100644
--- a/qmake/tools/qconfig.cpp
+++ b/qmake/tools/qconfig.cpp
@@ -1,17 +1,17 @@
/* Install paths from configure */
-static const char QT_INSTALL_PREFIX [256] = "/usr/src/coding/projects/userspace/qt-embedded-free-3.1.0-b2";
-static const char QT_INSTALL_BINS [256] = "/usr/src/coding/projects/userspace/qt-embedded-free-3.1.0-b2/bin";
-static const char QT_INSTALL_DOCS [256] = "/usr/src/coding/projects/userspace/qt-embedded-free-3.1.0-b2/doc";
-static const char QT_INSTALL_HEADERS[256] = "/usr/src/coding/projects/userspace/qt-embedded-free-3.1.0-b2/include";
-static const char QT_INSTALL_LIBS [256] = "/usr/src/coding/projects/userspace/qt-embedded-free-3.1.0-b2/lib";
-static const char QT_INSTALL_PLUGINS[256] = "/usr/src/coding/projects/userspace/qt-embedded-free-3.1.0-b2/plugins";
-static const char QT_INSTALL_DATA [256] = "/usr/src/coding/projects/userspace/qt-embedded-free-3.1.0-b2";
+static const char QT_INSTALL_PREFIX [256] = "/opt/qt-x11-free-3.1.2";
+static const char QT_INSTALL_BINS [256] = "/opt/qt-x11-free-3.1.2/bin";
+static const char QT_INSTALL_DOCS [256] = "/opt/qt-x11-free-3.1.2/doc";
+static const char QT_INSTALL_HEADERS[256] = "/opt/qt-x11-free-3.1.2/include";
+static const char QT_INSTALL_LIBS [256] = "/opt/qt-x11-free-3.1.2/lib";
+static const char QT_INSTALL_PLUGINS[256] = "/opt/qt-x11-free-3.1.2/plugins";
+static const char QT_INSTALL_DATA [256] = "/opt/qt-x11-free-3.1.2";
const char *qInstallPath() { return QT_INSTALL_PREFIX; }
const char *qInstallPathDocs() { return QT_INSTALL_DOCS; }
const char *qInstallPathHeaders() { return QT_INSTALL_HEADERS; }
const char *qInstallPathLibs() { return QT_INSTALL_LIBS; }
const char *qInstallPathBins() { return QT_INSTALL_BINS; }
const char *qInstallPathPlugins() { return QT_INSTALL_PLUGINS; }
const char *qInstallPathData() { return QT_INSTALL_DATA; }
diff --git a/qmake/tools/qcriticalsection_p.cpp b/qmake/tools/qcriticalsection_p.cpp
index 60fc8bd..c375730 100644
--- a/qmake/tools/qcriticalsection_p.cpp
+++ b/qmake/tools/qcriticalsection_p.cpp
@@ -1,31 +1,29 @@
/****************************************************************************
** $Id$
**
** Implementation of QCriticalSection class
**
-** Created :
-**
** Copyright (C) 2001 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
diff --git a/qmake/tools/qcstring.cpp b/qmake/tools/qcstring.cpp
index cf1b853..4651b97 100644
--- a/qmake/tools/qcstring.cpp
+++ b/qmake/tools/qcstring.cpp
@@ -120,48 +120,59 @@ char *qstrdup( const char *src )
/*!
\relates QCString
A safe strncpy() function.
Copies at most \a len bytes from \a src (stopping at \a len or the
terminating '\0' whichever comes first) into \a dst and returns a
pointer to \a dst. Guarantees that \a dst is '\0'-terminated. If
\a src or \a dst is 0, returns 0 immediately.
\sa qstrcpy()
*/
char *qstrncpy( char *dst, const char *src, uint len )
{
if ( !src || !dst )
return 0;
strncpy( dst, src, len );
if ( len > 0 )
dst[len-1] = '\0';
return dst;
}
/*!
+ \fn uint qstrlen( const char *str );
+
+ \relates QCString
+
+ A safe strlen function.
+
+ Returns the number of characters that precede the terminating '\0'.
+ or 0 if \a str is 0.
+*/
+
+/*!
\fn int qstrcmp( const char *str1, const char *str2 );
\relates QCString
A safe strcmp() function.
Compares \a str1 and \a str2. Returns a negative value if \a str1
is less than \a str2, 0 if \a str1 is equal to \a str2 or a
positive value if \a str1 is greater than \a str2.
Special case I: Returns 0 if \a str1 and \a str2 are both 0.
Special case II: Returns a random nonzero value if \a str1 is 0
or \a str2 is 0 (but not both).
\sa qstrncmp() qstricmp() qstrnicmp()
\link #asciinotion Note on character comparisons \endlink
*/
/*!
\fn int qstrncmp( const char *str1, const char *str2, uint len );
\relates QCString
@@ -278,142 +289,161 @@ static void createCRC16Table() // build CRC16 lookup table
SET_BIT( j, 13, v1 );
SET_BIT( j, 2, v2 );
SET_BIT( j, 9, v2 );
SET_BIT( j, 14, v2 );
SET_BIT( j, 3, v3 );
SET_BIT( j, 10, v3 );
SET_BIT( j, 15, v3 );
crc_tbl[i] = j;
}
}
/*!
\relates QMemArray
Returns the CRC-16 checksum of \a len bytes starting at \a data.
The checksum is independent of the byte order (endianness).
*/
Q_UINT16 qChecksum( const char *data, uint len )
{
if ( !crc_tbl_init ) { // create lookup table
#ifdef QT_THREAD_SUPPORT
- QMutexLocker locker( qt_global_mutexpool->get( &crc_tbl_init ) );
+ QMutexLocker locker( qt_global_mutexpool ?
+ qt_global_mutexpool->get( &crc_tbl_init ) : 0 );
#endif // QT_THREAD_SUPPORT
if ( !crc_tbl_init ) {
createCRC16Table();
crc_tbl_init = TRUE;
}
}
register Q_UINT16 crc = 0xffff;
uchar c;
uchar *p = (uchar *)data;
while ( len-- ) {
c = *p++;
crc = ( (crc >> 4) & 0x0fff ) ^ crc_tbl[((crc ^ c) & 15)];
c >>= 4;
crc = ( (crc >> 4) & 0x0fff ) ^ crc_tbl[((crc ^ c) & 15)];
}
return ~crc & 0xffff;
}
-/*! \fn QByteArray qCompress( const QByteArray& data)
- \relates QByteArray
- \overload
+/*!
+ \fn QByteArray qCompress( const QByteArray& data )
+
+ \relates QByteArray
+
+ Compresses the array \a data and returns the compressed byte
+ array.
+
+ \sa qUncompress()
*/
/*!
- \relates QByteArray
+ \relates QByteArray
- Compresses the array \a data which is \a nbytes long and returns the
- compressed byte array.
+ \overload
- \sa qUncompress()
+ Compresses the array \a data which is \a nbytes long and returns the
+ compressed byte array.
*/
#ifndef QT_NO_COMPRESS
QByteArray qCompress( const uchar* data, int nbytes )
{
if ( nbytes == 0 ) {
QByteArray tmp( 4 );
tmp.fill( 0 );
return tmp;
}
if ( !data ) {
#if defined(QT_CHECK_RANGE)
qWarning( "qCompress: data is NULL." );
#endif
return QByteArray();
}
ulong len = nbytes * 2;
QByteArray bazip;
int res;
do {
bazip.resize( len + 4 );
res = ::compress( (uchar*)bazip.data()+4, &len, (uchar*)data, nbytes );
switch ( res ) {
case Z_OK:
bazip.resize( len + 4 );
bazip[0] = ( nbytes & 0xff000000 ) >> 24;
bazip[1] = ( nbytes & 0x00ff0000 ) >> 16;
bazip[2] = ( nbytes & 0x0000ff00 ) >> 8;
bazip[3] = ( nbytes & 0x000000ff );
break;
case Z_MEM_ERROR:
#if defined(QT_CHECK_RANGE)
qWarning( "qCompress: Z_MEM_ERROR: Not enough memory." );
#endif
bazip.resize( 0 );
break;
case Z_BUF_ERROR:
len *= 2;
break;
}
} while ( res == Z_BUF_ERROR );
return bazip;
}
#endif
-/*! \fn QByteArray qUncompress( const QByteArray& data )
- \relates QByteArray
- \overload
+/*!
+ \fn QByteArray qUncompress( const QByteArray& data )
+
+ \relates QByteArray
+
+ Uncompresses the array \a data and returns the uncompressed byte
+ array.
+
+ Returns an empty QByteArray if the input data was corrupt.
+ \omit
+ ADD THE FOLLOWING FOR Qt 4.0
+ This function will uncompress data compressed with qCompress()
+ from this and any earlier Qt version, back to Qt 3.1 when this
+ feature was added.
+ \endomit
+
+ \sa qCompress()
*/
/*!
- \relates QByteArray
-
- Uncompresses the array \a data which is \a nbytes long and returns
- the uncompressed byte array.
+ \relates QByteArray
- Returns an empty QByteArray if the input data was corrupt.
+ \overload
- \sa qCompress()
+ Uncompresses the array \a data which is \a nbytes long and returns
+ the uncompressed byte array.
*/
#ifndef QT_NO_COMPRESS
QByteArray qUncompress( const uchar* data, int nbytes )
{
if ( !data ) {
#if defined(QT_CHECK_RANGE)
qWarning( "qUncompress: data is NULL." );
#endif
return QByteArray();
}
if ( nbytes <= 4 ) {
#if defined(QT_CHECK_RANGE)
if ( nbytes < 4 || ( data[0]!=0 || data[1]!=0 || data[2]!=0 || data[3]!=0 ) )
qWarning( "qUncompress: Input data is corrupted." );
#endif
return QByteArray();
}
ulong expectedSize = ( data[0] << 24 ) | ( data[1] << 16 ) | ( data[2] << 8 ) | data[3];
ulong len = QMAX( expectedSize, 1 );
QByteArray baunzip;
int res;
do {
baunzip.resize( len );
@@ -915,55 +945,59 @@ int QCString::find( char c, int index, bool cs ) const
}
#define REHASH( a ) \
if ( sl_minus_1 < sizeof(uint) * CHAR_BIT ) \
hashHaystack -= (a) << sl_minus_1; \
hashHaystack <<= 1
/*!
\overload
Finds the first occurrence of the string \a str, starting at
position \a index.
The search is case sensitive if \a cs is TRUE, or case insensitive
if \a cs is FALSE.
Returns the position of \a str, or -1 if \a str could not be
found.
\sa \link #asciinotion Note on character comparisons \endlink
*/
int QCString::find( const char *str, int index, bool cs ) const
{
+ return find( str, index, cs, length() );
+}
+
+int QCString::find( const char *str, int index, bool cs, uint l ) const
+{
if ( (uint)index >= size() )
return -1;
if ( !str )
return -1;
if ( !*str )
return index;
- const uint l = length();
const uint sl = qstrlen( str );
if ( sl + index > l )
return -1;
if ( sl == 1 )
return find( *str, index, cs );
/*
See QString::find() for details.
*/
const char* needle = str;
const char* haystack = data() + index;
const char* end = data() + (l-sl);
const uint sl_minus_1 = sl-1;
uint hashNeedle = 0, hashHaystack = 0,i;
if ( cs ) {
for ( i = 0; i < sl; ++i ) {
hashNeedle = ((hashNeedle<<1) + needle[i] );
hashHaystack = ((hashHaystack<<1) + haystack[i] );
}
hashHaystack -= *(haystack+sl_minus_1);
while ( haystack <= end ) {
@@ -1131,70 +1165,70 @@ int QCString::contains( char c, bool cs ) const
}
}
return count;
}
/*!
\overload
Returns the number of times \a str occurs in the string.
The match is case sensitive if \a cs is TRUE, or case insensitive
if \a cs if FALSE.
This function counts overlapping substrings, for example, "banana"
contains two occurrences of "ana".
\sa findRev()
\link #asciinotion Note on character comparisons \endlink
*/
int QCString::contains( const char *str, bool cs ) const
{
int count = 0;
int i = -1;
+ uint l = length();
// use find for the faster hashing algorithm
- while ( ( i = find ( str, i+1, cs ) ) != -1 )
+ while ( ( i = find ( str, i+1, cs, l ) ) != -1 )
count++;
return count;
}
/*!
Returns a substring that contains the \a len leftmost characters
of the string.
The whole string is returned if \a len exceeds the length of the
string.
Example:
\code
QCString s = "Pineapple";
QCString t = s.left( 4 ); // t == "Pine"
\endcode
\sa right(), mid()
*/
-
QCString QCString::left( uint len ) const
{
if ( isEmpty() ) {
QCString empty;
return empty;
} else if ( len >= size() ) {
QCString same( data() );
return same;
} else {
QCString s( len+1 );
strncpy( s.data(), data(), len );
*(s.data()+len) = '\0';
return s;
}
}
/*!
Returns a substring that contains the \a len rightmost characters
of the string.
The whole string is returned if \a len exceeds the length of the
string.
Example:
@@ -1476,56 +1510,58 @@ QCString QCString::simplifyWhiteSpace() const
Inserts string \a s into the string at position \a index.
If \a index is beyond the end of the string, the string is
padded with spaces (ASCII 32) to length \a index and then \a s
is appended.
\code
QCString s = "I like fish";
s.insert( 2, "don't "); // s == "I don't like fish"
s = "x"; // index 01234
s.insert( 3, "yz" ); // s == "x yz"
\endcode
*/
QCString &QCString::insert( uint index, const char *s )
{
int len = qstrlen(s);
if ( len == 0 )
return *this;
uint olen = length();
int nlen = olen + len;
if ( index >= olen ) { // insert after end of string
detach();
- if ( QByteArray::resize(nlen+index-olen+1) ) {
+ if ( QByteArray::resize(nlen+index-olen+1, QByteArray::SpeedOptim ) ) {
memset( data()+olen, ' ', index-olen );
memcpy( data()+index, s, len+1 );
}
- } else if ( QByteArray::resize(nlen+1) ) { // normal insert
+ } else {
detach();
- memmove( data()+index+len, data()+index, olen-index+1 );
- memcpy( data()+index, s, len );
+ if ( QByteArray::resize(nlen+1, QByteArray::SpeedOptim ) ) { // normal insert
+ memmove( data()+index+len, data()+index, olen-index+1 );
+ memcpy( data()+index, s, len );
+ }
}
return *this;
}
/*!
Inserts character \a c into the string at position \a index and
returns a reference to the string.
If \a index is beyond the end of the string, the string is
padded with spaces (ASCII 32) to length \a index and then \a c
is appended.
Example:
\code
QCString s = "Yes";
s.insert( 3, '!'); // s == "Yes!"
\endcode
\sa remove(), replace()
*/
QCString &QCString::insert( uint index, char c ) // insert char
{
char buf[2];
@@ -1548,49 +1584,49 @@ QCString &QCString::insert( uint index, char c ) // insert char
If \a index is out of range, nothing happens. If \a index is
valid, but \a index + \a len is larger than the length of the
string, the string is truncated at position \a index.
\code
QCString s = "Montreal";
s.remove( 1, 4 ); // s == "Meal"
\endcode
\sa insert(), replace()
*/
QCString &QCString::remove( uint index, uint len )
{
uint olen = length();
if ( index + len >= olen ) { // range problems
if ( index < olen ) { // index ok
detach();
resize( index+1 );
}
} else if ( len != 0 ) {
detach();
memmove( data()+index, data()+index+len, olen-index-len+1 );
- QByteArray::resize(olen-len+1);
+ QByteArray::resize(olen-len+1, QByteArray::SpeedOptim );
}
return *this;
}
/*!
Replaces \a len characters from the string, starting at position
\a index, with \a str, and returns a reference to the string.
If \a index is out of range, nothing is removed and \a str is
appended at the end of the string. If \a index is valid, but \a
index + \a len is larger than the length of the string, \a str
replaces the rest of the string from position \a index.
\code
QCString s = "Say yes!";
s.replace( 4, 3, "NO" ); // s == "Say NO!"
\endcode
\sa insert(), remove()
*/
QCString &QCString::replace( uint index, uint len, const char *str )
{
remove( index, len );
@@ -1610,104 +1646,105 @@ QCString &QCString::replace( uint index, uint len, const char *str )
s.replace( ',', " or " );
// s == "a or b or c"
\endcode
*/
QCString &QCString::replace( char c, const char *after )
{
char str[2];
str[0] = c;
str[1] = '\0';
return replace( str, after );
}
/*! \overload
Replaces every occurrence of the string \a before in the string
with the string \a after. Returns a reference to the string.
Example:
\code
QCString s = "Greek is Greek";
s.replace( "Greek", "English" );
// s == "English is English"
\endcode
*/
+
QCString &QCString::replace( const char *before, const char *after )
{
if ( before == after || isNull() )
return *this;
detach();
int index = 0;
const int bl = before ? strlen( before ) : 0;
const int al = after ? strlen( after ) : 0;
char *d = data();
uint len = length();
if ( bl == al ) {
if ( bl ) {
- while( (index = find( before, index ) ) != -1 ) {
+ while( (index = find( before, index, TRUE, len ) ) != -1 ) {
memcpy( d+index, after, al );
index += bl;
}
}
} else if ( al < bl ) {
uint to = 0;
uint movestart = 0;
uint num = 0;
- while( (index = find( before, index ) ) != -1 ) {
+ while( (index = find( before, index, TRUE, len ) ) != -1 ) {
if ( num ) {
int msize = index - movestart;
if ( msize > 0 ) {
memmove( d + to, d + movestart, msize );
to += msize;
}
} else {
to = index;
}
if ( al ) {
memcpy( d + to, after, al );
to += al;
}
index += bl;
movestart = index;
num++;
}
if ( num ) {
int msize = len - movestart;
if ( msize > 0 )
memmove( d + to, d + movestart, msize );
resize( len - num*(bl-al) + 1 );
}
} else {
// the most complex case. We don't want to loose performance by doing repeated
// copies and reallocs of the string.
while( index != -1 ) {
uint indices[4096];
uint pos = 0;
while( pos < 4095 ) {
- index = find(before, index);
+ index = find(before, index, TRUE, len);
if ( index == -1 )
break;
indices[pos++] = index;
index += bl;
// avoid infinite loop
if ( !bl )
index++;
}
if ( !pos )
break;
// we have a table of replacement positions, use them for fast replacing
int adjust = pos*(al-bl);
// index has to be adjusted in case we get back into the loop above.
if ( index != -1 )
index += adjust;
uint newlen = len + adjust;
int moveend = len;
if ( newlen > len ) {
resize( newlen + 1 );
len = newlen;
}
d = data();
@@ -1742,125 +1779,125 @@ QCString &QCString::replace( char c1, char c2 )
d[i] = c2;
i++;
}
return *this;
}
#ifndef QT_NO_REGEXP_CAPTURE
/*!
\overload
Finds the first occurrence of the regular expression \a rx,
starting at position \a index.
Returns the position of the next match, or -1 if \a rx was not
found.
\warning If you want to apply this function repeatedly to the same
string it is more efficient to convert the string to a QString and
apply the function to that.
*/
int QCString::find( const QRegExp& rx, int index ) const
{
- QString d = QString::fromLatin1( data() );
+ QString d = QString::fromAscii( data() );
return d.find( rx, index );
}
/*!
\overload
Finds the first occurrence of the regular expression \a rx,
starting at position \a index and searching backwards.
Returns the position of the next match (backwards), or -1 if \a rx
was not found.
\warning If you want to apply this function repeatedly to the same
string it is more efficient to convert the string to a QString and
apply the function to that.
*/
int QCString::findRev( const QRegExp& rx, int index ) const
{
- QString d = QString::fromLatin1( data() );
+ QString d = QString::fromAscii( data() );
return d.findRev( rx, index );
}
/*!
\overload
Counts the number of overlapping occurrences of \a rx in the string.
Example:
\code
QString s = "banana and panama";
QRegExp r = QRegExp( "a[nm]a", TRUE, FALSE );
s.contains( r ); // 4 matches
\endcode
\sa find(), findRev()
\warning If you want to apply this function repeatedly to the same
string it is more efficient to convert the string to a QString and
apply the function to that.
*/
int QCString::contains( const QRegExp &rx ) const
{
- QString d = QString::fromLatin1( data() );
+ QString d = QString::fromAscii( data() );
return d.contains( rx );
}
/*!
\overload
Replaces every occurrence of \a rx in the string with \a str.
Returns a reference to the string.
Example:
\code
QString s = "banana";
s.replace( QRegExp("a.*a"), "" ); // becomes "b"
s = "banana";
s.replace( QRegExp("^[bn]a"), "X" ); // becomes "Xnana"
s = "banana";
s.replace( QRegExp("^[bn]a"), "" ); // becomes "nana"
\endcode
\warning If you want to apply this function repeatedly to the same
string it is more efficient to convert the string to a QString and
apply the function to that.
*/
QCString &QCString::replace( const QRegExp &rx, const char *str )
{
- QString d = QString::fromLatin1( data() );
- QString r = QString::fromLatin1( str );
+ QString d = QString::fromAscii( data() );
+ QString r = QString::fromAscii( str );
d.replace( rx, r );
setStr( d.ascii() );
return *this;
}
#endif //QT_NO_REGEXP
/*!
Returns the string converted to a \c long value.
If \a ok is not 0: \a *ok is set to FALSE if the string is not a
number, or if it has trailing garbage; otherwise \a *ok is set to
TRUE.
*/
long QCString::toLong( bool *ok ) const
{
char *p = data();
long val=0;
const long max_mult = 214748364;
bool is_ok = FALSE;
int neg = 0;
if ( !p )
goto bye;
while ( isspace((uchar) *p) ) // skip leading space
@@ -2178,65 +2215,65 @@ bool QCString::setExpand( uint index, char c )
\fn QCString::operator const char *() const
Returns the string data.
*/
/*!
\fn QCString& QCString::append( const char *str )
Appends string \a str to the string and returns a reference to the
string. Equivalent to operator+=().
*/
/*!
Appends string \a str to the string and returns a reference to the string.
*/
QCString& QCString::operator+=( const char *str )
{
if ( !str )
return *this; // nothing to append
detach();
uint len1 = length();
uint len2 = qstrlen(str);
- if ( !QByteArray::resize( len1 + len2 + 1 ) )
+ if ( !QByteArray::resize( len1 + len2 + 1, QByteArray::SpeedOptim ) )
return *this; // no memory
memcpy( data() + len1, str, len2 + 1 );
return *this;
}
/*!
\overload
Appends character \a c to the string and returns a reference to the string.
*/
QCString &QCString::operator+=( char c )
{
detach();
uint len = length();
- if ( !QByteArray::resize( len + 2 ) )
+ if ( !QByteArray::resize( len + 2, QByteArray::SpeedOptim ) )
return *this; // no memory
*(data() + len) = c;
*(data() + len+1) = '\0';
return *this;
}
/*****************************************************************************
QCString stream functions
*****************************************************************************/
#ifndef QT_NO_DATASTREAM
/*!
\relates QCString
Writes string \a str to the stream \a s.
\sa \link datastreamformat.html Format of the QDataStream operators \endlink
*/
QDataStream &operator<<( QDataStream &s, const QCString &str )
{
return s.writeBytes( str.data(), str.size() );
}
/*!
diff --git a/qmake/tools/qdatastream.cpp b/qmake/tools/qdatastream.cpp
index 9c573c7..51a1448 100644
--- a/qmake/tools/qdatastream.cpp
+++ b/qmake/tools/qdatastream.cpp
@@ -729,50 +729,58 @@ QDataStream &QDataStream::readBytes( char *&s, uint &l )
} else {
s = new char[len]; // create char array
Q_CHECK_PTR( s );
if ( !s ) // no memory
return *this;
return readRawBytes( s, (uint)len );
}
}
/*!
Reads \a len bytes from the stream into \a s and returns a
reference to the stream.
The buffer \a s must be preallocated. The data is \e not encoded.
\sa readBytes(), QIODevice::readBlock(), writeRawBytes()
*/
QDataStream &QDataStream::readRawBytes( char *s, uint len )
{
CHECK_STREAM_PRECOND
if ( printable ) { // printable data
register Q_INT8 *p = (Q_INT8*)s;
- while ( len-- )
- *this >> *p++;
+ if ( version() < 4 ) {
+ while ( len-- ) {
+ Q_INT32 tmp;
+ *this >> tmp;
+ *p++ = tmp;
+ }
+ } else {
+ while ( len-- )
+ *this >> *p++;
+ }
} else { // read data char array
dev->readBlock( s, len );
}
return *this;
}
/*****************************************************************************
QDataStream write functions
*****************************************************************************/
/*!
\overload QDataStream &QDataStream::operator<<( Q_UINT8 i )
Writes an unsigned byte, \a i, to the stream and returns a
reference to the stream.
*/
/*!
Writes a signed byte, \a i, to the stream and returns a reference
to the stream.
*/
@@ -991,34 +999,40 @@ QDataStream &QDataStream::operator<<( const char *s )
\sa writeRawBytes(), readBytes()
*/
QDataStream &QDataStream::writeBytes(const char *s, uint len)
{
CHECK_STREAM_PRECOND
*this << (Q_UINT32)len; // write length specifier
if ( len )
writeRawBytes( s, len );
return *this;
}
/*!
Writes \a len bytes from \a s to the stream and returns a
reference to the stream. The data is \e not encoded.
\sa writeBytes(), QIODevice::writeBlock(), readRawBytes()
*/
QDataStream &QDataStream::writeRawBytes( const char *s, uint len )
{
CHECK_STREAM_PRECOND
if ( printable ) { // write printable
- register Q_INT8 *p = (Q_INT8*)s;
- while ( len-- )
- *this << *p++;
+ if ( version() < 4 ) {
+ register char *p = (char *)s;
+ while ( len-- )
+ *this << *p++;
+ } else {
+ register Q_INT8 *p = (Q_INT8*)s;
+ while ( len-- )
+ *this << *p++;
+ }
} else { // write data char array
dev->writeBlock( s, len );
}
return *this;
}
#endif // QT_NO_DATASTREAM
diff --git a/qmake/tools/qdatetime.cpp b/qmake/tools/qdatetime.cpp
index 93e40a8..3137877 100644
--- a/qmake/tools/qdatetime.cpp
+++ b/qmake/tools/qdatetime.cpp
@@ -1,62 +1,61 @@
/****************************************************************************
** $Id$
**
** Implementation of date and time classes
**
** Created : 940124
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-// Get the system specific includes and defines
#include "qplatformdefs.h"
#include "qdatetime.h"
#include "qdatastream.h"
#include "qregexp.h"
#include <stdio.h>
#ifndef Q_OS_TEMP
#include <time.h>
#endif
#if defined(Q_OS_WIN32)
#include <windows.h>
#endif
static const uint FIRST_DAY = 2361222; // Julian day for 1752-09-14
static const int FIRST_YEAR = 1752; // ### wrong for many countries
static const uint SECS_PER_DAY = 86400;
static const uint MSECS_PER_DAY = 86400000;
static const uint SECS_PER_HOUR = 3600;
static const uint MSECS_PER_HOUR= 3600000;
static const uint SECS_PER_MIN = 60;
static const uint MSECS_PER_MIN = 60000;
@@ -874,48 +873,54 @@ QDate QDate::addMonths( int nmonths ) const
}
QDate tmp(y,m,1);
if( d > tmp.daysInMonth() )
d = tmp.daysInMonth();
QDate date(y, m, d);
return date;
}
/*!
Returns a QDate object containing a date \a nyears later than the
date of this object (or earlier if \a nyears is negative).
\sa addDays(), addMonths()
*/
QDate QDate::addYears( int nyears ) const
{
int y, m, d;
julianToGregorian( jd, y, m, d );
y += nyears;
+
+ QDate tmp(y,m,1);
+
+ if( d > tmp.daysInMonth() )
+ d = tmp.daysInMonth();
+
QDate date(y, m, d);
return date;
}
/*!
Returns the number of days from this date to \a d (which is
negative if \a d is earlier than this date).
Example:
\code
QDate d1( 1995, 5, 17 ); // May 17th 1995
QDate d2( 1995, 5, 20 ); // May 20th 1995
d1.daysTo( d2 ); // returns 3
d2.daysTo( d1 ); // returns -3
\endcode
\sa addDays()
*/
int QDate::daysTo( const QDate &d ) const
{
return d.jd - jd;
@@ -969,55 +974,67 @@ int QDate::daysTo( const QDate &d ) const
QDate QDate::currentDate()
{
return currentDate( Qt::LocalTime );
}
/*!
Returns the current date, as reported by the system clock, for the
TimeSpec \a ts. The default TimeSpec is LocalTime.
\sa QTime::currentTime(), QDateTime::currentDateTime(), Qt::TimeSpec
*/
QDate QDate::currentDate( Qt::TimeSpec ts )
{
QDate d;
#if defined(Q_OS_WIN32)
SYSTEMTIME t;
memset( &t, 0, sizeof(SYSTEMTIME) );
if ( ts == Qt::LocalTime )
GetLocalTime( &t );
else
GetSystemTime( &t );
d.jd = gregorianToJulian( t.wYear, t.wMonth, t.wDay );
#else
+ // posix compliant system
time_t ltime;
time( &ltime );
tm *t;
+
+# if defined(QT_THREAD_SUPPORT) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
+ // use the reentrant versions of localtime() and gmtime() where available
+ tm res;
+ if ( ts == Qt::LocalTime )
+ t = localtime_r( &ltime, &res );
+ else
+ t = gmtime_r( &ltime, &res );
+# else
if ( ts == Qt::LocalTime )
t = localtime( &ltime );
- else
+ else
t = gmtime( &ltime );
+# endif // QT_THREAD_SUPPORT && _POSIX_THREAD_SAFE_FUNCTIONS
+
d.jd = gregorianToJulian( t->tm_year + 1900, t->tm_mon + 1, t->tm_mday );
#endif
return d;
}
#ifndef QT_NO_DATESTRING
/*!
Returns the QDate represented by the string \a s, using the format
\a f, or an invalid date if the string cannot be parsed.
Note for \c Qt::TextDate: It is recommended that you use the
English short month names (e.g. "Jan"). Although localized month
names can also be used, they depend on the user's locale settings.
\warning \c Qt::LocalDate cannot be used here.
*/
QDate QDate::fromString( const QString& s, Qt::DateFormat f )
{
if ( ( s.isEmpty() ) || ( f == Qt::LocalDate ) ) {
#if defined(QT_CHECK_RANGE)
qWarning( "QDate::fromString: Parameter out of range." );
#endif
return QDate();
}
@@ -1534,49 +1551,49 @@ int QTime::msecsTo( const QTime &t ) const
*/
/*!
\fn bool QTime::operator<=( const QTime &t ) const
Returns TRUE if this time is earlier than or equal to \a t;
otherwise returns FALSE.
*/
/*!
\fn bool QTime::operator>( const QTime &t ) const
Returns TRUE if this time is later than \a t; otherwise returns FALSE.
*/
/*!
\fn bool QTime::operator>=( const QTime &t ) const
Returns TRUE if this time is later than or equal to \a t;
otherwise returns FALSE.
*/
-/*!
+/*!
\overload
Returns the current time as reported by the system clock.
Note that the accuracy depends on the accuracy of the underlying
operating system; not all systems provide 1-millisecond accuracy.
*/
QTime QTime::currentTime()
{
return currentTime( Qt::LocalTime );
}
/*!
Returns the current time as reported by the system clock, for the
TimeSpec \a ts. The default TimeSpec is LocalTime.
Note that the accuracy depends on the accuracy of the underlying
operating system; not all systems provide 1-millisecond accuracy.
\sa Qt::TimeSpec
*/
QTime QTime::currentTime( Qt::TimeSpec ts )
{
@@ -1632,104 +1649,115 @@ bool QTime::currentTime( QTime *ct )
return value is used by QDateTime::currentDateTime() to ensure that
the date there is correct. The default TimeSpec is LocalTime.
\sa Qt::TimeSpec
*/
bool QTime::currentTime( QTime *ct, Qt::TimeSpec ts )
{
if ( !ct ) {
#if defined(QT_CHECK_NULL)
qWarning( "QTime::currentTime(QTime *): Null pointer not allowed" );
#endif
return FALSE;
}
#if defined(Q_OS_WIN32)
SYSTEMTIME t;
if ( ts == Qt::LocalTime ) {
GetLocalTime( &t );
} else {
GetSystemTime( &t );
}
ct->ds = (uint)( MSECS_PER_HOUR*t.wHour + MSECS_PER_MIN*t.wMinute +
1000*t.wSecond + t.wMilliseconds );
#elif defined(Q_OS_UNIX)
+ // posix compliant system
struct timeval tv;
gettimeofday( &tv, 0 );
time_t ltime = tv.tv_sec;
tm *t;
- if ( ts == Qt::LocalTime ) {
+
+# if defined(QT_THREAD_SUPPORT) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
+ // use the reentrant versions of localtime() and gmtime() where available
+ tm res;
+ if ( ts == Qt::LocalTime )
+ t = localtime_r( &ltime, &res );
+ else
+ t = gmtime_r( &ltime, &res );
+# else
+ if ( ts == Qt::LocalTime )
t = localtime( &ltime );
- } else {
+ else
t = gmtime( &ltime );
- }
+# endif // QT_THREAD_SUPPORT && _POSIX_THREAD_SAFE_FUNCTIONS
+
ct->ds = (uint)( MSECS_PER_HOUR * t->tm_hour + MSECS_PER_MIN * t->tm_min +
1000 * t->tm_sec + tv.tv_usec / 1000 );
#else
time_t ltime; // no millisecond resolution
::time( &ltime );
tm *t;
- if ( ts == Qt::LocalTime )
+ if ( ts == Qt::LocalTime )
localtime( &ltime );
else
gmtime( &ltime );
ct->ds = (uint) ( MSECS_PER_HOUR * t->tm_hour + MSECS_PER_MIN * t->tm_min +
1000 * t->tm_sec );
#endif
// 00:00.00 to 00:00.59.999 is considered as "midnight or right after"
return ct->ds < (uint) MSECS_PER_MIN;
}
/*!
\overload
Returns TRUE if the specified time is valid; otherwise returns
FALSE.
The time is valid if \a h is in the range 0..23, \a m and \a s are
in the range 0..59, and \a ms is in the range 0..999.
Example:
\code
QTime::isValid(21, 10, 30); // returns TRUE
QTime::isValid(22, 5, 62); // returns FALSE
\endcode
*/
bool QTime::isValid( int h, int m, int s, int ms )
{
return (uint)h < 24 && (uint)m < 60 && (uint)s < 60 && (uint)ms < 1000;
}
/*!
Sets this time to the current time. This is practical for timing:
\code
QTime t;
- t.start(); // start clock
- ... // some lengthy task
- qDebug( "%d\n", t.elapsed() ); // prints the number of msecs elapsed
+ t.start();
+ some_lengthy_task();
+ qDebug( "Time elapsed: %d ms", t.elapsed() );
\endcode
\sa restart(), elapsed(), currentTime()
*/
void QTime::start()
{
*this = currentTime();
}
/*!
Sets this time to the current time and returns the number of
milliseconds that have elapsed since the last time start() or
restart() was called.
This function is guaranteed to be atomic and is thus very handy
for repeated measurements. Call start() to start the first
measurement and then restart() for each later measurement.
Note that the counter wraps to zero 24 hours after the last call
to start() or restart().
\warning If the system's clock setting has been changed since the
last time start() or restart() was called, the result is
@@ -1939,58 +1967,76 @@ uint QDateTime::toTime_t() const
based on the given UTC time.
*/
void QDateTime::setTime_t( uint secsSince1Jan1970UTC )
{
setTime_t( secsSince1Jan1970UTC, Qt::LocalTime );
}
/*!
Sets the date and time to \a ts time (\c Qt::LocalTime or \c
Qt::UTC) given the number of seconds that have passed since
1970-01-01T00:00:00, Coordinated Universal Time (UTC). On systems
that do not support timezones this function will behave as if
local time were UTC.
On Windows, only a subset of \a secsSince1Jan1970UTC values are
supported, as Windows starts counting from 1980.
\sa toTime_t()
*/
void QDateTime::setTime_t( uint secsSince1Jan1970UTC, Qt::TimeSpec ts )
{
time_t tmp = (time_t) secsSince1Jan1970UTC;
tm *brokenDown = 0;
+
+#if defined(Q_OS_UNIX) && defined(QT_THREAD_SUPPORT) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
+ // posix compliant system
+ // use the reentrant versions of localtime() and gmtime() where available
+ tm res;
+ if ( ts == Qt::LocalTime )
+ brokenDown = localtime_r( &tmp, &res );
+ if ( !brokenDown ) {
+ brokenDown = gmtime_r( &tmp, &res );
+ if ( !brokenDown ) {
+ d.jd = QDate::gregorianToJulian( 1970, 1, 1 );
+ t.ds = 0;
+ return;
+ }
+ }
+#else
if ( ts == Qt::LocalTime )
brokenDown = localtime( &tmp );
if ( !brokenDown ) {
brokenDown = gmtime( &tmp );
if ( !brokenDown ) {
d.jd = QDate::gregorianToJulian( 1970, 1, 1 );
t.ds = 0;
return;
}
}
+#endif
+
d.jd = QDate::gregorianToJulian( brokenDown->tm_year + 1900,
brokenDown->tm_mon + 1,
brokenDown->tm_mday );
t.ds = MSECS_PER_HOUR * brokenDown->tm_hour +
MSECS_PER_MIN * brokenDown->tm_min +
1000 * brokenDown->tm_sec;
}
#ifndef QT_NO_DATESTRING
#ifndef QT_NO_SPRINTF
/*!
\overload
Returns the datetime as a string. The \a f parameter determines
the format of the string.
If \a f is \c Qt::TextDate, the string format is "Wed May 20
03:40:13 1998" (using QDate::shortDayName(), QDate::shortMonthName(),
and QTime::toString() to generate the string, so the day and month
names will have localized names).
If \a f is \c Qt::ISODate, the string format corresponds to the
ISO 8601 extended specification for representations of dates and
times, which is YYYY-MM-DDTHH:MM:SS.
@@ -2279,49 +2325,49 @@ bool QDateTime::operator<=( const QDateTime &dt ) const
returns FALSE.
*/
bool QDateTime::operator>( const QDateTime &dt ) const
{
if ( d > dt.d )
return TRUE;
return d == dt.d ? t > dt.t : FALSE;
}
/*!
Returns TRUE if this datetime is later than or equal to \a dt;
otherwise returns FALSE.
*/
bool QDateTime::operator>=( const QDateTime &dt ) const
{
if ( d > dt.d )
return TRUE;
return d == dt.d ? t >= dt.t : FALSE;
}
/*!
\overload
-
+
Returns the current datetime, as reported by the system clock.
\sa QDate::currentDate(), QTime::currentTime()
*/
QDateTime QDateTime::currentDateTime()
{
return currentDateTime( Qt::LocalTime );
}
/*!
Returns the current datetime, as reported by the system clock, for the
TimeSpec \a ts. The default TimeSpec is LocalTime.
\sa QDate::currentDate(), QTime::currentTime(), Qt::TimeSpec
*/
QDateTime QDateTime::currentDateTime( Qt::TimeSpec ts )
{
QDateTime dt;
QTime t;
dt.setDate( QDate::currentDate(ts) );
if ( QTime::currentTime(&t, ts) ) // midnight or right after?
dt.setDate( QDate::currentDate(ts) ); // fetch date again
diff --git a/qmake/tools/qdir.cpp b/qmake/tools/qdir.cpp
index 418ea49..5714878 100644
--- a/qmake/tools/qdir.cpp
+++ b/qmake/tools/qdir.cpp
@@ -1,76 +1,81 @@
/****************************************************************************
** $Id$
**
** Implementation of QDir class
**
** Created : 950427
**
-** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2003 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "qplatformdefs.h"
#include "qdir.h"
#ifndef QT_NO_DIR
#include <private/qdir_p.h>
#include "qfileinfo.h"
#include "qregexp.h"
#include "qstringlist.h"
-#include <stdlib.h>
-#include <ctype.h>
+#include <limits.h>
+#if defined(Q_FS_FAT) && !defined(Q_OS_UNIX)
+const bool CaseSensitiveFS = FALSE;
+#else
+const bool CaseSensitiveFS = TRUE;
+#endif
/*!
\class QDir
+ \reentrant
\brief The QDir class provides access to directory structures and their contents in a platform-independent way.
\ingroup io
\mainclass
A QDir is used to manipulate path names, access information
regarding paths and files, and manipulate the underlying file
system.
A QDir can point to a file using either a relative or an absolute
path. Absolute paths begin with the directory separator "/"
(optionally preceded by a drive specification under Windows). If
you always use "/" as a directory separator, Qt will translate
your paths to conform to the underlying operating system. Relative
file names begin with a directory name or a file name and specify
a path relative to the current directory.
The "current" path refers to the application's working directory.
A QDir's own path is set and retrieved with setPath() and path().
An example of an absolute path is the string "/tmp/quartz", a
relative path might look like "src/fatlib". You can use the
function isRelative() to check if a QDir is using a relative or an
absolute file path. Call convertToAbs() to convert a relative QDir
@@ -209,48 +214,56 @@ QDir::QDir( const QString &path, const QString &nameFilter,
if ( nameFilt.isEmpty() )
nameFilt = QString::fromLatin1("*");
filtS = (FilterSpec)filterSpec;
sortS = (SortSpec)sortSpec;
}
/*!
Constructs a QDir that is a copy of the directory \a d.
\sa operator=()
*/
QDir::QDir( const QDir &d )
{
dPath = d.dPath;
fList = 0;
fiList = 0;
nameFilt = d.nameFilt;
dirty = TRUE;
allDirs = d.allDirs;
filtS = d.filtS;
sortS = d.sortS;
}
+/*!
+ Refreshes the directory information.
+*/
+void QDir::refresh() const
+{
+ QDir* that = (QDir*) this;
+ that->dirty = TRUE;
+}
void QDir::init()
{
fList = 0;
fiList = 0;
nameFilt = QString::fromLatin1("*");
dirty = TRUE;
allDirs = FALSE;
filtS = All;
sortS = SortSpec(Name | IgnoreCase);
}
/*!
Destroys the QDir frees up its resources.
*/
QDir::~QDir()
{
delete fList;
delete fiList;
}
/*!
@@ -361,52 +374,78 @@ QString QDir::filePath( const QString &fileName,
return tmp;
}
/*!
Returns the absolute path name of a file in the directory. Does \e
not check if the file actually exists in the directory. Redundant
multiple separators or "." and ".." directories in \a fileName
will not be removed (see cleanDirPath()).
If \a acceptAbsPath is TRUE a \a fileName starting with a
separator "/" will be returned without change. If \a acceptAbsPath
is FALSE an absolute path will be prepended to the fileName and
the resultant string returned.
\sa filePath()
*/
QString QDir::absFilePath( const QString &fileName,
bool acceptAbsPath ) const
{
if ( acceptAbsPath && !isRelativePath( fileName ) )
return fileName;
QString tmp = absPath();
- if ( tmp.isEmpty() || (tmp[(int)tmp.length()-1] != '/' && !!fileName &&
- fileName[0] != '/') )
- tmp += '/';
- tmp += fileName;
+#ifdef Q_OS_WIN32
+ if ( fileName[0].isLetter() && fileName[1] == ':' ) {
+ int drv = fileName.upper()[0].latin1() - 'A' + 1;
+ if ( _getdrive() != drv ) {
+ if ( qt_winunicode ) {
+ TCHAR buf[PATH_MAX];
+ ::_tgetdcwd( drv, buf, PATH_MAX );
+ tmp.setUnicodeCodes( (ushort*)buf, ::_tcslen(buf) );
+ } else {
+ char buf[PATH_MAX];
+ ::_getdcwd( drv, buf, PATH_MAX );
+ tmp = buf;
+ }
+ if ( !tmp.endsWith("\\") )
+ tmp += "\\";
+ tmp += fileName.right( fileName.length() - 2 );
+ int x;
+ for ( x = 0; x < (int) tmp.length(); x++ ) {
+ if ( tmp[x] == '\\' )
+ tmp[x] = '/';
+ }
+ }
+ } else
+#endif
+ {
+ if ( tmp.isEmpty() || (tmp[(int)tmp.length()-1] != '/' && !!fileName &&
+ fileName[0] != '/') )
+ tmp += '/';
+ tmp += fileName;
+ }
return tmp;
}
/*!
Returns \a pathName with the '/' separators converted to
separators that are appropriate for the underlying operating
system.
On Windows, convertSeparators("c:/winnt/system32") returns
"c:\winnt\system32".
The returned string may be the same as the argument on some
operating systems, for example on Unix.
*/
QString QDir::convertSeparators( const QString &pathName )
{
QString n( pathName );
#if defined(Q_FS_FAT) || defined(Q_OS_OS2EMX)
for ( int i=0; i<(int)n.length(); i++ ) {
if ( n[i] == '/' )
n[i] = '\\';
}
@@ -913,64 +952,66 @@ QDir &QDir::operator=( const QDir &d )
Sets the directory path to be the given \a path.
*/
QDir &QDir::operator=( const QString &path )
{
dPath = cleanDirPath( path );
dirty = TRUE;
return *this;
}
/*!
\fn bool QDir::operator!=( const QDir &d ) const
Returns TRUE if directory \a d and this directory have different
paths or different sort or filter settings; otherwise returns
FALSE.
Example:
\code
// The current directory is "/usr/local"
QDir d1( "/usr/local/bin" );
QDir d2( "bin" );
- if ( d1 != d2 ) qDebug( "They differ\n" ); // This is printed
+ if ( d1 != d2 )
+ qDebug( "They differ" );
\endcode
*/
/*!
Returns TRUE if directory \a d and this directory have the same
path and their sort and filter settings are the same; otherwise
returns FALSE.
Example:
\code
// The current directory is "/usr/local"
QDir d1( "/usr/local/bin" );
QDir d2( "bin" );
d2.convertToAbs();
- if ( d1 == d2 ) qDebug( "They're the same\n" ); // This is printed
+ if ( d1 == d2 )
+ qDebug( "They're the same" );
\endcode
*/
bool QDir::operator==( const QDir &d ) const
{
return dPath == d.dPath &&
nameFilt == d.nameFilt &&
allDirs == d.allDirs &&
filtS == d.filtS &&
sortS == d.sortS;
}
/*!
Removes the file, \a fileName.
If \a acceptAbsPath is TRUE a path starting with separator "/"
will remove the file with the absolute path. If \a acceptAbsPath
is FALSE any number of separators at the beginning of \a fileName
will be removed and the resultant file name will be removed.
Returns TRUE if the file is removed successfully; otherwise
returns FALSE.
*/
@@ -1066,110 +1107,117 @@ QDir QDir::current()
QDir QDir::home()
{
return QDir( homeDirPath() );
}
/*!
Returns the root directory.
\sa rootDirPath() drives()
*/
QDir QDir::root()
{
return QDir( rootDirPath() );
}
/*!
\fn QString QDir::homeDirPath()
Returns the absolute path of the user's home directory.
\sa home()
*/
-QStringList qt_makeFilterList( const QString &filter )
+QValueList<QRegExp> qt_makeFilterList( const QString &filter )
{
+ QValueList<QRegExp> regExps;
if ( filter.isEmpty() )
- return QStringList();
+ return regExps;
QChar sep( ';' );
int i = filter.find( sep, 0 );
if ( i == -1 && filter.find( ' ', 0 ) != -1 )
sep = QChar( ' ' );
QStringList list = QStringList::split( sep, filter );
QStringList::Iterator it = list.begin();
- QStringList list2;
+ while ( it != list.end() ) {
+ regExps << QRegExp( (*it).stripWhiteSpace(), CaseSensitiveFS, TRUE );
+ ++it;
+ }
+ return regExps;
+}
- for ( ; it != list.end(); ++it ) {
- QString s = *it;
- list2 << s.stripWhiteSpace();
+bool qt_matchFilterList( const QValueList<QRegExp>& filters,
+ const QString &fileName )
+{
+ QValueList<QRegExp>::ConstIterator rit = filters.begin();
+ while ( rit != filters.end() ) {
+ if ( (*rit).exactMatch(fileName) )
+ return TRUE;
+ ++rit;
}
- return list2;
+ return FALSE;
}
+
/*!
\overload
Returns TRUE if the \a fileName matches any of the wildcard (glob)
patterns in the list of \a filters; otherwise returns FALSE.
(See \link qregexp.html#wildcard-matching QRegExp wildcard
matching.\endlink)
\sa QRegExp::match()
*/
bool QDir::match( const QStringList &filters, const QString &fileName )
{
QStringList::ConstIterator sit = filters.begin();
while ( sit != filters.end() ) {
-#if defined(Q_FS_FAT) && !defined(Q_OS_UNIX)
- QRegExp rx( *sit, FALSE, TRUE ); // The FAT FS is not case sensitive..
-#else
- QRegExp rx( *sit, TRUE, TRUE ); // ..while others are.
-#endif
+ QRegExp rx( *sit, CaseSensitiveFS, TRUE );
if ( rx.exactMatch(fileName) )
return TRUE;
++sit;
}
return FALSE;
}
/*!
Returns TRUE if the \a fileName matches the wildcard (glob)
pattern \a filter; otherwise returns FALSE. The \a filter may
contain multiple patterns separated by spaces or semicolons.
(See \link qregexp.html#wildcard-matching QRegExp wildcard
matching.\endlink)
\sa QRegExp::match()
*/
bool QDir::match( const QString &filter, const QString &fileName )
{
- QStringList lst = qt_makeFilterList( filter );
- return match( lst, fileName );
+ return qt_matchFilterList( qt_makeFilterList(filter), fileName );
}
/*!
Removes all multiple directory separators "/" and resolves any
"."s or ".."s found in the path, \a filePath.
Symbolic links are kept. This function does not return the
canonical path, but rather the simplest version of the input.
For example, "./local" becomes "local", "local/../bin" becomes
"bin" and "/local/usr/../bin" becomes "/local/bin".
\sa absPath() canonicalPath()
*/
QString QDir::cleanDirPath( const QString &filePath )
{
QString name = filePath;
QString newPath;
if ( name.isEmpty() )
return name;
slashify( name );
diff --git a/qmake/tools/qdir_unix.cpp b/qmake/tools/qdir_unix.cpp
index 57fe3c5..6a7adda 100644
--- a/qmake/tools/qdir_unix.cpp
+++ b/qmake/tools/qdir_unix.cpp
@@ -1,122 +1,123 @@
/****************************************************************************
** $Id$
**
** Implementation of QDir class
**
** Created : 950628
**
-** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2003 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses for Unix/X11 or for Qt/Embedded may use this file in accordance
** with the Qt Commercial License Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "qplatformdefs.h"
#include "qdir.h"
#ifndef QT_NO_DIR
#include "qdir_p.h"
#include "qfileinfo.h"
#include "qregexp.h"
#include "qstringlist.h"
#ifdef QT_THREAD_SUPPORT
# include <private/qmutexpool_p.h>
#endif // QT_THREAD_SUPPORT
#include <stdlib.h>
#include <limits.h>
+#include <errno.h>
void QDir::slashify( QString& )
{
}
QString QDir::homeDirPath()
{
QString d;
d = QFile::decodeName(getenv("HOME"));
slashify( d );
if ( d.isNull() )
d = rootDirPath();
return d;
}
QString QDir::canonicalPath() const
{
QString r;
-
char cur[PATH_MAX+1];
- if ( ::getcwd( cur, PATH_MAX ) )
- if ( ::chdir(QFile::encodeName(dPath)) >= 0 ) {
- char tmp[PATH_MAX+1];
- if ( ::getcwd( tmp, PATH_MAX ) )
- r = QFile::decodeName(tmp);
- ::chdir( cur );
- }
-
- slashify( r );
+ if ( ::getcwd( cur, PATH_MAX ) ) {
+ char tmp[PATH_MAX+1];
+ if( ::realpath( QFile::encodeName( dPath ), tmp ) )
+ r = QFile::decodeName( tmp );
+ slashify( r );
+
+ // always make sure we go back to the current dir
+ ::chdir( cur );
+ }
return r;
}
bool QDir::mkdir( const QString &dirName, bool acceptAbsPath ) const
{
#if defined(Q_OS_MACX) // Mac X doesn't support trailing /'s
QString name = dirName;
if (dirName[dirName.length() - 1] == "/")
name = dirName.left( dirName.length() - 1 );
- return ::mkdir( QFile::encodeName(filePath(name,acceptAbsPath)), 0777 )
- == 0;
+ int status =
+ ::mkdir( QFile::encodeName(filePath(name,acceptAbsPath)), 0777 );
#else
- return ::mkdir( QFile::encodeName(filePath(dirName,acceptAbsPath)), 0777 )
- == 0;
+ int status =
+ ::mkdir( QFile::encodeName(filePath(dirName,acceptAbsPath)), 0777 );
#endif
+ return status == 0;
}
bool QDir::rmdir( const QString &dirName, bool acceptAbsPath ) const
{
return ::rmdir( QFile::encodeName(filePath(dirName,acceptAbsPath)) ) == 0;
}
bool QDir::isReadable() const
{
return ::access( QFile::encodeName(dPath), R_OK | X_OK ) == 0;
}
bool QDir::isRoot() const
{
return dPath == QString::fromLatin1("/");
}
bool QDir::rename( const QString &name, const QString &newName,
bool acceptAbsPaths )
{
if ( name.isEmpty() || newName.isEmpty() ) {
#if defined(QT_CHECK_NULL)
qWarning( "QDir::rename: Empty or null file name(s)" );
#endif
@@ -165,76 +166,80 @@ QString QDir::rootDirPath()
bool QDir::isRelativePath( const QString &path )
{
int len = path.length();
if ( len == 0 )
return TRUE;
return path[0] != '/';
}
bool QDir::readDirEntries( const QString &nameFilter,
int filterSpec, int sortSpec )
{
int i;
if ( !fList ) {
fList = new QStringList;
Q_CHECK_PTR( fList );
fiList = new QFileInfoList;
Q_CHECK_PTR( fiList );
fiList->setAutoDelete( TRUE );
} else {
fList->clear();
fiList->clear();
}
- QStringList filters = qt_makeFilterList( nameFilter );
+ QValueList<QRegExp> filters = qt_makeFilterList( nameFilter );
bool doDirs = (filterSpec & Dirs) != 0;
bool doFiles = (filterSpec & Files) != 0;
bool noSymLinks = (filterSpec & NoSymLinks) != 0;
bool doReadable = (filterSpec & Readable) != 0;
bool doWritable = (filterSpec & Writable) != 0;
bool doExecable = (filterSpec & Executable) != 0;
bool doHidden = (filterSpec & Hidden) != 0;
bool doSystem = (filterSpec & System) != 0;
-#if defined(Q_OS_OS2EMX)
- //QRegExp wc( nameFilter, FALSE, TRUE ); // wild card, case insensitive
-#else
- //QRegExp wc( nameFilter, TRUE, TRUE ); // wild card, case sensitive
-#endif
QFileInfo fi;
DIR *dir;
dirent *file;
dir = opendir( QFile::encodeName(dPath) );
if ( !dir )
return FALSE; // cannot read the directory
- while ( (file = readdir(dir)) ) {
+#if defined(QT_THREAD_SUPPORT) && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && !defined(Q_OS_CYGWIN)
+ union {
+ struct dirent mt_file;
+ char b[sizeof(struct dirent) + MAXNAMLEN + 1];
+ } u;
+ while ( readdir_r(dir, &u.mt_file, &file ) == 0 && file )
+#else
+ while ( (file = readdir(dir)) )
+#endif // QT_THREAD_SUPPORT && _POSIX_THREAD_SAFE_FUNCTIONS
+ {
QString fn = QFile::decodeName(file->d_name);
fi.setFile( *this, fn );
- if ( !match( filters, fn ) && !(allDirs && fi.isDir()) )
+ if ( !qt_matchFilterList(filters, fn) && !(allDirs && fi.isDir()) )
continue;
if ( (doDirs && fi.isDir()) || (doFiles && fi.isFile()) ||
(doSystem && (!fi.isFile() && !fi.isDir())) ) {
if ( noSymLinks && fi.isSymLink() )
continue;
if ( (filterSpec & RWEMask) != 0 )
if ( (doReadable && !fi.isReadable()) ||
(doWritable && !fi.isWritable()) ||
(doExecable && !fi.isExecutable()) )
continue;
if ( !doHidden && fn[0] == '.' &&
fn != QString::fromLatin1(".")
&& fn != QString::fromLatin1("..") )
continue;
fiList->append( new QFileInfo( fi ) );
}
}
if ( closedir(dir) != 0 ) {
#if defined(QT_CHECK_NULL)
qWarning( "QDir::readDirEntries: Cannot close the directory: %s",
dPath.local8Bit().data() );
#endif
}
@@ -255,37 +260,38 @@ bool QDir::readDirEntries( const QString &nameFilter,
fiList->append( si[j].item );
fList->append( si[j].item->fileName() );
}
delete [] si;
fiList->setAutoDelete( TRUE );
}
if ( filterSpec == (FilterSpec)filtS && sortSpec == (SortSpec)sortS &&
nameFilter == nameFilt )
dirty = FALSE;
else
dirty = TRUE;
return TRUE;
}
const QFileInfoList * QDir::drives()
{
// at most one instance of QFileInfoList is leaked, and this variable
// points to that list
static QFileInfoList * knownMemoryLeak = 0;
if ( !knownMemoryLeak ) {
#ifdef QT_THREAD_SUPPORT
- QMutexLocker locker( qt_global_mutexpool->get( &knownMemoryLeak ) );
+ QMutexLocker locker( qt_global_mutexpool ?
+ qt_global_mutexpool->get( &knownMemoryLeak ) : 0 );
#endif // QT_THREAD_SUPPORT
if ( !knownMemoryLeak ) {
knownMemoryLeak = new QFileInfoList;
// non-win32 versions both use just one root directory
knownMemoryLeak->append( new QFileInfo( rootDirPath() ) );
}
}
return knownMemoryLeak;
}
#endif //QT_NO_DIR
diff --git a/qmake/tools/qfile.cpp b/qmake/tools/qfile.cpp
index a578b49..c088b55 100644
--- a/qmake/tools/qfile.cpp
+++ b/qmake/tools/qfile.cpp
@@ -67,49 +67,49 @@ extern bool qt_file_access( const QString& fn, int t );
The file name is usually passed in the constructor but can be
changed with setName(). You can check for a file's existence with
exists() and remove a file with remove().
The file is opened with open(), closed with close() and flushed
with flush(). Data is usually read and written using QDataStream
or QTextStream, but you can read with readBlock() and readLine()
and write with writeBlock(). QFile also supports getch(),
ungetch() and putch().
The size of the file is returned by size(). You can get the
current file position or move to a new file position using the
at() functions. If you've reached the end of the file, atEnd()
returns TRUE. The file handle is returned by handle().
Here is a code fragment that uses QTextStream to read a text file
line by line. It prints each line with a line number.
\code
QStringList lines;
QFile file( "file.txt" );
if ( file.open( IO_ReadOnly ) ) {
QTextStream stream( &file );
QString line;
int i = 1;
- while ( !stream.eof() ) {
+ while ( !stream.atEnd() ) {
line = stream.readLine(); // line of text excluding '\n'
printf( "%3d: %s\n", i++, line.latin1() );
lines += line;
}
file.close();
}
\endcode
Writing text is just as easy. The following example shows how to
write the data we read into the string list from the previous
example:
\code
QFile file( "file.txt" );
if ( file.open( IO_WriteOnly ) ) {
QTextStream stream( &file );
for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it )
stream << *it << "\n";
file.close();
}
\endcode
The QFileInfo class holds detailed information about a file, such
as access permissions, file dates and file types.
@@ -269,48 +269,49 @@ bool QFile::remove()
# define OPEN_ASYNC O_NONBLOCK
#elif defined(O_NDELAY)
# define HAS_ASYNC_FILEMODE
# define OPEN_ASYNC O_NDELAY
#endif
/*!
Flushes the file buffer to the disk.
close() also flushes the file buffer.
*/
void QFile::flush()
{
if ( isOpen() && fh ) // can only flush open/buffered
fflush( fh ); // file
}
/*! \reimp
\fn QIODevice::Offset QFile::at() const
*/
/*!
Returns TRUE if the end of file has been reached; otherwise returns FALSE.
+ If QFile has not been open()'d, then the behavior is undefined.
\sa size()
*/
bool QFile::atEnd() const
{
if ( !isOpen() ) {
#if defined(QT_CHECK_STATE)
qWarning( "QFile::atEnd: File is not open" );
#endif
return FALSE;
}
if ( isDirectAccess() && !isTranslated() ) {
if ( at() < length )
return FALSE;
}
return QIODevice::atEnd();
}
/*!
Reads a line of text.
Reads bytes from the file into the char* \a p, until end-of-line
or \a maxlen bytes have been read, whichever occurs first. Returns
diff --git a/qmake/tools/qfile_unix.cpp b/qmake/tools/qfile_unix.cpp
index 2d5a856..460bf06 100644
--- a/qmake/tools/qfile_unix.cpp
+++ b/qmake/tools/qfile_unix.cpp
@@ -414,53 +414,56 @@ bool QFile::open( int m, int f )
if ( length == 0 && isReadable() ) {
// try if you can read from it (if you can, it's a sequential
// device; e.g. a file in the /proc filesystem)
int c = getch();
if ( c != -1 ) {
ungetch(c);
setType( IO_Sequential );
length = INT_MAX;
ioIndex = 0;
}
resetStatus();
}
}
return TRUE;
}
/*!
Returns the file size.
\sa at()
*/
QIODevice::Offset QFile::size() const
{
struct stat st;
+ int ret = 0;
if ( isOpen() ) {
- ::fstat( fh ? fileno(fh) : fd, &st );
+ ret = ::fstat( fh ? fileno(fh) : fd, &st );
} else {
- ::stat( QFile::encodeName(fn), &st );
+ ret = ::stat( QFile::encodeName(fn), &st );
}
+ if ( ret == -1 )
+ return 0;
#if defined(QT_LARGEFILE_SUPPORT) && !defined(QT_ABI_64BITOFFSET)
return (uint)st.st_size > UINT_MAX ? UINT_MAX : (QIODevice::Offset)st.st_size;
#else
return st.st_size;
#endif
}
/*!
\overload
Sets the file index to \a pos. Returns TRUE if successful;
otherwise returns FALSE.
Example:
\code
QFile f( "data.bin" );
f.open( IO_ReadOnly ); // index set to 0
f.at( 100 ); // set index to 100
f.at( f.at()+50 ); // set index to 150
f.at( f.size()-80 ); // set index to 80 before EOF
f.close();
\endcode
@@ -517,49 +520,49 @@ bool QFile::at( Offset pos )
readBlock() solved this problem.
*/
Q_LONG QFile::readBlock( char *p, Q_ULONG len )
{
#if defined(QT_CHECK_NULL)
if ( !p )
qWarning( "QFile::readBlock: Null pointer error" );
#endif
#if defined(QT_CHECK_STATE)
if ( !isOpen() ) {
qWarning( "QFile::readBlock: File not open" );
return -1;
}
if ( !isReadable() ) {
qWarning( "QFile::readBlock: Read operation not permitted" );
return -1;
}
#endif
Q_ULONG nread = 0; // number of bytes read
if ( !ungetchBuffer.isEmpty() ) {
// need to add these to the returned string.
uint l = ungetchBuffer.length();
while( nread < l ) {
- *p = ungetchBuffer[ l - nread - 1 ];
+ *p = ungetchBuffer.at( l - nread - 1 );
p++;
nread++;
}
ungetchBuffer.truncate( l - nread );
}
if ( nread < len ) {
if ( isRaw() ) { // raw file
nread += ::read( fd, p, len-nread );
if ( len && nread <= 0 ) {
nread = 0;
setStatus(IO_ReadError);
}
} else { // buffered file
nread += fread( p, 1, len-nread, fh );
if ( (uint)nread != len ) {
if ( ferror( fh ) || nread==0 )
setStatus(IO_ReadError);
}
}
}
if ( !isSequentialAccess() )
ioIndex += nread;
return nread;
@@ -608,49 +611,51 @@ Q_LONG QFile::writeBlock( const char *p, Q_ULONG len )
setStatus( IO_WriteError );
if ( !isSequentialAccess() ) {
if ( isRaw() ) // recalc file position
ioIndex = (Offset)::lseek( fd, 0, SEEK_CUR );
else
#if defined(QT_LARGEFILE_SUPPORT)
ioIndex = (Offset)::fseeko( fh, 0, SEEK_CUR );
#else
ioIndex = (Offset)::fseek( fh, 0, SEEK_CUR );
#endif
}
} else {
if ( !isSequentialAccess() )
ioIndex += nwritten;
}
if ( ioIndex > length ) // update file length
length = ioIndex;
return nwritten;
}
/*!
Returns the file handle of the file.
This is a small positive integer, suitable for use with C library
- functions such as fdopen() and fcntl(), as well as with QSocketNotifier.
+ functions such as fdopen() and fcntl(). On systems that use file
+ descriptors for sockets (ie. Unix systems, but not Windows) the handle
+ can be used with QSocketNotifier as well.
If the file is not open or there is an error, handle() returns -1.
\sa QSocketNotifier
*/
int QFile::handle() const
{
if ( !isOpen() )
return -1;
else if ( fh )
return fileno( fh );
else
return fd;
}
/*!
Closes an open file.
The file is not closed if it was opened with an existing file handle.
If the existing file handle is a \c FILE*, the file is flushed.
If the existing file handle is an \c int file descriptor, nothing
is done to the file.
diff --git a/qmake/tools/qfileinfo.cpp b/qmake/tools/qfileinfo.cpp
index 3af7932..a78f4fa 100644
--- a/qmake/tools/qfileinfo.cpp
+++ b/qmake/tools/qfileinfo.cpp
@@ -614,46 +614,48 @@ QDateTime QFileInfo::lastRead() const
if ( !fic || !cache )
doStat();
if ( fic && fic->st.st_atime != 0 ) {
dt.setTime_t( fic->st.st_atime );
return dt;
} else {
return lastModified();
}
}
#ifndef QT_NO_DIR
/*!
Returns the absolute path including the file name.
The absolute path name consists of the full path and the file
name. On Unix this will always begin with the root, '/',
directory. On Windows this will always begin 'D:/' where D is a
drive letter, except for network shares that are not mapped to a
drive letter, in which case the path will begin '//sharename/'.
This function returns the same as filePath(), unless isRelative()
is TRUE.
+ If the QFileInfo is empty it returns QDir::currentDirPath().
+
This function can be time consuming under Unix (in the order of
milliseconds).
\sa isRelative(), filePath()
*/
QString QFileInfo::absFilePath() const
{
QString tmp;
if ( QDir::isRelativePath(fn)
-#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
+#if defined(Q_OS_WIN32)
&& fn[1] != ':'
#endif
) {
tmp = QDir::currentDirPath();
tmp += '/';
}
tmp += fn;
makeAbs( tmp );
return QDir::cleanDirPath( tmp );
}
#endif
diff --git a/qmake/tools/qfileinfo_unix.cpp b/qmake/tools/qfileinfo_unix.cpp
index f7c3a97..364f219 100644
--- a/qmake/tools/qfileinfo_unix.cpp
+++ b/qmake/tools/qfileinfo_unix.cpp
@@ -193,51 +193,51 @@ QString QFileInfo::group() const
*/
uint QFileInfo::groupId() const
{
if ( !fic || !cache )
doStat();
if ( fic )
return fic->st.st_gid;
return nobodyID;
}
/*!
Tests for file permissions. The \a permissionSpec argument can be
several flags of type \c PermissionSpec OR-ed together to check
for permission combinations.
On systems where files do not have permissions this function
always returns TRUE.
Example:
\code
QFileInfo fi( "/tmp/archive.tar.gz" );
if ( fi.permission( QFileInfo::WriteUser | QFileInfo::ReadGroup ) )
- qWarning( "I can change the file; my group can read the file.");
+ qWarning( "I can change the file; my group can read the file" );
if ( fi.permission( QFileInfo::WriteGroup | QFileInfo::WriteOther ) )
- qWarning( "The group or others can change the file!" );
+ qWarning( "The group or others can change the file" );
\endcode
\sa isReadable(), isWritable(), isExecutable()
*/
bool QFileInfo::permission( int permissionSpec ) const
{
if ( !fic || !cache )
doStat();
if ( fic ) {
uint mask = 0;
if ( permissionSpec & ReadUser )
mask |= S_IRUSR;
if ( permissionSpec & WriteUser )
mask |= S_IWUSR;
if ( permissionSpec & ExeUser )
mask |= S_IXUSR;
if ( permissionSpec & ReadGroup )
mask |= S_IRGRP;
if ( permissionSpec & WriteGroup )
mask |= S_IWGRP;
if ( permissionSpec & ExeGroup )
mask |= S_IXGRP;
if ( permissionSpec & ReadOther )
diff --git a/qmake/tools/qgarray.cpp b/qmake/tools/qgarray.cpp
index 45c45ce..0a522e4 100644
--- a/qmake/tools/qgarray.cpp
+++ b/qmake/tools/qgarray.cpp
@@ -14,63 +14,73 @@
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
-#include "qglobal.h" // needed to define Q_WS_WIN
-#ifdef Q_WS_WIN
-#include "qt_windows.h" // needed for bsearch on some platforms
+#include "qglobal.h"
+#if defined(Q_CC_BOR)
+ // needed for qsort() because of a std namespace problem on Borland
+# include "qplatformdefs.h"
+#elif defined(Q_WS_WIN)
+ // needed for bsearch on some platforms
+# include "qt_windows.h"
#endif
#define QGARRAY_CPP
#include "qgarray.h"
#include <stdlib.h>
#include <string.h>
#ifdef QT_THREAD_SUPPORT
# include <private/qmutexpool_p.h>
#endif // QT_THREAD_SUPPORT
-#define USE_MALLOC // comment to use new/delete
+/*
+ If USE_MALLOC isn't defined, we use new[] and delete[] to allocate
+ memory. The documentation for QMemArray<T>::assign() explicitly
+ mentions that the array is freed using free(), so don't mess around
+ with USE_MALLOC unless you know what you're doing.
+*/
+#define USE_MALLOC
#undef NEW
#undef DELETE
#if defined(USE_MALLOC)
#define NEW(type,size) ((type*)malloc(size*sizeof(type)))
#define DELETE(array) (free((char*)array))
#else
#define NEW(type,size) (new type[size])
#define DELETE(array) (delete[] array)
#define DONT_USE_REALLOC // comment to use realloc()
#endif
/*!
\class QShared qshared.h
\reentrant
\ingroup shared
\brief The QShared class is used internally for implementing shared classes.
\internal
It only contains a reference count and member functions to increment and
decrement it.
@@ -114,49 +124,53 @@ QGArray::QGArray()
*/
QGArray::QGArray( int, int )
{
}
/*!
Constructs an array with room for \a size bytes.
*/
QGArray::QGArray( int size )
{
if ( size < 0 ) {
#if defined(QT_CHECK_RANGE)
qWarning( "QGArray: Cannot allocate array with negative length" );
#endif
size = 0;
}
shd = newData();
Q_CHECK_PTR( shd );
if ( size == 0 ) // zero length
return;
shd->data = NEW(char,size);
Q_CHECK_PTR( shd->data );
- shd->len = size;
+ shd->len =
+#ifdef QT_QGARRAY_SPEED_OPTIM
+ shd->maxl =
+#endif
+ size;
}
/*!
Constructs a shallow copy of \a a.
*/
QGArray::QGArray( const QGArray &a )
{
shd = a.shd;
shd->ref();
}
/*!
Dereferences the array data and deletes it if this was the last
reference.
*/
QGArray::~QGArray()
{
if ( shd && shd->deref() ) { // delete when last reference
if ( shd->data ) // is lost
DELETE(shd->data);
deleteData( shd );
shd = 0;
@@ -191,77 +205,112 @@ QGArray::~QGArray()
/*!
\fn uint QGArray::size() const
Returns the size of the array, in bytes.
*/
/*!
Returns TRUE if this array is equal to \a a, otherwise FALSE.
The comparison is bitwise, of course.
*/
bool QGArray::isEqual( const QGArray &a ) const
{
if ( size() != a.size() ) // different size
return FALSE;
if ( data() == a.data() ) // has same data
return TRUE;
return (size() ? memcmp( data(), a.data(), size() ) : 0) == 0;
}
/*!
- Resizes the array to \a newsize bytes.
+ Resizes the array to \a newsize bytes. \a optim is either
+ MemOptim (the default) or SpeedOptim.
*/
-
-bool QGArray::resize( uint newsize )
+bool QGArray::resize( uint newsize, Optimization optim )
{
- if ( newsize == shd->len ) // nothing to do
+#ifndef QT_QGARRAY_SPEED_OPTIM
+ Q_UNUSED(optim);
+#endif
+
+ if ( newsize == shd->len
+#ifdef QT_QGARRAY_SPEED_OPTIM
+ && newsize == shd->maxl
+#endif
+ ) // nothing to do
return TRUE;
if ( newsize == 0 ) { // remove array
duplicate( 0, 0 );
return TRUE;
}
+
+ uint newmaxl = newsize;
+#ifdef QT_QGARRAY_SPEED_OPTIM
+ if ( optim == SpeedOptim ) {
+ if ( newsize <= shd->maxl &&
+ ( newsize * 4 > shd->maxl || shd->maxl <= 4 ) ) {
+ shd->len = newsize;
+ return TRUE;
+ }
+ newmaxl = 4;
+ while ( newmaxl < newsize )
+ newmaxl *= 2;
+ // try to spare some memory
+ if ( newmaxl >= 1024 * 1024 && newsize <= newmaxl - (newmaxl >> 2) )
+ newmaxl -= newmaxl >> 2;
+ }
+ shd->maxl = newmaxl;
+#endif
+
if ( shd->data ) { // existing data
#if defined(DONT_USE_REALLOC)
char *newdata = NEW(char,newsize); // manual realloc
- memcpy( newdata, shd->data, QMIN(shd->len,newsize) );
+ memcpy( newdata, shd->data, QMIN(shd->len,newmaxl) );
DELETE(shd->data);
shd->data = newdata;
#else
- shd->data = (char *)realloc( shd->data, newsize );
+ shd->data = (char *)realloc( shd->data, newmaxl );
#endif
} else {
- shd->data = NEW(char,newsize);
+ shd->data = NEW(char,newmaxl);
}
if ( !shd->data ) // no memory
return FALSE;
shd->len = newsize;
return TRUE;
}
+/*!\overload
+*/
+bool QGArray::resize( uint newsize )
+{
+ return resize( newsize, MemOptim );
+}
+
+
/*!
Fills the array with the repeated occurrences of \a d, which is
\a sz bytes long.
If \a len is specified as different from -1, then the array will be
resized to \a len*sz before it is filled.
Returns TRUE if successful, or FALSE if the memory cannot be allocated
(only when \a len != -1).
\sa resize()
*/
bool QGArray::fill( const char *d, int len, uint sz )
{
if ( len < 0 )
len = shd->len/sz; // default: use array length
else if ( !resize( len*sz ) )
return FALSE;
if ( sz == 1 ) // 8 bit elements
memset( data(), *d, len );
else if ( sz == 4 ) { // 32 bit elements
register Q_INT32 *x = (Q_INT32*)data();
Q_INT32 v = *((Q_INT32*)d);
while ( len-- )
@@ -298,132 +347,144 @@ QGArray &QGArray::assign( const QGArray &a )
}
shd = a.shd;
return *this;
}
/*!
Shallow copy. Dereference the current array and references the
array data \a d, which contains \a len bytes.
Returns a reference to this array.
Do not delete \a d later, because QGArray takes care of that.
*/
QGArray &QGArray::assign( const char *d, uint len )
{
if ( shd->count > 1 ) { // disconnect this
shd->count--;
shd = newData();
Q_CHECK_PTR( shd );
} else {
if ( shd->data )
DELETE(shd->data);
}
shd->data = (char *)d;
- shd->len = len;
+ shd->len =
+#ifdef QT_QGARRAY_SPEED_OPTIM
+ shd->maxl =
+#endif
+ len;
return *this;
}
/*!
Deep copy. Dereference the current array and obtains a copy of the data
contained in \a a instead. Returns a reference to this array.
\sa assign(), operator=()
*/
QGArray &QGArray::duplicate( const QGArray &a )
{
if ( a.shd == shd ) { // a.duplicate(a) !
if ( shd->count > 1 ) {
shd->count--;
register array_data *n = newData();
Q_CHECK_PTR( n );
if ( (n->len=shd->len) ) {
n->data = NEW(char,n->len);
Q_CHECK_PTR( n->data );
if ( n->data )
memcpy( n->data, shd->data, n->len );
} else {
n->data = 0;
}
shd = n;
}
return *this;
}
char *oldptr = 0;
if ( shd->count > 1 ) { // disconnect this
shd->count--;
shd = newData();
Q_CHECK_PTR( shd );
} else { // delete after copy was made
oldptr = shd->data;
}
if ( a.shd->len ) { // duplicate data
shd->data = NEW(char,a.shd->len);
Q_CHECK_PTR( shd->data );
if ( shd->data )
memcpy( shd->data, a.shd->data, a.shd->len );
} else {
shd->data = 0;
}
- shd->len = a.shd->len;
+ shd->len =
+#ifdef QT_QGARRAY_SPEED_OPTIM
+ shd->maxl =
+#endif
+ a.shd->len;
if ( oldptr )
DELETE(oldptr);
return *this;
}
/*!
\overload
Deep copy. Dereferences the current array and obtains a copy of
\a len characters from array data \a d instead. Returns a reference
to this array.
\sa assign(), operator=()
*/
QGArray &QGArray::duplicate( const char *d, uint len )
{
char *data;
if ( d == 0 || len == 0 ) {
data = 0;
len = 0;
} else {
if ( shd->count == 1 && shd->len == len ) {
memcpy( shd->data, d, len ); // use same buffer
return *this;
}
data = NEW(char,len);
Q_CHECK_PTR( data );
memcpy( data, d, len );
}
if ( shd->count > 1 ) { // detach
shd->count--;
shd = newData();
Q_CHECK_PTR( shd );
} else { // just a single reference
if ( shd->data )
DELETE(shd->data);
}
shd->data = data;
- shd->len = len;
+ shd->len =
+#ifdef QT_QGARRAY_SPEED_OPTIM
+ shd->maxl =
+#endif
+ len;
return *this;
}
/*!
Resizes this array to \a len bytes and copies the \a len bytes at
address \a d into it.
\warning This function disregards the reference count mechanism. If
other QGArrays reference the same data as this, all will be updated.
*/
void QGArray::store( const char *d, uint len )
{ // store, but not deref
resize( len );
memcpy( shd->data, d, len );
}
/*!
\fn array_data *QGArray::sharedBlock() const
Returns a pointer to the shared array block.
\warning
@@ -638,67 +699,69 @@ static int __cdecl cmp_arr( const void *n1, const void *n2 )
#else
static int cmp_arr( const void *n1, const void *n2 )
#endif
{
return ( n1 && n2 ) ? memcmp( n1, n2, cmp_item_size )
: ( n1 ? 1 : ( n2 ? -1 : 0 ) );
// ### Qt 3.0: Add a virtual compareItems() method and call that instead
}
#if defined(Q_C_CALLBACKS)
}
#endif
/*!
Sorts the first \a sz items of the array.
*/
void QGArray::sort( uint sz )
{
int numItems = size() / sz;
if ( numItems < 2 )
return;
#ifdef QT_THREAD_SUPPORT
- QMutexLocker locker( qt_global_mutexpool->get( &cmp_item_size ) );
+ QMutexLocker locker( qt_global_mutexpool ?
+ qt_global_mutexpool->get( &cmp_item_size ) : 0 );
#endif // QT_THREAD_SUPPORT
cmp_item_size = sz;
qsort( shd->data, numItems, sz, cmp_arr );
}
/*!
Binary search; assumes that \a d is a sorted array of size \a sz.
*/
int QGArray::bsearch( const char *d, uint sz ) const
{
int numItems = size() / sz;
if ( !numItems )
return -1;
#ifdef QT_THREAD_SUPPORT
- QMutexLocker locker( qt_global_mutexpool->get( &cmp_item_size ) );
+ QMutexLocker locker( qt_global_mutexpool ?
+ qt_global_mutexpool->get( &cmp_item_size ) : 0 );
#endif // QT_THREAD_SUPPORT
cmp_item_size = sz;
char* r = (char*)::bsearch( d, shd->data, numItems, sz, cmp_arr );
if ( !r )
return -1;
while( (r >= shd->data + sz) && (cmp_arr( r - sz, d ) == 0) )
r -= sz; // search to first of equal elements; bsearch is undef
return (int)(( r - shd->data ) / sz);
}
/*!
\fn char *QGArray::at( uint index ) const
Returns a pointer to the byte at offset \a index in the array.
*/
/*!
Expand the array if necessary, and copies (the first part of) its
contents from the \a index * \a sz bytes at \a d.
Returns TRUE if the operation succeeds, FALSE if it runs out of
memory.
diff --git a/qmake/tools/qgdict.cpp b/qmake/tools/qgdict.cpp
index c431ff8..3d49fc7 100644
--- a/qmake/tools/qgdict.cpp
+++ b/qmake/tools/qgdict.cpp
@@ -183,49 +183,52 @@ QDataStream& QGDict::write( QDataStream &s, QPtrCollection::Item ) const
}
#endif //QT_NO_DATASTREAM
/*****************************************************************************
QGDict member functions
*****************************************************************************/
/*!
Constructs a dictionary.
\a len is the initial size of the dictionary.
The key type is \a kt which may be \c StringKey, \c AsciiKey,
\c IntKey or \c PtrKey. The case-sensitivity of lookups is set with
\a caseSensitive. Keys are copied if \a copyKeys is TRUE.
*/
QGDict::QGDict( uint len, KeyType kt, bool caseSensitive, bool copyKeys )
{
init( len, kt, caseSensitive, copyKeys );
}
void QGDict::init( uint len, KeyType kt, bool caseSensitive, bool copyKeys )
{
- vec = new QBaseBucket *[vlen = len]; // allocate hash table
+ vlen = len;
+ if ( vlen == 0 )
+ vlen = 17;
+ vec = new QBaseBucket *[vlen];
Q_CHECK_PTR( vec );
memset( (char*)vec, 0, vlen*sizeof(QBaseBucket*) );
numItems = 0;
iterators = 0;
// The caseSensitive and copyKey options don't make sense for
// all dict types.
switch ( (keytype = (uint)kt) ) {
case StringKey:
cases = caseSensitive;
copyk = FALSE;
break;
case AsciiKey:
cases = caseSensitive;
copyk = copyKeys;
break;
default:
cases = FALSE;
copyk = FALSE;
break;
}
}
/*!
diff --git a/qmake/tools/qglist.cpp b/qmake/tools/qglist.cpp
index 155d585..bd27f8a 100644
--- a/qmake/tools/qglist.cpp
+++ b/qmake/tools/qglist.cpp
@@ -308,54 +308,50 @@ bool QGList::operator==( const QGList &list ) const
/*!
\fn uint QGList::count() const
Returns the number of items in the list.
*/
/*!
Returns the node at position \a index. Sets this node to current.
*/
QLNode *QGList::locate( uint index )
{
if ( index == (uint)curIndex ) // current node ?
return curNode;
if ( !curNode && firstNode ) { // set current node
curNode = firstNode;
curIndex = 0;
}
register QLNode *node;
int distance = index - curIndex; // node distance to cur node
bool forward; // direction to traverse
- if ( index >= numNodes ) {
-#if defined(QT_CHECK_RANGE)
- qWarning( "QGList::locate: Index %d out of range", index );
-#endif
+ if ( index >= numNodes )
return 0;
- }
if ( distance < 0 )
distance = -distance;
if ( (uint)distance < index && (uint)distance < numNodes - index ) {
node = curNode; // start from current node
forward = index > (uint)curIndex;
} else if ( index < numNodes - index ) { // start from first node
node = firstNode;
distance = index;
forward = TRUE;
} else { // start from last node
node = lastNode;
distance = numNodes - index - 1;
if ( distance < 0 )
distance = 0;
forward = FALSE;
}
if ( forward ) { // now run through nodes
while ( distance-- )
node = node->next;
} else {
while ( distance-- )
node = node->prev;
}
diff --git a/qmake/tools/qglobal.cpp b/qmake/tools/qglobal.cpp
index 47cd6bd..342005d 100644
--- a/qmake/tools/qglobal.cpp
+++ b/qmake/tools/qglobal.cpp
@@ -128,49 +128,70 @@ bool qSysInfo( int *wordSize, bool *bigEndian )
unsigned char *p = (unsigned char *)(&ns); // 16-bit integer
be16 = *p == 0x12;
p = (unsigned char *)(&nl); // 32-bit integer
if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 )
be32 = TRUE;
else
if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 )
be32 = FALSE;
else
be32 = !be16;
if ( be16 != be32 ) { // strange machine!
#if defined(QT_CHECK_RANGE)
qFatal( "qSysInfo: Inconsistent system byte order" );
#endif
return FALSE;
}
*bigEndian = si_bigEndian = be32;
si_alreadyDone = TRUE;
return TRUE;
}
-#if defined(Q_OS_WIN32) || defined(Q_OS_CYGWIN)
+#if !defined(QWS) && defined(Q_OS_MAC)
+
+#include "qt_mac.h"
+
+int qMacVersion()
+{
+ static int macver = Qt::MV_Unknown;
+ static bool first = TRUE;
+ if(first) {
+ first = FALSE;
+ long gestalt_version;
+ if(Gestalt(gestaltSystemVersion, &gestalt_version) == noErr) {
+ if(gestalt_version >= 0x1020 && gestalt_version < 0x1030)
+ macver = Qt::MV_10_DOT_2;
+ else if(gestalt_version >= 0x1010 && gestalt_version < 0x1020)
+ macver = Qt::MV_10_DOT_1;
+ }
+ }
+ return macver;
+}
+Qt::MacintoshVersion qt_macver = (Qt::MacintoshVersion)qMacVersion();
+#elif defined(Q_OS_WIN32) || defined(Q_OS_CYGWIN)
bool qt_winunicode;
#include "qt_windows.h"
int qWinVersion()
{
#ifndef VER_PLATFORM_WIN32s
#define VER_PLATFORM_WIN32s 0
#endif
#ifndef VER_PLATFORM_WIN32_WINDOWS
#define VER_PLATFORM_WIN32_WINDOWS 1
#endif
#ifndef VER_PLATFORM_WIN32_NT
#define VER_PLATFORM_WIN32_NT 2
#endif
static int winver = Qt::WV_NT;
static int t=0;
if ( !t ) {
t=1;
#ifdef Q_OS_TEMP
OSVERSIONINFOW osver;
osver.dwOSVersionInfoSize = sizeof(osver);
GetVersionEx( &osver );
@@ -300,65 +321,77 @@ Qt::WindowsVersion qt_winver = (Qt::WindowsVersion)qWinVersion();
qFatal( "divide: cannot divide by zero" );
return a/b;
}
\endcode
Under X11, the text is printed to stderr. Under Windows, the text
is sent to the debugger.
\warning The internal buffer is limited to 8196 bytes (including
the '\0'-terminator).
\warning Passing (const char *)0 as argument to qFatal might lead
to crashes on certain platforms due to the platforms printf implementation.
\sa qDebug(), qWarning(), qInstallMsgHandler(),
\link debug.html Debugging\endlink
*/
static QtMsgHandler handler = 0; // pointer to debug handler
static const int QT_BUFFER_LENGTH = 8196; // internal buffer length
#ifdef Q_OS_MAC
-const unsigned char * p_str(const char * c, int len=-1)
+QString cfstring2qstring(CFStringRef str)
+{
+ CFIndex length = CFStringGetLength(str);
+ if(const UniChar *chars = CFStringGetCharactersPtr(str))
+ return QString((QChar *)chars, length);
+ UniChar *buffer = (UniChar*)malloc(length * sizeof(UniChar));
+ CFStringGetCharacters(str, CFRangeMake(0, length), buffer);
+ QString ret((QChar *)buffer, length);
+ free(buffer);
+ return ret;
+}
+
+unsigned char * p_str(const char * c, int len=-1)
{
const int maxlen = 255;
if(len == -1)
len = qstrlen(c);
if(len > maxlen) {
qWarning( "p_str len must never exceed %d", maxlen );
len = maxlen;
}
unsigned char *ret = (unsigned char*)malloc(len+2);
*ret=len;
memcpy(((char *)ret)+1,c,len);
*(ret+len+1) = '\0';
return ret;
}
-const unsigned char * p_str(const QString &s)
+unsigned char * p_str(const QString &s)
{
return p_str(s, s.length());
}
QCString p2qstring(const unsigned char *c) {
char *arr = (char *)malloc(c[0] + 1);
memcpy(arr, c+1, c[0]);
arr[c[0]] = '\0';
QCString ret = arr;
delete arr;
return ret;
}
#endif
#ifdef Q_CC_MWERKS
#include "qt_mac.h"
extern bool qt_is_gui_used;
static void mac_default_handler( const char *msg )
{
if ( qt_is_gui_used ) {
const char *p = p_str(msg);
@@ -620,60 +653,60 @@ void qSystemWarning( const char* msg, int code )
#include <qglobal.h>
int divide( int a, int b )
{
Q_ASSERT( b != 0 ); // this is line 9
return a/b;
}
\endcode
If \c b is zero, the Q_ASSERT statement will output the following
message using the qWarning() function:
\code
ASSERT: "b == 0" in div.cpp (9)
\endcode
\sa qWarning(), \link debug.html Debugging\endlink
*/
/*!
\fn void Q_CHECK_PTR( void *p )
\relates QApplication
- If \a p is null, a fatal messages says that the program ran out of
- memory and exits. If \e p is not null, nothing happens.
+ If \a p is 0, a fatal messages says that the program ran out of
+ memory and exits. If \e p is not 0, nothing happens.
This is really a macro defined in \c qglobal.h.
Example:
\code
int *a;
Q_CHECK_PTR( a = new int[80] ); // WRONG!
- a = new int[80]; // Right
+ a = new (nothrow) int[80]; // Right
Q_CHECK_PTR( a );
\endcode
\sa qFatal(), \link debug.html Debugging\endlink
*/
//
// The Q_CHECK_PTR macro calls this function to check if an allocation went ok.
//
#if (QT_VERSION-0 >= 0x040000)
#if defined(Q_CC_GNU)
#warning "Change Q_CHECK_PTR to '{if ((p)==0) qt_check_pointer(__FILE__,__LINE__);}'"
#warning "No need for qt_check_pointer() to return a value - make it void!"
#endif
#endif
bool qt_check_pointer( bool c, const char *n, int l )
{
if ( c )
qWarning( "In file %s, line %d: Out of memory", n, l );
return TRUE;
}
diff --git a/qmake/tools/qgpluginmanager.cpp b/qmake/tools/qgpluginmanager.cpp
index 46c85f5..72246ac 100644
--- a/qmake/tools/qgpluginmanager.cpp
+++ b/qmake/tools/qgpluginmanager.cpp
@@ -1,30 +1,30 @@
/****************************************************************************
** $Id$
**
** Implementation of QGPluginManager class
**
-** Copyright (C) 2000-2001 Trolltech AS. All rights reserved.
+** Copyright (C) 2000-2003 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
@@ -454,49 +454,49 @@ bool QGPluginManager::addLibrary( QLibrary* lib )
QComLibrary* plugin = (QComLibrary*)lib;
bool useful = FALSE;
QUnknownInterface* iFace = 0;
plugin->queryInterface( interfaceId, &iFace );
if ( iFace ) {
QFeatureListInterface *fliFace = 0;
QComponentInformationInterface *cpiFace = 0;
iFace->queryInterface( IID_QFeatureList, (QUnknownInterface**)&fliFace );
if ( !fliFace )
plugin->queryInterface( IID_QFeatureList, (QUnknownInterface**)&fliFace );
if ( !fliFace ) {
iFace->queryInterface( IID_QComponentInformation, (QUnknownInterface**)&cpiFace );
if ( !cpiFace )
plugin->queryInterface( IID_QComponentInformation, (QUnknownInterface**)&cpiFace );
}
QStringList fl;
if ( fliFace )
// Map all found features to the library
fl = fliFace->featureList();
else if ( cpiFace )
fl << cpiFace->name();
- for ( QStringList::Iterator f = fl.begin(); f != fl.end(); f++ ) {
+ for ( QStringList::Iterator f = fl.begin(); f != fl.end(); ++f ) {
QLibrary *old = plugDict[*f];
if ( !old ) {
useful = TRUE;
plugDict.replace( *f, plugin );
} else {
// we have old *and* plugin, which one to pick?
QComLibrary* first = (QComLibrary*)old;
QComLibrary* second = (QComLibrary*)plugin;
bool takeFirst = TRUE;
if ( first->qtVersion() != QT_VERSION ) {
if ( second->qtVersion() == QT_VERSION )
takeFirst = FALSE;
else if ( second->qtVersion() < QT_VERSION &&
first->qtVersion() > QT_VERSION )
takeFirst = FALSE;
}
if ( !takeFirst ) {
useful = TRUE;
plugDict.replace( *f, plugin );
qWarning("%s: Discarding feature %s in %s!",
(const char*) QFile::encodeName( plugin->library()),
(*f).latin1(),
(const char*) QFile::encodeName( old->library() ) );
} else {
diff --git a/qmake/tools/qgvector.cpp b/qmake/tools/qgvector.cpp
index 1985f03..3c903ed 100644
--- a/qmake/tools/qgvector.cpp
+++ b/qmake/tools/qgvector.cpp
@@ -14,48 +14,54 @@
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
+#include "qglobal.h"
+#if defined(Q_CC_BOR)
+// needed for qsort() because of a std namespace problem on Borland
+#include "qplatformdefs.h"
+#endif
+
#define QGVECTOR_CPP
#include "qgvector.h"
#include "qglist.h"
#include "qstring.h"
#include "qdatastream.h"
#include <stdlib.h>
#ifdef QT_THREAD_SUPPORT
# include <private/qmutexpool_p.h>
#endif // QT_THREAD_SUPPORT
#define USE_MALLOC // comment to use new/delete
#undef NEW
#undef DELETE
#if defined(USE_MALLOC)
#define NEW(type,size) ((type*)malloc(size*sizeof(type)))
#define DELETE(array) (free((char*)array))
#else
#define NEW(type,size) (new type[size])
#define DELETE(array) (delete[] array)
#define DONT_USE_REALLOC // comment to use realloc()
#endif
@@ -372,49 +378,50 @@ static int cmp_vec( const void *n1, const void *n2 )
void QGVector::sort() // sort vector
{
if ( count() == 0 ) // no elements
return;
register Item *start = &vec[0];
register Item *end = &vec[len-1];
Item tmp;
for (;;) { // put all zero elements behind
while ( start < end && *start != 0 )
start++;
while ( end > start && *end == 0 )
end--;
if ( start < end ) {
tmp = *start;
*start = *end;
*end = tmp;
} else {
break;
}
}
#ifdef QT_THREAD_SUPPORT
- QMutexLocker locker( qt_global_mutexpool->get( &sort_vec ) );
+ QMutexLocker locker( qt_global_mutexpool ?
+ qt_global_mutexpool->get( &sort_vec ) : 0 );
#endif // QT_THREAD_SUPPORT
sort_vec = (QGVector*)this;
qsort( vec, count(), sizeof(Item), cmp_vec );
sort_vec = 0;
}
int QGVector::bsearch( Item d ) const // binary search; when sorted
{
if ( !len )
return -1;
if ( !d ) {
#if defined(QT_CHECK_NULL)
qWarning( "QGVector::bsearch: Cannot search for null object" );
#endif
return -1;
}
int n1 = 0;
int n2 = len - 1;
int mid = 0;
bool found = FALSE;
while ( n1 <= n2 ) {
int res;
mid = (n1 + n2)/2;
diff --git a/qmake/tools/qlibrary.cpp b/qmake/tools/qlibrary.cpp
index 564db30..be1d54b 100644
--- a/qmake/tools/qlibrary.cpp
+++ b/qmake/tools/qlibrary.cpp
@@ -1,32 +1,32 @@
/****************************************************************************
** $Id$
**
** Implementation of QLibrary class
**
-** Created : 2000-01-01
+** Created : 000101
**
-** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
+** Copyright (C) 2000-2003 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
@@ -50,49 +50,49 @@
# define QT_DEBUG_COMPONENT 1
# endif
#endif
#if defined(QT_DEBUG_COMPONENT)
#include <qfile.h>
#endif
#if defined(Q_WS_WIN) && !defined(QT_MAKEDLL)
#define QT_NO_LIBRARY_UNLOAD
#endif
QLibraryPrivate::QLibraryPrivate( QLibrary *lib )
: pHnd( 0 ), library( lib )
{
}
/*!
\class QLibrary qlibrary.h
\reentrant
\brief The QLibrary class provides a wrapper for handling shared libraries.
\mainclass
- \group plugins
+ \ingroup plugins
An instance of a QLibrary object can handle a single shared
library and provide access to the functionality in the library in
a platform independent way. If the library is a component server,
QLibrary provides access to the exported component and can
directly query this component for interfaces.
QLibrary ensures that the shared library is loaded and stays in
memory whilst it is in use. QLibrary can also unload the library
on destruction and release unused resources.
A typical use of QLibrary is to resolve an exported symbol in a
shared object, and to call the function that this symbol
represents. This is called "explicit linking" in contrast to
"implicit linking", which is done by the link step in the build
process when linking an executable against a library.
The following code snippet loads a library, resolves the symbol
"mysymbol", and calls the function if everything succeeded. If
something went wrong, e.g. the library file does not exist or the
symbol is not defined, the function pointer will be 0 and won't be
called. When the QLibrary object is destroyed the library will be
unloaded, making all references to memory allocated in the library
invalid.
@@ -305,39 +305,40 @@ void QLibrary::setAutoUnload( bool enabled )
Returns the filename of the shared library this QLibrary object
handles, including the platform specific file extension.
For example:
\code
QLibrary lib( "mylib" );
QString str = lib.library();
\endcode
will set \e str to "mylib.dll" on Windows, and "libmylib.so" on Linux.
*/
QString QLibrary::library() const
{
if ( libfile.isEmpty() )
return libfile;
QString filename = libfile;
#if defined(Q_WS_WIN)
if ( filename.findRev( '.' ) <= filename.findRev( '/' ) )
filename += ".dll";
#elif defined(Q_OS_MACX)
if ( filename.find( ".dylib" ) == -1 )
filename += ".dylib";
#else
- if ( filename.find( ".so" ) == -1 ) {
+ QString filter = ".so";
+ if ( filename.find(filter) == -1 ) {
const int x = filename.findRev( "/" );
if ( x != -1 ) {
QString path = filename.left( x + 1 );
QString file = filename.right( filename.length() - x - 1 );
- filename = QString( "%1lib%2.so" ).arg( path ).arg( file );
+ filename = QString( "%1lib%2.%3" ).arg( path ).arg( file ).arg( filter );
} else {
- filename = QString( "lib%1.so" ).arg( filename );
+ filename = QString( "lib%1.%2" ).arg( filename ).arg( filter );
}
}
#endif
return filename;
}
#endif //QT_NO_LIBRARY
diff --git a/qmake/tools/qlibrary_unix.cpp b/qmake/tools/qlibrary_unix.cpp
index f0fbdf6..12b9310 100644
--- a/qmake/tools/qlibrary_unix.cpp
+++ b/qmake/tools/qlibrary_unix.cpp
@@ -1,30 +1,30 @@
/****************************************************************************
** $Id$
**
** Implementation of QLibraryPrivate class
**
-** Created : 2000-01-01
+** Created : 000101
**
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
@@ -32,49 +32,66 @@
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "qplatformdefs.h"
#include "private/qlibrary_p.h"
#ifndef QT_NO_LIBRARY
#if defined(QT_AOUT_UNDERSCORE)
#include <string.h>
#endif
/*
The platform dependent implementations of
- loadLibrary
- freeLibrary
- resolveSymbol
It's not too hard to guess what the functions do.
*/
-#if defined(QT_HPUX_LD) // for HP-UX < 11.x and 32 bit
+#if defined(Q_OS_MAC)
+
+bool QLibraryPrivate::loadLibrary()
+{
+ return FALSE;
+}
+
+bool QLibraryPrivate::freeLibrary()
+{
+ return FALSE;
+}
+
+void* QLibraryPrivate::resolveSymbol( const char* )
+{
+ return 0;
+}
+
+#elif defined(QT_HPUX_LD) // for HP-UX < 11.x and 32 bit
bool QLibraryPrivate::loadLibrary()
{
if ( pHnd )
return TRUE;
QString filename = library->library();
pHnd = (void*)shl_load( filename.latin1(), BIND_DEFERRED | BIND_NONFATAL | DYNAMIC_PATH, 0 );
#if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT)
if ( !pHnd )
qWarning( "%s: failed to load library!", filename.latin1() );
#endif
return pHnd != 0;
}
bool QLibraryPrivate::freeLibrary()
{
if ( !pHnd )
return TRUE;
if ( shl_unload( (shl_t)pHnd ) ) {
#if defined(QT_DEBUG) || defined(QT_DEBUG_COMPONENT)
QString filename = library->library();
diff --git a/qmake/tools/qmutex_unix.cpp b/qmake/tools/qmutex_unix.cpp
index c861b2d..3eb59cf 100644
--- a/qmake/tools/qmutex_unix.cpp
+++ b/qmake/tools/qmutex_unix.cpp
@@ -22,50 +22,51 @@
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#if defined(QT_THREAD_SUPPORT)
#include "qplatformdefs.h"
typedef pthread_mutex_t Q_MUTEX_T;
// POSIX threads mutex types
#if ((defined(PTHREAD_MUTEX_RECURSIVE) && defined(PTHREAD_MUTEX_DEFAULT)) || \
- defined(Q_OS_FREEBSD)) && !defined(Q_OS_UNIXWARE) && !defined(Q_OS_SOLARIS)
- // POSIX 1003.1c-1995 - We love this OS
+ defined(Q_OS_FREEBSD)) && !defined(Q_OS_UNIXWARE) && !defined(Q_OS_SOLARIS) && \
+ !defined(Q_OS_MAC)
+// POSIX 1003.1c-1995 - We love this OS
# define Q_MUTEX_SET_TYPE(a, b) pthread_mutexattr_settype((a), (b))
# if defined(QT_CHECK_RANGE)
# define Q_NORMAL_MUTEX_TYPE PTHREAD_MUTEX_ERRORCHECK
# else
# define Q_NORMAL_MUTEX_TYPE PTHREAD_MUTEX_DEFAULT
# endif
# define Q_RECURSIVE_MUTEX_TYPE PTHREAD_MUTEX_RECURSIVE
#elif defined(MUTEX_NONRECURSIVE_NP) && defined(MUTEX_RECURSIVE_NP)
// POSIX 1003.4a pthreads draft extensions
# define Q_MUTEX_SET_TYPE(a, b) pthread_mutexattr_setkind_np((a), (b));
# define Q_NORMAL_MUTEX_TYPE MUTEX_NONRECURSIVE_NP
# define Q_RECURSIVE_MUTEX_TYPE MUTEX_RECURSIVE_NP
#else
// Unknown mutex types - skip them
# define Q_MUTEX_SET_TYPE(a, b)
# undef Q_NORMAL_MUTEX_TYPE
# undef Q_RECURSIVE_MUTEX_TYPE
#endif
#include "qmutex.h"
#include "qmutex_p.h"
#include <errno.h>
#include <string.h>
@@ -640,48 +641,49 @@ bool QMutex::tryLock()
void waitForSignal()
{
...
...
...
while ( ! signalled )
waitcondition.wait( locker.mutex() );
...
...
...
}
};
\endcode
\sa QMutex, QWaitCondition
*/
/*!
\fn QMutexLocker::QMutexLocker( QMutex *mutex )
Constructs a QMutexLocker and locks \a mutex. The mutex will be
- unlocked when the QMutexLocker is destroyed.
+ unlocked when the QMutexLocker is destroyed. If \a mutex is zero,
+ QMutexLocker does nothing.
\sa QMutex::lock()
*/
/*!
\fn QMutexLocker::~QMutexLocker()
Destroys the QMutexLocker and unlocks the mutex which was locked
in the constructor.
\sa QMutexLocker::QMutexLocker(), QMutex::unlock()
*/
/*!
\fn QMutex *QMutexLocker::mutex() const
Returns a pointer to the mutex which was locked in the
constructor.
\sa QMutexLocker::QMutexLocker()
*/
#endif // QT_THREAD_SUPPORT
diff --git a/qmake/tools/qmutexpool.cpp b/qmake/tools/qmutexpool.cpp
index 9ed2829..a8e7402 100644
--- a/qmake/tools/qmutexpool.cpp
+++ b/qmake/tools/qmutexpool.cpp
@@ -1,48 +1,67 @@
+/****************************************************************************
+** $Id$
+**
+** ...
+**
+** Copyright (C) 2002 Trolltech AS. All rights reserved.
+**
+** This file is part of the tools module of the Qt GUI Toolkit.
+**
+** This file may be distributed under the terms of the Q Public License
+** as defined by Trolltech AS of Norway and appearing in the file
+** LICENSE.QPL included in the packaging of this file.
+**
+** This file may be distributed and/or modified under the terms of the
+** GNU General Public License version 2 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.
+**
+** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
+** licenses may use this file in accordance with the Qt Commercial License
+** Agreement provided with the Software.
+**
+** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+**
+** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
+** information about Qt Commercial License Agreements.
+** See http://www.trolltech.com/qpl/ for QPL licensing information.
+** See http://www.trolltech.com/gpl/ for GPL licensing information.
+**
+** Contact info@trolltech.com if any conditions of this licensing are
+** not clear to you.
+**
+**********************************************************************/
+
#include "qmutexpool_p.h"
#ifdef QT_THREAD_SUPPORT
#include <qthread.h>
-#include <stdio.h>
QMutexPool *qt_global_mutexpool = 0;
-// this is an internal class used only for inititalizing the global mutexpool
-class QGlobalMutexPoolInitializer
-{
-public:
- inline QGlobalMutexPoolInitializer()
- {
- /*
- Purify will report a leak here. However, this mutex pool must be alive
- until *everything* in Qt has been destructed. Unfortunately there is
- no way to guarantee this, so we never destroy this mutex pool.
- */
- qt_global_mutexpool = new QMutexPool( TRUE );
- }
-};
-QGlobalMutexPoolInitializer qt_global_mutexpool_initializer;
/*!
\class QMutexPool qmutexpool_p.h
\brief The QMutexPool class provides a pool of QMutex objects.
\internal
\ingroup thread
QMutexPool is a convenience class that provides access to a fixed
number of QMutex objects.
Typical use of a QMutexPool is in situations where it is not
possible or feasible to use one QMutex for every protected object.
The mutex pool will return a mutex based on the address of the
object that needs protection.
For example, consider this simple class:
\code
class Number {
public:
Number( double n ) : num ( n ) { }
@@ -64,67 +83,70 @@ QGlobalMutexPoolInitializer qt_global_mutexpool_initializer;
\code
void calcSquare( Number *num )
{
QMutexLocker locker( mutexpool.get( num ) );
num.setNumber( num.number() * num.number() );
}
\endcode
This function will safely calculate the square of a number, since
it uses a mutex from a QMutexPool. The mutex is locked and
unlocked automatically by the QMutexLocker class. See the
QMutexLocker documentation for more details.
*/
/*!
Constructs a QMutexPool, reserving space for \a size QMutexes. If
\a recursive is TRUE, all QMutexes in the pool will be recursive
mutexes; otherwise they will all be non-recursive (the default).
The QMutexes are created when needed, and deleted when the
QMutexPool is destructed.
*/
QMutexPool::QMutexPool( bool recursive, int size )
- : mutex( FALSE ), mutexes( size ), recurs( recursive )
+ : mutex( FALSE ), count( size ), recurs( recursive )
{
- mutexes.fill( 0 );
+ mutexes = new QMutex*[count];
+ for ( int index = 0; index < count; ++index ) {
+ mutexes[index] = 0;
+ }
}
/*!
Destructs a QMutexPool. All QMutexes that were created by the pool
are deleted.
*/
QMutexPool::~QMutexPool()
{
QMutexLocker locker( &mutex );
- QMutex **d = mutexes.data();
- for ( int index = 0; (uint) index < mutexes.size(); index++ ) {
- delete d[index];
- d[index] = 0;
+ for ( int index = 0; index < count; ++index ) {
+ delete mutexes[index];
+ mutexes[index] = 0;
}
+ delete [] mutexes;
+ mutexes = 0;
}
/*!
Returns a QMutex from the pool. QMutexPool uses the value \a
address to determine which mutex is retured from the pool.
*/
QMutex *QMutexPool::get( void *address )
{
- QMutex **d = mutexes.data();
- int index = (int)( (ulong) address % mutexes.size() );
+ int index = (int) ( (unsigned long) address % count );
- if ( ! d[index] ) {
+ if ( ! mutexes[index] ) {
// mutex not created, create one
QMutexLocker locker( &mutex );
// we need to check once again that the mutex hasn't been created, since
// 2 threads could be trying to create a mutex as the same index...
- if ( ! d[index] ) {
- d[index] = new QMutex( recurs );
+ if ( ! mutexes[index] ) {
+ mutexes[index] = new QMutex( recurs );
}
}
- return d[index];
+ return mutexes[index];
}
#endif
diff --git a/qmake/tools/qregexp.cpp b/qmake/tools/qregexp.cpp
index 500efed..0c1f060 100644
--- a/qmake/tools/qregexp.cpp
+++ b/qmake/tools/qregexp.cpp
@@ -242,57 +242,57 @@
\i A character that follows a backslash matches the character
itself except where mentioned below. For example if you
wished to match a literal caret at the beginning of a string
you would write <b>\^</b>.
\row \i <b>\\a</b>
\i This matches the ASCII bell character (BEL, 0x07).
\row \i <b>\\f</b>
\i This matches the ASCII form feed character (FF, 0x0C).
\row \i <b>\\n</b>
\i This matches the ASCII line feed character (LF, 0x0A, Unix newline).
\row \i <b>\\r</b>
\i This matches the ASCII carriage return character (CR, 0x0D).
\row \i <b>\\t</b>
\i This matches the ASCII horizontal tab character (HT, 0x09).
\row \i <b>\\v</b>
\i This matches the ASCII vertical tab character (VT, 0x0B).
\row \i <b>\\xhhhh</b>
\i This matches the Unicode character corresponding to the
hexadecimal number hhhh (between 0x0000 and 0xFFFF). \0ooo
(i.e., \zero ooo) matches the ASCII/Latin-1 character
corresponding to the octal number ooo (between 0 and 0377).
\row \i <b>. (dot)</b>
\i This matches any character (including newline).
\row \i <b>\\d</b>
- \i This matches a digit (see QChar::isDigit()).
+ \i This matches a digit (QChar::isDigit()).
\row \i <b>\\D</b>
\i This matches a non-digit.
\row \i <b>\\s</b>
- \i This matches a whitespace (see QChar::isSpace()).
+ \i This matches a whitespace (QChar::isSpace()).
\row \i <b>\\S</b>
\i This matches a non-whitespace.
\row \i <b>\\w</b>
- \i This matches a word character (see QChar::isLetterOrNumber()).
+ \i This matches a word character (QChar::isLetterOrNumber() or '_').
\row \i <b>\\W</b>
\i This matches a non-word character.
\row \i <b>\\n</b>
\i The n-th \link #capturing-text backreference \endlink,
e.g. \1, \2, etc.
\endtable
\e {Note that the C++ compiler transforms backslashes in strings
so to include a <b>\\</b> in a regexp you will need to enter it
twice, i.e. <b>\\\\</b>.}
\target sets-of-characters
\section1 Sets of Characters
Square brackets are used to match any character in the set of
characters contained within the square brackets. All the character
set abbreviations described above can be used within square
brackets. Apart from the character set abbreviations and the
following two exceptions no characters have special meanings in
square brackets.
\table
\row \i <b>^</b>
\i The caret negates the character set if it occurs as the
@@ -526,49 +526,56 @@
The equivalent of Perl's \c{/i} option is
setCaseSensitive(FALSE).
Perl's \c{/g} option can be emulated using a \link
#cap_in_a_loop loop \endlink.
In QRegExp <b>.</b> matches any character, therefore all QRegExp
regexps have the equivalent of Perl's \c{/s} option. QRegExp
does not have an equivalent to Perl's \c{/m} option, but this
can be emulated in various ways for example by splitting the input
into lines or by looping with a regexp that searches for newlines.
Because QRegExp is string oriented there are no \A, \Z or \z
assertions. The \G assertion is not supported but can be emulated
in a loop.
Perl's $& is cap(0) or capturedTexts()[0]. There are no QRegExp
equivalents for $`, $' or $+. Perl's capturing variables, $1, $2,
... correspond to cap(1) or capturedTexts()[1], cap(2) or
capturedTexts()[2], etc.
To substitute a pattern use QString::replace().
Perl's extended \c{/x} syntax is not supported, nor are
- regexp comments (?#comment) or directives, e.g. (?i).
+ directives, e.g. (?i), or regexp comments, e.g. (?#comment). On
+ the other hand, C++'s rules for literal strings can be used to
+ achieve the same:
+ \code
+ QRegExp mark( "\\b" // word boundary
+ "[Mm]ark" // the word we want to match
+ );
+ \endcode
Both zero-width positive and zero-width negative lookahead
assertions (?=pattern) and (?!pattern) are supported with the same
syntax as Perl. Perl's lookbehind assertions, "independent"
subexpressions and conditional expressions are not supported.
Non-capturing parentheses are also supported, with the same
(?:pattern) syntax.
See QStringList::split() and QStringList::join() for equivalents
to Perl's split and join functions.
Note: because C++ transforms \\'s they must be written \e twice in
code, e.g. <b>\\b</b> must be written <b>\\\\b</b>.
\target code-examples
\section1 Code Examples
\code
QRegExp rx( "^\\d\\d?$" ); // match integers 0 to 99
rx.search( "123" ); // returns -1 (no match)
rx.search( "-6" ); // returns -1 (no match)
rx.search( "6" ); // returns 0 (matched as position 0)
\endcode
@@ -656,86 +663,91 @@
if ( rx.search( str ) != -1 ) {
company = rx.cap( 1 );
web = rx.cap( 2 );
country = rx.cap( 3 );
}
\endcode
In this example our input lines have the format company name, web
address and country. Unfortunately the regexp is rather long and
not very versatile -- the code will break if we add any more
fields. A simpler and better solution is to look for the
separator, '\t' in this case, and take the surrounding text. The
QStringList split() function can take a separator string or regexp
as an argument and split a string accordingly.
\code
QStringList field = QStringList::split( "\t", str );
\endcode
Here field[0] is the company, field[1] the web address and so on.
To imitate the matching of a shell we can use wildcard mode.
\code
- QRegExp rx( "*.html" ); // invalid regexp: * doesn't quantify anything
- rx.setWildcard( TRUE ); // now it's a valid wildcard regexp
- rx.search( "index.html" ); // returns 0 (matched at position 0)
- rx.search( "default.htm" ); // returns -1 (no match)
- rx.search( "readme.txt" ); // returns -1 (no match)
+ QRegExp rx( "*.html" ); // invalid regexp: * doesn't quantify anything
+ rx.setWildcard( TRUE ); // now it's a valid wildcard regexp
+ rx.exactMatch( "index.html" ); // returns TRUE
+ rx.exactMatch( "default.htm" ); // returns FALSE
+ rx.exactMatch( "readme.txt" ); // returns FALSE
\endcode
Wildcard matching can be convenient because of its simplicity, but
any wildcard regexp can be defined using full regexps, e.g.
<b>.*\.html$</b>. Notice that we can't match both \c .html and \c
.htm files with a wildcard unless we use <b>*.htm*</b> which will
also match 'test.html.bak'. A full regexp gives us the precision
we need, <b>.*\\.html?$</b>.
QRegExp can match case insensitively using setCaseSensitive(), and
can use non-greedy matching, see setMinimal(). By default QRegExp
uses full regexps but this can be changed with setWildcard().
Searching can be forward with search() or backward with
searchRev(). Captured text can be accessed using capturedTexts()
which returns a string list of all captured strings, or using
cap() which returns the captured string for the given index. The
pos() function takes a match index and returns the position in the
string where the match was made (or -1 if there was no match).
\sa QRegExpValidator QString QStringList
\target member-function-documentation
*/
const int NumBadChars = 64;
#define BadChar( ch ) ( (ch).unicode() % NumBadChars )
const int NoOccurrence = INT_MAX;
const int EmptyCapture = INT_MAX;
const int InftyLen = INT_MAX;
const int InftyRep = 1025;
const int EOS = -1;
+static bool isWord( QChar ch )
+{
+ return ch.isLetterOrNumber() || ch == QChar( '_' );
+}
+
/*
Merges two QMemArrays of ints and puts the result into the first one.
*/
static void mergeInto( QMemArray<int> *a, const QMemArray<int>& b )
{
int asize = a->size();
int bsize = b.size();
if ( asize == 0 ) {
*a = b.copy();
#ifndef QT_NO_REGEXP_OPTIM
} else if ( bsize == 1 && (*a)[asize - 1] < b[0] ) {
a->resize( asize + 1 );
(*a)[asize] = b[0];
#endif
} else if ( bsize >= 1 ) {
int csize = asize + bsize;
QMemArray<int> c( csize );
int i = 0, j = 0, k = 0;
while ( i < asize ) {
if ( j < bsize ) {
if ( (*a)[i] == b[j] ) {
i++;
csize--;
} else if ( (*a)[i] < b[j] ) {
@@ -1659,51 +1671,51 @@ bool QRegExpEngine::isBetterCapture( const int *begin1, const int *end1,
bool QRegExpEngine::testAnchor( int i, int a, const int *capBegin )
{
int j;
#ifndef QT_NO_REGEXP_ANCHOR_ALT
if ( (a & Anchor_Alternation) != 0 ) {
return testAnchor( i, aa[a ^ Anchor_Alternation].a, capBegin ) ||
testAnchor( i, aa[a ^ Anchor_Alternation].b, capBegin );
}
#endif
if ( (a & Anchor_Caret) != 0 ) {
if ( mmPos + i != mmCaretPos )
return FALSE;
}
if ( (a & Anchor_Dollar) != 0 ) {
if ( mmPos + i != mmLen )
return FALSE;
}
#ifndef QT_NO_REGEXP_ESCAPE
if ( (a & (Anchor_Word | Anchor_NonWord)) != 0 ) {
bool before = FALSE;
bool after = FALSE;
if ( mmPos + i != 0 )
- before = mmIn[mmPos + i - 1].isLetterOrNumber();
+ before = isWord( mmIn[mmPos + i - 1] );
if ( mmPos + i != mmLen )
- after = mmIn[mmPos + i].isLetterOrNumber();
+ after = isWord( mmIn[mmPos + i] );
if ( (a & Anchor_Word) != 0 && (before == after) )
return FALSE;
if ( (a & Anchor_NonWord) != 0 && (before != after) )
return FALSE;
}
#endif
#ifndef QT_NO_REGEXP_LOOKAHEAD
bool catchx = TRUE;
if ( (a & Anchor_LookaheadMask) != 0 ) {
QConstString cstr = QConstString( (QChar *) mmIn + mmPos + i,
mmLen - mmPos - i );
for ( j = 0; j < (int) ahead.size(); j++ ) {
if ( (a & (Anchor_FirstLookahead << j)) != 0 ) {
catchx = ahead[j]->eng->match( cstr.string(), 0, TRUE, TRUE,
mmCaretPos - mmPos - i )[0] == 0;
if ( catchx == ahead[j]->neg )
return FALSE;
}
}
}
#endif
#ifndef QT_NO_REGEXP_CAPTURE
#ifndef QT_NO_REGEXP_BACKREF
@@ -2611,68 +2623,76 @@ int QRegExpEngine::getEscape()
yyCh = getChar();
}
if ( (val & ~0377) != 0 )
error( RXERR_OCTAL );
return Tok_Char | val;
#endif
#ifndef QT_NO_REGEXP_ESCAPE
case 'B':
return Tok_NonWord;
#endif
#ifndef QT_NO_REGEXP_CCLASS
case 'D':
// see QChar::isDigit()
yyCharClass->addCategories( 0x7fffffef );
return Tok_CharClass;
case 'S':
// see QChar::isSpace()
yyCharClass->addCategories( 0x7ffff87f );
yyCharClass->addRange( 0x0000, 0x0008 );
yyCharClass->addRange( 0x000e, 0x001f );
yyCharClass->addRange( 0x007f, 0x009f );
return Tok_CharClass;
case 'W':
// see QChar::isLetterOrNumber()
- yyCharClass->addCategories( 0x7ff07f8f );
+ yyCharClass->addCategories( 0x7fe07f8f );
+ yyCharClass->addRange( 0x203f, 0x2040 );
+ yyCharClass->addSingleton( 0x2040 );
+ yyCharClass->addSingleton( 0x30fb );
+ yyCharClass->addRange( 0xfe33, 0xfe34 );
+ yyCharClass->addRange( 0xfe4d, 0xfe4f );
+ yyCharClass->addSingleton( 0xff3f );
+ yyCharClass->addSingleton( 0xff65 );
return Tok_CharClass;
#endif
#ifndef QT_NO_REGEXP_ESCAPE
case 'b':
return Tok_Word;
#endif
#ifndef QT_NO_REGEXP_CCLASS
case 'd':
// see QChar::isDigit()
yyCharClass->addCategories( 0x00000010 );
return Tok_CharClass;
case 's':
// see QChar::isSpace()
yyCharClass->addCategories( 0x00000380 );
yyCharClass->addRange( 0x0009, 0x000d );
return Tok_CharClass;
case 'w':
// see QChar::isLetterOrNumber()
yyCharClass->addCategories( 0x000f8070 );
+ yyCharClass->addSingleton( 0x005f ); // '_'
return Tok_CharClass;
#endif
#ifndef QT_NO_REGEXP_ESCAPE
case 'x':
val = 0;
for ( i = 0; i < 4; i++ ) {
low = QChar( yyCh ).lower();
if ( low >= '0' && low <= '9' )
val = ( val << 4 ) | ( low - '0' );
else if ( low >= 'a' && low <= 'f' )
val = ( val << 4 ) | ( low - 'a' + 10 );
else
break;
yyCh = getChar();
}
return Tok_Char | val;
#endif
default:
if ( prevCh >= '1' && prevCh <= '9' ) {
#ifndef QT_NO_REGEXP_BACKREF
val = prevCh - '0';
while ( yyCh >= '0' && yyCh <= '9' ) {
val = ( val *= 10 ) | ( yyCh - '0' );
yyCh = getChar();
@@ -3162,69 +3182,71 @@ struct QRegExpPrivate
QString rxpattern; // regular-expression pattern
#ifndef QT_NO_REGEXP_WILDCARD
bool wc; // wildcard mode?
#endif
bool min; // minimal matching? (instead of maximal)
#ifndef QT_NO_REGEXP_CAPTURE
QString t; // last string passed to QRegExp::search() or searchRev()
QStringList capturedCache; // what QRegExp::capturedTexts() returned last
#endif
QMemArray<int> captured; // what QRegExpEngine::search() returned last
QRegExpPrivate() { captured.fill( -1, 2 ); }
};
#ifndef QT_NO_REGEXP_OPTIM
static QCache<QRegExpEngine> *engineCache = 0;
static QSingleCleanupHandler<QCache<QRegExpEngine> > cleanup_cache;
#endif
static QRegExpEngine *newEngine( const QString& pattern, bool caseSensitive )
{
#ifndef QT_NO_REGEXP_OPTIM
if ( engineCache != 0 ) {
#ifdef QT_THREAD_SUPPORT
- QMutexLocker locker( qt_global_mutexpool->get( &engineCache ) );
+ QMutexLocker locker( qt_global_mutexpool ?
+ qt_global_mutexpool->get( &engineCache ) : 0 );
#endif
QRegExpEngine *eng = engineCache->take( pattern );
if ( eng == 0 || eng->caseSensitive() != caseSensitive ) {
delete eng;
} else {
eng->ref();
return eng;
}
}
#endif
return new QRegExpEngine( pattern, caseSensitive );
}
static void derefEngine( QRegExpEngine *eng, const QString& pattern )
{
- if ( eng != 0 && eng->deref() ) {
-#ifndef QT_NO_REGEXP_OPTIM
#ifdef QT_THREAD_SUPPORT
- QMutexLocker locker( qt_global_mutexpool->get( &engineCache ) );
+ QMutexLocker locker( qt_global_mutexpool ?
+ qt_global_mutexpool->get( &engineCache ) : 0 );
#endif
+ if ( eng != 0 && eng->deref() ) {
+#ifndef QT_NO_REGEXP_OPTIM
if ( engineCache == 0 ) {
engineCache = new QCache<QRegExpEngine>;
engineCache->setAutoDelete( TRUE );
cleanup_cache.set( &engineCache );
}
if ( !pattern.isNull() &&
engineCache->insert(pattern, eng, 4 + pattern.length() / 4) )
return;
#else
Q_UNUSED( pattern );
#endif
delete eng;
}
}
/*!
\enum QRegExp::CaretMode
The CaretMode enum defines the different meanings of the caret
(<b>^</b>) in a regular expression. The possible values are:
\value CaretAtZero
The caret corresponds to index 0 in the searched string.
@@ -3544,55 +3566,48 @@ bool QRegExp::exactMatch( const QString& str ) const
Attempts to match in \a str, starting from position \a index.
Returns the position of the match, or -1 if there was no match.
The length of the match is stored in \a *len, unless \a len is a
null pointer.
If \a indexIsStart is TRUE (the default), the position \a index in
the string will match the start of string anchor, <b>^</b>, in the
regexp, if present. Otherwise, position 0 in \a str will match.
Use search() and matchedLength() instead of this function.
\sa QString::mid() QConstString
*/
int QRegExp::match( const QString& str, int index, int *len,
bool indexIsStart ) const
{
int pos = search( str, index, indexIsStart ? CaretAtOffset : CaretAtZero );
if ( len != 0 )
*len = matchedLength();
return pos;
}
#endif // QT_NO_COMPAT
-/*!
- \overload
-
- This convenience function searches with a \c CaretMode of \c
- CaretAtZero which is the most common usage.
-*/
-
int QRegExp::search( const QString& str, int offset ) const
{
return search( str, offset, CaretAtZero );
}
/*!
Attempts to find a match in \a str from position \a offset (0 by
default). If \a offset is -1, the search starts at the last
character; if -2, at the next to last character; etc.
Returns the position of the first match, or -1 if there was no
match.
The \a caretMode parameter can be used to instruct whether <b>^</b>
should match at index 0 or at \a offset.
You might prefer to use QString::find(), QString::contains() or
even QStringList::grep(). To replace matches use
QString::replace().
Example:
\code
QString str = "offsets: 1.23 .50 71.00 6.00";
QRegExp rx( "\\d*\\.\\d+" ); // primitive floating point matching
@@ -3604,55 +3619,48 @@ int QRegExp::search( const QString& str, int offset ) const
}
// pos will be 9, 14, 18 and finally 24; count will end up as 4
\endcode
Although const, this function sets matchedLength(),
capturedTexts() and pos().
\sa searchRev() exactMatch()
*/
int QRegExp::search( const QString& str, int offset, CaretMode caretMode ) const
{
if ( offset < 0 )
offset += str.length();
#ifndef QT_NO_REGEXP_CAPTURE
priv->t = str;
priv->capturedCache.clear();
#endif
priv->captured = eng->match( str, offset, priv->min, FALSE,
caretIndex(offset, caretMode) );
return priv->captured[0];
}
-/*!
- \overload
-
- This convenience function searches with a \c CaretMode of \c
- CaretAtZero which is the most common usage.
-*/
-
int QRegExp::searchRev( const QString& str, int offset ) const
{
return searchRev( str, offset, CaretAtZero );
}
/*!
Attempts to find a match backwards in \a str from position \a
offset. If \a offset is -1 (the default), the search starts at the
last character; if -2, at the next to last character; etc.
Returns the position of the first match, or -1 if there was no
match.
The \a caretMode parameter can be used to instruct whether <b>^</b>
should match at index 0 or at \a offset.
Although const, this function sets matchedLength(),
capturedTexts() and pos().
\warning Searching backwards is much slower than searching
forwards.
\sa search() exactMatch()
*/
@@ -3673,49 +3681,49 @@ int QRegExp::searchRev( const QString& str, int offset,
}
while ( offset >= 0 ) {
priv->captured = eng->match( str, offset, priv->min, TRUE,
caretIndex(offset, caretMode) );
if ( priv->captured[0] == offset )
return offset;
offset--;
}
return -1;
}
/*!
Returns the length of the last matched string, or -1 if there was
no match.
\sa exactMatch() search() searchRev()
*/
int QRegExp::matchedLength() const
{
return priv->captured[1];
}
#ifndef QT_NO_REGEXP_CAPTURE
-/*!
+/*!
Returns the number of captures contained in the regular expression.
*/
int QRegExp::numCaptures() const
{
return eng->numCaptures();
}
/*!
Returns a list of the captured text strings.
The first string in the list is the entire matched string. Each
subsequent list element contains a string that matched a
(capturing) subexpression of the regexp.
For example:
\code
QRegExp rx( "(\\d+)(\\s*)(cm|inch(es)?)" );
int pos = rx.search( "Length: 36 inches" );
QStringList list = rx.capturedTexts();
// list is now ( "36 inches", "36", " ", "inches", "es" )
\endcode
diff --git a/qmake/tools/qsemaphore_unix.cpp b/qmake/tools/qsemaphore_unix.cpp
index fcf28da..4516049 100644
--- a/qmake/tools/qsemaphore_unix.cpp
+++ b/qmake/tools/qsemaphore_unix.cpp
@@ -162,86 +162,84 @@ int QSemaphore::operator--(int)
d->mutex.lock();
--(d->value);
if (d->value < 0) d->value = 0;
ret = d->value;
d->cond.wakeAll();
d->mutex.unlock();
return ret;
}
/*!
Try to get access to the semaphore. If \l available() \< \a n, this
call will block until it can get all the accesses it wants, i.e.
until available() \>= \a n.
*/
int QSemaphore::operator+=(int n)
{
int ret;
d->mutex.lock();
+ if ( n < 0 || n > d->max ) {
+#ifdef QT_CHECK_RANGE
+ qWarning( "QSemaphore::operator+=: paramter %d out of range", n );
+#endif // QT_CHECK_RANGE
+ n = n < 0 ? 0 : d->max;
+ }
+
while (d->value + n > d->max)
d->cond.wait(&(d->mutex));
d->value += n;
-
-#ifdef QT_CHECK_RANGE
- if (d->value > d->max) {
- qWarning("QSemaphore::operator+=: attempt to allocate more resources than available");
- d->value = d->max;
- }
-#endif
-
ret = d->value;
d->mutex.unlock();
return ret;
}
/*!
Release \a n accesses to the semaphore.
*/
int QSemaphore::operator-=(int n)
{
int ret;
d->mutex.lock();
- d->value -= n;
-
+ if ( n < 0 || n > d->value ) {
#ifdef QT_CHECK_RANGE
- if (d->value < 0) {
- qWarning("QSemaphore::operator-=: attempt to deallocate more resources than taken");
- d->value = 0;
+ qWarning( "QSemaphore::operator-=: paramter %d out of range", n );
+#endif // QT_CHECK_RANGE
+ n = n < 0 ? 0 : d->value;
}
-#endif
+ d->value -= n;
ret = d->value;
d->cond.wakeOne();
d->mutex.unlock();
return ret;
}
/*!
Returns the number of accesses currently available to the
semaphore.
*/
int QSemaphore::available() const {
int ret;
d->mutex.lock();
ret = d->max - d->value;
d->mutex.unlock();
return ret;
}
diff --git a/qmake/tools/qsettings.cpp b/qmake/tools/qsettings.cpp
index 5de105c..35fc039 100644
--- a/qmake/tools/qsettings.cpp
+++ b/qmake/tools/qsettings.cpp
@@ -1,30 +1,30 @@
/****************************************************************************
** $Id$
**
** Implementation of QSettings class
**
-** Created: 2000.06.26
+** Created : 000626
**
** Copyright (C) 2000-2002 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
@@ -42,138 +42,167 @@ static inline int qt_open( const char *pathname, int flags, mode_t mode )
{ return ::open( pathname, flags, mode ); }
#if defined(open)
# undef open
#endif
// POSIX Large File Support redefines truncate -> truncate64
#if defined(truncate)
# undef truncate
#endif
#include "qsettings.h"
#ifndef QT_NO_SETTINGS
#include "qdir.h"
#include "qfile.h"
#include "qfileinfo.h"
#include "qmap.h"
#include "qtextstream.h"
#include "qregexp.h"
#include <private/qsettings_p.h>
#include <errno.h>
/*!
- \class QSettings
- \brief The QSettings class provides persistent platform-independent application settings.
-
- \ingroup io
- \ingroup misc
- \mainclass
-
- On Unix systems, QSettings uses text files to store settings. On Windows
- systems, QSettings uses the system registry. On Mac OS X, QSettings will
- behave as on Unix, and store to text files.
-
- Each setting comprises an identifying key and the data associated with
- the key. A key is a unicode string which consists of \e two or more
- subkeys. A subkey is a slash, '/', followed by one or more unicode
- characters (excluding slashes, newlines, carriage returns and equals,
- '=', signs). The associated data, called the entry or value, may be a
- boolean, an integer, a double, a string or a list of strings. Entry
- strings may contain any unicode characters.
-
- If you want to save and restore the entire desktop's settings, i.e.
- which applications are running, use QSettings to save the settings
- for each individual application and QSessionManager to save the
- desktop's session.
+ \class QSettings
+ \brief The QSettings class provides persistent platform-independent application settings.
+
+ \ingroup io
+ \ingroup misc
+ \mainclass
+
+ On Unix systems, QSettings uses text files to store settings. On Windows
+ systems, QSettings uses the system registry. On Mac OS X, QSettings uses
+ the Carbon preferences API.
+
+ Each setting comprises an identifying key and the data associated with
+ the key. A key is a unicode string which consists of \e two or more
+ subkeys. A subkey is a slash, '/', followed by one or more unicode
+ characters (excluding slashes, newlines, carriage returns and equals,
+ '=', signs). The associated data, called the entry or value, may be a
+ boolean, an integer, a double, a string or a list of strings. Entry
+ strings may contain any unicode characters.
+
+ If you want to save and restore the entire desktop's settings, i.e.
+ which applications are running, use QSettings to save the settings
+ for each individual application and QSessionManager to save the
+ desktop's session.
Example settings:
\code
/MyCompany/MyApplication/background color
/MyCompany/MyApplication/foreground color
/MyCompany/MyApplication/geometry/x
/MyCompany/MyApplication/geometry/y
/MyCompany/MyApplication/geometry/width
/MyCompany/MyApplication/geometry/height
/MyCompany/MyApplication/recent files/1
/MyCompany/MyApplication/recent files/2
/MyCompany/MyApplication/recent files/3
\endcode
Each line above is a complete key, made up of subkeys.
- A typical usage pattern for application startup:
+ A typical usage pattern for reading application startup:
\code
QSettings settings;
- settings.insertSearchPath( QSettings::Windows, "/MyCompany" );
- // No search path needed for Unix; see notes further on.
- // Use default values if the keys don't exist
- QString bgColor = settings.readEntry( "/MyApplication/background color", "white" );
- int width = settings.readNumEntry( "/MyApplication/geometry/width", 640 );
+ settings.setPath( "MyCompany.com", "MyApplication" );
+
+ QString bgColor = settings.readEntry( "/colors/background", "white" );
+ int width = settings.readNumEntry( "/geometry/width", 640 );
// ...
\endcode
A typical usage pattern for application exit or 'save preferences':
\code
QSettings settings;
- settings.insertSearchPath( QSettings::Windows, "/MyCompany" );
- // No search path needed for Unix; see notes further on.
- settings.writeEntry( "/MyApplication/background color", bgColor );
- settings.writeEntry( "/MyApplication/geometry/width", width );
+ settings.setPath( "MyCompany.com", "MyApplication" );
+
+ settings.writeEntry( "/colors/background", bgColor );
+ settings.writeEntry( "/geometry/width", width );
// ...
\endcode
+ QSettings can build a key prefix that is prepended to all keys. To
+ build the key prefix, use beginGroup() and endGroup().
+ \code
+ QSettings settings;
+
+ settings.beginGroup( "/MainWindow" );
+ settings.beginGroup( "/Geometry" );
+ int x = settings.readEntry( "/x" );
+ // ...
+ settings.endGroup();
+ settings.beginGroup( "/Toolbars" );
+ // ...
+ settings.endGroup();
+ settings.endGroup();
+ \endcode
+
You can get a list of entry-holding keys by calling entryList(), and
a list of key-holding keys using subkeyList().
\code
QStringList keys = entryList( "/MyApplication" );
// keys contains 'background color' and 'foreground color'.
QStringList keys = entryList( "/MyApplication/recent files" );
// keys contains '1', '2' and '3'.
QStringList subkeys = subkeyList( "/MyApplication" );
// subkeys contains 'geometry' and 'recent files'
QStringList subkeys = subkeyList( "/MyApplication/recent files" );
// subkeys is empty.
\endcode
- If you wish to use a different search path call insertSearchPath()
- as often as necessary to add your preferred paths. Call
- removeSearchPath() to remove any unwanted paths.
-
Since settings for Windows are stored in the registry there are size
limits as follows:
\list
\i A subkey may not exceed 255 characters.
\i An entry's value may not exceed 16,300 characters.
\i All the values of a key (for example, all the 'recent files'
subkeys values), may not exceed 65,535 characters.
\endlist
- These limitations are not enforced on Unix.
+ These limitations are not enforced on Unix or Mac OS X.
+
+ If you wish to use a different search path call insertSearchPath()
+ as often as necessary to add your preferred paths. Call
+ removeSearchPath() to remove any unwanted paths.
+
+ \section1 Notes for Mac OS X Applications
+
+ Internal to the CFPreferences API it is not defined (for Mac OS 9
+ support) where the settings will ultimitely be stored. However, at the
+ time of this writing the settings will be stored (either on a global or
+ user basis, preferring locally) into a plist file in
+ $ROOT/System/Library/Preferences (in XML format). QSettings will create
+ an appropriate plist file (com.<first group name>.plist) out of the
+ full path to a key.
+
+ For further information on CFPreferences see also
+ \link http://developer.apple.com/techpubs/macosx/CoreFoundation/PreferenceServices/preferenceservices_carbon.html
+ Apple's Specifications\endlink
\section1 Notes for Unix Applications
There is no universally accepted place for storing application
settings under Unix. In the examples the settings file will be
searched for in the following directories:
\list 1
\i INSTALL/etc/settings
\i /opt/MyCompany/share/etc
\i /opt/MyCompany/share/MyApplication/etc
\i $HOME/.qt
\endlist
When reading settings the files are searched in the order shown
above, with later settings overriding earlier settings. Files for
which the user doesn't have read permission are ignored. When saving
settings QSettings works in the order shown above, writing
to the first settings file for which the user has write permission.
(\c INSTALL is the directory where Qt was installed. This can be
modified by using the configure script's -prefix argument )
If you want to put the settings in a particular place in the
filesystem you could do this:
\code
settings.insertSearchPath( QSettings::Unix, "/opt/MyCompany/share" );
@@ -279,62 +308,62 @@ static void closelock( HANDLE fd )
// ignore the return value, so that the unlock fails silently
(void) fcntl( fd, F_SETLKW, &fl );
close( fd );
}
#elif defined(Q_WS_WIN)
#define Q_LOCKREAD 1
#define Q_LOCKWRITE 2
static HANDLE openlock( const QString &name, int /*type*/ )
{
if ( !QFile::exists( name ) )
return 0;
return 0;
HANDLE fd = 0;
QT_WA( {
fd = CreateFileW( (TCHAR*)name.ucs2(), GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
} , {
fd = CreateFileA( name.local8Bit(), GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
} );
- if ( !LockFile( fd, 0, 0, -1, -1 ) ) {
+ if ( !LockFile( fd, 0, 0, (DWORD)-1, (DWORD)-1 ) ) { // ### (DWORD)-1 ???
#ifdef QT_CHECK_STATE
qWarning( "QSettings: openlock failed!" );
#endif
}
return fd;
}
-void closelock( HANDLE fd )
+static void closelock( HANDLE fd )
{
if ( !fd )
return;
- if ( !UnlockFile( fd, 0, 0, -1, -1 ) ) {
+ if ( !UnlockFile( fd, 0, 0, (DWORD)-1, (DWORD)-1 ) ) { // ### (DWORD)-1 ???
#ifdef QT_CHECK_STATE
qWarning( "QSettings: closelock failed!");
#endif
}
CloseHandle( fd );
}
#endif
QSettingsGroup::QSettingsGroup()
: modified(FALSE)
{
}
void QSettingsHeading::read(const QString &filename)
{
if (! QFileInfo(filename).exists())
return;
HANDLE lockfd = openlock( filename, Q_LOCKREAD );
@@ -434,157 +463,165 @@ void QSettingsHeading::parseLine(QTextStream &stream)
}
}
(*git).insert(key, value);
}
}
}
#ifdef Q_WS_WIN // for homedirpath reading from registry
#include "qt_windows.h"
#include "qlibrary.h"
#ifndef CSIDL_APPDATA
#define CSIDL_APPDATA 0x001a // <user name>\Application Data
#endif
#ifndef CSIDL_COMMON_APPDATA
#define CSIDL_COMMON_APPDATA 0x0023 // All Users\Application Data
#endif
#endif
QSettingsPrivate::QSettingsPrivate( QSettings::Format format )
: groupDirty( TRUE ), modified(FALSE), globalScope(TRUE)
{
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( format != QSettings::Ini )
return;
+#else
+ Q_UNUSED( format );
#endif
QString appSettings(QDir::homeDirPath() + "/.qt/");
QString defPath;
#ifdef Q_WS_WIN
#ifdef Q_OS_TEMP
TCHAR path[MAX_PATH];
SHGetSpecialFolderPath( 0, path, CSIDL_APPDATA, FALSE );
appSettings = QString::fromUcs2( path );
SHGetSpecialFolderPath( 0, path, CSIDL_COMMON_APPDATA, FALSE );
defPath = QString::fromUcs2( path );
#else
QLibrary library( "shell32" );
library.setAutoUnload( FALSE );
QT_WA( {
typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, LPTSTR, int, BOOL);
GetSpecialFolderPath SHGetSpecialFolderPath = (GetSpecialFolderPath)library.resolve( "SHGetSpecialFolderPathW" );
if ( SHGetSpecialFolderPath ) {
TCHAR path[MAX_PATH];
SHGetSpecialFolderPath( 0, path, CSIDL_APPDATA, FALSE );
appSettings = QString::fromUcs2( (ushort*)path );
SHGetSpecialFolderPath( 0, path, CSIDL_COMMON_APPDATA, FALSE );
defPath = QString::fromUcs2( (ushort*)path );
}
} , {
typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, char*, int, BOOL);
GetSpecialFolderPath SHGetSpecialFolderPath = (GetSpecialFolderPath)library.resolve( "SHGetSpecialFolderPathA" );
if ( SHGetSpecialFolderPath ) {
char path[MAX_PATH];
SHGetSpecialFolderPath( 0, path, CSIDL_APPDATA, FALSE );
appSettings = QString::fromLocal8Bit( path );
SHGetSpecialFolderPath( 0, path, CSIDL_COMMON_APPDATA, FALSE );
defPath = QString::fromLocal8Bit( path );
}
} );
#endif // Q_OS_TEMP
#else
// for now
#define QSETTINGS_DEFAULT_PATH_SUFFIX "/etc/settings"
defPath = qInstallPath();
defPath += QSETTINGS_DEFAULT_PATH_SUFFIX;
#endif
QDir dir(appSettings);
if (! dir.exists()) {
if (! dir.mkdir(dir.path()))
#if defined(QT_CHECK_STATE)
qWarning("QSettings: error creating %s", dir.path().latin1());
+#else
+ ;
#endif
}
if ( !!defPath )
searchPaths.append(defPath);
searchPaths.append(dir.path());
}
QSettingsPrivate::~QSettingsPrivate()
{
}
QSettingsGroup QSettingsPrivate::readGroup()
{
QSettingsHeading hd;
QSettingsGroup grp;
QMap<QString,QSettingsHeading>::Iterator headingsit = headings.find(heading);
if (headingsit != headings.end())
hd = *headingsit;
QSettingsHeading::Iterator grpit = hd.find(group);
if (grpit == hd.end()) {
QStringList::Iterator it = searchPaths.begin();
+ if ( !globalScope )
+ ++it;
while (it != searchPaths.end()) {
QString filebase = heading.lower().replace(QRegExp("\\s+"), "_");
QString fn((*it++) + "/" + filebase + "rc");
if (! hd.contains(fn + "cached")) {
hd.read(fn);
hd.insert(fn + "cached", QSettingsGroup());
}
}
headings.replace(heading, hd);
grpit = hd.find(group);
if (grpit != hd.end())
grp = *grpit;
} else if (hd.count() != 0)
grp = *grpit;
return grp;
}
void QSettingsPrivate::removeGroup(const QString &key)
{
QSettingsHeading hd;
QSettingsGroup grp;
bool found = FALSE;
QMap<QString,QSettingsHeading>::Iterator headingsit = headings.find(heading);
if (headingsit != headings.end())
hd = *headingsit;
QSettingsHeading::Iterator grpit = hd.find(group);
if (grpit == hd.end()) {
QStringList::Iterator it = searchPaths.begin();
+ if ( !globalScope )
+ ++it;
while (it != searchPaths.end()) {
QString filebase = heading.lower().replace(QRegExp("\\s+"), "_");
QString fn((*it++) + "/" + filebase + "rc");
if (! hd.contains(fn + "cached")) {
hd.read(fn);
hd.insert(fn + "cached", QSettingsGroup());
}
}
headings.replace(heading, hd);
grpit = hd.find(group);
if (grpit != hd.end()) {
found = TRUE;
grp = *grpit;
}
} else if (hd.count() != 0) {
found = TRUE;
grp = *grpit;
}
if (found) {
grp.remove(key);
@@ -594,797 +631,814 @@ void QSettingsPrivate::removeGroup(const QString &key)
hd.remove(group);
if (hd.count() > 0)
headings.replace(heading, hd);
else
headings.remove(heading);
modified = TRUE;
}
}
void QSettingsPrivate::writeGroup(const QString &key, const QString &value)
{
QSettingsHeading hd;
QSettingsGroup grp;
QMap<QString,QSettingsHeading>::Iterator headingsit = headings.find(heading);
if (headingsit != headings.end())
hd = *headingsit;
QSettingsHeading::Iterator grpit = hd.find(group);
if (grpit == hd.end()) {
QStringList::Iterator it = searchPaths.begin();
+ if ( !globalScope )
+ ++it;
while (it != searchPaths.end()) {
QString filebase = heading.lower().replace(QRegExp("\\s+"), "_");
QString fn((*it++) + "/" + filebase + "rc");
if (! hd.contains(fn + "cached")) {
hd.read(fn);
hd.insert(fn + "cached", QSettingsGroup());
}
}
headings.replace(heading, hd);
grpit = hd.find(group);
if (grpit != hd.end())
grp = *grpit;
} else if (hd.count() != 0)
grp = *grpit;
grp.modified = TRUE;
grp.replace(key, value);
hd.replace(group, grp);
headings.replace(heading, hd);
modified = TRUE;
}
QDateTime QSettingsPrivate::modificationTime()
{
QSettingsHeading hd = headings[heading];
QSettingsGroup grp = hd[group];
QDateTime datetime;
QStringList::Iterator it = searchPaths.begin();
+ if ( !globalScope )
+ ++it;
while (it != searchPaths.end()) {
QFileInfo fi((*it++) + "/" + heading + "rc");
if (fi.exists() && fi.lastModified() > datetime)
datetime = fi.lastModified();
}
return datetime;
}
-static bool verifyKey( const QString &key )
+bool qt_verify_key( const QString &key )
{
if ( key.isEmpty() || key[0] != '/' || key.contains( QRegExp("[=\\\\r\\\\n" ) ) )
return FALSE;
return TRUE;
}
static inline QString groupKey( const QString &group, const QString &key )
{
- if ( group.endsWith( "/" ) || key.startsWith( "/" ) )
+ if ( group.isEmpty() || ( group.length() == 1 && group[0] == '/' ) ) {
+ // group is empty, or it contains a single '/', so we just return the key
+ if ( key.startsWith( "/" ) )
+ return key;
+ return "/" + key;
+ } else if ( group.endsWith( "/" ) || key.startsWith( "/" ) ) {
return group + key;
+ }
return group + "/" + key;
}
/*!
Inserts \a path into the settings search path. The semantics of \a
path depends on the system \a s.
When \a s is \e Windows and the execution environment is \e not
Windows the function does nothing. Similarly when \a s is \e Unix and
the execution environment is \e not Unix the function does nothing.
When \a s is \e Windows, and the execution environment is Windows, the
search path list will be used as the first subfolder of the "Software"
folder in the registry.
When reading settings the folders are searched forwards from the
first folder (listed below) to the last, returning the first
- settings found, and ignoring any folders for which the user doesn't
+ settings found, and ignoring any folders for which the user doesn't
have read permission.
\list 1
\i HKEY_CURRENT_USER/Software/MyCompany/MyApplication
\i HKEY_LOCAL_MACHINE/Software/MyCompany/MyApplication
\i HKEY_CURRENT_USER/Software/MyApplication
\i HKEY_LOCAL_MACHINE/Software/MyApplication
\endlist
\code
QSettings settings;
settings.insertSearchPath( QSettings::Windows, "/MyCompany" );
settings.writeEntry( "/MyApplication/Tip of the day", TRUE );
\endcode
The code above will write the subkey "Tip of the day" into the \e
first of the registry folders listed below that is found and for
which the user has write permission.
\list 1
\i HKEY_LOCAL_MACHINE/Software/MyCompany/MyApplication
\i HKEY_CURRENT_USER/Software/MyCompany/MyApplication
\i HKEY_LOCAL_MACHINE/Software/MyApplication
\i HKEY_CURRENT_USER/Software/MyApplication
\endlist
If a setting is found in the HKEY_CURRENT_USER space, this setting
- is overwritten independently of write permissions in the
+ is overwritten independently of write permissions in the
HKEY_LOCAL_MACHINE space.
When \a s is \e Unix, and the execution environment is Unix, the
search path list will be used when trying to determine a suitable
filename for reading and writing settings files. By default, there are
two entries in the search path:
\list 1
\i INSTALL/etc - where \c INSTALL is the directory where Qt was installed.
\i $HOME/.qt/ - where \c $HOME is the user's home directory.
\endlist
All insertions into the search path will go before $HOME/.qt/.
For example:
\code
QSettings settings;
settings.insertSearchPath( QSettings::Unix, "/opt/MyCompany/share/etc" );
settings.insertSearchPath( QSettings::Unix, "/opt/MyCompany/share/MyApplication/etc" );
// ...
\endcode
Will result in a search path of:
\list 1
\i INSTALL/etc
\i /opt/MyCompany/share/etc
\i /opt/MyCompany/share/MyApplication/etc
\i $HOME/.qt
\endlist
When reading settings the files are searched in the order shown
above, with later settings overriding earlier settings. Files for
which the user doesn't have read permission are ignored. When saving
settings QSettings works in the order shown above, writing
to the first settings file for which the user has write permission.
Settings under Unix are stored in files whose names are based on the
first subkey of the key (not including the search path). The algorithm
for creating names is essentially: lowercase the first subkey, replace
spaces with underscores and add 'rc', e.g.
<tt>/MyCompany/MyApplication/background color</tt> will be stored in
<tt>myapplicationrc</tt> (assuming that <tt>/MyCompany</tt> is part of
the search path).
\sa removeSearchPath()
*/
void QSettings::insertSearchPath( System s, const QString &path)
{
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd ) {
d->sysInsertSearchPath( s, path );
return;
}
#endif
- if ( !verifyKey( path ) ) {
+#if !defined(Q_WS_WIN)
+ if ( s == Windows )
+ return;
+#endif
+#if !defined(Q_WS_WIN)
+ if ( s == Mac )
+ return;
+#endif
+
+ if ( !qt_verify_key( path ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::insertSearchPath: Invalid key: '%s'", path.isNull() ? "(null)" : path.latin1() );
#endif
return;
}
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd && s != Unix ) {
#else
if ( s != Unix ) {
#endif
-#ifdef Q_OS_MAC
+#if !defined(QWS) && defined(Q_OS_MAC)
if(s != Mac) //mac is respected on the mac as well
#endif
return;
}
+ QString realPath = path;
+#if defined(Q_WS_WIN)
+ QString defPath = d->globalScope ? d->searchPaths.first() : d->searchPaths.last();
+ realPath = defPath + path;
+#endif
+
QStringList::Iterator it = d->searchPaths.find(d->searchPaths.last());
if (it != d->searchPaths.end()) {
- d->searchPaths.insert(it, path);
+ d->searchPaths.insert(it, realPath);
}
}
/*!
Removes all occurrences of \a path (using exact matching) from the
settings search path for system \a s. Note that the default search
paths cannot be removed.
\sa insertSearchPath()
*/
void QSettings::removeSearchPath( System s, const QString &path)
{
- if ( !verifyKey( path ) ) {
+ if ( !qt_verify_key( path ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::insertSearchPath: Invalid key: '%s'", path.isNull() ? "(null)" : path.latin1() );
#endif
return;
}
#ifdef Q_WS_WIN
if ( d->sysd ) {
d->sysRemoveSearchPath( s, path );
return;
}
#endif
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd && s != Unix ) {
#else
if ( s != Unix ) {
#endif
-#ifdef Q_OS_MAC
+#if !defined(QWS) && defined(Q_OS_MAC)
if(s != Mac) //mac is respected on the mac as well
#endif
return;
}
if (path == d->searchPaths.first() || path == d->searchPaths.last())
return;
d->searchPaths.remove(path);
}
/*!
Creates a settings object.
*/
QSettings::QSettings()
{
d = new QSettingsPrivate( Native );
Q_CHECK_PTR(d);
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
d->sysd = 0;
d->sysInit();
#endif
}
/*!
Creates a settings object. If \a format is 'Ini' the settings will
be stored in a text file, using the Unix strategy (see above). If \a format
is 'Native', the settings will be stored in a platform specific way
(ie. the Windows registry).
*/
QSettings::QSettings( Format format )
{
d = new QSettingsPrivate( format );
Q_CHECK_PTR(d);
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
d->sysd = 0;
if ( format == Native )
d->sysInit();
#else
Q_UNUSED(format);
#endif
}
/*!
Destroys the settings object. All modifications made to the settings
will automatically be saved.
*/
QSettings::~QSettings()
{
sync();
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
d->sysClear();
#endif
delete d;
}
/*! \internal
Writes all modifications to the settings to disk. If any errors are
encountered, this function returns FALSE, otherwise it will return TRUE.
*/
bool QSettings::sync()
{
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
return d->sysSync();
#endif
if (! d->modified)
// fake success
return TRUE;
bool success = TRUE;
QMap<QString,QSettingsHeading>::Iterator it = d->headings.begin();
while (it != d->headings.end()) {
// determine filename
QSettingsHeading hd(*it);
QSettingsHeading::Iterator hdit = hd.begin();
QFile file;
QStringList::Iterator pit = d->searchPaths.begin();
+ if ( !d->globalScope )
+ ++pit;
while (pit != d->searchPaths.end()) {
QString filebase = it.key().lower().replace(QRegExp("\\s+"), "_");
QFileInfo di(*pit);
QFileInfo fi((*pit++) + "/" + filebase + "rc");
if ((fi.exists() && fi.isFile() && fi.isWritable()) ||
(! fi.exists() && di.isDir() && di.isWritable())) {
file.setName(fi.filePath());
break;
}
}
- it++;
+ ++it;
- if (file.name().isNull() || file.name().isEmpty()) {
+ if ( file.name().isEmpty() ) {
#ifdef QT_CHECK_STATE
qWarning("QSettings::sync: filename is null/empty");
#endif // QT_CHECK_STATE
success = FALSE;
continue;
}
HANDLE lockfd = openlock( file.name(), Q_LOCKWRITE );
if (! file.open(IO_WriteOnly)) {
#ifdef QT_CHECK_STATE
qWarning("QSettings::sync: failed to open '%s' for writing",
file.name().latin1());
#endif // QT_CHECK_STATE
success = FALSE;
continue;
}
// spew to file
QTextStream stream(&file);
stream.setEncoding(QTextStream::UnicodeUTF8);
while (hdit != hd.end()) {
if ((*hdit).count() > 0) {
stream << "[" << hdit.key() << "]" << endl;
QSettingsGroup grp(*hdit);
QSettingsGroup::Iterator grpit = grp.begin();
while (grpit != grp.end()) {
QString v = grpit.data();
if ( v.isNull() ) {
v = "\\0"; // escape null string
} else {
v.replace("\\", "\\\\"); // escape backslash
v.replace("\n", "\\n"); // escape newlines
}
stream << grpit.key() << "=" << v << endl;
- grpit++;
+ ++grpit;
}
stream << endl;
}
- hdit++;
+ ++hdit;
}
if (file.status() != IO_Ok) {
#ifdef QT_CHECK_STATE
qWarning("QSettings::sync: error at end of write");
#endif // QT_CHECK_STATE
success = FALSE;
}
file.close();
closelock( lockfd );
}
d->modified = FALSE;
return success;
}
/*!
\fn bool QSettings::readBoolEntry(const QString &key, bool def, bool *ok ) const
Reads the entry specified by \a key, and returns a bool, or the
default value, \a def, if the entry couldn't be read.
If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE
otherwise.
\sa readEntry(), readNumEntry(), readDoubleEntry(), writeEntry(), removeEntry()
*/
/*!
\internal
*/
bool QSettings::readBoolEntry(const QString &key, bool def, bool *ok )
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::readBoolEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
if ( ok )
*ok = FALSE;
return def;
}
- QString theKey = groupKey( group(), key );
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
- return d->sysReadBoolEntry( theKey, def, ok );
+ return d->sysReadBoolEntry( groupKey( group(), key ), def, ok );
#endif
- QString value = readEntry( theKey, ( def ? "true" : "false" ), ok );
+ QString value = readEntry( key, ( def ? "true" : "false" ), ok );
if (value.lower() == "true")
return TRUE;
else if (value.lower() == "false")
return FALSE;
else if (value == "1")
return TRUE;
else if (value == "0")
return FALSE;
if (! value.isEmpty())
qWarning("QSettings::readBoolEntry: '%s' is not 'true' or 'false'",
value.latin1());
if ( ok )
*ok = FALSE;
return def;
}
/*!
\fn double QSettings::readDoubleEntry(const QString &key, double def, bool *ok ) const
Reads the entry specified by \a key, and returns a double, or the
default value, \a def, if the entry couldn't be read.
If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE
otherwise.
\sa readEntry(), readNumEntry(), readBoolEntry(), writeEntry(), removeEntry()
*/
/*!
\internal
*/
double QSettings::readDoubleEntry(const QString &key, double def, bool *ok )
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::readDoubleEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
if ( ok )
*ok = FALSE;
return def;
}
- QString theKey = groupKey( group(), key );
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
- return d->sysReadDoubleEntry( theKey, def, ok );
+ return d->sysReadDoubleEntry( groupKey( group(), key ), def, ok );
#endif
- QString value = readEntry( theKey, QString::number(def), ok );
+ QString value = readEntry( key, QString::number(def), ok );
bool conv_ok;
double retval = value.toDouble( &conv_ok );
if ( conv_ok )
return retval;
if ( ! value.isEmpty() )
qWarning( "QSettings::readDoubleEntry: '%s' is not a number",
value.latin1() );
if ( ok )
*ok = FALSE;
return def;
}
/*!
\fn int QSettings::readNumEntry(const QString &key, int def, bool *ok ) const
Reads the entry specified by \a key, and returns an integer, or the
default value, \a def, if the entry couldn't be read.
If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE
otherwise.
\sa readEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry()
*/
/*!
\internal
*/
int QSettings::readNumEntry(const QString &key, int def, bool *ok )
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::readNumEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
if ( ok )
*ok = FALSE;
return def;
}
- QString theKey = groupKey( group(), key );
-
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
- return d->sysReadNumEntry( theKey, def, ok );
+ return d->sysReadNumEntry( groupKey( group(), key ), def, ok );
#endif
- QString value = readEntry( theKey, QString::number( def ), ok );
+ QString value = readEntry( key, QString::number( def ), ok );
bool conv_ok;
int retval = value.toInt( &conv_ok );
if ( conv_ok )
return retval;
if ( ! value.isEmpty() )
qWarning( "QSettings::readNumEntry: '%s' is not a number",
value.latin1() );
if ( ok )
*ok = FALSE;
return def;
}
/*!
\fn QString QSettings::readEntry(const QString &key, const QString &def, bool *ok ) const
Reads the entry specified by \a key, and returns a QString, or the
default value, \a def, if the entry couldn't be read.
If \a ok is non-null, *ok is set to TRUE if the key was read, FALSE
otherwise.
\sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry()
*/
/*!
\internal
*/
QString QSettings::readEntry(const QString &key, const QString &def, bool *ok )
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::readEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
if ( ok )
*ok = FALSE;
return def;
}
QString theKey = groupKey( group(), key );
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
return d->sysReadEntry( theKey, def, ok );
#endif
if ( ok ) // no, everything is not ok
*ok = FALSE;
QString realkey;
if (theKey[0] == '/') {
// parse our key
QStringList list(QStringList::split('/', theKey));
if (list.count() < 2) {
#ifdef QT_CHECK_STATE
qWarning("QSettings::readEntry: invalid key '%s'", theKey.latin1());
#endif // QT_CHECK_STATE
if ( ok )
*ok = FALSE;
return def;
}
if (list.count() == 2) {
d->heading = list[0];
d->group = "General";
realkey = list[1];
} else {
d->heading = list[0];
d->group = list[1];
// remove the group from the list
list.remove(list.at(1));
// remove the heading from the list
list.remove(list.at(0));
realkey = list.join("/");
}
} else
realkey = theKey;
QSettingsGroup grp = d->readGroup();
- QString retval = grp[realkey];
- if ( retval.isNull() )
- retval = def;
- else if ( ok ) // everything is ok
- *ok = TRUE;
+ QSettingsGroup::const_iterator it = grp.find( realkey ), end = grp.end();
+ QString retval = def;
+ if ( it != end ) {
+ // found the value we needed
+ retval = *it;
+ if ( ok ) *ok = TRUE;
+ }
return retval;
}
#if !defined(Q_NO_BOOL_TYPE)
/*!
Writes the boolean entry \a value into key \a key. The \a key is
created if it doesn't exist. Any previous value is overwritten by \a
value.
If an error occurs the settings are left unchanged and FALSE is
returned; otherwise TRUE is returned.
\sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry()
*/
bool QSettings::writeEntry(const QString &key, bool value)
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::writeEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
return FALSE;
}
- QString theKey = groupKey( group(), key );
-
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
- return d->sysWriteEntry( theKey, value );
+ return d->sysWriteEntry( groupKey( group(), key ), value );
#endif
QString s(value ? "true" : "false");
- return writeEntry(theKey, s);
+ return writeEntry(key, s);
}
#endif
/*!
\overload
Writes the double entry \a value into key \a key. The \a key is
created if it doesn't exist. Any previous value is overwritten by \a
value.
If an error occurs the settings are left unchanged and FALSE is
returned; otherwise TRUE is returned.
\sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry()
*/
bool QSettings::writeEntry(const QString &key, double value)
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::writeEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
return FALSE;
}
- QString theKey = groupKey( group(), key );
-
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
- return d->sysWriteEntry( theKey, value );
+ return d->sysWriteEntry( groupKey( group(), key ), value );
#endif
QString s(QString::number(value));
- return writeEntry(theKey, s);
+ return writeEntry(key, s);
}
/*!
\overload
Writes the integer entry \a value into key \a key. The \a key is
created if it doesn't exist. Any previous value is overwritten by \a
value.
If an error occurs the settings are left unchanged and FALSE is
returned; otherwise TRUE is returned.
\sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry()
*/
bool QSettings::writeEntry(const QString &key, int value)
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::writeEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
return FALSE;
}
- QString theKey = groupKey( group(), key );
-
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
- return d->sysWriteEntry( theKey, value );
+ return d->sysWriteEntry( groupKey( group(), key ), value );
#endif
QString s(QString::number(value));
- return writeEntry(theKey, s);
+ return writeEntry(key, s);
}
/*!
\internal
Writes the entry specified by \a key with the string-literal \a value,
replacing any previous setting. If \a value is zero-length or null, the
entry is replaced by an empty setting.
\e NOTE: This function is provided because some compilers use the
writeEntry (const QString &, bool) overload for this code:
writeEntry ("/foo/bar", "baz")
If an error occurs, this functions returns FALSE and the object is left
unchanged.
\sa readEntry(), removeEntry()
*/
bool QSettings::writeEntry(const QString &key, const char *value)
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::writeEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
return FALSE;
}
- QString theKey = groupKey( group(), key );
-
- return writeEntry(theKey, QString(value));
+ return writeEntry(key, QString(value));
}
/*!
\overload
Writes the string entry \a value into key \a key. The \a key is
created if it doesn't exist. Any previous value is overwritten by \a
value. If \a value is an empty string or a null string the key's
value will be an empty string.
If an error occurs the settings are left unchanged and FALSE is
returned; otherwise TRUE is returned.
\sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry()
*/
bool QSettings::writeEntry(const QString &key, const QString &value)
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::writeEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
return FALSE;
}
QString theKey = groupKey( group(), key );
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
return d->sysWriteEntry( theKey, value );
#endif
// NOTE: we *do* allow value to be a null/empty string
QString realkey;
if (theKey[0] == '/') {
// parse our key
QStringList list(QStringList::split('/', theKey));
if (list.count() < 2) {
#ifdef QT_CHECK_STATE
qWarning("QSettings::writeEntry: invalid key '%s'", theKey.latin1());
#endif // QT_CHECK_STATE
return FALSE;
}
if (list.count() == 2) {
d->heading = list[0];
d->group = "General";
realkey = list[1];
} else {
@@ -1394,58 +1448,58 @@ bool QSettings::writeEntry(const QString &key, const QString &value)
// remove the group from the list
list.remove(list.at(1));
// remove the heading from the list
list.remove(list.at(0));
realkey = list.join("/");
}
} else
realkey = theKey;
d->writeGroup(realkey, value);
return TRUE;
}
/*!
Removes the entry specified by \a key.
Returns TRUE if the entry existed and was removed; otherwise returns FALSE.
\sa readEntry(), writeEntry()
*/
bool QSettings::removeEntry(const QString &key)
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::removeEntry: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
return FALSE;
}
QString theKey = groupKey( group(), key );
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
return d->sysRemoveEntry( theKey );
#endif
QString realkey;
if (theKey[0] == '/') {
// parse our key
QStringList list(QStringList::split('/', theKey));
if (list.count() < 2) {
#ifdef QT_CHECK_STATE
qWarning("QSettings::removeEntry: invalid key '%s'", theKey.latin1());
#endif // QT_CHECK_STATE
return FALSE;
}
if (list.count() == 2) {
d->heading = list[0];
d->group = "General";
realkey = list[1];
} else {
d->heading = list[0];
@@ -1473,272 +1527,295 @@ bool QSettings::removeEntry(const QString &key)
Example settings:
\code
/MyCompany/MyApplication/background color
/MyCompany/MyApplication/foreground color
/MyCompany/MyApplication/geometry/x
/MyCompany/MyApplication/geometry/y
/MyCompany/MyApplication/geometry/width
/MyCompany/MyApplication/geometry/height
\endcode
\code
QStringList keys = entryList( "/MyCompany/MyApplication" );
\endcode
\c keys contains 'background color' and 'foreground color'. It does
not contain 'geometry' because this key contains keys not entries.
To access the geometry values could either use subkeyList() to read
the keys and then read each entry, or simply read each entry
directly by specifying its full key, e.g.
"/MyCompany/MyApplication/geometry/y".
\sa subkeyList()
*/
QStringList QSettings::entryList(const QString &key) const
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::entryList: Invalid key: %s", key.isNull() ? "(null)" : key.latin1() );
#endif
return QStringList();
}
QString theKey = groupKey( group(), key );
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
return d->sysEntryList( theKey );
#endif
QString realkey;
if (theKey[0] == '/') {
// parse our key
QStringList list(QStringList::split('/', theKey));
if (list.count() < 1) {
#ifdef QT_CHECK_STATE
qWarning("QSettings::listEntries: invalid key '%s'", theKey.latin1());
#endif // QT_CHECK_STATE
return QStringList();
}
if (list.count() == 1) {
d->heading = list[0];
d->group = "General";
} else {
d->heading = list[0];
d->group = list[1];
// remove the group from the list
list.remove(list.at(1));
// remove the heading from the list
list.remove(list.at(0));
realkey = list.join("/");
}
} else
realkey = theKey;
QSettingsGroup grp = d->readGroup();
QSettingsGroup::Iterator it = grp.begin();
QStringList ret;
QString itkey;
while (it != grp.end()) {
itkey = it.key();
- it++;
+ ++it;
if ( realkey.length() > 0 ) {
if ( itkey.left( realkey.length() ) != realkey )
continue;
else
itkey.remove( 0, realkey.length() + 1 );
}
if ( itkey.find( '/' ) != -1 )
continue;
ret << itkey;
}
return ret;
}
/*!
Returns a list of the keys which contain keys under \a key. Does \e
not return any keys that contain entries.
Example settings:
\code
/MyCompany/MyApplication/background color
/MyCompany/MyApplication/foreground color
/MyCompany/MyApplication/geometry/x
/MyCompany/MyApplication/geometry/y
/MyCompany/MyApplication/geometry/width
/MyCompany/MyApplication/geometry/height
/MyCompany/MyApplication/recent files/1
/MyCompany/MyApplication/recent files/2
/MyCompany/MyApplication/recent files/3
\endcode
\code
QStringList keys = subkeyList( "/MyCompany/MyApplication" );
\endcode
\c keys contains 'geometry' and 'recent files'. It does not contain
'background color' or 'foreground color' because they are keys which
contain entries not keys. To get a list of keys that have values
rather than subkeys use entryList().
\sa entryList()
*/
QStringList QSettings::subkeyList(const QString &key) const
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::subkeyList: Invalid key: %s", key.isNull() ? "(null)" : key.latin1() );
#endif
return QStringList();
}
QString theKey = groupKey( group(), key );
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
return d->sysSubkeyList( theKey );
#endif
QString realkey;
+ int subkeycount = 2;
if (theKey[0] == '/') {
// parse our key
QStringList list(QStringList::split('/', theKey));
if (list.count() < 1) {
#ifdef QT_CHECK_STATE
qWarning("QSettings::subkeyList: invalid key '%s'", theKey.latin1());
#endif // QT_CHECK_STATE
return QStringList();
}
+ subkeycount = list.count();
+
if (list.count() == 1) {
d->heading = list[0];
d->group = "General";
} else {
d->heading = list[0];
d->group = list[1];
// remove the group from the list
list.remove(list.at(1));
// remove the heading from the list
list.remove(list.at(0));
realkey = list.join("/");
}
+
} else
realkey = theKey;
+ QStringList ret;
+ if ( subkeycount == 1 ) {
+ QMap<QString,QSettingsHeading>::Iterator it = d->headings.begin();
+ while ( it != d->headings.end() ) {
+ if ( it.key() != "General" && ! ret.contains( it.key() ) )
+ ret << it.key();
+ ++it;
+ }
+
+ return ret;
+ }
+
QSettingsGroup grp = d->readGroup();
QSettingsGroup::Iterator it = grp.begin();
- QStringList ret;
QString itkey;
while (it != grp.end()) {
itkey = it.key();
- it++;
+ ++it;
if ( realkey.length() > 0 ) {
if ( itkey.left( realkey.length() ) != realkey )
continue;
else
itkey.remove( 0, realkey.length() + 1 );
}
int slash = itkey.find( '/' );
if ( slash == -1 )
continue;
itkey.truncate( slash );
if ( ! ret.contains( itkey ) )
ret << itkey;
}
return ret;
}
/*!
\internal
This function returns the time of last modification for \a key.
*/
QDateTime QSettings::lastModficationTime(const QString &key)
{
- if ( !verifyKey( key ) ) {
+ if ( !qt_verify_key( key ) ) {
#if defined(QT_CHECK_STATE)
qWarning( "QSettings::lastModficationTime: Invalid key: '%s'", key.isNull() ? "(null)" : key.latin1() );
#endif
return QDateTime();
}
QString theKey = groupKey( group(), key );
-#if defined(Q_WS_WIN) || defined(Q_OS_MAC)
+#if !defined(QWS) && (defined(Q_WS_WIN) || defined(Q_OS_MAC))
if ( d->sysd )
return QDateTime();
#endif
if (theKey[0] == '/') {
// parse our key
QStringList list(QStringList::split('/', theKey));
if (list.count() < 2) {
#ifdef QT_CHECK_STATE
qWarning("QSettings::lastModficationTime: invalid key '%s'", theKey.latin1());
#endif // QT_CHECK_STATE
return QDateTime();
}
if (list.count() == 2) {
d->heading = list[0];
d->group = "General";
} else {
d->heading = list[0];
d->group = list[1];
}
}
return d->modificationTime();
}
/*!
\overload
Writes the string list entry \a value into key \a key. The \a key
is created if it doesn't exist. Any previous value is overwritten
by \a value. The list is stored as a sequence of strings separated
- by \a separator, so none of the strings in the list should contain
- the separator. If the list is empty or null the key's value will
- be an empty string.
+ by \a separator (using QStringList::join()), so none of the
+ strings in the list should contain the separator. If the list is
+ empty or null the key's value will be an empty string.
+
+ \warning The list should not contain empty or null strings, as
+ readListEntry() will use QStringList::split() to recreate the
+ list. As the documentation states, QStringList::split() will omit
+ empty strings from the list. Because of this, it is impossible to
+ retrieve identical list data that is stored with this function.
+ We recommend using the writeEntry() and readListEntry() overloads
+ that do not take a \a separator argument.
If an error occurs the settings are left unchanged and FALSE is
returned; otherwise returns TRUE.
\sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry()
*/
bool QSettings::writeEntry(const QString &key, const QStringList &value,
const QChar &separator)
{
QString s(value.join(separator));
return writeEntry(key, s);
}
/*!
\overload
Writes the string list entry \a value into key \a key. The \a key
is created if it doesn't exist. Any previous value is overwritten
by \a value.
If an error occurs the settings are left unchanged and FALSE is
returned; otherwise returns TRUE.
\sa readListEntry(), readNumEntry(), readDoubleEntry(), readBoolEntry(), removeEntry()
@@ -1747,48 +1824,55 @@ bool QSettings::writeEntry(const QString &key, const QStringList &value)
{
QString s;
for (QStringList::ConstIterator it=value.begin(); it!=value.end(); ++it) {
QString el = *it;
if ( el.isNull() ) {
el = "^0";
} else {
el.replace("^", "^^");
}
s+=el;
s+="^e"; // end of element
}
return writeEntry(key, s);
}
/*!
\overload QStringList QSettings::readListEntry(const QString &key, const QChar &separator, bool *ok ) const
Reads the entry specified by \a key as a string. The \a separator
is used to create a QStringList by calling QStringList::split(\a
separator, entry). If \a ok is not 0: \a *ok is set to TRUE if the
key was read, otherwise \a *ok is set to FALSE.
+ \warning As the documentation states, QStringList::split() will
+ omit empty strings from the list. Because of this, it is
+ impossible to retrieve identical list data with this function. We
+ recommend using the readListEntry() and writeEntry() overloads
+ that do not take a \a separator argument.
+
+
Note that if you want to iterate over the list, you should iterate
over a copy, e.g.
\code
QStringList list = mySettings.readListEntry( "size", " " );
QStringList::Iterator it = list.begin();
while( it != list.end() ) {
myProcessing( *it );
++it;
}
\endcode
\sa readEntry(), readDoubleEntry(), readBoolEntry(), writeEntry(), removeEntry(), QStringList::split()
*/
/*!
\internal
*/
QStringList QSettings::readListEntry(const QString &key, const QChar &separator, bool *ok )
{
QString value = readEntry( key, QString::null, ok );
if ( ok && !*ok )
return QStringList();
return QStringList::split(separator, value);
@@ -1826,130 +1910,151 @@ QStringList QSettings::readListEntry(const QString &key, bool *ok )
QString s;
bool esc=FALSE;
for (int i=0; i<(int)value.length(); i++) {
if ( esc ) {
if ( value[i] == 'e' ) { // end-of-string
l.append(s);
s="";
} else if ( value[i] == '0' ) { // null string
s=QString::null;
} else {
s.append(value[i]);
}
esc=FALSE;
} else if ( value[i] == '^' ) {
esc = TRUE;
} else {
s.append(value[i]);
if ( i == (int)value.length()-1 )
l.append(s);
}
}
return l;
}
+#ifdef Q_OS_MAC
+void qt_setSettingsBasePath(const QString &); //qsettings_mac.cpp
+#endif
+
/*!
- Insert platform-dependent paths from platform-independent information.
+ Insert platform-dependent paths from platform-independent information.
+
+ The \a domain should be an Internet domain name
+ controlled by the producer of the software, eg. Trolltech products
+ use "trolltech.com".
- The \a domain should be an Internet domain name
- controlled by the producer of the software, eg. Trolltech products
- use "trolltech.com".
+ The \a product should be the official name of the product.
- The \a product should be the official name of the product.
+ The \a scope should be
+ QSettings::User for user-specific settings, or
+ QSettings::Global for system-wide settings (generally
+ these will be read-only to many users).
- The \a scope should be
- QSettings::User for user-specific settings, or
- QSettings::Global for system-wide settings (generally
- these will be read-only to many users).
+ Not all information is relevant on all systems (e.g. scoping is
+ currently used only if QSettings accesses the Windows registry).
*/
void QSettings::setPath( const QString &domain, const QString &product, Scope scope )
{
// On Windows, any trailing ".com(\..*)" is stripped from the domain. The
// Global scope corresponds to HKEY_LOCAL_MACHINE, and User corresponds to
// HKEY_CURRENT_USER. Note that on some installations, not all users can
// write to the Global scope. On UNIX, any trailing ".com(\..*)" is stripped
// from the domain. The Global scope corresponds to "/opt" (this would be
// configurable at library build time - eg. to "/usr/local" or "/usr"),
// while the User scope corresponds to $HOME/.*rc.
// Note that on most installations, not all users can write to the System
// scope.
-//
+//
// On MacOS X, if there is no "." in domain, append ".com", then reverse the
// order of the elements (Mac OS uses "com.apple.finder" as domain+product).
// The Global scope corresponds to /Library/Preferences/*.plist, while the
// User scope corresponds to ~/Library/Preferences/*.plist.
// Note that on most installations, not all users can write to the System
// scope.
+ d->globalScope = scope == Global;
+
QString actualSearchPath;
int lastDot = domain.findRev( '.' );
#if defined(Q_WS_WIN)
actualSearchPath = "/" + domain.mid( 0, lastDot ) + "/" + product;
insertSearchPath( Windows, actualSearchPath );
-#elif defined(Q_WS_MAC)
+#elif !defined(QWS) && defined(Q_OS_MAC)
QString topLevelDomain = domain.right( domain.length() - lastDot - 1 ) + ".";
- if ( topLevelDomain.isEmpty() )
- topLevelDomain = "com.";
- actualSearchPath = "/" + topLevelDomain + domain.left( lastDot ) + product;
+ if ( !topLevelDomain.isEmpty() )
+ qt_setSettingsBasePath( topLevelDomain );
+ actualSearchPath = "/" + domain.left( lastDot ) + product;
insertSearchPath( Mac, actualSearchPath );
#else
actualSearchPath = "/" + domain.mid( 0, lastDot ) + "/" + product;
insertSearchPath( Unix, actualSearchPath );
#endif
-
- d->globalScope = scope == Global;
}
/*!
Appends \a group to the current key prefix.
+
+ \code
+ QSettings settings;
+ settings.beginGroup( "/MainWindow" );
+ // read values
+ settings.endGroup();
+ \endcode
*/
void QSettings::beginGroup( const QString &group )
{
d->groupStack.push( group );
d->groupDirty = TRUE;
}
/*!
Undo previous calls to beginGroup(). Note that a single beginGroup("a/b/c") is undone
by a single call to endGroup().
+
+ \code
+ QSettings settings;
+ settings.beginGroup( "/MainWindow/Geometry" );
+ // read values
+ settings.endGroup();
+ \endcode
*/
void QSettings::endGroup()
{
d->groupStack.pop();
d->groupDirty = TRUE;
}
/*!
Set the current key prefix to the empty string.
*/
void QSettings::resetGroup()
{
d->groupStack.clear();
d->groupDirty = FALSE;
d->groupPrefix = QString::null;
}
/*!
Returns the current key prefix, or a null string if there is no key prefix set.
\sa beginGroup();
*/
QString QSettings::group() const
{
if ( d->groupDirty ) {
d->groupDirty = FALSE;
d->groupPrefix = QString::null;
QValueStack<QString>::Iterator it = d->groupStack.begin();
while ( it != d->groupStack.end() ) {
QString group = *it;
++it;
if ( group[0] != '/' )
- group = "/" + group;
+ group.prepend( "/" );
d->groupPrefix += group;
}
}
return d->groupPrefix;
}
#endif
diff --git a/qmake/tools/qstring.cpp b/qmake/tools/qstring.cpp
index 56df62b..7f1fac3 100644
--- a/qmake/tools/qstring.cpp
+++ b/qmake/tools/qstring.cpp
@@ -1,85 +1,89 @@
/****************************************************************************
** $Id$
**
** Implementation of the QString class and related Unicode functions
**
** Created : 920722
**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
+** Copyright (C) 1992-2002 Trolltech AS. All rights reserved.
**
** This file is part of the tools module of the Qt GUI Toolkit.
**
** This file may be distributed under the terms of the Q Public License
** as defined by Trolltech AS of Norway and appearing in the file
** LICENSE.QPL included in the packaging of this file.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses may use this file in accordance with the Qt Commercial License
** Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/qpl/ for QPL licensing information.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
// Don't define it while compiling this module, or USERS of Qt will
// not be able to link.
#ifdef QT_NO_CAST_ASCII
#undef QT_NO_CAST_ASCII
#endif
#include "qstring.h"
#include "qregexp.h"
#include "qdatastream.h"
#ifndef QT_NO_TEXTCODEC
#include "qtextcodec.h"
#endif
-#include <ctype.h>
#include <limits.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include <string.h>
#if defined(Q_WS_WIN)
#include "qt_windows.h"
#endif
#if !defined( QT_NO_COMPONENT ) && !defined( QT_LITE_COMPONENT )
#include "qcleanuphandler.h"
#endif
+#ifdef QT_NO_UNICODETABLES
+# include <ctype.h>
+#endif
+
/* -------------------------------------------------------------------------
* unicode information
* these tables are generated from the unicode reference file
* ftp://ftp.unicode.org/Public/3.2-Update/UnicodeData.txt
*
* Lars
* -------------------------------------------------------------------------
*/
/* Perl script to generate (run perl -x tools/qstring.cpp)
#!perl
sub numberize
{
my(%r, $n, $id);
for $id ( @_ ) {
$i = $id;
$i="" if $i eq "EMPTY";
$r{$i}=$n++;
}
return %r;
}
@@ -11766,60 +11770,62 @@ static inline QChar upper( const QChar &c )
#ifndef QT_NO_UNICODETABLES
uchar row = c.row();
uchar cell = c.cell();
if ( unicode_info[row][cell] != QChar::Letter_Lowercase )
return c;
Q_UINT16 upper = *(case_info[row]+cell);
if ( upper == 0 )
return c;
return upper;
#else
if ( c.row() )
return c;
else
return QChar( toupper((uchar) c.latin1()) );
#endif
}
static inline QChar::Direction direction( const QChar &c )
{
#ifndef QT_NO_UNICODETABLES
const Q_UINT8 *rowp = direction_info[c.row()];
if(!rowp) return QChar::DirL;
return (QChar::Direction) ( *(rowp+c.cell()) & 0x1f );
#else
+ Q_UNUSED(c);
return QChar::DirL;
#endif
}
static inline bool mirrored( const QChar &c )
{
#ifndef QT_NO_UNICODETABLES
const Q_UINT8 *rowp = direction_info[c.row()];
if ( !rowp )
return FALSE;
return *(rowp+c.cell())>128;
#else
+ Q_UNUSED(c);
return FALSE;
#endif
}
#ifndef QT_NO_UNICODETABLES
static const Q_UINT16 symmetricPairs[] = {
0x0028, 0x0029, 0x003C, 0x003E, 0x005B, 0x005D, 0x007B, 0x007D,
0x00AB, 0x00BB, 0x2039, 0x203A, 0x2045, 0x2046, 0x207D, 0x207E,
0x208D, 0x208E, 0x2208, 0x220B, 0x2209, 0x220C, 0x220A, 0x220D,
0x2215, 0x29F5, 0x223C, 0x223D, 0x2243, 0x22CD, 0x2252, 0x2253,
0x2254, 0x2255, 0x2264, 0x2265, 0x2266, 0x2267, 0x2268, 0x2269,
0x226A, 0x226B, 0x226E, 0x226F, 0x2270, 0x2271, 0x2272, 0x2273,
0x2274, 0x2275, 0x2276, 0x2277, 0x2278, 0x2279, 0x227A, 0x227B,
0x227C, 0x227D, 0x227E, 0x227F, 0x2280, 0x2281, 0x2282, 0x2283,
0x2284, 0x2285, 0x2286, 0x2287, 0x2288, 0x2289, 0x228A, 0x228B,
0x228F, 0x2290, 0x2291, 0x2292, 0x2298, 0x29B8, 0x22A2, 0x22A3,
0x22A6, 0x2ADE, 0x22A8, 0x2AE4, 0x22A9, 0x2AE3, 0x22AB, 0x2AE5,
0x22B0, 0x22B1, 0x22B2, 0x22B3, 0x22B4, 0x22B5, 0x22B6, 0x22B7,
0x22C9, 0x22CA, 0x22CB, 0x22CC, 0x22D0, 0x22D1, 0x22D6, 0x22D7,
0x22D8, 0x22D9, 0x22DA, 0x22DB, 0x22DC, 0x22DD, 0x22DE, 0x22DF,
0x22E0, 0x22E1, 0x22E2, 0x22E3, 0x22E4, 0x22E5, 0x22E6, 0x22E7,
0x22E8, 0x22E9, 0x22EA, 0x22EB, 0x22EC, 0x22ED, 0x22F0, 0x22F1,
0x22F2, 0x22FA, 0x22F3, 0x22FB, 0x22F4, 0x22FC, 0x22F6, 0x22FD,
0x22F7, 0x22FE, 0x2308, 0x2309, 0x230A, 0x230B, 0x2329, 0x232A,
@@ -11879,49 +11885,49 @@ static int ucstrcmp( const QString &as, const QString &bs )
static int ucstrncmp( const QChar *a, const QChar *b, int l )
{
while ( l-- && *a == *b )
a++,b++;
if ( l==-1 )
return 0;
return a->unicode() - b->unicode();
}
static int ucstrnicmp( const QChar *a, const QChar *b, int l )
{
while ( l-- && ::lower( *a ) == ::lower( *b ) )
a++,b++;
if ( l==-1 )
return 0;
return ::lower( *a ).unicode() - ::lower( *b ).unicode();
}
static uint computeNewMax( uint len )
{
uint newMax = 4;
while ( newMax < len )
newMax *= 2;
- // try to spare some memory
+ // try to save some memory
if ( newMax >= 1024 * 1024 && len <= newMax - (newMax >> 2) )
newMax -= newMax >> 2;
return newMax;
}
/*!
\class QCharRef qstring.h
\reentrant
\brief The QCharRef class is a helper class for QString.
\ingroup text
When you get an object of type QCharRef, if you can assign to it,
the assignment will apply to the character in the string from
which you got the reference. That is its whole purpose in life.
The QCharRef becomes invalid once modifications are made to the
string: if you want to keep the character, copy it into a QChar.
Most of the QChar member functions also exist in QCharRef.
However, they are not explicitly documented here.
\sa QString::operator[]() QString::at() QChar
*/
@@ -12870,152 +12876,152 @@ void QString::compose()
cindex++;
index++;
}
*this = composed;
#endif
}
// These macros are used for efficient allocation of QChar strings.
// IMPORTANT! If you change these, make sure you also change the
// "delete unicode" statement in ~QStringData() in qstring.h correspondingly!
#define QT_ALLOC_QCHAR_VEC( N ) (QChar*) new char[ sizeof(QChar)*( N ) ]
#define QT_DELETE_QCHAR_VEC( P ) delete[] ((char*)( P ))
/*!
This utility function converts the 8-bit string \a ba to Unicode,
returning the result.
The caller is responsible for deleting the return value with
delete[].
*/
-QChar* QString::asciiToUnicode( const QByteArray& ba, uint* len )
+QChar* QString::latin1ToUnicode( const QByteArray& ba, uint* len )
{
if ( ba.isNull() ) {
*len = 0;
return 0;
}
int l = 0;
while ( l < (int)ba.size() && ba[l] )
l++;
char* str = ba.data();
QChar *uc = new QChar[ l ]; // Can't use macro, since function is public
QChar *result = uc;
if ( len )
*len = l;
while (l--)
*uc++ = *str++;
return result;
}
-static QChar* internalAsciiToUnicode( const QByteArray& ba, uint* len )
+static QChar* internalLatin1ToUnicode( const QByteArray& ba, uint* len )
{
if ( ba.isNull() ) {
*len = 0;
return 0;
}
int l = 0;
while ( l < (int)ba.size() && ba[l] )
l++;
char* str = ba.data();
QChar *uc = QT_ALLOC_QCHAR_VEC( l );
QChar *result = uc;
if ( len )
*len = l;
while (l--)
*uc++ = *str++;
return result;
}
/*!
\overload
This utility function converts the '\0'-terminated 8-bit string \a
str to Unicode, returning the result and setting \a *len to the
length of the Unicode string.
The caller is responsible for deleting the return value with
delete[].
*/
-QChar* QString::asciiToUnicode( const char *str, uint* len, uint maxlen )
+QChar* QString::latin1ToUnicode( const char *str, uint* len, uint maxlen )
{
QChar* result = 0;
uint l = 0;
if ( str ) {
if ( maxlen != (uint)-1 ) {
while ( l < maxlen && str[l] )
l++;
} else {
// Faster?
- l = qstrlen(str);
+ l = strlen( str );
}
QChar *uc = new QChar[ l ]; // Can't use macro since function is public
result = uc;
uint i = l;
while ( i-- )
*uc++ = *str++;
}
if ( len )
*len = l;
return result;
}
-static QChar* internalAsciiToUnicode( const char *str, uint* len,
+static QChar* internalLatin1ToUnicode( const char *str, uint* len,
uint maxlen = (uint)-1 )
{
QChar* result = 0;
uint l = 0;
if ( str ) {
if ( maxlen != (uint)-1 ) {
while ( l < maxlen && str[l] )
l++;
} else {
// Faster?
- l = qstrlen(str);
+ l = strlen( str );
}
QChar *uc = QT_ALLOC_QCHAR_VEC( l );
result = uc;
uint i = l;
while ( i-- )
*uc++ = *str++;
}
if ( len )
*len = l;
return result;
}
/*!
This utility function converts \a l 16-bit characters from \a uc
to ASCII, returning a '\0'-terminated string.
The caller is responsible for deleting the resultant string with
delete[].
*/
-char* QString::unicodeToAscii(const QChar *uc, uint l)
+char* QString::unicodeToLatin1(const QChar *uc, uint l)
{
if (!uc) {
return 0;
}
char *a = new char[l+1];
char *result = a;
while (l--) {
*a++ = (uc->unicode() > 0xff) ? '?' : (char)uc->unicode();
uc++;
}
*a = '\0';
return result;
}
/*****************************************************************************
QString member functions
*****************************************************************************/
/*!
\class QString qstring.h
\reentrant
\brief The QString class provides an abstraction of Unicode text
and the classic C '\0'-terminated char array.
@@ -13136,143 +13142,116 @@ char* QString::unicodeToAscii(const QChar *uc, uint l)
Matching is case-insensitive unless \c CaseSensitive is set. \c
CaseSensitive may be OR-ed with any combination of the other
flags.
*/
Q_EXPORT QStringData *QString::shared_null = 0;
QT_STATIC_CONST_IMPL QString QString::null;
QT_STATIC_CONST_IMPL QChar QChar::null;
QT_STATIC_CONST_IMPL QChar QChar::replacement((ushort)0xfffd);
QT_STATIC_CONST_IMPL QChar QChar::byteOrderMark((ushort)0xfeff);
QT_STATIC_CONST_IMPL QChar QChar::byteOrderSwapped((ushort)0xfffe);
QT_STATIC_CONST_IMPL QChar QChar::nbsp((ushort)0x00a0);
QStringData* QString::makeSharedNull()
{
QString::shared_null = new QStringData;
#if defined( Q_OS_MAC )
QString *that = const_cast<QString *>(&QString::null);
that->d = QString::shared_null;
#endif
return QString::shared_null;
}
-// Uncomment this to get some useful statistics.
-// #define Q2HELPER(x) x
-
-#ifdef Q2HELPER
-static int stat_construct_charstar=0;
-static int stat_construct_charstar_size=0;
-static int stat_construct_null=0;
-static int stat_construct_int=0;
-static int stat_construct_int_size=0;
-static int stat_construct_ba=0;
-static int stat_get_ascii=0;
-static int stat_get_ascii_size=0;
-static int stat_copy_on_write=0;
-static int stat_copy_on_write_size=0;
-static int stat_fast_copy=0;
-Q_EXPORT void qt_qstring_stats()
-{
- qDebug("construct_charstar = %d (%d chars)", stat_construct_charstar, stat_construct_charstar_size);
- qDebug("construct_null = %d", stat_construct_null);
- qDebug("construct_int = %d (%d chars)", stat_construct_int, stat_construct_int_size);
- qDebug("construct_ba = %d", stat_construct_ba);
- qDebug("get_ascii = %d (%d chars)", stat_get_ascii, stat_get_ascii_size);
- qDebug("copy_on_write = %d (%d chars)", stat_copy_on_write, stat_copy_on_write_size);
- qDebug("fast_copy = %d", stat_fast_copy);
-}
-#else
-#define Q2HELPER(x)
-#endif
-
/*!
\fn QString::QString()
Constructs a null string, i.e. both the length and data pointer
are 0.
\sa isNull()
*/
/*!
Constructs a string of length one, containing the character \a ch.
*/
QString::QString( QChar ch )
{
d = new QStringData( QT_ALLOC_QCHAR_VEC( 1 ), 1, 1 );
d->unicode[0] = ch;
}
/*!
Constructs an implicitly shared copy of \a s. This is very fast
since it only involves incrementing a reference count.
*/
QString::QString( const QString &s ) :
d(s.d)
{
- Q2HELPER(stat_fast_copy++)
d->ref();
}
/*!
\internal
Private function.
Constructs a string with preallocated space for \a size characters.
The string is empty.
\sa isNull()
*/
QString::QString( int size, bool /*dummy*/ )
{
if ( size ) {
- Q2HELPER(stat_construct_int++)
int l = size;
- Q2HELPER(stat_construct_int_size+=l)
QChar* uc = QT_ALLOC_QCHAR_VEC( l );
d = new QStringData( uc, 0, l );
} else {
- Q2HELPER(stat_construct_null++)
d = shared_null ? shared_null : (shared_null=new QStringData);
d->ref();
}
}
/*!
Constructs a string that is a deep copy of \a ba interpreted as a
classic C string.
*/
QString::QString( const QByteArray& ba )
{
- Q2HELPER(stat_construct_ba++)
+#ifndef QT_NO_TEXTCODEC
+ if ( QTextCodec::codecForCStrings() ) {
+ d = 0;
+ *this = fromAscii( ba.data(), ba.size() );
+ return;
+ }
+#endif
uint l;
- QChar *uc = internalAsciiToUnicode(ba,&l);
+ QChar *uc = internalLatin1ToUnicode(ba,&l);
d = new QStringData(uc,l,l);
}
/*!
Constructs a string that is a deep copy of the first \a length
characters in the QChar array.
If \a unicode and \a length are 0, then a null string is created.
If only \a unicode is 0, the string is empty but has \a length
characters of space preallocated: QString expands automatically
anyway, but this may speed up some cases a little. We recommend
using the plain constructor and setLength() for this purpose since
it will result in more readable code.
\sa isNull() setLength()
*/
QString::QString( const QChar* unicode, uint length )
{
if ( !unicode && !length ) {
d = shared_null ? shared_null : makeSharedNull();
d->ref();
} else {
@@ -13281,146 +13260,181 @@ QString::QString( const QChar* unicode, uint length )
memcpy(uc, unicode, length*sizeof(QChar));
d = new QStringData(uc,unicode ? length : 0,length);
}
}
/*!
Constructs a string that is a deep copy of \a str, interpreted as
a classic C string.
If \a str is 0, then a null string is created.
This is a cast constructor, but it is perfectly safe: converting a
Latin1 const char* to QString preserves all the information. You
can disable this constructor by defining \c QT_NO_CAST_ASCII when
you compile your applications. You can also make QString objects
by using setLatin1(), fromLatin1(), fromLocal8Bit(), and
fromUtf8(). Or whatever encoding is appropriate for the 8-bit data
you have.
\sa isNull()
*/
QString::QString( const char *str )
{
- Q2HELPER(stat_construct_charstar++)
+#ifndef QT_NO_TEXTCODEC
+ if ( QTextCodec::codecForCStrings() ) {
+ d = 0;
+ *this = fromAscii( str );
+ return;
+ }
+#endif
+ uint l;
+ QChar *uc = internalLatin1ToUnicode(str,&l);
+ d = new QStringData(uc,l,l);
+}
+
+#ifndef QT_NO_STL
+/*!
+ Constructs a string that is a deep copy of \a str.
+
+ This is the same as fromAscii(\a str).
+*/
+
+QString::QString( const std::string &str )
+{
+#ifndef QT_NO_TEXTCODEC
+ if ( QTextCodec::codecForCStrings() ) {
+ d = 0;
+ *this = fromAscii( str.c_str() );
+ return;
+ }
+#endif
uint l;
- QChar *uc = internalAsciiToUnicode(str,&l);
- Q2HELPER(stat_construct_charstar_size+=l)
+ QChar *uc = internalLatin1ToUnicode(str.c_str(),&l);
d = new QStringData(uc,l,l);
}
+#endif
/*!
\fn QString::~QString()
Destroys the string and frees the string's data if this is the
last reference to the string.
*/
/*!
Deallocates any space reserved solely by this QString.
If the string does not share its data with another QString
instance, nothing happens; otherwise the function creates a new,
unique copy of this string. This function is called whenever the
string is modified.
*/
void QString::real_detach()
{
setLength( length() );
}
void QString::deref()
{
- if ( d->deref() ) {
+ if ( d && d->deref() ) {
if ( d != shared_null )
delete d;
- d = 0; // helps debugging
+ d = 0;
}
}
void QStringData::deleteSelf()
{
delete this;
}
/*!
\fn QString& QString::operator=( QChar c )
Sets the string to contain just the single character \a c.
*/
/*!
+ \fn QString& QString::operator=( const std::string& s )
+
+ \overload
+
+ Makes a deep copy of \a s and returns a reference to the deep
+ copy.
+*/
+
+/*!
\fn QString& QString::operator=( char c )
\overload
Sets the string to contain just the single character \a c.
*/
/*!
\overload
Assigns a shallow copy of \a s to this string and returns a
reference to this string. This is very fast because the string
isn't actually copied.
*/
QString &QString::operator=( const QString &s )
{
- Q2HELPER(stat_fast_copy++)
s.d->ref();
deref();
d = s.d;
return *this;
}
/*!
\overload
Assigns a deep copy of \a cs, interpreted as a classic C string,
to this string and returns a reference to this string.
*/
QString &QString::operator=( const QCString& cs )
{
- return setLatin1(cs);
+ return setAscii(cs);
}
/*!
\overload
Assigns a deep copy of \a str, interpreted as a classic C string
to this string and returns a reference to this string.
If \a str is 0, then a null string is created.
\sa isNull()
*/
QString &QString::operator=( const char *str )
{
- return setLatin1(str);
+ return setAscii(str);
}
/*!
\fn bool QString::isNull() const
Returns TRUE if the string is null; otherwise returns FALSE. A
null string is always empty.
\code
QString a; // a.unicode() == 0, a.length() == 0
a.isNull(); // TRUE, because a.unicode() == 0
a.isEmpty(); // TRUE
\endcode
\sa isEmpty(), length()
*/
/*!
\fn bool QString::isEmpty() const
Returns TRUE if the string is empty, i.e. if length() == 0;
otherwise returns FALSE. Null strings are also empty.
@@ -13450,122 +13464,118 @@ QString &QString::operator=( const char *str )
/*!
If \a newLen is less than the length of the string, then the
string is truncated at position \a newLen. Otherwise nothing
happens.
\code
QString s = "truncate me";
s.truncate( 5 ); // s == "trunc"
\endcode
\sa setLength()
*/
void QString::truncate( uint newLen )
{
if ( newLen < d->len )
setLength( newLen );
}
/*!
Ensures that at least \a newLen characters are allocated to the
string, and sets the length of the string to \a newLen. Any new
space allocated contains arbitrary data.
- If \a newLen is 0, then the string becomes empty, unless the
- string is null, in which case it remains null.
+ If \a newLen is 0, then the string becomes empty (non-null).
If it is not possible to allocate enough memory, the string
remains unchanged.
This function always detaches the string from other references to
the same data.
This function is useful for code that needs to build up a long
string and wants to avoid repeated reallocation. In this example,
we want to add to the string until some condition is true, and
we're fairly sure that size is big enough:
\code
QString result;
- int resultLength = 0;
- result.setLength( newLen ) // allocate some space
+ int len = 0;
+ result.setLength( maxLen ); // allocate some space
while ( ... ) {
- result[resultLength++] = ... // fill (part of) the space with data
+ result[len++] = ... // fill part of the space
}
- result.truncate[resultLength]; // and get rid of the undefined junk
+ result.truncate( len ); // and get rid of the rest
\endcode
If \a newLen is an underestimate, the worst that will happen is
that the loop will slow down.
\sa truncate(), isNull(), isEmpty(), length()
*/
void QString::setLength( uint newLen )
{
if ( d->count != 1 || newLen > d->maxl ||
( newLen * 4 < d->maxl && d->maxl > 4 ) ) {
// detach, grow or shrink
- Q2HELPER(stat_copy_on_write++)
- Q2HELPER(stat_copy_on_write_size+=d->len)
uint newMax = computeNewMax( newLen );
QChar* nd = QT_ALLOC_QCHAR_VEC( newMax );
if ( nd ) {
uint len = QMIN( d->len, newLen );
if ( d->unicode )
memcpy( nd, d->unicode, sizeof(QChar)*len );
deref();
d = new QStringData( nd, newLen, newMax );
}
} else {
d->len = newLen;
d->setDirty();
}
}
/*!
This function will return a string that replaces the lowest
numbered occurrence of \c %1, \c %2, ..., \c %9 with \a a.
The \a fieldwidth value specifies the minimum amount of space that
\a a is padded to. A positive value will produce right-aligned
text, whereas a negative value will produce left-aligned text.
+ The following example shows how we could create a 'status' string
+ when processing a list of files:
\code
- QString firstName( "Joe" );
- QString lastName( "Bloggs" );
- QString fullName;
- fullName = QString( "First name is '%1', last name is '%2'" )
- .arg( firstName )
- .arg( lastName );
-
- // fullName == First name is 'Joe', last name is 'Bloggs'
+ QString status = QString( "Processing file %1 of %2: %3" )
+ .arg( i ) // current file's number
+ .arg( total ) // number of files to process
+ .arg( fileName ); // current file's name
\endcode
- Note that using arg() to construct sentences as we've done in the
- example above does not usually translate well into other languages
- because sentence structure and word order often differ between
- languages.
+ It is generally fine to use filenames and numbers as we have done
+ in the example above. But note that using arg() to construct
+ natural language sentences does not usually translate well into
+ other languages because sentence structure and word order often
+ differ between languages.
If there is no place marker (\c %1 or \c %2, etc.), a warning
message (qWarning()) is output and the text is appended at the
end of the string. We recommend that the correct number of place
markers is always used in production code.
*/
QString QString::arg( const QString& a, int fieldwidth ) const
{
int pos, len;
QString r = *this;
if ( !findArg( pos, len ) ) {
qWarning( "QString::arg(): Argument missing: %s, %s",
latin1(), a.latin1() );
// Make sure the text at least appears SOMEWHERE
r += ' ';
pos = r.length();
len = 0;
}
r.replace( pos, len, a );
if ( fieldwidth < 0 ) {
QString s;
while ( (uint)-fieldwidth > a.length() ) {
@@ -13753,49 +13763,49 @@ bool QString::findArg( int& pos, int& len ) const
int x = ...;
QTextOStream( &str ) << s << " : " << x;
\endcode
For \link QObject::tr() translations,\endlink especially if the
strings contains more than one escape sequence, you should
consider using the arg() function instead. This allows the order
of the replacements to be controlled by the translator, and has
Unicode support.
\sa arg()
*/
#ifndef QT_NO_SPRINTF
QString &QString::sprintf( const char* cformat, ... )
{
va_list ap;
va_start( ap, cformat );
if ( !cformat || !*cformat ) {
// Qt 1.x compat
*this = fromLatin1( "" );
return *this;
}
- QString format = fromLatin1( cformat );
+ QString format = fromAscii( cformat );
QRegExp escape( "%#?0?-? ?\\+?'?[0-9*]*\\.?[0-9*]*h?l?L?q?Z?" );
QString result;
uint last = 0;
int pos;
int len = 0;
for (;;) {
pos = escape.search( format, last );
len = escape.matchedLength();
// Non-escaped text
if ( pos > (int)last )
result += format.mid( last, pos - last );
if ( pos < 0 ) {
// The rest
if ( last < format.length() )
result += format.mid( last );
break;
}
last = pos + len + 1;
// Escape
QString f = format.mid( pos, len );
uint width, decimals;
@@ -13892,49 +13902,49 @@ QString &QString::sprintf( const char* cformat, ... )
break;
case 1:
::sprintf( out, in, width, value );
break;
case 2:
::sprintf( out, in, width, decimals, value );
}
}
break;
case 'p':
{
void* value = va_arg( ap, void * );
switch ( params ) {
case 0:
::sprintf( out, in, value );
break;
case 1:
::sprintf( out, in, width, value );
break;
case 2:
::sprintf( out, in, width, decimals, value );
}
}
}
- replacement = fromLatin1( out );
+ replacement = fromAscii( out );
}
result += replacement;
}
*this = result;
va_end( ap );
return *this;
}
#endif
/*!
Fills the string with \a len characters of value \a c, and returns
a reference to the string.
If \a len is negative (the default), the current string length is
used.
\code
QString str;
str.fill( 'g', 5 ); // string == "ggggg"
\endcode
*/
QString& QString::fill( QChar c, int len )
@@ -14103,50 +14113,52 @@ static int bm_find( const QString &str, int index, const QString &pattern, uint
\overload
Finds the first occurrence of the string \a str, starting at
position \a index. If \a index is -1, the search starts at the
last character, if it is -2, at the next to last character and so
on. (See findRev() for searching backwards.)
If \a cs is TRUE, the search is case sensitive; otherwise the
search is case insensitive.
Returns the position of \a str or -1 if \a str could not be found.
*/
int QString::find( const QString& str, int index, bool cs ) const
{
const uint l = length();
const uint sl = str.length();
if ( index < 0 )
index += l;
if ( sl + index > l )
return -1;
if ( !sl )
return index;
+#ifndef MACOSX_101
if ( sl == 1 )
return find( *str.unicode(), index, cs );
+#endif
// we use the Boyer-Moore algorithm in cases where the overhead
// for the hash table should pay off, otherwise we use a simple
// hash function
if ( l > 500 && sl > 5 ) {
uint skiptable[0x100];
bm_init_skiptable( str, skiptable, cs );
return bm_find( *this, index, str, skiptable, cs );
}
/*
We use some hashing for efficiency's sake. Instead of
comparing strings, we compare the hash value of str with that of
a part of this QString. Only if that matches, we call ucstrncmp
or ucstrnicmp.
*/
const QChar* needle = str.unicode();
const QChar* haystack = unicode() + index;
const QChar* end = unicode() + (l-sl);
const uint sl_minus_1 = sl-1;
uint hashNeedle = 0, hashHaystack = 0, i;
if ( cs ) {
for ( i = 0; i < sl; ++i ) {
@@ -14200,102 +14212,108 @@ int QString::find( const QString& str, int index, bool cs ) const
Equivalent to find(QString(\a str), \a index).
*/
/*!
\overload
Finds the first occurrence of the character \a c, starting at
position \a index and searching backwards. If the index is -1, the
search starts at the last character, if it is -2, at the next to
last character and so on.
Returns the position of \a c or -1 if \a c could not be found.
If \a cs is TRUE, the search is case sensitive; otherwise the
search is case insensitive.
\code
QString string( "bananas" );
int i = string.findRev( 'a' ); // i == 5
\endcode
*/
int QString::findRev( QChar c, int index, bool cs ) const
{
+#ifdef MACOSX_101
+ return findRev( QString( c ), index, cs );
+#else
const uint l = length();
if ( index < 0 )
index += l;
if ( (uint)index >= l )
return -1;
const QChar *end = unicode();
register const QChar *uc = end + index;
if ( cs ) {
while ( uc >= end && *uc != c )
uc--;
} else {
c = ::lower( c );
while ( uc >= end && ::lower( *uc ) != c )
uc--;
}
return uc - end;
+#endif
}
/*!
\overload
Finds the first occurrence of the string \a str, starting at
position \a index and searching backwards. If the index is -1, the
search starts at the last character, if it is -2, at the next to
last character and so on.
Returns the position of \a str or -1 if \a str could not be found.
If \a cs is TRUE, the search is case sensitive; otherwise the
search is case insensitive.
\code
QString string("bananas");
int i = string.findRev( "ana" ); // i == 3
\endcode
*/
int QString::findRev( const QString& str, int index, bool cs ) const
{
/*
See QString::find() for explanations.
*/
const uint l = length();
if ( index < 0 )
index += l;
const uint sl = str.length();
int delta = l-sl;
if ( index < 0 || index > (int)l || delta < 0 )
return -1;
if ( index > delta )
index = delta;
+#ifndef MACOSX_101
if ( sl == 1 )
return findRev( *str.unicode(), index, cs );
+#endif
const QChar* needle = str.unicode();
const QChar* haystack = unicode() + index;
const QChar* end = unicode();
const uint sl_minus_1 = sl-1;
const QChar* n = needle+sl_minus_1;
const QChar* h = haystack+sl_minus_1;
uint hashNeedle = 0, hashHaystack = 0, i;
if ( cs ) {
for ( i = 0; i < sl; ++i ) {
hashNeedle = ((hashNeedle<<1) + (n-i)->unicode() );
hashHaystack = ((hashHaystack<<1) + (h-i)->unicode() );
}
hashHaystack -= haystack->unicode();
while ( haystack >= end ) {
hashHaystack += haystack->unicode();
if ( hashHaystack == hashNeedle
&& ucstrncmp( needle, haystack, sl ) == 0 )
return haystack-unicode();
--haystack;
REHASH( (haystack+sl)->unicode() );
}
@@ -14958,89 +14976,99 @@ QString QString::rightJustify( uint width, QChar fill, bool truncate ) const
if ( len )
memcpy( uc, unicode(), sizeof(QChar)*len );
} else {
if ( truncate )
result = left( width );
else
result = *this;
}
return result;
}
/*!
Returns a lowercase copy of the string.
\code
QString string( "TROlltECH" );
str = string.lower(); // str == "trolltech"
\endcode
\sa upper()
*/
QString QString::lower() const
{
- QString s(*this);
- int l=length();
- if ( l ) {
- s.real_detach(); // could do this only when we find a change
- register QChar *p=s.d->unicode;
- if ( p ) {
- while ( l-- ) {
+ int l = length();
+ register QChar *p = d->unicode;
+ while ( l ) {
+ if ( *p != ::lower(*p) ) {
+ QString s( *this );
+ s.real_detach();
+ p = s.d->unicode + ( p - d->unicode );
+ while ( l ) {
*p = ::lower( *p );
+ l--;
p++;
}
+ return s;
}
+ l--;
+ p++;
}
- return s;
+ return *this;
}
/*!
Returns an uppercase copy of the string.
\code
QString string( "TeXt" );
str = string.upper(); // t == "TEXT"
\endcode
\sa lower()
*/
QString QString::upper() const
{
- QString s(*this);
- int l=length();
- if ( l ) {
- s.real_detach(); // could do this only when we find a change
- register QChar *p=s.d->unicode;
- if ( p ) {
- while ( l-- ) {
+ int l = length();
+ register QChar *p = d->unicode;
+ while ( l ) {
+ if ( *p != ::upper(*p) ) {
+ QString s( *this );
+ s.real_detach();
+ p = s.d->unicode + ( p - d->unicode );
+ while ( l ) {
*p = ::upper( *p );
+ l--;
p++;
}
+ return s;
}
+ l--;
+ p++;
}
- return s;
+ return *this;
}
/*!
Returns a string that has whitespace removed from the start and
the end.
Whitespace means any character for which QChar::isSpace() returns
TRUE. This includes Unicode characters with decimal values 9
(TAB), 10 (LF), 11 (VT), 12 (FF), 13 (CR) and 32 (Space), and may
also include other Unicode characters.
\code
QString string = " white space ";
QString s = string.stripWhiteSpace(); // s == "white space"
\endcode
\sa simplifyWhiteSpace()
*/
QString QString::stripWhiteSpace() const
{
if ( isEmpty() ) // nothing to do
return *this;
@@ -15116,50 +15144,50 @@ QString QString::simplifyWhiteSpace() const
Inserts \a s into the string at position \a index.
If \a index is beyond the end of the string, the string is
extended with spaces to length \a index and \a s is then appended
and returns a reference to the string.
\code
QString string( "I like fish" );
str = string.insert( 2, "don't " );
// str == "I don't like fish"
\endcode
\sa remove(), replace()
*/
QString &QString::insert( uint index, const QString &s )
{
// the sub function takes care of &s == this case.
return insert( index, s.unicode(), s.length() );
}
/*!
\overload
- Inserts the character in \a s into the string at position \a index
- \a len number of times and returns a reference to the string.
+ Inserts the first \a len characters in \a s into the string at
+ position \a index and returns a reference to the string.
*/
QString &QString::insert( uint index, const QChar* s, uint len )
{
if ( len == 0 )
return *this;
uint olen = length();
int nlen = olen + len;
if ( s >= d->unicode && (uint)(s - d->unicode) < d->maxl ) {
// Part of me - take a copy.
QChar *tmp = QT_ALLOC_QCHAR_VEC( len );
memcpy(tmp,s,len*sizeof(QChar));
insert(index,tmp,len);
QT_DELETE_QCHAR_VEC( tmp );
return *this;
}
if ( index >= olen ) { // insert after end of string
setLength( len + index );
int n = index - olen;
QChar* uc = d->unicode+olen;
while (n--)
*uc++ = ' ';
@@ -15230,48 +15258,58 @@ QString &QString::insert( uint index, QChar c ) // insert char
/*!
\fn QString& QString::prepend( QChar ch )
\overload
Inserts \a ch at the beginning of the string and returns a
reference to the string.
Equivalent to insert(0, \a ch).
\sa insert()
*/
/*! \fn QString& QString::prepend( const QByteArray &s )
\overload
Inserts \a s at the beginning of the string and returns a reference to the string.
Equivalent to insert(0, \a s).
\sa insert()
*/
+/*! \fn QString& QString::prepend( const std::string &s )
+ \overload
+
+ Inserts \a s at the beginning of the string and returns a reference to the string.
+
+ Equivalent to insert(0, \a s).
+
+ \sa insert()
+ */
+
/*!
\overload
Inserts \a s at the beginning of the string and returns a reference to the string.
Equivalent to insert(0, \a s).
\sa insert()
*/
QString &QString::prepend( const char *s )
{
return insert( 0, QString(s) );
}
/*!
Removes \a len characters from the string starting at position \a
index, and returns a reference to the string.
If \a index is beyond the length of the string, nothing happens.
If \a index is within the string, but \a index + \a len is beyond
the end of the string, the string is truncated at position \a
index.
\code
@@ -15827,303 +15865,311 @@ int QString::contains( const QRegExp &rx ) const
#endif //QT_NO_REGEXP
static bool ok_in_base( QChar c, int base )
{
if ( base <= 10 )
return c.isDigit() && c.digitValue() < base;
else
return c.isDigit() || (c >= 'a' && c < char('a'+base-10))
|| (c >= 'A' && c < char('A'+base-10));
}
/*!
Returns the string converted to a \c long value to the base \a
base, which is 10 by default and must be between 2 and 36.
If \a ok is not 0: if a conversion error occurs, \a *ok is set to
FALSE; otherwise \a *ok is set to TRUE.
\sa number()
*/
long QString::toLong( bool *ok, int base ) const
{
const QChar *p = unicode();
- long val = 0;
+ ulong val = 0;
int l = length();
- const long max_mult = INT_MAX / base;
+ const ulong max_mult = LONG_MAX / base;
bool is_ok = FALSE;
int neg = 0;
if ( !p )
goto bye;
while ( l && p->isSpace() ) // skip leading space
l--,p++;
if ( !l )
goto bye;
if ( *p == '-' ) {
l--;
p++;
neg = 1;
} else if ( *p == '+' ) {
l--;
p++;
}
// NOTE: toULong() code is similar
if ( !l || !ok_in_base(*p,base) )
goto bye;
while ( l && ok_in_base(*p,base) ) {
l--;
int dv;
if ( p->isDigit() ) {
dv = p->digitValue();
} else {
if ( *p >= 'a' && *p <= 'z' )
dv = *p - 'a' + 10;
else
dv = *p - 'A' + 10;
}
if ( val > max_mult ||
- (val == max_mult && dv > (INT_MAX % base) + neg) )
+ (val == max_mult && dv > (LONG_MAX % base) + neg) )
goto bye;
val = base * val + dv;
p++;
}
- if ( neg )
- val = -val;
while ( l && p->isSpace() ) // skip trailing space
- l--,p++;
+ l--, p++;
if ( !l )
is_ok = TRUE;
bye:
if ( ok )
*ok = is_ok;
- return is_ok ? val : 0;
+ return is_ok ? ( neg ? -( (long) val ) : (long) val ) : 0L;
}
/*!
Returns the string converted to an \c {unsigned long} value to the
base \a base, which is 10 by default and must be between 2 and 36.
If \a ok is not 0: if a conversion error occurs, \a *ok is set to
FALSE; otherwise \a *ok is set to TRUE.
\sa number()
*/
ulong QString::toULong( bool *ok, int base ) const
{
const QChar *p = unicode();
ulong val = 0;
int l = length();
- const ulong max_mult = UINT_MAX / base;
+ const ulong max_mult = ULONG_MAX / base;
bool is_ok = FALSE;
if ( !p )
goto bye;
while ( l && p->isSpace() ) // skip leading space
l--,p++;
if ( !l )
goto bye;
if ( *p == '+' )
l--,p++;
// NOTE: toLong() code is similar
if ( !l || !ok_in_base(*p,base) )
goto bye;
while ( l && ok_in_base(*p,base) ) {
l--;
uint dv;
if ( p->isDigit() ) {
dv = p->digitValue();
} else {
if ( *p >= 'a' && *p <= 'z' )
dv = *p - 'a' + 10;
else
dv = *p - 'A' + 10;
}
- if ( val > max_mult || (val == max_mult && dv > UINT_MAX % base) )
+ if ( val > max_mult || (val == max_mult && dv > ULONG_MAX % base) )
goto bye;
val = base * val + dv;
p++;
}
while ( l && p->isSpace() ) // skip trailing space
l--,p++;
if ( !l )
is_ok = TRUE;
bye:
if ( ok )
*ok = is_ok;
return is_ok ? val : 0;
}
/*!
Returns the string converted to a \c short value to the base \a
base, which is 10 by default and must be between 2 and 36.
If \a ok is not 0: if a conversion error occurs, \a *ok is set to
FALSE; otherwise \a *ok is set to TRUE.
*/
short QString::toShort( bool *ok, int base ) const
{
long v = toLong( ok, base );
- if ( ok && *ok && (v < -32768 || v > 32767) ) {
+ if ( ok && *ok && (v < SHRT_MIN || v > SHRT_MAX) ) {
*ok = FALSE;
v = 0;
}
return (short)v;
}
/*!
Returns the string converted to an \c {unsigned short} value to
the base \a base, which is 10 by default and must be between 2 and
36.
If \a ok is not 0: if a conversion error occurs, \a *ok is set to
FALSE; otherwise \a *ok is set to TRUE.
*/
ushort QString::toUShort( bool *ok, int base ) const
{
ulong v = toULong( ok, base );
- if ( ok && *ok && (v > 65535) ) {
+ if ( ok && *ok && (v > USHRT_MAX) ) {
*ok = FALSE;
v = 0;
}
return (ushort)v;
}
/*!
Returns the string converted to an \c int value to the base \a
base, which is 10 by default and must be between 2 and 36.
If \a ok is not 0: if a conversion error occurs, \a *ok is set to
FALSE; otherwise \a *ok is set to TRUE.
\code
QString str( "FF" );
bool ok;
int hex = str.toInt( &ok, 16 ); // hex == 255, ok == TRUE
int dec = str.toInt( &ok, 10 ); // dec == 0, ok == FALSE
\endcode
\sa number()
*/
int QString::toInt( bool *ok, int base ) const
{
- return (int)toLong( ok, base );
+ long v = toLong( ok, base );
+ if ( ok && *ok && (v < INT_MIN || v > INT_MAX) ) {
+ *ok = FALSE;
+ v = 0;
+ }
+ return (int)v;
}
/*!
Returns the string converted to an \c{unsigned int} value to the
base \a base, which is 10 by default and must be between 2 and 36.
If \a ok is not 0: if a conversion error occurs, \a *ok is set to
FALSE; otherwise \a *ok is set to TRUE.
\sa number()
*/
uint QString::toUInt( bool *ok, int base ) const
{
- return (uint)toULong( ok, base );
+ ulong v = toULong( ok, base );
+ if ( ok && *ok && (v > UINT_MAX) ) {
+ *ok = FALSE;
+ v = 0;
+ }
+ return (uint)v;
}
/*!
Returns the string converted to a \c double value.
If \a ok is not 0: if a conversion error occurs, \a *ok is set to
FALSE; otherwise \a *ok is set to TRUE.
\code
QString string( "1234.56" );
double a = string.toDouble(); // a == 1234.56
\endcode
\sa number()
*/
double QString::toDouble( bool *ok ) const
{
char *end;
const char *a = latin1();
double val = strtod( a ? a : "", &end );
if ( ok )
- *ok = ( a && *a && (end == 0 || (end - a) == (int)length()) );
+ *ok = ( a && *a && (end == 0 || *end == '\0') );
return val;
}
/*!
Returns the string converted to a \c float value.
If \a ok is not 0: if a conversion error occurs, \a *ok is set to
FALSE; otherwise \a *ok is set to TRUE.
\sa number()
*/
float QString::toFloat( bool *ok ) const
{
return (float)toDouble( ok );
}
/*!
Sets the string to the printed value of \a n in base \a base and
returns a reference to the string.
The base is 10 by default and must be between 2 and 36.
\code
QString string;
string = string.setNum( 1234 ); // string == "1234"
\endcode
*/
QString &QString::setNum( long n, int base )
{
#if defined(QT_CHECK_RANGE)
if ( base < 2 || base > 36 ) {
qWarning( "QString::setNum: Invalid base %d", base );
base = 10;
}
#endif
char charbuf[65*sizeof(QChar)];
QChar *buf = (QChar*)charbuf;
QChar *p = &buf[64];
int len = 0;
bool neg;
if ( n < 0 ) {
neg = TRUE;
- if ( n == INT_MIN ) {
+ if ( n == LONG_MIN ) {
// Cannot always negate this special case
QString s1, s2;
- s1.setNum(n/base);
- s2.setNum((-(n+base))%base);
+ s1.setNum(n/base, base );
+ s2.setNum((-(n+base))%base, base );
*this = s1 + s2;
return *this;
}
n = -n;
} else {
neg = FALSE;
}
do {
*--p = "0123456789abcdefghijklmnopqrstuvwxyz"[((int)(n%base))];
n /= base;
++len;
} while ( n );
if ( neg ) {
*--p = '-';
++len;
}
return setUnicode( p, len );
}
/*!
\overload
Sets the string to the printed value of \a n in base \a base and
returns a reference to the string.
@@ -16440,408 +16486,488 @@ void QString::setExpand( uint index, QChar c )
the result.
Equivalent to operator+=().
*/
/*!
\fn QString& QString::append( QChar ch )
\overload
Appends character \a ch to the string and returns a reference to
the result.
Equivalent to operator+=().
*/
/*! \fn QString& QString::append( const QByteArray &str )
\overload
Appends \a str to the string and returns a reference to the result.
Equivalent to operator+=().
*/
+/*! \fn QString& QString::append( const std::string &str )
+ \overload
+
+ Appends \a str to the string and returns a reference to the result.
+
+ Equivalent to operator+=().
+ */
+
+
/*! \fn QString& QString::append( const char *str )
\overload
Appends \a str to the string and returns a reference to the result.
Equivalent to operator+=().
*/
/*!
Appends \a str to the string and returns a reference to the string.
*/
QString& QString::operator+=( const QString &str )
{
uint len1 = length();
uint len2 = str.length();
if ( len2 ) {
setLength(len1+len2);
memcpy( d->unicode+len1, str.unicode(), sizeof(QChar)*len2 );
} else if ( isNull() && !str.isNull() ) { // ## just for 1.x compat:
*this = fromLatin1( "" );
}
return *this;
}
/*!
\overload
Appends \a str to the string and returns a reference to the string.
*/
+#ifndef QT_NO_CAST_ASCII
QString& QString::operator+=( const char *str )
{
if ( str ) {
+#ifndef QT_NO_TEXTCODEC
+ if ( QTextCodec::codecForCStrings() )
+ return operator+=( fromAscii( str ) );
+#endif
+
uint len1 = length();
uint len2 = strlen( str );
if ( len2 ) {
setLength(len1+len2);
uint i = 0;
while( i < len2 ) {
d->unicode[len1+i] = str[i];
i++;
}
} else if ( isNull() ) { // ## just for 1.x compat:
*this = fromLatin1( "" );
}
}
return *this;
}
+#endif
/*! \overload
Appends \a c to the string and returns a reference to the string.
*/
QString &QString::operator+=( QChar c )
{
setLength(length()+1);
d->unicode[length()-1] = c;
return *this;
}
/*!
\overload
Appends \a c to the string and returns a reference to the string.
*/
QString &QString::operator+=( char c )
{
+#ifndef QT_NO_TEXTCODEC
+ if ( QTextCodec::codecForCStrings() )
+ return operator+=( fromAscii( &c, 1 ) );
+#endif
setLength(length()+1);
d->unicode[length()-1] = c;
return *this;
}
/*!
\fn QString &QString::operator+=( const QByteArray &str )
\overload
Appends \a str to the string and returns a reference to the string.
*/
+/*!
+ \fn QString &QString::operator+=( const std::string &str )
+ \overload
+
+ Appends \a str to the string and returns a reference to the string.
+*/
+
/*!
\fn char QChar::latin1() const
- Returns a latin-1 copy of this character, if this character is in
- the latin-1 character set. If not, this function returns 0.
+ Returns the Latin-1 value of this character, or 0 if it
+ cannot be represented in Latin-1.
*/
/*!
- Returns a Latin-1 representation of the string. Note that the
+ Returns a Latin-1 representation of the string. The
returned value is undefined if the string contains non-Latin-1
characters. If you want to convert strings into formats other than
Unicode, see the QTextCodec classes.
This function is mainly useful for boot-strapping legacy code to
use Unicode.
The result remains valid so long as one unmodified copy of the
source string exists.
- \sa utf8(), local8Bit()
+ \sa fromLatin1(), ascii(), utf8(), local8Bit()
*/
const char* QString::latin1() const
{
- if ( !d->ascii ) {
- Q2HELPER(stat_get_ascii++)
- Q2HELPER(stat_get_ascii_size+=d->len)
- d->ascii = unicodeToAscii( d->unicode, d->len );
+ if ( !d->ascii || !d->islatin1 ) {
+ d->ascii = unicodeToLatin1( d->unicode, d->len );
+ d->islatin1 = TRUE;
}
return d->ascii;
}
/*!
- \fn const char* QString::ascii() const
- \obsolete
+ Returns an 8-bit ASCII representation of the string.
- This function simply calls latin1() and returns the result.
+ If a codec has been set using QTextCodec::codecForCStrings(),
+ it is used to convert Unicode to 8-bit char. Otherwise, this function
+ does the same as latin1().
+
+ \sa fromAscii(), latin1(), utf8(), local8Bit()
*/
+const char* QString::ascii() const
+{
+#ifndef QT_NO_TEXTCODEC
+ if ( QTextCodec::codecForCStrings() ) {
+ if ( !d->ascii || d->islatin1 ) {
+ QCString s = QTextCodec::codecForCStrings()->fromUnicode( *this );
+ s.detach();
+ d->ascii = s.data();
+ d->islatin1 = FALSE;
+ s.resetRawData( s.data(), s.size() ); // we have stolen the data
+ }
+ return d->ascii;
+ }
+#endif // QT_NO_TEXTCODEC
+ return latin1();
+}
/*!
- Returns the string encoded in UTF8 format.
+ Returns the string encoded in UTF-8 format.
See QTextCodec for more diverse coding/decoding of Unicode strings.
- \sa QString::fromUtf8(), local8Bit(), latin1()
+ \sa fromUtf8(), ascii(), latin1(), local8Bit()
*/
QCString QString::utf8() const
{
int l = length();
int rlen = l*3+1;
QCString rstr(rlen);
uchar* cursor = (uchar*)rstr.data();
const QChar *ch = d->unicode;
for (int i=0; i<l; i++) {
ushort u = ch->unicode();
if ( u < 0x80 ) {
*cursor++ = (uchar)u;
} else {
if ( u < 0x0800 ) {
*cursor++ = 0xc0 | ((uchar) (u >> 6));
} else {
*cursor++ = 0xe0 | ((uchar) (u >> 12));
*cursor++ = 0x80 | ( ((uchar) (u >> 6)) & 0x3f);
}
*cursor++ = 0x80 | ((uchar) (u&0x3f));
}
ch++;
}
rstr.truncate( cursor - (uchar*)rstr.data() );
return rstr;
}
/*!
Returns the Unicode string decoded from the first \a len
characters of \a utf8, ignoring the rest of \a utf8. If \a len is
-1 then the length of \a utf8 is used. If \a len is bigger than
the length of \a utf8 then it will use the length of \a utf8.
\code
QString str = QString::fromUtf8( "123456789", 5 );
// str == "12345"
\endcode
See QTextCodec for more diverse coding/decoding of Unicode strings.
*/
QString QString::fromUtf8( const char* utf8, int len )
{
if ( !utf8 )
return QString::null;
- if ( len < 0 ) len = qstrlen( utf8 );
+ if ( len < 0 )
+ len = strlen( utf8 );
QString result;
result.setLength( len ); // worst case
QChar *qch = (QChar *)result.unicode();
ushort uc = 0;
int need = 0;
for (int i=0; i<len; i++) {
uchar ch = utf8[i];
if (need) {
if ( (ch&0xc0) == 0x80 ) {
uc = (uc << 6) | (ch & 0x3f);
need--;
if ( !need ) {
*qch = uc;
qch++;
}
} else {
// error
*qch = QChar::replacement;
qch++;
need = 0;
}
} else {
if ( ch < 128 ) {
*qch = ch;
qch++;
} else if ( (ch&0xe0) == 0xc0 ) {
uc = ch &0x1f;
need = 1;
} else if ( (ch&0xf0) == 0xe0 ) {
uc = ch &0x0f;
need = 2;
}
}
}
result.truncate( qch - result.unicode() );
return result;
}
/*!
Returns the Unicode string decoded from the first \a len
- characters of \a chars, ignoring the rest of \a chars. If \a len
- is -1 then the length of \a chars is used. If \a len is bigger
- than the length of \a chars then it will use the length of \a
- chars.
+ characters of \a ascii, ignoring the rest of \a ascii. If \a len
+ is -1 then the length of \a ascii is used. If \a len is bigger
+ than the length of \a ascii then it will use the length of \a
+ ascii.
+
+ If a codec has been set using QTextCodec::codecForCStrings(),
+ it is used to convert Unicode to 8-bit char. Otherwise, this function
+ does the same as fromLatin1().
This is the same as the QString(const char*) constructor, but you
can make that constructor invisible if you compile with the define
\c QT_NO_CAST_ASCII, in which case you can explicitly create a
- QString from Latin-1 text using this function.
+ QString from 8-bit ASCII text using this function.
\code
- QString str = QString::fromLatin1( "123456789", 5 );
+ QString str = QString::fromAscii( "123456789", 5 );
// str == "12345"
\endcode
+ */
+QString QString::fromAscii( const char* ascii, int len )
+{
+#ifndef QT_NO_TEXTCODEC
+ if ( QTextCodec::codecForCStrings() ) {
+ if ( !ascii )
+ return QString::null;
+ if ( len < 0 )
+ len = strlen( ascii );
+ if ( len == 0 || *ascii == '\0' )
+ return QString::fromLatin1( "" );
+ return QTextCodec::codecForCStrings()->toUnicode( ascii, len );
+ }
+#endif
+ return fromLatin1( ascii, len );
+}
+
+
+/*!
+ Returns the Unicode string decoded from the first \a len
+ characters of \a chars, ignoring the rest of \a chars. If \a len
+ is -1 then the length of \a chars is used. If \a len is bigger
+ than the length of \a chars then it will use the length of \a
+ chars.
+
+ \sa fromAscii()
*/
QString QString::fromLatin1( const char* chars, int len )
{
uint l;
QChar *uc;
if ( len < 0 )
len = -1;
- uc = internalAsciiToUnicode( chars, &l, len );
+ uc = internalLatin1ToUnicode( chars, &l, len );
return QString( new QStringData(uc, l, l), TRUE );
}
/*!
\fn const QChar* QString::unicode() const
Returns the Unicode representation of the string. The result
remains valid until the string is modified.
*/
/*!
Returns the string encoded in a locale-specific format. On X11,
this is the QTextCodec::codecForLocale(). On Windows, it is a
- system-defined encoding. On Mac OS X, this always uses utf8 as the
- encoding.
+ system-defined encoding. On Mac OS X, this always uses UTF-8 as
+ the encoding.
See QTextCodec for more diverse coding/decoding of Unicode
strings.
- \sa QString::fromLocal8Bit(), latin1(), utf8()
+ \sa fromLocal8Bit(), ascii(), latin1(), utf8()
*/
-
QCString QString::local8Bit() const
{
#ifdef QT_NO_TEXTCODEC
return latin1();
#else
#ifdef Q_WS_X11
QTextCodec* codec = QTextCodec::codecForLocale();
return codec
? codec->fromUnicode(*this)
: QCString(latin1());
#endif
#if defined( Q_WS_MACX )
return utf8();
#endif
#if defined( Q_WS_MAC9 )
return QCString(latin1()); //I'm evil..
#endif
#ifdef Q_WS_WIN
return qt_winQString2MB( *this );
#endif
#ifdef Q_WS_QWS
- return utf8(); // ##### if there is ANY 8 bit format supported?
+ return utf8(); // ### if there is any 8 bit format supported?
#endif
#endif
}
/*!
Returns the Unicode string decoded from the first \a len
characters of \a local8Bit, ignoring the rest of \a local8Bit. If
\a len is -1 then the length of \a local8Bit is used. If \a len is
bigger than the length of \a local8Bit then it will use the length
of \a local8Bit.
\code
QString str = QString::fromLocal8Bit( "123456789", 5 );
// str == "12345"
\endcode
\a local8Bit is assumed to be encoded in a locale-specific format.
See QTextCodec for more diverse coding/decoding of Unicode strings.
*/
QString QString::fromLocal8Bit( const char* local8Bit, int len )
{
#ifdef QT_NO_TEXTCODEC
return fromLatin1( local8Bit, len );
#else
if ( !local8Bit )
return QString::null;
#ifdef Q_WS_X11
QTextCodec* codec = QTextCodec::codecForLocale();
- if ( len < 0 ) len = qstrlen(local8Bit);
+ if ( len < 0 )
+ len = strlen( local8Bit );
return codec
? codec->toUnicode( local8Bit, len )
: fromLatin1( local8Bit, len );
#endif
#if defined( Q_WS_MAC )
return fromUtf8(local8Bit,len);
#endif
// Should this be OS_WIN32?
#ifdef Q_WS_WIN
if ( len >= 0 ) {
QCString s(local8Bit,len+1);
return qt_winMB2QString(s);
}
return qt_winMB2QString( local8Bit );
#endif
#ifdef Q_WS_QWS
return fromUtf8(local8Bit,len);
#endif
#endif // QT_NO_TEXTCODEC
}
/*!
\fn QString::operator const char *() const
Returns latin1(). Be sure to see the warnings documented in the
latin1() function. Note that for new code which you wish to be
strictly Unicode-clean, you can define the macro \c
QT_NO_ASCII_CAST when compiling your code to hide this function so
that automatic casts are not done. This has the added advantage
that you catch the programming error described in operator!().
*/
+/*!
+ \fn QString::operator std::string() const
+
+ Returns ascii().
+*/
+
/*!
Returns the QString as a zero terminated array of unsigned shorts
if the string is not null; otherwise returns zero.
The result remains valid so long as one unmodified
copy of the source string exists.
*/
const unsigned short *QString::ucs2() const
{
if ( ! d->unicode )
return 0;
unsigned int len = d->len;
if ( d->maxl < len + 1 ) {
// detach, grow or shrink
- Q2HELPER(stat_copy_on_write++)
- Q2HELPER(stat_copy_on_write_size += len)
uint newMax = computeNewMax( len + 1 );
QChar* nd = QT_ALLOC_QCHAR_VEC( newMax );
if ( nd ) {
if ( d->unicode )
memcpy( nd, d->unicode, sizeof(QChar)*len );
((QString *)this)->deref();
((QString *)this)->d = new QStringData( nd, len, newMax );
}
}
d->unicode[len] = 0;
return (unsigned short *) d->unicode;
}
/*!
Constructs a string that is a deep copy of \a str, interpreted as a
UCS2 encoded, zero terminated, Unicode string.
If \a str is 0, then a null string is created.
\sa isNull()
*/
QString QString::fromUcs2( const unsigned short *str )
{
if ( !str ) {
@@ -16962,126 +17088,146 @@ void QString::subat( uint i )
}
}
/*!
Resizes the string to \a len characters and copies \a unicode into
the string. If \a unicode is 0, nothing is copied, but the
string is still resized to \a len. If \a len is zero, then the
string becomes a \link isNull() null\endlink string.
\sa setLatin1(), isNull()
*/
QString& QString::setUnicode( const QChar *unicode, uint len )
{
if ( len == 0 ) { // set to null string
if ( d != shared_null ) { // beware of nullstring being set to nullstring
deref();
d = shared_null ? shared_null : makeSharedNull();
d->ref();
}
} else if ( d->count != 1 || len > d->maxl ||
( len * 4 < d->maxl && d->maxl > 4 ) ) {
// detach, grown or shrink
- Q2HELPER(stat_copy_on_write++)
- Q2HELPER(stat_copy_on_write_size+=d->len)
uint newMax = computeNewMax( len );
QChar* nd = QT_ALLOC_QCHAR_VEC( newMax );
if ( unicode )
memcpy( nd, unicode, sizeof(QChar)*len );
deref();
d = new QStringData( nd, len, newMax );
} else {
d->len = len;
d->setDirty();
if ( unicode )
memcpy( d->unicode, unicode, sizeof(QChar)*len );
}
return *this;
}
/*!
Resizes the string to \a len characters and copies \a
unicode_as_ushorts into the string (on some X11 client platforms
this will involve a byte-swapping pass).
If \a unicode_as_ushorts is 0, nothing is copied, but the string
is still resized to \a len. If \a len is zero, the string becomes
a \link isNull() null\endlink string.
\sa setLatin1(), isNull()
*/
QString& QString::setUnicodeCodes( const ushort* unicode_as_ushorts, uint len )
{
return setUnicode((const QChar*)unicode_as_ushorts, len);
}
/*!
+ Sets this string to \a str, interpreted as a classic 8-bit ASCII C
+ string. If \a len is -1 (the default), then it is set to
+ strlen(str).
+
+ If \a str is 0 a null string is created. If \a str is "", an empty
+ string is created.
+
+ \sa isNull(), isEmpty()
+*/
+
+QString &QString::setAscii( const char *str, int len )
+{
+#ifndef QT_NO_TEXTCODEC
+ if ( QTextCodec::codecForCStrings() ) {
+ *this = QString::fromAscii( str, len );
+ return *this;
+ }
+#endif // QT_NO_TEXTCODEC
+ return setLatin1( str, len );
+}
+
+/*!
Sets this string to \a str, interpreted as a classic Latin1 C
string. If \a len is -1 (the default), then it is set to
strlen(str).
If \a str is 0 a null string is created. If \a str is "", an empty
string is created.
\sa isNull(), isEmpty()
*/
QString &QString::setLatin1( const char *str, int len )
{
if ( str == 0 )
return setUnicode(0,0);
if ( len < 0 )
- len = qstrlen(str);
+ len = strlen( str );
if ( len == 0 ) { // won't make a null string
*this = QString::fromLatin1( "" );
} else {
setUnicode( 0, len ); // resize but not copy
QChar *p = d->unicode;
while ( len-- )
*p++ = *str++;
}
return *this;
}
/*! \internal
*/
void QString::checkSimpleText() const
{
QChar *p = d->unicode;
QChar *end = p + d->len;
- d->simpletext = 1;
while( p < end ) {
ushort uc = p->unicode();
// sort out regions of complex text formatting
if ( uc > 0x058f && ( uc < 0x1100 || uc > 0xfb0f ) ) {
- d->simpletext = 0;
+ d->issimpletext = FALSE;
return;
}
p++;
}
+ d->issimpletext = TRUE;
}
/*! \fn bool QString::simpleText() const
\internal
*/
/*! \internal
*/
bool QString::isRightToLeft() const
{
int len = length();
QChar *p = d->unicode;
while( len-- ) {
switch( ::direction( *p ) )
{
case QChar::DirL:
case QChar::DirLRO:
case QChar::DirLRE:
return FALSE;
case QChar::DirR:
case QChar::DirAL:
case QChar::DirRLO:
case QChar::DirRLE:
return TRUE;
diff --git a/qmake/tools/qtextstream.cpp b/qmake/tools/qtextstream.cpp
index 75c6531..ddca5bd 100644
--- a/qmake/tools/qtextstream.cpp
+++ b/qmake/tools/qtextstream.cpp
@@ -1068,49 +1068,49 @@ QTextStream &QTextStream::writeBlock( const char* p, uint len )
for ( uint i = 0; i < len; i++ )
u[i] = p[i];
dev->writeBlock( (char*)u, len * sizeof(QChar) );
delete [] u;
} else {
for ( uint i = 0; i < len; i++ )
ts_putc( (uchar)p[i] );
}
return *this;
}
QTextStream &QTextStream::writeBlock( const QChar* p, uint len )
{
#ifndef QT_NO_TEXTCODEC
if ( mapper ) {
if ( !d->encoder )
d->encoder = mapper->makeEncoder();
QConstString s( p, len );
int l = len;
QCString block = d->encoder->fromUnicode( s.string(), l );
dev->writeBlock( block, l );
} else
#endif
if ( latin1 ) {
- char *str = QString::unicodeToAscii( p, len );
+ char *str = QString::unicodeToLatin1( p, len );
dev->writeBlock( str, len );
delete [] str;
} else if ( internalOrder ) {
if ( doUnicodeHeader ) {
doUnicodeHeader = FALSE;
ts_putc( QChar::byteOrderMark );
}
dev->writeBlock( (char*)p, sizeof(QChar)*len );
} else {
for (uint i=0; i<len; i++)
ts_putc( p[i] );
}
return *this;
}
/*!
Resets the text stream.
\list
\i All flags are set to 0.
\i The field width is set to 0.
\i The fill character is set to ' ' (Space).
\i The precision is set to 6.
\endlist
diff --git a/qmake/tools/qucom.cpp b/qmake/tools/qucom.cpp
index 6086a79..658da97 100644
--- a/qmake/tools/qucom.cpp
+++ b/qmake/tools/qucom.cpp
@@ -275,266 +275,149 @@ bool QUType_bool::convertTo( QUObject *, QUType * )
int QUType_bool::serializeTo( QUObject *, QUBuffer * )
{
return 0;
}
int QUType_bool::serializeFrom( QUObject *, QUBuffer * )
{
return 0;
}
// {53C1F3BE-73C3-4c7d-9E05-CCF09EB676B5}
const QUuid TID_QUType_int( 0x53c1f3be, 0x73c3, 0x4c7d, 0x9e, 0x5, 0xcc, 0xf0, 0x9e, 0xb6, 0x76, 0xb5 );
QUType_int static_QUType_int;
const QUuid *QUType_int::uuid() const { return &TID_QUType_int; }
const char *QUType_int::desc() const { return "int"; }
void QUType_int::set( QUObject *o, int v )
{
o->payload.i = v;
o->type = this;
}
bool QUType_int::canConvertFrom( QUObject *o, QUType *t )
{
- if ( isEqual( t, &static_QUType_double ) ||
- isEqual( t, &static_QUType_float ) )
+ if ( isEqual( t, &static_QUType_double ) )
return TRUE;
return t->canConvertTo( o, this );
}
bool QUType_int::canConvertTo( QUObject * /*o*/, QUType *t )
{
- return isEqual( t, &static_QUType_double ) ||
- isEqual( t, &static_QUType_float );
+ return isEqual( t, &static_QUType_double );
}
bool QUType_int::convertFrom( QUObject *o, QUType *t )
{
if ( isEqual( t, &static_QUType_double ) )
o->payload.i = (long)o->payload.d;
- else if ( isEqual( t, &static_QUType_float ) )
- o->payload.i = (long)o->payload.f;
else
return t->convertTo( o, this );
o->type = this;
return TRUE;
}
bool QUType_int::convertTo( QUObject *o, QUType *t )
{
if ( isEqual( t, &static_QUType_double ) ) {
o->payload.d = (double)o->payload.i;
o->type = &static_QUType_double;
- } else if ( isEqual( t, &static_QUType_float ) ) {
- o->payload.f = (float)o->payload.i;
- o->type = &static_QUType_float;
} else
return FALSE;
return TRUE;
}
int QUType_int::serializeTo( QUObject *, QUBuffer * )
{
return 0;
}
int QUType_int::serializeFrom( QUObject *, QUBuffer * )
{
return 0;
}
-// {5938712A-C496-11D5-8CB2-00C0F03BC0F3}
-const QUuid TID_QUType_uint( 0x5938712a, 0xc496, 0x11d5, 0x8c, 0xb2, 0x00, 0xc0, 0xf0, 0x3b, 0xc0, 0xf3);
-QUType_uint static_QUType_uint;
-const QUuid *QUType_uint::uuid() const { return &TID_QUType_uint; }
-const char *QUType_uint::desc() const { return "uint"; }
-
-void QUType_uint::set( QUObject *o, uint v )
-{
- o->payload.ui = v;
- o->type = this;
-}
-
-bool QUType_uint::canConvertFrom( QUObject *o, QUType *t )
-{
- return t->canConvertTo( o, this );
-}
-
-bool QUType_uint::canConvertTo( QUObject * /*o*/, QUType * /*t*/ )
-{
- return FALSE;
-}
-
-bool QUType_uint::convertFrom( QUObject *o, QUType *t )
-{
- return t->convertTo( o, this );
-}
-
-bool QUType_uint::convertTo( QUObject * /*o*/, QUType * /*t*/ )
-{
- return FALSE;
-}
-
-int QUType_uint::serializeTo( QUObject *, QUBuffer * )
-{
- return 0;
-}
-
-int QUType_uint::serializeFrom( QUObject *, QUBuffer * )
-{
- return 0;
-}
-
// {2D0974E5-0BA6-4ec2-8837-C198972CB48C}
const QUuid TID_QUType_double( 0x2d0974e5, 0xba6, 0x4ec2, 0x88, 0x37, 0xc1, 0x98, 0x97, 0x2c, 0xb4, 0x8c );
QUType_double static_QUType_double;
const QUuid *QUType_double::uuid() const { return &TID_QUType_double; }
const char *QUType_double::desc() const {return "double"; }
void QUType_double::set( QUObject *o, double v )
{
o->payload.d = v;
o->type = this;
}
bool QUType_double::canConvertFrom( QUObject *o, QUType *t )
{
- if ( isEqual( t, &static_QUType_int ) ||
- isEqual( t, &static_QUType_float) )
+ if ( isEqual( t, &static_QUType_int ) )
return TRUE;
return t->canConvertTo( o, this );
}
bool QUType_double::canConvertTo( QUObject * /*o*/, QUType *t )
{
- return isEqual( t, &static_QUType_int ) ||
- isEqual( t, &static_QUType_float );
+ return isEqual( t, &static_QUType_int );
}
bool QUType_double::convertFrom( QUObject *o, QUType *t )
{
if ( isEqual( t, &static_QUType_int ) )
o->payload.d = (double)o->payload.i;
- else if ( isEqual( t, &static_QUType_float ) )
- o->payload.d = (double)o->payload.f;
- else
+ else
return t->convertTo( o, this );
o->type = this;
return TRUE;
}
bool QUType_double::convertTo( QUObject *o, QUType *t )
{
if ( isEqual( t, &static_QUType_int ) ) {
o->payload.i = (int) o->payload.d;
o->type = &static_QUType_int;
} else if ( isEqual( t, &static_QUType_double ) ) {
o->payload.d = (double) o->payload.f;
o->type = &static_QUType_double;
} else
return FALSE;
return TRUE;
}
int QUType_double::serializeTo( QUObject *, QUBuffer * )
{
return 0;
}
int QUType_double::serializeFrom( QUObject *, QUBuffer * )
{
return 0;
}
-
-// {544C5175-6993-4486-B04D-CEC4D21BF4B9 }
-const QUuid TID_QUType_float( 0x544c5175, 0x6993, 0x4486, 0xb0, 0x4d, 0xce, 0xc4, 0xd2, 0x1b, 0xf4, 0xb9 );
-QUType_float static_QUType_float;
-const QUuid *QUType_float::uuid() const { return &TID_QUType_float; }
-const char *QUType_float::desc() const {return "float"; }
-
-void QUType_float::set( QUObject *o, float v )
-{
- o->payload.f = v;
- o->type = this;
-}
-
-bool QUType_float::canConvertFrom( QUObject *o, QUType *t )
-{
- if ( isEqual( t, &static_QUType_int ) ||
- isEqual( t, &static_QUType_double ) )
- return TRUE;
-
- return t->canConvertTo( o, this );
-}
-
-bool QUType_float::canConvertTo( QUObject * /*o*/, QUType *t )
-{
- return isEqual( t, &static_QUType_int ) ||
- isEqual( t, &static_QUType_double );
-}
-
-bool QUType_float::convertFrom( QUObject *o, QUType *t )
-{
- if ( isEqual( t, &static_QUType_int ) )
- o->payload.f = (float)o->payload.i;
- else if ( isEqual( t, &static_QUType_double ) )
- o->payload.f = (float)o->payload.d;
- else
- return t->convertTo( o, this );
-
- o->type = this;
- return TRUE;
-}
-
-bool QUType_float::convertTo( QUObject *o, QUType *t )
-{
- if ( isEqual( t, &static_QUType_int ) ) {
- o->payload.i = (int) o->payload.f;
- o->type = &static_QUType_int;
- } else if ( isEqual( t, &static_QUType_double ) ) {
- o->payload.d = (double) o->payload.f;
- o->type = &static_QUType_double;
- } else
- return FALSE;
- return TRUE;
-}
-
-int QUType_float::serializeTo( QUObject *, QUBuffer * )
-{
- return 0;
-}
-
-int QUType_float::serializeFrom( QUObject *, QUBuffer * )
-{
- return 0;
-}
-
// {EFCDD1D4-77A3-4b8e-8D46-DC14B8D393E9}
const QUuid TID_QUType_charstar( 0xefcdd1d4, 0x77a3, 0x4b8e, 0x8d, 0x46, 0xdc, 0x14, 0xb8, 0xd3, 0x93, 0xe9 );
QUType_charstar static_QUType_charstar;
const QUuid *QUType_charstar::uuid() const { return &TID_QUType_charstar; }
const char *QUType_charstar::desc() const { return "char*"; }
void QUType_charstar::set( QUObject *o, const char* v, bool take )
{
if ( take ) {
if ( v ) {
o->payload.charstar.ptr = new char[ strlen(v) + 1 ];
strcpy( o->payload.charstar.ptr, v );
} else {
o->payload.charstar.ptr = 0;
}
o->payload.charstar.owner = TRUE;
} else {
o->payload.charstar.ptr = (char*) v;
o->payload.charstar.owner = FALSE;
}
o->type = this;
}
bool QUType_charstar::canConvertFrom( QUObject *o, QUType *t )
@@ -572,97 +455,90 @@ int QUType_charstar::serializeTo( QUObject *, QUBuffer * )
int QUType_charstar::serializeFrom( QUObject *, QUBuffer * )
{
return 0;
}
// Qt specific types
// {44C2A547-01E7-4e56-8559-35AF9D2F42B7}
const QUuid TID_QUType_QString( 0x44c2a547, 0x1e7, 0x4e56, 0x85, 0x59, 0x35, 0xaf, 0x9d, 0x2f, 0x42, 0xb7 );
QUType_QString static_QUType_QString;
const QUuid *QUType_QString::uuid() const { return &TID_QUType_QString; }
const char *QUType_QString::desc() const { return "QString"; }
void QUType_QString::set( QUObject *o, const QString& v )
{
o->payload.ptr = new QString( v );
o->type = this;
}
bool QUType_QString::canConvertFrom( QUObject *o, QUType *t )
{
if ( isEqual( t, &static_QUType_charstar ) ||
isEqual( t, &static_QUType_double ) ||
- isEqual( t, &static_QUType_float ) ||
isEqual( t, &static_QUType_int ) )
return TRUE;
return t->canConvertTo( o, this );
}
bool QUType_QString::canConvertTo( QUObject * /*o*/, QUType *t )
{
return isEqual( t, &static_QUType_charstar ) ||
isEqual( t, &static_QUType_int ) ||
- isEqual( t, &static_QUType_double ) ||
- isEqual( t, &static_QUType_float );
+ isEqual( t, &static_QUType_double );
}
bool QUType_QString::convertFrom( QUObject *o, QUType *t )
{
QString *str = 0;
if ( isEqual( t, &static_QUType_charstar ) )
str = new QString( o->payload.charstar.ptr );
else if ( isEqual( t, &static_QUType_double ) )
str = new QString( QString::number( o->payload.d ) );
- else if ( isEqual( t, &static_QUType_float ) )
- str = new QString( QString::number( o->payload.f ) );
else if ( isEqual( t, &static_QUType_int ) )
str = new QString( QString::number( o->payload.i ) );
else
return t->convertTo( o, this );
o->type->clear( o );
o->payload.ptr = str;
o->type = this;
return TRUE;
}
bool QUType_QString::convertTo( QUObject *o, QUType *t )
{
QString *str = (QString *)o->payload.ptr;
if ( isEqual( t, &static_QUType_charstar ) ) {
o->payload.charstar.ptr = qstrdup( str->local8Bit().data() );
o->payload.charstar.owner = TRUE;
o->type = &static_QUType_charstar;
} else if ( isEqual( t, &static_QUType_int ) ) {
o->payload.l = str->toLong();
o->type = &static_QUType_int;
} else if ( isEqual( t, &static_QUType_double ) ) {
o->payload.d = str->toDouble();
o->type = &static_QUType_double;
- } else if ( isEqual( t, &static_QUType_float ) ) {
- o->payload.d = str->toFloat();
- o->type = &static_QUType_float;
} else {
return FALSE;
}
delete str;
return TRUE;
}
int QUType_QString::serializeTo( QUObject *, QUBuffer * )
{
return 0;
}
int QUType_QString::serializeFrom( QUObject *, QUBuffer * )
{
return 0;
}
void QUType_QString::clear( QUObject *o )
{
delete (QString*)o->payload.ptr;
o->payload.ptr = 0;
}
diff --git a/qmake/tools/qwaitcondition_unix.cpp b/qmake/tools/qwaitcondition_unix.cpp
index 99c1014..6684617 100644
--- a/qmake/tools/qwaitcondition_unix.cpp
+++ b/qmake/tools/qwaitcondition_unix.cpp
@@ -103,49 +103,49 @@ struct QWaitConditionPrivate {
avoided by, for example, doing something like this:
\code
QMutex mymutex;
QWaitCondition key_pressed;
int mycount=0;
// Worker thread code
for (;;) {
key_pressed.wait(); // This is a QWaitCondition global variable
mymutex.lock();
mycount++;
mymutex.unlock();
do_something();
mymutex.lock();
mycount--;
mymutex.unlock();
}
// Key reading thread code
for (;;) {
getchar();
mymutex.lock();
// Sleep until there are no busy worker threads
- while( count > 0 ) {
+ while( mycount > 0 ) {
mymutex.unlock();
sleep( 1 );
mymutex.lock();
}
mymutex.unlock();
key_pressed.wakeAll();
}
\endcode
The mutexes are necessary because the results of two threads
attempting to change the value of the same variable simultaneously
are unpredictable.
*/
/*!
Constructs a new event signalling, i.e. wait condition, object.
*/
QWaitCondition::QWaitCondition()
{
d = new QWaitConditionPrivate;
int ret = pthread_cond_init(&d->cond, NULL);
#ifdef QT_CHECK_RANGE
@@ -203,108 +203,113 @@ void QWaitCondition::wakeAll()
int ret = pthread_cond_broadcast(&d->cond);
#ifdef QT_CHECK_RANGE
if (ret)
qWarning("Wait condition wakeAll failure: %s", strerror(ret));
#endif
}
/*!
Wait on the thread event object. The thread calling this will
block until either of these conditions is met:
\list
\i Another thread signals it using wakeOne() or wakeAll(). This
function will return TRUE in this case.
\i \a time milliseconds has elapsed. If \a time is ULONG_MAX (the
default), then the wait will never timeout (the event must be
signalled). This function will return FALSE if the wait timed
out.
\endlist
\sa wakeOne(), wakeAll()
*/
bool QWaitCondition::wait(unsigned long time)
{
- pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+ pthread_mutex_t mutex;
+ pthread_mutex_init( &mutex, 0 );
+ pthread_mutex_lock( &mutex );
int ret;
if (time != ULONG_MAX) {
struct timeval tv;
gettimeofday(&tv, 0);
timespec ti;
- ti.tv_nsec = (tv.tv_usec * 1000) + (time % 1000) * 1000;
+ ti.tv_nsec = ( tv.tv_usec + ( time % 1000 ) * 1000 ) * 1000;
ti.tv_sec = tv.tv_sec + (time / 1000) + ( ti.tv_nsec / 1000000000 );
ti.tv_nsec %= 1000000000;
ret = pthread_cond_timedwait(&d->cond, &mutex, &ti);
} else
ret = pthread_cond_wait(&d->cond, &mutex);
#ifdef QT_CHECK_RANGE
if (ret && ret != ETIMEDOUT)
qWarning("Wait condition wait failure: %s",strerror(ret));
#endif
+ pthread_mutex_unlock( &mutex );
+ pthread_mutex_destroy( &mutex );
+
return (ret == 0);
}
/*!
\overload
Release the locked \a mutex and wait on the thread event object.
The \a mutex must be initially locked by the calling thread. If \a
mutex is not in a locked state, this function returns immediately.
If \a mutex is a recursive mutex, this function returns
immediately. The \a mutex will be unlocked, and the calling thread
will block until either of these conditions is met:
\list
\i Another thread signals it using wakeOne() or wakeAll(). This
function will return TRUE in this case.
\i \a time milliseconds has elapsed. If \a time is ULONG_MAX (the
default), then the wait will never timeout (the event must be
signalled). This function will return FALSE if the wait timed
out.
\endlist
The mutex will be returned to the same locked state. This function
is provided to allow the atomic transition from the locked state
to the wait state.
\sa wakeOne(), wakeAll()
*/
bool QWaitCondition::wait(QMutex *mutex, unsigned long time)
{
if (! mutex)
return FALSE;
if (mutex->d->type() == Q_MUTEX_RECURSIVE) {
#ifdef QT_CHECK_RANGE
qWarning("Wait condition warning: using recursive mutexes with\n"
" wait conditions is undefined!");
#endif
return FALSE;
}
int ret;
if (time != ULONG_MAX) {
struct timeval tv;
gettimeofday(&tv, 0);
timespec ti;
- ti.tv_nsec = (tv.tv_usec * 1000) + (time % 1000) * 1000;
+ ti.tv_nsec = ( tv.tv_usec + ( time % 1000 ) * 1000 ) * 1000;
ti.tv_sec = tv.tv_sec + (time / 1000) + ( ti.tv_nsec / 1000000000 );
ti.tv_nsec %= 1000000000;
ret = pthread_cond_timedwait(&d->cond, &mutex->d->handle, &ti);
} else
ret = pthread_cond_wait(&d->cond, &mutex->d->handle);
#ifdef QT_CHECK_RANGE
if (ret && ret != ETIMEDOUT)
qWarning("Wait condition wait failure: %s",strerror(ret));
#endif
return (ret == 0);
}
#endif // QT_THREAD_SUPPORT