set(CTEST_PROJECT_NAME "tokudb")
get_filename_component(CTEST_SOURCE_DIRECTORY "${CTEST_SCRIPT_DIRECTORY}/.." ABSOLUTE)

## given an executable, follows symlinks and resolves paths until it runs
## out of symlinks, then gives you the basename
macro(real_executable_name filename_input out)
  set(res 0)
  set(filename ${filename_input})
  while(NOT(res))
    execute_process(
      COMMAND which ${filename}
      RESULT_VARIABLE res
      OUTPUT_VARIABLE full_filename
      OUTPUT_STRIP_TRAILING_WHITESPACE)
    if(NOT(res))
      execute_process(
        COMMAND readlink ${full_filename}
        RESULT_VARIABLE res
        OUTPUT_VARIABLE link_target
        OUTPUT_STRIP_TRAILING_WHITESPACE)
      if(NOT(res))
        execute_process(
          COMMAND dirname ${full_filename}
          OUTPUT_VARIABLE filepath
          OUTPUT_STRIP_TRAILING_WHITESPACE)
        set(filename "${filepath}/${link_target}")
      else()
        set(filename ${full_filename})
      endif()
    else()
      set(filename ${filename})
    endif()
  endwhile()
  execute_process(
    COMMAND basename ${filename}
    OUTPUT_VARIABLE real_filename
    OUTPUT_STRIP_TRAILING_WHITESPACE)
  set(${out} ${real_filename})
endmacro(real_executable_name)

## gives you `uname ${flag}`
macro(uname flag out)
  execute_process(
    COMMAND uname ${flag}
    OUTPUT_VARIABLE ${out}
    OUTPUT_STRIP_TRAILING_WHITESPACE)
endmacro(uname)

## gather machine info
uname("-m" machine_type)
get_filename_component(branchname "${CTEST_SOURCE_DIRECTORY}" NAME)

set(ncpus 2)
execute_process(
  COMMAND grep bogomips /proc/cpuinfo
  COMMAND wc -l
  RESULT_VARIABLE res
  OUTPUT_VARIABLE proc_ncpus
  OUTPUT_STRIP_TRAILING_WHITESPACE
  )
if(NOT res)
  set(ncpus ${proc_ncpus})
endif()

## construct BUILDNAME
set(BUILDNAME "${branchname} ${CMAKE_SYSTEM} ${machine_type}" CACHE STRING "CTest build name" FORCE)
set(CTEST_BUILD_NAME "${BUILDNAME}")
set(CTEST_CMAKE_GENERATOR "Unix Makefiles")
site_name(CTEST_SITE)

find_program(CTEST_SVN_COMMAND NAMES svn)
find_program(CTEST_MEMORYCHECK_COMMAND NAMES valgrind)
find_program(CTEST_COVERAGE_COMMAND NAMES gcov)

list(APPEND CTEST_NOTES_FILES
  "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}"
  "${CMAKE_CURRENT_LIST_FILE}"
  )

set(all_opts
  -DBDBDIR=/usr/local/BerkeleyDB.5.3
  -DBUILD_TESTING=ON
  -DUSE_CILK=OFF
  )
set(rel_opts
  ${all_opts}
  -DCMAKE_BUILD_TYPE=Release
  -DINTEL_CC=ON
  -DUSE_BDB=ON
  )
set(dbg_opts
  ${all_opts}
  -DCMAKE_BUILD_TYPE=Debug
  -DINTEL_CC=ON
  -DUSE_BDB=ON
  )
set(cov_opts
  ${all_opts}
  -DCMAKE_BUILD_TYPE=Debug
  -DINTEL_CC=OFF
  -DUSE_GCOV=ON
  )

set(CTEST_BINARY_DIRECTORY "${CTEST_SOURCE_DIRECTORY}/NightlyRelease")
ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
ctest_start(Nightly ${CTEST_SOURCE_DIRECTORY} ${CTEST_BINARY_DIRECTORY})
ctest_update(SOURCE ${CTEST_SOURCE_DIRECTORY})
ctest_configure(BUILD ${CTEST_BINARY_DIRECTORY} SOURCE ${CTEST_SOURCE_DIRECTORY}
  OPTIONS "${rel_opts}")
configure_file("${CTEST_SOURCE_DIRECTORY}/CTestConfig.cmake" "${CTEST_BINARY_DIRECTORY}/CTestConfig.cmake")
configure_file("${CTEST_SOURCE_DIRECTORY}/CTestCustom.cmake" "${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake")
ctest_build(BUILD ${CTEST_BINARY_DIRECTORY})
ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
ctest_test(BUILD ${CTEST_BINARY_DIRECTORY} PARALLEL_LEVEL ${ncpus})
ctest_submit()

set(CTEST_BINARY_DIRECTORY "${CTEST_SOURCE_DIRECTORY}/NightlyDebug")
ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
ctest_start(Nightly ${CTEST_SOURCE_DIRECTORY} ${CTEST_BINARY_DIRECTORY})
ctest_configure(BUILD ${CTEST_BINARY_DIRECTORY} SOURCE ${CTEST_SOURCE_DIRECTORY}
  OPTIONS "${dbg_opts}")
configure_file("${CTEST_SOURCE_DIRECTORY}/CTestConfig.cmake" "${CTEST_BINARY_DIRECTORY}/CTestConfig.cmake")
configure_file("${CTEST_SOURCE_DIRECTORY}/CTestCustom.cmake" "${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake")
ctest_build(BUILD ${CTEST_BINARY_DIRECTORY})
ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
ctest_test(BUILD ${CTEST_BINARY_DIRECTORY} PARALLEL_LEVEL ${ncpus})
ctest_memcheck(BUILD ${CTEST_BINARY_DIRECTORY} PARALLEL_LEVEL ${ncpus})
ctest_submit()

set(CTEST_BINARY_DIRECTORY "${CTEST_SOURCE_DIRECTORY}/NightlyCoverage")
ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
ctest_start(Nightly ${CTEST_SOURCE_DIRECTORY} ${CTEST_BINARY_DIRECTORY})
ctest_configure(BUILD ${CTEST_BINARY_DIRECTORY} SOURCE ${CTEST_SOURCE_DIRECTORY}
  OPTIONS "${cov_opts}")
configure_file("${CTEST_SOURCE_DIRECTORY}/CTestConfig.cmake" "${CTEST_BINARY_DIRECTORY}/CTestConfig.cmake")
configure_file("${CTEST_SOURCE_DIRECTORY}/CTestCustom.cmake" "${CTEST_BINARY_DIRECTORY}/CTestCustom.cmake")
ctest_build(BUILD ${CTEST_BINARY_DIRECTORY})
ctest_read_custom_files("${CTEST_BINARY_DIRECTORY}")
ctest_test(BUILD ${CTEST_BINARY_DIRECTORY} PARALLEL_LEVEL ${ncpus})
ctest_coverage(BUILD ${CTEST_BINARY_DIRECTORY} LABELS RUN_GCOV)
ctest_submit()
