aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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))