summaryrefslogtreecommitdiff
path: root/qmake/generators/win32/msvc_objectmodel.cpp
Side-by-side diff
Diffstat (limited to 'qmake/generators/win32/msvc_objectmodel.cpp') (more/less context) (show whitespace changes)
-rw-r--r--qmake/generators/win32/msvc_objectmodel.cpp341
1 files changed, 231 insertions, 110 deletions
diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp
index 7ffe4f7..a672c2d 100644
--- a/qmake/generators/win32/msvc_objectmodel.cpp
+++ b/qmake/generators/win32/msvc_objectmodel.cpp
@@ -1,20 +1,20 @@
/****************************************************************************
-** $Id$
**
-** Definition of ________ class.
**
-** Copyright (C) 2002 Trolltech AS. All rights reserved.
+** Implementation of VCProject class.
**
-** This file is part of the network module of the Qt GUI Toolkit.
+** Copyright (C) 2002-2003 Trolltech AS. All rights reserved.
+**
+** This file is part of qmake.
**
** 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
@@ -28,39 +28,25 @@
** 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_objectmodel.h"
#include "msvc_vcproj.h"
#include <qtextstream.h>
#include <qstringlist.h>
-#include <quuid.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
+#include <qfileinfo.h>
// XML Tags ---------------------------------------------------------
const char* _xmlInit = "<?xml version=\"1.0\" encoding = \"Windows-1252\"?>";
const char* _begConfiguration = "\n\t\t<Configuration";
const char* _begConfigurations = "\n\t<Configurations>";
const char* _begFile = "\n\t\t\t<File";
const char* _begFileConfiguration = "\n\t\t\t\t<FileConfiguration";
const char* _begFiles = "\n\t<Files>";
const char* _begFilter = "\n\t\t<Filter";
const char* _begGlobals = "\n\t<Globals>";
const char* _begPlatform = "\n\t\t<Platform";
const char* _begPlatforms = "\n\t<Platforms>";
@@ -272,25 +258,24 @@ struct SPair {
const char* name;
const QString& value;
};
struct XPair {
XPair( const char* n, const QStringList& v, const char* s = "," ) : name(n), value(v), sep(s) {};
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:
@@ -309,148 +294,149 @@ QTextStream &operator<<( QTextStream &strm, const EPair &prop )
return strm;
}
QTextStream &operator<<( QTextStream &strm, const LPair &prop )
{
strm << prop.name << prop.value << "\"";
return strm;
}
QTextStream &operator<<( QTextStream &strm, const SPair &prop )
{
if ( !prop.value.isEmpty() )
- strm << prop.name << prop.value.latin1() << "\"";
+ strm << prop.name << QString(prop.value).remove("\"") << "\"";
return strm;
}
QTextStream &operator<<( QTextStream &strm, const XPair &prop )
{
if ( !prop.value.isEmpty() )
strm << prop.name << prop.value.join(prop.sep).latin1() << "\"";
return strm;
}
// VCCLCompilerTool -------------------------------------------------
VCCLCompilerTool::VCCLCompilerTool()
: AssemblerOutput( asmListingNone ),
BasicRuntimeChecks( runtimeBasicCheckNone ),
BrowseInformation( brInfoNone ),
- BufferSecurityCheck( unset ),
+ BufferSecurityCheck( _False ),
CallingConvention( callConventionDefault ),
CompileAs( compileAsDefault ),
CompileAsManaged( managedDefault ),
CompileOnly( unset ),
DebugInformationFormat( debugDisabled ),
DefaultCharIsUnsigned( unset ),
Detect64BitPortabilityProblems( unset ),
DisableLanguageExtensions( unset ),
EnableFiberSafeOptimizations( unset ),
EnableFunctionLevelLinking( unset ),
EnableIntrinsicFunctions( unset ),
- ExceptionHandling( unset ),
+ ExceptionHandling( _False ),
ExpandAttributedSource( unset ),
FavorSizeOrSpeed( favorNone ),
ForceConformanceInForLoopScope( unset ),
GeneratePreprocessedFile( preprocessNo ),
GlobalOptimizations( unset ),
IgnoreStandardIncludePath( unset ),
ImproveFloatingPointConsistency( unset ),
- InlineFunctionExpansion( expandOnlyInline ),
+ InlineFunctionExpansion( expandDefault ),
KeepComments( unset ),
MinimalRebuild( unset ),
OmitFramePointers( unset ),
- Optimization( optimizeDisabled ),
+ Optimization( optimizeCustom ),
OptimizeForProcessor( procOptimizeBlended ),
OptimizeForWindowsApplication( unset ),
+ ProgramDataBaseFileName( "" ),
RuntimeLibrary( rtMultiThreaded ),
RuntimeTypeInfo( unset ),
ShowIncludes( unset ),
SmallerTypeCheck( unset ),
StringPooling( unset ),
StructMemberAlignment( alignNotSet ),
SuppressStartupBanner( unset ),
TreatWChar_tAsBuiltInType( unset ),
TurnOffAssemblyGeneration( unset ),
UndefineAllPreprocessorDefinitions( unset ),
- UsePrecompiledHeader( pchGenerateAuto ),
+ UsePrecompiledHeader( pchNone ),
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( _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 );
+ if ( tool.DebugInformationFormat != debugUnknown ) 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 );
strm << XPair( _ForcedUsingFiles, tool.ForcedUsingFiles );
- strm << EPair( _GeneratePreprocessedFile, tool.GeneratePreprocessedFile );
+ if ( tool.GeneratePreprocessedFile != preprocessUnknown)strm << EPair( _GeneratePreprocessedFile, tool.GeneratePreprocessedFile );
strm << TPair( _GlobalOptimizations, tool.GlobalOptimizations );
strm << TPair( _IgnoreStandardIncludePath, tool.IgnoreStandardIncludePath );
strm << TPair( _ImproveFloatingPointConsistency, tool.ImproveFloatingPointConsistency );
- strm << EPair( _InlineFunctionExpansion, tool.InlineFunctionExpansion );
+ if ( tool.InlineFunctionExpansion != expandDefault ) strm << EPair( _InlineFunctionExpansion, tool.InlineFunctionExpansion );
strm << TPair( _KeepComments, tool.KeepComments );
strm << TPair( _MinimalRebuild, tool.MinimalRebuild );
strm << SPair( _ObjectFile, tool.ObjectFile );
strm << TPair( _OmitFramePointers, tool.OmitFramePointers );
- strm << EPair( _Optimization, tool.Optimization );
+ if ( tool.Optimization != optimizeDefault ) 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 );
+ if ( !tool.ProgramDataBaseFileName.isNull() ) strm << _ProgramDataBaseFileName << tool.ProgramDataBaseFileName.latin1() << "\"";
+ if ( tool.RuntimeLibrary != rtUnknown ) 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 );
+ if ( tool.WarningLevel != warningLevelUnknown ) strm << EPair( _WarningLevel, tool.WarningLevel );
strm << TPair( _WholeProgramOptimization, tool.WholeProgramOptimization );
strm << "/>";
return strm;
}
bool VCCLCompilerTool::parseOption( const char* option )
{
// skip index 0 ('/' or '-')
char first = option[1];
char second = option[2];
char third = option[3];
char fourth = option[4];
@@ -465,40 +451,47 @@ bool VCCLCompilerTool::parseOption( const char* option )
case '@':
qWarning( "Generator: Option '/@': MSVC.NET projects do not support the use of a response file" );
found = FALSE;
break;
case 'l':
qWarning( "Generator: Option '/link': qmake generator does not support passing link options through the compiler tool" );
found = FALSE;
break;
case 'A':
if ( second != 'I' ) {
found = FALSE; break;
}
- AdditionalUsingDirectories += option+2;
+ AdditionalUsingDirectories += option+3;
break;
case 'C':
KeepComments = _True;
break;
case 'D':
- PreprocessorDefinitions += option+1;
+ PreprocessorDefinitions += option+2;
break;
case 'E':
if ( second == 'H' ) {
- if ( third == 'a' || third == 'c' || third == 's' ) {
+ if ( third == 'a'
+ || (third == 'c' && fourth != 's')
+ || (third == 's' && fourth != 'c') ) {
// ExceptionHandling must be false, or it will override
// with an /EHsc option
ExceptionHandling = _False;
AdditionalOptions += option;
break;
+ } else if ( (third == 'c' && fourth == 's')
+ || (third == 's' && fourth == 'c') ) {
+ ExceptionHandling = _True;
+ AdditionalOptions += option;
+ break;
}
found = FALSE; break;
}
GeneratePreprocessedFile = preprocessYes;
break;
case 'F':
if ( second <= '9' && second >= '0' ) {
AdditionalOptions += option;
break;
} else {
switch ( second ) {
case 'A':
@@ -582,24 +575,27 @@ bool VCCLCompilerTool::parseOption( const char* option )
case 'R':
RuntimeTypeInfo = _True;
if ( third == '-' )
RuntimeTypeInfo = _False;
break;
case 'S':
BufferSecurityCheck = _True;
break;
case 'T':
EnableFiberSafeOptimizations = _True;
break;
case 'X':
+ // ExceptionHandling == true will override with
+ // an /EHsc option, which is correct with /GX
+ ExceptionHandling = _True; // Fall-through
case 'Z':
case 'e':
case 'h':
AdditionalOptions += option;
break;
case 'd':
CallingConvention = callConventionCDecl;
break;
case 'f':
StringPooling = _True;
AdditionalOptions += option;
break;
@@ -945,28 +941,28 @@ bool VCCLCompilerTool::parseOption( const char* option )
return TRUE;
}
// VCLinkerTool -----------------------------------------------------
VCLinkerTool::VCLinkerTool()
: EnableCOMDATFolding( optFoldingDefault ),
GenerateDebugInformation( unset ),
GenerateMapFile( unset ),
HeapCommitSize( -1 ),
HeapReserveSize( -1 ),
IgnoreAllDefaultLibraries( unset ),
IgnoreEmbeddedIDL( unset ),
- IgnoreImportLibrary( unset ),
+ IgnoreImportLibrary( _True ),
LargeAddressAware( addrAwareDefault ),
LinkDLL( unset ),
- LinkIncremental( linkIncrementalYes ),
+ LinkIncremental( linkIncrementalDefault ),
LinkTimeCodeGeneration( unset ),
MapExports( unset ),
MapLines( unset ),
OptimizeForWindows98( optWin98Default ),
OptimizeReferences( optReferencesDefault ),
RegisterOutput( unset ),
ResourceOnlyDLL( unset ),
SetChecksum( unset ),
ShowProgress( linkProgressNotSet ),
StackCommitSize( -1 ),
StackReserveSize( -1 ),
SubSystem( subSystemNotSet ),
@@ -1010,25 +1006,25 @@ QTextStream &operator<<( QTextStream &strm, const VCLinkerTool &tool )
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 );
strm << SPair( _MergedIDLBaseFileName, tool.MergedIDLBaseFileName );
strm << SPair( _MergeSections, tool.MergeSections );
strm << SPair( _MidlCommandFile, tool.MidlCommandFile );
strm << SPair( _ModuleDefinitionFile, tool.ModuleDefinitionFile );
if ( tool.OptimizeForWindows98 != optWin98Default ) strm << EPair( _OptimizeForWindows98, tool.OptimizeForWindows98 );
if ( tool.OptimizeReferences != optReferencesDefault ) strm << EPair( _OptimizeReferences, tool.OptimizeReferences );
strm << SPair( _OutputFile, tool.OutputFile );
- strm << SPair( _ProgramDatabaseFile, tool.ProgramDatabaseFile );
+ strm << _ProgramDatabaseFile << tool.ProgramDatabaseFile << "\"";
strm << TPair( _RegisterOutput, tool.RegisterOutput );
strm << TPair( _ResourceOnlyDLL, tool.ResourceOnlyDLL );
strm << TPair( _SetChecksum, tool.SetChecksum );
if ( tool.ShowProgress != linkProgressNotSet ) strm << EPair( _ShowProgress, tool.ShowProgress );
if ( tool.StackCommitSize != -1 ) strm << LPair( _StackCommitSize, tool.StackCommitSize );
if ( tool.StackReserveSize != -1 ) strm << LPair( _StackReserveSize, tool.StackReserveSize );
strm << SPair( _StripPrivateSymbols, tool.StripPrivateSymbols );
strm << EPair( _SubSystem, tool.SubSystem );
strm << TPair( _SupportUnloadOfDelayLoadedDLL, tool.SupportUnloadOfDelayLoadedDLL );
strm << TPair( _SuppressStartupBanner, tool.SuppressStartupBanner );
strm << TPair( _SwapRunFromCD, tool.SwapRunFromCD );
strm << TPair( _SwapRunFromNet, tool.SwapRunFromNet );
@@ -1698,27 +1694,27 @@ QTextStream &operator<<( QTextStream &strm, const VCLibrarianTool &tool )
// 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 << XPair( _CommandLine4, tool.CommandLine, "\n" );
strm << SPair( _Description4, tool.Description );
- strm << SPair( _Outputs4, tool.Outputs );
+ strm << XPair( _Outputs4, tool.Outputs, ";" );
strm << SPair( _ToolPath, tool.ToolPath );
strm << "/>";
return strm;
}
// VCResourceCompilerTool -------------------------------------------
VCResourceCompilerTool::VCResourceCompilerTool()
: Culture( rcUseDefault ),
IgnoreStandardIncludePath( unset ),
ShowProgress( linkProgressNotSet )
{
PreprocessorDefinitions = "NDEBUG";
@@ -1817,61 +1813,57 @@ QTextStream &operator<<( QTextStream &strm, const VCConfiguration &tool )
strm << tool.idl;
strm << tool.postBuild;
strm << tool.preBuild;
strm << tool.preLink;
strm << tool.resource;
strm << _endConfiguration;
return strm;
}
// VCFilter ---------------------------------------------------------
VCFilter::VCFilter()
: ParseFiles( unset )
{
+ useCustomBuildTool = FALSE;
+ useCompilerTool = FALSE;
}
-void VCFilter::generateMOC( QTextStream &strm, QString str ) const
+void VCFilter::addMOCstage( QTextStream &strm, QString filename )
{
- QString mocOutput = Project->findMocDestination( str );
+ QString mocOutput = Project->findMocDestination( filename );
QString mocApp = Project->var( "QMAKE_MOC" );
- if( mocOutput.isEmpty() ) {
+ if( mocOutput.isEmpty() && filename.endsWith(".moc") ) {
// In specialcases we DO moc .cpp files
// when the result is an .moc file
- if ( !str.endsWith(".moc") )
- return;
- mocOutput = str;
- str = Project->findMocSource( mocOutput );
+ mocOutput = filename;
+ filename = Project->findMocSource( mocOutput );
}
- strm << _begFileConfiguration;
- 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;
+ if (mocOutput.isEmpty())
+ return;
+
+ CustomBuildTool = VCCustomBuildTool();
+ useCustomBuildTool = TRUE;
+ CustomBuildTool.Description = "Moc&apos;ing " + filename + "...";
+ CustomBuildTool.CommandLine += (mocApp + " "
+ + filename + " -o " + mocOutput);
+ CustomBuildTool.AdditionalDependencies = mocApp;
+ CustomBuildTool.Outputs += mocOutput;
}
-void VCFilter::generateUIC( QTextStream &strm, const QString& str ) const
+void VCFilter::addUICstage( QTextStream &strm, QString str )
{
+ CustomBuildTool = VCCustomBuildTool();
+ useCustomBuildTool = TRUE;
+
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() ) {
@@ -1886,107 +1878,236 @@ void VCFilter::generateUIC( QTextStream &strm, const QString& str ) const
uiSources = pname;
}
if( !uiHeaders.endsWith( "\\" ) )
uiHeaders += "\\";
if( !uiSources.endsWith( "\\" ) )
uiSources += "\\";
// Determine the file name.
int dot = fname.findRev( '.' );
if( dot != -1 )
fname.truncate( dot );
- strm << _begFileConfiguration;
- strm << _Name5;
- strm << Config->Name;
- strm << "\">";
- strm << _begTool5;
- strm << _VCCustomBuildTool;
- strm << _Description6;
- strm << "Uic'ing " << str << "...\"";
- strm << _CommandLine6;
- 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 << uiHeaders << fname << ".h;" << uiSources << fname << ".cpp;" << mocDir << "moc_" << fname << ".cpp\"";
- strm << "/>";
- strm << _endFileConfiguration;
+ if ( mocDir.isEmpty() )
+ mocDir = pname;
+
+ CustomBuildTool.Description = ("Uic'ing " + str + "...\"");
+ CustomBuildTool.CommandLine += // Create .h from .ui file
+ uicApp + " " + str + " -o " + uiHeaders + fname + ".h";
+ CustomBuildTool.CommandLine += // Create .cpp from .ui file
+ uicApp + " " + str + " -i " + fname + ".h -o " + uiSources + fname + ".cpp";
+ CustomBuildTool.CommandLine += // Moc the headerfile
+ mocApp + " " + uiHeaders + fname + ".h -o " + mocDir + Option::h_moc_mod + fname + Option::h_moc_ext;
+
+ CustomBuildTool.AdditionalDependencies += mocApp;
+ CustomBuildTool.AdditionalDependencies += uicApp;
+ CustomBuildTool.Outputs +=
+ uiHeaders + fname + ".h;" + uiSources + fname + ".cpp;" + mocDir + Option::h_moc_mod + fname + Option::h_moc_ext;
+}
+
+void VCFilter::modifyPCHstage( QTextStream &strm, QString str )
+{
+ bool isCFile = str.endsWith(".c");
+ bool isHFile = (str.endsWith(".h") && str == Project->precompH);
+
+ if (!isCFile && !isHFile)
+ return;
+
+ CompilerTool = VCCLCompilerTool();
+ useCompilerTool = TRUE;
+
+ // Unset some default options
+ CompilerTool.BufferSecurityCheck = unset;
+ CompilerTool.DebugInformationFormat = debugUnknown;
+ CompilerTool.ExceptionHandling = unset;
+ CompilerTool.GeneratePreprocessedFile = preprocessUnknown;
+ CompilerTool.Optimization = optimizeDefault;
+ CompilerTool.ProgramDataBaseFileName = QString::null;
+ CompilerTool.RuntimeLibrary = rtUnknown;
+ CompilerTool.WarningLevel = warningLevelUnknown;
+
+ // Setup PCH options
+ CompilerTool.UsePrecompiledHeader = (isCFile ? pchNone : pchCreateUsingSpecific);
+ CompilerTool.PrecompiledHeaderThrough = "$(NOINHERIT)";
+ CompilerTool.ForcedIncludeFiles = "$(NOINHERIT)";
}
-QTextStream &operator<<( QTextStream &strm, const VCFilter &tool )
+bool VCFilter::addIMGstage( QTextStream &strm, QString str )
+{
+ bool isCorH = FALSE;
+ if (str.endsWith(".c") || str.endsWith(".rc"))
+ isCorH = TRUE;
+ QStringList::Iterator it;
+ for(it = Option::cpp_ext.begin(); it != Option::cpp_ext.end(); ++it)
+ if(str.endsWith(*it))
+ isCorH = TRUE;
+ for(it = Option::h_ext.begin(); it != Option::h_ext.end(); ++it)
+ if(str.endsWith(*it))
+ isCorH = TRUE;
+
+ QString collectionName = Project->project->first("QMAKE_IMAGE_COLLECTION");
+ if (str.isEmpty() || isCorH || collectionName.isEmpty())
+ return FALSE;
+
+ CustomBuildTool = VCCustomBuildTool();
+ useCustomBuildTool = TRUE;
+
+ // Some projects (like designer core) may have too many images to
+ // call uic directly. Therefor we have to create a temporary
+ // file, with the image list, and call uic with the -f option.
+ QString tmpFileCmd = "echo ";
+ QString tmpImageFilename = ".imgcol";
+ QStringList& list = Project->project->variables()["IMAGES"];
+ bool firstOutput = TRUE;
+ it = list.begin();
+ while( it!=list.end() ) {
+ tmpFileCmd += (*it) + " ";
+ ++it;
+ if (tmpFileCmd.length()>250 || it==list.end()) {
+ CustomBuildTool.CommandLine += tmpFileCmd
+ + (firstOutput?"> ":">> ")
+ + tmpImageFilename;
+ tmpFileCmd = "echo ";
+ firstOutput = FALSE;
+ }
+ }
+
+ QString uicApp = Project->var("QMAKE_UIC");
+ CustomBuildTool.Description = ("Generate imagecollection");
+ CustomBuildTool.CommandLine +=
+ uicApp + " -embed " + Project->project->first("QMAKE_ORIG_TARGET")
+ + " -f .imgcol -o " + collectionName;
+ CustomBuildTool.AdditionalDependencies += uicApp;
+ CustomBuildTool.AdditionalDependencies += list;
+ CustomBuildTool.Outputs = collectionName;
+ CustomBuildTool.Outputs += tmpImageFilename;
+ return TRUE;
+}
+
+QTextStream &operator<<( QTextStream &strm, 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 << ">";
+
+ bool resourceBuild = FALSE;
+ int currentLevels = 0;
+ QStringList currentDirs;
for ( QStringList::ConstIterator it = tool.Files.begin(); it != tool.Files.end(); ++it ) {
+ if ( !tool.flat_files ) {
+ QStringList newDirs = QStringList::split('\\',(*it));
+ newDirs.pop_back(); // Skip the filename
+
+ int newLevels = int(newDirs.count());
+ int equalLevels = 0;
+ for (int i = 0; i<currentLevels; i++, equalLevels++ )
+ if (currentDirs[i] != newDirs[i])
+ break;
+ int closeFilters = currentLevels - equalLevels;
+ int openFilters = newLevels - equalLevels;
+
+ // close previous non-equal filter
+ while ( closeFilters-- )
+ strm << _endFilter;
+
+ // open new non-equal filters
+ newLevels = 0;
+ while ( openFilters-- ) {
+ strm << _begFilter;
+ strm << SPair( _Name3, newDirs[equalLevels + newLevels] );
+ strm << _Filter << "\">"; // Blank filter
+ ++newLevels;
+ }
+ currentDirs = newDirs;
+ currentLevels = int(newDirs.count());
+ }
+
+ tool.useCustomBuildTool = FALSE;
+ tool.useCompilerTool = FALSE;
+ // Add UIC, MOC and PCH stages to file
+ if ( tool.CustomBuild == moc )
+ tool.addMOCstage( strm, *it );
+ else if ( tool.CustomBuild == uic )
+ tool.addUICstage( strm, *it );
+ else if ( tool.CustomBuild == resource ) {
+ if (!resourceBuild)
+ resourceBuild = tool.addIMGstage(strm, *it);
+ }
+ if (tool.Project->usePCH)
+ tool.modifyPCHstage( strm, *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 );
+ // Output custom build and compiler options
+ // for all configurations
+ if (tool.useCustomBuildTool || tool.useCompilerTool) {
+ for ( uint i = 0; i < tool.Config->count(); i++ ) {
+ strm << _begFileConfiguration;
+ strm << _Name5;
+ strm << (*tool.Config)[i].Name;
+ strm << "\">";
+ if (tool.useCustomBuildTool)
+ strm << tool.CustomBuildTool;
+ if (tool.useCompilerTool)
+ strm << tool.CompilerTool;
+ strm << _endFileConfiguration;
+ }
+ }
strm << _endFile;
}
-
+ // close remaining open filters, in non-flat mode
+ while ( !tool.flat_files && currentLevels-- ) {
+ strm << _endFilter;
+ }
strm << _endFilter;
return strm;
}
// VCProject --------------------------------------------------------
VCProject::VCProject()
{
-#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
+ VCConfiguration conf;
+ Configuration += conf ; // Release
+ //Configuration += conf ; // Debug added later, after Release init
}
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 );
strm << "/>";
strm << _endPlatforms;
strm << _begConfigurations;
- strm << tool.Configuration;
+ for ( uint i = 0; i < tool.Configuration.count(); i++ )
+ strm << tool.Configuration[i];
strm << _endConfigurations;
strm << _begFiles;
- strm << tool.SourceFiles;
- strm << tool.HeaderFiles;
- strm << tool.MOCFiles;
- strm << tool.UICFiles;
- strm << tool.FormFiles;
- strm << tool.TranslationFiles;
- strm << tool.LexYaccFiles;
- strm << tool.ResourceFiles;
+ strm << (VCFilter&)tool.SourceFiles;
+ strm << (VCFilter&)tool.HeaderFiles;
+ strm << (VCFilter&)tool.MOCFiles;
+ strm << (VCFilter&)tool.UICFiles;
+ strm << (VCFilter&)tool.FormFiles;
+ strm << (VCFilter&)tool.TranslationFiles;
+ strm << (VCFilter&)tool.LexYaccFiles;
+ strm << (VCFilter&)tool.ResourceFiles;
strm << _endFiles;
strm << _begGlobals;
strm << _endGlobals;
strm << _endVisualStudioProject;
return strm;
}