📄 makefile.cpp
字号:
QStringList &srcl = project->variables()[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 << (*oit) << ": " << (*sit) << " " << 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);
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, srcf);
p.replace(stringObj, (*oit));
t << "\n\t" << p;
}
t << endl << endl;
}
}
void
MakefileGenerator::writeYaccSrc(QTextStream &t, const QString &src)
{
QStringList &l = project->variables()[src];
if(project->isActiveConfig("yacc_no_name_mangle") && l.count() > 1)
warn_msg(WarnLogic, "yacc_no_name_mangle specified, but multiple parsers expected."
"This can lead to link problems.\n");
QString default_out_h = "y.tab.h", default_out_c = "y.tab.c";
if(!project->isEmpty("QMAKE_YACC_HEADER"))
default_out_h = project->first("QMAKE_YACC_HEADER");
if(!project->isEmpty("QMAKE_YACC_SOURCE"))
default_out_c = project->first("QMAKE_YACC_SOURCE");
QString stringBase("$base");
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QFileInfo fi = fileInfo((*it));
QString dir;
if(fi.path() != ".")
dir = fi.path() + Option::dir_sep;
dir = fileFixify(dir, qmake_getpwd(), Option::output_dir);
if(!dir.isEmpty() && dir.right(Option::dir_sep.length()) != Option::dir_sep)
dir += Option::dir_sep;
QString impl = dir + fi.completeBaseName() + Option::yacc_mod + Option::cpp_ext.first();
QString decl = dir + fi.completeBaseName() + Option::yacc_mod + Option::h_ext.first();
QString yaccflags = "$(YACCFLAGS)", mangle = "y";
if(!project->isActiveConfig("yacc_no_name_mangle")) {
mangle = fi.completeBaseName();
if(!project->isEmpty("QMAKE_YACCFLAGS_MANGLE"))
yaccflags += " " + var("QMAKE_YACCFLAGS_MANGLE").replace(stringBase, mangle);
else
yaccflags += " -p " + mangle;
}
QString out_h = default_out_h, out_c = default_out_c;
if(!mangle.isEmpty()) {
out_h.replace(stringBase, mangle);
out_c.replace(stringBase, mangle);
}
t << impl << ": " << (*it) << "\n\t"
<< "$(YACC) " << yaccflags << " " << (*it) << "\n\t"
<< "-$(DEL_FILE) " << impl << " " << decl << "\n\t"
<< "-$(MOVE) " << out_h << " " << decl << "\n\t"
<< "-$(MOVE) " << out_c << " " << impl << endl << endl;
t << decl << ": " << impl << endl << endl;
}
}
void
MakefileGenerator::writeLexSrc(QTextStream &t, const QString &src)
{
QStringList &l = project->variables()[src];
if(project->isActiveConfig("yacc_no_name_mangle") && l.count() > 1)
warn_msg(WarnLogic, "yacc_no_name_mangle specified, but multiple parsers expected.\n"
"This can lead to link problems.\n");
QString default_out_c = "lex.$base.c";
if(!project->isEmpty("QMAKE_LEX_SOURCE"))
default_out_c = project->first("QMAKE_LEX_SOURCE");
QString stringBase("$base");
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QFileInfo fi = fileInfo((*it));
QString dir;
if(fi.path() != ".")
dir = fi.path() + Option::dir_sep;
dir = fileFixify(dir, qmake_getpwd(), Option::output_dir);
if(!dir.isEmpty() && dir.right(Option::dir_sep.length()) != Option::dir_sep)
dir += Option::dir_sep;
QString impl = dir + fi.completeBaseName() + Option::lex_mod + Option::cpp_ext.first();
QString lexflags = "$(LEXFLAGS)", stub="yy";
if(!project->isActiveConfig("yacc_no_name_mangle")) {
stub = fi.completeBaseName();
lexflags += " -P" + stub;
}
QString out_c = default_out_c;
if(!stub.isEmpty())
out_c.replace(stringBase, stub);
t << impl << ": " << (*it) << " " << findDependencies((*it)).join(" \\\n\t\t") << "\n\t"
<< ("$(LEX) " + lexflags + " ") << (*it) << "\n\t"
<< "-$(DEL_FILE) " << impl << " " << "\n\t"
<< "-$(MOVE) " << out_c << " " << impl << endl << endl;
}
}
QString
MakefileGenerator::filePrefixRoot(const QString &root, const QString &path)
{
if(path.length() > 2 && path[1] == ':') //c:\foo
return path.mid(0, 2) + root + path.mid(2);
return root + path;
}
void
MakefileGenerator::writeInstalls(QTextStream &t, const QString &installs, bool noBuild)
{
QString rm_dir_contents("-$(DEL_FILE)");
if(Option::target_mode != Option::TARG_WIN_MODE) //ick
rm_dir_contents = "-$(DEL_FILE) -r";
QString all_installs, all_uninstalls;
QStringList &l = project->variables()[installs];
for(QStringList::Iterator it = l.begin(); it != l.end(); ++it) {
QString pvar = (*it) + ".path";
if(project->variables()[(*it) + ".CONFIG"].indexOf("no_path") == -1 &&
project->variables()[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->variables()[(*it) + ".CONFIG"].indexOf("no_path") == -1) {
dst = fileFixify(project->variables()[pvar].first(), FileFixifyAbsolute, false);
if(dst.right(1) != Option::dir_sep)
dst += Option::dir_sep;
}
QStringList tmp, uninst = project->variables()[(*it) + ".uninstall"];
//other
tmp = project->variables()[(*it) + ".extra"];
if(tmp.isEmpty())
tmp = project->variables()[(*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->variables()[(*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 = QString(fi.isDir() ? "-$(INSTALL_DIR)" : "-$(INSTALL_FILE)") + " \"" +
wild + "\" \"" + dst_file + "\"\n";
target += cmd;
if(!project->isActiveConfig("debug") &&
!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->variables()[(*it) + ".CONFIG"].indexOf("no_check_exist") != -1 && files.isEmpty()) {
if(!target.isEmpty())
target += "\t";
QString dst_file = filePrefixRoot(root, dst);
QString cmd = QString("-$(INSTALL_FILE)") + " \"" +
wild + "\" \"" + dst_file + "\"\n";
target += cmd;
if(!uninst.isEmpty())
uninst.append("\n\t");
uninst.append(rm_dir_contents + " \"" + filePrefixRoot(root, fileFixify(dst + filestr, FileFixifyAbsolute, false)) + "\"");
}
for(int x = 0; x < files.count(); x++) {
QString file = files[x];
if(file == "." || file == "..") //blah
continue;
if(!uninst.isEmpty())
uninst.append("\n\t");
uninst.append(rm_dir_contents + " \"" + filePrefixRoot(root, fileFixify(dst + file, FileFixifyAbsolute, false)) + "\"");
QFileInfo fi(fileInfo(dirstr + file));
if(!target.isEmpty())
target += "\t";
QString dst_file = filePrefixRoot(root, fileFixify(dst, FileFixifyAbsolute, false));
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 = QString(fi.isDir() ? "-$(INSTALL_DIR)" : "-$(INSTALL_FILE)") + " \"" +
dirstr + file + "\" \"" + dst_file + "\"\n";
target += cmd;
if(!project->isActiveConfig("debug") &&
!fi.isDir() && fi.isExecutable() && !project->isEmpty("QMAKE_STRIP"))
target += QString("\t-") + var("QMAKE_STRIP") + " \"" +
filePrefixRoot(root, fileFixify(dst + file, FileFixifyAbsolute, false)) +
"\"\n";
}
}
}
//default?
if(do_default) {
target = defaultInstall((*it));
uninst = project->variables()[(*it) + ".uninstall"];
}
if(!target.isEmpty()) {
if(noBuild || project->variables()[(*it) + ".CONFIG"].indexOf("no_build") != -1)
t << "install_" << (*it) << ":";
else if(project->isActiveConfig("build_all"))
t << "install_" << (*it) << ": all";
else
t << "install_" << (*it) << ": first";
const QStringList &deps = project->variables()[(*it) + ".depends"];
if(!deps.isEmpty()) {
for(QStringList::ConstIterator dep_it = deps.begin(); dep_it != deps.end(); ++dep_it) {
QString targ = var((*dep_it) + ".target");
if(targ.isEmpty())
targ = (*dep_it);
t << " " << targ;
}
}
if(project->isEmpty("QMAKE_NOFORCE"))
t << " FORCE";
t << "\n\t";
const QStringList &dirs = project->variables()[pvar];
for(QStringList::ConstIterator pit = dirs.begin(); pit != dirs.end(); ++pit) {
QString tmp_dst = fileFixify((*pit), FileFixifyAbsolute, false);
if(Option::target_mode != Option::TARG_WIN_MODE && tmp_dst.right(1) != Option::dir_sep)
tmp_dst += Option::dir_sep;
t << mkdir_p_asstring(filePrefixRoot(root, tmp_dst)) << "\n\t";
}
t << target << endl << endl;
if(!uninst.isEmpty()) {
t << "uninstall_" << (*it) << ": ";
if(project->isEmpty("QMAKE_NOFORCE"))
t << " FORCE";
t << "\n\t"
<< uninst.join("") << "\n\t"
<< "-$(DE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -