# This file is loaded by qmake right after loading the qmakespec.
# Afterwards, the project's .qmake.conf and .qmake.cache are loaded
# (if present).
# Note that up to this point, nothing specific to a particular SUBDIRS
# project or build pass can be done.

isEmpty(MAKEFILE_GENERATOR):error("Qmake spec does not set MAKEFILE_GENERATOR.")
isEmpty(QMAKE_PLATFORM) {
    isEmpty(TARGET_PLATFORM) {
        equals(MAKEFILE_GENERATOR, UNIX) {
            equals(QMAKE_HOST.os, Darwin): \
                TARGET_PLATFORM = macx # backwards compatibility; cannot change
            else: \
                TARGET_PLATFORM = unix
        } else:if(equals(MAKEFILE_GENERATOR, MSVC.NET) \
                 |equals(MAKEFILE_GENERATOR, MSBUILD) \
                 |equals(MAKEFILE_GENERATOR, MINGW)) {
            TARGET_PLATFORM = win32
        } else:if(equals(MAKEFILE_GENERATOR, PROJECTBUILDER) \
                 |equals(MAKEFILE_GENERATOR, XCODE)) {
            TARGET_PLATFORM = macx
        } else {
            error("Qmake spec sets an invalid MAKEFILE_GENERATOR.")
        }
    }
    equals(TARGET_PLATFORM, unix): \
        QMAKE_PLATFORM = unix
    else:equals(TARGET_PLATFORM, macx): \
        QMAKE_PLATFORM = macos osx macx mac darwin unix
    else:equals(TARGET_PLATFORM, win32): \
        QMAKE_PLATFORM = win32
    else: \
        error("Qmake spec sets an invalid TARGET_PLATFORM.")
}

contains(QMAKE_PLATFORM, macx) {
    !contains(QMAKE_PLATFORM, osx) {
        warning("qmake spec specified platform macx, but not osx.");
        QMAKE_PLATFORM = osx $$QMAKE_PLATFORM
    }

    !contains(QMAKE_PLATFORM, macos) {
        warning("qmake spec specifies platform macx, but not macos.")
        QMAKE_PLATFORM = macos $$QMAKE_PLATFORM
    }
}

CONFIG += $$QMAKE_PLATFORM

isEmpty(QMAKE_COMPILER) {
    *-g++*: \
        QMAKE_COMPILER = gcc
    else:*-llvm*: \
        QMAKE_COMPILER = gcc llvm
    else:*-clang*: \
        QMAKE_COMPILER = gcc clang llvm
    else:*-msvc*: \
        QMAKE_COMPILER = msvc
    else: \
        error("qmake spec does not announce the compiler family, and it cannot be guessed.")
    warning("qmake spec does not announce the compiler family. Guessed $${QMAKE_COMPILER}.")
}
CONFIG += $$QMAKE_COMPILER

equals(MAKEFILE_GENERATOR, MSBUILD) \
|equals(MAKEFILE_GENERATOR, MSVC.NET) \
|isEmpty(QMAKE_SH) {
    QMAKE_ZIP               = zip -r -9

    QMAKE_CD                = cd /d
    QMAKE_COPY              = copy /y
    QMAKE_COPY_FILE         = $$QMAKE_COPY
    QMAKE_COPY_DIR          = xcopy /s /q /y /i
    # xcopy copies the contained files if source is a directory. Deal with it.
    CONFIG                 += copy_dir_files
    QMAKE_MOVE              = move
    QMAKE_DEL_FILE          = del
    QMAKE_DEL_DIR           = rmdir
    QMAKE_DEL_TREE          = rmdir /s /q
    QMAKE_CHK_EXISTS        = if not exist %1
    QMAKE_CHK_DIR_EXISTS    = if not exist   # legacy
    QMAKE_MKDIR             = mkdir          # legacy
    QMAKE_MKDIR_CMD         = if not exist %1 mkdir %1 & if not exist %1 exit 1
    QMAKE_STREAM_EDITOR     = $(QMAKE) -install sed
    QMAKE_SHELL_NULL_DEVICE = NUL
    QMAKE_INSTALL_FILE      = copy /y
    QMAKE_INSTALL_PROGRAM   = copy /y
} else {
    QMAKE_TAR               = tar -cf
    QMAKE_GZIP              = gzip -9f

    QMAKE_CD                = cd
    QMAKE_COPY              = cp -f
    QMAKE_COPY_FILE         = $$QMAKE_COPY
    QMAKE_COPY_DIR          = $$QMAKE_COPY -R
    QMAKE_MOVE              = mv -f
    QMAKE_DEL_FILE          = rm -f
    QMAKE_DEL_DIR           = rmdir
    QMAKE_DEL_TREE          = rm -rf
    QMAKE_CHK_EXISTS        = test -e %1 ||
    QMAKE_CHK_DIR_EXISTS    = test -d    # legacy
    QMAKE_MKDIR             = mkdir -p   # legacy
    QMAKE_MKDIR_CMD         = test -d %1 || mkdir -p %1
    QMAKE_STREAM_EDITOR     = sed
    QMAKE_SHELL_NULL_DEVICE = /dev/null

    equals(QMAKE_HOST.os, Windows) {
        MINGW_IN_SHELL = 1   # legacy
        # Override built-ins.
        QMAKE_DIR_SEP = /
        QMAKE_DIRLIST_SEP = :
        # Because install's ability to set permissions is not relevant on Windows,
        # and git's msys does not provide it to start with.
        QMAKE_INSTALL_FILE      = cp -f
        QMAKE_INSTALL_PROGRAM   = cp -f
    } else {
        QMAKE_INSTALL_FILE      = install -m 644 -p
        QMAKE_INSTALL_PROGRAM   = install -m 755 -p
    }
}
QMAKE_INSTALL_DIR = $$QMAKE_COPY_DIR
equals(QMAKE_HOST.os, Windows) {
    QMAKE_SYMBOLIC_LINK      = $(QMAKE) -install ln -f -s
    QMAKE_LN_SHLIB           = $(QMAKE) -install ln -s
    QMAKE_SYSTEM_NULL_DEVICE = NUL
} else {
    QMAKE_SYMBOLIC_LINK      = ln -f -s
    QMAKE_LN_SHLIB           = ln -s
    QMAKE_SYSTEM_NULL_DEVICE = /dev/null
}
