This is Qt version %VERSION%. Qt is a comprehensive cross-platform C++ application framework. Qt 4 introduces new features and many improvements over the 3.x series. See http://qt.nokia.com/doc/latest/qt4-intro.html for details. The Qt 4.x series is not binary compatible or source compatible with the 3.x series. For more information on porting from Qt 3 to Qt 4, see http://qt.nokia.com/doc/latest/porting4.html. INSTALLING Qt If you have a source package (a .tar.gz, or .zip file), follow the instructions in the INSTALL file. On Windows and Mac OS X, if you want to install the precompiled binary packages, simply launch the package and follow the instructions in the installation wizard. For Mac OS X Carbon, the binary package requires Mac OS X 10.4 (Tiger) or later and GCC 4.0.1 to develop applications. Its applications will run on Mac OS X 10.4 and above. For Mac OS X Cocoa, the binary package requires Mac OS X 10.5 (Leopard) or later and GCC 4.0.1 to develop applications. Its applications will run on Mac OS X 10.5 and above. If you want to install the precompiled binary package for Symbian, follow these instructions: http://qt.nokia.com/doc/%SHORTVERSION%/install-symbian-installer.html DEMOS AND EXAMPLES Once Qt is installed, we suggest that you take a look at the demos and examples to see Qt in action. For desktop computers, run the Qt Examples and Demos either by typing 'qtdemo' on the command line or through the desktop's Start menu. On Mac OS X, you can find it in /Developers/Applications/Qt. For embedded devices, launch the Qt 'fluidlauncher' demo, either through the platforms filebrowser or the built in menu system. REFERENCE DOCUMENTATION The Qt reference documentation is available locally in Qt's doc/html directory. You can use Qt Assistant to view it; to launch Assistant, type 'assistant' on the command line or use the Start menu. On Mac OS X, you can find it in /Developer/Applications/Qt. The latest documentation is available at http://qt.nokia.com/doc/. SUPPORTED PLATFORMS For a complete list of supported platforms, see http://qt.nokia.com/doc/%SHORTVERSION%/supported-platforms.html. COMMERCIAL EDITIONS Desktop Edition licensees can use all the modules provided with their Qt package. GUI Framework licensees may only use the classes contained in the QtCore, QtGui (except QGraphicsView), QtTest, QtDBus and Qt3Support modules. For a full listing of the contents of each module, please refer to http://qt.nokia.com/doc/%SHORTVERSION%/modules.html HOW TO REPORT A BUG If you think you have found a bug in Qt, we would like to hear about it so that we can fix it. The Qt bug tracking system is open to the public at http://bugreports.qt.nokia.com/. Before reporting a bug, please use the bug-tracker's search functions and consult http://qt.nokia.com/developer/faqs/ to see if the issue is already known. Always include the following information in your bug report: the name and version number of your compiler; the name and version number of your operating system; the version of Qt you are using, and what configure options it was compiled with. If the problem you are reporting is only visible at run-time, try to create a small test program that shows the problem when run. Often, such a program can be created with some minor changes to one of the many example programs in Qt's examples directory, or to the autotests that are available in the public source repository on http://qt.gitorious.org/. Qt is a trademark of Nokia Corporation and/or its subsidiary(-ies). id='n14' href='#n14'>14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331
/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
Distributed under the OSI-approved BSD License (the "License");
see accompanying file Copyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the License for more information.
============================================================================*/
#include "cmMacroCommand.h"
#include "cmake.h"
// define the class for macro commands
class cmMacroHelperCommand : public cmCommand
{
public:
cmMacroHelperCommand() {}
///! clean up any memory allocated by the macro
~cmMacroHelperCommand() {};
/**
* This is a virtual constructor for the command.
*/
virtual cmCommand* Clone()
{
cmMacroHelperCommand *newC = new cmMacroHelperCommand;
// we must copy when we clone
newC->Args = this->Args;
newC->Functions = this->Functions;
newC->Policies = this->Policies;
return newC;
}
/**
* This determines if the command is invoked when in script mode.
*/
virtual bool IsScriptable() { return true; }
/**
* This is called when the command is first encountered in
* the CMakeLists.txt file.
*/
virtual bool InvokeInitialPass(const std::vector<cmListFileArgument>& args,
cmExecutionStatus &);
virtual bool InitialPass(std::vector<std::string> const&,
cmExecutionStatus &) { return false; };
/**
* The name of the command as specified in CMakeList.txt.
*/
virtual const char* GetName() { return this->Args[0].c_str(); }
/**
* Succinct documentation.
*/
virtual const char* GetTerseDocumentation()
{
std::string docs = "Macro named: ";
docs += this->GetName();
return docs.c_str();
}
/**
* More documentation.
*/
virtual const char* GetFullDocumentation()
{
return this->GetTerseDocumentation();
}
cmTypeMacro(cmMacroHelperCommand, cmCommand);
std::vector<std::string> Args;
std::vector<cmListFileFunction> Functions;
cmPolicies::PolicyMap Policies;
};
bool cmMacroHelperCommand::InvokeInitialPass
(const std::vector<cmListFileArgument>& args,
cmExecutionStatus &inStatus)
{
// Expand the argument list to the macro.
std::vector<std::string> expandedArgs;
this->Makefile->ExpandArguments(args, expandedArgs);
std::string tmps;
cmListFileArgument arg;
std::string variable;
// make sure the number of arguments passed is at least the number
// required by the signature
if (expandedArgs.size() < this->Args.size() - 1)
{
std::string errorMsg =
"Macro invoked with incorrect arguments for macro named: ";
errorMsg += this->Args[0];
this->SetError(errorMsg.c_str());
return false;
}
// Enforce matching logical blocks inside the macro.
cmMakefile::LexicalPushPop lexScope(this->Makefile);
// Push a weak policy scope which restores the policies recorded at
// macro creation.
cmMakefile::PolicyPushPop polScope(this->Makefile, true, this->Policies);
// set the value of argc
cmOStringStream argcDefStream;
argcDefStream << expandedArgs.size();
std::string argcDef = argcDefStream.str();
// declare varuiables for ARGV ARGN but do not compute until needed
std::string argvDef;
std::string argnDef;
bool argnDefInitialized = false;
bool argvDefInitialized = false;
// Invoke all the functions that were collected in the block.
cmListFileFunction newLFF;
// for each function
for(unsigned int c = 0; c < this->Functions.size(); ++c)
{
// Replace the formal arguments and then invoke the command.
newLFF.Arguments.clear();
newLFF.Arguments.reserve(this->Functions[c].Arguments.size());
newLFF.Name = this->Functions[c].Name;
newLFF.FilePath = this->Functions[c].FilePath;
newLFF.Line = this->Functions[c].Line;
// for each argument of the current function
for (std::vector<cmListFileArgument>::const_iterator k =
this->Functions[c].Arguments.begin();
k != this->Functions[c].Arguments.end(); ++k)
{
tmps = k->Value;
// replace formal arguments
for (unsigned int j = 1; j < this->Args.size(); ++j)
{
variable = "${";
variable += this->Args[j];
variable += "}";
cmSystemTools::ReplaceString(tmps, variable.c_str(),
expandedArgs[j-1].c_str());
}
// replace argc
cmSystemTools::ReplaceString(tmps, "${ARGC}",argcDef.c_str());
// repleace ARGN
if (tmps.find("${ARGN}") != std::string::npos)
{
if (!argnDefInitialized)
{
std::vector<std::string>::const_iterator eit;
std::vector<std::string>::size_type cnt = 0;
for ( eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit )
{
if ( cnt >= this->Args.size()-1 )
{
if ( argnDef.size() > 0 )
{
argnDef += ";";
}
argnDef += *eit;
}
cnt ++;
}
argnDefInitialized = true;
}
cmSystemTools::ReplaceString(tmps, "${ARGN}", argnDef.c_str());
}
// if the current argument of the current function has ${ARGV in it
// then try replacing ARGV values
if (tmps.find("${ARGV") != std::string::npos)
{
char argvName[60];
// repleace ARGV, compute it only once
if (!argvDefInitialized)
{
std::vector<std::string>::const_iterator eit;
for ( eit = expandedArgs.begin(); eit != expandedArgs.end(); ++eit )
{
if ( argvDef.size() > 0 )
{
argvDef += ";";
}
argvDef += *eit;
}
argvDefInitialized = true;
}
cmSystemTools::ReplaceString(tmps, "${ARGV}", argvDef.c_str());
// also replace the ARGV1 ARGV2 ... etc
for (unsigned int t = 0; t < expandedArgs.size(); ++t)
{
sprintf(argvName,"${ARGV%i}",t);
cmSystemTools::ReplaceString(tmps, argvName,
expandedArgs[t].c_str());
}
}
arg.Value = tmps;
arg.Quoted = k->Quoted;
arg.FilePath = k->FilePath;
arg.Line = k->Line;
newLFF.Arguments.push_back(arg);
}
cmExecutionStatus status;
if(!this->Makefile->ExecuteCommand(newLFF, status) ||
status.GetNestedError())
{
// The error message should have already included the call stack
// so we do not need to report an error here.
lexScope.Quiet();
polScope.Quiet();
inStatus.SetNestedError(true);
return false;
}
if (status.GetReturnInvoked())
{
inStatus.SetReturnInvoked(true);
return true;
}
if (status.GetBreakInvoked())
{
inStatus.SetBreakInvoked(true);
return true;
}
}
return true;
}
bool cmMacroFunctionBlocker::
IsFunctionBlocked(const cmListFileFunction& lff, cmMakefile &mf,
cmExecutionStatus &)
{
// record commands until we hit the ENDMACRO
// at the ENDMACRO call we shift gears and start looking for invocations
if(!cmSystemTools::Strucmp(lff.Name.c_str(),"macro"))
{
this->Depth++;
}
else if(!cmSystemTools::Strucmp(lff.Name.c_str(),"endmacro"))
{
// if this is the endmacro for this macro then execute
if (!this->Depth)
{
std::string name = this->Args[0];
std::vector<std::string>::size_type cc;
name += "(";
for ( cc = 0; cc < this->Args.size(); cc ++ )
{
name += " " + this->Args[cc];
}
name += " )";
mf.AddMacro(this->Args[0].c_str(), name.c_str());
// create a new command and add it to cmake
cmMacroHelperCommand *f = new cmMacroHelperCommand();
f->Args = this->Args;
f->Functions = this->Functions;
mf.RecordPolicies(f->Policies);
std::string newName = "_" + this->Args[0];
mf.GetCMakeInstance()->RenameCommand(this->Args[0].c_str(),
newName.c_str());
mf.AddCommand(f);
// remove the function blocker now that the macro is defined
mf.RemoveFunctionBlocker(this, lff);
return true;
}
else
{
// decrement for each nested macro that ends
this->Depth--;
}
}
// if it wasn't an endmacro and we are not executing then we must be
// recording
this->Functions.push_back(lff);
return true;
}
bool cmMacroFunctionBlocker::
ShouldRemove(const cmListFileFunction& lff, cmMakefile &mf)
{
if(!cmSystemTools::Strucmp(lff.Name.c_str(),"endmacro"))
{
std::vector<std::string> expandedArguments;
mf.ExpandArguments(lff.Arguments, expandedArguments);
// if the endmacro has arguments make sure they
// match the arguments of the macro
if ((expandedArguments.empty() ||
(expandedArguments[0] == this->Args[0])))
{
return true;
}
}
return false;
}
bool cmMacroCommand::InitialPass(std::vector<std::string> const& args,
cmExecutionStatus &)
{
if(args.size() < 1)
{
this->SetError("called with incorrect number of arguments");
return false;
}
// create a function blocker
cmMacroFunctionBlocker *f = new cmMacroFunctionBlocker();
for(std::vector<std::string>::const_iterator j = args.begin();
j != args.end(); ++j)
{
f->Args.push_back(*j);
}
this->Makefile->AddFunctionBlocker(f);
return true;
}