FILE(
	GLOB
	TBTK_SRC
	Builders/*.cpp
	Core/*.cpp
	Elements/*.cpp
	Exceptions/*.cpp
	Lattice/*.cpp
	Lattice/D2/*.cpp
	Lattice/D3/*.cpp
	ManyParticle/*.cpp
	ManyParticle/FockStateMap/*.cpp
	ManyParticle/FockStateRule/*.cpp
	Property/*.cpp
	PropertyExtractor/*.cpp
#	PropertyExtractors/ArnoldiIterator/*.cpp
	Solver/*.cpp
#	Solvers/ArnoldiIterator/*.cpp
	SpecializedSolvers/RPA/*.cpp
	StatesAndOperators/*.cpp
	Uncategorized/*.cpp
	Utilities/*.cpp
)

LIST(
	REMOVE_ITEM
	TBTK_SRC
	"${CMAKE_CURRENT_SOURCE_DIR}/Utilities/FileReader.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/Utilities/FileWriter.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/Solver/ArnoldiIterator.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/Solver/LinearEquationSolver.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/Solver/LUSolver.cpp"
	"${CMAKE_CURRENT_SOURCE_DIR}/PropertyExtractor/ArnoldiIterator.cpp"
)

IF(${COMPILE_ARNOLDI_ITERATOR})
	FILE(
		GLOB
		TBTK_SOLVER_ARNOLDI_ITERATOR_SRC
		Solver/ArnoldiIterator.cpp
	)
	FILE(
		GLOB
		TBTK_PROPERTY_EXTRACTOR_ARNOLDI_ITERATOR_SRC
		PropertyExtractor/ArnoldiIterator.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_SOLVER_ARNOLDI_ITERATOR_SRC} ${TBTK_PROPERTY_EXTRACTOR_ARNOLDI_ITERATOR_SRC})
ENDIF(${COMPILE_ARNOLDI_ITERATOR})

IF(${COMPILE_CUDA})
	FILE(
		GLOB
		TBTK_CUDA_SRC
		cuda/*.cu
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_CUDA_SRC})
ELSE(${COMPILE_CUDA})
	FILE(
		GLOB
		TBTK_NOCUDA_SRC
		nocuda/*.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_NOCUDA_SRC})
ENDIF(${COMPILE_CUDA})

IF(${COMPILE_DATA_MANAGER})
	FILE(
		GLOB
		TBTK_DATA_MANAGER_SRC
		DataManager/*.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_DATA_MANAGER_SRC})
ENDIF(${COMPILE_DATA_MANAGER})

IF(${COMPILE_FILE_READER_WRITER})
	FILE(
		GLOB
		TBTK_FILE_READER_SRC
		Utilities/FileReader.cpp
	)
	FILE(
		GLOB
		TBTK_FILE_WRITER_SRC
		Utilities/FileWriter.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_FILE_READER_SRC} ${TBTK_FILE_WRITER_SRC})
ENDIF(${COMPILE_FILE_READER_WRITER})

IF(${COMPILE_FOURIER_TRANSFORM})
	FILE(
		GLOB
		TBTK_FOURIER_TRANSFORM_SRC
		FourierTransform/*.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_FOURIER_TRANSFORM_SRC})
ENDIF(${COMPILE_FOURIER_TRANSFORM})

IF(${COMPILE_GUI})
	FILE(
		GLOB
		TBTK_GUI_SRC
		GUI/*.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_GUI_SRC})
ENDIF(${COMPILE_GUI})

IF(${COMPILE_LINEAR_EQUATION_SOLVER})
	FILE(
		GLOB
		TBTK_LINEAR_EQUATION_SOLVER_SRC
		Solver/LinearEquationSolver.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_LINEAR_EQUATION_SOLVER_SRC})
ENDIF(${COMPILE_LINEAR_EQUATION_SOLVER})

IF(${COMPILE_LU_SOLVER})
	FILE(
		GLOB
		TBTK_LU_SOLVER_SRC
		Solver/LUSolver.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_LU_SOLVER_SRC})
ENDIF(${COMPILE_LU_SOLVER})

IF(${COMPILE_PLOTTER})
	FILE(
		GLOB
		TBTK_PLOTTER_SRC
		Plotter/*.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_PLOTTER_SRC})
ENDIF(${COMPILE_PLOTTER})

IF(${COMPILE_RAY_TRACER})
	FILE(
		GLOB
		TBTK_RAY_TRACER_SRC
		RayTracer/*.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_RAY_TRACER_SRC})
ENDIF(${COMPILE_RAY_TRACER})

IF(${COMPILE_RESOURCE})
	FILE(
		GLOB
		TBTK_RESOURCE_SRC
		Resource/*.cpp
	)
	SET(TBTK_SRC ${TBTK_SRC} ${TBTK_RESOURCE_SRC})
ENDIF(${COMPILE_RESOURCE})

IF(${COMPILE_CUDA})
	CUDA_ADD_LIBRARY(
		TBTK
		STATIC
		${TBTK_SRC}
	)
ELSE(${COMPILE_CUDA})
	ADD_LIBRARY(
		TBTK
		STATIC
		${TBTK_SRC}
	)
ENDIF(${COMPILE_CUDA})

TARGET_LINK_LIBRARIES(TBTK ${TBTK_LINK_LIBRARIES})

SET_TARGET_PROPERTIES(
	TBTK
	PROPERTIES
	ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}
)

#TARGET_COMPILE_FEATURES

INSTALL(
	TARGETS TBTK EXPORT TBTKLibraries
	LIBRARY DESTINATION lib/TBTK
	ARCHIVE DESTINATION lib/TBTK
)
