From 116379b131b6799a16560cbe23741ea39826a264 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 14 Mar 2017 11:24:23 +0100 Subject: [PATCH] ProjectExplorer: Update known predefined macros for MSVC ...and add a comment explaining what we do and why we do it this way. The added macros were collected as stated in the comment for MSVC versions (x86, amd64) 2003 - 2017. Note that for Visual Studio 2017 there is no "Predefined macros" page yet. Change-Id: I7601be08d7a0bbb63077abe9657d203661f76cb9 Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/msvctoolchain.cpp | 87 ++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index ad8bd0b507d..c350c7c3022 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -262,28 +262,51 @@ static QByteArray msvcCompilationFile() { static const char* macros[] = { "_ATL_VER", + "__ATOM__", + "__AVX__", + "__AVX2__", "_CHAR_UNSIGNED", "__CLR_VER", + "_CMMN_INTRIN_FUNC", + "_CONTROL_FLOW_GUARD", "__COUNTER__", "__cplusplus", "__cplusplus_cli", + "__cplusplus_winrt", "_CPPLIB_VER", "_CPPRTTI", "_CPPUNWIND", "__DATE__", "_DEBUG", "_DLL", + "__FILE__", + "__func__", "__FUNCDNAME__", "__FUNCSIG__", "__FUNCTION__", "_INTEGRAL_MAX_BITS", + "__INTELLISENSE__", + "_ISO_VOLATILE", + "_KERNEL_MODE", + "__LINE__", "_M_AAMD64", "_M_ALPHA", + "_M_AMD64", "_MANAGED", + "_M_ARM", + "_M_ARM64", + "_M_ARM_ARMV7VE", + "_M_ARM_FP", + "_M_ARM_NT", + "_M_ARMT", "_M_CEE", "_M_CEE_PURE", "_M_CEE_SAFE", "_MFC_VER", + "_M_FP_EXCEPT", + "_M_FP_FAST", + "_M_FP_PRECISE", + "_M_FP_STRICT", "_M_IA64", "_M_IX86", "_M_IX86_FP", @@ -294,11 +317,17 @@ static QByteArray msvcCompilationFile() "_MSC_EXTENSIONS", "_MSC_FULL_VER", "_MSC_VER", + "_MSVC_LANG", "__MSVC_RUNTIME_CHECKS", "_MT", + "_M_THUMB", "_M_X64", "_NATIVE_WCHAR_T_DEFINED", "_OPENMP", + "_PREFAST_", + "__STDC__", + "__STDC_HOSTED__", + "__STDCPP_THREADS__", "__TIME__", "__TIMESTAMP__", "_VC_NODEFAULTLIB", @@ -306,6 +335,7 @@ static QByteArray msvcCompilationFile() "_WIN32", "_WIN32_WCE", "_WIN64", + "_WINRT_DLL", "_Wp64", 0 }; @@ -320,7 +350,62 @@ static QByteArray msvcCompilationFile() } // Run MSVC 'cl' compiler to obtain #defines. -// Function must be thread-safe! +// This function must be thread-safe! +// +// Some notes regarding the used approach: +// +// It seems that there is no reliable way to get all the +// predefined macros for a cl invocation. The following two +// approaches are unfortunately limited since both lead to an +// incomplete list of actually predefined macros and come with +// other problems, too. +// +// 1) Maintain a list of predefined macros from the official +// documentation (for MSVC2015, e.g. [1]). Feed cl with a +// temporary file that queries the values of those macros. +// +// Problems: +// * Maintaining that list. +// * The documentation is incomplete, we do not get all +// predefined macros. E.g. the cl from MSVC2015, set up +// with "vcvars.bat x86_arm", predefines among others +// _M_ARMT, but that's not reflected in the +// documentation. +// +// 2) Run cl with the undocumented options /B1 and /Bx, as +// described in [2]. +// +// Note: With qmake from Qt >= 5.8 it's possible to print +// the macros formatted as preprocessor code in an easy to +// read/compare/diff way: +// +// > cl /nologo /c /TC /B1 qmake NUL +// > cl /nologo /c /TP /Bx qmake NUL +// +// Problems: +// * Using undocumented options. +// * Resulting macros are incomplete. +// For example, the nowadays default option /Zc:wchar_t +// predefines _WCHAR_T_DEFINED, but this is not reflected +// with this approach. +// +// To work around this we would need extra cl invocations +// to get the actual values of the missing macros +// (approach 1). +// +// Currently we combine both approaches in this way: +// * As base, maintain the list from the documentation and +// update it once a new MSVC version is released. +// * Enrich it with macros that we discover with approach 2 +// once a new MSVC version is released. +// * Enrich it further with macros that are not covered with +// the above points. +// +// TODO: Update the predefined macros for MSVC 2017 once the +// page exists. +// +// [1] https://msdn.microsoft.com/en-us/library/b0084kay.aspx +// [2] http://stackoverflow.com/questions/3665537/how-to-find-out-cl-exes-built-in-macros QByteArray MsvcToolChain::msvcPredefinedMacros(const QStringList cxxflags, const Utils::Environment &env) const {