📄 msvc_vcproj.cpp
字号:
VcsolutionDepend *vc = solution_depends[*dit]; if(vc) t << "\n\t\t" << solution_cleanup.current()->uuid << "." << cnt++ << " = " << vc->uuid; } } t << _slnProjDepEnd; t << _slnProjConfBeg; for(solution_cleanup.first(); solution_cleanup.current(); solution_cleanup.next()) { t << "\n\t\t" << solution_cleanup.current()->uuid << _slnProjDbgConfTag1; t << "\n\t\t" << solution_cleanup.current()->uuid << _slnProjDbgConfTag2; t << "\n\t\t" << solution_cleanup.current()->uuid << _slnProjRelConfTag1; t << "\n\t\t" << solution_cleanup.current()->uuid << _slnProjRelConfTag2; } t << _slnProjConfEnd; t << _slnExtSections; t << _slnGlobalEnd;}// ------------------------------------------------------------------------------------------------// ------------------------------------------------------------------------------------------------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 ); // Are we using Qt? bool isQtActive = project->isActiveConfig("qt"); if ( isQtActive ) { project->variables()["CONFIG"] += "moc"; project->variables()["CONFIG"] += "windows"; project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR_QT"]; project->variables()["QMAKE_LIBDIR"] += project->variables()["QMAKE_LIBDIR_QT"]; if( projectTarget == SharedLib ) project->variables()["DEFINES"] += "QT_DLL"; if( project->isActiveConfig("accessibility" ) ) project->variables()["DEFINES"] += "QT_ACCESSIBILITY_SUPPORT"; if ( project->isActiveConfig("plugin")) { project->variables()["DEFINES"] += "QT_PLUGIN"; project->variables()["CONFIG"] += "dll"; } if( project->isActiveConfig("thread") ) { project->variables()["DEFINES"] += "QT_THREAD_SUPPORT"; project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT_THREAD"]; } else { project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_QT"]; } } if ( project->isActiveConfig("opengl") ) { project->variables()["CONFIG"] += "windows"; // <-- Also in 'qt' above project->variables()["QMAKE_LIBS"] += project->variables()["QMAKE_LIBS_OPENGL"]; project->variables()["QMAKE_LFLAGS"] += project->variables()["QMAKE_LFLAGS_OPENGL"]; }*/ initOld(); // Currently calling old DSP code to set variables. CLEAN UP! // Figure out what we're trying to build if ( project->first("TEMPLATE") == "vcapp" ) { projectTarget = Application; } else if ( project->first("TEMPLATE") == "vclib") { if ( project->isActiveConfig( "staticlib" ) ) projectTarget = StaticLib; else projectTarget = SharedLib; } // Setup PCH variables precompH = project->first("PRECOMPILED_HEADER"); usePCH = !precompH.isEmpty() && project->isActiveConfig("precompile_header"); if (usePCH) { precompHFilename = QFileInfo(precompH).fileName(); // Created files QString origTarget = project->first("QMAKE_ORIG_TARGET"); precompObj = origTarget + Option::obj_ext; precompPch = origTarget + ".pch"; // Add PRECOMPILED_HEADER to HEADERS if (!project->variables()["HEADERS"].contains(precompH)) project->variables()["HEADERS"] += precompH; // Return to variable pool project->variables()["PRECOMPILED_OBJECT"] = precompObj; project->variables()["PRECOMPILED_PCH"] = precompPch; } initProject(); // Fills the whole project with proper data}void VcprojGenerator::initProject(){ // Initialize XML sub elements // - Do this first since project elements may need // - to know of certain configuration options initConfiguration(); initSourceFiles(); initHeaderFiles(); initMOCFiles(); initUICFiles(); initFormsFiles(); initTranslationFiles(); initLexYaccFiles(); initResourceFiles(); // Own elements ----------------------------- vcProject.Name = project->first("QMAKE_ORIG_TARGET"); vcProject.Version = use_net2003_version() ? "7.10" : "7.00"; vcProject.ProjectGUID = getProjectUUID().toString().upper(); vcProject.PlatformName = ( vcProject.Configuration[0].idl.TargetEnvironment == midlTargetWin64 ? "Win64" : "Win32" ); // These are not used by Qt, but may be used by customers vcProject.SccProjectName = project->first("SCCPROJECTNAME"); vcProject.SccLocalPath = project->first("SCCLOCALPATH");}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[0].ConfigurationType = typeDynamicLibrary; break; case StaticLib: vcProject.Configuration[0].ConfigurationType = typeStaticLibrary; break; case Application: default: vcProject.Configuration[0].ConfigurationType = typeApplication; break; } // Release version of the Configuration --------------- VCConfiguration &RConf = vcProject.Configuration[0]; RConf.Name = "Release"; RConf.Name += ( RConf.idl.TargetEnvironment == midlTargetWin64 ? "|Win64" : "|Win32" ); RConf.ATLMinimizesCRunTimeLibraryUsage = ( project->first("ATLMinimizesCRunTimeLibraryUsage").isEmpty() ? _False : _True ); RConf.BuildBrowserInformation = triState( temp.isEmpty() ? (short)unset : temp.toShort() ); temp = project->first("CharacterSet"); RConf.CharacterSet = charSet( temp.isEmpty() ? (short)charSetNotSet : temp.toShort() ); RConf.DeleteExtensionsOnClean = project->first("DeleteExtensionsOnClean"); RConf.ImportLibrary = RConf.linker.ImportLibrary; RConf.IntermediateDirectory = project->first("OBJECTS_DIR"); RConf.OutputDirectory = "."; RConf.PrimaryOutput = project->first("PrimaryOutput"); RConf.WholeProgramOptimization = RConf.compiler.WholeProgramOptimization; temp = project->first("UseOfATL"); if ( !temp.isEmpty() ) RConf.UseOfATL = useOfATL( temp.toShort() ); temp = project->first("UseOfMfc"); if ( !temp.isEmpty() ) RConf.UseOfMfc = useOfMfc( temp.toShort() ); // Configuration does not need parameters from // these sub XML items; initCustomBuildTool(); initPreBuildEventTools(); initPostBuildEventTools(); initPreLinkEventTools(); // Debug version of the Configuration ----------------- VCConfiguration DConf = vcProject.Configuration[0]; // Create copy configuration for debug DConf.Name = "Debug"; DConf.Name += ( DConf.idl.TargetEnvironment == midlTargetWin64 ? "|Win64" : "|Win32" ); // Set definite values in both configurations DConf.compiler.PreprocessorDefinitions.remove("NDEBUG"); RConf.compiler.PreprocessorDefinitions += "NDEBUG"; RConf.linker.GenerateDebugInformation = _False; DConf.linker.GenerateDebugInformation = _True; // Modify configurations, based on Qt build if ( project->isActiveConfig("debug") ) { RConf.IntermediateDirectory = RConf.compiler.AssemblerListingLocation = RConf.compiler.ObjectFile = "Release\\"; RConf.librarian.OutputFile = RConf.linker.OutputFile = RConf.IntermediateDirectory + "\\" + project->first("MSVCPROJ_TARGET"); RConf.linker.parseOptions(project->variables()["QMAKE_LFLAGS_RELEASE"]); RConf.compiler.parseOptions(project->variables()["QMAKE_CFLAGS_RELEASE"]); RConf.compiler.parseOptions(project->variables()["QMAKE_CXXFLAGS_RELEASE"]); if (!project->variables()["QMAKE_CXXFLAGS_RELEASE"].contains("Gm") && project->variables()["QMAKE_CXXFLAGS_DEBUG"].contains("Gm")) RConf.compiler.parseOption("-Gm-"); if (RConf.compiler.PreprocessorDefinitions.findIndex("QT_NO_DEBUG") == -1) RConf.compiler.PreprocessorDefinitions += "QT_NO_DEBUG"; } else { DConf.IntermediateDirectory = DConf.compiler.AssemblerListingLocation = DConf.compiler.ObjectFile = "Debug\\"; DConf.librarian.OutputFile = DConf.linker.OutputFile = DConf.IntermediateDirectory + "\\" + project->first("MSVCPROJ_TARGET"); DConf.linker.DelayLoadDLLs.clear(); DConf.compiler.parseOptions(project->variables()["QMAKE_CFLAGS_DEBUG"]); DConf.compiler.parseOptions(project->variables()["QMAKE_CXXFLAGS_DEBUG"]); DConf.compiler.PreprocessorDefinitions.remove("QT_NO_DEBUG"); } // Add Debug configuration to project vcProject.Configuration += DConf;}void VcprojGenerator::initCompilerTool(){ QString placement = project->first("OBJECTS_DIR"); if ( placement.isEmpty() ) placement = ".\\"; VCConfiguration &RConf = vcProject.Configuration[0]; RConf.compiler.AssemblerListingLocation = placement ; RConf.compiler.ProgramDataBaseFileName = ".\\" ; RConf.compiler.ObjectFile = placement ; // PCH if ( usePCH ) { RConf.compiler.UsePrecompiledHeader = pchUseUsingSpecific; RConf.compiler.PrecompiledHeaderFile = "$(IntDir)\\" + precompPch; RConf.compiler.PrecompiledHeaderThrough = precompHFilename; RConf.compiler.ForcedIncludeFiles = precompHFilename; // Minimal build option triggers an Internal Compiler Error // when used in conjunction with /FI and /Yu, so remove it project->variables()["QMAKE_CFLAGS_DEBUG"].remove("-Gm"); project->variables()["QMAKE_CFLAGS_DEBUG"].remove("/Gm"); project->variables()["QMAKE_CXXFLAGS_DEBUG"].remove("-Gm"); project->variables()["QMAKE_CXXFLAGS_DEBUG"].remove("/Gm"); } if ( project->isActiveConfig("debug") ){ // Debug version RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS"] ); RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_DEBUG"] ); if ( project->isActiveConfig("thread") ) { if ( (projectTarget == Application) || (projectTarget == StaticLib) ) RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DBG"] ); else RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DLLDBG"] ); } } else { // Release version RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS"] ); RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_RELEASE"] ); RConf.compiler.PreprocessorDefinitions += "QT_NO_DEBUG"; RConf.compiler.PreprocessorDefinitions += "NDEBUG"; if ( project->isActiveConfig("thread") ) { if ( (projectTarget == Application) || (projectTarget == StaticLib) ) RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT"] ); else RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_MT_DLL"] ); } } // Common for both release and debug if ( project->isActiveConfig("warn_off") ) RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_WARN_OFF"] ); else if ( project->isActiveConfig("warn_on") ) RConf.compiler.parseOptions( project->variables()["QMAKE_CXXFLAGS_WARN_ON"] ); if ( project->isActiveConfig("windows") ) RConf.compiler.PreprocessorDefinitions += project->variables()["MSVCPROJ_WINCONDEF"]; // Can this be set for ALL configs? // If so, use qmake.conf! if ( projectTarget == SharedLib ) RConf.compiler.PreprocessorDefinitions += "_WINDOWS"; RConf.compiler.PreprocessorDefinitions += project->variables()["DEFINES"]; RConf.compiler.PreprocessorDefinitions += project->variables()["PRL_EXPORT_DEFINES"]; QStringList::iterator it; for(it=RConf.compiler.PreprocessorDefinitions.begin(); it!=RConf.compiler.PreprocessorDefinitions.end(); ++it) (*it).replace('\"', """); RConf.compiler.parseOptions( project->variables()["MSVCPROJ_INCPATH"] );}void VcprojGenerator::initLibrarianTool(){ VCConfiguration &RConf = vcProject.Configuration[0]; RConf.librarian.OutputFile = project->first( "DESTDIR" ).replace("&", "&"); if( RConf.librarian.OutputFile.isEmpty() ) RConf.librarian.OutputFile = ".\\"; if( !RConf.librarian.OutputFile.endsWith("\\") ) RConf.librarian.OutputFile += '\\'; RConf.librarian.OutputFile += project->first("MSVCPROJ_TARGET");}void VcprojGenerator::initLinkerTool(){ VCConfiguration &RConf = vcProject.Configuration[0]; RConf.linker.parseOptions( project->variables()["MSVCPROJ_LFLAGS"] ); RConf.linker.AdditionalDependencies += project->variables()["MSVCPROJ_LIBS"]; switch ( projectTarget ) { case Application: RConf.linker.OutputFile = project->first( "DESTDIR" ); break; case SharedLib: RConf.linker.parseOptions( project->variables()["MSVCPROJ_LIBOPTIONS"] ); RConf.linker.OutputFile = project->first( "DESTDIR" ); break; case StaticLib: //unhandled - added to remove warnings.. break; } if( RConf.linker.OutputFile.isEmpty() ) RConf.linker.OutputFile = ".\\"; if( !RConf.linker.OutputFile.endsWith("\\") ) RConf.linker.OutputFile += '\\'; RConf.linker.OutputFile += project->first("MSVCPROJ_TARGET"); if ( project->isActiveConfig("debug") ){ RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_DEBUG"] ); } else { RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_RELEASE"] ); } if ( project->isActiveConfig("dll") ){ RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_QT_DLL"] ); } if ( project->isActiveConfig("console") ){ RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_CONSOLE"] ); } else { RConf.linker.parseOptions( project->variables()["QMAKE_LFLAGS_WINDOWS"] ); }}void VcprojGenerator::initIDLTool(){}void VcprojGenerator::initCustomBuildTool(){}void VcprojGenerator::initPreBuildEventTools(){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -