Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-56290

MSVC version detection in 5.8 silently creates broken builds when CL env var is set



    • Bug
    • Resolution: Duplicate
    • P2: Important
    • None
    • 5.8.0 Alpha
    • Build System, QPA: Windows
    • None


      Since Qt 5.8 (both 5.8 and dev) the MSVC version detection fails when the environment variable CL is set. It is not unlikely that users have something like

      set CL=/MP /FC /nologo

      in their environment. The real bad thing is that this goes undetected, resulting a half-baked build: for instance configuring with -opengl dynamic results in an ANGLE-only build etc., presumably because the compiler version is now something bogus or unknown.

      Open any MSVC 2015 command prompt.
      set CL=/MP /FC /nologo
      configure -debug -developer-build -opengl dynamic -nomake examples -nomake tests -opensource -confirm-license

      Note the output:

      Running configuration tests...
      Checking for valid makespec... yes
      Checking for ALSA... no
      Checking for target architecture... x86_64
      Checking for SSE2 instructions... yes
      Checking for SSE3 instructions... yes
      Checking for SSSE3 instructions... yes
      Checking for SSE4.1 instructions... yes
      Checking for SSE4.2 instructions... yes
      Checking for AVX instructions... yes
      Checking for bugfree AVX support in compiler... yes
      Checking for AVX2 instructions... yes
      Checking for AVX512 F instructions... no
      Checking for C++14 support... no
      Checking for Compiler... MSVC                          C/C++ COMPILER OPTIONS
                                  -OPTIMIZATION- /O1 minimize space
         /O2 maximize speed /Ob<n> inline expansion (default n=0)   /Od disable optimizations (default) /Og enable global optimization          /Oi[-] enable intrinsic functions /Os favor code space                    /Ot favor code speed /Ox maximum optimizations                /favor:<blend|AMD64|INTEL64|ATOM> select processor to optimize for, one of:     blend - a combination of optimizations for several different x64 processors     AMD64 - 64-bit AMD processors
                           INTEL64 - Intel(R)64 architecture processors
              ATOM - Intel(R) Atom(TM) processors
                          -CODE GENERATION- /Gw[-] separate global variables for linker /GF enable read-only string pooling     /Gm[-] enable minimal rebuild /Gy[-] separate functions for linker    /GS[-] enable security checks /GR[-] enable C++
      RTTI                  /GX[-] enable C++ EH (same as /EHsc) /guard:cf[-] enable CFG (control flow guard) /EHs enable C++ EH (no SEH exceptions)  /EHa enable C++
      EH (w/ SEH exceptions) /EHc extern "C" defaults to nothrow      /EHr always generate noexcept runtime termination checks /fp:<except[-]|fast|precise|strict> choose floating-point model:     except[-] - consider floating-point exceptions when generating code     fast - "fast" floating-point model; results are less predictable     precise - "precise" floating-point model; results are predictable
       strict - "strict" floating-point model (implies /fp:except) /Qfast_transcendentals generate inline FP intrinsics even with /fp:except /Qpar[-] enable parallel
      code generation /Qpar-report:1 auto-parallelizer diagnostic; indicate parallelized loops /Qpar-report:2 auto-parallelizer diagnostic; indicate loops not parallelized /Qvec-report:1 auto-vectorizer diagnostic; indicate vectorized loops /Qvec-report:2 auto-vectorizer diagnostic; indicate loops not vectorized /GL[-] enable link-time code generation  /volatile:<iso|ms> choose volatile model:     iso - Acquire/release semantics not guaranteed on volatile accesses     ms  - Acquire/release semantics guaranteed on volatile accesses /GA optimize for Windows Application    /Ge force stack checking for all funcs /Gs[num] control stack checking calls   /Gh enable _penter function call /GH enable _pexit function call
         /GT generate fiber-safe TLS accesses /RTC1 Enable fast checks (/RTCsu)
      /RTCc Convert to smaller type checks /RTCs Stack Frame runtime checking      /RTCu Uninitialized local usage checks /clr[:option] compile for common language runtime, where option is:     pure - produce IL-only output file (no native executable code)     safe - produce IL-only verifiable output file     initialAppDomain - enable initial AppDomain behavior of Visual C++ 2002     noAssembly - do not produce an assembly     nostdlib - ignore the default \clr directory /homeparams Force parameters passed in registers to be written to the stack /GZ Enable stack checks (/RTCs)          /arch:AVX enable use of instructions available with AVX-enabled CPUs /arch:AVX2 enable use of instructions available with AVX2-enabled CPUs /Gv __vectorcall calling convention                                    -OUTPUT FILES- /Fa[file] name assembly listing file    /FA[scu] configure assembly listing /Fd[file] name .PDB file                /Fe<file> name executable file
      /Fm[file] name map file                 /Fo<file> name object file /Fp<file> name precompiled header file  /Fr[file] name source browser file /FR[file] name extended .SBR file       /Fi[file] name preprocessed file /Fd: <file> name .PDB file              /Fe: <file> name executable file /Fm: <file> name map file
              /Fo: <file> name object file /Fp: <file> name .PCH file              /FR: <file> name extended .SBR file /Fi: <file> name preprocessed file       /doc[file] process XML documentation comments and optionally name the .xdc file
                              -PREPROCESSOR- /AI<dir> add to assembly search path    /FU<file> forced using assembly/module  /C don't strip comments                 /D<name>{=|#}<text> define macro /E preprocess to stdout                 /EP preprocess to stdout, no #line /P preprocess to file                   /Fx merge injected code to file /FI<file> name forced include file      /U<name> remove predefined macro /u remove all predefined macros         /I<dir> add to include search path /X ignore "standard places"
      -LANGUAGE- /Zi enable debugging information        /Z7 enable old-style debug info /Zp[n] pack structs on n-byte boundary  /Za disable extensions /Ze enable extensions (default)         /Zl omit default library name in .OBJ /Zs syntax check only                   /vd{0|1|2} disable/enable vtordisp /vm<x> type of pointers to members       /Zc:arg1[,arg2] C++ language conformance, where arguments can be:   forScope[-]           enforce Standard C++ for scoping rules   wchar_t[-]            wchar_t is the native type, not a typedef   auto[-]               enforce the new Standard C++ meaning for auto   trigraphs[-]          enable trigraphs (off by default)   rvalueCast[-]         enforce Standard C++ explicit type conversion rules   strictStrings[-]      disable string-literal to [char|wchar_t]*                         conversion (off by default)   implicitNoexcept[-]
       enable implicit noexcept on required functions   threadSafeInit[-]     enable thread-safe local static initialization   inline[-]             remove unreferenced function or data if it is                         COMDAT or has internal linkage only (off by default)   sizedDealloc[-]       enable C++14 global sized deallocation                         functions (on by default)   throwingNew[-]
         assume operator new throws on failure (off by default)   referenceBinding[-]
        a temporary will not bind to an non-const                         lvalue reference (off by default) /ZH:SHA_256             use SHA256 for file checksum in debug info (experimental) /Zo[-] generate richer debugging information for optimized code (on by default) /ZW enable WinRT language extensions     /constexpr:depth<N>     use <N> as the recursion depth limit                         for constexpr (default: 512) /constexpr:backtrace<N> show <N> constexpr evaluations
                        in diagnostics (default: 10) /constexpr:steps<N>     terminate constexpr evaluation after                         <N> steps (default: 100000)
      /ZI enable Edit and Continue debug info  /openmp enable OpenMP 2.0 language extensions                               -MISCELLANEOUS- @<file> options response file           /?, /help print this help message /bigobj generate extended object
      format /c compile only, no link /errorReport:option Report internal compiler errors to Microsoft     none - do not send report                     prompt - prompt to immediately send report     queue - at next admin logon, prompt to send report (default)     send - send report automatically          /FC use full pathnames in diagnostics   /H<num> max external name length /J default char type is unsigned         /MP[n] use up to 'n' processes for compilation /nologo suppress copyright message       /sdl enable additional security features and warnings /showIncludes show include file names   /Tc<source file> compile file as .c /Tp<source file> compile file as .cpp   /TC compile all files as .c /TP compile all files as .cpp           /V<string> set version string /w disable all warnings
                 /wd<n> disable warning n /we<n> treat warning n as an error      /wo<n> issue warning n once /w<l><n> set warning level 1-4 for n    /W<n> set warning level (default n=1) /Wall enable all warnings               /WL enable one line diagnostics /WX treat warnings as errors            /Yc[file] create .PCH file /Yd put debug info in every .OBJ        /Yl[sym] inject .PCH ref for debug lib
      /Yu[file] use .PCH file                 /Y- disable all PCH options /Zm<n> max memory alloc (% of default)  /FS force to use MSPDBSRV.EXE /await enable resumable functions extension /Wv:xx[.yy[.zzzzz]] disable warnings introduced after version xx.yy.zzzzz /source-charset:<iana-name>|.nnnn set source character set /execution-charset:<iana-name>|.nnnn set execution character set /utf-8 set source and execution character set to UTF-8 /validate-charset[-] validate UTF-8 files for only legal characters                                 -LINKING- /LD Create .DLL                         /LDd Create .DLL debug library /LN Create a .netmodule
                      /F<num> set stack size /link [linker options and libraries]    /MD link with MSVCRT.LIB /MT link with LIBCMT.LIB                /MDd link with MSVCRTD.LIB debug lib /MTd link with LIBCMTD.LIB debug lib
                  -CODE ANALYSIS- /analyze[-] Enable native analysis      /analyze:quiet[-] No warning to console /analyze:log<name> Warnings to file     /analyze:autolog Log to *.pftlog /analyze:autolog:ext<ext> Log to *.<ext>/analyze:autolog- No log file /analyze:WX- Warnings not fatal         /analyze:stacksize<num> Max stack frame /analyze:max_paths<num> Max paths       /analyze:only Analyze, no code gen
      Checking for compiler defaulting to C++98... yes
      Checking for D-Bus >= 1.2... no

      Then it silently goes on, looking fine. But it really isn't.


        Issue Links

          No reviews matched the request. Check your Options in the drop-down menu of this sections header.



              buddenha Oswald Buddenhagen
              lagocs Laszlo Agocs
              0 Vote for this issue
              3 Start watching this issue



                Gerrit Reviews

                  There are no open Gerrit changes