# This CMakeLists.txt file exists solely to drive the one found in the "src"
# subdir as an ExternalProject build. The project in "src" cannot build when
# there is a space in the directory name, so we copy that directory to a place
# guaranteed not to have a space in the name, build it there, and then copy the
# resulting output directory back up here into this CMake test's build tree.
#
if(NOT DEFINED CMAKE_BUILDNAME)
  string(REGEX REPLACE "^.*/([^/]+)/[^/]+/([^/]+)$" "\\1" CMAKE_BUILDNAME "${CMAKE_CURRENT_BINARY_DIR}")
  string(REGEX REPLACE "^.*/([^/]+)/[^/]+/([^/]+)$" "\\2" THIS_TESTNAME "${CMAKE_CURRENT_BINARY_DIR}")
  string(REPLACE " " "_" CMAKE_BUILDNAME "${CMAKE_BUILDNAME}")
endif()
message(STATUS "CMAKE_BUILDNAME='${CMAKE_BUILDNAME}'")
message(STATUS "THIS_TESTNAME='${THIS_TESTNAME}'")

cmake_minimum_required(VERSION 2.8)
project(${THIS_TESTNAME})

include(ExternalProject)

if(NOT DEFINED HOME)
  if(DEFINED ENV{CTEST_REAL_HOME})
    set(HOME "$ENV{CTEST_REAL_HOME}")
  else()
    set(HOME "$ENV{HOME}")
  endif()

  if(NOT HOME AND WIN32)
    # Try for USERPROFILE as HOME equivalent:
    string(REPLACE "\\" "/" HOME "$ENV{USERPROFILE}")
  endif()

  # But just use root of SystemDrive if HOME contains any spaces:
  # (Default on XP and earlier...)
  if(HOME MATCHES " " AND WIN32)
    string(REPLACE "\\" "/" HOME "$ENV{SystemDrive}")
  endif()
  if(HOME MATCHES " ")
    set(HOME "")
  endif()
endif()
message(STATUS "HOME='${HOME}'")

if(NOT DEFINED url)
  set(url "${CMAKE_CURRENT_SOURCE_DIR}/src")
endif()
message(STATUS "url='${url}'")

set(base_dir "${HOME}/.cmake/Dashboards/${CMAKE_BUILDNAME}/${THIS_TESTNAME}")
set(binary_dir "${base_dir}/build")
set(source_dir "${base_dir}/src")

# Source dir for this project exists in the CMake source tree, but we cannot
# use it in-place since there might be a space in its directory name.
# Source dir is therefore copied under a '.cmake/Dashboards'
# dir in your HOME directory to give it a name with no spaces.
#
ExternalProject_Add(clean-${PROJECT_NAME}
  DOWNLOAD_COMMAND ""
  CONFIGURE_COMMAND ${CMAKE_COMMAND} -E rm -rf "${source_dir}"
  BUILD_COMMAND ${CMAKE_COMMAND} -E rm -rf "${binary_dir}"
  INSTALL_COMMAND ""
  )

ExternalProject_Add(download-${PROJECT_NAME}
  URL "${url}"
  SOURCE_DIR "${source_dir}"
  CONFIGURE_COMMAND ""
  BUILD_COMMAND ""
  INSTALL_COMMAND ""
  DEPENDS clean-${PROJECT_NAME}
  )

ExternalProject_Add(build-${PROJECT_NAME}
  DOWNLOAD_COMMAND ""
  SOURCE_DIR "${source_dir}"
  BINARY_DIR "${binary_dir}"
  INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory
    "${binary_dir}/${CMAKE_CFG_INTDIR}"
    "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}"
  DEPENDS download-${PROJECT_NAME}
  )
