SET(EXTPREFIX_qt  "${EXTPREFIX}")
if (WIN32)
  ExternalProject_Add(
      ext_qt
      DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
      URL https://download.qt.io/official_releases/qt/5.6/5.6.1-1/single/qt-everywhere-opensource-src-5.6.1-1.zip
      URL_MD5 9d7ea0cadcec7b5a63e8e83686756978
      PATCH_COMMAND  ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/disable-wintab.diff
            COMMAND  ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/qtgui-private-headers.diff
            COMMAND  ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/0001-Don-t-request-the-MIME-image-every-time-Windows-asks.patch
            COMMAND  ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/0002-Hack-always-return-we-support-DIBV5.patch
            COMMAND  ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/0003-Hack-for-fullscreen-workaround.patch

      INSTALL_DIR ${EXTPREFIX_qt}
      CONFIGURE_COMMAND <SOURCE_DIR>/configure.bat -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtdoc -skip qtenginio -skip qtgraphicaleffects -skip qtlocation -skip qtsensors -skip qtserialport -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtxmlpatterns -no-sql-sqlite -nomake examples -nomake tools -no-compile-examples -no-dbus -no-iconv -no-angle -no-ssl -no-openssl -no-wmf-backend -no-qml-debug -no-libproxy -no-system-proxies -no-nis -no-icu -no-mtdev -opensource -confirm-license -release -opengl desktop -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -prefix ${EXTPREFIX_qt} -platform win32-g++

      # use this line for building Qt with debugging info enabled
      #CONFIGURE_COMMAND <SOURCE_DIR>/configure.bat -release -force-debug-info -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtdoc -skip qtenginio -skip qtgraphicaleffects -skip qtlocation -skip qtsensors -skip qtserialport -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtxmlpatterns -no-sql-sqlite -nomake examples -nomake tools -no-compile-examples -no-dbus -no-iconv -no-angle -no-ssl -no-openssl -no-wmf-backend -no-qml-debug -no-libproxy -no-system-proxies -no-nis -no-icu -no-mtdev -opensource -confirm-license -release -opengl desktop -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -prefix ${EXTPREFIX_qt} -platform win32-g++

      BUILD_COMMAND mingw32-make
      INSTALL_COMMAND mingw32-make install
      UPDATE_COMMAND ""
      BUILD_IN_SOURCE 1
      ALWAYS 0
      DEPENDS ext_patch
  )
elseif (NOT APPLE)
  ExternalProject_Add(
      ext_qt
      DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}
      URL https://download.qt.io/official_releases/qt/5.6/5.6.1-1/single/qt-everywhere-opensource-src-5.6.1-1.tar.gz
      URL_MD5 8fdec6d657bc370bd3183d8fe8e9c47a
      PATCH_COMMAND ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/qt-no-motion-compression.diff

      INSTALL_DIR ${EXTPREFIX_qt}
      CONFIGURE_COMMAND <SOURCE_DIR>/configure -prefix ${EXTPREFIX_qt} -opensource -confirm-license -nomake examples -no-sql-sqlite -no-openssl -no-qml-debug -no-mtdev  -no-journald  -no-syslog -no-nis  -no-cups -no-tslib -no-directfb -no-linuxfb -no-libproxy -no-pch -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg  -qt-harfbuzz -qt-freetype -qt-xcb -qt-xkbcommon-x11 -optimized-qmake -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtenginio -skip qtgraphicaleffects -skip qtlocation -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtandroidextras -skip qtserialport

      BUILD_COMMAND $(MAKE)
      INSTALL_COMMAND $(MAKE) install
      UPDATE_COMMAND ""
      BUILD_IN_SOURCE 1
      ALWAYS 0
  )
