📄 winmakefile.cpp
字号:
//If the TARGET looks like a path split it into DESTDIR and the resulting TARGET if(!project->isEmpty("TARGET")) { QString targ = project->first("TARGET"); int slsh = qMax(targ.lastIndexOf('/'), targ.lastIndexOf(Option::dir_sep)); if(slsh != -1) { if(project->isEmpty("DESTDIR")) project->values("DESTDIR").append(""); else if(project->first("DESTDIR").right(1) != Option::dir_sep) project->values("DESTDIR") = QStringList(project->first("DESTDIR") + Option::dir_sep); project->values("DESTDIR") = QStringList(project->first("DESTDIR") + targ.left(slsh+1)); project->values("TARGET") = QStringList(targ.mid(slsh+1)); } } project->values("QMAKE_ORIG_TARGET") = project->values("TARGET"); if (!project->values("QMAKE_INCDIR").isEmpty()) project->values("INCLUDEPATH") += project->values("QMAKE_INCDIR"); if (!project->values("VERSION").isEmpty()) { QStringList l = project->first("VERSION").split('.'); if (l.size() > 0) project->values("VER_MAJ").append(l[0]); if (l.size() > 1) project->values("VER_MIN").append(l[1]); } // TARGET_VERSION_EXT will be used to add a version number onto the target name if (project->values("TARGET_VERSION_EXT").isEmpty() && !project->values("VER_MAJ").isEmpty()) project->values("TARGET_VERSION_EXT").append(project->values("VER_MAJ").first()); if(project->isEmpty("QMAKE_COPY_FILE")) project->values("QMAKE_COPY_FILE").append("$(COPY)"); if(project->isEmpty("QMAKE_COPY_DIR")) project->values("QMAKE_COPY_DIR").append("xcopy /s /q /y /i"); if(project->isEmpty("QMAKE_INSTALL_FILE")) project->values("QMAKE_INSTALL_FILE").append("$(COPY_FILE)"); if(project->isEmpty("QMAKE_INSTALL_PROGRAM")) project->values("QMAKE_INSTALL_PROGRAM").append("$(COPY_FILE)"); if(project->isEmpty("QMAKE_INSTALL_DIR")) project->values("QMAKE_INSTALL_DIR").append("$(COPY_DIR)"); fixTargetExt(); processRcFileVar(); processFileTagsVar(); QStringList &incDir = project->values("INCLUDEPATH"); for(QStringList::Iterator incDir_it = incDir.begin(); incDir_it != incDir.end(); ++incDir_it) { if(!(*incDir_it).isEmpty()) (*incDir_it) = Option::fixPathToTargetOS((*incDir_it), false, false); } QStringList &libDir = project->values("QMAKE_LIBDIR"); for(QStringList::Iterator libDir_it = libDir.begin(); libDir_it != libDir.end(); ++libDir_it) { if(!(*libDir_it).isEmpty()) (*libDir_it) = Option::fixPathToTargetOS((*libDir_it), false, false); }}void Win32MakefileGenerator::fixTargetExt(){ if (!project->values("QMAKE_APP_FLAG").isEmpty()) project->values("TARGET_EXT").append(".exe"); else if (project->isActiveConfig("shared")) project->values("TARGET_EXT").append(project->first("TARGET_VERSION_EXT") + ".dll"); else project->values("TARGET_EXT").append(".lib");}void Win32MakefileGenerator::processRcFileVar(){ if ((!project->values("VERSION").isEmpty()) && project->values("RC_FILE").isEmpty() && project->values("RES_FILE").isEmpty() && !project->isActiveConfig("no_generated_target_info") && (project->isActiveConfig("shared") || !project->values("QMAKE_APP_FLAG").isEmpty())) { QByteArray rcString; QTextStream ts(&rcString, QFile::WriteOnly); QStringList vers = project->values("VERSION").first().split("."); for (int i = vers.size(); i < 4; i++) vers += "0"; QString versionString = vers.join("."); QString companyName; if (!project->values("QMAKE_TARGET_COMPANY").isEmpty()) companyName = project->values("QMAKE_TARGET_COMPANY").join(" "); QString description; if (!project->values("QMAKE_TARGET_DESCRIPTION").isEmpty()) description = project->values("QMAKE_TARGET_DESCRIPTION").join(" "); QString copyright; if (!project->values("QMAKE_TARGET_COPYRIGHT").isEmpty()) copyright = project->values("QMAKE_TARGET_COPYRIGHT").join(" "); QString productName; if (!project->values("QMAKE_TARGET_PRODUCT").isEmpty()) productName = project->values("QMAKE_TARGET_PRODUCT").join(" "); else productName = project->values("TARGET").first(); QString originalName = project->values("TARGET").first() + project->values("TARGET_EXT").first(); ts << "#ifndef Q_CC_BOR" << endl; ts << "# if defined(UNDER_CE) && UNDER_CE >= 400" << endl; ts << "# include <winbase.h>" << endl; ts << "# else" << endl; ts << "# include <winver.h>" << endl; ts << "# endif" << endl; ts << "#endif" << endl; ts << endl; ts << "VS_VERSION_INFO VERSIONINFO" << endl; ts << "\tFILEVERSION " << QString(versionString).replace(".", ",") << endl; ts << "\tPRODUCTVERSION " << QString(versionString).replace(".", ",") << endl; ts << "\tFILEFLAGSMASK 0x3fL" << endl; ts << "#ifdef _DEBUG" << endl; ts << "\tFILEFLAGS VS_FF_DEBUG" << endl; ts << "#else" << endl; ts << "\tFILEFLAGS 0x0L" << endl; ts << "#endif" << endl; ts << "\tFILEOS VOS__WINDOWS32" << endl; if (project->isActiveConfig("shared")) ts << "\tFILETYPE VFT_DLL" << endl; else ts << "\tFILETYPE VFT_APP" << endl; ts << "\tFILESUBTYPE 0x0L" << endl; ts << "\tBEGIN" << endl; ts << "\t\tBLOCK \"StringFileInfo\"" << endl; ts << "\t\tBEGIN" << endl; ts << "\t\t\tBLOCK \"040904B0\"" << endl; ts << "\t\t\tBEGIN" << endl; ts << "\t\t\t\tVALUE \"CompanyName\", \"" << companyName << "\\0\"" << endl; ts << "\t\t\t\tVALUE \"FileDescription\", \"" << description << "\\0\"" << endl; ts << "\t\t\t\tVALUE \"FileVersion\", \"" << versionString << "\\0\"" << endl; ts << "\t\t\t\tVALUE \"LegalCopyright\", \"" << copyright << "\\0\"" << endl; ts << "\t\t\t\tVALUE \"OriginalFilename\", \"" << originalName << "\\0\"" << endl; ts << "\t\t\t\tVALUE \"ProductName\", \"" << productName << "\\0\"" << endl; ts << "\t\t\tEND" << endl; ts << "\t\tEND" << endl; ts << "\tEND" << endl; ts << "/* End of Version info */" << endl; ts << endl; ts.flush(); QFile rcFile(project->values("TARGET").first() + "_resource" + ".rc"); bool writeRcFile = true; if (rcFile.exists() && rcFile.open(QFile::ReadOnly)) { writeRcFile = rcFile.readAll() != rcString; rcFile.close(); } if (writeRcFile && rcFile.open(QFile::WriteOnly)) { rcFile.write(rcString); rcFile.close(); } project->values("RC_FILE").insert(0, rcFile.fileName()); } if (!project->values("RC_FILE").isEmpty()) { if (!project->values("RES_FILE").isEmpty()) { fprintf(stderr, "Both rc and res file specified.\n"); fprintf(stderr, "Please specify one of them, not both."); exit(1); } QString resFile = project->values("RC_FILE").first(); resFile.replace(".rc", Option::res_ext); project->values("RES_FILE").prepend(fileInfo(resFile).fileName()); if (!project->values("OBJECTS_DIR").isEmpty()) project->values("RES_FILE").first().prepend(project->values("OBJECTS_DIR").first() + Option::dir_sep); project->values("RES_FILE").first() = Option::fixPathToTargetOS(project->values("RES_FILE").first(), false, false); project->values("POST_TARGETDEPS") += project->values("RES_FILE"); project->values("CLEAN_FILES") += project->values("RES_FILE"); }}void Win32MakefileGenerator::processFileTagsVar(){ QStringList tags; tags << "SOURCES" << "GENERATED_SOURCES" << "DEF_FILE" << "RC_FILE" << "TARGET" << "QMAKE_LIBS" << "DESTDIR" << "DLLDESTDIR" << "INCLUDEPATH"; if(!project->isEmpty("QMAKE_EXTRA_COMPILERS")) { const QStringList &quc = project->values("QMAKE_EXTRA_COMPILERS"); for(QStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) tags += project->values((*it)+".input"); } //clean path QStringList &filetags = project->values("QMAKE_FILETAGS"); for(int i = 0; i < tags.size(); ++i) filetags += Option::fixPathToTargetOS(tags.at(i), false);}void Win32MakefileGenerator::writeCleanParts(QTextStream &t){ t << "clean: compiler_clean " << var("CLEAN_DEPS"); { const char *clean_targets[] = { "OBJECTS", "QMAKE_CLEAN", "CLEAN_FILES", 0 }; for(int i = 0; clean_targets[i]; ++i) { const QStringList &list = project->values(clean_targets[i]); const QString del_statement("-$(DEL_FILE)"); if(project->isActiveConfig("no_delete_multiple_files")) { for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) t << "\n\t" << del_statement << " " << escapeFilePath((*it)); } else { QString files, file; const int commandlineLimit = 2047; // NT limit, expanded for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { file = " " + escapeFilePath((*it)); if(del_statement.length() + files.length() + qMax(fixEnvVariables(file).length(), file.length()) > commandlineLimit) { t << "\n\t" << del_statement << files; files.clear(); } files += file; } if(!files.isEmpty()) t << "\n\t" << del_statement << files; } } } t << endl << endl; t << "distclean: clean"; { const char *clean_targets[] = { "QMAKE_DISTCLEAN", 0 }; for(int i = 0; clean_targets[i]; ++i) { const QStringList &list = project->values(clean_targets[i]); const QString del_statement("-$(DEL_FILE)"); if(project->isActiveConfig("no_delete_multiple_files")) { for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) t << "\n\t" << del_statement << " " << escapeFilePath((*it)); } else { QString files, file; const int commandlineLimit = 2047; // NT limit, expanded for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { file = " " + escapeFilePath((*it)); if(del_statement.length() + files.length() + qMax(fixEnvVariables(file).length(), file.length()) > commandlineLimit) { t << "\n\t" << del_statement << files; files.clear(); } files += file; } if(!files.isEmpty()) t << "\n\t" << del_statement << files; } } } t << "\n\t-$(DEL_FILE) $(DESTDIR_TARGET)" << endl; { QString ofile = Option::fixPathToTargetOS(fileFixify(Option::output.fileName())); if(!ofile.isEmpty()) t << "\t-$(DEL_FILE) " << ofile << endl; } t << endl;}void Win32MakefileGenerator::writeIncPart(QTextStream &t){ t << "INCPATH = "; const QStringList &incs = project->values("INCLUDEPATH"); for(int i = 0; i < incs.size(); ++i) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -