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 <tobias.hunger@qt.io>
This commit is contained in:
Nikolai Kosjar
2017-03-14 11:24:23 +01:00
parent 3a679ea173
commit 116379b131

View File

@@ -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
{