################################################################
# Qwt Widget Library
# Copyright (C) 1997   Josef Wilgen
# Copyright (C) 2002   Uwe Rathmann
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the Qwt License, Version 1.0
################################################################

######################################################################
# qmake internal options
######################################################################

CONFIG           += qt
CONFIG           += warn_on
CONFIG           += no_keywords
CONFIG           += silent
CONFIG           -= depend_includepath

# CONFIG += sanitize
# CONFIG += pedantic

# older Qt headers result in tons of warnings with modern compilers and flags
unix:lessThan(QT_MAJOR_VERSION, 5) CONFIG += qtsystemincludes

# CONFIG += c++11

c++11 {
    CONFIG           += strict_c++
}

sanitize {

    CONFIG += sanitizer
    CONFIG += sanitize_address
    #CONFIG *= sanitize_memory
    CONFIG *= sanitize_undefined
}

# Include the generated moc files in the corresponding cpp file
# what increases the compile time significantly

# DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000

######################################################################
# release/debug mode
######################################################################

win32 {
    # On Windows you can't mix release and debug libraries.
    # The designer is built in release mode. If you like to use it
    # you need a release version. For your own application development you
    # might need a debug version.
    # Enable debug_and_release + build_all if you want to build both.

    CONFIG           += debug_and_release
    CONFIG           += build_all
}
else {

    CONFIG           += release

    VER_MAJ           = $${QWT_VER_MAJ}
    VER_MIN           = $${QWT_VER_MIN}
    VER_PAT           = $${QWT_VER_PAT}
    VERSION           = $${QWT_VERSION}
}

linux {

    pedantic {

        DEFINES += QT_STRICT_ITERATORS
        # DEFINES += __STRICT_ANSI__

        # Qt headers do not stand pedantic checks, so it's better
        # to exclude them by declaring them as system includes

        QMAKE_CXXFLAGS += \
            -isystem $$[QT_INSTALL_HEADERS] \
            -isystem $$[QT_INSTALL_HEADERS]/QtCore \
            -isystem $$[QT_INSTALL_HEADERS]/QtGui \
            -isystem $$[QT_INSTALL_HEADERS]/QtWidgets
    }

    linux-g++ | linux-g++-64 {

        # CONFIG           += separate_debug_info

        sanitize_undefined {
        
            GCC_VERSION = $$system("$$QMAKE_CXX -dumpversion")
            equals(GCC_VERSION,4) || contains(GCC_VERSION, 4.* ) {

                CONFIG -= sanitize_undefined
            }
        }

        c++11 {
            QMAKE_CXXFLAGS *= -Wsuggest-override
        }

        pedantic {

            CONFIG -= warn_on

            QMAKE_CXXFLAGS *= -Wall
            QMAKE_CXXFLAGS *= -Wextra
            QMAKE_CXXFLAGS *= -Wpedantic

            QMAKE_CXXFLAGS   *= -Wcast-qual
            QMAKE_CXXFLAGS   *= -Wcast-align
            QMAKE_CXXFLAGS   *= -Wlogical-op
            QMAKE_CXXFLAGS   *= -Wredundant-decls
            QMAKE_CXXFLAGS   *= -Wformat
            QMAKE_CXXFLAGS   *= -Wshadow 
            QMAKE_CXXFLAGS   *= -Woverloaded-virtual

            # checks qwt code does not pass, but should be able to
            # QMAKE_CXXFLAGS   *= -Wconversion 

            # checks qwt code does not pass

            # QMAKE_CXXFLAGS   *= -Wuseless-cast
            # QMAKE_CXXFLAGS   *= -Wmissing-declarations
            # QMAKE_CXXFLAGS   *= -Winline
            # QMAKE_CXXFLAGS   *= -Wdouble-promotion
            # QMAKE_CXXFLAGS   *= -Wfloat-equal 
            # QMAKE_CXXFLAGS   *= -Wpadded
            # QMAKE_CXXFLAGS   *= -Waggregate-return
            # QMAKE_CXXFLAGS   *= -Wzero-as-null-pointer-constant
        }

        # --- optional optimzations

        # qwt code doesn't check errno after calling math functions
        # so it is perfectly safe to disable it in favor of better performance
        QMAKE_CXXFLAGS   *= -fno-math-errno

        # qwt code doesn't rely ( at least intends not to do )
        # on an exact implementation of IEEE or ISO rules/specifications
        QMAKE_CXXFLAGS   *= -funsafe-math-optimizations

        # also enables -fno-math-errno and -funsafe-math-optimizations
        # QMAKE_CXXFLAGS   *= -ffast-math

        # QMAKE_CXXFLAGS_DEBUG  *= -Og # since gcc 4.8

        # QMAKE_CXXFLAGS_RELEASE  *= -O3
        # QMAKE_CXXFLAGS_RELEASE  *= -Ofast
        # QMAKE_CXXFLAGS_RELEASE  *= -Os

        # when using the gold linker ( Qt < 4.8 ) - might be
        # necessary on non linux systems too
        #QMAKE_LFLAGS += -lrt

        sanitize {

            # QMAKE_CXXFLAGS *= -fsanitize-address-use-after-scope
            # QMAKE_LFLAGS *= -fsanitize-address-use-after-scope
        }
    }

    linux-clang {

        # workaround for a clang 3.8 bug
        # DEFINES += __STRICT_ANSI__

        # QMAKE_CXXFLAGS_RELEASE  *= -O3
    }

    # QMAKE_CXXFLAGS   *= -Werror
}

qtsystemincludes {
    
    # mark Qt directories as a system directories - usually to get rid
    # of compiler warnings in Qt headers of old Qt versions
    # when being built with modern compilers

    QMAKE_CXXFLAGS += \
        -isystem $$[QT_INSTALL_HEADERS]/QtCore \
        -isystem $$[QT_INSTALL_HEADERS]/QtGui
}

######################################################################
# paths for building qwt
######################################################################

MOC_DIR      = moc
RCC_DIR      = resources

!debug_and_release {

    # in case of debug_and_release object files
    # are built in the release and debug subdirectories
    OBJECTS_DIR       = obj
}

######################################################################
# including local settings ( optionally )
######################################################################

LOCAL_PRI=$$(QWT_LOCAL_PRI)

if ( !isEmpty( LOCAL_PRI ) ) {

    if ( exists( $${LOCAL_PRI} ) ) {

        # When not working with the Qt/Creator it is often more convenient
        # to include the specific options of your local build, than passing
        # them all on the command line

        include( $${LOCAL_PRI} )
    }
}
