cmake_minimum_required(VERSION 2.8)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/tools")
include(CheckCXXCompilerFlag)
include(CheckCXXSourceCompiles)
include(CheckIncludeFileCXX)
project(clasp)

if (NOT CMAKE_BUILD_TYPE)
	message(STATUS "No build type selected, using 'Release'")
	set(CMAKE_BUILD_TYPE "Release")
endif()

# clasp control variables
set (CLASP_COMPILE_DEFS "")
set (CLASP_LINK_LIBS "")
set (CLASP_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/liblp" "${CMAKE_CURRENT_SOURCE_DIR}/libprogram_opts")
option(WITH_THREADS "Try to build with thread support" ON)


if (WITH_THREADS)
	file(READ ${CMAKE_CURRENT_SOURCE_DIR}/tools/has_std_thread.cpp thread_test)
	check_cxx_compiler_flag("-std=c++11" has_cxx11_flag)
	if (has_cxx11_flag)
		SET(CMAKE_REQUIRED_FLAGS "-std=c++11")
	endif()
	check_cxx_source_compiles("${thread_test}" has_std_threads)
	if (has_std_threads)
		find_package (Threads)
		MESSAGE (STATUS "Building with std threads (link: ${CMAKE_THREAD_LIBS_INIT})")
		SET(CLASP_LINK_LIBS ${CMAKE_THREAD_LIBS_INIT})
		SET(CLASP_COMPILE_DEFS -DWITH_THREADS=1 -DCLASP_USE_STD_THREAD)
		if (has_cxx11_flag)
			add_definitions( -std=c++11 )
		endif()
	else()
		find_package(TBB)
		if (TBB_FOUND)
			MESSAGE (STATUS "TBB found. Building with tbb threads.")
			SET(CLASP_COMPILE_DEFS -DWITH_THREADS=1)
			SET(CLASP_LINK_LIBS ${TBB_LIBRARIES})
			SET(CLASP_INCLUDE_DIRS ${CLASP_INCLUDE_DIRS} ${TBB_INCLUDE_DIRS})
			link_directories(${TBB_LIBRARY_DIRS})
		else()
			MESSAGE (STATUS "Building without threads.")
			set (CLASP_COMPILE_DEFS -DWITH_THREADS=0)
		endif()
	endif()
else()
	set (CLASP_COMPILE_DEFS -DWITH_THREADS=0)
endif()

message(STATUS "debug flags  :${CMAKE_CXX_FLAGS_DEBUG}")
message(STATUS "release flags:${CMAKE_CXX_FLAGS_RELEASE}")
message(STATUS "clasp flags  :${CLASP_COMPILE_DEFS}")
message(STATUS "clasp libs   :${CLASP_LINK_LIBS}")
message(STATUS "clasp include:${CLASP_INCLUDE_DIRS}")
add_subdirectory(liblp)
add_subdirectory(libprogram_opts)
add_subdirectory(libclasp)
add_subdirectory(app)

check_include_file_cxx("cppunit/Test.h" has_cpp_unit)
if (has_cpp_unit)
	find_library(has_cpp_unit cppunit)
endif()
if (has_cpp_unit)
	enable_testing ()
	file(GLOB LIBCLASP_TEST libclasp/tests/*.cpp)
	include_directories(${CMAKE_CURRENT_SOURCE_DIR}/libclasp ${CLASP_INCLUDE_DIRS})
	add_definitions(${CLASP_COMPILE_DEFS})
	add_executable(claspTest ${LIBCLASP_TEST})
	target_link_libraries(claspTest clasp lp program_opts cppunit ${CLASP_LINK_LIBS})
	add_test (NAME ClaspTest COMMAND claspTest)
else()
	message(STATUS "cppunit not found - skipping tests")
endif()

