aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@qt.io>2016-10-25 16:28:40 +0200
committerOswald Buddenhagen <oswald.buddenhagen@qt.io>2016-11-01 17:35:59 +0000
commit7e86b98836342035684cc1c1aa49292224faed07 (patch)
tree68fdf9844651538b6027ce9f61255214b9460da2 /src
parent4148b05e0abe268c1299b5d3f672197a8f1acc92 (diff)
unify {,obj}c++{source,header} handling in qmake project manager
consistently with Xcode, qmake nowadays knows only one SOURCES list, which is automatically classified by extension. to replicate that, we actually copy the objective_c.prf file from qt 5.6.3 and use it to override whatever comes with qt, so we can treat all qt versions uniformly. also, the code model throws away the information which files were listed as sources and which as headers. this is technically incorrect, as a source may be only included rather than compiled, but there is no point in extracting information which is not used. conclusion: lump all c-like sources into one variable as far as project processing is concerned. and as far as configuration goes, our code model doesn't differentiate anyway, so the duplicated setup paths can be eliminated as well. Change-Id: I24b1bc056f8d9eb579c9378817f602912ab49971 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.cpp19
-rw-r--r--src/plugins/qmakeprojectmanager/qmakenodes.h5
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeproject.cpp66
-rw-r--r--src/shared/proparser/objective_c.prf12
-rw-r--r--src/shared/proparser/proparser.pri2
-rw-r--r--src/shared/proparser/proparser.qrc3
-rw-r--r--src/shared/proparser/qmakeevaluator.cpp39
7 files changed, 73 insertions, 73 deletions
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
index c8dfefb70d4..2644cfb44c7 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp
@@ -1414,13 +1414,11 @@ QString QmakePriFileNode::varNameForAdding(const QString &mimeType)
}
if (mimeType == QLatin1String(ProjectExplorer::Constants::CPP_SOURCE_MIMETYPE)
+ || mimeType == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)
|| mimeType == QLatin1String(ProjectExplorer::Constants::C_SOURCE_MIMETYPE)) {
return QLatin1String("SOURCES");
}
- if (mimeType == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE))
- return QLatin1String("OBJECTIVE_SOURCES");
-
if (mimeType == QLatin1String(ProjectExplorer::Constants::RESOURCE_MIMETYPE))
return QLatin1String("RESOURCES");
@@ -1932,14 +1930,13 @@ EvalResult *QmakeProFileNode::evaluate(const EvalInput &input)
result->newVarValues[IncludePathVar] = includePaths(input.readerExact, input.sysroot,
input.buildDirectory, input.projectDir);
result->newVarValues[CppFlagsVar] = input.readerExact->values(QLatin1String("QMAKE_CXXFLAGS"));
- result->newVarValues[CppHeaderVar] = fileListForVar(input.readerExact, input.readerCumulative,
- QLatin1String("HEADERS"), input.projectDir, input.buildDirectory);
- result->newVarValues[CppSourceVar] = fileListForVar(input.readerExact, input.readerCumulative,
- QLatin1String("SOURCES"), input.projectDir, input.buildDirectory);
- result->newVarValues[ObjCSourceVar] = fileListForVar(input.readerExact, input.readerCumulative,
- QLatin1String("OBJECTIVE_SOURCES"), input.projectDir, input.buildDirectory);
- result->newVarValues[ObjCHeaderVar] = fileListForVar(input.readerExact, input.readerCumulative,
- QLatin1String("OBJECTIVE_HEADERS"), input.projectDir, input.buildDirectory);
+ result->newVarValues[SourceVar] =
+ fileListForVar(input.readerExact, input.readerCumulative,
+ QLatin1String("SOURCES"), input.projectDir, input.buildDirectory) +
+ fileListForVar(input.readerExact, input.readerCumulative,
+ QLatin1String("HEADERS"), input.projectDir, input.buildDirectory) +
+ fileListForVar(input.readerExact, input.readerCumulative,
+ QLatin1String("OBJECTIVE_HEADERS"), input.projectDir, input.buildDirectory);
result->newVarValues[UiDirVar] = QStringList() << uiDirPath(input.readerExact, input.buildDirectory);
result->newVarValues[HeaderExtensionVar] = QStringList() << input.readerExact->value(QLatin1String("QMAKE_EXT_H"));
result->newVarValues[CppExtensionVar] = QStringList() << input.readerExact->value(QLatin1String("QMAKE_EXT_CPP"));
diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.h b/src/plugins/qmakeprojectmanager/qmakenodes.h
index 968f6bc8a59..32e19a52ca7 100644
--- a/src/plugins/qmakeprojectmanager/qmakenodes.h
+++ b/src/plugins/qmakeprojectmanager/qmakenodes.h
@@ -78,10 +78,7 @@ enum QmakeVariable {
DefinesVar = 1,
IncludePathVar,
CppFlagsVar,
- CppHeaderVar,
- CppSourceVar,
- ObjCSourceVar,
- ObjCHeaderVar,
+ SourceVar,
ExactResourceVar,
CumulativeResourceVar,
UiDirVar,
diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
index 9a53ff58c4e..f3cd7dbffa3 100644
--- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp
@@ -458,40 +458,27 @@ void QmakeProject::updateCppCodeModel()
// part->precompiledHeaders
templatePart->precompiledHeaders.append(pro->variableValue(PrecompiledHeaderVar));
- templatePart->updateLanguageFeatures();
+ // TODO: there is no LANG_OBJCXX, so:
+ const QStringList cxxflags = pro->variableValue(CppFlagsVar);
+ CppTools::ProjectPartBuilder::evaluateProjectPartToolchain(
+ templatePart.data(), ToolChainKitInformation::toolChain(k, ToolChain::Language::Cxx),
+ cxxflags, SysRootKitInformation::sysRoot(k));
+ setProjectLanguage(ProjectExplorer::Constants::LANG_CXX, true);
ProjectPart::Ptr cppPart = templatePart->copy();
- { // C++ files:
- // part->files
- foreach (const QString &file, pro->variableValue(CppSourceVar)) {
- cppPart->files << ProjectFile(file, ProjectFile::CXXSource);
- }
- foreach (const QString &file, pro->variableValue(CppHeaderVar)) {
- cppPart->files << ProjectFile(file, ProjectFile::CXXHeader);
- }
- }
-
ProjectPart::Ptr objcppPart = templatePart->copy();
- { // ObjC++ files:
- foreach (const QString &file, pro->variableValue(ObjCSourceVar)) {
- // Although the enum constant is called ObjCSourceVar, it actually is ObjC++ source
- // code, as qmake does not handle C (and ObjC).
- objcppPart->files << ProjectFile(file, ProjectFile::ObjCXXSource);
- }
- foreach (const QString &file, pro->variableValue(ObjCHeaderVar)) {
- objcppPart->files << ProjectFile(file, ProjectFile::ObjCXXHeader);
- }
-
- const QStringList cxxflags = pro->variableValue(CppFlagsVar);
- CppTools::ProjectPartBuilder::evaluateProjectPartToolchain(objcppPart.data(),
- ToolChainKitInformation::toolChain(k, ToolChain::Language::Cxx),
- cxxflags,
- SysRootKitInformation::sysRoot(k));
-
- if (!objcppPart->files.isEmpty()) {
- pinfo.appendProjectPart(objcppPart);
- // TODO: there is no LANG_OBJCXX, so:
- setProjectLanguage(ProjectExplorer::Constants::LANG_CXX, true);
+ foreach (const QString &file, pro->variableValue(SourceVar)) {
+ ProjectFile::Kind kind = ProjectFile::classify(file);
+ switch (kind) {
+ case ProjectFile::ObjCHeader:
+ case ProjectFile::ObjCSource:
+ case ProjectFile::ObjCXXHeader:
+ case ProjectFile::ObjCXXSource:
+ objcppPart->files << ProjectFile(file, kind);
+ break;
+ default:
+ cppPart->files << ProjectFile(file, kind);
+ break;
}
}
@@ -523,19 +510,12 @@ void QmakeProject::updateCppCodeModel()
cppPart->files.prepend(ProjectFile(CppTools::CppModelManager::configurationFileName(),
ProjectFile::CXXSource));
- const QStringList cxxflags = pro->variableValue(CppFlagsVar);
- CppTools::ProjectPartBuilder::evaluateProjectPartToolchain(
- cppPart.data(), ToolChainKitInformation::toolChain(k, ToolChain::Language::Cxx),
- cxxflags, SysRootKitInformation::sysRoot(k));
- if (!cppPart->files.isEmpty()) {
- pinfo.appendProjectPart(cppPart);
- setProjectLanguage(ProjectExplorer::Constants::LANG_CXX, true);
- }
-
- if (!objcppPart->files.isEmpty())
+ pinfo.appendProjectPart(cppPart);
+ objcppPart->displayName += QLatin1String(" (ObjC++)");
+ if (!objcppPart->files.isEmpty()) {
+ pinfo.appendProjectPart(objcppPart);
cppPart->displayName += QLatin1String(" (C++)");
- if (!cppPart->files.isEmpty())
- objcppPart->displayName += QLatin1String(" (ObjC++)");
+ }
}
pinfo.finish();
diff --git a/src/shared/proparser/objective_c.prf b/src/shared/proparser/objective_c.prf
new file mode 100644
index 00000000000..ed1ad8ad384
--- /dev/null
+++ b/src/shared/proparser/objective_c.prf
@@ -0,0 +1,12 @@
+
+# Objective-C/C++ sources go in SOURCES, like all other sources
+SOURCES += $$OBJECTIVE_SOURCES
+unset(OBJECTIVE_SOURCES)
+
+# Strip C/C++ flags from QMAKE_OBJECTIVE_CFLAGS just in case
+QMAKE_OBJECTIVE_CFLAGS -= $$QMAKE_CFLAGS $$QMAKE_CXXFLAGS
+
+# Add Objective-C/C++ flags to C/C++ flags, the compiler can handle it
+QMAKE_CFLAGS += $$QMAKE_OBJECTIVE_CFLAGS
+QMAKE_CXXFLAGS += $$QMAKE_OBJECTIVE_CFLAGS
+unset(QMAKE_OBJECTIVE_CFLAGS)
diff --git a/src/shared/proparser/proparser.pri b/src/shared/proparser/proparser.pri
index a3667e52919..53ab86cf575 100644
--- a/src/shared/proparser/proparser.pri
+++ b/src/shared/proparser/proparser.pri
@@ -29,4 +29,4 @@ SOURCES += \
ioutils.cpp
RESOURCES += proparser.qrc
-DEFINES += QMAKE_BUILTIN_PRFS
+DEFINES += QMAKE_BUILTIN_PRFS QMAKE_OVERRIDE_PRFS
diff --git a/src/shared/proparser/proparser.qrc b/src/shared/proparser/proparser.qrc
index 9193eaa31c4..10f360fa490 100644
--- a/src/shared/proparser/proparser.qrc
+++ b/src/shared/proparser/proparser.qrc
@@ -3,4 +3,7 @@
<file>spec_pre.prf</file>
<file>spec_post.prf</file>
</qresource>
+ <qresource prefix="/qmake/override_features" >
+ <file>objective_c.prf</file>
+ </qresource>
</RCC>
diff --git a/src/shared/proparser/qmakeevaluator.cpp b/src/shared/proparser/qmakeevaluator.cpp
index 19e9f8b2326..5e318b170d8 100644
--- a/src/shared/proparser/qmakeevaluator.cpp
+++ b/src/shared/proparser/qmakeevaluator.cpp
@@ -1953,23 +1953,34 @@ QMakeEvaluator::VisitReturn QMakeEvaluator::evaluateFeatureFile(
// needs to be determined. Failed lookups are represented via non-null empty strings.
QString *fnp = &m_featureRoots->cache[qMakePair(fn, currFn)];
if (fnp->isNull()) {
- int start_root = 0;
- const QStringList &paths = m_featureRoots->paths;
- if (!currFn.isEmpty()) {
- QStringRef currPath = IoUtils::pathName(currFn);
- for (int root = 0; root < paths.size(); ++root)
- if (currPath == paths.at(root)) {
- start_root = root + 1;
- break;
- }
- }
- for (int root = start_root; root < paths.size(); ++root) {
- QString fname = paths.at(root) + fn;
- if (IoUtils::exists(fname)) {
- fn = fname;
+#ifdef QMAKE_OVERRIDE_PRFS
+ {
+ QString ovrfn(QLatin1String(":/qmake/override_features/") + fn);
+ if (QFileInfo::exists(ovrfn)) {
+ fn = ovrfn;
goto cool;
}
}
+#endif
+ {
+ int start_root = 0;
+ const QStringList &paths = m_featureRoots->paths;
+ if (!currFn.isEmpty()) {
+ QStringRef currPath = IoUtils::pathName(currFn);
+ for (int root = 0; root < paths.size(); ++root)
+ if (currPath == paths.at(root)) {
+ start_root = root + 1;
+ break;
+ }
+ }
+ for (int root = start_root; root < paths.size(); ++root) {
+ QString fname = paths.at(root) + fn;
+ if (IoUtils::exists(fname)) {
+ fn = fname;
+ goto cool;
+ }
+ }
+ }
#ifdef QMAKE_BUILTIN_PRFS
fn.prepend(QLatin1String(":/qmake/features/"));
if (QFileInfo::exists(fn))