⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmakefile.cpp

📁 qtmake 文件的代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
    }
}


void Win32MakefileGenerator::processVars()
{
    //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->variables()["DESTDIR"] = QStringList(project->first("DESTDIR") + Option::dir_sep);
            project->variables()["DESTDIR"] = QStringList(project->first("DESTDIR") + targ.left(slsh+1));
            project->variables()["TARGET"] = QStringList(targ.mid(slsh+1));
        }
    }

    project->variables()["QMAKE_ORIG_TARGET"] = project->variables()["TARGET"];
    if (!project->variables()["QMAKE_INCDIR"].isEmpty())
        project->variables()["INCLUDEPATH"] += project->variables()["QMAKE_INCDIR"];

    if (!project->variables()["VERSION"].isEmpty()) {
        QStringList l = project->first("VERSION").split('.');
        if (l.size() > 0)
            project->variables()["VER_MAJ"].append(l[0]);
        if (l.size() > 1)
            project->variables()["VER_MIN"].append(l[1]);
    }

    // TARGET_VERSION_EXT will be used to add a version number onto the target name
    if (project->variables()["TARGET_VERSION_EXT"].isEmpty()
        && !project->variables()["VER_MAJ"].isEmpty())
        project->variables()["TARGET_VERSION_EXT"].append(project->variables()["VER_MAJ"].first());

    if(project->isEmpty("QMAKE_COPY_FILE"))
        project->variables()["QMAKE_COPY_FILE"].append("$(COPY)");
    if(project->isEmpty("QMAKE_COPY_DIR"))
        project->variables()["QMAKE_COPY_DIR"].append("xcopy /s /q /y /i");
    if(project->isEmpty("QMAKE_INSTALL_FILE"))
        project->variables()["QMAKE_INSTALL_FILE"].append("$(COPY_FILE)");
    if(project->isEmpty("QMAKE_INSTALL_DIR"))
        project->variables()["QMAKE_INSTALL_DIR"].append("$(COPY_DIR)");

    fixTargetExt();
    processRcFileVar();
    processFileTagsVar();

    QStringList &incDir = project->variables()["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->variables()["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->variables()["QMAKE_APP_FLAG"].isEmpty())
        project->variables()["TARGET_EXT"].append(".exe");
    else if (project->isActiveConfig("shared"))
        project->variables()["TARGET_EXT"].append(project->first("TARGET_VERSION_EXT") + ".dll");
    else
        project->variables()["TARGET_EXT"].append(".lib");
}

void Win32MakefileGenerator::processRcFileVar()
{
    if ((!project->variables()["VERSION"].isEmpty())
        && project->variables()["RC_FILE"].isEmpty()
        && project->variables()["RES_FILE"].isEmpty()
        && !project->isActiveConfig("no_generated_target_info")
        && (project->isActiveConfig("shared") || !project->variables()["QMAKE_APP_FLAG"].isEmpty())) {

        QByteArray rcString;
        QTextStream ts(&rcString, QFile::WriteOnly);

        QStringList vers = project->variables()["VERSION"].first().split(".");
        for (int i = vers.size(); i < 4; i++)
            vers += "0";
        QString versionString = vers.join(".");

        QString companyName;
        if (!project->variables()["QMAKE_TARGET_COMPANY"].isEmpty())
            companyName = project->variables()["QMAKE_TARGET_COMPANY"].join(" ");

        QString description;
        if (!project->variables()["QMAKE_TARGET_DESCRIPTION"].isEmpty())
            description = project->variables()["QMAKE_TARGET_DESCRIPTION"].join(" ");

        QString copyright;
        if (!project->variables()["QMAKE_TARGET_COPYRIGHT"].isEmpty())
            copyright = project->variables()["QMAKE_TARGET_COPYRIGHT"].join(" ");

        QString productName;
        if (!project->variables()["QMAKE_TARGET_PRODUCT"].isEmpty())
            productName = project->variables()["QMAKE_TARGET_PRODUCT"].join(" ");
        else
            productName = project->variables()["TARGET"].first();

        QString originalName = project->variables()["TARGET"].first() + project->variables()["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->variables()["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->variables()["RC_FILE"].insert(0, Option::fixPathToTargetOS(rcFile.fileName(), false, false));
    }
    if (!project->variables()["RC_FILE"].isEmpty()) {
        if (!project->variables()["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->variables()["RC_FILE"].first();
        resFile.replace(".rc", Option::res_ext);
	project->variables()["RES_FILE"].prepend(fileInfo(resFile).fileName());
        if (!project->variables()["OBJECTS_DIR"].isEmpty())
            project->variables()["RES_FILE"].first().prepend(project->variables()["OBJECTS_DIR"].first() + Option::dir_sep);
        project->variables()["RES_FILE"].first() = Option::fixPathToTargetOS(project->variables()["RES_FILE"].first(), false, false);
	project->variables()["POST_TARGETDEPS"] += project->variables()["RES_FILE"];
        project->variables()["CLEAN_FILES"] += project->variables()["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->variables()["QMAKE_EXTRA_COMPILERS"];
        for(QStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it)
            tags += project->variables()[(*it)+".input"];
    }

    //clean path
    QStringList &filetags = project->variables()["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";
    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 << " " << (*it);
        } else {
            QString files, file;
            const int commandlineLimit = 2047; // NT limit, expanded
            for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) {
                file = " " + (*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"
      << "\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::writeStandardParts(QTextStream &t)
{
    t << "####### Compiler, tools and options" << endl << endl;
    t << "CC            = " << var("QMAKE_CC") << endl;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -