diff options
Diffstat (limited to 'src/plugins/cpptools/clangcompileroptionsbuilder.cpp')
-rw-r--r-- | src/plugins/cpptools/clangcompileroptionsbuilder.cpp | 117 |
1 files changed, 59 insertions, 58 deletions
diff --git a/src/plugins/cpptools/clangcompileroptionsbuilder.cpp b/src/plugins/cpptools/clangcompileroptionsbuilder.cpp index 160bf6b4c6..0b2209cc62 100644 --- a/src/plugins/cpptools/clangcompileroptionsbuilder.cpp +++ b/src/plugins/cpptools/clangcompileroptionsbuilder.cpp @@ -26,7 +26,6 @@ #include "clangcompileroptionsbuilder.h" #include <coreplugin/icore.h> - #include <projectexplorer/projectexplorerconstants.h> #include <utils/qtcassert.h> @@ -38,46 +37,46 @@ namespace CppTools { static QString creatorResourcePath() { #ifndef UNIT_TESTS - return Core::ICore::instance()->libexecPath(); + return Core::ICore::instance()->resourcePath(); #else return QString(); #endif } -QStringList ClangCompilerOptionsBuilder::build(const CppTools::ProjectPart *projectPart, - CppTools::ProjectFile::Kind fileKind, - PchUsage pchUsage, - const QString &clangVersion, - const QString &clangResourceDirectory) +static QString creatorLibexecPath() { - if (projectPart) { - ClangCompilerOptionsBuilder builder(*projectPart, clangVersion, clangResourceDirectory); - - builder.addWordWidth(); - builder.addTargetTriple(); - builder.addLanguageOption(fileKind); - builder.addOptionsForLanguage(/*checkForBorlandExtensions*/ true); - builder.enableExceptions(); +#ifndef UNIT_TESTS + return Core::ICore::instance()->libexecPath(); +#else + return QString(); +#endif +} - builder.addDefineToAvoidIncludingGccOrMinGwIntrinsics(); - builder.addDefineFloat128ForMingw(); - builder.addToolchainAndProjectDefines(); - builder.undefineCppLanguageFeatureMacrosForMsvc2015(); +QStringList ClangCompilerOptionsBuilder::build(CppTools::ProjectFile::Kind fileKind, + PchUsage pchUsage) +{ + addWordWidth(); + addTargetTriple(); + addLanguageOption(fileKind); + addOptionsForLanguage(/*checkForBorlandExtensions*/ true); + enableExceptions(); - builder.addPredefinedMacrosAndHeaderPathsOptions(); - builder.addWrappedQtHeadersIncludePath(); - builder.addPrecompiledHeaderOptions(pchUsage); - builder.addHeaderPathOptions(); - builder.addProjectConfigFileInclude(); + addDefineFloat128ForMingw(); + addToolchainAndProjectMacros(); + undefineClangVersionMacrosForMsvc(); + undefineCppLanguageFeatureMacrosForMsvc2015(); - builder.addMsvcCompatibilityVersion(); + addPredefinedHeaderPathsOptions(); + addWrappedQtHeadersIncludePath(); + addPrecompiledHeaderOptions(pchUsage); + addHeaderPathOptions(); + addProjectConfigFileInclude(); - builder.addExtraOptions(); + addMsvcCompatibilityVersion(); - return builder.options(); - } + addExtraOptions(); - return QStringList(); + return options(); } ClangCompilerOptionsBuilder::ClangCompilerOptionsBuilder(const CppTools::ProjectPart &projectPart, @@ -91,47 +90,35 @@ ClangCompilerOptionsBuilder::ClangCompilerOptionsBuilder(const CppTools::Project bool ClangCompilerOptionsBuilder::excludeHeaderPath(const QString &path) const { - if (m_projectPart.toolchainType == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID) { - if (path.contains("lib/gcc/i686-apple-darwin")) - return true; + if (m_projectPart.toolchainType == ProjectExplorer::Constants::CLANG_TOOLCHAIN_TYPEID + && path.contains("lib/gcc/i686-apple-darwin")) { + return true; } return CompilerOptionsBuilder::excludeHeaderPath(path); } -void ClangCompilerOptionsBuilder::addPredefinedMacrosAndHeaderPathsOptions() +void ClangCompilerOptionsBuilder::addPredefinedHeaderPathsOptions() { - if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) - addPredefinedMacrosAndHeaderPathsOptionsForMsvc(); - else - addPredefinedMacrosAndHeaderPathsOptionsForNonMsvc(); -} - -void ClangCompilerOptionsBuilder::addPredefinedMacrosAndHeaderPathsOptionsForMsvc() -{ - add("-nostdinc"); add("-undef"); -} + add("-nostdinc"); + add("-nostdlibinc"); -void ClangCompilerOptionsBuilder::addPredefinedMacrosAndHeaderPathsOptionsForNonMsvc() -{ - static const QString resourceDir = clangIncludeDirectory(); - if (QTC_GUARD(!resourceDir.isEmpty())) { - add("-nostdlibinc"); - add("-I" + QDir::toNativeSeparators(resourceDir)); - add("-undef"); - } + if (m_projectPart.toolchainType != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) + add(includeDirOption() + clangIncludeDirectory()); } void ClangCompilerOptionsBuilder::addWrappedQtHeadersIncludePath() { - static const QString wrappedQtHeadersPath = creatorResourcePath() - + "/cplusplus/wrappedQtHeaders"; + static const QString resourcePath = creatorResourcePath(); + static QString wrappedQtHeadersPath = resourcePath + "/cplusplus/wrappedQtHeaders"; + QDir dir(wrappedQtHeadersPath); + QTC_ASSERT(QDir(wrappedQtHeadersPath).exists(), return;); if (m_projectPart.qtVersion != CppTools::ProjectPart::NoQt) { const QString wrappedQtCoreHeaderPath = wrappedQtHeadersPath + "/QtCore"; - add("-I" + QDir::toNativeSeparators(wrappedQtHeadersPath)); - add("-I" + QDir::toNativeSeparators(wrappedQtCoreHeaderPath)); + add(includeDirOption() + QDir::toNativeSeparators(wrappedQtHeadersPath)); + add(includeDirOption() + QDir::toNativeSeparators(wrappedQtCoreHeaderPath)); } } @@ -154,12 +141,26 @@ void ClangCompilerOptionsBuilder::addExtraOptions() QString ClangCompilerOptionsBuilder::clangIncludeDirectory() const { - QDir dir(creatorResourcePath() + "/clang/lib/clang/" + m_clangVersion + "/include"); - + QDir dir(creatorLibexecPath() + "/clang/lib/clang/" + m_clangVersion + "/include"); if (!dir.exists() || !QFileInfo(dir, "stdint.h").exists()) dir = QDir(m_clangResourceDirectory); + return QDir::toNativeSeparators(dir.canonicalPath()); +} - return dir.canonicalPath(); +void ClangCompilerOptionsBuilder::undefineClangVersionMacrosForMsvc() +{ + if (m_projectPart.toolchainType == ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID) { + static QStringList macroNames { + "__clang__", + "__clang_major__", + "__clang_minor__", + "__clang_patchlevel__", + "__clang_version__" + }; + + foreach (const QString ¯oName, macroNames) + add(undefineOption() + macroName); + } } } // namespace CppTools |