📄 msvc_vcproj.cpp
字号:
conf.compiler.AssemblerListingLocation = placement ; conf.compiler.ProgramDataBaseFileName = ".\\" ; conf.compiler.ObjectFile = placement ; // PCH if (usePCH) { conf.compiler.UsePrecompiledHeader = pchUseUsingSpecific; conf.compiler.PrecompiledHeaderFile = "$(IntDir)\\" + precompPch; conf.compiler.PrecompiledHeaderThrough = project->first("PRECOMPILED_HEADER"); conf.compiler.ForcedIncludeFiles = project->values("PRECOMPILED_HEADER"); // Minimal build option triggers an Internal Compiler Error // when used in conjunction with /FI and /Yu, so remove it project->values("QMAKE_CFLAGS_DEBUG").removeAll("-Gm"); project->values("QMAKE_CFLAGS_DEBUG").removeAll("/Gm"); project->values("QMAKE_CXXFLAGS_DEBUG").removeAll("-Gm"); project->values("QMAKE_CXXFLAGS_DEBUG").removeAll("/Gm"); } conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS")); if(project->isActiveConfig("debug")){ // Debug version conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS")); conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS_DEBUG")); if((projectTarget == Application) || (projectTarget == StaticLib)) conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS_MT_DBG")); else conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS_MT_DLLDBG")); } else { // Release version conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS")); conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS_RELEASE")); conf.compiler.PreprocessorDefinitions += "QT_NO_DEBUG"; conf.compiler.PreprocessorDefinitions += "NDEBUG"; if((projectTarget == Application) || (projectTarget == StaticLib)) conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS_MT")); else conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS_MT_DLL")); } // Common for both release and debug if(project->isActiveConfig("warn_off")) conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS_WARN_OFF")); else if(project->isActiveConfig("warn_on")) conf.compiler.parseOptions(project->values("QMAKE_CXXFLAGS_WARN_ON")); if(project->isActiveConfig("windows")) conf.compiler.PreprocessorDefinitions += project->values("MSVCPROJ_WINCONDEF"); // Can this be set for ALL configs? // If so, use qmake.conf! if(projectTarget == SharedLib) conf.compiler.PreprocessorDefinitions += "_WINDOWS"; conf.compiler.PreprocessorDefinitions += project->values("DEFINES"); conf.compiler.PreprocessorDefinitions += project->values("PRL_EXPORT_DEFINES"); conf.compiler.parseOptions(project->values("MSVCPROJ_INCPATH"));}void VcprojGenerator::initLibrarianTool(){ VCConfiguration &conf = vcProject.Configuration; conf.librarian.OutputFile = project->first("DESTDIR"); if(conf.librarian.OutputFile.isEmpty()) conf.librarian.OutputFile = ".\\"; if(!conf.librarian.OutputFile.endsWith("\\")) conf.librarian.OutputFile += '\\'; conf.librarian.OutputFile += project->first("MSVCPROJ_TARGET");}void VcprojGenerator::initLinkerTool(){ findLibraries(); // Need to add the highest version of the libs VCConfiguration &conf = vcProject.Configuration; conf.linker.parseOptions(project->values("MSVCPROJ_LFLAGS")); foreach(QString libs, project->values("MSVCPROJ_LIBS")) { if (libs.left(9).toUpper() == "/LIBPATH:") { QStringList l = QStringList(libs); conf.linker.parseOptions(l); } else { conf.linker.AdditionalDependencies += libs; } } switch (projectTarget) { case Application: conf.linker.OutputFile = project->first("DESTDIR"); break; case SharedLib: conf.linker.parseOptions(project->values("MSVCPROJ_LIBOPTIONS")); conf.linker.OutputFile = project->first("DESTDIR"); break; case StaticLib: //unhandled - added to remove warnings.. break; } if(conf.linker.OutputFile.isEmpty()) conf.linker.OutputFile = ".\\"; if(!conf.linker.OutputFile.endsWith("\\")) conf.linker.OutputFile += '\\'; conf.linker.OutputFile += project->first("MSVCPROJ_TARGET"); if(project->isActiveConfig("debug")){ conf.linker.parseOptions(project->values("QMAKE_LFLAGS_DEBUG")); } else { conf.linker.parseOptions(project->values("QMAKE_LFLAGS_RELEASE")); } if(project->isActiveConfig("dll")){ conf.linker.parseOptions(project->values("QMAKE_LFLAGS_QT_DLL")); } if(project->isActiveConfig("console")){ conf.linker.parseOptions(project->values("QMAKE_LFLAGS_CONSOLE")); } else { conf.linker.parseOptions(project->values("QMAKE_LFLAGS_WINDOWS")); }}void VcprojGenerator::initResourceTool(){ VCConfiguration &conf = vcProject.Configuration; conf.resource.PreprocessorDefinitions = conf.compiler.PreprocessorDefinitions; // We need to add _DEBUG for the debug version of the project, since the normal compiler defines // do not contain it. (The compiler defines this symbol automatically, which is wy we don't need // to add it for the compiler) However, the resource tool does not do this. if(project->isActiveConfig("debug")) conf.resource.PreprocessorDefinitions += "_DEBUG";}void VcprojGenerator::initIDLTool(){}void VcprojGenerator::initCustomBuildTool(){}void VcprojGenerator::initPreBuildEventTools(){}QString VcprojGenerator::fixCommandLine(DotNET version, const QString &input) const{ QString result = input; if (version == NET2005) result = result.replace(QLatin1Char('\n'), QLatin1String("
")); return result;}void VcprojGenerator::initPostBuildEventTools(){ VCConfiguration &conf = vcProject.Configuration; if(!project->values("QMAKE_POST_LINK").isEmpty()) { QString cmdline = fixCommandLine(conf.CompilerVersion, var("QMAKE_POST_LINK")); conf.postBuild.CommandLine = cmdline; if (conf.CompilerVersion < NET2005) cmdline = cmdline.replace("\n", "&&"); conf.postBuild.Description = cmdline; } if(!project->values("MSVCPROJ_COPY_DLL").isEmpty()) { if(!conf.postBuild.CommandLine.isEmpty()) conf.postBuild.CommandLine += " && "; conf.postBuild.Description += var("MSVCPROJ_COPY_DLL_DESC"); conf.postBuild.CommandLine += var("MSVCPROJ_COPY_DLL"); }}void VcprojGenerator::initPreLinkEventTools(){ VCConfiguration &conf = vcProject.Configuration; if(!project->values("QMAKE_PRE_LINK").isEmpty()) { QString cmdline = fixCommandLine(conf.CompilerVersion, var("QMAKE_PRE_LINK")); conf.preLink.Description = cmdline; conf.preLink.CommandLine = cmdline; }}void VcprojGenerator::initRootFiles(){ // Note: Root files do _not_ have any filter name, filter nor GUID! vcProject.RootFiles.addFiles(project->values("RC_FILE")); vcProject.RootFiles.Project = this; vcProject.RootFiles.Config = &(vcProject.Configuration); vcProject.RootFiles.CustomBuild = none;}void VcprojGenerator::initSourceFiles(){ vcProject.SourceFiles.Name = "Source Files"; vcProject.SourceFiles.Filter = "cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"; vcProject.SourceFiles.Guid = _GUIDSourceFiles; vcProject.SourceFiles.addFiles(project->values("SOURCES")); vcProject.SourceFiles.Project = this; vcProject.SourceFiles.Config = &(vcProject.Configuration); vcProject.SourceFiles.CustomBuild = none;}void VcprojGenerator::initHeaderFiles(){ vcProject.HeaderFiles.Name = "Header Files"; vcProject.HeaderFiles.Filter = "h;hpp;hxx;hm;inl;inc;xsd"; vcProject.HeaderFiles.Guid = _GUIDHeaderFiles; vcProject.HeaderFiles.addFiles(project->values("HEADERS")); if (usePCH) // Generated PCH cpp file vcProject.HeaderFiles.addFile(precompH); vcProject.HeaderFiles.Project = this; vcProject.HeaderFiles.Config = &(vcProject.Configuration);// vcProject.HeaderFiles.CustomBuild = mocHdr;// addMocArguments(vcProject.HeaderFiles);}void VcprojGenerator::initGeneratedFiles(){ vcProject.GeneratedFiles.Name = "Generated Files"; vcProject.GeneratedFiles.Filter = "cpp;c;cxx;moc;h;def;odl;idl;res;"; vcProject.GeneratedFiles.Guid = _GUIDGeneratedFiles; // ### These cannot have CustomBuild (mocSrc)!! vcProject.GeneratedFiles.addFiles(project->values("GENERATED_SOURCES")); vcProject.GeneratedFiles.addFiles(project->values("GENERATED_FILES")); vcProject.GeneratedFiles.addFiles(project->values("IDLSOURCES")); vcProject.GeneratedFiles.addFiles(project->values("RES_FILE")); vcProject.GeneratedFiles.addFiles(project->values("QMAKE_IMAGE_COLLECTION")); // compat if(!extraCompilerOutputs.isEmpty()) vcProject.GeneratedFiles.addFiles(extraCompilerOutputs.keys()); vcProject.GeneratedFiles.Project = this; vcProject.GeneratedFiles.Config = &(vcProject.Configuration);// vcProject.GeneratedFiles.CustomBuild = mocSrc;}void VcprojGenerator::initLexYaccFiles(){ vcProject.LexYaccFiles.Name = "Lex / Yacc Files"; vcProject.LexYaccFiles.ParseFiles = _False; vcProject.LexYaccFiles.Filter = "l;y"; vcProject.LexYaccFiles.Guid = _GUIDLexYaccFiles; vcProject.LexYaccFiles.addFiles(project->values("LEXSOURCES")); vcProject.LexYaccFiles.addFiles(project->values("YACCSOURCES")); vcProject.LexYaccFiles.Project = this; vcProject.LexYaccFiles.Config = &(vcProject.Configuration); vcProject.LexYaccFiles.CustomBuild = lexyacc;}void VcprojGenerator::initTranslationFiles(){ vcProject.TranslationFiles.Name = "Translation Files"; vcProject.TranslationFiles.ParseFiles = _False; vcProject.TranslationFiles.Filter = "ts"; vcProject.TranslationFiles.Guid = _GUIDTranslationFiles; vcProject.TranslationFiles.addFiles(project->values("TRANSLATIONS")); vcProject.TranslationFiles.Project = this; vcProject.TranslationFiles.Config = &(vcProject.Configuration); vcProject.TranslationFiles.CustomBuild = none;}void VcprojGenerator::initFormFiles(){ vcProject.FormFiles.Name = "Form Files"; vcProject.FormFiles.ParseFiles = _False; vcProject.FormFiles.Filter = "ui"; vcProject.FormFiles.Guid = _GUIDFormFiles; vcProject.FormFiles.addFiles(project->values("FORMS")); vcProject.FormFiles.addFiles(project->values("FORMS3")); vcProject.FormFiles.Project = this; vcProject.FormFiles.Config = &(vcProject.Configuration); vcProject.FormFiles.CustomBuild = none;}void VcprojGenerator::initResourceFiles(){ vcProject.ResourceFiles.Name = "Resource Files"; vcProject.ResourceFiles.ParseFiles = _False; vcProject.ResourceFiles.Filter = "qrc;*"; //"rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;ts;qrc"; vcProject.ResourceFiles.Guid = _GUIDResourceFiles; // Bad hack, please look away ------------------------------------- QString rcc_dep_cmd = project->values("rcc.depend_command").join(" "); if(!rcc_dep_cmd.isEmpty()) { QStringList qrc_files = project->values("RESOURCES"); QStringList deps; if(!qrc_files.isEmpty()) { for (int i = 0; i < qrc_files.count(); ++i) { char buff[256]; QString dep_cmd = replaceExtraCompilerVariables(rcc_dep_cmd, qrc_files.at(i),""); dep_cmd = Option::fixPathToLocalOS(dep_cmd, true, false); if(canExecute(dep_cmd)) { if(FILE *proc = QT_POPEN(dep_cmd.toLatin1().constData(), "r")) { QString indeps; while(!feof(proc)) { int read_in = (int)fread(buff, 1, 255, proc); if(!read_in)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -