Clean up MSVC version string generation.
Don't bother with versions prior to VS 2010; as of Wireshark 2.4, we don't support them. Show it as "Visual Studio (year)", followed by the toolchain version (not to be confused with the compiler version - or with the Visual Studio version!). Do the same thing for the clang/C2 compiler; just append the clang version stuff after that. Indent the #if/#elif/#else/#endif to make it a little clearer how they're nested. Change-Id: Ib7a3af3251e6375d267b3b5da9f8e26a377ceeac Reviewed-on: https://code.wireshark.org/review/30138 Petri-Dish: Guy Harris <guy@alum.mit.edu> Tested-by: Petri Dish Buildbot Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
parent
ec6ace066a
commit
f7596b82ab
192
version_info.c
192
version_info.c
|
@ -177,96 +177,162 @@ get_compiler_info(GString *str)
|
||||||
* doesn't also offer a nice printable string, we try prettifying
|
* doesn't also offer a nice printable string, we try prettifying
|
||||||
* the number somehow.
|
* the number somehow.
|
||||||
*/
|
*/
|
||||||
#if defined(__GNUC__) && defined(__VERSION__)
|
#if defined(_MSC_FULL_VER)
|
||||||
|
/*
|
||||||
|
* We check for this first, as Microsoft have a version of their
|
||||||
|
* compiler that has Clang as the front end and their code generator
|
||||||
|
* as the back end.
|
||||||
|
*
|
||||||
|
* My head asplode.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* As of Wireshark 2.4, we support only Visual Studio 2010 (10.x)
|
||||||
|
* or later.
|
||||||
|
*
|
||||||
|
* https://dev.to/yumetodo/list-of-mscver-and-mscfullver-8nd
|
||||||
|
* has a *large* table of Microsoft product names, VC++ versions,
|
||||||
|
* _MSC_VER values, and _MSC_FULL_VER values. All the versions
|
||||||
|
* we support define _MSC_FULL_VER. We don't bother trying to
|
||||||
|
* get the SP/update/version number from the build number, as
|
||||||
|
* we'd have to keep updating that with every update; there's no
|
||||||
|
* way to get that information directly from a predefine, and in
|
||||||
|
* some cases multiple updates/versions have the *same* build
|
||||||
|
* number (because they didn't update the toolchain).
|
||||||
|
*
|
||||||
|
* https://docs.microsoft.com/en-us/cpp/preprocessor/predefined-macros?view=vs-2017
|
||||||
|
* defines the format of _MSC_VER and _MSC_FULL_VER. _MSC_FULL_VER
|
||||||
|
* is a decimal number of the form MMmmBBBBB, where MM is the compiler/
|
||||||
|
* toolchain major version, mm is the minor version, and BBBBB is the
|
||||||
|
* build. We break it down based on that.
|
||||||
|
*/
|
||||||
|
#define COMPILER_MAJOR_VERSION (_MSC_FULL_VER / 10000000)
|
||||||
|
#define COMPILER_MINOR_VERSION ((_MSC_FULL_VER % 10000000) / 100000)
|
||||||
|
#define COMPILER_BUILD_NUMBER (_MSC_FULL_VER % 100000)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* From https://blogs.msdn.microsoft.com/vcblog/2014/11/17/c111417-features-in-vs-2015-preview/
|
||||||
|
*
|
||||||
|
* Bakersfield: DevDiv's upper management determines the scheduling
|
||||||
|
* of new major versions. They also decided to increment the product
|
||||||
|
* version from 12 (for VS 2013) to 14 (for VS 2015). However, the
|
||||||
|
* C++ compiler's version incremented normally, from 18 to 19.
|
||||||
|
* (It's larger because the C++ compiler predates the "Visual" in
|
||||||
|
* Visual C++.)
|
||||||
|
*
|
||||||
|
* We calculate the Visual C++ version number based on that.
|
||||||
|
*/
|
||||||
|
#if COMPILER_MAJOR_VERSION < 19
|
||||||
|
#define VCPP_MAJOR_VERSION (COMPILER_MAJOR_VERSION - 6)
|
||||||
|
#else
|
||||||
|
#define VCPP_MAJOR_VERSION (COMPILER_MAJOR_VERSION - 5)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if VCPP_MAJOR_VERSION == 10
|
||||||
|
/*
|
||||||
|
* For VC++ version 10.x, it's Visual Studio 2010.
|
||||||
|
*/
|
||||||
|
#define VS_VERSION "2010"
|
||||||
|
#elif VCPP_MAJOR_VERSION == 11
|
||||||
|
/*
|
||||||
|
* For VC++ version 11.x, it's Visual Studio 2012.
|
||||||
|
*/
|
||||||
|
#define VS_VERSION "2012"
|
||||||
|
#elif VCPP_MAJOR_VERSION == 12
|
||||||
|
/*
|
||||||
|
* For VC++ version 12.x, it's Visual Studio 2013.
|
||||||
|
*/
|
||||||
|
#define VS_VERSION "2013"
|
||||||
|
#elif VCPP_MAJOR_VERSION == 14
|
||||||
|
/*
|
||||||
|
* From https://blogs.msdn.microsoft.com/vcblog/2017/11/15/side-by-side-minor-version-msvc-toolsets-in-visual-studio-2017/:
|
||||||
|
*
|
||||||
|
* We've been delivering improvements to Visual Studio 2017 more
|
||||||
|
* frequently than ever before. Since its first release in March
|
||||||
|
* we've released four major updates to VS2017 and are currently
|
||||||
|
* previewing the fifth update, VS2017 version 15.5.
|
||||||
|
*
|
||||||
|
* The MSVC toolset in VS2017 is built as a minor version update to
|
||||||
|
* the VS2015 compiler toolset. This minor version bump indicates
|
||||||
|
* that the VS2017 MSVC toolset is binary compatible with the VS2015
|
||||||
|
* MSVC toolset, enabling an easier upgrade for VS2015 users. Even
|
||||||
|
* though the MSVC compiler toolset in VS2017 delivers many new
|
||||||
|
* features and conformance improvements it is a minor version,
|
||||||
|
* compatible update from 14.00 in VS2015 to 14.10 in VS2017.
|
||||||
|
*/
|
||||||
|
#if COMPILER_MINOR_VERSION < 10
|
||||||
|
#define VS_VERSION "2015"
|
||||||
|
#else
|
||||||
|
#define VS_VERSION "2017"
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* Add additional checks here, before the #else.
|
||||||
|
*/
|
||||||
|
#if VCPP_MAJOR_VERSION < 10
|
||||||
|
#error "Visual C++/Visual Studio prior to Visual Studio 2010 isn't supported"
|
||||||
|
#else
|
||||||
|
#define VS_VERSION "(unknown)"
|
||||||
|
#endif
|
||||||
|
#endif /* VCPP_MAJOR_VERSION */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX - should we show the raw compiler version number, as is
|
||||||
|
* shown by "cl /?", which would be %d.%d.%d.%d with
|
||||||
|
* COMPILER_MAJOR_VERSION, COMPILER_MINOR_VERSION,
|
||||||
|
* COMPILER_BUILD_NUMBER, and _MSC_BUILD, the last of which is
|
||||||
|
* "the revision number element of the compiler's version number",
|
||||||
|
* which I guess is not to be confused with the build number,
|
||||||
|
* the _BUILD in the name nonwithstanding.
|
||||||
|
*/
|
||||||
|
g_string_append_printf(str, "\n\nBuilt using Microsoft Visual Studio " VS_VERSION "(VC++ %d.%d, build %d)",
|
||||||
|
VCPP_MAJOR_VERSION, COMPILER_MINOR_VERSION, COMPILER_BUILD_NUMBER);
|
||||||
|
#if defined(__clang__)
|
||||||
|
/*
|
||||||
|
* See above.
|
||||||
|
*/
|
||||||
|
g_string_append_printf(str, " clang/C2 %s and -fno-ms-compatibility.\n",
|
||||||
|
__VERSION__);
|
||||||
|
#else
|
||||||
|
g_string_append_printf(str, "\n");
|
||||||
|
#endif
|
||||||
|
#elif defined(__GNUC__) && defined(__VERSION__)
|
||||||
/*
|
/*
|
||||||
* Clang and llvm-gcc also define __GNUC__ and __VERSION__;
|
* Clang and llvm-gcc also define __GNUC__ and __VERSION__;
|
||||||
* distinguish between them.
|
* distinguish between them.
|
||||||
*/
|
*/
|
||||||
#if defined(__clang__)
|
#if defined(__clang__)
|
||||||
/*
|
/*
|
||||||
* Microsoft have a version of their compiler that has Clang
|
* We know this isn't clang/C2, as _MSC_FULL_VER isn't defined.
|
||||||
* as the front end and their code generator as the back end.
|
|
||||||
*
|
|
||||||
* My head asplode.
|
|
||||||
*/
|
*/
|
||||||
#if defined(__MSC_VER)
|
|
||||||
g_string_append_printf(str, "\n\nBuilt using Microsoft Visual C++ %d.%d.%d clang/C2 %s and -fno-ms-compatibility.\n",
|
|
||||||
(_MSC_VER / 100) - 6, _MSC_VER % 100, __VERSION__);
|
|
||||||
#else
|
|
||||||
g_string_append_printf(str, "\n\nBuilt using clang %s.\n", __VERSION__);
|
g_string_append_printf(str, "\n\nBuilt using clang %s.\n", __VERSION__);
|
||||||
#endif /* defined(__MSC_VER) */
|
#elif defined(__llvm__)
|
||||||
#elif defined(__llvm__)
|
/* llvm-gcc */
|
||||||
g_string_append_printf(str, "\n\nBuilt using llvm-gcc %s.\n", __VERSION__);
|
g_string_append_printf(str, "\n\nBuilt using llvm-gcc %s.\n", __VERSION__);
|
||||||
#else /* boring old GCC */
|
#else /* boring old GCC */
|
||||||
g_string_append_printf(str, "\n\nBuilt using gcc %s.\n", __VERSION__);
|
g_string_append_printf(str, "\n\nBuilt using gcc %s.\n", __VERSION__);
|
||||||
#endif /* llvm */
|
#endif /* llvm */
|
||||||
#elif defined(__HP_aCC)
|
#elif defined(__HP_aCC)
|
||||||
g_string_append_printf(str, "\n\nBuilt using HP aCC %d.\n", __HP_aCC);
|
g_string_append_printf(str, "\n\nBuilt using HP aCC %d.\n", __HP_aCC);
|
||||||
#elif defined(__xlC__)
|
#elif defined(__xlC__)
|
||||||
g_string_append_printf(str, "\n\nBuilt using IBM XL C %d.%d\n",
|
g_string_append_printf(str, "\n\nBuilt using IBM XL C %d.%d\n",
|
||||||
(__xlC__ >> 8) & 0xFF, __xlC__ & 0xFF);
|
(__xlC__ >> 8) & 0xFF, __xlC__ & 0xFF);
|
||||||
#ifdef __IBMC__
|
#ifdef __IBMC__
|
||||||
if ((__IBMC__ % 10) != 0)
|
if ((__IBMC__ % 10) != 0)
|
||||||
g_string_append_printf(str, " patch %d", __IBMC__ % 10);
|
g_string_append_printf(str, " patch %d", __IBMC__ % 10);
|
||||||
#endif /* __IBMC__ */
|
#endif /* __IBMC__ */
|
||||||
g_string_append_printf(str, "\n");
|
g_string_append_printf(str, "\n");
|
||||||
#elif defined(__INTEL_COMPILER)
|
#elif defined(__INTEL_COMPILER)
|
||||||
g_string_append_printf(str, "\n\nBuilt using Intel C %d.%d",
|
g_string_append_printf(str, "\n\nBuilt using Intel C %d.%d",
|
||||||
__INTEL_COMPILER / 100, (__INTEL_COMPILER / 10) % 10);
|
__INTEL_COMPILER / 100, (__INTEL_COMPILER / 10) % 10);
|
||||||
if ((__INTEL_COMPILER % 10) != 0)
|
if ((__INTEL_COMPILER % 10) != 0)
|
||||||
g_string_append_printf(str, " patch %d", __INTEL_COMPILER % 10);
|
g_string_append_printf(str, " patch %d", __INTEL_COMPILER % 10);
|
||||||
#ifdef __INTEL_COMPILER_BUILD_DATE
|
#ifdef __INTEL_COMPILER_BUILD_DATE
|
||||||
g_string_sprinta(str, ", compiler built %04d-%02d-%02d",
|
g_string_sprinta(str, ", compiler built %04d-%02d-%02d",
|
||||||
__INTEL_COMPILER_BUILD_DATE / 10000,
|
__INTEL_COMPILER_BUILD_DATE / 10000,
|
||||||
(__INTEL_COMPILER_BUILD_DATE / 100) % 100,
|
(__INTEL_COMPILER_BUILD_DATE / 100) % 100,
|
||||||
__INTEL_COMPILER_BUILD_DATE % 100);
|
__INTEL_COMPILER_BUILD_DATE % 100);
|
||||||
#endif /* __INTEL_COMPILER_BUILD_DATE */
|
#endif /* __INTEL_COMPILER_BUILD_DATE */
|
||||||
g_string_append_printf(str, "\n");
|
g_string_append_printf(str, "\n");
|
||||||
#elif defined(_MSC_FULL_VER)
|
|
||||||
# if _MSC_FULL_VER > 99999999
|
|
||||||
/* Quote from the web:
|
|
||||||
* Bakersfield: DevDiv's upper management determines the scheduling of new major versions.
|
|
||||||
* They also decided to increment the product version from 12 (for VS 2013) to 14 (for VS 2015).
|
|
||||||
* However, the C++ compiler's version incremented normally, from 18 to 19.
|
|
||||||
* (It's larger because the C++ compiler predates the "Visual" in Visual C++.)
|
|
||||||
* XXX? Should we just output the compiler version?
|
|
||||||
*/
|
|
||||||
int compiler_major_version = (_MSC_FULL_VER / 10000000), visual_studio_ver;
|
|
||||||
|
|
||||||
if (compiler_major_version < 19) {
|
|
||||||
visual_studio_ver = compiler_major_version - 6;
|
|
||||||
}else{
|
|
||||||
visual_studio_ver = compiler_major_version - 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_string_append_printf(str, "\n\nBuilt using Microsoft Visual C++ %d.%d",
|
|
||||||
visual_studio_ver,
|
|
||||||
(_MSC_FULL_VER / 100000) % 100);
|
|
||||||
# if (_MSC_FULL_VER % 100000) != 0
|
|
||||||
g_string_append_printf(str, " build %d",
|
|
||||||
_MSC_FULL_VER % 100000);
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
g_string_append_printf(str, "\n\nBuilt using Microsoft Visual C++ %d.%d",
|
|
||||||
(_MSC_FULL_VER / 1000000) - 6,
|
|
||||||
(_MSC_FULL_VER / 10000) % 100);
|
|
||||||
# if (_MSC_FULL_VER % 10000) != 0
|
|
||||||
g_string_append_printf(str, " build %d",
|
|
||||||
_MSC_FULL_VER % 10000);
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
g_string_append_printf(str, "\n");
|
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
/* _MSC_FULL_VER not defined, but _MSC_VER defined */
|
|
||||||
#if defined(__clang__)
|
|
||||||
/* More head asplosion; see above. */
|
|
||||||
g_string_append_printf(str, "\n\nBuilt using Microsoft Visual C++ %d.%d.%d clang/C2 %s.\n",
|
|
||||||
(_MSC_VER / 100) - 6, _MSC_VER % 100, __VERSION__);
|
|
||||||
#else
|
|
||||||
g_string_append_printf(str, "\n\nBuilt using clang %s.\n", __VERSION__);
|
|
||||||
#endif /* defined(__MSC_VER) */
|
|
||||||
g_string_append_printf(str, "\n\nBuilt using Microsoft Visual C++ %d.%d\n",
|
|
||||||
(_MSC_VER / 100) - 6, _MSC_VER % 100);
|
|
||||||
#elif defined(__SUNPRO_C)
|
#elif defined(__SUNPRO_C)
|
||||||
g_string_append_printf(str, "\n\nBuilt using Sun C %d.%d",
|
g_string_append_printf(str, "\n\nBuilt using Sun C %d.%d",
|
||||||
(__SUNPRO_C >> 8) & 0xF, (__SUNPRO_C >> 4) & 0xF);
|
(__SUNPRO_C >> 8) & 0xF, (__SUNPRO_C >> 4) & 0xF);
|
||||||
|
|
Loading…
Reference in New Issue