cmake_minimum_required (VERSION 2.8)
project(AllFindModules)

if (POLICY CMP0017)
  cmake_policy(SET CMP0017 NEW)
endif ()

# Avoid ctest truncation of output
message(STATUS "CTEST_FULL_OUTPUT")

set(ORIGINAL_MODULE_PATH "${CMAKE_MODULE_PATH}")

file(GLOB FIND_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../Modules/Find*.cmake" )

macro(do_find MODULE_NAME)
    message(STATUS "   Checking Find${MODULE_NAME}")
    find_package(${MODULE_NAME})
    set(CMAKE_MODULE_PATH "${ORIGINAL_MODULE_PATH}")
endmacro()

# It is only possible to use either Qt3 or Qt4 in one project.
# Since FindQt will complain if both are found we explicitly request Qt4 here
# and filter out FindQt3. FindKDE3 also depends on Qt3 and
# is therefore also blocked
set(DESIRED_QT_VERSION 4)
set(NO_QT4_MODULES "Qt3" "KDE3")

# ignore everything that has it's own test in Tests/Module/
file(GLOB OWN_TEST_MODULES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/../../Module/" "${CMAKE_CURRENT_SOURCE_DIR}/../../Module/Find*")
foreach(FIND_MODULE IN LISTS OWN_TEST_MODULES)
    string(REGEX REPLACE "^Find" "" _MOD_NAME "${FIND_MODULE}")
    list(APPEND NO_FIND_MODULES "${_MOD_NAME}")
endforeach()

# These modules are named Find*.cmake, but are nothing that works in
# find_package().
list(APPEND NO_FIND_MODULES "PackageHandleStandardArgs" "PackageMessage")

foreach(FIND_MODULE IN LISTS FIND_MODULES)
    string(REGEX REPLACE ".*/Find(.*)\\.cmake$" "\\1" MODULE_NAME "${FIND_MODULE}")

    list(FIND NO_QT4_MODULES ${MODULE_NAME} NO_QT4_INDEX)
    list(FIND NO_FIND_MODULES ${MODULE_NAME} NO_FIND_INDEX)
    if (NO_QT4_INDEX EQUAL -1 AND NO_FIND_INDEX EQUAL -1)
        do_find(${MODULE_NAME})
    endif ()

endforeach()

# Qt4 is not present, so we can check Qt3
if (NOT QT4_FOUND)
    set(DESIRED_QT_VERSION 3)
    foreach(FIND_MODULE ${NO_QT4_MODULES} "Qt")
        do_find(${FIND_MODULE})
    endforeach()
endif ()

macro(check_version_string MODULE_NAME VERSION_VAR)
    if (${MODULE_NAME}_FOUND)
        if (DEFINED ${VERSION_VAR})
            message(STATUS "${VERSION_VAR}='${${VERSION_VAR}}'")
            if (NOT ${VERSION_VAR} MATCHES "^[0-9]")
                message(SEND_ERROR "unexpected: ${VERSION_VAR} does not begin with a decimal digit")
            endif()
            if ("${${VERSION_VAR}}" STREQUAL "")
                message(SEND_ERROR "unexpected: ${VERSION_VAR} is empty")
            endif()
            if (${VERSION_VAR} VERSION_EQUAL 0)
                message(SEND_ERROR "unexpected: ${VERSION_VAR} is VERSION_EQUAL 0")
            endif()
            if (NOT ${VERSION_VAR} VERSION_GREATER 0)
                message(SEND_ERROR "unexpected: ${VERSION_VAR} is NOT VERSION_GREATER 0")
            endif()
        else()
            message(SEND_ERROR "${MODULE_NAME}_FOUND is set but version number variable ${VERSION_VAR} is NOT DEFINED")
        endif()
    endif ()
endmacro()

# If any of these modules reported that it was found a version number should have been
# reported.

foreach(VTEST ALSA ARMADILLO BZIP2 CUPS CURL EXPAT FREETYPE GETTEXT GIT HG
        HSPELL ICOTOOL JASPER LIBLZMA LIBXML2 LIBXSLT PERL PKG_CONFIG
        PostgreSQL TIFF ZLIB)
    check_version_string(${VTEST} ${VTEST}_VERSION_STRING)
endforeach()

foreach(VTEST BISON Boost CUDA DOXYGEN FLEX GIF GTK2
        HDF5 LibArchive OPENSCENEGRAPH RUBY SWIG)
    check_version_string(${VTEST} ${VTEST}_VERSION)
endforeach()

check_version_string(PYTHONINTERP PYTHON_VERSION_STRING)
check_version_string(SUBVERSION Subversion_VERSION_SVN)
