📄 option.cpp
字号:
continue;
QString candidate = currentDir.absoluteFilePath(*p + QLatin1Char('/') + argv0);
if (QFile::exists(candidate)) {
Option::qmake_abslocation = candidate;
break;
}
}
}
if(!Option::qmake_abslocation.isNull())
Option::qmake_abslocation = QDir::cleanPath(Option::qmake_abslocation);
} else {
Option::qmake_mode = Option::QMAKE_GENERATE_MAKEFILE;
}
const QByteArray envflags = qgetenv("QMAKEFLAGS");
if (!envflags.isNull()) {
int env_argc = 0, env_size = 0, currlen=0;
char quote = 0, **env_argv = NULL;
for (int i = 0; i < envflags.size(); ++i) {
if (!quote && (envflags.at(i) == '\'' || envflags.at(i) == '"')) {
quote = envflags.at(i);
} else if (envflags.at(i) == quote) {
quote = 0;
} else if (!quote && envflags.at(i) == ' ') {
if (currlen && env_argv && env_argv[env_argc]) {
env_argv[env_argc][currlen] = '\0';
currlen = 0;
env_argc++;
}
} else {
if(!env_argv || env_argc > env_size) {
env_argv = (char **)realloc(env_argv, sizeof(char *)*(env_size+=10));
for(int i2 = env_argc; i2 < env_size; i2++)
env_argv[i2] = NULL;
}
if(!env_argv[env_argc]) {
currlen = 0;
env_argv[env_argc] = (char*)malloc(255);
}
if(currlen < 255)
env_argv[env_argc][currlen++] = envflags.at(i);
}
}
if(env_argv) {
if(env_argv[env_argc]) {
env_argv[env_argc][currlen] = '\0';
currlen = 0;
env_argc++;
}
parseCommandLine(env_argc, env_argv);
for(int i2 = 0; i2 < env_size; i2++) {
if(env_argv[i2])
free(env_argv[i2]);
}
free(env_argv);
}
}
if(argc && argv) {
int ret = parseCommandLine(argc, argv, 1);
if(ret != Option::QMAKE_CMDLINE_SUCCESS) {
if ((ret & Option::QMAKE_CMDLINE_SHOW_USAGE) != 0)
usage(argv[0]);
return ret;
//return ret == QMAKE_CMDLINE_SHOW_USAGE ? usage(argv[0]) : false;
}
}
//last chance for defaults
if(Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE ||
Option::qmake_mode == Option::QMAKE_GENERATE_PRL) {
if(Option::mkfile::qmakespec.isNull() || Option::mkfile::qmakespec.isEmpty())
Option::mkfile::qmakespec = QString::fromLocal8Bit(qgetenv("QMAKESPEC").constData());
//try REALLY hard to do it for them, lazy..
if(Option::mkfile::project_files.isEmpty()) {
QString pwd = qmake_getpwd(),
proj = pwd + "/" + pwd.right(pwd.length() - (pwd.lastIndexOf('/') + 1)) + Option::pro_ext;
if(QFile::exists(proj)) {
Option::mkfile::project_files.append(proj);
} else { //last try..
QStringList profiles = QDir(pwd).entryList(QStringList("*" + Option::pro_ext));
if(profiles.count() == 1)
Option::mkfile::project_files.append(pwd + "/" + profiles[0]);
}
#ifndef QT_BUILD_QMAKE_LIBRARY
if(Option::mkfile::project_files.isEmpty()) {
usage(argv[0]);
return Option::QMAKE_CMDLINE_ERROR;
}
#endif
}
}
//defaults for globals
if(Option::target_mode == Option::TARG_WIN_MODE) {
Option::dir_sep = "\\";
Option::obj_ext = ".obj";
Option::res_ext = ".res";
} else {
if(Option::target_mode == Option::TARG_MAC9_MODE)
Option::dir_sep = ":";
else
Option::dir_sep = "/";
Option::obj_ext = ".o";
}
return QMAKE_CMDLINE_SUCCESS;
}
bool Option::postProcessProject(QMakeProject *project)
{
Option::cpp_ext = project->variables()["QMAKE_EXT_CPP"];
if(cpp_ext.isEmpty())
cpp_ext << ".cpp"; //something must be there
Option::h_ext = project->variables()["QMAKE_EXT_H"];
if(h_ext.isEmpty())
h_ext << ".h";
if(!project->isEmpty("QMAKE_EXT_RES"))
Option::res_ext = project->first("QMAKE_EXT_RES");
if(!project->isEmpty("QMAKE_EXT_PKGCONFIG"))
Option::pkgcfg_ext = project->first("QMAKE_EXT_PKGCONFIG");
if(!project->isEmpty("QMAKE_EXT_LIBTOOL"))
Option::libtool_ext = project->first("QMAKE_EXT_LIBTOOL");
if(!project->isEmpty("QMAKE_EXT_PRL"))
Option::prl_ext = project->first("QMAKE_EXT_PRL");
if(!project->isEmpty("QMAKE_EXT_PRF"))
Option::prf_ext = project->first("QMAKE_EXT_PRF");
if(!project->isEmpty("QMAKE_EXT_UI"))
Option::ui_ext = project->first("QMAKE_EXT_UI");
if(!project->isEmpty("QMAKE_EXT_CPP_MOC"))
Option::cpp_moc_ext = project->first("QMAKE_EXT_CPP_MOC");
if(!project->isEmpty("QMAKE_EXT_H_MOC"))
Option::h_moc_ext = project->first("QMAKE_EXT_H_MOC");
if(!project->isEmpty("QMAKE_EXT_LEX"))
Option::lex_ext = project->first("QMAKE_EXT_LEX");
if(!project->isEmpty("QMAKE_EXT_YACC"))
Option::yacc_ext = project->first("QMAKE_EXT_YACC");
if(!project->isEmpty("QMAKE_EXT_OBJ"))
Option::obj_ext = project->first("QMAKE_EXT_OBJ");
if(!project->isEmpty("QMAKE_H_MOD_MOC"))
Option::h_moc_mod = project->first("QMAKE_H_MOD_MOC");
if(!project->isEmpty("QMAKE_CPP_MOD_MOC"))
Option::cpp_moc_mod = project->first("QMAKE_CPP_MOD_MOC");
if(!project->isEmpty("QMAKE_MOD_LEX"))
Option::lex_mod = project->first("QMAKE_MOD_LEX");
if(!project->isEmpty("QMAKE_MOD_YACC"))
Option::yacc_mod = project->first("QMAKE_MOD_YACC");
if(!project->isEmpty("QMAKE_DIR_SEP"))
Option::dir_sep = project->first("QMAKE_DIR_SEP");
if(!project->isEmpty("QMAKE_DIRLIST_SEP"))
Option::dirlist_sep = project->first("QMAKE_DIRLIST_SEP");
if(!project->isEmpty("QMAKE_MOD_SYSTEM_ENV"))
Option::sysenv_mod = project->first("QMAKE_MOD_SYSTEM_ENV");
return true;
}
QString
Option::fixString(QString string, uchar flags)
{
static QHash<FixStringCacheKey, QString> *cache = 0;
if(!cache) {
cache = new QHash<FixStringCacheKey, QString>;
qmakeAddCacheClear(qmakeDeleteCacheClear_QHashFixStringCacheKeyQString, (void**)&cache);
}
FixStringCacheKey cacheKey(string, flags);
if(cache->contains(cacheKey))
return cache->value(cacheKey);
//fix the environment variables
if(flags & Option::FixEnvVars) {
int rep;
QRegExp reg_var("\\$\\(.*\\)");
reg_var.setMinimal(true);
while((rep = reg_var.indexIn(string)) != -1)
string.replace(rep, reg_var.matchedLength(),
QString::fromLocal8Bit(qgetenv(string.mid(rep + 2, reg_var.matchedLength() - 3).toLatin1().constData()).constData()));
}
//canonicalize it (and treat as a path)
if(flags & Option::FixPathCanonicalize) {
#if 0
string = QFileInfo(string).canonicalFilePath();
#endif
string = QDir::cleanPath(string);
}
if(string.length() > 2 && string[0].isLetter() && string[1] == QLatin1Char(':'))
string[0] = string[0].toLower();
//fix separators
Q_ASSERT(!((flags & Option::FixPathToLocalSeparators) && (flags & Option::FixPathToTargetSeparators)));
if(flags & Option::FixPathToLocalSeparators) {
#if defined(Q_OS_WIN32)
string = string.replace('/', '\\');
#else
string = string.replace('\\', '/');
#endif
} else if(flags & Option::FixPathToTargetSeparators) {
string = string.replace('/', Option::dir_sep).replace('\\', Option::dir_sep);
}
if (string.startsWith("\"") && string.endsWith("\"") ||
string.startsWith("\'") && string.endsWith("\'"))
string = string.mid(1, string.length()-2);
//cache
cache->insert(cacheKey, string);
return string;
}
const char *qmake_version()
{
static char *ret = NULL;
if(ret)
return ret;
ret = (char *)malloc(15);
qmakeAddCacheClear(qmakeFreeCacheClear, (void**)&ret);
#if defined(_MSC_VER) && _MSC_VER >= 1400
sprintf_s(ret, 15, "%d.%02d%c", QMAKE_VERSION_MAJOR, QMAKE_VERSION_MINOR, 'a' + QMAKE_VERSION_PATCH);
#else
sprintf(ret, "%d.%02d%c", QMAKE_VERSION_MAJOR, QMAKE_VERSION_MINOR, 'a' + QMAKE_VERSION_PATCH);
#endif
return ret;
}
void debug_msg_internal(int level, const char *fmt, ...)
{
if(Option::debug_level < level)
return;
fprintf(stderr, "DEBUG %d: ", level);
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
}
fprintf(stderr, "\n");
}
void warn_msg(QMakeWarn type, const char *fmt, ...)
{
if(!(Option::warn_level & type))
return;
fprintf(stderr, "WARNING: ");
{
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
}
fprintf(stderr, "\n");
}
#include "../src/corelib/global/qconfig.cpp"
QString QLibraryInfo::location(QLibraryInfo::LibraryLocation loc)
{
QString ret;
const char *path = 0;
switch (loc) {
#ifdef QT_CONFIGURE_PREFIX_PATH
case PrefixPath:
path = QT_CONFIGURE_PREFIX_PATH;
break;
#endif
#ifdef QT_CONFIGURE_DOCUMENTATION_PATH
case DocumentationPath:
path = QT_CONFIGURE_DOCUMENTATION_PATH;
break;
#endif
#ifdef QT_CONFIGURE_HEADERS_PATH
case HeadersPath:
path = QT_CONFIGURE_HEADERS_PATH;
break;
#endif
#ifdef QT_CONFIGURE_LIBRARIES_PATH
case LibrariesPath:
path = QT_CONFIGURE_LIBRARIES_PATH;
break;
#endif
#ifdef QT_CONFIGURE_BINARIES_PATH
case BinariesPath:
path = QT_CONFIGURE_BINARIES_PATH;
break;
#endif
#ifdef QT_CONFIGURE_PLUGINS_PATH
case PluginsPath:
path = QT_CONFIGURE_PLUGINS_PATH;
break;
#endif
#ifdef QT_CONFIGURE_DATA_PATH
case DataPath:
path = QT_CONFIGURE_DATA_PATH;
break;
#endif
#ifdef QT_CONFIGURE_TRANSLATIONS_PATH
case TranslationsPath:
path = QT_CONFIGURE_TRANSLATIONS_PATH;
break;
#endif
#ifdef QT_CONFIGURE_SETTINGS_PATH
case SettingsPath:
path = QT_CONFIGURE_SETTINGS_PATH;
break;
#endif
#ifdef QT_CONFIGURE_EXAMPLES_PATH
case ExamplesPath:
path = QT_CONFIGURE_EXAMPLES_PATH;
break;
#endif
#ifdef QT_CONFIGURE_DEMOS_PATH
case DemosPath:
path = QT_CONFIGURE_DEMOS_PATH;
break;
#endif
default:
break;
}
if (path)
ret = QString::fromLocal8Bit(path);
if (QDir::isRelativePath(ret)) {
if (loc == PrefixPath) {
// we make the prefix path absolute to the current directory
return QDir::current().absoluteFilePath(ret);
} else {
// we make any other path absolute to the prefix directory
return QDir(location(PrefixPath)).absoluteFilePath(ret);
}
}
return ret;
}
class QMakeCacheClearItem {
private:
qmakeCacheClearFunc func;
void **data;
public:
QMakeCacheClearItem(qmakeCacheClearFunc f, void **d) : func(f), data(d) { }
~QMakeCacheClearItem() {
(*func)(*data);
*data = 0;
}
};
static QList<QMakeCacheClearItem*> cache_items;
void
qmakeClearCaches()
{
qDeleteAll(cache_items);
cache_items.clear();
}
void
qmakeAddCacheClear(qmakeCacheClearFunc func, void **data)
{
cache_items.append(new QMakeCacheClearItem(func, data));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -