📄 makefile.cpp
字号:
t << "QMAKE_PRL_VERSION = " << project->first("TARGET_VERSION_EXT") << endl; else if(!project->isEmpty("VERSION")) t << "QMAKE_PRL_VERSION = " << project->first("VERSION") << endl; if(project->isActiveConfig("staticlib") || project->isActiveConfig("explicitlib")) { QStringList libs; if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) libs = project->values("QMAKE_INTERNAL_PRL_LIBS"); else libs << "QMAKE_LIBS"; //obvious one t << "QMAKE_PRL_LIBS = "; for(QStringList::Iterator it = libs.begin(); it != libs.end(); ++it) t << project->values((*it)).join(" ") << " "; t << endl; }}boolMakefileGenerator::writeProjectMakefile(){ usePlatformDir(); QTextStream t(&Option::output); //header writeHeader(t); QList<SubTarget*> targets; { QStringList builds = project->values("BUILDS"); for(QStringList::Iterator it = builds.begin(); it != builds.end(); ++it) { SubTarget *st = new SubTarget; targets.append(st); st->makefile = "$(MAKEFILE)." + (*it); st->name = (*it); st->target = project->isEmpty((*it) + ".target") ? (*it) : project->first((*it) + ".target"); } } if(project->isActiveConfig("build_all")) { t << "first: all" << endl; QList<SubTarget*>::Iterator it; //install t << "install: "; for(it = targets.begin(); it != targets.end(); ++it) t << (*it)->target << "-install "; t << endl; //uninstall t << "uninstall: "; for(it = targets.begin(); it != targets.end(); ++it) t << (*it)->target << "-uninstall "; t << endl; } else { t << "first: " << targets.first()->target << endl << "install: " << targets.first()->target << "-install" << endl << "uninstall: " << targets.first()->target << "-uninstall" << endl; } writeSubTargets(t, targets, SubTargetsNoFlags); if(!project->isActiveConfig("no_autoqmake")) { for(QList<SubTarget*>::Iterator it = targets.begin(); it != targets.end(); ++it) t << (*it)->makefile << ": " << Option::fixPathToTargetOS(fileFixify(Option::output.fileName())) << endl; } qDeleteAll(targets); return true;}boolMakefileGenerator::write(){ if(!project) return false; writePrlFile(); if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || //write makefile Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) { QTextStream t(&Option::output); if(!writeMakefile(t)) {#if 1 warn_msg(WarnLogic, "Unable to generate output for: %s [TEMPLATE %s]", Option::output.fileName().toLatin1().constData(), project->first("TEMPLATE").toLatin1().constData()); if(Option::output.exists()) Option::output.remove();#endif } } return true;}QStringMakefileGenerator::prlFileName(bool fixify){ QString ret = project->first("TARGET_PRL");; if(ret.isEmpty()) ret = project->first("TARGET"); int slsh = ret.lastIndexOf(Option::dir_sep); if(slsh != -1) ret = ret.right(ret.length() - slsh); if(!ret.endsWith(Option::prl_ext)) { int dot = ret.indexOf('.'); if(dot != -1) ret = ret.left(dot); ret += Option::prl_ext; } if(!project->isEmpty("QMAKE_BUNDLE")) ret.prepend(project->first("QMAKE_BUNDLE") + Option::dir_sep); if(fixify) { if(!project->isEmpty("DESTDIR")) ret.prepend(project->first("DESTDIR")); ret = Option::fixPathToLocalOS(fileFixify(ret, qmake_getpwd(), Option::output_dir)); } return ret;}voidMakefileGenerator::writePrlFile(){ if((Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || Option::qmake_mode == Option::QMAKE_GENERATE_PRL) && project->values("QMAKE_FAILED_REQUIREMENTS").isEmpty() && project->isActiveConfig("create_prl") && (project->first("TEMPLATE") == "lib" || project->first("TEMPLATE") == "vclib") && !project->isActiveConfig("plugin")) { //write prl file QString local_prl = prlFileName(); QString prl = fileFixify(local_prl); mkdir(fileInfo(local_prl).path()); QFile ft(local_prl); if(ft.open(QIODevice::WriteOnly)) { project->values("ALL_DEPS").append(prl); project->values("QMAKE_INTERNAL_PRL_FILE").append(prl); QTextStream t(&ft); writePrlFile(t); } }}// Manipulate directories, so it's possible to build// several cross-platform targets concurrentlyvoidMakefileGenerator::usePlatformDir(){ QString pltDir(project->first("QMAKE_PLATFORM_DIR")); if(pltDir.isEmpty()) return; QChar sep = QDir::separator(); QString slashPltDir = sep + pltDir; QString dirs[] = { QString("OBJECTS_DIR"), QString("DESTDIR"), QString("QMAKE_PKGCONFIG_DESTDIR"), QString("SUBLIBS_DIR"), QString("DLLDESTDIR"), QString("QMAKE_LIBTOOL_DESTDIR"), QString("PRECOMPILED_DIR"), QString("QMAKE_LIBDIR_QT"), QString() }; for(int i = 0; !dirs[i].isEmpty(); ++i) { QString filePath = project->first(dirs[i]); project->values(dirs[i]) = QStringList(filePath + (filePath.isEmpty() ? pltDir : slashPltDir)); } QString libs[] = { QString("QMAKE_LIBS_QT"), QString("QMAKE_LIBS_QT_THREAD"), QString("QMAKE_LIBS_QT_ENTRY"), QString() }; for(int i = 0; !libs[i].isEmpty(); ++i) { QString filePath = project->first(libs[i]); int fpi = filePath.lastIndexOf(sep); if(fpi == -1) project->values(libs[i]).prepend(pltDir + sep); else project->values(libs[i]) = QStringList(filePath.left(fpi) + slashPltDir + filePath.mid(fpi)); }}voidMakefileGenerator::writeObj(QTextStream &t, const QString &src){ QStringList &srcl = project->values(src); QStringList objl = createObjectList(srcl); QStringList::Iterator oit = objl.begin(); QStringList::Iterator sit = srcl.begin(); QString stringSrc("$src"); QString stringObj("$obj"); for(;sit != srcl.end() && oit != objl.end(); ++oit, ++sit) { if((*sit).isEmpty()) continue; t << escapeDependencyPath((*oit)) << ": " << escapeDependencyPath((*sit)) << " " << escapeDependencyPaths(findDependencies((*sit))).join(" \\\n\t\t"); QString comp, cimp; for(QStringList::Iterator cppit = Option::cpp_ext.begin(); cppit != Option::cpp_ext.end(); ++cppit) { if((*sit).endsWith((*cppit))) { comp = "QMAKE_RUN_CXX"; cimp = "QMAKE_RUN_CXX_IMP"; break; } } if(comp.isEmpty()) { comp = "QMAKE_RUN_CC"; cimp = "QMAKE_RUN_CC_IMP"; } bool use_implicit_rule = !project->isEmpty(cimp); use_implicit_rule = false; if(use_implicit_rule) { if(!project->isEmpty("OBJECTS_DIR")) { use_implicit_rule = false; } else { int dot = (*sit).lastIndexOf('.'); if(dot == -1 || ((*sit).left(dot) + Option::obj_ext != (*oit))) use_implicit_rule = false; } } if (!use_implicit_rule && !project->isEmpty(comp)) { QString p = var(comp), srcf(*sit); p.replace(stringSrc, escapeFilePath(srcf)); p.replace(stringObj, escapeFilePath((*oit))); t << "\n\t" << p; } t << endl << endl; }}QStringMakefileGenerator::filePrefixRoot(const QString &root, const QString &path){ QString ret(root + path); if(path.length() > 2 && path[1] == ':') //c:\foo ret = QString(path.mid(0, 2) + root + path.mid(2)); while(ret.endsWith("\\")) ret = ret.left(ret.length()-1); return ret;}voidMakefileGenerator::writeInstalls(QTextStream &t, const QString &installs, bool noBuild){ QString rm_dir_contents("-$(DEL_FILE)"); if (!isWindowsShell()) //ick rm_dir_contents = "-$(DEL_FILE) -r"; QString all_installs, all_uninstalls; QStringList &l = project->values(installs); for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) { QString pvar = (*it) + ".path"; if(project->values((*it) + ".CONFIG").indexOf("no_path") == -1 && project->values(pvar).isEmpty()) { warn_msg(WarnLogic, "%s is not defined: install target not created\n", pvar.toLatin1().constData()); continue; } bool do_default = true; const QString root = "$(INSTALL_ROOT)"; QString target, dst; if(project->values((*it) + ".CONFIG").indexOf("no_path") == -1) { dst = fileFixify(unescapeFilePath(project->values(pvar).first()), FileFixifyAbsolute, false); if(dst.right(1) != Option::dir_sep) dst += Option::dir_sep; } dst = escapeFilePath(dst); QStringList tmp, uninst = project->values((*it) + ".uninstall"); //other tmp = project->values((*it) + ".extra"); if(tmp.isEmpty()) tmp = project->values((*it) + ".commands"); //to allow compatible name if(!tmp.isEmpty()) { do_default = false; if(!target.isEmpty()) target += "\n\t"; target += tmp.join(" "); } //masks tmp = findFilesInVPATH(project->values((*it) + ".files"), VPATH_NoFixify); tmp = fileFixify(tmp, FileFixifyAbsolute); if(!tmp.isEmpty()) { if(!target.isEmpty()) target += "\n"; do_default = false; for(QStringList::Iterator wild_it = tmp.begin(); wild_it != tmp.end(); ++wild_it) { QString wild = Option::fixPathToLocalOS((*wild_it), false, false); QString dirstr = qmake_getpwd(), filestr = wild; int slsh = filestr.lastIndexOf(Option::dir_sep); if(slsh != -1) { dirstr = filestr.left(slsh+1); filestr = filestr.right(filestr.length() - slsh - 1); } if(dirstr.right(Option::dir_sep.length()) != Option::dir_sep) dirstr += Option::dir_sep; if(exists(wild)) { //real file QString file = wild; QFileInfo fi(fileInfo(wild)); if(!target.isEmpty()) target += "\t"; QString dst_file = filePrefixRoot(root, dst); if(fi.isDir() && project->isActiveConfig("copy_dir_files")) { if(!dst_file.endsWith(Option::dir_sep)) dst_file += Option::dir_sep; dst_file += fi.fileName(); } QString cmd; if (fi.isDir()) cmd = "-$(INSTALL_DIR)"; else if (fi.isExecutable()) cmd = "-$(INSTALL_PROGRAM)"; else cmd = "-$(INSTALL_FILE)"; cmd += " " + wild + " " + dst_file + "\n"; target += cmd; if(!project->isActiveConfig("debug") && !project->isActiveConfig("nostrip") && !fi.isDir() && fi.isExecutable() && !project->isEmpty("QMAKE_STRIP")) target += QString("\t-") + var("QMAKE_STRIP") + " " + filePrefixRoot(root, fileFixify(dst + filestr, FileFixifyAbsolute, false)) + "\n"; if(!uninst.isEmpty()) uninst.append("\n\t"); uninst.append(rm_dir_contents + " " + filePrefixRoot(root, fileFixify(dst + filestr, FileFixifyAbsolute, false))); continue; } QString local_dirstr = Option::fixPathToLocalOS(dirstr, true); QStringList files = QDir(local_dirstr).entryList(QStringList(filestr)); if(project->values((*it) + ".CONFIG").indexOf("no_check_exist") != -1 && files.isEmpty()) { if(!target.isEmpty()) target += "\t"; QString dst_file = filePrefixRoot(root, dst); QFileInfo fi(fileInfo(wild));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -