summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppprojects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cpptools/cppprojects.cpp')
-rw-r--r--src/plugins/cpptools/cppprojects.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/src/plugins/cpptools/cppprojects.cpp b/src/plugins/cpptools/cppprojects.cpp
index 092a1b98c5..060d677db8 100644
--- a/src/plugins/cpptools/cppprojects.cpp
+++ b/src/plugins/cpptools/cppprojects.cpp
@@ -441,3 +441,175 @@ void ProjectPartBuilder::createProjectPart(const QStringList &theSources,
m_pInfo.appendProjectPart(part);
}
+
+
+QStringList CompilerOptionsBuilder::createHeaderPathOptions(
+ const ProjectPart::HeaderPaths &headerPaths,
+ IsBlackListed isBlackListed)
+{
+ typedef ProjectPart::HeaderPath HeaderPath;
+
+ QStringList result;
+
+ foreach (const HeaderPath &headerPath , headerPaths) {
+ if (headerPath.path.isEmpty())
+ continue;
+
+ if (isBlackListed && isBlackListed(headerPath.path))
+ continue;
+
+ QString prefix;
+ switch (headerPath.type) {
+ case HeaderPath::FrameworkPath:
+ prefix = QLatin1String("-F");
+ break;
+ default: // This shouldn't happen, but let's be nice..:
+ // intentional fall-through:
+ case HeaderPath::IncludePath:
+ prefix = QLatin1String("-I");
+ break;
+ }
+
+ result.append(prefix + headerPath.path);
+ }
+
+ return result;
+}
+
+QStringList CompilerOptionsBuilder::createDefineOptions(const QByteArray &defines,
+ bool toolchainDefines)
+{
+ QStringList result;
+
+ foreach (QByteArray def, defines.split('\n')) {
+ if (def.isEmpty())
+ continue;
+
+ // This is a quick fix for QTCREATORBUG-11501.
+ // TODO: do a proper fix, see QTCREATORBUG-11709.
+ if (def.startsWith("#define __cplusplus"))
+ continue;
+
+ // TODO: verify if we can pass compiler-defined macros when also passing -undef.
+ if (toolchainDefines) {
+ //### FIXME: the next 3 check shouldn't be needed: we probably don't want to get the compiler-defined defines in.
+ if (!def.startsWith("#define "))
+ continue;
+ if (def.startsWith("#define _"))
+ continue;
+ if (def.startsWith("#define OBJC_NEW_PROPERTIES"))
+ continue;
+ }
+
+ QByteArray str = def.mid(8);
+ int spaceIdx = str.indexOf(' ');
+ QString arg;
+ if (spaceIdx != -1) {
+ arg = QLatin1String("-D" + str.left(spaceIdx) + "=" + str.mid(spaceIdx + 1));
+ } else {
+ arg = QLatin1String("-D" + str);
+ }
+ arg = arg.replace(QLatin1String("\\\""), QLatin1String("\""));
+ arg = arg.replace(QLatin1String("\""), QLatin1String(""));
+ if (!result.contains(arg))
+ result.append(arg);
+ }
+
+ return result;
+}
+
+QStringList CompilerOptionsBuilder::createLanguageOption(ProjectFile::Kind fileKind, bool objcExt)
+{
+ QStringList opts;
+ opts += QLatin1String("-x");
+
+ switch (fileKind) {
+ case ProjectFile::CHeader:
+ if (objcExt)
+ opts += QLatin1String("objective-c-header");
+ else
+ opts += QLatin1String("c-header");
+ break;
+
+ case ProjectFile::CXXHeader:
+ default:
+ if (!objcExt) {
+ opts += QLatin1String("c++-header");
+ break;
+ } // else: fall-through!
+ case ProjectFile::ObjCHeader:
+ case ProjectFile::ObjCXXHeader:
+ opts += QLatin1String("objective-c++-header");
+ break;
+
+ case ProjectFile::CSource:
+ if (!objcExt) {
+ opts += QLatin1String("c");
+ break;
+ } // else: fall-through!
+ case ProjectFile::ObjCSource:
+ opts += QLatin1String("objective-c");
+ break;
+
+ case ProjectFile::CXXSource:
+ if (!objcExt) {
+ opts += QLatin1String("c++");
+ break;
+ } // else: fall-through!
+ case ProjectFile::ObjCXXSource:
+ opts += QLatin1String("objective-c++");
+ break;
+
+ case ProjectFile::OpenCLSource:
+ opts += QLatin1String("cl");
+ break;
+ case ProjectFile::CudaSource:
+ opts += QLatin1String("cuda");
+ break;
+ }
+
+ return opts;
+}
+
+QStringList CompilerOptionsBuilder::createOptionsForLanguage(
+ ProjectPart::LanguageVersion languageVersion,
+ ProjectPart::LanguageExtensions languageExtensions,
+ bool checkForBorlandExtensions)
+{
+ QStringList opts;
+ bool gnuExtensions = languageExtensions & ProjectPart::GnuExtensions;
+ switch (languageVersion) {
+ case ProjectPart::C89:
+ opts << (gnuExtensions ? QLatin1String("-std=gnu89") : QLatin1String("-std=c89"));
+ break;
+ case ProjectPart::C99:
+ opts << (gnuExtensions ? QLatin1String("-std=gnu99") : QLatin1String("-std=c99"));
+ break;
+ case ProjectPart::C11:
+ opts << (gnuExtensions ? QLatin1String("-std=gnu11") : QLatin1String("-std=c11"));
+ break;
+ case ProjectPart::CXX11:
+ opts << (gnuExtensions ? QLatin1String("-std=gnu++11") : QLatin1String("-std=c++11"));
+ break;
+ case ProjectPart::CXX98:
+ opts << (gnuExtensions ? QLatin1String("-std=gnu++98") : QLatin1String("-std=c++98"));
+ break;
+ case ProjectPart::CXX03:
+ opts << QLatin1String("-std=c++03");
+ break;
+ case ProjectPart::CXX14:
+ opts << QLatin1String("-std=c++1y"); // TODO: change to c++14 after 3.5
+ break;
+ case ProjectPart::CXX17:
+ opts << QLatin1String("-std=c++1z"); // TODO: change to c++17 at some point in the future
+ break;
+ }
+
+ if (languageExtensions & ProjectPart::MicrosoftExtensions)
+ opts << QLatin1String("-fms-extensions");
+
+ if (checkForBorlandExtensions && (languageExtensions & ProjectPart::BorlandExtensions))
+ opts << QLatin1String("-fborland-extensions");
+
+ return opts;
+}