cmake_minimum_required(VERSION 2.8.4) # new enough for CMP0017
project(AllFindModules)

# 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)
    string(FIND " ${CMake_TEST_CMakeOnly.AllFindModules_NO_VERSION} " " ${MODULE_NAME} " _exclude_pos)
    if (NOT _exclude_pos EQUAL -1)
        message(STATUS "excluding check of ${VERSION_VAR}='${${VERSION_VAR}}' due to local configuration")
    elseif (${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 LTTNGUST PERL PKG_CONFIG
        PostgreSQL TIFF ZLIB)
    check_version_string(${VTEST} ${VTEST}_VERSION_STRING)
endforeach()

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

check_version_string(PYTHONINTERP PYTHON_VERSION_STRING)
check_version_string(SUBVERSION Subversion_VERSION_SVN)
