From 5042e3cf0d3514552769e441f5aad590c8eaf967 Mon Sep 17 00:00:00 2001 From: kergoth Date: Fri, 01 Nov 2002 00:10:42 +0000 Subject: Adding qmake in preperation for new build system --- (limited to 'qmake/generators/win32/msvc_objectmodel.cpp') diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp new file mode 100644 index 0000000..c2b9e30 --- a/dev/null +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -0,0 +1,1955 @@ +/**************************************************************************** +** $Id$ +** +** Definition of ________ class. +** +** Copyright (C) 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_objectmodel.h" +#include "msvc_vcproj.h" +#include +#include +#include + +#if defined(Q_OS_WIN32) +#include +#ifndef GUID_DEFINED +#define GUID_DEFINED +typedef struct _GUID +{ + ulong Data1; + ushort Data2; + ushort Data3; + uchar Data4[8]; +} GUID; +#endif +#endif + +// XML Tags --------------------------------------------------------- +const char* _xmlInit = ""; +const char* _begConfiguration = "\n\t\t"; +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]; + + switch ( first ) { + case '?': + case 'h': + qWarning( "Generator: Option '/?', '/help': MSVC.NET projects do not support outputting help info" ); + return FALSE; + case '@': + qWarning( "Generator: Option '/@': MSVC.NET projects do not support the use of a response file" ); + return FALSE; + case 'l': + qWarning( "Generator: Option '/link': qmake generator does not support passing link options through the compiler tool" ); + return FALSE; + + case 'A': + if ( second != 'I' ) + return FALSE; + 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; + } + 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': + ForcedIncludeFiles += option+3; + break; + case 'R': + BrowseInformation = brAllInfo; + BrowseInformationFile = option+3; + break; + case 'r': + BrowseInformation = brNoLocalSymbols; + 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; + } + } + break; + case 'G': + switch ( second ) { + case '3': + case '4': + qWarning( "Option '/G3' and '/G4' were phased out in Visual C++ 5.0" ); + return FALSE; + 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 == '-' ) + RuntimeTypeInfo = _False; + break; + case 'S': + BufferSecurityCheck = _True; + break; + case 'T': + EnableFiberSafeOptimizations = _True; + break; + case 'X': + case 'Z': + case 'e': + case 'h': + AdditionalOptions += option; + break; + case 'd': + CallingConvention = callConventionCDecl; + break; + 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; + } + break; + case 'H': + AdditionalOptions += option; + break; + case 'I': + AdditionalIncludeDirectories += option+2; + break; + case 'L': + if ( second == 'D' ) { + AdditionalOptions += option; + break; + } + return FALSE; + 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; + 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; + 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; + } + break; + case 'P': + GeneratePreprocessedFile = preprocessYes; + break; + case 'Q': + if ( second == 'I' ) { + AdditionalOptions += option; + break; + } + return FALSE; + 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; + } + break; + case 'T': + if ( second == 'C' ) { + CompileAs = compileAsC; + } else if ( second == 'P' ) { + CompileAs = compileAsCPlusPlus; + } else { + qWarning( "Generator: Options '/Tp' and '/Tc' are not supported by qmake" ); + return FALSE; + } + 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; + } + 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; + } + 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; + } else { + return FALSE; + } + 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; + } + break; + default: + return FALSE; + } + 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; + } + break; + case 'd': + if ( second != 'r' ) + return FALSE; + 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; + case 's': + if ( second == 'h' && third == 'o' && fourth == 'w' ) { + ShowIncludes = _True; + break; + } + return FALSE; + case 'u': + UndefineAllPreprocessorDefinitions = _True; + break; + case 'v': + if ( second == 'd' || second == 'm' ) { + AdditionalOptions += option; + break; + } + return FALSE; + case 'w': + switch ( second ) { + case '\0': + WarningLevel = warningLevel_0; + break; + case 'd': + DisableSpecificWarnings += option+3; + break; + default: + AdditionalOptions += option; + } + break; + default: + return FALSE; + } + 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( _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 ); + 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 << 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 ); + 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)!= ':' && + (*k)!=',' && + (*k)!=' ' ) { + h = ( h << 4 ) + *k++; + if ( (g = (h & 0xf0000000)) != 0 ) + h ^= g >> 24; + h &= ~g; + } + } + if ( !h ) + h = 1; + return h; +} +static void displayHash( const char* str ) +{ + printf( "case 0x%07x: // %s\n break;\n", elfHash(str), str ); +} + +bool VCLinkerTool::parseOption( const char* option ) +{ +#if 0 + // 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( "/VXD" ); displayHash( "/WS " ); +#endif +#if 0 + // 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" ); +#endif + + 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 + // 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; + case 0xb28103c: // /INCREMENTAL[:no] + if ( *(option+12) == ':' && + *(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, + // 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; + } + 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; + else + IgnoreDefaultLibraryNames += option+14; + break; + case 0x33a3a39: // /NOENTRY + ResourceOnlyDLL = _True; + break; + case 0x434138f: // /NOLOGO + SuppressStartupBanner = _True; + break; + case 0x0034454: // /OPT:{REF | NOREF | ICF[=iterations] | NOICF | WIN98 | NOWIN98} + { + 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; + } + } + 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; + } + } + break; + case 0x8b654de: // /SWAPRUN:{NET | CD} + if ( *(option+9) == 'N' ) + SwapRunFromNet = _True; + else if ( *(option+9) == 'C' ) + SwapRunFromCD = _True; + else + return 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; + } + return TRUE; +} + +// 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( _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 + 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( "/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 " ); 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( "/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 + 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; + } + 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; + } + 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; + ErrorCheckStubData = _True; + default: + return 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; + break; + case 0x00366c4: // /out directory + OutputDirectory = option+5; + break; + case 0x36796f9: // /proxy filename + ProxyFileName = option+7; + break; + case 0x6959c94: // /robust + ValidateParameters = _True; + break; + case 0x6a88df4: // /target {system} + if ( *(option+11) == '6' ) + TargetEnvironment = midlTargetWin64; + else + TargetEnvironment = midlTargetWin32; + break; + case 0x0036b22: // /tlb filename + TypeLibraryName = option+5; + break; + case 0x36e0162: // /win32 + TargetEnvironment = midlTargetWin32; + break; + case 0x36e0194: // /win64 + TargetEnvironment = midlTargetWin64; + break; + case 0x0003459: // /Oi + case 0x00345f3: // /Oic + case 0x0003463: // /Os + case 0x0003513: // /Zs + case 0x0035796: // /acf filename + case 0x5b1cb97: // /app_config + case 0x3595cf4: // /c_ext + case 0x5a2fc64: // /client {none|stub} + case 0xa64d3dd: // /confirm + case 0xa765b64: // /cpp_cmd cmd_line + case 0x35aabb2: // /cstub filename + case 0x03629f4: // /lcid + case 0x6495cc4: // /ms_ext + case 0x96c7a1e: // /ms_union + case 0x4996fa2: // /msc_ver + case 0x64ceb12: // /newtlb + case 0x6555a40: // /no_cpp + case 0xf64d6a6: // /no_default_epv + case 0x6dd9384: // /no_format_opt + case 0x556dbee: // /no_warn + case 0x3655a70: // /nocpp + case 0x2b455a3: // /oldnames + case 0x662bb12: // /oldtlb + case 0x0036696: // /osf + case 0x036679b: // /pack {N} + case 0x678bd38: // /prefix {all|client|server|switch} + case 0x96b702c: // /protocol {all|dce|ndr64} + case 0x3696aa3: // /rpcss + case 0x698ca60: // /savePP + case 0x69c9cf2: // /server {none|stub} + case 0x36aabb2: // /sstub filename + 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; + } + } + break; + } + 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( _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 ); + 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 --------------------------------------------- +VCPostBuildEventTool::VCPostBuildEventTool() +{ + ToolName = "VCPostBuildEventTool"; +} + +// VCPreBuildEventTool ---------------------------------------------- +VCPreBuildEventTool::VCPreBuildEventTool() +{ + ToolName = "VCPreBuildEventTool"; +} + +// VCPreLinkEventTool ----------------------------------------------- +VCPreLinkEventTool::VCPreLinkEventTool() +{ + ToolName = "VCPreLinkEventTool"; +} + +// VCConfiguration -------------------------------------------------- + +VCConfiguration::VCConfiguration() + : ATLMinimizesCRunTimeLibraryUsage( unset ), + BuildBrowserInformation( unset ), + CharacterSet( charSetNotSet ), + ConfigurationType( typeApplication ), + RegisterOutput( unset ), + UseOfATL( useATLNotSet ), + UseOfMfc( useMfcStdWin ), + WholeProgramOptimization( unset ) +{ + compiler.config = this; + linker.config = this; + idl.config = this; +} + +QTextStream &operator<<( QTextStream &strm, const VCConfiguration &tool ) +{ + strm << _begConfiguration; + strm << SPair( _Name3, tool.Name ); + strm << SPair( _OutputDirectory3, tool.OutputDirectory ); + strm << TPair( _ATLMinimizesCRunTimeLibraryUsage, tool.ATLMinimizesCRunTimeLibraryUsage ); + strm << TPair( _BuildBrowserInformation, tool.BuildBrowserInformation ); + if ( tool.CharacterSet != charSetNotSet) strm << EPair( _CharacterSet, tool.CharacterSet ); + strm << EPair( _ConfigurationType, tool.ConfigurationType ); + strm << SPair( _DeleteExtensionsOnClean, tool.DeleteExtensionsOnClean ); + strm << SPair( _ImportLibrary, tool.ImportLibrary ); + strm << SPair( _IntermediateDirectory, tool.IntermediateDirectory ); + strm << SPair( _PrimaryOutput, tool.PrimaryOutput ); + strm << SPair( _ProgramDatabase, tool.ProgramDatabase ); + strm << TPair( _RegisterOutput, tool.RegisterOutput ); + if ( tool.UseOfATL != useATLNotSet) strm << EPair( _UseOfATL, tool.UseOfATL ); + strm << EPair( _UseOfMfc, tool.UseOfMfc ); + strm << TPair( _WholeProgramOptimization, tool.WholeProgramOptimization ); + strm << ">"; + strm << tool.compiler; + strm << tool.custom; + if ( tool.ConfigurationType == typeStaticLibrary ) + strm << tool.librarian; + else + strm << tool.linker; + strm << tool.idl; + strm << tool.postBuild; + strm << tool.preBuild; + strm << tool.preLink; + strm << tool.resource; + strm << _endConfiguration; + return strm; +} +// VCFilter --------------------------------------------------------- +VCFilter::VCFilter() + : ParseFiles( unset ) +{ +} + +void VCFilter::generateMOC( QTextStream &strm, QString str ) const +{ + QString mocOutput = Project->findMocDestination( str ); + QString mocApp = Project->var( "QMAKE_MOC" ); + + if( mocOutput.isEmpty() ) { + // 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 ); + } + + 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; +} + +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" ); + int dot = fname.findRev( '.' ); + 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 && "; // Create .h from .ui file + strm << uicApp << " " << str << " -i " << fname << ".h -o " << pname << fname << ".cpp && "; // Create .cpp from .ui file + strm << mocApp << " " << pname << 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 << "/>"; + 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; + 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 ); + strm << "/>"; + strm << _endPlatforms; + strm << _begConfigurations; + strm << tool.Configuration; + 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 << _endFiles; + strm << _begGlobals; + strm << _endGlobals; + strm << _endVisualStudioProject; + return strm; +} -- cgit v0.9.0.2