else( APPLE )

      # XCODE_VERSION is set by CMake when using the Xcode generator, otherwise we need
      # to detect it manually here.
      if (NOT XCODE_VERSION)
        execute_process(
          COMMAND xcodebuild -version
          OUTPUT_VARIABLE xcodebuild_version
          OUTPUT_STRIP_TRAILING_WHITESPACE
          ERROR_FILE /dev/null
        )
        string(REGEX MATCH "Xcode ([0-9]([.][0-9])+)" version_match ${xcodebuild_version})
        if (version_match)
          message(STATUS "${EXTPREFIX_qt}:Identified Xcode Version: ${CMAKE_MATCH_1}")
          set(XCODE_VERSION ${CMAKE_MATCH_1})
        else()
          # If detecting Xcode version failed, set a crazy high version so we default
          # to the newest.
          set(XCODE_VERSION 99)
          message(WARNING "${EXTPREFIX_qt}:Failed to detect the version of an installed copy of Xcode, falling back to highest supported version. Set XCODE_VERSION to override.")
        endif(version_match)
      endif(NOT XCODE_VERSION)

      # -------------------------------------------------------------------------------
      # Verify the Xcode installation on Mac OS like Qt5.7 does/will
      # If not stop now, the system isn't configured correctly for Qt.
      # No reason to even proceed.
      # -------------------------------------------------------------------------------
      set(XCSELECT_OUTPUT)
      find_program(XCSELECT_PROGRAM "xcode-select")
      if(XCSELECT_PROGRAM)
        message(STATUS "${EXTPREFIX_qt}:Found XCSELECT_PROGRAM as ${XCSELECT_PROGRAM}")
        set(XCSELECT_COMMAND ${XCSELECT_PROGRAM}
          "--print-path")
        execute_process(
          COMMAND ${XCSELECT_COMMAND}
          RESULT_VARIABLE XCSELECT_COMMAND_RESULT
          OUTPUT_VARIABLE XCSELECT_COMMAND_OUTPUT
          ERROR_FILE /dev/null
        )
        if(NOT XCSELECT_COMMAND_RESULT)
          # returned 0, we're ok.
          string(REGEX REPLACE
            "[ \t]*[\r\n]+[ \t]*" ";"
            XCSELECT_COMMAND_OUTPUT ${XCSELECT_COMMAND_OUTPUT})
        else()
          string(REPLACE ";" " " XCSELECT_COMMAND_STR "${XCSELECT_COMMAND}")
          # message(STATUS "${XCSELECT_COMMAND_STR}")
          message(FATAL_ERROR "${EXTPREFIX_qt}:${XCSELECT_PROGRAM} test failed with status ${XCSELECT_COMMAND_RESULT}")
        endif()
      else()
        message(FATAL_ERROR "${EXTPREFIX_qt}:${XCSELECT_PROGRAM} not found. No Xcode is selected. Use xcode-select -switch to choose an Xcode version")
      endif()

      # Belts and suspenders
      # Beyond all the Xcode and Qt version checking, the proof of the pudding
      # lies in the success/failure of this command: xcrun --find xcrun.
      # On failure a patch is necessary, otherwise we're ok
      # So hard check xcrun now...
      set(XCRUN_OUTPUT)
      find_program(XCRUN_PROGRAM "xcrun")
      if(XCRUN_PROGRAM)
        message(STATUS "${EXTPREFIX_qt}:Found XCRUN_PROGRAM as ${XCRUN_PROGRAM}")
        set(XCRUN_COMMAND ${XCRUN_PROGRAM}
          "--find xcrun")
        execute_process(
          COMMAND ${XCRUN_COMMAND}
          RESULT_VARIABLE XCRUN_COMMAND_RESULT
          OUTPUT_VARIABLE XCRUN_COMMAND_OUTPUT
          ERROR_FILE /dev/null
        )
        if(NOT XCRUN_COMMAND_RESULT)
          # returned 0, we're ok.
          string(REGEX REPLACE
            "[ \t]*[\r\n]+[ \t]*" ";"
            XCRUN_COMMAND_OUTPUT ${XCRUN_COMMAND_OUTPUT})
        else()
          string(REPLACE ";" " " XCRUN_COMMAND_STR "${XCRUN_COMMAND}")
          # message(STATUS "${XCRUN_COMMAND_STR}")
          message(STATUS "${EXTPREFIX_qt}:xcrun test failed with status ${XCRUN_COMMAND_RESULT}")
        endif()
      else()
        message(STATUS "${EXTPREFIX_qt}:xcrun not found -- ${XCRUN_PROGRAM}")
      endif()
      #
      # Now configure ext_qt accordingly
      #
      if ((XCRUN_COMMAND_RESULT) AND (NOT (XCODE_VERSION VERSION_LESS 8.0.0)))
        # Fix Xcode xcrun related issue.
        # NOTE: This should be fixed by Qt 5.7.1 see here: http://code.qt.io/cgit/qt/qtbase.git/commit/?h=dev&id=77a71c32c9d19b87f79b208929e71282e8d8b5d9
        # NOTE: but no one's holding their breath.
        set(ext_qt_PATCH_COMMAND $${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/gerrit-166202.diff
                COMMAND ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/macdeploy-qt.diff
                COMMAND ${PATCH_COMMAND} -p1 -b -d <SOURCE_DIR>/qtbase -i ${CMAKE_CURRENT_SOURCE_DIR}/qtbase-configure.patch
                COMMAND ${PATCH_COMMAND} -p1 -b -d <SOURCE_DIR>/qtbase/mkspecs/features/mac -i ${CMAKE_CURRENT_SOURCE_DIR}/mac-default.patch)
        message(STATUS "${EXTPREFIX_qt}:Additional patches injected.")
      else()
        # No extra patches will be applied
        # NOTE: defaults for some untested scenarios like xcrun fails and xcode_version < 8.
        # NOTE: that is uncharted territory and (hopefully) a very unlikely scenario...
        set(ext_qt_PATCH_COMMAND ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/gerrit-166202.diff
                COMMAND ${PATCH_COMMAND} -p1 -i ${CMAKE_CURRENT_SOURCE_DIR}/macdeploy-qt.diff)
      endif()

      # Qt is big - try and parallelize if at all possible
      include(ProcessorCount)
      ProcessorCount(NUM_CORES)
      if(NOT NUM_CORES EQUAL 0)
        if (NUM_CORES GREATER 2)
          # be nice...
          MATH( EXPR NUM_CORES "${NUM_CORES} - 2" ) 
        endif()
        set(PARALLEL_MAKE "make;-j${NUM_CORES}")
        message(STATUS "${EXTPREFIX_qt}:Parallelized make: ${PARALLEL_MAKE}")
      else()
        set(PARALLEL_MAKE "make")
      endif()

      ExternalProject_Add(ext_qt
        DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR}

        LOG_DOWNLOAD        ON
        LOG_UPDATE          ON
        LOG_CONFIGURE       ON
        LOG_BUILD           ON
        LOG_TEST            ON
        LOG_INSTALL         ON
        BUILD_IN_SOURCE 		ON

        URL https://download.qt.io/official_releases/qt/5.7/5.7.0/single/qt-everywhere-opensource-src-5.7.0.tar.gz
        URL_MD5 9a46cce61fc64c20c3ac0a0e0fa41b42

        PATCH_COMMAND ${ext_qt_PATCH_COMMAND}

        INSTALL_DIR ${EXTPREFIX_qt}
        CONFIGURE_COMMAND <SOURCE_DIR>/configure -confirm-license  -opensource -nomake examples -no-openssl -no-compile-examples -qt-freetype -qt-harfbuzz -opengl desktop -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -skip qt3d -skip qtactiveqt -skip qtcanvas3d -skip qtconnectivity -skip qtgraphicaleffects -skip qtlocation -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtxmlpatterns -prefix ${EXTPREFIX_qt}
        BUILD_COMMAND ${PARALLEL_MAKE}
        INSTALL_COMMAND make install
        UPDATE_COMMAND ""
        BUILD_IN_SOURCE 1
        ALWAYS 0
      )
endif()
