On Thu, Apr 16 2020, Emily Shaffer wrote: > To help pinpoint the source of a regression, it is useful to know some > info about the compiler which the user's Git client was built with. By > adding a generic get_compiler_info() in 'compat/' we can choose which > relevant information to share per compiler; to get started, let's > demonstrate the version of glibc if the user built with 'gcc'. > > Signed-off-by: Emily Shaffer <emilyshaffer@xxxxxxxxxx> > Helped-by: Đoàn Trần Công Danh <congdanhqx@xxxxxxxxx> > Helped-by: Johannes Schindelin <Johannes.Schindelin@xxxxxx> > --- > Documentation/git-bugreport.txt | 1 + > bugreport.c | 6 +++++ > compat/compiler.h | 41 +++++++++++++++++++++++++++++++++ > 3 files changed, 48 insertions(+) > create mode 100644 compat/compiler.h > > diff --git a/Documentation/git-bugreport.txt b/Documentation/git-bugreport.txt > index 17b0d14e8d..643d1b2884 100644 > --- a/Documentation/git-bugreport.txt > +++ b/Documentation/git-bugreport.txt > @@ -27,6 +27,7 @@ The following information is captured automatically: > > - 'git version --build-options' > - uname sysname, release, version, and machine strings > + - Compiler-specific info string > > This tool is invoked via the typical Git setup process, which means that in some > cases, it might not be able to launch - for example, if a relevant config file > diff --git a/bugreport.c b/bugreport.c > index 1a3172bcec..089b939a87 100644 > --- a/bugreport.c > +++ b/bugreport.c > @@ -4,6 +4,7 @@ > #include "strbuf.h" > #include "time.h" > #include "help.h" > +#include "compat/compiler.h" > > static void get_system_info(struct strbuf *sys_info) > { > @@ -25,6 +26,11 @@ static void get_system_info(struct strbuf *sys_info) > uname_info.release, > uname_info.version, > uname_info.machine); > + > + strbuf_addstr(sys_info, _("compiler info: ")); > + get_compiler_info(sys_info); > + strbuf_addstr(sys_info, _("libc info: ")); These are marked with _() but not the "clang" etc. below. I'd think that for a git-bugreport tool we'd be better off without any i18n. > + get_libc_info(sys_info); > } > > static const char * const bugreport_usage[] = { > diff --git a/compat/compiler.h b/compat/compiler.h > new file mode 100644 > index 0000000000..10dbb65937 > --- /dev/null > +++ b/compat/compiler.h > @@ -0,0 +1,41 @@ > +#ifndef COMPILER_H > +#define COMPILER_H > + > +#include "git-compat-util.h" > +#include "strbuf.h" > + > +#ifdef __GLIBC__ > +#include <gnu/libc-version.h> > +#endif > + > +static inline void get_compiler_info(struct strbuf *info) > +{ > + int len = info->len; > +#ifdef __clang__ > + strbuf_addf(info, "clang: %s\n", __clang_version__); > +#elif defined(__GNUC__) > + strbuf_addf(info, "gnuc: %d.%d\n", __GNUC__, __GNUC_MINOR__); > +#endif > + > +#ifdef _MSC_VER > + strbuf_addf(info, "MSVC version: %02d.%02d.%05d\n", > + _MSC_VER / 100, _MSC_VER % 100, _MSC_FULL_VER % 100000); > +#endif Why the ifdef/elif/ifdef instead of ifdef/elif/elif? Isn't _MSC_VER mutually exclusive with __clang__ and __GNUC__?