# Simple cmake script which may be used to autobuild CMake from 
# automatically downloaded source
#   mkdir tmp/
#   cd tmp/
#   cmake -P <pathto>/CMake-autobuild.cmake
# you should end up with a
#   tmp/cmake-x-x-y.rpm
# configure and compiled tree, using the tarball found on Savannah. 

cmake_minimum_required(VERSION 2.6)
set(CMAKESRC_VERSION "2.8.1")
set(CMAKESRC_FILE_PREFIX "cmake-${CMAKESRC_VERSION}")
set(CMAKESRC_REMOTE_PREFIX "http://www.cmake.org/files/v2.8/")
set(CMAKESRC_FILE_SUFFIX ".tar.gz")

set(LOCAL_FILE "./${CMAKESRC_FILE_PREFIX}${CMAKESRC_FILE_SUFFIX}")
set(REMOTE_FILE "${CMAKESRC_REMOTE_PREFIX}${CMAKESRC_FILE_PREFIX}${CMAKESRC_FILE_SUFFIX}")

message(STATUS "Trying to autoconfigure CMake version ${CMAKESRC_VERSION} using ${REMOTE_FILE} file...")

message(STATUS "Downloading...")
if (EXISTS ${LOCAL_FILE})
   message(STATUS "Already there: nothing to do")
else (EXISTS ${LOCAL_FILE})
   message(STATUS "Not there, trying to download...")
   file(DOWNLOAD ${REMOTE_FILE} ${LOCAL_FILE}
        TIMEOUT 300
        STATUS DL_STATUS
        LOG DL_LOG)  
   list(GET DL_STATUS 0 DL_NOK)
   if ("${DL_LOG}" MATCHES "404 Not Found")
      set(DL_NOK 1)
   endif ("${DL_LOG}" MATCHES "404 Not Found")
   if (DL_NOK)
      # we shall remove the file because it is created
      # with an inappropriate content
      file(REMOVE ${LOCAL_FILE})
      message(SEND_ERROR "Download failed: ${DL_LOG}")           
   else (DL_NOK)
      message(STATUS "Download successful.")
   endif (DL_NOK)      
endif (EXISTS ${LOCAL_FILE})

message(STATUS "Unarchiving the file")
execute_process(COMMAND ${CMAKE_COMMAND} -E tar zxvf ${LOCAL_FILE}
                RESULT_VARIABLE UNTAR_RES
                OUTPUT_VARIABLE UNTAR_OUT
                ERROR_VARIABLE UNTAR_ERR
                ) 
message(STATUS "CMake version ${CMAKESRC_VERSION} has been unarchived in ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKESRC_FILE_PREFIX}.")             
           
file(MAKE_DIRECTORY "${CMAKESRC_FILE_PREFIX}/build")     
message(STATUS "Configuring with CMake...")
execute_process(COMMAND ${CMAKE_COMMAND} .. 
                WORKING_DIRECTORY ${CMAKESRC_FILE_PREFIX}/build          
                RESULT_VARIABLE CONFIG_RES
                OUTPUT_VARIABLE CONFIG_OUT
                ERROR_VARIABLE CONFIG_ERR
                TIMEOUT 250
                )

# CMAKE_BUILD_TOOL is not defined in scripting (-P) mode
# so we have to build a sample project for knowing it
file(MAKE_DIRECTORY "TestProj")                              
file(WRITE TestProj/CMakeLists.txt 
    "
PROJECT(GETBT C CXX)
MESSAGE(STATUS \"BT=\${CMAKE_BUILD_TOOL}==\")
    "
     )     
execute_process(COMMAND  ${CMAKE_COMMAND} .
                WORKING_DIRECTORY  ./TestProj      
                OUTPUT_VARIABLE BT
                TIMEOUT 100
                ERROR_QUIET)
file(REMOVE_RECURSE  "TestProj")                           
string(REGEX MATCH "^-- .*=(.*)==.*" TEMP ${BT})
set(BUILD_TOOL ${CMAKE_MATCH_1})           
           
message(STATUS "Building with ${BUILD_TOOL}...")
execute_process(COMMAND ${BUILD_TOOL} ..
                WORKING_DIRECTORY ${CMAKESRC_FILE_PREFIX}/build
                RESULT_VARIABLE BUILD_RES
                OUTPUT_VARIABLE BUILD_OUT
                ERROR_VARIABLE BUILD_ERR
                ) 

message(STATUS "Building RPM with CPackRPM...")
execute_process(COMMAND cpack -G RPM        
                WORKING_DIRECTORY ${CMAKESRC_FILE_PREFIX}/build
                RESULT_VARIABLE BUILDRPM_RES
                OUTPUT_VARIABLE BUILDRPM_OUT
                ERROR_VARIABLE BUILDRPM_ERR
                ) 
string(REGEX MATCH "CPack: Package (.*) generated" RPMNAME ${BUILDRPM_OUT})
set(RPMNAME ${CMAKE_MATCH_1})
message(STATUS "RPM file name is: ${RPMNAME}")
                            
message(STATUS "CMake version ${CMAKESRC_VERSION} has been built in ${CMAKE_CURRENT_SOURCE_DIR}/${CMAKESRC_FILE_PREFIX}.")
