#
# qmake configuration for Microsoft Visual Studio C/C++ Compiler
# This file is used by win32-msvc and all winrt-XXX-msvcXXX specs
#

#
# Version-specific changes
#

isEmpty(QMAKE_MSC_VER): error("msvc-version.conf loaded but QMAKE_MSC_VER isn't set")

MSVC_VER = 8.0
COMPAT_MKSPEC = win32-msvc2005

greaterThan(QMAKE_MSC_VER, 1499) {
    # Visual Studio 2008 (9.0) / Visual C++ 15.0 and up
    MSVC_VER            = 9.0
    COMPAT_MKSPEC       = win32-msvc2008
    QMAKE_CFLAGS_MP     = -MP
    QMAKE_CXXFLAGS_MP   = $$QMAKE_CFLAGS_MP
}

greaterThan(QMAKE_MSC_VER, 1599) {
    # Visual Studio 2010 (10.0) / Visual C++ 16.0 and up
    MSVC_VER            = 10.0
    COMPAT_MKSPEC       = win32-msvc2010
    MAKEFILE_GENERATOR  = MSBUILD

    QMAKE_CFLAGS_AVX    = -arch:AVX
    QMAKE_CFLAGS_AVX2   = -arch:AVX

    VCPROJ_EXTENSION    = .vcxproj
}

greaterThan(QMAKE_MSC_VER, 1699) {
    # Visual Studio 2012 (11.0) / Visual C++ 17.0 and up
    MSVC_VER            = 11.0
    COMPAT_MKSPEC       = win32-msvc2012
    QMAKE_CXXFLAGS_EXCEPTIONS_OFF = /wd4530 /wd4577
    QT_CONFIG          += c++11
    CONFIG             += c++11
}

greaterThan(QMAKE_MSC_VER, 1799) {
    # Visual Studio 2013 (12.0) / Visual C++ 18.0 and up
    MSVC_VER            = 12.0
    COMPAT_MKSPEC       = win32-msvc2013
    QMAKE_CFLAGS       += -FS
    QMAKE_CXXFLAGS     += -FS -Zc:rvalueCast -Zc:inline

    QMAKE_CFLAGS_F16C   = -arch:AVX
    QMAKE_CFLAGS_RDRND  =

    equals(QMAKE_MSC_VER, 1800) {
        QMAKE_CFLAGS_RELEASE += -Zc:strictStrings
        QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -Zc:strictStrings
        QMAKE_CXXFLAGS_RELEASE += -Zc:strictStrings
        QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO += -Zc:strictStrings
    }
}

greaterThan(QMAKE_MSC_VER, 1899) {
    # Visual Studio 2015 (14.0) / Visual C++ 19.0 and up
    MSVC_VER            = 14.0
    COMPAT_MKSPEC       = win32-msvc2015
    QMAKE_CFLAGS       += -Zc:strictStrings
    QMAKE_CFLAGS_WARN_ON += -w44456 -w44457 -w44458
    QMAKE_CFLAGS_AVX2   = -arch:AVX2
    QMAKE_CXXFLAGS     += -Zc:strictStrings -Zc:throwingNew
    QMAKE_CXXFLAGS_WARN_ON += -w44456 -w44457 -w44458 -wd4577 -wd4467

    # -utf-8 compiler option for Visual Studio 2015 Update 2
    greaterThan(QMAKE_MSC_FULL_VER, 190023918): QMAKE_CFLAGS_UTF8_SOURCE = -utf-8
}

greaterThan(QMAKE_MSC_VER, 1909) {
    # Visual Studio 2017 (15.0) / Visual C++ 19.10 and up
    MSVC_VER            = 15.0
    COMPAT_MKSPEC       = win32-msvc2017
    QMAKE_CXXFLAGS     += -Zc:referenceBinding

    # Only Visual Studio 2017 version 15.3 / Visual C++ 19.11 & up have support
    # for AVX-512. We enable the switches anyway and let configure check if they
    # work.
    QMAKE_CFLAGS_AVX512F   = -arch:AVX512
    QMAKE_CFLAGS_AVX512ER  = -arch:AVX512
    QMAKE_CFLAGS_AVX512CD  = -arch:AVX512
    QMAKE_CFLAGS_AVX512PF  = -arch:AVX512
    QMAKE_CFLAGS_AVX512DQ  = -arch:AVX512
    QMAKE_CFLAGS_AVX512BW  = -arch:AVX512
    QMAKE_CFLAGS_AVX512VL  = -arch:AVX512
    QMAKE_CFLAGS_AVX512IFMA = -arch:AVX512
    QMAKE_CFLAGS_AVX512VBMI = -arch:AVX512

    # For now permissive fails as soon as UWP API comes into play. In qtbase this
    # API is used in direct2d, but also in multimedia, positioning and sensors.
    # We can try again with a later version of Visual Studio.
    # QMAKE_CXXFLAGS_STRICTCXX = -permissive-

    # MSVC partially supports the following, but '__cplusplus' definition is set
    # as for C++98 until MSVC fully conforms with C++14, see
    # https://developercommunity.visualstudio.com/content/problem/139261/msvc-incorrectly-defines-cplusplus.html
    # Support became available in MSVC 2017 15.7:
    greaterThan(QMAKE_MSC_VER, 1913) {
        QMAKE_CXXFLAGS      += -Zc:__cplusplus
        QMAKE_CXXFLAGS_CXX14 = -std:c++14
        QMAKE_CXXFLAGS_CXX1Z = -std:c++17
    }
}

greaterThan(QMAKE_MSC_VER, 1910) {
    # No compat spec past MSVC 2017
    COMPAT_MKSPEC       =
}

greaterThan(QMAKE_MSC_VER, 1919) {
    # Visual Studio 2019 (16.0) / Visual C++ 19.20 and up
    MSVC_VER            = 16.0
    QMAKE_CXXFLAGS_CXX2A = -std:c++latest

}

!isEmpty(COMPAT_MKSPEC):!$$COMPAT_MKSPEC: CONFIG += $$COMPAT_MKSPEC
