defineReplace(qtLibraryTarget) {
   unset(LIBRARY_NAME)
   LIBRARY_NAME = $$1
   mac:!static:contains(QT_CONFIG, qt_framework) {
      QMAKE_FRAMEWORK_BUNDLE_NAME = $$LIBRARY_NAME
      export(QMAKE_FRAMEWORK_BUNDLE_NAME)
   }
   contains(TEMPLATE, .*lib):CONFIG(debug, debug|release) {
      !debug_and_release|build_pass {
          mac:RET = $$member(LIBRARY_NAME, 0)_debug
   	      else:win32:RET = $$member(LIBRARY_NAME, 0)d
      }
   }
   isEmpty(RET):RET = $$LIBRARY_NAME
   return($$RET)
}

defineTest(qtAddLibrary) {
    INCLUDEPATH -= $$QMAKE_INCDIR_QT/$$1
    INCLUDEPATH = $$QMAKE_INCDIR_QT/$$1 $$INCLUDEPATH

    LIB_NAME = $$1
    unset(LINKAGE)
    mac {
       CONFIG(qt_framework, qt_framework|qt_no_framework) { #forced
          QMAKE_FRAMEWORKPATH *= $${QMAKE_LIBDIR_QT}
          FRAMEWORK_INCLUDE = $$QMAKE_LIBDIR_QT/$${LIB_NAME}.framework/Headers
          !qt_no_framework_direct_includes:exists($$FRAMEWORK_INCLUDE) {
             INCLUDEPATH -= $$FRAMEWORK_INCLUDE
             INCLUDEPATH = $$FRAMEWORK_INCLUDE $$INCLUDEPATH
           }
           LINKAGE = -framework $${LIB_NAME}$${QT_LIBINFIX}
        } else:!qt_no_framework { #detection
           for(frmwrk_dir, $$list($$QMAKE_LIBDIR_QT $$QMAKE_LIBDIR $$(DYLD_FRAMEWORK_PATH) /Library/Frameworks)) {
       	      exists($${frmwrk_dir}/$${LIB_NAME}.framework) {
                QMAKE_FRAMEWORKPATH *= $${frmwrk_dir}
    	        FRAMEWORK_INCLUDE = $$frmwrk_dir/$${LIB_NAME}.framework/Headers
    	        !qt_no_framework_direct_includes:exists($$FRAMEWORK_INCLUDE) {
    	          INCLUDEPATH -= $$FRAMEWORK_INCLUDE
    	          INCLUDEPATH = $$FRAMEWORK_INCLUDE $$INCLUDEPATH
                }
    	        LINKAGE = -framework $${LIB_NAME}
       	        break()
              }
           }
       }
    }
    symbian {
        isEqual(LIB_NAME, QtCore) {
            #workaround for dependency from f32file.h on e32svr.h which has moved location in symbian3
            INCLUDEPATH *= $$OS_LAYER_SYSTEMINCLUDE
        } else:isEqual(LIB_NAME, QtGui) {
            # Needed for #include <QtGui> because qs60mainapplication.h includes aknapp.h
            INCLUDEPATH *= $$MW_LAYER_SYSTEMINCLUDE
        } else:isEqual(LIB_NAME, QtWebKit) {
            # Needed for because relative inclusion problem in toolchain
            INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtXmlPatterns
            INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtNetwork
            isEmpty(TARGET.CAPABILITY): TARGET.CAPABILITY = NetworkServices
            isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
        } else:isEqual(LIB_NAME, QtXmlPatterns) {
            # Needed for #include <QtXmlPatterns/QtXmlPatterns> because relative inclusion problem in toolchain
            INCLUDEPATH *= $$QMAKE_INCDIR_QT/QtNetwork
        } else:isEqual(LIB_NAME, QtNetwork) {
            isEmpty(TARGET.CAPABILITY): TARGET.CAPABILITY = NetworkServices
        } else:isEqual(LIB_NAME, QtDeclarative) {
            isEmpty(TARGET.CAPABILITY): TARGET.CAPABILITY = NetworkServices
            isEmpty(TARGET.EPOCHEAPSIZE):TARGET.EPOCHEAPSIZE = 0x20000 0x2000000
        }
        export(TARGET.EPOCHEAPSIZE)
        export(TARGET.CAPABILITY)
    }
    isEmpty(LINKAGE) {
       if(!debug_and_release|build_pass):CONFIG(debug, debug|release) {
           win32:LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}d
           mac:LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}_debug
       }
       isEmpty(LINKAGE):LINKAGE = -l$${LIB_NAME}$${QT_LIBINFIX}
    }
    !isEmpty(QMAKE_LSB) {
        QMAKE_LFLAGS *= --lsb-libpath=$$$$QMAKE_LIBDIR_QT
        QMAKE_LFLAGS *= -L/opt/lsb/lib
        QMAKE_LFLAGS *= --lsb-shared-libs=$${LIB_NAME}$${QT_LIBINFIX}
    }
    LIBS += $$LINKAGE
    export(LIBS)
    export(INCLUDEPATH)
    export(QMAKE_FRAMEWORKPATH)
    export(QMAKE_LFLAGS)
    return(true)
}

# variable, default
defineTest(qtPrepareTool) {
    isEmpty($$1) {
        !isEmpty(QT_BUILD_TREE):$$1 = $$QT_BUILD_TREE/bin/$$2
        else:$$1 = $$[QT_INSTALL_BINS]/$$2
    }
    $$1 ~= s,[/\\\\],$$QMAKE_DIR_SEP,
    contains(QMAKE_HOST.os, Windows):!contains($$1, .*\\.(exe|bat)$) {
        exists($$eval($$1).bat) {
            $$1 = $$eval($$1).bat
        } else {
            $$1 = $$eval($$1).exe
        }
    }
    export($$1)
}

defineTest(packagesExist) {
    # this can't be done in global scope here because qt_functions is loaded
    # before the .pro is parsed, so if the .pro set PKG_CONFIG, we wouldn't know it
    # yet. oops.
    isEmpty(PKG_CONFIG):PKG_CONFIG = pkg-config # keep consistent with link_pkgconfig.prf! too

    for(package, ARGS) {
        !system($$PKG_CONFIG --exists $$package):return(false)
    }

    return(true)
}

